-/*******************************************************************************\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.preferences;\r
-\r
-import java.text.DecimalFormat;\r
-import java.text.ParseException;\r
-\r
-import org.eclipse.core.runtime.preferences.InstanceScope;\r
-import org.eclipse.jface.layout.GridDataFactory;\r
-import org.eclipse.jface.layout.GridLayoutFactory;\r
-import org.eclipse.jface.preference.BooleanFieldEditor;\r
-import org.eclipse.jface.preference.FieldEditor;\r
-import org.eclipse.jface.preference.FieldEditorPreferencePage;\r
-import org.eclipse.jface.preference.IPreferenceStore;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.DisposeEvent;\r
-import org.eclipse.swt.events.DisposeListener;\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.Group;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Listener;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.eclipse.ui.IWorkbench;\r
-import org.eclipse.ui.IWorkbenchPreferencePage;\r
-import org.eclipse.ui.preferences.ScopedPreferenceStore;\r
-import org.osgi.service.prefs.BackingStoreException;\r
-import org.simantics.modeling.ui.Activator;\r
-import org.simantics.ui.workbench.preferences.NumberFieldEditor;\r
-import org.simantics.utils.page.MarginUtils.Margin;\r
-import org.simantics.utils.page.MarginUtils.Margins;\r
-import org.simantics.utils.page.PageDesc;\r
-import org.simantics.utils.page.PageOrientation;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-public class DiagramPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {\r
-\r
- public DiagramPreferencePage() {\r
- super(GRID);\r
- }\r
-\r
- @Override\r
- public void init(IWorkbench workbench) {\r
- }\r
-\r
- @Override\r
- protected IPreferenceStore doGetPreferenceStore() {\r
- return new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID);\r
- }\r
-\r
- @Override\r
- protected void createFieldEditors() {\r
- Group group = new Group(getFieldEditorParent(), SWT.NONE);\r
- group.setText("Grid Snapping");\r
- GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(group);\r
-\r
- NumberFieldEditor gridSizeField = new NumberFieldEditor(DiagramPreferences.P_SNAP_GRID_SIZE, "Grid size (mm)", group);\r
- // 1um - 1m grid size allowed\r
- gridSizeField.setValidRange(1e-3, 1e3);\r
- addField(gridSizeField);\r
-\r
- GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(group);\r
-\r
- PageDescFieldEditor pageDescField = new PageDescFieldEditor(getFieldEditorParent());\r
- addField(pageDescField);\r
-\r
- Group displayGroup = new Group(getFieldEditorParent(), SWT.NONE);\r
- displayGroup.setText("Display");\r
- GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(displayGroup);\r
-\r
- BooleanFieldEditor displayPage = new BooleanFieldEditor(DiagramPreferences.P_DISPLAY_PAGE_SIZE, "Show page borders", BooleanFieldEditor.SEPARATE_LABEL, displayGroup);\r
- addField(displayPage);\r
- BooleanFieldEditor displayMargins = new BooleanFieldEditor(DiagramPreferences.P_DISPLAY_MARGINS, "Show margins", BooleanFieldEditor.SEPARATE_LABEL, displayGroup);\r
- addField(displayMargins);\r
-\r
- GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(displayGroup);\r
- }\r
-\r
- static class PageDescFieldEditor extends FieldEditor {\r
-\r
- PageDesc desc;\r
- PageDesc previousDesc;\r
-\r
- Group group;\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 PageDescFieldEditor(Composite parent) {\r
- DiagramPreferences prefs = DiagramPreferenceUtil.getPreferences();\r
- desc = prefs.get(DiagramPreferences.P_DEFAULT_PAGE_SIZE);\r
- previousDesc = desc;\r
-\r
- createControl(parent);\r
- }\r
-\r
- @Override\r
- protected void adjustForNumColumns(int numColumns) {\r
- if (group != null) {\r
- ((GridData) group.getLayoutData()).horizontalSpan = numColumns;\r
- }\r
- }\r
-\r
- @Override\r
- protected void doFillIntoGrid(Composite parent, int numColumns) {\r
- group = getGroupControl(parent);\r
- GridDataFactory.fillDefaults().grab(true, false).span(numColumns, 1).applyTo(group);\r
- }\r
-\r
- /**\r
- * Returns the change button for this field editor.\r
- * @param parent The Composite to create the receiver in.\r
- *\r
- * @return the change button\r
- */\r
- protected Group getGroupControl(Composite parent) {\r
- if (group == null) {\r
- group = new Group(parent, SWT.NONE);\r
- group.setText("Page Defaults");\r
- group.setToolTipText("The default settings for diagram pages.");\r
- group.setFont(parent.getFont());\r
- group.addDisposeListener(new DisposeListener() {\r
- public void widgetDisposed(DisposeEvent event) {\r
- group = null;\r
- }\r
- });\r
- GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(group);\r
- createChoosers(group);\r
- } else {\r
- checkParent(group, parent);\r
- }\r
- return group;\r
- }\r
-\r
- protected void createChoosers(Composite parent) {\r
- //parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_BLUE));\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
- @Override\r
- protected void doLoad() {\r
- if (group != null) {\r
- DiagramPreferences prefs = DiagramPreferenceUtil.getPreferences();\r
-\r
- desc = prefs.get(DiagramPreferences.P_DEFAULT_PAGE_SIZE);\r
- previousDesc = desc;\r
-\r
- applyValuesToWidgets();\r
- }\r
- }\r
-\r
- private void applyValuesToWidgets() {\r
- applyValuesToWidgets(true);\r
- }\r
-\r
- private void applyValuesToWidgets(boolean applyMargins) {\r
- PageOrientation orit = desc.getOrientation();\r
- portrait.setSelection( orit == PageOrientation.Portrait );\r
- landscape.setSelection( orit == PageOrientation.Landscape );\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
- group.getParent().layout(true, true);\r
- pageCanvas.redraw();\r
- }\r
-\r
- @Override\r
- protected void doLoadDefault() {\r
- if (group != null) {\r
- DiagramPreferences prefs = DiagramPreferenceUtil.getDefaultPreferences();\r
- desc = prefs.get(DiagramPreferences.P_DEFAULT_PAGE_SIZE);\r
- previousDesc = desc;\r
-\r
- applyValuesToWidgets();\r
- }\r
- // This is a workaround for a problem of not having a single preference backing this CommonsFieldEditor\r
- setPresentsDefaultValue(false);\r
- }\r
-\r
- @Override\r
- protected void doStore() {\r
- try {\r
- DiagramPreferenceUtil.flushPreferences(DiagramPreferenceUtil.getPreferences().withValue(DiagramPreferences.P_DEFAULT_PAGE_SIZE, desc));\r
- } catch (BackingStoreException e) {\r
- ErrorLogger.defaultLogError("Could not store diagram preferences", e);\r
- }\r
- }\r
-\r
- @Override\r
- public int getNumberOfControls() {\r
- return 1;\r
- }\r
- }\r
-\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.modeling.ui.preferences;
+
+import java.text.DecimalFormat;
+import java.text.ParseException;
+
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.preference.BooleanFieldEditor;
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.preferences.ScopedPreferenceStore;
+import org.osgi.service.prefs.BackingStoreException;
+import org.simantics.modeling.ui.Activator;
+import org.simantics.ui.workbench.preferences.NumberFieldEditor;
+import org.simantics.utils.page.MarginUtils.Margin;
+import org.simantics.utils.page.MarginUtils.Margins;
+import org.simantics.utils.page.PageDesc;
+import org.simantics.utils.page.PageOrientation;
+import org.simantics.utils.ui.ErrorLogger;
+
+public class DiagramPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
+
+ public DiagramPreferencePage() {
+ super(GRID);
+ }
+
+ @Override
+ public void init(IWorkbench workbench) {
+ }
+
+ @Override
+ protected IPreferenceStore doGetPreferenceStore() {
+ return new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID);
+ }
+
+ @Override
+ protected void createFieldEditors() {
+ Group group = new Group(getFieldEditorParent(), SWT.NONE);
+ group.setText("Grid Snapping");
+ GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(group);
+
+ NumberFieldEditor gridSizeField = new NumberFieldEditor(DiagramPreferences.P_SNAP_GRID_SIZE, "Grid size (mm)", group);
+ // 1um - 1m grid size allowed
+ gridSizeField.setValidRange(1e-3, 1e3);
+ addField(gridSizeField);
+
+ GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(group);
+
+ PageDescFieldEditor pageDescField = new PageDescFieldEditor(getFieldEditorParent());
+ addField(pageDescField);
+
+ Group displayGroup = new Group(getFieldEditorParent(), SWT.NONE);
+ displayGroup.setText("Display");
+ GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(displayGroup);
+
+ BooleanFieldEditor displayPage = new BooleanFieldEditor(DiagramPreferences.P_DISPLAY_PAGE_SIZE, "Show page borders", BooleanFieldEditor.SEPARATE_LABEL, displayGroup);
+ addField(displayPage);
+ BooleanFieldEditor displayMargins = new BooleanFieldEditor(DiagramPreferences.P_DISPLAY_MARGINS, "Show margins", BooleanFieldEditor.SEPARATE_LABEL, displayGroup);
+ addField(displayMargins);
+
+ GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(displayGroup);
+ }
+
+ static class PageDescFieldEditor extends FieldEditor {
+
+ PageDesc desc;
+ PageDesc previousDesc;
+
+ Group group;
+
+ Button portrait;
+ Button landscape;
+ Combo combo;
+
+ Text topMargin;
+ Text leftMargin;
+ Text rightMargin;
+ Text bottomMargin;
+
+ Canvas pageCanvas;
+
+ Listener marginListener = new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ if (event.type == SWT.Modify) {
+ Text txt = (Text) event.widget;
+ String s = txt.getText();
+ double value = 0;
+ boolean invalid = false;
+ try {
+ value = DecimalFormat.getInstance().parse(s).doubleValue();
+ } catch (ParseException e) {
+ invalid = true;
+ }
+ if (invalid) {
+ txt.setBackground(txt.getDisplay().getSystemColor(SWT.COLOR_RED));
+ } else {
+ txt.setBackground(null);
+ int mask = txt == topMargin ? Margins.TOP : txt == leftMargin ? Margins.LEFT
+ : txt == rightMargin ? Margins.RIGHT : txt == bottomMargin ? Margins.BOTTOM : 0;
+ Margin m = new Margin(0, 0, value);
+ desc = desc.withMargins(desc.getMargins().withSide(mask, m));
+ applyValuesToWidgets(false);
+ }
+ } else if (event.type == SWT.FocusIn) {
+ Text txt = (Text) event.widget;
+ txt.selectAll();
+ }
+ }
+ };
+
+ int[] marginEvents = { SWT.Modify, SWT.FocusIn };
+
+ private void addMarginListeners() {
+ for (int et : marginEvents) {
+ topMargin.addListener(et, marginListener);
+ leftMargin.addListener(et, marginListener);
+ rightMargin.addListener(et, marginListener);
+ bottomMargin.addListener(et, marginListener);
+ }
+ }
+
+ private void removeMarginListeners() {
+ for (int et : marginEvents) {
+ topMargin.removeListener(et, marginListener);
+ leftMargin.removeListener(et, marginListener);
+ rightMargin.removeListener(et, marginListener);
+ bottomMargin.removeListener(et, marginListener);
+ }
+ }
+
+ public PageDescFieldEditor(Composite parent) {
+ DiagramPreferences prefs = DiagramPreferenceUtil.getPreferences();
+ desc = prefs.get(DiagramPreferences.P_DEFAULT_PAGE_SIZE);
+ previousDesc = desc;
+
+ createControl(parent);
+ }
+
+ @Override
+ protected void adjustForNumColumns(int numColumns) {
+ if (group != null) {
+ ((GridData) group.getLayoutData()).horizontalSpan = numColumns;
+ }
+ }
+
+ @Override
+ protected void doFillIntoGrid(Composite parent, int numColumns) {
+ group = getGroupControl(parent);
+ GridDataFactory.fillDefaults().grab(true, false).span(numColumns, 1).applyTo(group);
+ }
+
+ /**
+ * Returns the change button for this field editor.
+ * @param parent The Composite to create the receiver in.
+ *
+ * @return the change button
+ */
+ protected Group getGroupControl(Composite parent) {
+ if (group == null) {
+ group = new Group(parent, SWT.NONE);
+ group.setText("Page Defaults");
+ group.setToolTipText("The default settings for diagram pages.");
+ group.setFont(parent.getFont());
+ group.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent event) {
+ group = null;
+ }
+ });
+ GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(group);
+ createChoosers(group);
+ } else {
+ checkParent(group, parent);
+ }
+ return group;
+ }
+
+ protected void createChoosers(Composite parent) {
+ //parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_BLUE));
+ Label label = new Label(parent, 0);
+ label.setText("Size:");
+ combo = new Combo(parent, 0);
+ combo.addListener(SWT.Selection, new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ PageDesc pd = (PageDesc) combo.getData(combo.getItem(combo.getSelectionIndex()));
+ if (pd != null) {
+ desc = desc.withSizeFrom(pd).withText(pd.getText());
+ applyValuesToWidgets();
+ }
+ }
+ });
+
+ Composite marginComposite = new Composite(parent, 0);
+ //marginComposite.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_RED));
+ GridDataFactory.fillDefaults().grab(true, true).grab(true, true).align(SWT.CENTER, SWT.CENTER).span(1, 2).applyTo(marginComposite);
+ GridLayoutFactory.fillDefaults().numColumns(3).margins(5, 5).spacing(3, 3).applyTo(marginComposite);
+ label = new Label(marginComposite, 0);
+ label.setText("Margins (mm)");
+
+ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.TOP).span(3, 1).applyTo(label);
+ label = new Label(marginComposite, 0);
+ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.TOP).span(3, 1).applyTo(label);
+ new Label(marginComposite, 0);
+ topMargin = new Text(marginComposite, SWT.BORDER | SWT.CENTER);
+ GridDataFactory.fillDefaults().hint(50, SWT.DEFAULT).grab(true, false).applyTo(topMargin);
+ new Label(marginComposite, 0);
+ leftMargin = new Text(marginComposite, SWT.BORDER | SWT.RIGHT);
+ GridDataFactory.swtDefaults().hint(50, SWT.DEFAULT).grab(true, false).applyTo(leftMargin);
+ pageCanvas = new Canvas(marginComposite, 0);
+ GridDataFactory.swtDefaults().hint(SWT.DEFAULT, SWT.DEFAULT).grab(true, true).applyTo(pageCanvas);
+ pageCanvas.addPaintListener(new PaintListener() {
+ @Override
+ public void paintControl(PaintEvent e) {
+ GC gc = e.gc;
+ Point size = pageCanvas.getSize();
+
+ double w = desc.getOrientedWidth();
+ double h = desc.getOrientedHeight();
+
+ Margins margins = desc.getMargins();
+ int top = (int) Math.round(size.y * margins.top.diagramAbsolute / h);
+ int bottom = (int) Math.round(size.y * margins.bottom.diagramAbsolute / h);
+ int left = (int) Math.round(size.x * margins.left.diagramAbsolute / w);
+ int right = (int) Math.round(size.x * margins.right.diagramAbsolute / w);
+
+ gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_GRAY));
+ gc.fillRectangle(0, 0, size.x, size.y);
+
+ if ((top+bottom) < size.y && (left+right) < size.x) {
+ gc.drawLine(left, 0, left, size.y-1);
+ gc.drawLine(size.x-1-right, 0, size.x-1-right, size.y-1);
+ gc.drawLine(0, top, size.x-1, top);
+ gc.drawLine(0, size.y-1-bottom, size.x-1, size.y-1-bottom);
+
+ gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_WHITE));
+ gc.fillRectangle(left+1, top+1, size.x-2-right-left, size.y-2-top-bottom);
+ }
+ }
+ });
+ rightMargin = new Text(marginComposite, SWT.BORDER | SWT.LEFT);
+ GridDataFactory.swtDefaults().hint(50, SWT.DEFAULT).grab(true, false).applyTo(rightMargin);
+ new Label(marginComposite, 0);
+ bottomMargin = new Text(marginComposite, SWT.BORDER | SWT.CENTER);
+ GridDataFactory.fillDefaults().hint(50, SWT.DEFAULT).grab(true, false).applyTo(bottomMargin);
+ new Label(marginComposite, 0);
+
+ addMarginListeners();
+
+ label = new Label(parent, 0);
+ label.setText("Orientation:");
+ Composite comp = new Composite(parent, 0);
+ GridDataFactory.fillDefaults().span(1, 1).align(SWT.LEFT, SWT.CENTER).applyTo(comp);
+ GridLayoutFactory.fillDefaults().numColumns(1).applyTo(comp);
+ portrait = new Button(comp, SWT.RADIO);
+ landscape = new Button(comp, SWT.RADIO);
+ portrait.setText("Portrait");
+ landscape.setText("Landscape");
+
+ Listener orientationListener = new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ if (portrait.getSelection())
+ desc = desc.withOrientation(PageOrientation.Portrait);
+ else
+ desc = desc.withOrientation(PageOrientation.Landscape);
+
+ applyValuesToWidgets();
+ }
+ };
+ portrait.addListener(SWT.Selection, orientationListener);
+ landscape.addListener(SWT.Selection, orientationListener);
+
+ PageDesc[] pds = PageDesc.getPredefinedDescriptions();
+ for (int i = 0; i < pds.length; ++i) {
+ PageDesc pd = pds[i];
+ combo.add(pd.getText());
+ combo.setData(pd.getText(), pd);
+ }
+
+ applyValuesToWidgets();
+ }
+
+ @Override
+ protected void doLoad() {
+ if (group != null) {
+ DiagramPreferences prefs = DiagramPreferenceUtil.getPreferences();
+
+ desc = prefs.get(DiagramPreferences.P_DEFAULT_PAGE_SIZE);
+ previousDesc = desc;
+
+ applyValuesToWidgets();
+ }
+ }
+
+ private void applyValuesToWidgets() {
+ applyValuesToWidgets(true);
+ }
+
+ private void applyValuesToWidgets(boolean applyMargins) {
+ PageOrientation orit = desc.getOrientation();
+ portrait.setSelection( orit == PageOrientation.Portrait );
+ landscape.setSelection( orit == PageOrientation.Landscape );
+ String name = desc.getText();
+ int selectedIndex = combo.getSelectionIndex();
+ for (int i = 0; i < combo.getItemCount(); ++i) {
+ String item = combo.getItem(i);
+ if (name.equals(item)) {
+ if (selectedIndex != i) {
+ combo.select(i);
+ }
+ break;
+ }
+ }
+
+ if (applyMargins) {
+ boolean marginEnabled = !desc.isInfinite();
+ topMargin.setEnabled(marginEnabled);
+ leftMargin.setEnabled(marginEnabled);
+ rightMargin.setEnabled(marginEnabled);
+ bottomMargin.setEnabled(marginEnabled);
+
+ if (marginEnabled) {
+ removeMarginListeners();
+ Margins margins = desc.getMargins();
+ topMargin.setText(DecimalFormat.getNumberInstance().format(margins.top.diagramAbsolute));
+ leftMargin.setText(DecimalFormat.getNumberInstance().format(margins.left.diagramAbsolute));
+ rightMargin.setText(DecimalFormat.getNumberInstance().format(margins.right.diagramAbsolute));
+ bottomMargin.setText(DecimalFormat.getNumberInstance().format(margins.bottom.diagramAbsolute));
+ addMarginListeners();
+ }
+ }
+
+ layout(desc);
+ }
+
+ void layout(PageDesc desc) {
+ double max = Math.max(desc.getOrientedWidth(), desc.getOrientedHeight());
+ double min = Math.min(desc.getOrientedWidth(), desc.getOrientedHeight());
+ double ratio = min / max;
+ int larger = 100;
+ int smaller = (int) Math.round(ratio*larger);
+
+ boolean vertical = desc.getOrientedWidth() < desc.getOrientedHeight();
+
+ GridData gd = (GridData) pageCanvas.getLayoutData();
+ gd.widthHint = vertical ? smaller : larger;
+ gd.heightHint = vertical ? larger : smaller;
+
+ group.getParent().layout(true, true);
+ pageCanvas.redraw();
+ }
+
+ @Override
+ protected void doLoadDefault() {
+ if (group != null) {
+ DiagramPreferences prefs = DiagramPreferenceUtil.getDefaultPreferences();
+ desc = prefs.get(DiagramPreferences.P_DEFAULT_PAGE_SIZE);
+ previousDesc = desc;
+
+ applyValuesToWidgets();
+ }
+ // This is a workaround for a problem of not having a single preference backing this CommonsFieldEditor
+ setPresentsDefaultValue(false);
+ }
+
+ @Override
+ protected void doStore() {
+ try {
+ DiagramPreferenceUtil.flushPreferences(DiagramPreferenceUtil.getPreferences().withValue(DiagramPreferences.P_DEFAULT_PAGE_SIZE, desc));
+ } catch (BackingStoreException e) {
+ ErrorLogger.defaultLogError("Could not store diagram preferences", e);
+ }
+ }
+
+ @Override
+ public int getNumberOfControls() {
+ return 1;
+ }
+ }
+
+}