]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagram/PageDescComposite.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagram / PageDescComposite.java
index 837b234a7ac5df33b804f01b6b61a624329e8e56..025dd45a0f17e3f38d2ed7e3eab084825586695a 100644 (file)
-/*******************************************************************************\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
+/*******************************************************************************
+ * 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.diagram;
+
+import java.text.DecimalFormat;
+import java.text.ParseException;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.swt.SWT;
+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.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.simantics.utils.page.PageDesc;
+import org.simantics.utils.page.PageOrientation;
+import org.simantics.modeling.ui.preferences.DiagramPreferencePage;
+import org.simantics.utils.page.MarginUtils.Margin;
+import org.simantics.utils.page.MarginUtils.Margins;
+
+/**
+ * A composite control for configuring a {@link PageDesc} instance.
+ * 
+ * <p>
+ * A PageDesc contains information about page size, orientation and margins.
+ * 
+ * This code is copied from {@link DiagramPreferencePage}. To remove
+ * duplication, this code should be employed in DiagramPreferencePage.
+ * 
+ * @author Tuukka Lehtonen (extracted here by Marko Luukkainen)
+ */
+public class PageDescComposite extends Composite {
+
+    PageDesc desc = PageDesc.DEFAULT;
+    PageDesc previousDesc;
+
+    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 PageDescComposite(Composite parent, int style) {
+        super(parent,style);
+        createChoosers(this);
+    }
+
+    public void setPageDesc(PageDesc desc) {
+        if (desc == null)
+            throw new NullPointerException("null page desc");
+        this.desc = desc;
+        applyValuesToWidgets();
+    }
+
+    public PageDesc getPageDesc() {
+        return desc;
+    }
+
+    protected void createChoosers(Composite parent) {
+        //parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_BLUE));
+        GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(parent);
+        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();
+    }
+
+
+
+    private void applyValuesToWidgets() {
+        applyValuesToWidgets(true);
+    }
+
+    private void applyValuesToWidgets(boolean applyMargins) {
+        switch (desc.getOrientation()) {
+            case Portrait:
+                portrait.setSelection(true);
+                landscape.setSelection(false);
+                break;
+            case Landscape:
+                portrait.setSelection(false);
+                landscape.setSelection(true);
+                break;
+        }
+        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;
+
+        this.getParent().layout(true, true);
+        pageCanvas.redraw();
+    }
+}