aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewWizard.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewWizard.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewWizard.java199
1 files changed, 199 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewWizard.java
new file mode 100644
index 000000000..0ac7106b3
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewWizard.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2011 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.layout.refactoring;
+
+import static com.android.SdkConstants.REQUEST_FOCUS;
+import static com.android.SdkConstants.VIEW_FRAGMENT;
+import static com.android.SdkConstants.VIEW_INCLUDE;
+
+import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
+import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
+import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CustomViewFinder;
+import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
+import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
+import com.android.ide.eclipse.adt.internal.sdk.Sdk;
+import com.android.sdklib.IAndroidTarget;
+import com.android.utils.Pair;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class ChangeViewWizard extends VisualRefactoringWizard {
+ private static final String SEPARATOR_LABEL =
+ "----------------------------------------"; //$NON-NLS-1$
+
+ public ChangeViewWizard(ChangeViewRefactoring ref, LayoutEditorDelegate editor) {
+ super(ref, editor);
+ setDefaultPageTitle("Change Widget Type");
+ }
+
+ @Override
+ protected void addUserInputPages() {
+ ChangeViewRefactoring ref = (ChangeViewRefactoring) getRefactoring();
+ List<String> oldTypes = ref.getOldTypes();
+ String oldType = null;
+ for (String type : oldTypes) {
+ if (oldType == null) {
+ oldType = type;
+ } else if (!oldType.equals(type)) {
+ // If the types differ, don't offer related categories
+ oldType = null;
+ break;
+ }
+ }
+ addPage(new InputPage(mDelegate.getEditor().getProject(), oldType));
+ }
+
+ /** Wizard page which inputs parameters for the {@link ChangeViewRefactoring} operation */
+ private static class InputPage extends VisualRefactoringInputPage {
+ private final IProject mProject;
+ private Combo mTypeCombo;
+ private final String mOldType;
+ private List<String> mClassNames;
+
+ public InputPage(IProject project, String oldType) {
+ super("ChangeViewInputPage"); //$NON-NLS-1$
+ mProject = project;
+ mOldType = oldType;
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+
+ Label typeLabel = new Label(composite, SWT.NONE);
+ typeLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
+ typeLabel.setText("New Widget Type:");
+
+ mTypeCombo = new Combo(composite, SWT.READ_ONLY);
+ mTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+ mTypeCombo.addSelectionListener(mSelectionValidateListener);
+
+ mClassNames = getWidgetTypes(mOldType, mTypeCombo);
+ mTypeCombo.select(0);
+
+ setControl(composite);
+ validatePage();
+
+ mTypeCombo.setFocus();
+ }
+
+ private List<String> getWidgetTypes(String oldType, Combo combo) {
+ List<String> classNames = new ArrayList<String>();
+
+ // Populate type combo
+ Sdk currentSdk = Sdk.getCurrent();
+ if (currentSdk != null) {
+ IAndroidTarget target = currentSdk.getTarget(mProject);
+ if (target != null) {
+ // Try to pick "related" widgets to the one you have selected.
+ // For example, for an AnalogClock, display DigitalClock first.
+ // For a Text, offer EditText, AutoComplete, etc.
+ if (oldType != null) {
+ ViewMetadataRepository repository = ViewMetadataRepository.get();
+ List<String> relatedTo = repository.getRelatedTo(oldType);
+ if (relatedTo.size() > 0) {
+ for (String className : relatedTo) {
+ String base = className.substring(className.lastIndexOf('.') + 1);
+ combo.add(base);
+ classNames.add(className);
+ }
+ combo.add(SEPARATOR_LABEL);
+ classNames.add(null);
+ }
+ }
+
+ Pair<List<String>,List<String>> result =
+ CustomViewFinder.findViews(mProject, false);
+ List<String> customViews = result.getFirst();
+ List<String> thirdPartyViews = result.getSecond();
+ if (customViews.size() > 0) {
+ for (String view : customViews) {
+ combo.add(view);
+ classNames.add(view);
+ }
+ combo.add(SEPARATOR_LABEL);
+ classNames.add(null);
+ }
+
+ if (thirdPartyViews.size() > 0) {
+ for (String view : thirdPartyViews) {
+ combo.add(view);
+ classNames.add(view);
+ }
+ combo.add(SEPARATOR_LABEL);
+ classNames.add(null);
+ }
+
+ AndroidTargetData targetData = currentSdk.getTargetData(target);
+ if (targetData != null) {
+ // Now add ALL known layout descriptors in case the user has
+ // a special case
+ List<ViewElementDescriptor> descriptors =
+ targetData.getLayoutDescriptors().getViewDescriptors();
+ for (ViewElementDescriptor d : descriptors) {
+ String className = d.getFullClassName();
+ if (className.equals(VIEW_INCLUDE)
+ || className.equals(VIEW_FRAGMENT)
+ || className.equals(REQUEST_FOCUS)) {
+ continue;
+ }
+ combo.add(d.getUiName());
+ classNames.add(className);
+
+ }
+ }
+ }
+ } else {
+ combo.add("SDK not initialized");
+ classNames.add(null);
+ }
+
+ return classNames;
+ }
+
+ @Override
+ protected boolean validatePage() {
+ boolean ok = true;
+ int selectionIndex = mTypeCombo.getSelectionIndex();
+ String type = selectionIndex != -1 ? mClassNames.get(selectionIndex) : null;
+ if (type == null) {
+ setErrorMessage("Select a widget type to convert to");
+ ok = false; // The user has chosen a separator
+ } else {
+ setErrorMessage(null);
+ }
+
+ // Record state
+ ChangeViewRefactoring refactoring =
+ (ChangeViewRefactoring) getRefactoring();
+ refactoring.setType(type);
+
+ setPageComplete(ok);
+ return ok;
+ }
+ }
+}