/**
* Copyright (c) 2015 by Brainwy Software Ltda. 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.debug.console;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.ListResourceBundle;
import java.util.Map;
import java.util.Map.Entry;
import java.util.ResourceBundle;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.console.actions.TextViewerAction;
import org.eclipse.ui.internal.console.IOConsolePage;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.texteditor.FindReplaceAction;
import org.eclipse.ui.texteditor.IUpdate;
import org.python.pydev.shared_interactive_console.console.ui.internal.ScriptConsoleViewer;
/**
* Provides a way to leave the global handlers updated when we change the focus to our
* own StyledText.
*/
@SuppressWarnings("restriction")
public class PromptOverlayReplaceGlobalActionHandlers {
private final HashMap<String, IAction> newActions = new HashMap<>();
private final FocusListener focusListener;
private final ScriptConsoleViewer viewer;
public PromptOverlayReplaceGlobalActionHandlers(final IOConsolePage consolePage, final ScriptConsoleViewer viewer) {
this.viewer = viewer;
final Map<String, IAction> old = new HashMap<>();
TextViewerAction action = new TextViewerAction(viewer, ITextOperationTarget.SELECT_ALL);
action.configureAction("Select &All", "Select All", "Select All");
action.setActionDefinitionId(ActionFactory.SELECT_ALL.getCommandId());
newActions.put(ActionFactory.SELECT_ALL.getId(), action);
action = new TextViewerAction(viewer, ITextOperationTarget.COPY);
action.configureAction("&Copy", "Copy", "Copy");
action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
action.setActionDefinitionId(ActionFactory.COPY.getCommandId());
newActions.put(ActionFactory.COPY.getId(), action);
action = new TextViewerAction(viewer, ITextOperationTarget.PASTE);
action.configureAction("&Paste", "Paste", "Paste");
action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
action.setActionDefinitionId(ActionFactory.PASTE.getCommandId());
newActions.put(ActionFactory.PASTE.getId(), action);
action = new TextViewerAction(viewer, ITextOperationTarget.CUT);
action.configureAction("C&ut", "Cut", "Cut");
action.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
action.setActionDefinitionId(ActionFactory.CUT.getCommandId());
newActions.put(ActionFactory.CUT.getId(), action);
ResourceBundle bundle = new ListResourceBundle() {
@Override
protected Object[][] getContents() {
return new Object[0][0];
}
};
FindReplaceAction findAction = new FindReplaceAction(bundle, "Editor.FindReplace.", viewer.getControl()
.getShell(), viewer.getFindReplaceTarget());
findAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_FIND_AND_REPLACE);
newActions.put(ActionFactory.FIND.getId(), findAction);
selectionDependentActionIds.add(ActionFactory.CUT.getId());
selectionDependentActionIds.add(ActionFactory.COPY.getId());
selectionDependentActionIds.add(ActionFactory.PASTE.getId());
selectionDependentActionIds.add(ActionFactory.FIND.getId());
this.focusListener = new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
if (old.size() == 0) {
return;
}
IPageSite site = consolePage.getSite();
final IActionBars actionBars = site.getActionBars();
site.setSelectionProvider(consolePage.getViewer());
viewer.getSelectionProvider().removeSelectionChangedListener(selectionChangedListener);
//Restore old ones
for (Entry<String, IAction> oldEntry : old.entrySet()) {
String actionId = oldEntry.getKey();
actionBars.setGlobalActionHandler(actionId, oldEntry.getValue());
}
old.clear();
actionBars.updateActionBars();
}
@Override
public void focusGained(FocusEvent e) {
if (old.size() > 0) {
return;
}
IPageSite site = consolePage.getSite();
//site.registerContextMenu(id, fMenuManager, fViewer);
site.setSelectionProvider(viewer);
viewer.getSelectionProvider().addSelectionChangedListener(selectionChangedListener);
final IActionBars actionBars = site.getActionBars();
//Store old ones and set new ones
for (Entry<String, IAction> entry : newActions.entrySet()) {
String actionId = entry.getKey();
IAction globalActionHandler = actionBars.getGlobalActionHandler(actionId);
old.put(actionId, globalActionHandler);
actionBars.setGlobalActionHandler(actionId, entry.getValue());
}
actionBars.updateActionBars();
}
};
viewer.getTextWidget().addFocusListener(focusListener);
}
// text selection listener, used to update selection dependent actions on selection changes
private ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
updateSelectionDependentActions();
}
};
protected ArrayList<String> selectionDependentActionIds = new ArrayList<String>();
protected void updateSelectionDependentActions() {
for (String string : selectionDependentActionIds) {
IAction action = newActions.get(string);
if (action instanceof IUpdate) {
((IUpdate) action).update();
}
}
}
public void dispose() {
StyledText textWidget = viewer.getTextWidget();
if (textWidget != null && !textWidget.isDisposed()) {
textWidget.removeFocusListener(focusListener);
}
}
}