blob: 4577f8d12ba48387f6db9b9dd02852dbdf82fc2f [file] [log] [blame]
/*
* 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();
}
}