// ============================================================================
//
// Copyright (C) 2006-2012 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.core.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.gef.editparts.ZoomManager;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gef.ui.actions.DeleteRetargetAction;
import org.eclipse.gef.ui.actions.GEFActionConstants;
import org.eclipse.gef.ui.actions.RedoRetargetAction;
import org.eclipse.gef.ui.actions.UndoRetargetAction;
import org.eclipse.gef.ui.actions.ZoomComboContributionItem;
import org.eclipse.gef.ui.actions.ZoomInRetargetAction;
import org.eclipse.gef.ui.actions.ZoomOutRetargetAction;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.RetargetAction;
import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
import org.eclipse.ui.texteditor.ITextEditor;
import org.talend.designer.core.i18n.Messages;
import org.talend.designer.core.ui.action.ToggleSubjobsAction;
import org.talend.designer.core.ui.action.ToggleSubjobsRetargetAction;
import org.talend.designer.core.ui.editor.AbstractTalendEditor;
/**
* Manages the installation/deinstallation of global actions for multi-page editors. Responsible for the redirection of
* global actions to the active editor. Multi-page contributor replaces the contributors for the individual editors in
* the multi-page editor. <br/>
*
* $Id: MultiPageEditorContributor.java 77219 2012-01-24 01:14:15Z mhirt $
*
*/
public class MultiPageEditorContributor extends MultiPageEditorActionBarContributor {
private IEditorPart activeEditorPart;
// MOD mzhao bug 8710.
private static Action showAndRunProcessAction = null;
private ActionRegistry registry = new ActionRegistry();
public MultiPageEditorContributor() {
super();
}
private List<RetargetAction> retargetActions = new ArrayList<RetargetAction>();
private List<String> designActionKeys = new ArrayList<String>();
private static final String[] VIEW_MENU_ACTIONS_ID = new String[] { GEFActionConstants.ZOOM_IN, GEFActionConstants.ZOOM_OUT,
GEFActionConstants.TOGGLE_GRID_VISIBILITY, GEFActionConstants.TOGGLE_SNAP_TO_GEOMETRY };
public static void setShowAndRunProcessAction(Action action) {
showAndRunProcessAction = action;
}
@Override
public void init(final IActionBars bars) {
buildDesignActions();
super.init(bars);
}
/**
* Pr�pare toutes les actions relatives au designer Gef.
*/
protected void buildDesignActions() {
addDesignRetargetAction(new ZoomInRetargetAction());
addDesignRetargetAction(new ZoomOutRetargetAction());
addDesignRetargetAction(new DeleteRetargetAction());
addDesignRetargetAction(new UndoRetargetAction());
addDesignRetargetAction(new RedoRetargetAction());
addDesignRetargetAction(new RetargetAction(GEFActionConstants.TOGGLE_SNAP_TO_GEOMETRY, Messages
.getString("MultiPageEditorContributor.Snap"), //$NON-NLS-1$
IAction.AS_CHECK_BOX));
addDesignRetargetAction(new RetargetAction(GEFActionConstants.TOGGLE_GRID_VISIBILITY, Messages
.getString("MultiPageEditorContributor.Grid"), //$NON-NLS-1$
IAction.AS_CHECK_BOX));
addDesignRetargetAction(new ToggleSubjobsRetargetAction());
addDesignActionKey(ActionFactory.COPY.getId());
addDesignActionKey(ActionFactory.PASTE.getId());
addDesignActionKey(ActionFactory.PRINT.getId());
addDesignActionKey(ActionFactory.SELECT_ALL.getId());
addDesignActionKey(ActionFactory.DELETE.getId());
}
protected void addAction(final IAction action) {
getActionRegistry().registerAction(action);
}
protected void addDesignActionKey(final String key) {
designActionKeys.add(key);
}
protected void addDesignRetargetAction(final RetargetAction action) {
addAction(action);
retargetActions.add(action);
getPage().addPartListener(action);
addDesignActionKey(action.getId());
}
protected IAction getAction(final String id) {
return getActionRegistry().getAction(id);
}
protected ActionRegistry getActionRegistry() {
return registry;
}
/**
* Returns the action registed with the given text editor.
*
* @return IAction or null if editor is null.
*/
protected IAction getAction(IEditorPart editor, String actionID) {
if (editor instanceof ITextEditor) {
return ((ITextEditor) editor).getAction(actionID);
}
if (editor instanceof AbstractTalendEditor) {
return ((AbstractTalendEditor) editor).getAction(actionID);
}
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.MultiPageEditorActionBarContributor#setActivePage(org.eclipse.ui.IEditorPart)
*/
@Override
public void setActivePage(final IEditorPart activeEditor) {
if ((activeEditorPart == activeEditor) || (activeEditor == null)) {
return;
}
activeEditorPart = activeEditor;
IActionBars actionBars = getActionBars();
if (actionBars != null) {
actionBars
.setGlobalActionHandler(ActionFactory.DELETE.getId(), getAction(activeEditor, ActionFactory.DELETE.getId()));
actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), getAction(activeEditor, ActionFactory.UNDO.getId()));
actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), getAction(activeEditor, ActionFactory.REDO.getId()));
actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), getAction(activeEditor, ActionFactory.CUT.getId()));
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), getAction(activeEditor, ActionFactory.COPY.getId()));
actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), getAction(activeEditor, ActionFactory.PASTE.getId()));
actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), getAction(activeEditor, ActionFactory.SELECT_ALL
.getId()));
actionBars.setGlobalActionHandler(ToggleSubjobsAction.ID, getAction(activeEditor, ToggleSubjobsAction.ID));
// see bug 0003656: Actions in the main menu "View" are always disabled.
activateActionsInViewMenu(activeEditor, actionBars, VIEW_MENU_ACTIONS_ID);
// MOD mzhao bug 8710
if (showAndRunProcessAction != null) {
actionBars.setGlobalActionHandler(showAndRunProcessAction.getActionDefinitionId(), showAndRunProcessAction);
}
actionBars.updateActionBars();
}
}
/**
* See bug 0003656: Actions in the main menu "View" are always disabled. Reset the handlers for view menu to
* activate action items.
*
* @param activeEditor
* @param actionBars
* @param viewActionIds
*/
private void activateActionsInViewMenu(IEditorPart activeEditor, IActionBars actionBars, String... viewActionIds) {
for (String actionId : viewActionIds) {
actionBars.setGlobalActionHandler(actionId, getAction(activeEditor, actionId));
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(org.eclipse.jface.action.IMenuManager)
*/
@Override
public void contributeToMenu(final IMenuManager menubar) {
super.contributeToMenu(menubar);
MenuManager viewMenu = new MenuManager(Messages.getString("MultiPageEditorContributor.View")); //$NON-NLS-1$
viewMenu.add(getAction(GEFActionConstants.ZOOM_IN));
viewMenu.add(getAction(GEFActionConstants.ZOOM_OUT));
viewMenu.add(new Separator());
viewMenu.add(getAction(GEFActionConstants.TOGGLE_GRID_VISIBILITY));
viewMenu.add(getAction(GEFActionConstants.TOGGLE_SNAP_TO_GEOMETRY));
menubar.insertAfter(IWorkbenchActionConstants.M_EDIT, viewMenu);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(org.eclipse.jface.action.IToolBarManager)
*/
@Override
public void contributeToToolBar(final IToolBarManager toolBarManager) {
// toolBarManager.add(CorePlugin.getDefault().getRunProcessService().getRunProcessAction());
toolBarManager.add(getAction(ActionFactory.UNDO.getId()));
toolBarManager.add(getAction(ActionFactory.REDO.getId()));
toolBarManager.add(getAction(ToggleSubjobsAction.ID));
String[] zoomStrings = new String[] { ZoomManager.FIT_ALL, ZoomManager.FIT_HEIGHT, ZoomManager.FIT_WIDTH };
toolBarManager.add(new ZoomComboContributionItem(getPage(), zoomStrings));
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.EditorActionBarContributor#dispose()
*/
@Override
public void dispose() {
super.dispose();
IActionBars actionBars = getActionBars();
if (actionBars != null) {
actionBars.clearGlobalActionHandlers();
}
for (RetargetAction action : retargetActions) {
getPage().removePartListener(action);
}
activeEditorPart = null;
designActionKeys = null;
retargetActions = null;
registry = null;
}
}