package org.xmind.cathy.internal; import java.net.MalformedURLException; import java.net.URL; import javax.annotation.PostConstruct; import org.eclipse.e4.ui.model.application.ui.MUIElement; import org.eclipse.e4.ui.model.application.ui.SideValue; import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar; import org.eclipse.e4.ui.model.application.ui.basic.MWindow; import org.eclipse.e4.ui.model.application.ui.menu.MToolControl; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.actions.ActionFactory; public class UndoRedoActionToolControl { private static class HandledAction extends Action implements IPropertyChangeListener { private IAction handler; public HandledAction(IAction handler) { super(handler.getText(), handler.getStyle()); this.handler = handler; setId(handler.getId()); setEnabled(handler.isEnabled()); handler.addPropertyChangeListener(this); } @Override public void runWithEvent(Event event) { handler.runWithEvent(event); } @Override public void run() { handler.run(); } public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(IAction.ENABLED)) { Boolean bool = (Boolean) event.getNewValue(); setEnabled(bool.booleanValue()); } else if (event.getProperty().equals(IAction.CHECKED)) { Boolean bool = (Boolean) event.getNewValue(); setChecked(bool.booleanValue()); } else if (event.getProperty().equals(IAction.TOOL_TIP_TEXT)) { String str = (String) event.getNewValue(); setToolTipText(str); } } } @PostConstruct public void createWidget(Composite parent, MToolControl toolControl, MWindow window) { int orientation = getOrientation(toolControl.getParent()); int contributionItemMode = toolControl.getTags() .contains(ICathyConstants.TAG_FORCE_TEXT) ? ActionContributionItem.MODE_FORCE_TEXT : 0; ToolBarManager toolBarManager = new ToolBarManager( orientation | SWT.RIGHT | SWT.WRAP | SWT.FLAT); IWorkbenchWindow ww = window.getContext().get(IWorkbenchWindow.class); if (ww != null) { IAction undoAction = new HandledAction( ActionFactory.UNDO.create(ww)); undoAction.setImageDescriptor(imageDescriptorFor("undo.png")); //$NON-NLS-1$ ActionContributionItem undoItem = new ActionContributionItem( undoAction); undoItem.setMode(contributionItemMode); toolBarManager.add(undoItem); IAction redoAction = new HandledAction( ActionFactory.REDO.create(ww)); redoAction.setImageDescriptor(imageDescriptorFor("redo.png")); //$NON-NLS-1$ ActionContributionItem redoItem = new ActionContributionItem( redoAction); redoItem.setMode(contributionItemMode); toolBarManager.add(redoItem); } toolBarManager.createControl(parent); } private ImageDescriptor imageDescriptorFor(String iconName) { try { return ImageDescriptor.createFromURL( new URL("platform:/plugin/org.xmind.cathy/icons/toolbar/e/" //$NON-NLS-1$ + iconName)); } catch (MalformedURLException e) { return null; } } private int getOrientation(final MUIElement element) { MTrimBar trimContainer = findTrimBar(element); if (trimContainer != null) { SideValue side = trimContainer.getSide(); if (side.getValue() == SideValue.LEFT_VALUE || side.getValue() == SideValue.RIGHT_VALUE) { return SWT.VERTICAL; } } return SWT.HORIZONTAL; } private MTrimBar findTrimBar(MUIElement element) { if (element == null) return null; if (element instanceof MTrimBar) return (MTrimBar) element; return findTrimBar(element.getParent()); } }