/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.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/legal/epl-v10.html
*
* 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.google.dart.tools.ui.presentation;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.internal.presentations.SystemMenuClose;
import org.eclipse.ui.internal.presentations.SystemMenuDetach;
import org.eclipse.ui.internal.presentations.SystemMenuMaximize;
import org.eclipse.ui.internal.presentations.SystemMenuMinimize;
import org.eclipse.ui.internal.presentations.SystemMenuRestore;
import org.eclipse.ui.internal.presentations.SystemMenuSize;
import org.eclipse.ui.internal.presentations.UpdatingActionContributionItem;
import org.eclipse.ui.internal.presentations.util.ISystemMenu;
import org.eclipse.ui.presentations.IPresentablePart;
import org.eclipse.ui.presentations.IStackPresentationSite;
/**
* Implements the system view context menu.
*/
@SuppressWarnings("restriction")
public class ViewSystemMenu implements ISystemMenu {
protected MenuManager menuManager = new MenuManager();
private SystemMenuRestore restore;
private SystemMenuMinimize minimize;
private SystemMenuMaximize maximize;
private SystemMenuClose close;
/**
* Create the system view menu
*
* @param site the associated site
*/
public ViewSystemMenu(IStackPresentationSite site) {
restore = new SystemMenuRestore(site);
minimize = new SystemMenuMinimize(site);
maximize = new SystemMenuMaximize(site);
close = new SystemMenuClose(site);
initialize(site);
}
@Override
public void dispose() {
menuManager.dispose();
menuManager.removeAll();
}
@Override
public void show(Control parent, Point displayCoordinates, IPresentablePart currentSelection) {
updateActions(currentSelection);
filterMenu();
showMenu(parent, displayCoordinates);
}
protected void initialize(IStackPresentationSite site) {
menuManager.add(new GroupMarker("restore")); //$NON-NLS-1$
menuManager.add(new UpdatingActionContributionItem(restore));
menuManager.add(new GroupMarker("state")); //$NON-NLS-1$
menuManager.add(new UpdatingActionContributionItem(minimize));
menuManager.add(new UpdatingActionContributionItem(maximize));
menuManager.add(new Separator("close")); //$NON-NLS-1$
menuManager.add(close);
site.addSystemActions(menuManager);
}
/**
* Test whether the given item should be filtered from the view menu.
*
* @param item the item to test
* @return <code>true</code> if this item should be filtered from view, <code>false</code>
* otherwise
*/
protected boolean isFiltered(IContributionItem item) {
if (item instanceof SystemMenuSize) {
return true;
}
if (item instanceof ActionContributionItem) {
IAction action = ((ActionContributionItem) item).getAction();
if (action instanceof SystemMenuDetach) {
return true;
}
}
return false;
}
private void filterMenu() {
//the view stack adds (unwanted) "move" and "detach" menu items and here we remove them
for (IContributionItem item : menuManager.getItems()) {
if (isFiltered(item)) {
menuManager.remove(item);
}
}
}
private void showMenu(Control parent, Point displayCoordinates) {
Menu menu = menuManager.createContextMenu(parent);
menuManager.update(true);
menu.setLocation(displayCoordinates.x, displayCoordinates.y);
menu.setVisible(true);
}
private void updateActions(IPresentablePart currentSelection) {
restore.update();
minimize.update();
maximize.update();
close.setTarget(currentSelection);
}
}