aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.java
blob: 4577f8d12ba48387f6db9b9dd02852dbdf82fc2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/*
 * 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.gle2;

import static com.android.SdkConstants.ANDROID_LAYOUT_RESOURCE_PREFIX;
import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutMetadata.KEY_LV_FOOTER;
import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutMetadata.KEY_LV_HEADER;
import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutMetadata.KEY_LV_ITEM;

import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.ide.common.rendering.api.Capability;
import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
import com.android.ide.eclipse.adt.internal.resources.CyclicDependencyValidator;
import com.android.ide.eclipse.adt.internal.ui.ResourceChooser;
import com.android.resources.ResourceType;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Menu;
import org.w3c.dom.Node;

/**
 * "Preview List Content" context menu which lists available data types and layouts
 * the user can choose to view the ListView as.
 */
public class ListViewTypeMenu extends SubmenuAction {
    /** Associated canvas */
    private final LayoutCanvas mCanvas;
    /** When true, this menu is for a grid rather than a simple list */
    private boolean mGrid;
    /** When true, this menu is for a spinner rather than a simple list */
    private boolean mSpinner;

    /**
     * Creates a "Preview List Content" menu
     *
     * @param canvas associated canvas
     * @param isGrid whether the menu is for a grid rather than a list
     * @param isSpinner whether the menu is for a spinner rather than a list
     */
    public ListViewTypeMenu(LayoutCanvas canvas, boolean isGrid, boolean isSpinner) {
        super(isGrid ? "Preview Grid Content" : isSpinner ? "Preview Spinner Layout"
                : "Preview List Content");
        mCanvas = canvas;
        mGrid = isGrid;
        mSpinner = isSpinner;
    }

    @Override
    protected void addMenuItems(Menu menu) {
        GraphicalEditorPart graphicalEditor = mCanvas.getEditorDelegate().getGraphicalEditor();
        if (graphicalEditor.renderingSupports(Capability.ADAPTER_BINDING)) {
            IAction action = new PickLayoutAction("Choose Layout...", KEY_LV_ITEM);
            new ActionContributionItem(action).fill(menu, -1);
            new Separator().fill(menu, -1);

            String selected = getSelectedLayout();
            if (selected != null) {
                if (selected.startsWith(ANDROID_LAYOUT_RESOURCE_PREFIX)) {
                    selected = selected.substring(ANDROID_LAYOUT_RESOURCE_PREFIX.length());
                }
            }

            if (mSpinner) {
                action = new SetListTypeAction("Spinner Item",
                        "simple_spinner_item", selected); //$NON-NLS-1$
                new ActionContributionItem(action).fill(menu, -1);
                action = new SetListTypeAction("Spinner Dropdown Item",
                        "simple_spinner_dropdown_item", selected); //$NON-NLS-1$
                new ActionContributionItem(action).fill(menu, -1);
                return;
            }

            action = new SetListTypeAction("Simple List Item",
                    "simple_list_item_1", selected); //$NON-NLS-1$
            new ActionContributionItem(action).fill(menu, -1);
            action = new SetListTypeAction("Simple 2-Line List Item",
                    "simple_list_item_2", //$NON-NLS-1$
                    selected);
            new ActionContributionItem(action).fill(menu, -1);
            action = new SetListTypeAction("Checked List Item",
                    "simple_list_item_checked", //$NON-NLS-1$
                    selected);
            new ActionContributionItem(action).fill(menu, -1);
            action = new SetListTypeAction("Single Choice List Item",
                    "simple_list_item_single_choice", //$NON-NLS-1$
                    selected);
            new ActionContributionItem(action).fill(menu, -1);
            action = new SetListTypeAction("Multiple Choice List Item",
                    "simple_list_item_multiple_choice", //$NON-NLS-1$
                    selected);
            if (!mGrid) {
                new Separator().fill(menu, -1);
                action = new SetListTypeAction("Simple Expandable List Item",
                        "simple_expandable_list_item_1", selected); //$NON-NLS-1$
                new ActionContributionItem(action).fill(menu, -1);
                action = new SetListTypeAction("Simple 2-Line Expandable List Item",
                        "simple_expandable_list_item_2", //$NON-NLS-1$
                        selected);
                new ActionContributionItem(action).fill(menu, -1);

                new Separator().fill(menu, -1);
                action = new PickLayoutAction("Choose Header...", KEY_LV_HEADER);
                new ActionContributionItem(action).fill(menu, -1);
                action = new PickLayoutAction("Choose Footer...", KEY_LV_FOOTER);
                new ActionContributionItem(action).fill(menu, -1);
            }
        } else {
            // Should we just hide the menu item instead?
            addDisabledMessageItem(
                    "Not supported for this SDK version; try changing the Render Target");
        }
    }

    private class SetListTypeAction extends Action {
        private final String mLayout;

        public SetListTypeAction(String title, String layout, String selected) {
            super(title, IAction.AS_RADIO_BUTTON);
            mLayout = layout;

            if (layout.equals(selected)) {
                setChecked(true);
            }
        }

        @Override
        public void run() {
            if (isChecked()) {
                setNewType(KEY_LV_ITEM, ANDROID_LAYOUT_RESOURCE_PREFIX + mLayout);
            }
        }
    }

    /**
     * Action which brings up a resource chooser to choose an arbitrary layout as the
     * layout to be previewed in the list.
     */
    private class PickLayoutAction extends Action {
        private final String mType;

        public PickLayoutAction(String title, String type) {
            super(title, IAction.AS_PUSH_BUTTON);
            mType = type;
        }

        @Override
        public void run() {
            LayoutEditorDelegate delegate = mCanvas.getEditorDelegate();
            IFile file = delegate.getEditor().getInputFile();
            GraphicalEditorPart editor = delegate.getGraphicalEditor();
            ResourceChooser dlg = ResourceChooser.create(editor, ResourceType.LAYOUT)
                .setInputValidator(CyclicDependencyValidator.create(file))
                .setInitialSize(85, 10)
                .setCurrentResource(getSelectedLayout());
            int result = dlg.open();
            if (result == ResourceChooser.CLEAR_RETURN_CODE) {
                setNewType(mType, null);
            } else if (result == Window.OK) {
                String newType = dlg.getCurrentResource();
                setNewType(mType, newType);
            }
        }
    }

    @Nullable
    private String getSelectedLayout() {
        String layout = null;
        SelectionManager selectionManager = mCanvas.getSelectionManager();
        for (SelectionItem item : selectionManager.getSelections()) {
            UiViewElementNode node = item.getViewInfo().getUiViewNode();
            if (node != null) {
                Node xmlNode = node.getXmlNode();
                layout = LayoutMetadata.getProperty(xmlNode, KEY_LV_ITEM);
                if (layout != null) {
                    return layout;
                }
            }
        }

        return null;
    }

    private void setNewType(@NonNull String type, @Nullable String layout) {
        LayoutEditorDelegate delegate = mCanvas.getEditorDelegate();
        GraphicalEditorPart graphicalEditor = delegate.getGraphicalEditor();
        SelectionManager selectionManager = mCanvas.getSelectionManager();

        for (SelectionItem item : selectionManager.getSnapshot()) {
            UiViewElementNode node = item.getViewInfo().getUiViewNode();
            if (node != null) {
                Node xmlNode = node.getXmlNode();
                LayoutMetadata.setProperty(delegate.getEditor(), xmlNode, type, layout);
            }
        }

        // Refresh
        graphicalEditor.recomputeLayout();
        mCanvas.redraw();
    }
}