| /* |
| * 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 com.android.ide.eclipse.adt.internal.editors.layout.gle2.SubmenuAction; |
| import com.android.resources.NightMode; |
| import com.android.resources.ScreenOrientation; |
| import com.android.resources.UiMode; |
| import com.android.sdklib.devices.Device; |
| import com.android.sdklib.devices.State; |
| |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.ActionContributionItem; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.action.MenuManager; |
| import org.eclipse.jface.action.Separator; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.graphics.Rectangle; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.ToolItem; |
| |
| import java.util.List; |
| |
| /** |
| * Action which creates a submenu that shows the available orientations as well |
| * as some related options for night mode and dock mode |
| */ |
| class OrientationMenuAction extends SubmenuAction { |
| // Constants used to indicate what type of menu is being shown, such that |
| // the submenus can lazily construct their contents |
| private static final int MENU_NIGHTMODE = 1; |
| private static final int MENU_UIMODE = 2; |
| |
| private final ConfigurationChooser mConfigChooser; |
| /** Type of menu; one of the constants {@link #MENU_NIGHTMODE} etc */ |
| private final int mType; |
| |
| OrientationMenuAction(int type, String title, ConfigurationChooser configuration) { |
| super(title); |
| mType = type; |
| mConfigChooser = configuration; |
| } |
| |
| static void showMenu(ConfigurationChooser configChooser, ToolItem combo) { |
| MenuManager manager = new MenuManager(); |
| |
| // Show toggles for all the available states |
| |
| Configuration configuration = configChooser.getConfiguration(); |
| Device device = configuration.getDevice(); |
| State current = configuration.getDeviceState(); |
| if (device != null) { |
| List<State> states = device.getAllStates(); |
| |
| if (states.size() > 1 && current != null) { |
| State flip = configuration.getNextDeviceState(current); |
| String flipName = flip != null ? flip.getName() : current.getName(); |
| manager.add(new DeviceConfigAction(configChooser, |
| String.format("Switch to %1$s", flipName), flip, false, true)); |
| manager.add(new Separator()); |
| } |
| |
| for (State config : states) { |
| manager.add(new DeviceConfigAction(configChooser, config.getName(), |
| config, config == current, false)); |
| } |
| manager.add(new Separator()); |
| } |
| manager.add(new OrientationMenuAction(MENU_UIMODE, "UI Mode", configChooser)); |
| manager.add(new Separator()); |
| manager.add(new OrientationMenuAction(MENU_NIGHTMODE, "Night Mode", configChooser)); |
| |
| Menu menu = manager.createContextMenu(configChooser.getShell()); |
| 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); |
| } |
| |
| @Override |
| protected void addMenuItems(Menu menu) { |
| switch (mType) { |
| case MENU_NIGHTMODE: { |
| NightMode selected = mConfigChooser.getConfiguration().getNightMode(); |
| for (NightMode mode : NightMode.values()) { |
| boolean checked = mode == selected; |
| SelectNightModeAction action = new SelectNightModeAction(mode, checked); |
| new ActionContributionItem(action).fill(menu, -1); |
| |
| } |
| break; |
| } |
| case MENU_UIMODE: { |
| UiMode selected = mConfigChooser.getConfiguration().getUiMode(); |
| for (UiMode mode : UiMode.values()) { |
| boolean checked = mode == selected; |
| SelectUiModeAction action = new SelectUiModeAction(mode, checked); |
| new ActionContributionItem(action).fill(menu, -1); |
| } |
| break; |
| } |
| } |
| } |
| |
| |
| private class SelectNightModeAction extends Action { |
| private final NightMode mMode; |
| |
| private SelectNightModeAction(NightMode mode, boolean checked) { |
| super(mode.getLongDisplayValue(), IAction.AS_RADIO_BUTTON); |
| mMode = mode; |
| if (checked) { |
| setChecked(true); |
| } |
| } |
| |
| @Override |
| public void run() { |
| Configuration configuration = mConfigChooser.getConfiguration(); |
| configuration.setNightMode(mMode, false); |
| mConfigChooser.notifyFolderConfigChanged(); |
| } |
| } |
| |
| private class SelectUiModeAction extends Action { |
| private final UiMode mMode; |
| |
| private SelectUiModeAction(UiMode mode, boolean checked) { |
| super(mode.getLongDisplayValue(), IAction.AS_RADIO_BUTTON); |
| mMode = mode; |
| if (checked) { |
| setChecked(true); |
| } |
| } |
| |
| @Override |
| public void run() { |
| Configuration configuration = mConfigChooser.getConfiguration(); |
| configuration.setUiMode(mMode, false); |
| } |
| } |
| |
| private static class DeviceConfigAction extends Action { |
| private final ConfigurationChooser mConfiguration; |
| private final State mState; |
| |
| private DeviceConfigAction(ConfigurationChooser configuration, String title, |
| State state, boolean checked, boolean flip) { |
| super(title, IAction.AS_RADIO_BUTTON); |
| mConfiguration = configuration; |
| mState = state; |
| if (checked) { |
| setChecked(true); |
| } |
| ScreenOrientation orientation = configuration.getOrientation(state); |
| setImageDescriptor(configuration.getOrientationImage(orientation, flip)); |
| } |
| |
| @Override |
| public void run() { |
| mConfiguration.selectDeviceState(mState); |
| mConfiguration.onDeviceConfigChange(); |
| } |
| } |
| } |