| 1 | package de.uka.ipd.sdq.pcm.dialogs.datatype; |
| 2 | |
| 3 | import org.eclipse.jface.dialogs.IDialogConstants; |
| 4 | import org.eclipse.jface.dialogs.TitleAreaDialog; |
| 5 | import org.eclipse.swt.SWT; |
| 6 | import org.eclipse.swt.custom.StackLayout; |
| 7 | import org.eclipse.swt.events.ModifyEvent; |
| 8 | import org.eclipse.swt.events.ModifyListener; |
| 9 | import org.eclipse.swt.events.SelectionAdapter; |
| 10 | import org.eclipse.swt.events.SelectionEvent; |
| 11 | import org.eclipse.swt.graphics.Point; |
| 12 | import org.eclipse.swt.layout.FormLayout; |
| 13 | import org.eclipse.swt.layout.GridData; |
| 14 | import org.eclipse.swt.layout.GridLayout; |
| 15 | import org.eclipse.swt.widgets.Button; |
| 16 | import org.eclipse.swt.widgets.Combo; |
| 17 | import org.eclipse.swt.widgets.Composite; |
| 18 | import org.eclipse.swt.widgets.Control; |
| 19 | import org.eclipse.swt.widgets.Group; |
| 20 | import org.eclipse.swt.widgets.Label; |
| 21 | import org.eclipse.swt.widgets.Shell; |
| 22 | import org.eclipse.swt.widgets.Text; |
| 23 | |
| 24 | import de.uka.ipd.sdq.pcm.dialogs.Messages; |
| 25 | |
| 26 | /** |
| 27 | * The dialogue is used in the PCM Bench for the production by Collection or |
| 28 | * Composite data types. |
| 29 | * |
| 30 | * @author Roman Andrej |
| 31 | */ |
| 32 | public abstract class DataTypeDialog extends TitleAreaDialog { |
| 33 | |
| 34 | /** Edited entity properties */ |
| 35 | private String entityName; |
| 36 | |
| 37 | /** |
| 38 | * help value define edit DataType (collectionSignator ,compositeSignator) |
| 39 | */ |
| 40 | private DataTypeEnum editeDataType; |
| 41 | |
| 42 | private Composite composite; |
| 43 | private Group compositeGroup, collectionGroup; |
| 44 | private Button compositeButton; |
| 45 | private Button collectionButton; |
| 46 | private Label nameLabelField; |
| 47 | private Label typeLabelField; |
| 48 | private Text nameField, typeField; |
| 49 | private Button typeButton; |
| 50 | private StackLayout stackLayout; |
| 51 | private Combo combo; |
| 52 | private Shell shell; |
| 53 | |
| 54 | public DataTypeDialog(Shell parentShell) { |
| 55 | super(parentShell); |
| 56 | } |
| 57 | |
| 58 | /** |
| 59 | * The method is called with the editing of the type of DataType. |
| 60 | * |
| 61 | * @param repositoryName - |
| 62 | * the repository name of editing DataType |
| 63 | * @param entityName - |
| 64 | * the name of the editing DataType |
| 65 | * @param entityInnerType - |
| 66 | * the inner type of the editing DataType |
| 67 | */ |
| 68 | protected void init(DataTypeEnum dataTyp, String repositoryName, |
| 69 | String entityName, String entityInnerType) { |
| 70 | this.entityName = entityName; |
| 71 | this.editeDataType = dataTyp; |
| 72 | |
| 73 | setTitle(Messages.DataTypeDialog_EditTitle); |
| 74 | shell.setText(Messages.DataTypeDialog_ShellEditTitle); |
| 75 | |
| 76 | if (dataTyp == DataTypeEnum.COLLECTION) |
| 77 | setTopCollectionLayout(); |
| 78 | if (dataTyp == DataTypeEnum.COMPOSITE) |
| 79 | setTopCompositeLayout(); |
| 80 | |
| 81 | // Initialization the SWT elements with edit DataType attributes |
| 82 | combo.setText(repositoryName); |
| 83 | combo.setEnabled(false); |
| 84 | nameField.setText(entityName); |
| 85 | if (entityInnerType != null) |
| 86 | typeField.setText(entityInnerType); |
| 87 | |
| 88 | setEnabled(true); |
| 89 | setOKButtonDisabled(); |
| 90 | } |
| 91 | |
| 92 | /* (non-Javadoc) |
| 93 | * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) |
| 94 | */ |
| 95 | @Override |
| 96 | protected void configureShell(Shell newShell) { |
| 97 | super.configureShell(newShell); |
| 98 | shell = newShell; |
| 99 | newShell.setText(Messages.DataTypeDialog_ShellNewTitle); |
| 100 | } |
| 101 | |
| 102 | /* (non-Javadoc) |
| 103 | * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite) |
| 104 | */ |
| 105 | @Override |
| 106 | protected Control createDialogArea(Composite parent) { |
| 107 | |
| 108 | Composite area = (Composite) super.createDialogArea(parent); |
| 109 | final Composite container = new Composite(area, SWT.NONE); |
| 110 | container.setLayout(new GridLayout()); |
| 111 | container.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| 112 | |
| 113 | // Reposetory section |
| 114 | final Group reposetoryGroup = new Group(container, SWT.NONE); |
| 115 | reposetoryGroup.setText("Repository"); |
| 116 | reposetoryGroup.setLayoutData(new GridData(478, 30)); |
| 117 | reposetoryGroup.setLayout(new GridLayout()); |
| 118 | |
| 119 | combo = new Combo(reposetoryGroup, SWT.DROP_DOWN|SWT.READ_ONLY); |
| 120 | combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); |
| 121 | combo.addSelectionListener(new SelectionAdapter() { |
| 122 | |
| 123 | /* (non-Javadoc) |
| 124 | * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) |
| 125 | */ |
| 126 | @Override |
| 127 | public void widgetSelected(SelectionEvent e) { |
| 128 | setEditedResource(combo.getText()); |
| 129 | setEnabled(true); |
| 130 | validateInput(); |
| 131 | } |
| 132 | |
| 133 | /* (non-Javadoc) |
| 134 | * @see org.eclipse.swt.events.SelectionAdapter#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent) |
| 135 | */ |
| 136 | @Override |
| 137 | public void widgetDefaultSelected(SelectionEvent e) { |
| 138 | setEditedResource(combo.getText()); |
| 139 | setEnabled(true); |
| 140 | validateInput(); |
| 141 | } |
| 142 | }); |
| 143 | combo.setItems(getLoadedRepositories()); |
| 144 | |
| 145 | // RadioButtons section |
| 146 | final Group choiceTypeGroup = new Group(container, SWT.SHADOW_ETCHED_IN); |
| 147 | choiceTypeGroup.setText("Choose DataType"); |
| 148 | final GridLayout gridLayout = new GridLayout(); |
| 149 | gridLayout.numColumns = 2; |
| 150 | choiceTypeGroup.setLayout(gridLayout); |
| 151 | choiceTypeGroup.setLayoutData(new GridData(478, 74)); |
| 152 | |
| 153 | // Create new Composite |
| 154 | composite = new Composite(container, SWT.NONE); |
| 155 | stackLayout = new StackLayout(); |
| 156 | composite.setLayout(stackLayout); |
| 157 | composite.setLayoutData(new GridData(484, 139)); |
| 158 | |
| 159 | // Create CollyectionDataType button |
| 160 | collectionButton = new Button(choiceTypeGroup, SWT.RADIO); |
| 161 | collectionButton.setLayoutData(new GridData(129, SWT.DEFAULT)); |
| 162 | collectionButton.setText("CollectionDataType"); |
| 163 | collectionButton.addSelectionListener(new SelectionAdapter() { |
| 164 | @Override |
| 165 | public void widgetSelected(SelectionEvent e) { |
| 166 | setTopCollectionLayout(); |
| 167 | validateInput(); |
| 168 | } |
| 169 | }); |
| 170 | new Label(choiceTypeGroup, SWT.NONE); |
| 171 | |
| 172 | // Create CompositeDataType button |
| 173 | compositeButton = new Button(choiceTypeGroup, SWT.RADIO); |
| 174 | compositeButton.setText("CompositeDataType"); |
| 175 | compositeButton.addSelectionListener(new SelectionAdapter() { |
| 176 | @Override |
| 177 | public void widgetSelected(SelectionEvent e) { |
| 178 | setTopCompositeLayout(); |
| 179 | validateInput(); |
| 180 | } |
| 181 | }); |
| 182 | new Label(choiceTypeGroup, SWT.NONE); |
| 183 | |
| 184 | nameLabelField = new Label(choiceTypeGroup, SWT.NONE); |
| 185 | final GridData gridData = new GridData(SWT.RIGHT, SWT.CENTER, false, |
| 186 | false); |
| 187 | gridData.widthHint = 107; |
| 188 | nameLabelField.setLayoutData(gridData); |
| 189 | nameLabelField.setText("Name:"); |
| 190 | |
| 191 | nameField = new Text(choiceTypeGroup, SWT.BORDER); |
| 192 | final GridData gdNameField = new GridData(SWT.LEFT, SWT.CENTER, true, |
| 193 | false); |
| 194 | gdNameField.widthHint = 334; |
| 195 | nameField.setLayoutData(gdNameField); |
| 196 | nameField.addModifyListener(new ModifyListener() { |
| 197 | |
| 198 | /* (non-Javadoc) |
| 199 | * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) |
| 200 | */ |
| 201 | public void modifyText(ModifyEvent e) { |
| 202 | validateInput(); |
| 203 | } |
| 204 | }); |
| 205 | |
| 206 | // Create CompositeDataType Group with FormLayout |
| 207 | compositeGroup = new Group(composite, SWT.NONE); |
| 208 | compositeGroup.setLayout(new FormLayout()); |
| 209 | compositeGroup.setText("innerDeclaration CompositeDataType"); |
| 210 | |
| 211 | // Create inner section for CompositeDataType group |
| 212 | createInnerSectionCompositeGroup(compositeGroup); |
| 213 | |
| 214 | // Create CollectionDataType Group |
| 215 | collectionGroup = new Group(composite, SWT.NONE); |
| 216 | final GridLayout gridLayoutCollGroup = new GridLayout(); |
| 217 | gridLayoutCollGroup.numColumns = 3; |
| 218 | collectionGroup.setLayout(gridLayoutCollGroup); |
| 219 | collectionGroup.setText("innerType CollectionDataType"); |
| 220 | |
| 221 | // Create inner section for CollectionDataType group |
| 222 | typeLabelField = new Label(collectionGroup, SWT.NONE); |
| 223 | typeLabelField.setLayoutData(new GridData(40, SWT.DEFAULT)); |
| 224 | typeLabelField.setText("Type: "); |
| 225 | |
| 226 | typeField = new Text(collectionGroup, SWT.BORDER | SWT.SINGLE |
| 227 | | SWT.READ_ONLY); |
| 228 | typeField.setLayoutData(new GridData(200, 15)); |
| 229 | typeField.addModifyListener(new ModifyListener() { |
| 230 | public void modifyText(ModifyEvent e) { |
| 231 | validateInput(); |
| 232 | } |
| 233 | }); |
| 234 | |
| 235 | typeButton = new Button(collectionGroup, SWT.NONE); |
| 236 | typeButton.setLayoutData(new GridData(SWT.DEFAULT, 20)); |
| 237 | typeButton.setText("Select..."); |
| 238 | typeButton.addSelectionListener(new SelectionAdapter() { |
| 239 | @Override |
| 240 | public void widgetSelected(SelectionEvent e) { |
| 241 | typeField.setText(getSelectedInnerType(e)); |
| 242 | } |
| 243 | }); |
| 244 | |
| 245 | // Create Separator |
| 246 | final Label label = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL); |
| 247 | label.setLayoutData(new GridData(482, SWT.DEFAULT)); |
| 248 | |
| 249 | // set dialog default preferences |
| 250 | setTitle(Messages.DataTypeDialog_NewTitle); |
| 251 | setTopCollectionLayout(); |
| 252 | setEnabled(false); |
| 253 | |
| 254 | return container; |
| 255 | } |
| 256 | |
| 257 | /** |
| 258 | * Enables the receiver all component if the argument is true, and disables |
| 259 | * it otherwise. |
| 260 | * |
| 261 | * @param enabled |
| 262 | * the new enabled state |
| 263 | */ |
| 264 | public void setEnabled(boolean enabled) { |
| 265 | compositeButton.setEnabled(enabled); |
| 266 | collectionButton.setEnabled(enabled); |
| 267 | typeLabelField.setEnabled(enabled); |
| 268 | typeField.setEnabled(enabled); |
| 269 | typeButton.setEnabled(enabled); |
| 270 | nameLabelField.setEnabled(enabled); |
| 271 | nameField.setEnabled(enabled); |
| 272 | } |
| 273 | |
| 274 | /* (non-Javadoc) |
| 275 | * @see org.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize() |
| 276 | */ |
| 277 | @Override |
| 278 | protected Point getInitialSize() { |
| 279 | return new Point(500, 446); |
| 280 | } |
| 281 | |
| 282 | /* (non-Javadoc) |
| 283 | * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) |
| 284 | */ |
| 285 | @Override |
| 286 | protected void createButtonsForButtonBar(Composite parent) { |
| 287 | createButton(parent, IDialogConstants.CANCEL_ID, |
| 288 | IDialogConstants.CANCEL_LABEL, false); |
| 289 | createButton(parent, IDialogConstants.OK_ID, |
| 290 | IDialogConstants.OK_LABEL, false); |
| 291 | getButton(IDialogConstants.OK_ID).addSelectionListener(new SelectionAdapter() { |
| 292 | |
| 293 | /* (non-Javadoc) |
| 294 | * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) |
| 295 | */ |
| 296 | @Override |
| 297 | public void widgetSelected(SelectionEvent e) { |
| 298 | if (editeDataType == DataTypeEnum.COLLECTION) |
| 299 | createCollectionDataType(); |
| 300 | if (editeDataType == DataTypeEnum.COMPOSITE) |
| 301 | createCompositeDataType(); |
| 302 | } |
| 303 | }); |
| 304 | setOKButtonDisabled(); |
| 305 | } |
| 306 | |
| 307 | protected void setOKButtonEnabled() { |
| 308 | getButton(IDialogConstants.OK_ID).setEnabled(true); |
| 309 | } |
| 310 | |
| 311 | protected void setOKButtonDisabled() { |
| 312 | getButton(IDialogConstants.OK_ID).setEnabled(false); |
| 313 | } |
| 314 | |
| 315 | /** The method define the list with a loaded repository */ |
| 316 | public abstract String[] getLoadedRepositories(); |
| 317 | |
| 318 | /**The method create the editing area for CompositeDataType*/ |
| 319 | public abstract void createInnerSectionCompositeGroup(Composite group); |
| 320 | |
| 321 | public abstract String getSelectedInnerType(SelectionEvent event); |
| 322 | |
| 323 | public abstract void setEditedResource(String resource); |
| 324 | |
| 325 | /** The method create a new CollectionDataType */ |
| 326 | public abstract void createCollectionDataType(); |
| 327 | |
| 328 | /** The method create a new CompositeDataType */ |
| 329 | public abstract void createCompositeDataType(); |
| 330 | |
| 331 | public abstract boolean validateCompositeDataType(); |
| 332 | |
| 333 | protected String getEntityName() { |
| 334 | return entityName; |
| 335 | } |
| 336 | |
| 337 | /** |
| 338 | * The method specified in topControl is visible and all other controls are |
| 339 | * not visible. |
| 340 | */ |
| 341 | protected void setTopCompositeLayout() { |
| 342 | collectionButton.setSelection(false); |
| 343 | compositeButton.setSelection(true); |
| 344 | stackLayout.topControl = compositeGroup; |
| 345 | composite.layout(); |
| 346 | editeDataType = DataTypeEnum.COMPOSITE; |
| 347 | } |
| 348 | |
| 349 | protected void setTopCollectionLayout() { |
| 350 | compositeButton.setSelection(false); |
| 351 | collectionButton.setSelection(true); |
| 352 | stackLayout.topControl = collectionGroup; |
| 353 | composite.layout(); |
| 354 | editeDataType = DataTypeEnum.COLLECTION; |
| 355 | } |
| 356 | |
| 357 | /** |
| 358 | * The method examines whether the straight editing DataTYpe type has all parameters. |
| 359 | */ |
| 360 | public void validateInput() { |
| 361 | entityName = nameField.getText(); |
| 362 | |
| 363 | if (entityName.equals("")) { |
| 364 | setOKButtonDisabled(); |
| 365 | setErrorMessage(Messages.DataTypeDialog_ErrorMsgName); |
| 366 | return; |
| 367 | } |
| 368 | |
| 369 | if (collectionButton.getSelection() && typeField.getText().equals("")) { |
| 370 | setOKButtonDisabled(); |
| 371 | setErrorMessage(Messages.DataTypeDialog_ErrorMsgInner); |
| 372 | } else if (compositeButton.getSelection() |
| 373 | && !validateCompositeDataType()) { |
| 374 | setOKButtonDisabled(); |
| 375 | } else { |
| 376 | setErrorMessage(null); |
| 377 | setOKButtonEnabled(); |
| 378 | } |
| 379 | } |
| 380 | } |