package org.eclipse.iee.pad.text.ui; import java.io.StringWriter; import org.eclipse.draw2d.AbstractLayout; import org.eclipse.draw2d.BorderLayout; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.FlowLayout; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.ToolbarLayout; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.iee.core.document.text.Document; import org.eclipse.iee.core.document.text.INode; import org.eclipse.iee.core.document.text.NodeVisitor; import org.eclipse.iee.core.document.text.Text; import org.eclipse.iee.core.document.text.TextStyle; import org.eclipse.iee.editor.core.bindings.ObservableProperty; import org.eclipse.iee.editor.core.container.Container; import org.eclipse.iee.editor.core.container.TextRenderCtx; import org.eclipse.iee.editor.core.pad.FigurePad; import org.eclipse.iee.editor.core.pad.common.text.IEditorLocation; import org.eclipse.iee.editor.core.pad.common.ui.IMenuContributor; import org.eclipse.iee.editor.core.pad.common.ui.SelectionModel; import org.eclipse.iee.editor.core.pad.common.ui.SelectionModel.StyleProcessor; import org.eclipse.iee.pad.text.TextPart; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.ColorDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FontDialog; import org.eclipse.swt.widgets.Shell; import com.google.common.base.Optional; public class TextPad extends FigurePad<TextPart, Figure> implements IMenuContributor { private ImageDescriptor iBold; private ImageDescriptor iFont; private ImageDescriptor iItalic; private ImageDescriptor iCopy; private ImageDescriptor iPaste; private ImageDescriptor iTextForeground; private ImageDescriptor iTextBackground; private Optional<ObservableProperty<Document>> fRoot; private DocumentEditor fDocumentEditor; private TextRenderCtx fRenderCtx; public TextPad(TextRenderCtx renderContext) { fRenderCtx = renderContext; fDocumentEditor = new DocumentEditor(renderContext); addEditor(fDocumentEditor); } @Override public void attachContainer(Container container) { super.attachContainer(container); } @Override public void doBindValue(TextPart value) { fRoot = Optional.of(new ObservableProperty<Document>(value, "root", Document.class)); fDocumentEditor.setValue(fRoot); } @Override protected void doUnbindValue(TextPart value) { if (fRoot.isPresent()) { fRoot.get().dispose(); } } @Override public void contribute(MenuManager menuManager) { Action cutItem = new Action("Cut", SWT.PUSH) { @Override public void run() { } }; cutItem.setImageDescriptor(iCopy); cutItem.setAccelerator(SWT.MOD1 | 'x'); menuManager.add(cutItem); Action copyItem = new Action("Copy", SWT.PUSH) { @Override public void run() { } }; copyItem.setImageDescriptor(iCopy); copyItem.setAccelerator(SWT.MOD1 | 'c'); menuManager.add(copyItem); Action pasteItem = new Action("Paste", SWT.PUSH) { @Override public void run() { } }; pasteItem.setImageDescriptor(iPaste); pasteItem.setAccelerator(SWT.MOD1 | 'v'); menuManager.add(pasteItem); menuManager.add(new Separator()); Action fontItem = new Action("Font", SWT.PUSH) { @Override public void run() { FontDialog dlg = new FontDialog(getContainer().getContainerManager().getShell()); SelectionModel selectionModel = getContainer().getContainerManager().getSelectionModel(); TextStyle style = selectionModel.getStyle(); Font font = fRenderCtx.getFont(Optional.of(style)); FontData[] fontData = font.getFontData(); dlg.setFontList(fontData); Optional<Color> foreground = fRenderCtx.getForeground(Optional.of(style)); if (foreground.isPresent()) { dlg.setRGB(foreground.get().getRGB()); } if (dlg.open() != null) { final FontData[] fontList = dlg.getFontList(); final RGB rgb = dlg.getRGB(); selectionModel.applyStyle(new StyleProcessor() { @Override public void apply(TextStyle style) { style.setFont(fontList[0].getName()); style.setFontSize(fontList[0].getHeight()); if (rgb != null) { style.setFgColor(new java.awt.Color(rgb.red, rgb.green, rgb.blue)); } } }); } } }; fontItem.setImageDescriptor(iFont); menuManager.add(fontItem); Action boldItem = new Action("Bold", SWT.PUSH) { @Override public void run() { SelectionModel selectionModel = getContainer().getContainerManager().getSelectionModel(); TextStyle style = selectionModel.getStyle(); final boolean newV = !style.isBold().or(false); selectionModel.applyStyle(new StyleProcessor() { @Override public void apply(TextStyle style) { style.setBold(newV); } }); } }; boldItem.setImageDescriptor(iBold); menuManager.add(boldItem); Action italicItem = new Action("Italic", SWT.PUSH) { @Override public void run() { SelectionModel selectionModel = getContainer().getContainerManager().getSelectionModel(); TextStyle style = selectionModel.getStyle(); final boolean newV = !style.isItalic().or(false); selectionModel.applyStyle(new StyleProcessor() { @Override public void apply(TextStyle style) { style.setItalic(newV); } }); } }; italicItem.setImageDescriptor(iItalic); menuManager.add(italicItem); Action foregroundItem = new Action("Text Foreground", SWT.PUSH) { @Override public void run() { SelectionModel selectionModel = getContainer().getContainerManager().getSelectionModel(); TextStyle style = selectionModel.getStyle(); Optional<java.awt.Color> fgColor = style.getFgColor(); Shell shell = getContainer().getContainerManager().getShell(); ColorDialog dialog = new ColorDialog(shell); RGB rgb = null; if (fgColor.isPresent()) { rgb = new RGB(fgColor.get().getRed(), fgColor.get().getGreen(), fgColor.get().getBlue()); dialog.setRGB(rgb); } final RGB newRgb = dialog.open(); if (newRgb == null) return; if (!newRgb.equals(rgb)) { selectionModel.applyStyle(new StyleProcessor() { @Override public void apply(TextStyle style) { style.setFgColor(new java.awt.Color(newRgb.red, newRgb.green, newRgb.blue)); } }); } } }; foregroundItem.setImageDescriptor(iTextForeground); menuManager.add(foregroundItem); Action backgroundItem = new Action("Text Background", SWT.PUSH) { @Override public void run() { SelectionModel selectionModel = getContainer().getContainerManager().getSelectionModel(); TextStyle style = selectionModel.getStyle(); Optional<java.awt.Color> bgColor = style.getBgColor(); Shell shell = getContainer().getContainerManager().getShell(); ColorDialog dialog = new ColorDialog(shell); RGB rgb = null; if (bgColor.isPresent()) { rgb = new RGB(bgColor.get().getRed(), bgColor.get().getGreen(), bgColor.get().getBlue()); dialog.setRGB(rgb); } final RGB newRgb = dialog.open(); if (newRgb == null) return; if (!newRgb.equals(rgb)) { selectionModel.applyStyle(new StyleProcessor() { @Override public void apply(TextStyle style) { style.setBgColor(new java.awt.Color(newRgb.red, newRgb.green, newRgb.blue)); } }); } } }; backgroundItem.setImageDescriptor(iTextBackground); menuManager.add(backgroundItem); } @Override public void activate() { } @Override public void deactivate() { getContainer().updateDocument(); } @Override public String getType() { return "Text"; } void initResources() { iFont= loadImage(Display.getDefault(), "font_big.ico"); iBold = loadImage(Display.getDefault(), "bold.ico"); iItalic = loadImage(Display.getDefault(), "italic.ico"); iCopy = loadImage(Display.getDefault(), "copy.ico"); iPaste = loadImage(Display.getDefault(), "paste.ico"); iTextForeground = loadImage(Display.getDefault(), "textForeground.ico"); iTextBackground = loadImage(Display.getDefault(), "textBackground.ico"); } private ImageDescriptor loadImage(Display display, String fileName) { return ImageDescriptor.createFromURL(TextPad.class.getClassLoader().getResource("/icons/" + fileName)); } @Override public String getTex() { return rootToString(this.getDocumentPart().getRoot()).replaceAll(" ", " \\\\ ") .replaceAll("\r\n", " \\\\\\\\ ") .replaceAll("\t", " \\\\quad "); } public String rootToString(Document root) { final StringWriter sw = new StringWriter(); root.traverse(new NodeVisitor() { @Override public void tail(INode node) { } @Override public void head(INode node) { if (node instanceof Text) { sw.append(((Text) node).getText()); } } }); return sw.toString(); } public static java.awt.Color toAwtColor(Color color) { return new java.awt.Color(color.getRed(), color.getGreen(), color.getBlue()); } public static Color toSwtColor(Device device, java.awt.Paint paint) { java.awt.Color color; if (paint instanceof java.awt.Color) { color = (java.awt.Color) paint; } else { try { throw new Exception("only color is supported at present... " + "setting paint to uniform black color" ); } catch (Exception e) { e.printStackTrace(); color = new java.awt.Color(0, 0, 0); } } return new org.eclipse.swt.graphics.Color(device, color.getRed(), color.getGreen(), color.getBlue()); } @Override protected Figure createFigure() { Figure figure = new Figure(); figure.setLayoutManager(new ToolbarLayout()); figure.add(fDocumentEditor.getView().getWrapped(IFigure.class), BorderLayout.CENTER); return figure; } @Override public Optional<IEditorLocation> getTextLocation(int x, int y) { return getStart(); } }