KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > emf > examples > jet > article2 > ui > NewTypesafeEnumCreationWizardPageInstances


1 package org.eclipse.emf.examples.jet.article2.ui;
2
3
4 import java.util.ArrayList JavaDoc;
5 import java.util.Iterator JavaDoc;
6 import java.util.List JavaDoc;
7
8 import org.eclipse.jface.dialogs.Dialog;
9 import org.eclipse.jface.viewers.CheckStateChangedEvent;
10 import org.eclipse.jface.viewers.CheckboxTableViewer;
11 import org.eclipse.jface.viewers.ColumnWeightData;
12 import org.eclipse.jface.viewers.DoubleClickEvent;
13 import org.eclipse.jface.viewers.ICheckStateListener;
14 import org.eclipse.jface.viewers.IDoubleClickListener;
15 import org.eclipse.jface.viewers.ISelectionChangedListener;
16 import org.eclipse.jface.viewers.IStructuredContentProvider;
17 import org.eclipse.jface.viewers.IStructuredSelection;
18 import org.eclipse.jface.viewers.ITableLabelProvider;
19 import org.eclipse.jface.viewers.LabelProvider;
20 import org.eclipse.jface.viewers.SelectionChangedEvent;
21 import org.eclipse.jface.viewers.StructuredSelection;
22 import org.eclipse.jface.viewers.TableLayout;
23 import org.eclipse.jface.viewers.Viewer;
24 import org.eclipse.jface.wizard.WizardPage;
25 import org.eclipse.swt.SWT;
26 import org.eclipse.swt.events.SelectionAdapter;
27 import org.eclipse.swt.events.SelectionEvent;
28 import org.eclipse.swt.graphics.Image;
29 import org.eclipse.swt.graphics.Rectangle;
30 import org.eclipse.swt.layout.GridData;
31 import org.eclipse.swt.layout.GridLayout;
32 import org.eclipse.swt.widgets.Button;
33 import org.eclipse.swt.widgets.Composite;
34 import org.eclipse.swt.widgets.Table;
35 import org.eclipse.swt.widgets.TableColumn;
36 import org.eclipse.swt.widgets.TableItem;
37
38 import org.eclipse.emf.examples.jet.article2.model.Attribute;
39 import org.eclipse.emf.examples.jet.article2.model.Instance;
40 import org.eclipse.emf.examples.jet.article2.model.NameUtil;
41 import org.eclipse.emf.examples.jet.article2.model.TypesafeEnum;
42
43
44
45 /**
46  * Wizard page where the user can specify the instances of the typesafe
47  * enumeration class, and the attribute values for each instance.
48  *
49  * @author Remko Popma
50  * @version $Revision: 1.1 $ ($Date: 2004/05/31 21:35:35 $)
51  */

