18dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye/*
28dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye * Copyright (C) 2011 The Android Open Source Project
38dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye *
48dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye * Licensed under the Eclipse Public License, Version 1.0 (the "License");
58dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye * you may not use this file except in compliance with the License.
68dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye * You may obtain a copy of the License at
78dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye *
88dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye *      http://www.eclipse.org/org/documents/epl-v10.php
98dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye *
108dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye * Unless required by applicable law or agreed to in writing, software
118dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye * distributed under the License is distributed on an "AS IS" BASIS,
128dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye * See the License for the specific language governing permissions and
148dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye * limitations under the License.
158dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye */
168dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
178dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyepackage com.android.ide.eclipse.adt.internal.editors.layout.refactoring;
188dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1912d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.FQCN_GESTURE_OVERLAY_VIEW;
2012d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.FQCN_LINEAR_LAYOUT;
2112d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.FQCN_RADIO_BUTTON;
2212d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.GESTURE_OVERLAY_VIEW;
2312d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.RADIO_GROUP;
2412d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.VIEW_INCLUDE;
250757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye
26e50549f54810c29bffc681e39d33158ab2a8f26eRaphaelimport com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
278dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
284563c4e2f168df1d6c97206a4ac6444dfa2264baTor Norbyeimport com.android.ide.eclipse.adt.internal.editors.layout.gle2.CustomViewFinder;
299e6db060854d0e890190919a27a1846f50f69d1aTor Norbyeimport com.android.ide.eclipse.adt.internal.editors.layout.gre.PaletteMetadataDescriptor;
308dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
31e5fa05d3e4a7d9c002dff713d88456fd9e5a7965Tor Norbyeimport com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
328dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
338dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport com.android.ide.eclipse.adt.internal.sdk.Sdk;
348dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport com.android.resources.ResourceType;
358dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport com.android.sdklib.IAndroidTarget;
3685e4a1a9dd133abb879ec211ce8dd385004edf22Xavier Ducrohetimport com.android.utils.Pair;
378dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
388dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport org.eclipse.core.resources.IProject;
398dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport org.eclipse.swt.SWT;
408dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport org.eclipse.swt.layout.GridData;
418dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport org.eclipse.swt.layout.GridLayout;
428dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport org.eclipse.swt.widgets.Combo;
438dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport org.eclipse.swt.widgets.Composite;
448dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport org.eclipse.swt.widgets.Label;
458dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport org.eclipse.swt.widgets.Text;
468dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
470757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbyeimport java.util.ArrayList;
48adee9788a5ac646a39b516abe4cdd1022911a3f5Tor Norbyeimport java.util.Collections;
498dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbyeimport java.util.List;
50adee9788a5ac646a39b516abe4cdd1022911a3f5Tor Norbyeimport java.util.Set;
518dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
524563c4e2f168df1d6c97206a4ac6444dfa2264baTor Norbyepublic class WrapInWizard extends VisualRefactoringWizard {
530757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye    private static final String SEPARATOR_LABEL =
540757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        "----------------------------------------"; //$NON-NLS-1$
558dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
56e50549f54810c29bffc681e39d33158ab2a8f26eRaphael    public WrapInWizard(WrapInRefactoring ref, LayoutEditorDelegate editor) {
570757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        super(ref, editor);
588dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        setDefaultPageTitle("Wrap in Container");
598dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye    }
608dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
618dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye    @Override
628dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye    protected void addUserInputPages() {
630757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        WrapInRefactoring ref = (WrapInRefactoring) getRefactoring();
640757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        String oldType = ref.getOldType();
65e50549f54810c29bffc681e39d33158ab2a8f26eRaphael        addPage(new InputPage(mDelegate.getEditor().getProject(), oldType));
668dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye    }
678dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
688dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye    /** Wizard page which inputs parameters for the {@link WrapInRefactoring} operation */
699e6db060854d0e890190919a27a1846f50f69d1aTor Norbye    private static class InputPage extends VisualRefactoringInputPage {
708dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        private final IProject mProject;
710757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        private final String mOldType;
728dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        private Text mIdText;
738dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        private Combo mTypeCombo;
749e6db060854d0e890190919a27a1846f50f69d1aTor Norbye        private List<Pair<String, ViewElementDescriptor>> mClassNames;
758dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
760757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        public InputPage(IProject project, String oldType) {
778dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            super("WrapInInputPage");  //$NON-NLS-1$
788dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            mProject = project;
790757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye            mOldType = oldType;
808dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        }
818dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
82ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye        @Override
838dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        public void createControl(Composite parent) {
848dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            Composite composite = new Composite(parent, SWT.NONE);
858dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            composite.setLayout(new GridLayout(2, false));
868dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
878dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            Label typeLabel = new Label(composite, SWT.NONE);
888dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            typeLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
898dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            typeLabel.setText("Type of Container:");
908dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
918dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            mTypeCombo = new Combo(composite, SWT.READ_ONLY);
928dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            mTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
939e6db060854d0e890190919a27a1846f50f69d1aTor Norbye            mTypeCombo.addSelectionListener(mSelectionValidateListener);
948dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
958dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            Label idLabel = new Label(composite, SWT.NONE);
968dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            idLabel.setText("New Layout Id:");
978dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            idLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
988dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
998dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            mIdText = new Text(composite, SWT.BORDER);
1008dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            mIdText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
1019e6db060854d0e890190919a27a1846f50f69d1aTor Norbye            mIdText.addModifyListener(mModifyValidateListener);
1028dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
103adee9788a5ac646a39b516abe4cdd1022911a3f5Tor Norbye            Set<String> exclude = Collections.singleton(VIEW_INCLUDE);
104adee9788a5ac646a39b516abe4cdd1022911a3f5Tor Norbye            mClassNames = addLayouts(mProject, mOldType, mTypeCombo, exclude, true);
1050757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye            mTypeCombo.select(0);
1068dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1078dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            setControl(composite);
1088dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            validatePage();
1098dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1108dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            mTypeCombo.setFocus();
1118dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        }
1128dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1139e6db060854d0e890190919a27a1846f50f69d1aTor Norbye        @Override
1149e6db060854d0e890190919a27a1846f50f69d1aTor Norbye        protected boolean validatePage() {
1158dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            boolean ok = true;
1168dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1178dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            String id = mIdText.getText().trim();
1188dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1198dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            if (id.length() == 0) {
1209e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                setErrorMessage("ID required");
1219e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                ok = false;
1228dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            } else {
1238dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                // ...but if you do, it has to be valid!
1248dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                ResourceNameValidator validator = ResourceNameValidator.create(false, mProject,
1258dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        ResourceType.ID);
1268dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                String message = validator.isValid(id);
1278dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                if (message != null) {
1288dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    setErrorMessage(message);
1298dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    ok = false;
1308dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                }
1318dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            }
1328dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1330757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye            int selectionIndex = mTypeCombo.getSelectionIndex();
1349e6db060854d0e890190919a27a1846f50f69d1aTor Norbye            String type = selectionIndex != -1 ? mClassNames.get(selectionIndex).getFirst() : null;
1350757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye            if (type == null) {
1368dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                setErrorMessage("Select a container type");
1370757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                ok = false; // The user has chosen a separator
1388dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            }
1398dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1408dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            if (ok) {
1418dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                setErrorMessage(null);
1428dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1438dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                // Record state
1448dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                WrapInRefactoring refactoring =
1458dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    (WrapInRefactoring) getRefactoring();
1468dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                refactoring.setId(id);
1470757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                refactoring.setType(type);
1489e6db060854d0e890190919a27a1846f50f69d1aTor Norbye
1499e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                ViewElementDescriptor descriptor = mClassNames.get(selectionIndex).getSecond();
1509e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                if (descriptor instanceof PaletteMetadataDescriptor) {
1519e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                    PaletteMetadataDescriptor paletteDescriptor =
1529e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                        (PaletteMetadataDescriptor) descriptor;
1539e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                    String initializedAttributes = paletteDescriptor.getInitializedAttributes();
1549e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                    refactoring.setInitializedAttributes(initializedAttributes);
1559e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                } else {
1569e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                    refactoring.setInitializedAttributes(null);
1579e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                }
1588dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            }
1598dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1608dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            setPageComplete(ok);
1618dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            return ok;
1628dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        }
1638dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye    }
1648dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1659e6db060854d0e890190919a27a1846f50f69d1aTor Norbye    static List<Pair<String, ViewElementDescriptor>> addLayouts(IProject project,
1669e6db060854d0e890190919a27a1846f50f69d1aTor Norbye            String oldType, Combo combo,
167adee9788a5ac646a39b516abe4cdd1022911a3f5Tor Norbye            Set<String> exclude, boolean addGestureOverlay) {
1689e6db060854d0e890190919a27a1846f50f69d1aTor Norbye        List<Pair<String, ViewElementDescriptor>> classNames =
1699e6db060854d0e890190919a27a1846f50f69d1aTor Norbye            new ArrayList<Pair<String, ViewElementDescriptor>>();
1700757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye
1719e6db060854d0e890190919a27a1846f50f69d1aTor Norbye        if (oldType != null && oldType.equals(FQCN_RADIO_BUTTON)) {
1720757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye            combo.add(RADIO_GROUP);
1730757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye            // NOT a fully qualified name since android widgets do not include the package
1749e6db060854d0e890190919a27a1846f50f69d1aTor Norbye            classNames.add(Pair.of(RADIO_GROUP, (ViewElementDescriptor) null));
1750757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye
1760757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye            combo.add(SEPARATOR_LABEL);
1779e6db060854d0e890190919a27a1846f50f69d1aTor Norbye            classNames.add(Pair.<String,ViewElementDescriptor>of(null, null));
1780757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        }
1790757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye
1804563c4e2f168df1d6c97206a4ac6444dfa2264baTor Norbye        Pair<List<String>,List<String>> result = CustomViewFinder.findViews(project, true);
1810757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        List<String> customViews = result.getFirst();
1820757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        List<String> thirdPartyViews = result.getSecond();
1830757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        if (customViews.size() > 0) {
1840757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye            for (String view : customViews) {
1850757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                combo.add(view);
1869e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                classNames.add(Pair.of(view, (ViewElementDescriptor) null));
1870757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye            }
1880757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye            combo.add(SEPARATOR_LABEL);
1899e6db060854d0e890190919a27a1846f50f69d1aTor Norbye            classNames.add(Pair.<String,ViewElementDescriptor>of(null, null));
1900757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        }
1918dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
1928dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        // Populate type combo
1938dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        Sdk currentSdk = Sdk.getCurrent();
1948dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        if (currentSdk != null) {
1958dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            IAndroidTarget target = currentSdk.getTarget(project);
1968dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            if (target != null) {
1978dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                AndroidTargetData targetData = currentSdk.getTargetData(target);
1988dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                if (targetData != null) {
1998dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    ViewMetadataRepository repository = ViewMetadataRepository.get();
2008dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    List<Pair<String,List<ViewElementDescriptor>>> entries =
2018dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        repository.getPaletteEntries(targetData, false, true);
2028dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    // Find the layout category - it contains LinearLayout
2038dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    List<ViewElementDescriptor> layoutDescriptors = null;
2048dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
2058dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    search: for (Pair<String,List<ViewElementDescriptor>> pair : entries) {
2068dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        List<ViewElementDescriptor> list = pair.getSecond();
2078dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        for (ViewElementDescriptor d : list) {
2088dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                            if (d.getFullClassName().equals(FQCN_LINEAR_LAYOUT)) {
2098dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                                // Found - use this list
2108dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                                layoutDescriptors = list;
2118dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                                break search;
2128dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                            }
2138dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        }
2148dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    }
2158dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    if (layoutDescriptors != null) {
2168dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        for (ViewElementDescriptor d : layoutDescriptors) {
2178dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                            String className = d.getFullClassName();
218adee9788a5ac646a39b516abe4cdd1022911a3f5Tor Norbye                            if (exclude == null || !exclude.contains(className)) {
2190757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                                combo.add(d.getUiName());
2209e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                                classNames.add(Pair.of(className, d));
2218dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                            }
2228dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        }
2238dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
2248dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        // SWT does not support separators in combo boxes
2258dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        combo.add(SEPARATOR_LABEL);
2260757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                        classNames.add(null);
2270757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye
2280757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                        if (thirdPartyViews.size() > 0) {
2290757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                            for (String view : thirdPartyViews) {
2300757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                                combo.add(view);
2319e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                                classNames.add(Pair.of(view, (ViewElementDescriptor) null));
2320757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                            }
2330757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                            combo.add(SEPARATOR_LABEL);
2340757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                            classNames.add(null);
2350757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                        }
2360757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye
2370757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                        if (addGestureOverlay) {
2380757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                            combo.add(GESTURE_OVERLAY_VIEW);
2399e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                            classNames.add(Pair.<String, ViewElementDescriptor> of(
2409e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                                    FQCN_GESTURE_OVERLAY_VIEW, null));
2410757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye
2420757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                            combo.add(SEPARATOR_LABEL);
2439e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                            classNames.add(Pair.<String,ViewElementDescriptor>of(null, null));
2440757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                        }
2458dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    }
2468dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
2478dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    // Now add ALL known layout descriptors in case the user has
2488dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    // a special case
2498dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    layoutDescriptors =
2508dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        targetData.getLayoutDescriptors().getLayoutDescriptors();
2518dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye
2528dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    for (ViewElementDescriptor d : layoutDescriptors) {
2538dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        String className = d.getFullClassName();
25442b2f34604a3f8e8ac191831d8f01a0498760d38Tor Norbye                        if (exclude == null || !exclude.contains(className)) {
2550757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye                            combo.add(d.getUiName());
2569e6db060854d0e890190919a27a1846f50f69d1aTor Norbye                            classNames.add(Pair.of(className, d));
2578dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                        }
2588dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                    }
2598dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye                }
2608dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            }
2618dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye        } else {
2628dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye            combo.add("SDK not initialized");
2639e6db060854d0e890190919a27a1846f50f69d1aTor Norbye            classNames.add(Pair.<String,ViewElementDescriptor>of(null, null));
2640757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        }
2650757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye
2660757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye        return classNames;
2670757ce4af2764e4dd564acc0b1a013e910abc8daTor Norbye    }
2688dc4366bbaad39d56e1c2ded4046c86a95a17666Tor Norbye}
269