--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.modeling.ui.diagram;\r
+\r
+import java.text.DecimalFormat;\r
+import java.text.ParseException;\r
+\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.layout.GridLayoutFactory;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.PaintEvent;\r
+import org.eclipse.swt.events.PaintListener;\r
+import org.eclipse.swt.graphics.GC;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.Canvas;\r
+import org.eclipse.swt.widgets.Combo;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Listener;\r
+import org.eclipse.swt.widgets.Text;\r
+import org.simantics.utils.page.PageDesc;\r
+import org.simantics.utils.page.PageOrientation;\r
+import org.simantics.modeling.ui.preferences.DiagramPreferencePage;\r
+import org.simantics.utils.page.MarginUtils.Margin;\r
+import org.simantics.utils.page.MarginUtils.Margins;\r
+\r
+/**\r
+ * A composite control for configuring a {@link PageDesc} instance.\r
+ * \r
+ * <p>\r
+ * A PageDesc contains information about page size, orientation and margins.\r
+ * \r
+ * This code is copied from {@link DiagramPreferencePage}. To remove\r
+ * duplication, this code should be employed in DiagramPreferencePage.\r
+ * \r
+ * @author Tuukka Lehtonen (extracted here by Marko Luukkainen)\r
+ */\r
+public class PageDescComposite extends Composite {\r
+\r
+ PageDesc desc = PageDesc.DEFAULT;\r
+ PageDesc previousDesc;\r
+\r
+ Button portrait;\r
+ Button landscape;\r
+ Combo combo;\r
+\r
+ Text topMargin;\r
+ Text leftMargin;\r
+ Text rightMargin;\r
+ Text bottomMargin;\r
+\r
+ Canvas pageCanvas;\r
+\r
+ Listener marginListener = new Listener() {\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ if (event.type == SWT.Modify) {\r
+ Text txt = (Text) event.widget;\r
+ String s = txt.getText();\r
+ double value = 0;\r
+ boolean invalid = false;\r
+ try {\r
+ value = DecimalFormat.getInstance().parse(s).doubleValue();\r
+ } catch (ParseException e) {\r
+ invalid = true;\r
+ }\r
+ if (invalid) {\r
+ txt.setBackground(txt.getDisplay().getSystemColor(SWT.COLOR_RED));\r
+ } else {\r
+ txt.setBackground(null);\r
+ int mask = txt == topMargin ? Margins.TOP : txt == leftMargin ? Margins.LEFT\r
+ : txt == rightMargin ? Margins.RIGHT : txt == bottomMargin ? Margins.BOTTOM : 0;\r
+ Margin m = new Margin(0, 0, value);\r
+ desc = desc.withMargins(desc.getMargins().withSide(mask, m));\r
+ applyValuesToWidgets(false);\r
+ }\r
+ } else if (event.type == SWT.FocusIn) {\r
+ Text txt = (Text) event.widget;\r
+ txt.selectAll();\r
+ }\r
+ }\r
+ };\r
+\r
+ int[] marginEvents = { SWT.Modify, SWT.FocusIn };\r
+\r
+ private void addMarginListeners() {\r
+ for (int et : marginEvents) {\r
+ topMargin.addListener(et, marginListener);\r
+ leftMargin.addListener(et, marginListener);\r
+ rightMargin.addListener(et, marginListener);\r
+ bottomMargin.addListener(et, marginListener);\r
+ }\r
+ }\r
+\r
+ private void removeMarginListeners() {\r
+ for (int et : marginEvents) {\r
+ topMargin.removeListener(et, marginListener);\r
+ leftMargin.removeListener(et, marginListener);\r
+ rightMargin.removeListener(et, marginListener);\r
+ bottomMargin.removeListener(et, marginListener);\r
+ }\r
+ }\r
+\r
+ public PageDescComposite(Composite parent, int style) {\r
+ super(parent,style);\r
+ createChoosers(this);\r
+ }\r
+\r
+ public void setPageDesc(PageDesc desc) {\r
+ if (desc == null)\r
+ throw new NullPointerException("null page desc");\r
+ this.desc = desc;\r
+ applyValuesToWidgets();\r
+ }\r
+\r
+ public PageDesc getPageDesc() {\r
+ return desc;\r
+ }\r
+\r
+ protected void createChoosers(Composite parent) {\r
+ //parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_BLUE));\r
+ GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(parent);\r
+ Label label = new Label(parent, 0);\r
+ label.setText("Size:");\r
+ combo = new Combo(parent, 0);\r
+ combo.addListener(SWT.Selection, new Listener() {\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ PageDesc pd = (PageDesc) combo.getData(combo.getItem(combo.getSelectionIndex()));\r
+ if (pd != null) {\r
+ desc = desc.withSizeFrom(pd).withText(pd.getText());\r
+ applyValuesToWidgets();\r
+ }\r
+ }\r
+ });\r
+\r
+ Composite marginComposite = new Composite(parent, 0);\r
+ //marginComposite.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_RED));\r
+ GridDataFactory.fillDefaults().grab(true, true).grab(true, true).align(SWT.CENTER, SWT.CENTER).span(1, 2).applyTo(marginComposite);\r
+ GridLayoutFactory.fillDefaults().numColumns(3).margins(5, 5).spacing(3, 3).applyTo(marginComposite);\r
+ label = new Label(marginComposite, 0);\r
+ label.setText("Margins (mm)");\r
+\r
+ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.TOP).span(3, 1).applyTo(label);\r
+ label = new Label(marginComposite, 0);\r
+ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.TOP).span(3, 1).applyTo(label);\r
+ new Label(marginComposite, 0);\r
+ topMargin = new Text(marginComposite, SWT.BORDER | SWT.CENTER);\r
+ GridDataFactory.fillDefaults().hint(50, SWT.DEFAULT).grab(true, false).applyTo(topMargin);\r
+ new Label(marginComposite, 0);\r
+ leftMargin = new Text(marginComposite, SWT.BORDER | SWT.RIGHT);\r
+ GridDataFactory.swtDefaults().hint(50, SWT.DEFAULT).grab(true, false).applyTo(leftMargin);\r
+ pageCanvas = new Canvas(marginComposite, 0);\r
+ GridDataFactory.swtDefaults().hint(SWT.DEFAULT, SWT.DEFAULT).grab(true, true).applyTo(pageCanvas);\r
+ pageCanvas.addPaintListener(new PaintListener() {\r
+ @Override\r
+ public void paintControl(PaintEvent e) {\r
+ GC gc = e.gc;\r
+ Point size = pageCanvas.getSize();\r
+\r
+ double w = desc.getOrientedWidth();\r
+ double h = desc.getOrientedHeight();\r
+\r
+ Margins margins = desc.getMargins();\r
+ int top = (int) Math.round(size.y * margins.top.diagramAbsolute / h);\r
+ int bottom = (int) Math.round(size.y * margins.bottom.diagramAbsolute / h);\r
+ int left = (int) Math.round(size.x * margins.left.diagramAbsolute / w);\r
+ int right = (int) Math.round(size.x * margins.right.diagramAbsolute / w);\r
+\r
+ gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_GRAY));\r
+ gc.fillRectangle(0, 0, size.x, size.y);\r
+\r
+ if ((top+bottom) < size.y && (left+right) < size.x) {\r
+ gc.drawLine(left, 0, left, size.y-1);\r
+ gc.drawLine(size.x-1-right, 0, size.x-1-right, size.y-1);\r
+ gc.drawLine(0, top, size.x-1, top);\r
+ gc.drawLine(0, size.y-1-bottom, size.x-1, size.y-1-bottom);\r
+\r
+ gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_WHITE));\r
+ gc.fillRectangle(left+1, top+1, size.x-2-right-left, size.y-2-top-bottom);\r
+ }\r
+ }\r
+ });\r
+ rightMargin = new Text(marginComposite, SWT.BORDER | SWT.LEFT);\r
+ GridDataFactory.swtDefaults().hint(50, SWT.DEFAULT).grab(true, false).applyTo(rightMargin);\r
+ new Label(marginComposite, 0);\r
+ bottomMargin = new Text(marginComposite, SWT.BORDER | SWT.CENTER);\r
+ GridDataFactory.fillDefaults().hint(50, SWT.DEFAULT).grab(true, false).applyTo(bottomMargin);\r
+ new Label(marginComposite, 0);\r
+\r
+ addMarginListeners();\r
+\r
+ label = new Label(parent, 0);\r
+ label.setText("Orientation:");\r
+ Composite comp = new Composite(parent, 0);\r
+ GridDataFactory.fillDefaults().span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(comp);\r
+ GridLayoutFactory.fillDefaults().numColumns(1).applyTo(comp);\r
+ portrait = new Button(comp, SWT.RADIO);\r
+ landscape = new Button(comp, SWT.RADIO);\r
+ portrait.setText("Portrait");\r
+ landscape.setText("Landscape");\r
+\r
+ Listener orientationListener = new Listener() {\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ if (portrait.getSelection())\r
+ desc = desc.withOrientation(PageOrientation.Portrait);\r
+ else\r
+ desc = desc.withOrientation(PageOrientation.Landscape);\r
+\r
+ applyValuesToWidgets();\r
+ }\r
+ };\r
+ portrait.addListener(SWT.Selection, orientationListener);\r
+ landscape.addListener(SWT.Selection, orientationListener);\r
+\r
+ PageDesc[] pds = PageDesc.getPredefinedDescriptions();\r
+ for (int i = 0; i < pds.length; ++i) {\r
+ PageDesc pd = pds[i];\r
+ combo.add(pd.getText());\r
+ combo.setData(pd.getText(), pd);\r
+ }\r
+\r
+ applyValuesToWidgets();\r
+ }\r
+\r
+\r
+\r
+ private void applyValuesToWidgets() {\r
+ applyValuesToWidgets(true);\r
+ }\r
+\r
+ private void applyValuesToWidgets(boolean applyMargins) {\r
+ switch (desc.getOrientation()) {\r
+ case Portrait:\r
+ portrait.setSelection(true);\r
+ landscape.setSelection(false);\r
+ break;\r
+ case Landscape:\r
+ portrait.setSelection(false);\r
+ landscape.setSelection(true);\r
+ break;\r
+ }\r
+ String name = desc.getText();\r
+ int selectedIndex = combo.getSelectionIndex();\r
+ for (int i = 0; i < combo.getItemCount(); ++i) {\r
+ String item = combo.getItem(i);\r
+ if (name.equals(item)) {\r
+ if (selectedIndex != i) {\r
+ combo.select(i);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (applyMargins) {\r
+ boolean marginEnabled = !desc.isInfinite();\r
+ topMargin.setEnabled(marginEnabled);\r
+ leftMargin.setEnabled(marginEnabled);\r
+ rightMargin.setEnabled(marginEnabled);\r
+ bottomMargin.setEnabled(marginEnabled);\r
+\r
+ if (marginEnabled) {\r
+ removeMarginListeners();\r
+ Margins margins = desc.getMargins();\r
+ topMargin.setText(DecimalFormat.getNumberInstance().format(margins.top.diagramAbsolute));\r
+ leftMargin.setText(DecimalFormat.getNumberInstance().format(margins.left.diagramAbsolute));\r
+ rightMargin.setText(DecimalFormat.getNumberInstance().format(margins.right.diagramAbsolute));\r
+ bottomMargin.setText(DecimalFormat.getNumberInstance().format(margins.bottom.diagramAbsolute));\r
+ addMarginListeners();\r
+ }\r
+ }\r
+\r
+ layout(desc);\r
+ }\r
+\r
+ void layout(PageDesc desc) {\r
+ double max = Math.max(desc.getOrientedWidth(), desc.getOrientedHeight());\r
+ double min = Math.min(desc.getOrientedWidth(), desc.getOrientedHeight());\r
+ double ratio = min / max;\r
+ int larger = 100;\r
+ int smaller = (int) Math.round(ratio*larger);\r
+\r
+ boolean vertical = desc.getOrientedWidth() < desc.getOrientedHeight();\r
+\r
+ GridData gd = (GridData) pageCanvas.getLayoutData();\r
+ gd.widthHint = vertical ? smaller : larger;\r
+ gd.heightHint = vertical ? larger : smaller;\r
+\r
+ this.getParent().layout(true, true);\r
+ pageCanvas.redraw();\r
+ }\r
+}\r