View Javadoc

1   /*
2    * This file is a part of CAST project.
3    * (c) Copyright 2007, AGH University of Science & Technology
4    * https://caribou.iisg.agh.edu.pl/trac/cast
5    *
6    * Licensed under the Eclipse Public License, Version 1.0 (the "License").
7    * You may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    * http://www.eclipse.org/legal/epl-v10.html
10   */
11  /*
12   * File: TemplatesManagementComposite.java
13   * Created: 2009-09-17
14   * Author: kpietak
15   * $Id$
16   */
17  
18  package pl.edu.agh.cast.importer.wizard.template;
19  
20  import java.io.File;
21  import java.util.Collection;
22  import java.util.HashMap;
23  import java.util.Map;
24  
25  import org.eclipse.jface.viewers.ISelectionChangedListener;
26  import org.eclipse.jface.viewers.SelectionChangedEvent;
27  import org.eclipse.jface.viewers.TreeSelection;
28  import org.eclipse.jface.viewers.TreeViewer;
29  import org.eclipse.osgi.util.NLS;
30  import org.eclipse.swt.SWT;
31  import org.eclipse.swt.custom.ScrolledComposite;
32  import org.eclipse.swt.events.SelectionAdapter;
33  import org.eclipse.swt.events.SelectionEvent;
34  import org.eclipse.swt.graphics.Point;
35  import org.eclipse.swt.graphics.Rectangle;
36  import org.eclipse.swt.layout.FillLayout;
37  import org.eclipse.swt.layout.GridData;
38  import org.eclipse.swt.layout.GridLayout;
39  import org.eclipse.swt.widgets.Button;
40  import org.eclipse.swt.widgets.Composite;
41  import org.eclipse.swt.widgets.Display;
42  import org.eclipse.swt.widgets.FileDialog;
43  import org.eclipse.swt.widgets.Group;
44  import org.eclipse.swt.widgets.Label;
45  import org.eclipse.swt.widgets.Shell;
46  
47  import pl.edu.agh.cast.importer.base.template.IImportTemplate;
48  import pl.edu.agh.cast.importer.base.template.exception.TemplateException;
49  import pl.edu.agh.cast.importer.wizard.util.Messages;
50  import pl.edu.agh.cast.ui.util.IMsgBoxHelper;
51  import pl.edu.agh.cast.ui.util.MsgBoxHelper;
52  
53  /**
54   * Default implementation of {@link ITemplateManagementView}.
55   *
56   * @author AGH CAST Team
57   */
58  public class TemplatesManagementComposite extends Composite implements ITemplateManagementView,
59          ITemplateSelectionListener {
60  
61  	// BEGIN Composite Controls
62  
63  	private Group templatesGroup;
64  
65  	private TreeViewer templatesTreeViewer;
66  
67  	private Composite actionsComposite;
68  
69  	private Button importBtn;
70  
71  	private Button deleteBtn;
72  
73  	private Group detailsGroup;
74  
75  	private Button editBtn;
76  
77  	private Button addBtn;
78  
79  	private Button exportBtn;
80  
81  	// END Composite Controls
82  
83  	// BEGIN Buttons enable options
84  
85  	private boolean importBtnEnabled = true;
86  
87  	private ScrolledComposite scrolledComposite;
88  
89  	private Label descLbl;
90  
91  	private boolean deleteBtnEnabled = true;
92  
93  	private boolean editBtnEnabled;
94  
95  	private boolean addBtnEnabled;
96  
97  	private boolean exportBtnEnabled = true;
98  
99  	// END Buttons enable options
100 
101 	private TemplateManagementPresenter presenter;
102 
103 	private Map<ITemplateSelectionListener, ISelectionChangedListener> listenersMap;
104 
105 	private IMsgBoxHelper msgBoxHelper;
106 
107 	/**
108 	 * Auto-generated main method to display this org.eclipse.swt.widgets.Composite inside a new Shell.
109 	 */
110 	public static void main(String[] args) {
111 		showGUI();
112 	}
113 
114 	/**
115 	 * Auto-generated method to display this org.eclipse.swt.widgets.Composite inside a new Shell.
116 	 */
117 	public static void showGUI() {
118 		Display display = Display.getDefault();
119 		Shell shell = new Shell(display);
120 		TemplatesManagementComposite inst = new TemplatesManagementComposite(shell, SWT.NULL);
121 		Point size = new Point(600, 200); // inst.getSize();
122 		shell.setLayout(new FillLayout());
123 		shell.layout();
124 		if (size.x == 0 && size.y == 0) {
125 			inst.pack();
126 			shell.pack();
127 		} else {
128 			Rectangle shellBounds = shell.computeTrim(0, 0, size.x, size.y);
129 			shell.setSize(shellBounds.width, shellBounds.height);
130 		}
131 		shell.open();
132 		while (!shell.isDisposed()) {
133 			if (!display.readAndDispatch())
134 				display.sleep();
135 		}
136 	}
137 
138 	/**
139 	 * The default constructor.
140 	 *
141 	 * @param parent
142 	 *            parent composite
143 	 * @param style
144 	 *            STW style
145 	 */
146 	public TemplatesManagementComposite(Composite parent, int style) {
147 		super(parent, style);
148 		initGUI();
149 	}
150 
151 	private void initGUI() {
152 		GridLayout thisLayout = new GridLayout();
153 		thisLayout.numColumns = 2;
154 		this.setLayout(thisLayout);
155 
156 		templatesGroup = new Group(this, SWT.NONE);
157 		GridLayout templatesGroupLayout = new GridLayout();
158 		templatesGroupLayout.numColumns = 2;
159 		templatesGroup.setLayout(templatesGroupLayout);
160 		GridData templatesGroupLData = new GridData();
161 		templatesGroupLData.grabExcessHorizontalSpace = true;
162 		templatesGroupLData.grabExcessVerticalSpace = true;
163 		templatesGroupLData.horizontalAlignment = GridData.FILL;
164 		templatesGroupLData.verticalAlignment = GridData.FILL;
165 		templatesGroup.setLayoutData(templatesGroupLData);
166 		templatesGroup.setText(Messages.TemplatesManagementComposite_0);
167 
168 		GridData templatesTreeViewerLData = new GridData();
169 		templatesTreeViewerLData.grabExcessHorizontalSpace = true;
170 		templatesTreeViewerLData.grabExcessVerticalSpace = true;
171 		templatesTreeViewerLData.horizontalAlignment = GridData.FILL;
172 		templatesTreeViewerLData.verticalAlignment = GridData.FILL;
173 		templatesTreeViewer = new TreeViewer(templatesGroup, SWT.V_SCROLL | SWT.BORDER);
174 		templatesTreeViewer.getControl().setLayoutData(templatesTreeViewerLData);
175 		initTemplatesTreeViewer();
176 
177 		GridData actionsCompositeLData = new GridData();
178 		actionsCompositeLData.horizontalAlignment = GridData.END;
179 		actionsCompositeLData.verticalAlignment = GridData.FILL;
180 		actionsCompositeLData.grabExcessVerticalSpace = true;
181 		actionsCompositeLData.widthHint = 118;
182 		actionsComposite = new Composite(templatesGroup, SWT.NONE);
183 		GridLayout actionsCompositeLayout = new GridLayout();
184 		actionsCompositeLayout.makeColumnsEqualWidth = true;
185 		actionsCompositeLayout.marginHeight = 0;
186 		actionsComposite.setLayout(actionsCompositeLayout);
187 		actionsComposite.setLayoutData(actionsCompositeLData);
188 
189 		if (addBtnEnabled) {
190 			addBtn = new Button(actionsComposite, SWT.PUSH | SWT.CENTER);
191 			GridData addBtnLData = new GridData();
192 			addBtnLData.heightHint = 25;
193 			addBtnLData.grabExcessHorizontalSpace = true;
194 			addBtnLData.horizontalAlignment = GridData.FILL;
195 			addBtn.setLayoutData(addBtnLData);
196 			addBtn.setText(Messages.TemplatesManagementComposite_1);
197 		}
198 		if (editBtnEnabled) {
199 			editBtn = new Button(actionsComposite, SWT.PUSH | SWT.CENTER);
200 			GridData editBtnLData = new GridData();
201 			editBtnLData.heightHint = 25;
202 			editBtnLData.grabExcessHorizontalSpace = true;
203 			editBtnLData.horizontalAlignment = GridData.FILL;
204 			editBtn.setLayoutData(editBtnLData);
205 			editBtn.setText(Messages.TemplatesManagementComposite_2);
206 		}
207 
208 		if (deleteBtnEnabled) {
209 			deleteBtn = new Button(actionsComposite, SWT.PUSH | SWT.CENTER);
210 			GridData deleteBtnLData = new GridData();
211 			deleteBtnLData.heightHint = 25;
212 			deleteBtnLData.grabExcessHorizontalSpace = true;
213 			deleteBtnLData.horizontalAlignment = GridData.FILL;
214 			deleteBtn.setLayoutData(deleteBtnLData);
215 			deleteBtn.setText(Messages.TemplatesManagementComposite_3);
216 			deleteBtn.setEnabled(false); // as no template is selected
217 			deleteBtn.addSelectionListener(new SelectionAdapter() {
218 				@Override
219 				public void widgetSelected(SelectionEvent e) {
220 					presenter.handleRemoveTemplate();
221 				}
222 			});
223 		}
224 		if (importBtnEnabled) {
225 			importBtn = new Button(actionsComposite, SWT.PUSH | SWT.CENTER);
226 			GridData importBtnLData = new GridData();
227 			importBtnLData.heightHint = 25;
228 			importBtnLData.grabExcessHorizontalSpace = true;
229 			importBtnLData.horizontalAlignment = GridData.FILL;
230 			importBtn.setLayoutData(importBtnLData);
231 			importBtn.setText(Messages.TemplatesManagementComposite_4);
232 			importBtn.addSelectionListener(new SelectionAdapter() {
233 				@Override
234 				public void widgetSelected(SelectionEvent e) {
235 					handleImportTemplate();
236 				}
237 			});
238 		}
239 
240 		if (exportBtnEnabled) {
241 			exportBtn = new Button(actionsComposite, SWT.PUSH | SWT.CENTER);
242 			GridData exportBtnLData = new GridData();
243 			exportBtnLData.grabExcessHorizontalSpace = true;
244 			exportBtnLData.horizontalAlignment = GridData.FILL;
245 			exportBtn.setLayoutData(exportBtnLData);
246 			exportBtn.setText(Messages.TemplatesManagementComposite_5);
247 			exportBtn.setEnabled(false); // as no template is selected
248 			exportBtn.addSelectionListener(new SelectionAdapter() {
249 				@Override
250 				public void widgetSelected(SelectionEvent e) {
251 					handleExportTemplate();
252 				}
253 			});
254 		}
255 		detailsGroup = new Group(this, SWT.NONE);
256 		GridLayout detailsGroupLayout = new GridLayout();
257 		detailsGroupLayout.makeColumnsEqualWidth = true;
258 		detailsGroup.setLayout(detailsGroupLayout);
259 		GridData detailsGroupLData = new GridData();
260 		detailsGroupLData.horizontalAlignment = GridData.FILL;
261 		detailsGroupLData.verticalAlignment = GridData.FILL;
262 		detailsGroupLData.grabExcessHorizontalSpace = true;
263 		detailsGroupLData.grabExcessVerticalSpace = true;
264 		detailsGroup.setLayoutData(detailsGroupLData);
265 		detailsGroup.setText(Messages.TemplatesManagementComposite_6);
266 
267 		GridData scrolledComposite1LData = new GridData();
268 		scrolledComposite1LData.verticalAlignment = GridData.FILL;
269 		scrolledComposite1LData.horizontalAlignment = GridData.FILL;
270 		scrolledComposite1LData.grabExcessHorizontalSpace = true;
271 		scrolledComposite1LData.grabExcessVerticalSpace = true;
272 		scrolledComposite = new ScrolledComposite(detailsGroup, SWT.H_SCROLL | SWT.V_SCROLL);
273 		GridLayout scrolledComposite1Layout = new GridLayout();
274 		scrolledComposite1Layout.makeColumnsEqualWidth = true;
275 		scrolledComposite.setLayout(scrolledComposite1Layout);
276 		scrolledComposite.setLayoutData(scrolledComposite1LData);
277 		scrolledComposite.setEnabled(true);
278 		scrolledComposite.setExpandHorizontal(true);
279 		scrolledComposite.setExpandVertical(true);
280 		scrolledComposite.setShowFocusedControl(true);
281 
282 		descLbl = new Label(scrolledComposite, SWT.WRAP);
283 		scrolledComposite.setContent(descLbl);
284 		GridData descLblLData = new GridData();
285 		descLblLData.grabExcessHorizontalSpace = true;
286 		descLblLData.grabExcessVerticalSpace = true;
287 		descLblLData.horizontalAlignment = GridData.FILL;
288 		descLblLData.verticalAlignment = GridData.FILL;
289 		descLbl.setLayoutData(descLblLData);
290 
291 		this.layout();
292 		pack();
293 
294 		msgBoxHelper = MsgBoxHelper.createInstanceFor(this);
295 
296 	}
297 
298 	private void initTemplatesTreeViewer() {
299 		templatesTreeViewer.setContentProvider(new TemplatesTreeContentProvider());
300 		templatesTreeViewer.setLabelProvider(new TemplatesTreeLabelProvider());
301 		templatesTreeViewer.setAutoExpandLevel(2);
302 	}
303 
304 	/**
305 	 * Adds template selection listener.
306 	 *
307 	 * @param listener
308 	 *            the template selection listener
309 	 */
310 	public void addTemplateSelecionListener(final ITemplateSelectionListener listener) {
311 		if (listenersMap == null) {
312 			listenersMap = new HashMap<ITemplateSelectionListener, ISelectionChangedListener>();
313 		}
314 		if (listenersMap.containsKey(listener)) {
315 			return;
316 		}
317 
318 		ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() {
319 			@Override
320 			public void selectionChanged(SelectionChangedEvent event) {
321 				final TreeSelection selection = (TreeSelection)templatesTreeViewer.getSelection();
322 				IImportTemplate selectedTemplate;
323 				if (!selection.isEmpty() && selection.getFirstElement() instanceof TemplateTreeEntry) {
324 					selectedTemplate = ((TemplateTreeEntry)selection.getFirstElement()).getElement();
325 				} else {
326 					selectedTemplate = null;
327 				}
328 				listener.selectionChanged(selectedTemplate);
329 			}
330 		};
331 		templatesTreeViewer.addSelectionChangedListener(selectionChangedListener);
332 		listenersMap.put(listener, selectionChangedListener);
333 	}
334 
335 	/**
336 	 * {@inheritDoc}
337 	 *
338 	 * @see pl.edu.agh.cast.importer.wizard.template.ITemplateManagementView
339 	 *      #removeTemplateSelectionListener(pl.edu.agh.cast.importer.wizard.template.ITemplateSelectionListener)
340 	 */
341 	@Override
342 	public void removeTemplateSelectionListener(ITemplateSelectionListener listener) {
343 		if (listenersMap.containsKey(listener)) {
344 			templatesTreeViewer.removeSelectionChangedListener(listenersMap.get(listener));
345 			listenersMap.remove(listener);
346 		}
347 	}
348 
349 	/**
350 	 * {@inheritDoc}
351 	 *
352 	 * @see org.eclipse.swt.widgets.Control#setEnabled(boolean)
353 	 */
354 	@Override
355 	public void setEnabled(boolean enabled) {
356 		templatesGroup.setEnabled(enabled);
357 		templatesTreeViewer.getControl().setEnabled(enabled);
358 		detailsGroup.setEnabled(enabled);
359 		descLbl.setEnabled(enabled);
360 		if (addBtnEnabled) {
361 			addBtn.setEnabled(enabled);
362 		}
363 		if (editBtnEnabled) {
364 			editBtn.setEnabled(enabled);
365 		}
366 		if (deleteBtnEnabled) {
367 			deleteBtn.setEnabled(enabled);
368 		}
369 		if (importBtnEnabled) {
370 			importBtn.setEnabled(enabled);
371 		}
372 		if (exportBtnEnabled) {
373 			exportBtn.setEnabled(enabled);
374 		}
375 
376 		updateButtonsEnabled(presenter.getSelectedTemplate());
377 		updateDescriptionLabel(presenter.getSelectedTemplate());
378 		super.setEnabled(enabled);
379 
380 	}
381 
382 	/**
383 	 * {@inheritDoc}
384 	 *
385 	 * @see pl.edu.agh.cast.importer.wizard.template.ITemplateManagementView#setInput(java.util.List)
386 	 */
387 	@Override
388 	public void setInput(Collection<TemplateGroupTreeEntry> groups) {
389 		templatesTreeViewer.setInput(groups);
390 
391 	}
392 
393 	/**
394 	 * {@inheritDoc}
395 	 *
396 	 * @see pl.edu.agh.cast.importer.wizard.template.ITemplateManagementView#
397 	 *      initialize(pl.edu.agh.cast.importer.wizard.template.TemplateManagementPresenter)
398 	 */
399 	@Override
400 	public void initialize(TemplateManagementPresenter templatePresenter) {
401 		this.presenter = templatePresenter;
402 		addTemplateSelecionListener(this);
403 	}
404 
405 	/**
406 	 *
407 	 * {@inheritDoc}
408 	 *
409 	 * @see org.eclipse.swt.widgets.Widget#dispose()
410 	 */
411 	@Override
412 	public void dispose() {
413 		removeTemplateSelectionListener(this);
414 		super.dispose();
415 	}
416 
417 	private void handleImportTemplate() {
418 		// open file
419 		FileDialog openDialog = new FileDialog(getShell(), SWT.OPEN);
420 		openDialog.setFilterExtensions(new String[] { "*." + IImportTemplate.TEMPLATE_FILE_EXTENSION, "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$
421 		openDialog.setFilterNames(new String[] {
422 		        NLS.bind(Messages.TemplatesManagementComposite_15, IImportTemplate.TEMPLATE_FILE_EXTENSION),
423 		        Messages.TemplatesManagementComposite_21 });
424 		openDialog.setText(Messages.TemplatesManagementComposite_16);
425 
426 		String path = openDialog.open();
427 		if (path == null) {
428 			return;
429 		}
430 		File file = new File(path);
431 		try {
432 			IImportTemplate template = presenter.handleImportTemplate(file, msgBoxHelper);
433 			if (template != null) {
434 				msgBoxHelper.showInfoBox(Messages.TemplatesManagementComposite_17, NLS.bind(
435 				        Messages.TemplatesManagementComposite_18, template.getName()));
436 			}
437 		} catch (TemplateException e) {
438 			msgBoxHelper.showErrorBox(Messages.TemplatesManagementComposite_19, e.getMessage());
439 		}
440 	}
441 
442 	private void handleExportTemplate() {
443 		IImportTemplate template = presenter.getSelectedTemplate();
444 		if (template != null) {
445 			// choose destination file
446 			FileDialog saveDialog = new FileDialog(getShell(), SWT.SAVE);
447 			saveDialog.setFilterExtensions(new String[] { "*." + IImportTemplate.TEMPLATE_FILE_EXTENSION }); //$NON-NLS-1$
448 			saveDialog.setFilterNames(new String[] { NLS.bind(Messages.TemplatesManagementComposite_15,
449 			        IImportTemplate.TEMPLATE_FILE_EXTENSION) });
450 			saveDialog.setText(Messages.TemplatesManagementComposite_14);
451 			saveDialog.setFileName(template.getName());
452 			String path = saveDialog.open();
453 			if (path == null) {
454 				return;
455 			}
456 			File file = new File(path);
457 			presenter.handleExportTemplate(file, msgBoxHelper);
458 		}
459 	}
460 
461 	/**
462 	 * {@inheritDoc}
463 	 *
464 	 * @see pl.edu.agh.cast.importer.wizard.template.ITemplateManagementView
465 	 *      #showCannotRemoveTemplateError(pl.edu.agh.cast.importer.base.template.IImportTemplate,
466 	 *      pl.edu.agh.cast.importer.base.template.exception.TemplateException)
467 	 */
468 	@Override
469 	public void showCannotRemoveTemplateError(IImportTemplate template, TemplateException e) {
470 		String msg = null;
471 		if (template == null || template.getName() == null) {
472 			msg = Messages.TemplatesManagementComposite_7;
473 		} else {
474 			msg = NLS.bind(Messages.TemplatesManagementComposite_8, template.getName());
475 		}
476 		msgBoxHelper.showErrorBox(Messages.TemplatesManagementComposite_9, msg);
477 	}
478 
479 	/**
480 	 * {@inheritDoc}
481 	 *
482 	 * @see pl.edu.agh.cast.importer.wizard.template.ITemplateManagementView#showNoTemplateSelectedInfo()
483 	 */
484 	@Override
485 	public void showNoTemplateSelectedInfo() {
486 		msgBoxHelper.showInfoBox(Messages.TemplatesManagementComposite_10, Messages.TemplatesManagementComposite_11);
487 
488 	}
489 
490 	/**
491 	 * {@inheritDoc}
492 	 *
493 	 * @see pl.edu.agh.cast.importer.wizard.template.ITemplateManagementView
494 	 *      #showRemoveTemplateConfirmationQuestion(pl.edu.agh.cast.importer.base.template.IImportTemplate)
495 	 */
496 	@Override
497 	public int showRemoveTemplateConfirmationQuestion(IImportTemplate template) {
498 		assert template != null;
499 		return msgBoxHelper.showQuestionBox(Messages.TemplatesManagementComposite_12, NLS.bind(
500 		        Messages.TemplatesManagementComposite_13, template.getName()));
501 	}
502 
503 	/**
504 	 *
505 	 * {@inheritDoc}
506 	 *
507 	 * @see pl.edu.agh.cast.importer.wizard.template.ITemplateSelectionListener
508 	 *      #selectionChanged(pl.edu.agh.cast.importer.base.template.IImportTemplate)
509 	 */
510 	@Override
511 	public void selectionChanged(IImportTemplate selected) {
512 		updateButtonsEnabled(selected);
513 		updateDescriptionLabel(selected);
514 	}
515 
516 	private void updateButtonsEnabled(IImportTemplate selected) {
517 		boolean enabled = selected != null;
518 		if (deleteBtnEnabled) {
519 			deleteBtn.setEnabled(enabled);
520 		}
521 		if (exportBtnEnabled) {
522 			exportBtn.setEnabled(enabled);
523 		}
524 	}
525 
526 	private void updateDescriptionLabel(IImportTemplate selected) {
527 		String text = null;
528 		if (selected != null) {
529 			StringBuilder builder = new StringBuilder();
530 			builder.append(Messages.TemplatesManagementComposite_20);
531 			builder.append(selected.getName());
532 			builder.append(Messages.TemplatesManagementComposite_22);
533 			builder.append(selected.getDescription());
534 			text = builder.toString();
535 		} else {
536 			text = Messages.TemplatesManagementComposite_23;
537 		}
538 		descLbl.setText(text);
539 
540 		scrolledComposite.setMinSize(descLbl.computeSize(descLbl.getSize().x
541 		        - scrolledComposite.getVerticalBar().getSize().x, SWT.DEFAULT));
542 
543 	}
544 }