/*******************************************************************************
* Copyright (c) 2011 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.ui.pages.editor;
import java.util.Iterator;
import java.util.ResourceBundle;
import org.jboss.tools.common.model.ui.texteditors.AbstractMultiPageContributor;
import org.jboss.tools.common.text.xml.xpl.GoToMatchingTagAction;
import org.jboss.tools.common.text.xml.xpl.ToggleOccurencesMarkUpAction;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.ide.IDEActionFactory;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.wst.sse.ui.internal.actions.StructuredTextEditorActionConstants;
import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
import org.jboss.tools.common.gef.action.ActionRegistrySupport;
/**
* @author Jeremy
*/
public class PagesMultiPageContributor extends AbstractMultiPageContributor {
protected FakeTextEditor fakeTextEditor = new FakeTextEditor();
ActionRegistrySupport registrySupport = new ActionRegistrySupport();
public PagesMultiPageContributor() {
fToggleOccurencesMarkUp = new ToggleOccurencesMarkUpAction();
ResourceBundle resourceBundle = XMLUIMessages.getResourceBundle();
fGoToMatchingTagAction = new GoToMatchingTagAction(resourceBundle, "gotoMatchingTag_", null); //$NON-NLS-1$
fGoToMatchingTagAction.setActionDefinitionId(GO_TO_MATCHING_TAG_ID);
fGoToMatchingTagAction.setId(GO_TO_MATCHING_TAG_ID);
}
public void dispose() {
registrySupport.dispose();
super.dispose();
}
public void init(IActionBars bars) {
if(registrySupport != null) registrySupport.dispose();
registrySupport = new ActionRegistrySupport();
registrySupport.setPage(getPage());
super.init(bars);
registrySupport.buildGEFActions();
//registrySupport.addRetargetAction(new CutRetargetAction());
registrySupport.declareGlobalActionKeys();
registrySupport.contributeGEFToToolBar(bars.getToolBarManager());
initEditMenu(bars);
}
public void setActivePage(IEditorPart part) {
cleanStatusLine();
fActiveEditorPart = part;
IActionBars actionBars = getActionBars();
if (actionBars != null) {
ActionRegistry registry = null;
if(fActiveEditorPart instanceof SeamPagesGuiEditor)
registry = (ActionRegistry)part.getAdapter(ActionRegistry.class);
Iterator<String> globalActionKeys = registrySupport.getGlobalActionKeys();
while(globalActionKeys.hasNext()) {
String id = (String)globalActionKeys.next();
actionBars.setGlobalActionHandler(id, (registry == null ? null : registry.getAction(id)));
}
IToolBarManager tbm = actionBars.getToolBarManager();
IContributionItem [] items = tbm.getItems();
if(items != null){
for(int i = 0; i < items.length; i++){
String id = items[i].getId();
if(id == null) continue; //Separator
actionBars.setGlobalActionHandler(id, (registry==null ? null:registry.getAction(id)));
}
}
ITextEditor editor = (part instanceof ITextEditor) ? (ITextEditor) part : null;
if (editor!=null) {
actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), (registry != null) ? registry.getAction(ActionFactory.DELETE.getId()) : (editor != null) ? getAction(editor, ActionFactory.DELETE.getId()) : null);
actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), getAction(editor, ActionFactory.UNDO.getId()));
actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), getAction(editor, ActionFactory.REDO.getId()));
actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), (registry != null) ? registry.getAction(ActionFactory.CUT.getId()) : (editor != null) ? getAction(editor, ActionFactory.CUT.getId()) : null);
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), (registry != null) ? registry.getAction(ActionFactory.COPY.getId()) : (editor != null) ? getAction(editor, ActionFactory.COPY.getId()) : null);
actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), (registry != null) ? registry.getAction(ActionFactory.PASTE.getId()) : (editor != null) ? getAction(editor, ActionFactory.PASTE.getId()) : null);
actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), getAction(editor, ActionFactory.SELECT_ALL.getId()));
actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(), getAction(editor, ActionFactory.FIND.getId()));
actionBars.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(), getAction(editor, IDEActionFactory.BOOKMARK.getId()));
actionBars.setGlobalActionHandler(IDEActionFactory.ADD_TASK.getId(), getAction(editor, IDEActionFactory.ADD_TASK.getId()));
actionBars.setGlobalActionHandler(ActionFactory.PRINT.getId(), (registry != null) ? registry.getAction("Print_Diagram") : (editor != null) ? getAction(editor, ActionFactory.PRINT.getId()) : null);
actionBars.setGlobalActionHandler(ActionFactory.REVERT.getId(), getAction(editor, ActionFactory.REVERT.getId()));
actionBars.setGlobalActionHandler(ActionFactory.SAVE.getId(), getAction(editor, ActionFactory.SAVE.getId()));
actionBars.setGlobalActionHandler(StructuredTextEditorActionConstants.ACTION_NAME_CONTENTASSIST_PROPOSALS, getAction(editor, StructuredTextEditorActionConstants.ACTION_NAME_CONTENTASSIST_PROPOSALS));
} else {
actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), null);
actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), null);
}
// re-register action on key binding service
IEditorPart localPart = (part!=null)?part:mainPart;
IHandlerService handler = (IHandlerService)localPart.getEditorSite().getService(IHandlerService.class);
if(registry != null) {
registerKeyBindings(handler, ACTIONS_1, registry);
} else if (editor != null) {
// editor
registerKeyBindings(handler, ACTIONS_2, editor);
} else {
//fakeTextEditor
registerKeyBindings(handler, ACTIONS_1, fakeTextEditor);
}
cleanActionBarStatus();
actionBars.updateActionBars();
}
ITextEditor textEditor = getTextEditor(part);
if(fToggleOccurencesMarkUp != null) {
fToggleOccurencesMarkUp.setEditor(textEditor);
fToggleOccurencesMarkUp.update();
}
fGoToMatchingTagAction.setEditor(textEditor);
if (textEditor != null) {
textEditor.setAction(GO_TO_MATCHING_TAG_ID, fGoToMatchingTagAction);
}
updateStatus();
}
public void registerKeyBindings(IHandlerService handler, String[] actions, ActionRegistry registry) {
for (int i = 0; i < actions.length; i++) {
IAction action = registry.getAction(actions[i]);
registerKeyBinding(handler, actions[i], action);
}
}
class FakeTextEditor extends AFakeTextEditor {
public boolean canDoOperation(int operation) {
return true;
}
public void doOperation(int operation) {
if(fActiveEditorPart instanceof SeamPagesGuiEditor){
ActionRegistry registry= (ActionRegistry)fActiveEditorPart.getAdapter(ActionRegistry.class);
switch(operation){
case 3: // cut
registry.getAction(ActionFactory.CUT.getId()).run();
break;
case 4: // copy
registry.getAction(ActionFactory.COPY.getId()).run();
break;
case 5: // paste
registry.getAction(ActionFactory.PASTE.getId()).run();
break;
}
}
}
}
}