]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagram/PageSettingsDialog.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagram / PageSettingsDialog.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.modeling.ui.diagram;\r
13 \r
14 import org.eclipse.jface.dialogs.Dialog;\r
15 import org.eclipse.jface.layout.GridDataFactory;\r
16 import org.eclipse.jface.layout.GridLayoutFactory;\r
17 import org.eclipse.swt.SWT;\r
18 import org.eclipse.swt.events.ModifyEvent;\r
19 import org.eclipse.swt.events.ModifyListener;\r
20 import org.eclipse.swt.events.SelectionAdapter;\r
21 import org.eclipse.swt.events.SelectionEvent;\r
22 import org.eclipse.swt.widgets.Button;\r
23 import org.eclipse.swt.widgets.Composite;\r
24 import org.eclipse.swt.widgets.Control;\r
25 import org.eclipse.swt.widgets.Display;\r
26 import org.eclipse.swt.widgets.Group;\r
27 import org.eclipse.swt.widgets.Label;\r
28 import org.eclipse.swt.widgets.Shell;\r
29 import org.eclipse.swt.widgets.Text;\r
30 import org.simantics.db.ReadGraph;\r
31 import org.simantics.db.Resource;\r
32 import org.simantics.db.Session;\r
33 import org.simantics.db.WriteGraph;\r
34 import org.simantics.db.common.request.IndexRoot;\r
35 import org.simantics.db.common.request.ReadRequest;\r
36 import org.simantics.db.common.request.WriteRequest;\r
37 import org.simantics.db.exception.DatabaseException;\r
38 import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;\r
39 import org.simantics.modeling.ui.preferences.DiagramPreferences;\r
40 import org.simantics.scl.commands.Commands;\r
41 import org.simantics.ui.SimanticsUI;\r
42 import org.simantics.utils.page.PageDesc;\r
43 \r
44 /**\r
45  * A dialog for changing page settings\r
46  * \r
47  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
48  */\r
49 public class PageSettingsDialog extends Dialog {\r
50 \r
51     private final Session session;\r
52     private final Resource diagramResource;\r
53 \r
54     private PageDescComposite pdc;\r
55     private Text gridSizeText;\r
56     private Button showBordersButton;\r
57     private Button showMarginsButton;\r
58 \r
59     private PageDesc pageDesc;\r
60     private double gridSize;\r
61     private double lastGridSize;\r
62     private boolean borders = false;\r
63     private boolean margins = false;\r
64 \r
65 \r
66     public PageSettingsDialog(Resource diagramResource, Shell parentShell) {\r
67         super(parentShell);\r
68         this.session = SimanticsUI.getSession();\r
69         this.diagramResource = diagramResource;\r
70     }\r
71 \r
72 \r
73     @Override\r
74     protected void configureShell(Shell newShell) {\r
75         super.configureShell(newShell);\r
76         newShell.setText("Page Settings");\r
77     }\r
78 \r
79     @Override\r
80     protected Control createDialogArea(Composite parent) {\r
81         Composite composite = (Composite) super.createDialogArea(parent);\r
82 \r
83         Group group = new Group(composite, SWT.NONE);\r
84         group.setText("Grid Snapping");\r
85         GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(group);\r
86         Label label = new Label(group, SWT.NONE);\r
87         label.setText("Grid size (mm)");\r
88         gridSizeText = new Text(group, SWT.SINGLE|SWT.BORDER);\r
89         GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(group);\r
90         GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(gridSizeText);\r
91 \r
92         Group pageGroup = new Group(composite, SWT.NONE);\r
93         pageGroup.setText("Page size");\r
94         pdc = new PageDescComposite(pageGroup, SWT.NONE);\r
95         GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(pageGroup);\r
96         GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(pageGroup);\r
97         GridDataFactory.fillDefaults().grab(true, true).span(1, 1).applyTo(pdc);\r
98 \r
99         Group displayGroup = new Group(composite, SWT.NONE);\r
100         displayGroup.setText("Display");\r
101         showBordersButton = new Button(displayGroup, SWT.CHECK);\r
102         showBordersButton.setText("Show page borders");\r
103         showMarginsButton = new Button(displayGroup, SWT.CHECK);\r
104         showMarginsButton.setText("Show margins");\r
105         GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(false).extendedMargins(12, 12, 12, 12).spacing(5, 4).applyTo(displayGroup);\r
106 \r
107         GridDataFactory.fillDefaults().grab(true, false).span(1, 1).applyTo(displayGroup);\r
108 \r
109         gridSizeText.addModifyListener(new ModifyListener() {\r
110             @Override\r
111             public void modifyText(ModifyEvent e) {\r
112                 String text = ((Text)e.widget).getText();\r
113                 try {\r
114                     gridSize = Double.parseDouble(text);\r
115                     if (gridSize < 1e-3 || gridSize > 1e3) {\r
116                         gridSize = lastGridSize;\r
117                         setGridSizeValid(false);\r
118                     } else {\r
119                         setGridSizeValid(true);\r
120                     }\r
121                 } catch (NumberFormatException err) {\r
122                     gridSize = lastGridSize;\r
123                     setGridSizeValid(false);\r
124                 }\r
125             }\r
126 \r
127             void setGridSizeValid(boolean valid) {\r
128                 if (valid) {\r
129                     gridSizeText.setBackground(null);\r
130                     gridSizeText.setForeground(null);\r
131                 } else {\r
132                     //gridSizeText.setBackground(gridSizeText.getDisplay().getSystemColor(SWT.COLOR_RED));\r
133                     gridSizeText.setForeground(gridSizeText.getDisplay().getSystemColor(SWT.COLOR_RED));\r
134                 }\r
135             }\r
136         });\r
137 \r
138         showBordersButton.addSelectionListener(new SelectionAdapter() {\r
139             @Override\r
140             public void widgetSelected(SelectionEvent e) {\r
141                 borders = ((Button)e.widget).getSelection();\r
142             }\r
143         });\r
144 \r
145         showMarginsButton.addSelectionListener(new SelectionAdapter() {\r
146             @Override\r
147             public void widgetSelected(SelectionEvent e) {\r
148                 margins = ((Button)e.widget).getSelection();\r
149             }\r
150         });\r
151 \r
152         loadValues();\r
153 \r
154         return composite;\r
155     }\r
156 \r
157     public void applySettings() {\r
158         if (pdc.getPageDesc() != null)\r
159             pageDesc = pdc.getPageDesc();\r
160         session.markUndoPoint();\r
161         session.asyncRequest(new WriteRequest() {\r
162             @Override\r
163             public void perform(WriteGraph graph) throws DatabaseException {\r
164                 Resource model = graph.syncRequest(new IndexRoot(diagramResource));\r
165                 Commands.get(graph, "Simantics/PageSettings/setPageDesc")\r
166                         .execute(graph, model, diagramResource, pageDesc.toRepr());\r
167                 Commands.get(graph, "Simantics/PageSettings/setGridSize")\r
168                         .execute(graph, model, diagramResource, gridSize);\r
169                 Commands.get(graph, "Simantics/PageSettings/setPageBordersVisible")\r
170                         .execute(graph, model, diagramResource, borders);\r
171                 Commands.get(graph, "Simantics/PageSettings/setMarginsVisible")\r
172                         .execute(graph, model, diagramResource, margins);\r
173             }\r
174         });\r
175     }\r
176 \r
177     private void loadValues() {\r
178         session.asyncRequest(new ReadRequest() {\r
179 \r
180             @Override\r
181             public void run(ReadGraph graph) throws DatabaseException {\r
182                 pageDesc = DiagramGraphUtil.getPageDesc(graph, diagramResource, PageDesc.DEFAULT);\r
183                 gridSize = DiagramGraphUtil.getGridSize(graph, diagramResource, DiagramPreferences.DEFAULT_SNAP_GRID_SIZE);\r
184                 lastGridSize = gridSize;\r
185                 borders = DiagramGraphUtil.isPageBordersVisible(graph, diagramResource);\r
186                 margins = DiagramGraphUtil.isMarginsVisible(graph, diagramResource);\r
187                 Display.getDefault().asyncExec(new Runnable() {\r
188                     @Override\r
189                     public void run() {\r
190                         applyValues();\r
191                     }\r
192                 });\r
193             }\r
194         });\r
195     }\r
196 \r
197     private void applyValues() {\r
198         pdc.setPageDesc(pageDesc);\r
199         gridSizeText.setText(Double.toString(gridSize));\r
200         showBordersButton.setSelection(borders);\r
201         showMarginsButton.setSelection(margins);\r
202     }\r
203 \r
204 }\r