aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextAttributeNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextAttributeNode.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextAttributeNode.java196
1 files changed, 196 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextAttributeNode.java
new file mode 100644
index 000000000..504ac3122
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextAttributeNode.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Eclipse Public License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/org/documents/epl-v10.php
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.ide.eclipse.adt.internal.editors.uimodel;
+
+import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
+import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
+import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
+import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
+import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
+
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+
+/**
+ * Represents an XML attribute in that can be modified using a simple text field
+ * in the XML editor's user interface.
+ * <p/>
+ * The XML attribute has no default value. When unset, the text field is blank.
+ * When updating the XML, if the field is empty, the attribute will be removed
+ * from the XML element.
+ * <p/>
+ * See {@link UiAttributeNode} for more information.
+ */
+public class UiTextAttributeNode extends UiAbstractTextAttributeNode {
+
+ /** Text field */
+ private Text mText;
+ /** The managed form, set only once createUiControl has been called. */
+ private IManagedForm mManagedForm;
+
+ public UiTextAttributeNode(AttributeDescriptor attributeDescriptor, UiElementNode uiParent) {
+ super(attributeDescriptor, uiParent);
+ }
+
+ /* (non-java doc)
+ * Creates a label widget and an associated text field.
+ * <p/>
+ * As most other parts of the android manifest editor, this assumes the
+ * parent uses a table layout with 2 columns.
+ */
+ @Override
+ public void createUiControl(Composite parent, IManagedForm managedForm) {
+ setManagedForm(managedForm);
+ TextAttributeDescriptor desc = (TextAttributeDescriptor) getDescriptor();
+ Text text = SectionHelper.createLabelAndText(parent, managedForm.getToolkit(),
+ desc.getUiName(), getCurrentValue(),
+ DescriptorsUtils.formatTooltip(desc.getTooltip()));
+
+ setTextWidget(text);
+ }
+
+ /**
+ * No completion values for this UI attribute.
+ *
+ * {@inheritDoc}
+ */
+ @Override
+ public String[] getPossibleValues(String prefix) {
+ return null;
+ }
+
+ /**
+ * Sets the internal managed form.
+ * This is usually set by createUiControl.
+ */
+ protected void setManagedForm(IManagedForm managedForm) {
+ mManagedForm = managedForm;
+ }
+
+ /**
+ * @return The managed form, set only once createUiControl has been called.
+ */
+ protected IManagedForm getManagedForm() {
+ return mManagedForm;
+ }
+
+ /* (non-java doc)
+ * Returns if the attribute node is valid, and its UI has been created.
+ */
+ @Override
+ public boolean isValid() {
+ return mText != null;
+ }
+
+ @Override
+ public String getTextWidgetValue() {
+ if (mText != null) {
+ return mText.getText();
+ }
+
+ return null;
+ }
+
+ @Override
+ public void setTextWidgetValue(String value) {
+ if (mText != null) {
+ mText.setText(value);
+ }
+ }
+
+ /**
+ * Sets the Text widget object, and prepares it to handle modification and synchronization
+ * with the XML node.
+ * @param textWidget
+ */
+ protected final void setTextWidget(Text textWidget) {
+ mText = textWidget;
+
+ if (textWidget != null) {
+ // Sets the with hint for the text field. Derived classes can always override it.
+ // This helps the grid layout to resize correctly on smaller screen sizes.
+ Object data = textWidget.getLayoutData();
+ if (data == null) {
+ } else if (data instanceof GridData) {
+ ((GridData)data).widthHint = AndroidXmlEditor.TEXT_WIDTH_HINT;
+ } else if (data instanceof TableWrapData) {
+ ((TableWrapData)data).maxWidth = 100;
+ }
+
+ mText.addModifyListener(new ModifyListener() {
+ /**
+ * Sent when the text is modified, whether by the user via manual
+ * input or programmatic input via setText().
+ * <p/>
+ * Simply mark the attribute as dirty if it really changed.
+ * The container SectionPart will collect these flag and manage them.
+ */
+ @Override
+ public void modifyText(ModifyEvent e) {
+ if (!isInInternalTextModification() &&
+ !isDirty() &&
+ mText != null &&
+ getCurrentValue() != null &&
+ !mText.getText().equals(getCurrentValue())) {
+ setDirty(true);
+ }
+ }
+ });
+
+ // Remove self-reference when the widget is disposed
+ mText.addDisposeListener(new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ mText = null;
+ }
+ });
+ }
+
+ onAddValidators(mText);
+ }
+
+ /**
+ * Called after the text widget as been created.
+ * <p/>
+ * Derived classes typically want to:
+ * <li> Create a new {@link ModifyListener} and attach it to the given {@link Text} widget.
+ * <li> In the modify listener, call getManagedForm().getMessageManager().addMessage()
+ * and getManagedForm().getMessageManager().removeMessage() as necessary.
+ * <li> Call removeMessage in a new text.addDisposeListener.
+ * <li> Call the validator once to setup the initial messages as needed.
+ * <p/>
+ * The base implementation does nothing.
+ *
+ * @param text The {@link Text} widget to validate.
+ */
+ protected void onAddValidators(Text text) {
+ }
+
+ /**
+ * Returns the text widget.
+ */
+ protected final Text getTextWidget() {
+ return mText;
+ }
+}