52 public class NewTypesafeEnumCreationWizardPageInstances extends WizardPage
53 {
54
55   private final static String JavaDoc PAGE_NAME = "InstancesPage"; //$NON-NLS-1$
56

57   private String JavaDoc[] mColumnNames = new String JavaDoc []{
58     WizardMessages.getString("NewEnumWizPageInst.col.Default"),
59     WizardMessages.getString("NewEnumWizPageInst.col.Name"), };
60
61   private static final int COL_DEFAULT = 0;
62
63   private static final int COL_NAME = 1;
64
65   private int[] mColumnWidths = new int []{ 30, 400, };
66
67   private static final int TABLE_ROWS = 15; // show 15 rows
68

69   private boolean mIgnoreCheckEvents = false;
70
71   private CheckboxTableViewer mTableViewer = null;
72
73   private Table mTableWidget = null;
74
75   private Button mButtonAdd = null;
76
77   private Button mButtonEdit = null;
78
79   private Button mButtonRemove = null;
80
81   /**
82    * Helper class that provides content for the table widget.
83    */

84   protected class InstanceContentProvider implements IStructuredContentProvider
85   {
86     public Object JavaDoc[] getElements(Object JavaDoc inputElement)
87     {
88       List JavaDoc result = new ArrayList JavaDoc();
89       for (Iterator JavaDoc i = ((TypesafeEnum)inputElement).instances(); i.hasNext();)
90       {
91         result.add(i.next());
92       }
93       return result.toArray();
94     }
95
96     public void dispose()
97     {
98     }
99
100     public void inputChanged(Viewer viewer, Object JavaDoc oldInput, Object JavaDoc newInput)
101     {
102     }
103   }
104
105   /**
106    * Helper class that knows how to display a table widget row.
107    */

108   protected class InstanceLabelProvider extends LabelProvider implements ITableLabelProvider
109   {
110
111     public Image getColumnImage(Object JavaDoc element, int columnIndex)
112     {
113       return null;
114     }
115
116     public String JavaDoc getColumnText(Object JavaDoc element, int columnIndex)
117     {
118       if (element instanceof Instance)
119       {
120         Instance instance = (Instance)element;
121
122         switch (columnIndex)
123         {
124           case COL_DEFAULT:
125             mTableViewer.setChecked(instance, instance.isDefault());
126             return "";
127
128           case COL_NAME:
129             return instance.getName() == null ? "" : instance.getName();
130
131           default:
132             String JavaDoc property = mColumnNames[columnIndex];
133             String JavaDoc result = instance.getAttributeValue(property);
134             return (result == null) ? "" : result;
135         }
136       }
137       return "";
138     }
139   }
140
141   /**
142    * Constructs a new <code>NewTypesafeEnumCreationWizardPageInstances</code>.
143    */

144   public NewTypesafeEnumCreationWizardPageInstances()
145   {
146     super(PAGE_NAME);
147     setTitle(WizardMessages.getString("NewEnumWizPageInst.title")); //$NON-NLS-1$
148
setDescription(WizardMessages.getString("NewEnumWizPageInst.description")); //$NON-NLS-1$
149
}
150
151   /*
152    * (non-Javadoc)
153    *
154    * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
155    */

156   public void createControl(Composite parent)
157   {
158     initializeDialogUnits(parent);
159     Composite container = new Composite(parent, SWT.NONE);
160     GridLayout layout = new GridLayout();
161     layout.numColumns = 2;
162     container.setLayout(layout);
163
164     container.setLayoutData(new GridData(GridData.FILL_BOTH));
165
166     createTableWidget(container);
167     createButtonsPanel(container);
168
169     hookListeners();
170     updateEnabledState();
171     mButtonAdd.forceFocus();
172
173     setControl(container);
174     Dialog.applyDialogFont(container);
175     setPageComplete(false);
176   }
177
178   /**
179    * Registers listeners with the widgets.
180    */

181   private void hookListeners()
182   {
183     mTableViewer.addCheckStateListener(new ICheckStateListener()
184       {
185         public void checkStateChanged(CheckStateChangedEvent event)
186         {
187
188           if (mIgnoreCheckEvents)
189           {
190             return;
191           }
192
193           Object JavaDoc element = event.getElement();
194           if (element instanceof TableItem)
195           { // workaround for bug in older versions of Eclipse
196
element = ((TableItem)element).getData();
197           }
198           if (element instanceof Instance)
199           {
200             Instance instance = (Instance)element;
201             if (event.getChecked())
202             {
203               instance.setDefault();
204             }
205             else
206             {
207               instance.getType().setDefaultInstance(null);
208             }
209             syncTableCheckWithModel();
210             validatePage();
211           }
212         }
213       });
214     mTableViewer.addSelectionChangedListener(new ISelectionChangedListener()
215       {
216         public void selectionChanged(SelectionChangedEvent event)
217         {
218           updateEnabledState();
219         }
220       });
221     mTableViewer.addDoubleClickListener(new IDoubleClickListener()
222       {
223         public void doubleClick(DoubleClickEvent event)
224         {
225           handleEditPressed();
226
227         }
228       });
229
230     mButtonAdd.addSelectionListener(new SelectionAdapter()
231       {
232         public void widgetSelected(SelectionEvent e)
233         {
234           handleAddPressed();
235         }
236       });
237     mButtonEdit.addSelectionListener(new SelectionAdapter()
238       {
239         public void widgetSelected(SelectionEvent e)
240         {
241           handleEditPressed();
242         }
243       });
244     mButtonRemove.addSelectionListener(new SelectionAdapter()
245       {
246         public void widgetSelected(SelectionEvent e)
247         {
248           handleRemovePressed();
249         }
250       });
251   }
252
253   private void syncTableCheckWithModel()
254   {
255     mIgnoreCheckEvents = true;
256     for (Iterator JavaDoc i = getTypesafeEnumModel().instances(); i.hasNext();)
257     {
258       Instance inst = (Instance)i.next();
259       mTableViewer.setChecked(inst, inst.isDefault());
260     }
261     mIgnoreCheckEvents = false;
262   }
263
264   private void updateEnabledState()
265   {
266
267     mTableWidget.setEnabled(mTableWidget.getItemCount() > 0);
268
269     boolean enabled = (mTableWidget.getSelectionCount() > 0);
270     mButtonEdit.setEnabled(enabled);
271     mButtonRemove.setEnabled(enabled);
272   }
273
274   private void handleAddPressed()
275   {
276     EditInstanceDialog dialog = new EditInstanceDialog(getShell());
277     Instance instance = new Instance();
278     getTypesafeEnumModel().addInstance(instance); // or cannot setDefault...
279

280     dialog.setInstance(instance);
281     dialog.setAttributes(getTypesafeEnumModel().attributeArray());
282     dialog.setTitle(WizardMessages.getString("NewEnumWizPageInst.Add_Instance"));
283
284     int reply = dialog.open();
285     if (reply == EditAttributeDialog.OK)
286     {
287       mTableViewer.refresh();
288       mTableViewer.setSelection(new StructuredSelection(dialog.getInstance()));
289       syncTableCheckWithModel();
290     }
291     else
292     {
293       getTypesafeEnumModel().removeInstance(dialog.getInstance());
294       mTableViewer.refresh();
295     }
296     updateEnabledState();
297     validatePage();
298     mButtonAdd.forceFocus();
299   }
300
301   private void handleEditPressed()
302   {
303     Instance instance = getSelectedInstance();
304     if (instance == null)
305     {
306       return;
307     }
308
309     EditInstanceDialog dialog = new EditInstanceDialog(getShell());
310     dialog.setInstance(instance);
311     dialog.setAttributes(getTypesafeEnumModel().attributeArray());
312     dialog.setTitle(WizardMessages.getString("NewEnumWizPageInst.Edit_Instance"));
313
314     int reply = dialog.open();
315     mTableViewer.refresh();
316     mTableViewer.setSelection(new StructuredSelection(dialog.getInstance()));
317     syncTableCheckWithModel();
318     updateEnabledState();
319     validatePage();
320   }
321
322   private void handleRemovePressed()
323   {
324     Instance instance = getSelectedInstance();
325     if (instance == null)
326     {
327       return;
328     }
329     getTypesafeEnumModel().removeInstance(instance);
330     mTableViewer.refresh();
331     updateEnabledState();
332     validatePage();
333   }
334
335   private Instance getSelectedInstance()
336   {
337     IStructuredSelection selection = (IStructuredSelection)mTableViewer.getSelection();
338     if (selection.isEmpty())
339     {
340       return null;
341     }
342
343     Object JavaDoc element = selection.getFirstElement();
344     if (element instanceof TableItem)
345     { // workaround for bug in older versions of Eclipse
346
element = ((TableItem)element).getData();
347     }
348     Instance result = (Instance)element;
349     return result;
350   }
351
352   /**
353    * Create the button panel.
354    */

355   private void createButtonsPanel(Composite parent)
356   {
357     Composite panel = new Composite(parent, SWT.NONE);
358     GridLayout layout = new GridLayout();
359     layout.numColumns = 3;
360     panel.setLayout(layout);
361
362     mButtonAdd = new Button(panel, SWT.PUSH);
363     mButtonEdit = new Button(panel, SWT.PUSH);
364     mButtonRemove = new Button(panel, SWT.PUSH);
365
366     mButtonAdd.setText(WizardMessages.getString("NewEnumWizPageAttr.button.Add"));
367     mButtonEdit.setText(WizardMessages.getString("NewEnumWizPageAttr.button.Edit"));
368     mButtonRemove.setText(WizardMessages.getString("NewEnumWizPageAttr.button.Remove"));
369   }
370
371   /**
372    * Create the table widget.
373    */

374   private void createTableWidget(Composite container)
375   {
376     mTableWidget = new Table(container, SWT.CHECK | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
377     mTableWidget.setHeaderVisible(true);
378     mTableWidget.setLinesVisible(true);
379
380     initTableLayoutData(TABLE_ROWS);
381     initTableColumns();
382
383     mTableWidget.pack();
384
385     mTableViewer = new CheckboxTableViewer(mTableWidget);
386     mTableViewer.setColumnProperties(mColumnNames); // must be same as
387
// TableColumn text
388

389     mTableViewer.setLabelProvider(new InstanceLabelProvider());
390     mTableViewer.setContentProvider(new InstanceContentProvider());
391     mTableViewer.setInput(getTypesafeEnumModel());
392   }
393
394   /**
395    * Recalculate the table height needed for the specified number of rows.
396    */

397   private void initTableLayoutData(int rows)
398   {
399     int listHeight = mTableWidget.getItemHeight() * rows;
400     Rectangle trim = mTableWidget.computeTrim(0, 0, 0, listHeight);
401     GridData tblGD = new GridData(GridData.FILL_BOTH);
402     tblGD.heightHint = trim.height;
403     tblGD.horizontalSpan = 2; // use both columns of grid
404
mTableWidget.setLayoutData(tblGD);
405   }
406
407   private void initTableColumns()
408   {
409     TableColumn[] existing = mTableWidget.getColumns();
410
411     // erase existing table column headers
412
for (int i = 0; i < existing.length; i++)
413     {
414       existing[i].setText("");
415     }
416
417     // add table columns if necessary
418
for (int i = existing.length; i < mColumnNames.length; i++)
419     {
420       new TableColumn(mTableWidget, SWT.NONE);
421     }
422
423     // set table column headers
424
for (int i = 0; i < mColumnNames.length; i++)
425     {
426       TableColumn column = mTableWidget.getColumn(i);
427       column.setText(mColumnNames[i]);
428     }
429
430     // set table column widths
431
TableLayout tableLayout = new TableLayout();
432     for (int i = 0; i < mColumnWidths.length; i++)
433     {
434       tableLayout.addColumnData(new ColumnWeightData(1, mColumnWidths[i], true));
435     }
436     mTableWidget.setLayout(tableLayout);
437   }
438
439   /**
440    * Validates the attributes of the <code>TypesafeEnum</code>.
441    */

442   /* package */void validatePage()
443   {
444     TypesafeEnum type = getTypesafeEnumModel();
445     if (type.instanceCount() == 0)
446     {
447       setErrorMessage(WizardMessages.getString("NewEnumWizPageInst.Must_have_at_least_one_instance"));
448       setPageComplete(false);
449       return;
450     }
451     for (Iterator JavaDoc i = type.instances(); i.hasNext();)
452     {
453       Instance instance = (Instance)i.next();
454       if (instance.getName().length() == 0)
455       {
456         setErrorMessage(WizardMessages.getString("NewEnumWizPageInst.Every_instance_must_have_a_name"));
457         setPageComplete(false);
458         return;
459       }
460       if (!NameUtil.isValidIdentifier(instance.getName()))
461       {
462         setErrorMessage(WizardMessages.getFormattedString("NewEnumWizPageInst.invalid_instance_name", instance.getName()));
463         setPageComplete(false);
464         return;
465       }
466       for (Iterator JavaDoc attributes = type.attributes(); attributes.hasNext();)
467       {
468         Attribute attribute = (Attribute)attributes.next();
469         String JavaDoc value = instance.getAttributeValue(attribute);
470         if (value == null || value.trim().length() == 0)
471         {
472           setErrorMessage(WizardMessages.getFormattedString(
473             "NewEnumWizPageInst.Instance_does_not_have_a_value_for_attribute",
474             new String JavaDoc []{ instance.getName(), attribute.getName() }));
475           setPageComplete(false);
476           return;
477         }
478       }
479     }
480     setErrorMessage(null);
481     setPageComplete(true);
482   }
483
484   /*
485    * Attributes may have changed. Re-initialize the table widget.
486    */

487   public void setVisible(boolean visible)
488   {
489     if (visible)
490     {
491       mapAttributesToTableModel();
492       mTableViewer.setInput(getTypesafeEnumModel());
493
494       getControl().pack(true); // redo layout
495
mTableViewer.refresh();
496     }
497     super.setVisible(visible);
498   }
499
500   /**
501    * Re-initializes the member variables containing the column names, column
502    * widths, and finally re-initializes the table widget.
503    */

504   private void mapAttributesToTableModel()
505   {
506     reinitColumnNames();
507     reinitColumnWidths();
508
509     initTableLayoutData(TABLE_ROWS);
510     initTableColumns();
511   }
512
513   private void reinitColumnNames()
514   {
515     mColumnNames = new String JavaDoc [2 + getTypesafeEnumModel().attributeCount()];
516     //System.out.println("Init Column names, length = " + mColumnNames.length);
517
int col = 0;
518     mColumnNames[col++] = WizardMessages.getString("NewEnumWizPageInst.col.Default");
519     mColumnNames[col++] = WizardMessages.getString("NewEnumWizPageInst.col.Name");
520     for (Iterator JavaDoc i = getTypesafeEnumModel().attributes(); i.hasNext();)
521     {
522       Attribute attribute = (Attribute)i.next();
523       mColumnNames[col++] = attribute.getName();
524       //System.out.println("colname[" + (col-1) + "] = " +
525
// attribute.getName());
526
}
527   }
528
529   private void reinitColumnWidths()
530   {
531     mColumnWidths = new int [2 + getTypesafeEnumModel().attributeCount()];
532     //System.out.println("Init Column widths, length = " +
533
// mColumnWidths.length);
534
mColumnWidths[0] = 30;
535     mColumnWidths[1] = 120;
536     for (int i = 2; i < mColumnWidths.length; i++)
537     {
538       mColumnWidths[i] = 250 / (mColumnWidths.length - 2);
539       //System.out.println("colwidth[" + i + "] = " + mColumnWidths[i]);
540
}
541   }
542
543   /**
544    * Returns the <code>TypesafeEnum</code> to edit.
545    *
546    * @return the <code>TypesafeEnum</code> to edit
547    */

548   public TypesafeEnum getTypesafeEnumModel()
549   {
550     return ((NewTypesafeEnumCreationWizardPageAttributes)getPreviousPage()).getTypesafeEnumModel();
551   }
552 }
Popular Tags