| /* |
| * Copyright (C) 2012 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.configuration; |
| |
| import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.CUSTOM; |
| import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.DEFAULT; |
| import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.INCLUDES; |
| import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.LOCALES; |
| import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.NONE; |
| import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.SCREENS; |
| import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.VARIATIONS; |
| |
| import com.android.annotations.NonNull; |
| import com.android.annotations.Nullable; |
| import com.android.ide.common.resources.ResourceFolder; |
| import com.android.ide.common.resources.configuration.FolderConfiguration; |
| import com.android.ide.eclipse.adt.AdtPlugin; |
| import com.android.ide.eclipse.adt.AdtUtils; |
| import com.android.ide.eclipse.adt.internal.editors.IconFactory; |
| import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate; |
| import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder; |
| import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference; |
| import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas; |
| import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewManager; |
| import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode; |
| import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs; |
| import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IFolder; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.graphics.Rectangle; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.MenuItem; |
| import org.eclipse.swt.widgets.ToolItem; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.PartInitException; |
| |
| import java.util.List; |
| |
| /** |
| * The {@linkplain ConfigurationMenuListener} class is responsible for |
| * generating the configuration menu in the {@link ConfigurationChooser}. |
| */ |
| class ConfigurationMenuListener extends SelectionAdapter { |
| private static final String ICON_NEW_CONFIG = "newConfig"; //$NON-NLS-1$ |
| private static final int ACTION_SELECT_CONFIG = 1; |
| private static final int ACTION_CREATE_CONFIG_FILE = 2; |
| private static final int ACTION_ADD = 3; |
| private static final int ACTION_DELETE_ALL = 4; |
| private static final int ACTION_PREVIEW_MODE = 5; |
| |
| private final ConfigurationChooser mConfigChooser; |
| private final int mAction; |
| private final IFile mResource; |
| private final RenderPreviewMode mMode; |
| |
| ConfigurationMenuListener( |
| @NonNull ConfigurationChooser configChooser, |
| int action, |
| @Nullable IFile resource, |
| @Nullable RenderPreviewMode mode) { |
| mConfigChooser = configChooser; |
| mAction = action; |
| mResource = resource; |
| mMode = mode; |
| } |
| |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| switch (mAction) { |
| case ACTION_SELECT_CONFIG: { |
| try { |
| AdtPlugin.openFile(mResource, null, false); |
| } catch (PartInitException ex) { |
| AdtPlugin.log(ex, null); |
| } |
| return; |
| } |
| case ACTION_CREATE_CONFIG_FILE: { |
| ConfigurationClient client = mConfigChooser.getClient(); |
| if (client != null) { |
| client.createConfigFile(); |
| } |
| return; |
| } |
| } |
| |
| IEditorPart activeEditor = AdtUtils.getActiveEditor(); |
| LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(activeEditor); |
| IFile editedFile = mConfigChooser.getEditedFile(); |
| |
| if (delegate == null || editedFile == null) { |
| return; |
| } |
| // (Only do this when the two files are in the same project) |
| IProject project = delegate.getEditor().getProject(); |
| if (project == null || |
| !project.equals(editedFile.getProject())) { |
| return; |
| } |
| LayoutCanvas canvas = delegate.getGraphicalEditor().getCanvasControl(); |
| RenderPreviewManager previewManager = canvas.getPreviewManager(); |
| |
| switch (mAction) { |
| case ACTION_ADD: { |
| previewManager.addAsThumbnail(); |
| break; |
| } |
| case ACTION_PREVIEW_MODE: { |
| previewManager.selectMode(mMode); |
| break; |
| } |
| case ACTION_DELETE_ALL: { |
| previewManager.deleteManualPreviews(); |
| break; |
| } |
| default: assert false : mAction; |
| } |
| canvas.setFitScale(true /*onlyZoomOut*/, false /*allowZoomIn*/); |
| canvas.redraw(); |
| } |
| |
| static void show(ConfigurationChooser chooser, ToolItem combo) { |
| Menu menu = new Menu(chooser.getShell(), SWT.POP_UP); |
| RenderPreviewMode mode = AdtPrefs.getPrefs().getRenderPreviewMode(); |
| |
| // Configuration Previews |
| create(menu, "Add As Thumbnail...", |
| new ConfigurationMenuListener(chooser, ACTION_ADD, null, null), |
| SWT.PUSH, false); |
| if (mode == RenderPreviewMode.CUSTOM) { |
| MenuItem item = create(menu, "Delete All Thumbnails", |
| new ConfigurationMenuListener(chooser, ACTION_DELETE_ALL, null, null), |
| SWT.PUSH, false); |
| IEditorPart activeEditor = AdtUtils.getActiveEditor(); |
| LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(activeEditor); |
| if (delegate != null) { |
| LayoutCanvas canvas = delegate.getGraphicalEditor().getCanvasControl(); |
| RenderPreviewManager previewManager = canvas.getPreviewManager(); |
| if (!previewManager.hasManualPreviews()) { |
| item.setEnabled(false); |
| } |
| } |
| } |
| |
| @SuppressWarnings("unused") |
| MenuItem configSeparator = new MenuItem(menu, SWT.SEPARATOR); |
| |
| create(menu, "Preview Representative Sample", |
| new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null, |
| DEFAULT), SWT.RADIO, mode == DEFAULT); |
| create(menu, "Preview All Screen Sizes", |
| new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null, |
| SCREENS), SWT.RADIO, mode == SCREENS); |
| |
| MenuItem localeItem = create(menu, "Preview All Locales", |
| new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null, |
| LOCALES), SWT.RADIO, mode == LOCALES); |
| if (chooser.getLocaleList().size() <= 1) { |
| localeItem.setEnabled(false); |
| } |
| |
| boolean canPreviewIncluded = false; |
| IProject project = chooser.getProject(); |
| if (project != null) { |
| IncludeFinder finder = IncludeFinder.get(project); |
| final List<Reference> includedBy = finder.getIncludedBy(chooser.getEditedFile()); |
| canPreviewIncluded = includedBy != null && !includedBy.isEmpty(); |
| } |
| //if (!graphicalEditor.renderingSupports(Capability.EMBEDDED_LAYOUT)) { |
| // canPreviewIncluded = false; |
| //} |
| MenuItem includedItem = create(menu, "Preview Included", |
| new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null, |
| INCLUDES), SWT.RADIO, mode == INCLUDES); |
| if (!canPreviewIncluded) { |
| includedItem.setEnabled(false); |
| } |
| |
| IFile file = chooser.getEditedFile(); |
| List<IFile> variations = AdtUtils.getResourceVariations(file, true); |
| MenuItem variationsItem = create(menu, "Preview Layout Versions", |
| new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null, |
| VARIATIONS), SWT.RADIO, mode == VARIATIONS); |
| if (variations.size() <= 1) { |
| variationsItem.setEnabled(false); |
| } |
| |
| create(menu, "Manual Previews", |
| new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null, |
| CUSTOM), SWT.RADIO, mode == CUSTOM); |
| create(menu, "None", |
| new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null, |
| NONE), SWT.RADIO, mode == NONE); |
| |
| if (variations.size() > 1) { |
| @SuppressWarnings("unused") |
| MenuItem separator = new MenuItem(menu, SWT.SEPARATOR); |
| |
| ResourceManager manager = ResourceManager.getInstance(); |
| for (final IFile resource : variations) { |
| IFolder parent = (IFolder) resource.getParent(); |
| ResourceFolder parentResource = manager.getResourceFolder(parent); |
| FolderConfiguration configuration = parentResource.getConfiguration(); |
| String title = configuration.toDisplayString(); |
| |
| MenuItem item = create(menu, title, |
| new ConfigurationMenuListener(chooser, ACTION_SELECT_CONFIG, |
| resource, null), |
| SWT.CHECK, false); |
| |
| if (file != null) { |
| boolean selected = file.equals(resource); |
| if (selected) { |
| item.setSelection(true); |
| item.setEnabled(false); |
| } |
| } |
| } |
| } |
| |
| Configuration configuration = chooser.getConfiguration(); |
| if (configuration.getEditedConfig() != null && |
| !configuration.getEditedConfig().equals(configuration.getFullConfig())) { |
| if (variations.size() > 0) { |
| @SuppressWarnings("unused") |
| MenuItem separator = new MenuItem(menu, SWT.SEPARATOR); |
| } |
| |
| // Add action for creating a new configuration |
| MenuItem item = create(menu, "Create New...", |
| new ConfigurationMenuListener(chooser, ACTION_CREATE_CONFIG_FILE, |
| null, null), |
| SWT.PUSH, false); |
| item.setImage(IconFactory.getInstance().getIcon(ICON_NEW_CONFIG)); |
| } |
| |
| Rectangle bounds = combo.getBounds(); |
| Point location = new Point(bounds.x, bounds.y + bounds.height); |
| location = combo.getParent().toDisplay(location); |
| menu.setLocation(location.x, location.y); |
| menu.setVisible(true); |
| } |
| |
| @NonNull |
| public static MenuItem create(@NonNull Menu menu, String title, |
| ConfigurationMenuListener listener, int style, boolean selected) { |
| MenuItem item = new MenuItem(menu, style); |
| item.setText(title); |
| item.addSelectionListener(listener); |
| if (selected) { |
| item.setSelection(true); |
| } |
| return item; |
| } |
| |
| @NonNull |
| static MenuItem addTogglePreviewModeAction( |
| @NonNull Menu menu, |
| @NonNull String title, |
| @NonNull ConfigurationChooser chooser, |
| @NonNull RenderPreviewMode mode) { |
| boolean selected = AdtPrefs.getPrefs().getRenderPreviewMode() == mode; |
| if (selected) { |
| mode = RenderPreviewMode.NONE; |
| } |
| return create(menu, title, |
| new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null, mode), |
| SWT.CHECK, selected); |
| } |
| } |