001 /*
002 GRANITE DATA SERVICES
003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005 This file is part of Granite Data Services.
006
007 Granite Data Services is free software; you can redistribute it and/or modify
008 it under the terms of the GNU Library General Public License as published by
009 the Free Software Foundation; either version 2 of the License, or (at your
010 option) any later version.
011
012 Granite Data Services is distributed in the hope that it will be useful, but
013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015 for more details.
016
017 You should have received a copy of the GNU Library General Public License
018 along with this library; if not, see <http://www.gnu.org/licenses/>.
019 */
020
021 package org.granite.builder.ui;
022
023 import java.beans.PropertyChangeEvent;
024 import java.beans.PropertyChangeListener;
025 import java.util.HashSet;
026 import java.util.Set;
027
028 import org.eclipse.core.runtime.CoreException;
029 import org.eclipse.swt.SWT;
030 import org.eclipse.swt.events.SelectionAdapter;
031 import org.eclipse.swt.events.SelectionEvent;
032 import org.eclipse.swt.graphics.Rectangle;
033 import org.eclipse.swt.layout.FillLayout;
034 import org.eclipse.swt.layout.GridData;
035 import org.eclipse.swt.layout.GridLayout;
036 import org.eclipse.swt.widgets.Button;
037 import org.eclipse.swt.widgets.Composite;
038 import org.eclipse.swt.widgets.Label;
039 import org.eclipse.swt.widgets.List;
040 import org.eclipse.swt.widgets.Text;
041 import org.granite.builder.GraniteBuilderContext;
042 import org.granite.builder.properties.Gas3;
043 import org.granite.builder.properties.Gas3Translator;
044 import org.granite.builder.properties.GraniteProperties;
045 import org.granite.builder.util.SWTUtil;
046 import org.granite.builder.util.StringUtil;
047
048 /**
049 * @author Franck WOLFF
050 */
051 public class OptionsPanel extends Composite implements PropertyChangeListener {
052
053 private static final String TRANSLATOR_SEPARATOR = " -> ";
054
055 private final GraniteProperties properties;
056
057 private Text uid = null;
058 private Text as3TypeFactory = null;
059 private Text entityFactory = null;
060 private Text remoteDestinationFactory = null;
061 private Text transformer = null;
062 private List translators = null;
063 private Button debugEnabled = null;
064 private Button flexConfig = null;
065 private Button externalizeLong = null;
066 private Button externalizeBigInteger = null;
067 private Button externalizeBigDecimal = null;
068
069 private boolean initialized = false;
070
071 public OptionsPanel(Composite parent, GraniteBuilderContext context) throws CoreException {
072 super(parent, SWT.NONE);
073 this.properties = context.getProperties();
074 initializeComponents();
075 }
076
077 public String getUid() {
078 if (!initialized)
079 return properties.getGas3().getUid();
080 return uid.getText();
081 }
082
083 public String getAs3TypeFactory() {
084 if (!initialized)
085 return properties.getGas3().getAs3TypeFactory();
086 return as3TypeFactory.getText();
087 }
088
089 public String getEntityFactory() {
090 if (!initialized)
091 return properties.getGas3().getEntityFactory();
092 return entityFactory.getText();
093 }
094
095 public String getRemoteDestinationFactory() {
096 if (!initialized)
097 return properties.getGas3().getRemoteDestinationFactory();
098 return remoteDestinationFactory.getText();
099 }
100
101 public String getTransformer() {
102 if (!initialized) {
103 if (properties.getGas3().getTransformers().isEmpty())
104 return "";
105 return properties.getGas3().getTransformers().get(0).getType();
106 }
107 return transformer.getText();
108 }
109
110 public Set<Gas3Translator> getTranslators() {
111 if (!initialized)
112 return properties.getGas3().getTranslators();
113
114 Set<Gas3Translator> translatorsSet = new HashSet<Gas3Translator>();
115 for (String translator : translators.getItems()) {
116 String[] values = StringUtil.split(translator, TRANSLATOR_SEPARATOR);
117 if (values.length == 2)
118 translatorsSet.add(new Gas3Translator(values[0], values[1]));
119 }
120 return translatorsSet;
121 }
122
123 public boolean isDebugEnabled() {
124 return debugEnabled.getSelection();
125 }
126
127 public boolean isFlexConfig() {
128 return flexConfig.getSelection();
129 }
130
131 public boolean isExternalizeLong() {
132 return externalizeLong.getSelection();
133 }
134
135 public boolean isExternalizeBigInteger() {
136 return externalizeBigInteger.getSelection();
137 }
138
139 public boolean isExternalizeBigDecimal() {
140 return externalizeBigDecimal.getSelection();
141 }
142
143 @Override
144 public Rectangle getClientArea() {
145 initializeContent();
146 return super.getClientArea();
147 }
148
149 private void initializeContent() {
150 if (!initialized) {
151 if (properties.getGas3().getUid() != null)
152 uid.setText(properties.getGas3().getUid());
153
154 if (properties.getGas3().getAs3TypeFactory() != null)
155 as3TypeFactory.setText(properties.getGas3().getAs3TypeFactory());
156
157 if (properties.getGas3().getEntityFactory() != null)
158 entityFactory.setText(properties.getGas3().getEntityFactory());
159
160 if (properties.getGas3().getRemoteDestinationFactory() != null)
161 remoteDestinationFactory.setText(properties.getGas3().getRemoteDestinationFactory());
162
163 if (!properties.getGas3().getTransformers().isEmpty())
164 transformer.setText(properties.getGas3().getTransformers().get(0).getType());
165
166 for (Gas3Translator translator : properties.getGas3().getTranslators())
167 translators.add(translator.getJava() + TRANSLATOR_SEPARATOR + translator.getAs3());
168
169 debugEnabled.setSelection(properties.getGas3().isDebugEnabled());
170 flexConfig.setSelection(properties.getGas3().isFlexConfig());
171 externalizeLong.setSelection(properties.getGas3().isExternalizeLong());
172 externalizeBigInteger.setSelection(properties.getGas3().isExternalizeBigInteger());
173 externalizeBigDecimal.setSelection(properties.getGas3().isExternalizeBigDecimal());
174
175 initialized = true;
176
177 this.properties.getGas3().removePropertyChangeListener(this);
178 this.properties.getGas3().addPropertyChangeListener(this);
179 }
180 }
181
182 @Override
183 public void propertyChange(PropertyChangeEvent evt) {
184 initialized = false;
185 initializeContent();
186 }
187
188 private void initializeComponents() {
189 setLayout(new GridLayout());
190
191 Label label = new Label(this, SWT.NONE);
192 label.setText("UID property name (leave empty if you don't want this feature):");
193
194 uid = new Text(this, SWT.BORDER);
195 uid.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
196
197 label = new Label(this, SWT.NONE);
198 label.setText("As3TypeFactory class:");
199
200 as3TypeFactory = new Text(this, SWT.BORDER);
201 as3TypeFactory.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
202
203 label = new Label(this, SWT.NONE);
204 label.setText("EntityFactory class:");
205
206 entityFactory = new Text(this, SWT.BORDER);
207 entityFactory.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
208
209 label = new Label(this, SWT.NONE);
210 label.setText("RemoteDestinationFactory class:");
211
212 remoteDestinationFactory = new Text(this, SWT.BORDER);
213 remoteDestinationFactory.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
214
215 label = new Label(this, SWT.NONE);
216 label.setText("Transformer class:");
217
218 transformer = new Text(this, SWT.BORDER);
219 transformer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
220
221 label = new Label(this, SWT.NONE);
222 label.setText("Package translators:");
223
224 Composite translatorsComposite = new Composite(this, SWT.BORDER);
225 translatorsComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
226 translatorsComposite.setLayout(new GridLayout(2, false));
227
228 translators = new List(translatorsComposite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI);
229 translators.setLayoutData(new GridData(GridData.FILL_BOTH));
230
231 Composite translatorsCompositeButtons = new Composite(translatorsComposite, SWT.NONE);
232 translatorsCompositeButtons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
233 translatorsCompositeButtons.setLayout(new FillLayout(SWT.VERTICAL));
234
235 SWTUtil.newButton(translatorsCompositeButtons, "Add Translator...", true, new SelectionAdapter() {
236 @Override
237 public void widgetSelected(SelectionEvent e) {
238 String[] values = Dialogs.addPackageTranslator(getDisplay().getActiveShell(), "Add Translator");
239 if (values != null && values.length == 2)
240 translators.add(StringUtil.join(values, TRANSLATOR_SEPARATOR));
241 }
242 });
243
244 final Button editTranslatorButton = SWTUtil.newButton(translatorsCompositeButtons, "Edit Translator...", false, new SelectionAdapter() {
245 @Override
246 public void widgetSelected(SelectionEvent e) {
247 int selectedIndex = translators.getSelectionIndex();
248 String selected = translators.getItem(selectedIndex);
249 String[] values = StringUtil.split(selected, TRANSLATOR_SEPARATOR);
250
251 values = Dialogs.editPackageTranslator(
252 getDisplay().getActiveShell(),
253 "Edit Translator",
254 (values.length > 0 ? values[0] : null),
255 (values.length > 1 ? values[1] : null)
256 );
257
258 if (values != null && values.length == 2)
259 translators.setItem(selectedIndex, StringUtil.join(values, TRANSLATOR_SEPARATOR));
260 }
261 });
262
263 final Button removeTranslatorButton = SWTUtil.newButton(translatorsCompositeButtons, "Remove Translators", false, new SelectionAdapter() {
264 @Override
265 public void widgetSelected(SelectionEvent e) {
266 if (translators.getSelectionCount() > 0)
267 translators.remove(translators.getSelectionIndices());
268 }
269 });
270
271 translators.addSelectionListener(new SelectionAdapter() {
272 @Override
273 public void widgetSelected(SelectionEvent e) {
274 editTranslatorButton.setEnabled(translators.getSelectionCount() == 1);
275 removeTranslatorButton.setEnabled(translators.getSelectionCount() > 0);
276 }
277 });
278
279 debugEnabled = new Button(this, SWT.CHECK);
280 debugEnabled.setText("Show debug information in console");
281
282 flexConfig = new Button(this, SWT.CHECK);
283 flexConfig.setText("Generate a Flex Builder configuration file");
284
285 externalizeLong = new Button(this, SWT.CHECK);
286 externalizeLong.setText("Use org.granite.math.Long");
287
288 externalizeBigInteger = new Button(this, SWT.CHECK);
289 externalizeBigInteger.setText("Use org.granite.math.BigInteger");
290
291 externalizeBigDecimal = new Button(this, SWT.CHECK);
292 externalizeBigDecimal.setText("Use org.granite.math.BigDecimal");
293
294 SWTUtil.newButton(this, "Reset to default values", true, new SelectionAdapter() {
295 @Override
296 public void widgetSelected(SelectionEvent e) {
297 Gas3 defaultGas3 = GraniteProperties.getDefaultProperties().getGas3();
298 uid.setText(defaultGas3.getUid());
299 as3TypeFactory.setText(defaultGas3.getAs3TypeFactory());
300 entityFactory.setText(defaultGas3.getEntityFactory());
301 remoteDestinationFactory.setText(defaultGas3.getRemoteDestinationFactory());
302 transformer.setText(defaultGas3.getTransformers().get(0).getType());
303 debugEnabled.setSelection(false);
304 flexConfig.setSelection(false);
305 externalizeLong.setSelection(false);
306 externalizeBigInteger.setSelection(false);
307 externalizeBigDecimal.setSelection(false);
308 }
309 });
310 }
311 }