/*******************************************************************************
* 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.common.model.ui.texteditors;
import java.util.*;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.ide.IDEActionFactory;
import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
import org.eclipse.ui.texteditor.*;
import org.eclipse.ui.texteditor.StatusLineContributionItem;
import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.commands.ActionHandler;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.jboss.tools.common.text.xml.ui.TextEditorMessages;
import org.jboss.tools.common.text.xml.xpl.GoToMatchingTagAction;
public abstract class AbstractMultiPageContributor extends MultiPageEditorActionBarContributor {
protected static final String GO_TO_MATCHING_TAG_ID = "org.eclipse.wst.xml.ui.gotoMatchingTag"; //$NON-NLS-1$
/** The global actions to be connected with editor actions */
protected final static String[] ACTIONS= {
ITextEditorActionConstants.UNDO,
ITextEditorActionConstants.REDO,
ITextEditorActionConstants.CUT,
ITextEditorActionConstants.COPY,
ITextEditorActionConstants.PASTE,
ITextEditorActionConstants.DELETE,
ITextEditorActionConstants.SELECT_ALL,
ITextEditorActionConstants.FIND,
IDEActionFactory.BOOKMARK.getId(),
IDEActionFactory.ADD_TASK.getId(),
ITextEditorActionConstants.PRINT,
ITextEditorActionConstants.REVERT,
ITextEditorActionConstants.SAVE,
};
protected final static String[] STATUSFIELDS = {
ITextEditorActionConstants.STATUS_CATEGORY_ELEMENT_STATE,
ITextEditorActionConstants.STATUS_CATEGORY_INPUT_MODE,
ITextEditorActionConstants.STATUS_CATEGORY_INPUT_POSITION
};
protected IEditorPart mainPart;
/**
* The active editor part.
*/
protected IEditorPart fActiveEditorPart;
/**
* The find next action.
* @since 2.0
*/
protected RetargetTextEditorAction fFindNext;
/**
* The find previous action.
* @since 2.0
*/
protected RetargetTextEditorAction fFindPrevious;
/**
* The incremental find action.
* @since 2.0
*/
protected RetargetTextEditorAction fIncrementalFind;
/**
* The reverse incremental find action.
* @since 2.1
*/
protected RetargetTextEditorAction fIncrementalFindReverse;
/**
* The go to line action.
*/
protected RetargetTextEditorAction fGotoLine;
/**
* The map of status fields.
* @since 2.0
*/
protected Map<String,StatusLineContributionItem> fStatusFields;
protected RetargetTextEditorAction fContentAssistProposal;
protected RetargetTextEditorAction fContentAssistTip;
protected TextEditorAction fToggleOccurencesMarkUp;
protected GoToMatchingTagAction fGoToMatchingTagAction;
public AbstractMultiPageContributor() {
super();
createAssistObjects();
createStatusFields();
}
protected void createAssistObjects() {
// JBIDE-2274 There is no any code assist in our XML Editors. >>>
ResourceBundle resourceBundle = XMLUIMessages.getResourceBundle();
fContentAssistProposal = new RetargetTextEditorAction(resourceBundle, ""); //$NON-NLS-1$
fContentAssistProposal.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
// fContentAssistProposal = new RetargetTextEditorAction(TextEditorMessages.getResourceBundle(), "ContentAssistProposal."); //$NON-NLS-1$
// fContentAssistProposal.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
// JBIDE-2274 There is no any code assist in our XML Editors. <<<
fContentAssistTip = new RetargetTextEditorAction(TextEditorMessages.getResourceBundle(), "ContentAssistTip."); //$NON-NLS-1$
fContentAssistTip.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION);
}
protected void createStatusFields() {
fStatusFields = new HashMap<String,StatusLineContributionItem>(3);
for (int i= 0; i < STATUSFIELDS.length; i++)
fStatusFields.put(STATUSFIELDS[i], new StatusLineContributionItem(STATUSFIELDS[i]));
}
/*
* @see org.eclipse.ui.IEditorActionBarContributor#init(org.eclipse.ui.IActionBars, org.eclipse.ui.IWorkbenchPage)
*/
public void init(IActionBars bars, IWorkbenchPage page) {
super.init(bars, page);
IToolBarManager toolBarManager= bars.getToolBarManager();
if (toolBarManager != null && fToggleOccurencesMarkUp != null) {
toolBarManager.add(new Separator());
toolBarManager.add(fToggleOccurencesMarkUp);
}
}
protected void initEditMenu(IActionBars bars) {
IMenuManager menuManager= bars.getMenuManager();
IMenuManager editMenu= menuManager.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
if (editMenu != null) {
editMenu.add(new Separator());
editMenu.add(fContentAssistProposal);
editMenu.add(fContentAssistTip);
}
}
public void setActiveEditor(IEditorPart part) {
super.setActiveEditor(part);
mainPart = part;
IActionBars actionBars = getActionBars();
if (actionBars != null) {
IStatusLineManager slm = actionBars.getStatusLineManager();
if (slm != null) {
slm.setErrorMessage(null);
slm.setMessage(null);
}
}
}
/**
* @param editor
* @return
*/
protected ITextEditor getTextEditor(IEditorPart editor) {
ITextEditor textEditor = null;
if (editor instanceof ITextEditor)
textEditor = (ITextEditor) editor;
if (textEditor == null && editor != null)
textEditor = (ITextEditor) editor.getAdapter(ITextEditor.class);
return textEditor;
}
protected void cleanStatusLine() {
if (fActiveEditorPart instanceof ITextEditorExtension) {
ITextEditorExtension extension= (ITextEditorExtension) fActiveEditorPart;
for (int i= 0; i < STATUSFIELDS.length; i++)
extension.setStatusField(null, STATUSFIELDS[i]);
}
}
protected final void cleanActionBarStatus() {
IStatusLineManager slm = getActionBars().getStatusLineManager();
if (slm != null) {
slm.setErrorMessage(null);
slm.setMessage(null);
}
}
protected void updateStatus() {
if (fActiveEditorPart instanceof ITextEditor) {
ITextEditor textEditor= (ITextEditor) fActiveEditorPart;
fContentAssistProposal.setAction(getAction(textEditor, "ContentAssistProposal")); //$NON-NLS-1$
fContentAssistTip.setAction(getAction(textEditor, "ContentAssistTip")); //$NON-NLS-1$
}
if (fActiveEditorPart instanceof ITextEditorExtension) {
ITextEditorExtension extension= (ITextEditorExtension) fActiveEditorPart;
for (int i= 0; i < STATUSFIELDS.length; i++)
extension.setStatusField((IStatusField) fStatusFields.get(STATUSFIELDS[i]), STATUSFIELDS[i]);
}
}
public void contributeToStatusLine(IStatusLineManager statusLineManager) {
super.contributeToStatusLine(statusLineManager);
for (int i= 0; i < STATUSFIELDS.length; i++)
statusLineManager.add((IContributionItem) fStatusFields.get(STATUSFIELDS[i]));
}
protected final IAction getAction(ITextEditor editor, String actionId) {
return (editor == null ? null : editor.getAction(actionId));
}
protected static String[] ACTIONS_1 = {
ITextEditorActionConstants.CUT,
ITextEditorActionConstants.COPY,
ITextEditorActionConstants.PASTE,
ITextEditorActionConstants.DELETE
};
protected static String[] ACTIONS_2 = {
ITextEditorActionConstants.CUT,
ITextEditorActionConstants.COPY,
ITextEditorActionConstants.PASTE,
ITextEditorActionConstants.DELETE,
ITextEditorActionConstants.UNDO,
ITextEditorActionConstants.REDO
};
Map<IAction, ActionHandler> used = new HashMap<IAction, ActionHandler>();
Map<String, Deactivator> registered = new HashMap<String, Deactivator>();
class Deactivator {
IHandlerService service;
IHandlerActivation handler;
Deactivator(IHandlerService service, IHandlerActivation handler) {
this.service = service;
this.handler = handler;
}
void deactivate() {
service.deactivateHandler(handler);
}
}
public void registerKeyBindings(IHandlerService handler, String[] actions, ITextEditor editor) {
for (int i = 0; i < actions.length; i++) {
IAction action = editor.getAction(actions[i]);
registerKeyBinding(handler, actions[i], action);
}
}
protected void registerKeyBinding(IHandlerService handler, String command, IAction action) {
if(action == null) return;
if(handler == null) {
return;
}
ActionHandler h = used.get(action);
if(h == null) {
h = new ActionHandler(action);
used.put(action, h);
}
String id = action.getId();
Deactivator c = registered.remove(command);
if(c != null) c.deactivate();
IHandlerActivation a = handler.activateHandler(command, h);
if(a != null) registered.put(command, new Deactivator(handler, a));
}
public void dispose() {
if (fToggleOccurencesMarkUp != null) {
fToggleOccurencesMarkUp.setEditor(null);
fToggleOccurencesMarkUp = null;
}
super.dispose();
}
protected class AFakeTextEditor implements ITextEditor, ITextOperationTarget {
protected HashMap<String,IAction> actions = new HashMap<String,IAction>();
public AFakeTextEditor() {
createFakeActions();
}
protected void createFakeActions() {
TextActionHelper.addCutAction(this);
TextActionHelper.addCopyAction(this);
TextActionHelper.addPasteAction(this);
TextActionHelper.addDeleteAction(this);
}
public IDocumentProvider getDocumentProvider() {
return null;
}
public void close(boolean save) {}
public boolean isEditable() {
return false;
}
public void doRevertToSaved() {}
public void setAction(String actionID, IAction action) {
actions.put(actionID, action);
}
public IAction getAction(String id) {
return actions.get(id);
}
public void setActionActivationCode(String actionId, char activationCharacter, int activationKeyCode, int activationStateMask) {}
public void removeActionActivationCode(String actionId) {}
public boolean showsHighlightRangeOnly() {
return false;
}
public void showHighlightRangeOnly(boolean showHighlightRangeOnly) {}
public void setHighlightRange(int offset, int length, boolean moveCursor) {}
public IRegion getHighlightRange() {
return null;
}
public void resetHighlightRange() {}
public ISelectionProvider getSelectionProvider() {
return null;
}
public void selectAndReveal(int offset, int length) {
}
public IEditorInput getEditorInput() {
return null;
}
public IEditorSite getEditorSite() {
return (IEditorSite)(fActiveEditorPart != null ? fActiveEditorPart.getSite() : mainPart.getSite());
}
public void gotoMarker(IMarker marker) {
}
public void init(IEditorSite site, IEditorInput input) throws PartInitException {}
public void addPropertyListener(IPropertyListener listener) {}
public void createPartControl(Composite parent) {}
public void dispose() {}
public IWorkbenchPartSite getSite() {
return fActiveEditorPart != null ? fActiveEditorPart.getSite() : mainPart.getSite();
}
public String getTitle() {
return null;
}
public Image getTitleImage() {
return null;
}
public String getTitleToolTip() {
return null;
}
public void removePropertyListener(IPropertyListener listener) {}
public void setFocus() {}
public Object getAdapter(Class adapter) {
if (ITextOperationTarget.class.equals(adapter)) return this;
return null;
}
public void doSave(IProgressMonitor monitor) {}
public void doSaveAs() {}
public boolean isDirty() {
return false;
}
public boolean isSaveAsAllowed() {
return false;
}
public boolean isSaveOnCloseNeeded() {
return false;
}
public boolean canDoOperation(int operation) {
return false;
}
public void doOperation(int operation) {}
}
}