/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.ui; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuCreator; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MenuListener; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.python.pydev.plugin.preferences.PydevPrefs; /** * Action used to force the orientation (automatic, horizontal or vertical). * * @author fabioz */ public class SetOrientationAction extends Action { public class SetOrientationActionImpl extends Action { private ViewPartWithOrientation viewPartWithOrientation; private int setsValue; public SetOrientationActionImpl(ViewPartWithOrientation viewPartWithOrientation, String text, int setsValue) { this.setText(text); this.viewPartWithOrientation = viewPartWithOrientation; this.setsValue = setsValue; updateCheck(); } public void updateCheck() { boolean check = this.setsValue == viewPartWithOrientation.getOrientationPreferenceValue(); this.setChecked(check); } @Override public void run() { PydevPrefs.getPreferenceStore().setValue(viewPartWithOrientation.getOrientationPreferencesKey(), this.setsValue); } } public static interface IActionsMenu { void add(IAction action); } /** * Yeap, all this just to show the items 'Automatic', 'Horizontal' and 'Vertical' under the Orientation menu. * * @author fabioz */ public class SetOrientationMenuCreator implements IMenuCreator { private Menu fMenu; private List<ActionContributionItem> fActions; public SetOrientationMenuCreator() { } @Override public void dispose() { if (fMenu != null) { fMenu.dispose(); fMenu = null; } } @Override public Menu getMenu(Control parent) { return null; //not used! } @Override public Menu getMenu(Menu parent) { dispose(); // dispose if already there. fMenu = new Menu(parent); fMenu.addMenuListener(new MenuListener() { @Override public void menuShown(MenuEvent e) { List<ActionContributionItem> lst = fActions; int len = lst.size(); for (int i = 0; i < len; i++) { ActionContributionItem actionContributionItem = lst.get(i); SetOrientationActionImpl action = (SetOrientationActionImpl) actionContributionItem.getAction(); action.updateCheck(); } } @Override public void menuHidden(MenuEvent e) { } }); if (view == null) { return fMenu; } ViewPartWithOrientation viewPartWithOrientation = view.get(); if (viewPartWithOrientation == null) { return fMenu; } ArrayList<ActionContributionItem> lst = new ArrayList<ActionContributionItem>(); ActionContributionItem item = new ActionContributionItem(new SetOrientationActionImpl( viewPartWithOrientation, "Automatic", ViewPartWithOrientation.PREFERENCES_VIEW_ORIENTATION_AUTOMATIC)); lst.add(item); item = new ActionContributionItem(new SetOrientationActionImpl(viewPartWithOrientation, "Horizontal", ViewPartWithOrientation.PREFERENCES_VIEW_ORIENTATION_HORIZONTAL)); lst.add(item); item = new ActionContributionItem(new SetOrientationActionImpl(viewPartWithOrientation, "Vertical", ViewPartWithOrientation.PREFERENCES_VIEW_ORIENTATION_VERTICAL)); lst.add(item); fActions = lst; int len = lst.size(); for (int i = 0; i < len; i++) { lst.get(i).fill(fMenu, i); } return fMenu; } } private WeakReference<ViewPartWithOrientation> view; /** * This is the root action (Orientation). */ public SetOrientationAction(ViewPartWithOrientation view) { this.view = new WeakReference<ViewPartWithOrientation>(view); setMenuCreator(new SetOrientationMenuCreator()); this.setText("Orientation"); setToolTipText("Update orientation"); } }