package com.horstmann.violet.web.workspace.sidebar; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.List; import javax.imageio.ImageIO; import javax.swing.Icon; import javax.swing.JButton; import com.horstmann.violet.framework.injection.resources.ResourceBundleInjector; import com.horstmann.violet.framework.injection.resources.annotation.ResourceBundleBean; import com.horstmann.violet.web.workspace.editorpart.EditorPartWidget; import com.horstmann.violet.workspace.editorpart.IEditorPart; import com.horstmann.violet.workspace.editorpart.IEditorPartBehaviorManager; import com.horstmann.violet.workspace.editorpart.behavior.CutCopyPasteBehavior; import com.horstmann.violet.workspace.editorpart.behavior.UndoRedoCompoundBehavior; import com.horstmann.violet.workspace.sidebar.SideBar; import eu.webtoolkit.jwt.AlignmentFlag; import eu.webtoolkit.jwt.Signal1; import eu.webtoolkit.jwt.WBoxLayout; import eu.webtoolkit.jwt.WBoxLayout.Direction; import eu.webtoolkit.jwt.WContainerWidget; import eu.webtoolkit.jwt.WGridLayout; import eu.webtoolkit.jwt.WLabel; import eu.webtoolkit.jwt.WLength; import eu.webtoolkit.jwt.WLength.Unit; import eu.webtoolkit.jwt.WLink; import eu.webtoolkit.jwt.WMouseEvent; import eu.webtoolkit.jwt.WPushButton; import eu.webtoolkit.jwt.WResource; import eu.webtoolkit.jwt.servlet.WebRequest; import eu.webtoolkit.jwt.servlet.WebResponse; @ResourceBundleBean(resourceReference = SideBar.class) public class EditorToolsWidget extends WContainerWidget { @ResourceBundleBean(key = "zoomin") private JButton bZoomIn; @ResourceBundleBean(key = "zoomout") private JButton bZoomOut; @ResourceBundleBean(key = "undo") private JButton bUndo; @ResourceBundleBean(key = "redo") private JButton bRedo; @ResourceBundleBean(key = "delete") private JButton bDelete; @ResourceBundleBean(key = "cut") private JButton bCut; @ResourceBundleBean(key = "copy") private JButton bCopy; @ResourceBundleBean(key = "paste") private JButton bPaste; @ResourceBundleBean(key = "title.standardbuttons.text") private String title; private EditorPartWidget editorPartWidget; private WBoxLayout mainLayout; private WLabel titleLabel; private WGridLayout buttonLayout; private WPushButton undoButton; private WPushButton redoButton; private WPushButton cutButton; private WPushButton copyButton; private WPushButton pasteButton; private WPushButton deleteButton; public EditorToolsWidget(EditorPartWidget editorPartWidget) { super(); ResourceBundleInjector.getInjector().inject(this); this.editorPartWidget = editorPartWidget; setLayout(getMainLayout()); setMinimumSize(new WLength(100, Unit.Percentage), new WLength(120, Unit.Pixel)); } private WBoxLayout getMainLayout() { if (this.mainLayout == null) { this.mainLayout = new WBoxLayout(Direction.TopToBottom); this.mainLayout.addWidget(getTitleLabel()); WContainerWidget wContainerWidget = new WContainerWidget(); wContainerWidget.setLayout(getButtonLayout(), AlignmentFlag.AlignCenter, AlignmentFlag.AlignMiddle); this.mainLayout.addWidget(wContainerWidget); this.mainLayout.setContentsMargins(0, 0, 0, 0); } return this.mainLayout; } private WLabel getTitleLabel() { if (this.titleLabel == null) { this.titleLabel = new WLabel(this.title); this.titleLabel.setStyleClass("darktitle"); this.titleLabel.setMinimumSize(new WLength(100, Unit.Percentage),new WLength(22, Unit.Pixel)); this.titleLabel.setMaximumSize(new WLength(100, Unit.Percentage),new WLength(22, Unit.Pixel)); } return this.titleLabel; } private WGridLayout getButtonLayout() { if (this.buttonLayout == null) { this.buttonLayout = new WGridLayout(); this.buttonLayout.addWidget(getUndoButton(), 0, 0, AlignmentFlag.AlignMiddle); this.buttonLayout.addWidget(getRedoButton(), 0, 1, AlignmentFlag.AlignMiddle); this.buttonLayout.addWidget(getDeleteButton(), 0, 2, AlignmentFlag.AlignMiddle); this.buttonLayout.addWidget(getCutButton(), 1, 0, AlignmentFlag.AlignMiddle); this.buttonLayout.addWidget(getCopyButton(), 1, 1, AlignmentFlag.AlignMiddle); this.buttonLayout.addWidget(getPasteButton(), 1, 2, AlignmentFlag.AlignMiddle); } return this.buttonLayout; } private WPushButton getUndoButton() { if (this.undoButton == null) { this.undoButton = getWPushButton(this.bUndo); this.undoButton.clicked().addListener(this.undoButton, new Signal1.Listener<WMouseEvent>() { public void trigger(WMouseEvent e1) { UndoRedoCompoundBehavior undoRedoBehavior = getUndoRedoBehavior(); if (undoRedoBehavior != null) { undoRedoBehavior.undo(); } editorPartWidget.update(); } }); } return this.undoButton; } private WPushButton getRedoButton() { if (this.redoButton == null) { this.redoButton = getWPushButton(this.bRedo); this.redoButton.clicked().addListener(this.redoButton, new Signal1.Listener<WMouseEvent>() { public void trigger(WMouseEvent e1) { UndoRedoCompoundBehavior undoRedoBehavior = getUndoRedoBehavior(); if (undoRedoBehavior != null) { undoRedoBehavior.redo(); } editorPartWidget.update(); } }); } return this.redoButton; } private WPushButton getCutButton() { if (this.cutButton == null) { this.cutButton = getWPushButton(this.bCut); this.cutButton.clicked().addListener(this.cutButton, new Signal1.Listener<WMouseEvent>() { public void trigger(WMouseEvent e1) { CutCopyPasteBehavior cutCopyPasteBehavior = getCutCopyPasteBehavior(); cutCopyPasteBehavior.cut(); editorPartWidget.update(); } }); } return this.cutButton; } private WPushButton getCopyButton() { if (this.copyButton == null) { this.copyButton = getWPushButton(this.bCopy); this.copyButton.clicked().addListener(this.copyButton, new Signal1.Listener<WMouseEvent>() { public void trigger(WMouseEvent e1) { CutCopyPasteBehavior cutCopyPasteBehavior = getCutCopyPasteBehavior(); cutCopyPasteBehavior.copy(); editorPartWidget.update(); } }); } return this.copyButton; } private WPushButton getPasteButton() { if (this.pasteButton == null) { this.pasteButton = getWPushButton(this.bPaste); this.pasteButton.clicked().addListener(this.pasteButton, new Signal1.Listener<WMouseEvent>() { public void trigger(WMouseEvent e1) { CutCopyPasteBehavior cutCopyPasteBehavior = getCutCopyPasteBehavior(); cutCopyPasteBehavior.paste(); editorPartWidget.update(); } }); } return this.pasteButton; } private WPushButton getDeleteButton() { if (this.deleteButton == null) { this.deleteButton = getWPushButton(this.bDelete); this.deleteButton.clicked().addListener(this.deleteButton, new Signal1.Listener<WMouseEvent>() { public void trigger(WMouseEvent e1) { editorPartWidget.getEditorPart().removeSelected(); editorPartWidget.update(); } }); } return this.deleteButton; } private WPushButton getWPushButton(final JButton aSwingButton) { WPushButton aPushButton = new WPushButton(); aPushButton.setToolTip(aSwingButton.getText()); Icon icon = aSwingButton.getIcon(); WLink iconLink = getIconLink(icon); aPushButton.setIcon(iconLink); return aPushButton; } private WLink getIconLink(final Icon icon) { WResource iconResource = new WResource() { @Override protected void handleRequest(WebRequest request, WebResponse response) throws IOException { BufferedImage bi = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); Graphics g = bi.createGraphics(); // paint the Icon to the BufferedImage. icon.paintIcon(null, g, 0, 0); response.setContentType("image/png"); ImageIO.write(bi, "png", response.getOutputStream()); } }; WLink wLink = new WLink(iconResource); return wLink; } /** * Looks for UndoRedoBehavior on the current editor part * * @return the first UndoRedoBehavior object found or null */ private UndoRedoCompoundBehavior getUndoRedoBehavior() { IEditorPartBehaviorManager behaviorManager = this.editorPartWidget.getEditorPart().getBehaviorManager(); List<UndoRedoCompoundBehavior> found = behaviorManager.getBehaviors(UndoRedoCompoundBehavior.class); if (found.size() != 1) { return null; } return found.get(0); } /** * Looks for CutCopyPasteBehavior on the current editor part * * @return the first CutCopyPasteBehavior object found or null */ private CutCopyPasteBehavior getCutCopyPasteBehavior() { IEditorPart activeEditorPart = this.editorPartWidget.getEditorPart(); IEditorPartBehaviorManager behaviorManager = activeEditorPart.getBehaviorManager(); List<CutCopyPasteBehavior> found = behaviorManager.getBehaviors(CutCopyPasteBehavior.class); if (found.size() != 1) { return null; } return found.get(0); } }