aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.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/gle2/ListViewTypeMenu.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.java220
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();
+ }
+}