1 package org.eclipse.emf.examples.jet.article2.ui; 2 3 4 import java.util.ArrayList ; 5 import java.util.Iterator ; 6 import java.util.List ; 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 52 public class NewTypesafeEnumCreationWizardPageInstances extends WizardPage 53 { 54 55 private final static String PAGE_NAME = "InstancesPage"; 57 private String [] mColumnNames = new String []{ 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; 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 84 protected class InstanceContentProvider implements IStructuredContentProvider 85 { 86 public Object [] getElements(Object inputElement) 87 { 88 List result = new ArrayList (); 89 for (Iterator 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 oldInput, Object newInput) 101 { 102 } 103 } 104 105 108 protected class InstanceLabelProvider extends LabelProvider implements ITableLabelProvider 109 { 110 111 public Image getColumnImage(Object element, int columnIndex) 112 { 113 return null; 114 } 115 116 public String getColumnText(Object 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 property = mColumnNames[columnIndex]; 133 String result = instance.getAttributeValue(property); 134 return (result == null) ? "" : result; 135 } 136 } 137 return ""; 138 } 139 } 140 141 144 public NewTypesafeEnumCreationWizardPageInstances() 145 { 146 super(PAGE_NAME); 147 setTitle(WizardMessages.getString("NewEnumWizPageInst.title")); setDescription(WizardMessages.getString("NewEnumWizPageInst.description")); } 150 151 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 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 element = event.getElement(); 194 if (element instanceof TableItem) 195 { 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 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); 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 element = selection.getFirstElement(); 344 if (element instanceof TableItem) 345 { element = ((TableItem)element).getData(); 347 } 348 Instance result = (Instance)element; 349 return result; 350 } 351 352 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 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); 389 mTableViewer.setLabelProvider(new InstanceLabelProvider()); 390 mTableViewer.setContentProvider(new InstanceContentProvider()); 391 mTableViewer.setInput(getTypesafeEnumModel()); 392 } 393 394 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; mTableWidget.setLayoutData(tblGD); 405 } 406 407 private void initTableColumns() 408 { 409 TableColumn[] existing = mTableWidget.getColumns(); 410 411 for (int i = 0; i < existing.length; i++) 413 { 414 existing[i].setText(""); 415 } 416 417 for (int i = existing.length; i < mColumnNames.length; i++) 419 { 420 new TableColumn(mTableWidget, SWT.NONE); 421 } 422 423 for (int i = 0; i < mColumnNames.length; i++) 425 { 426 TableColumn column = mTableWidget.getColumn(i); 427 column.setText(mColumnNames[i]); 428 } 429 430 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 442 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 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 attributes = type.attributes(); attributes.hasNext();) 467 { 468 Attribute attribute = (Attribute)attributes.next(); 469 String 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 []{ instance.getName(), attribute.getName() })); 475 setPageComplete(false); 476 return; 477 } 478 } 479 } 480 setErrorMessage(null); 481 setPageComplete(true); 482 } 483 484 487 public void setVisible(boolean visible) 488 { 489 if (visible) 490 { 491 mapAttributesToTableModel(); 492 mTableViewer.setInput(getTypesafeEnumModel()); 493 494 getControl().pack(true); mTableViewer.refresh(); 496 } 497 super.setVisible(visible); 498 } 499 500 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 [2 + getTypesafeEnumModel().attributeCount()]; 516 int col = 0; 518 mColumnNames[col++] = WizardMessages.getString("NewEnumWizPageInst.col.Default"); 519 mColumnNames[col++] = WizardMessages.getString("NewEnumWizPageInst.col.Name"); 520 for (Iterator i = getTypesafeEnumModel().attributes(); i.hasNext();) 521 { 522 Attribute attribute = (Attribute)i.next(); 523 mColumnNames[col++] = attribute.getName(); 524 } 527 } 528 529 private void reinitColumnWidths() 530 { 531 mColumnWidths = new int [2 + getTypesafeEnumModel().attributeCount()]; 532 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 } 541 } 542 543 548 public TypesafeEnum getTypesafeEnumModel() 549 { 550 return ((NewTypesafeEnumCreationWizardPageAttributes)getPreviousPage()).getTypesafeEnumModel(); 551 } 552 } | Popular Tags |