diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.java | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.java new file mode 100644 index 000000000..4577f8d12 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.java @@ -0,0 +1,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(); + } +} |