Skip to content

Package: PreviewView$3

PreviewView$3

nameinstructionbranchcomplexitylinemethod
run()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
{...}
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2014 EclipseSource Muenchen GmbH and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Alexandra Buzila- initial API and implementation
13: * Clemens Elflein - changed for new ViewModelEditor
14: ******************************************************************************/
15:
16: package org.eclipse.emf.ecp.view.model.internal.preview.e3.views;
17:
18: import java.io.IOException;
19: import java.io.PrintWriter;
20: import java.io.StringWriter;
21: import java.util.ArrayList;
22: import java.util.Collections;
23: import java.util.LinkedHashSet;
24: import java.util.List;
25: import java.util.Set;
26:
27: import org.eclipse.core.runtime.IPath;
28: import org.eclipse.core.runtime.IStatus;
29: import org.eclipse.core.runtime.MultiStatus;
30: import org.eclipse.core.runtime.Status;
31: import org.eclipse.emf.common.command.BasicCommandStack;
32: import org.eclipse.emf.common.notify.Adapter;
33: import org.eclipse.emf.common.notify.AdapterFactory;
34: import org.eclipse.emf.common.notify.Notification;
35: import org.eclipse.emf.common.util.URI;
36: import org.eclipse.emf.ecore.EObject;
37: import org.eclipse.emf.ecore.EStructuralFeature;
38: import org.eclipse.emf.ecore.resource.Resource;
39: import org.eclipse.emf.ecore.resource.ResourceSet;
40: import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
41: import org.eclipse.emf.ecore.util.EContentAdapter;
42: import org.eclipse.emf.ecore.xmi.XMLResource;
43: import org.eclipse.emf.ecp.ide.editor.view.ViewEditorPart;
44: import org.eclipse.emf.ecp.view.model.common.edit.provider.CustomReflectiveItemProviderAdapterFactory;
45: import org.eclipse.emf.ecp.view.model.internal.preview.Activator;
46: import org.eclipse.emf.ecp.view.model.internal.preview.ManageAdditionalViewsDialog;
47: import org.eclipse.emf.ecp.view.model.internal.preview.Messages;
48: import org.eclipse.emf.ecp.view.model.preview.common.Preview;
49: import org.eclipse.emf.ecp.view.model.preview.common.PreviewWorkspaceViewProvider;
50: import org.eclipse.emf.ecp.view.spi.model.VView;
51: import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
52: import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
53: import org.eclipse.emfforms.internal.editor.viewmodel.ViewModelEditor;
54: import org.eclipse.jface.action.Action;
55: import org.eclipse.jface.action.IAction;
56: import org.eclipse.jface.action.IToolBarManager;
57: import org.eclipse.jface.action.Separator;
58: import org.eclipse.jface.action.ToolBarManager;
59: import org.eclipse.jface.dialogs.ErrorDialog;
60: import org.eclipse.jface.dialogs.MessageDialog;
61: import org.eclipse.jface.layout.GridDataFactory;
62: import org.eclipse.jface.layout.GridLayoutFactory;
63: import org.eclipse.jface.resource.ImageDescriptor;
64: import org.eclipse.jface.viewers.ISelection;
65: import org.eclipse.jface.viewers.IStructuredSelection;
66: import org.eclipse.jface.window.Window;
67: import org.eclipse.swt.SWT;
68: import org.eclipse.swt.custom.ScrolledComposite;
69: import org.eclipse.swt.events.ControlEvent;
70: import org.eclipse.swt.events.ControlListener;
71: import org.eclipse.swt.events.PaintEvent;
72: import org.eclipse.swt.events.PaintListener;
73: import org.eclipse.swt.graphics.Color;
74: import org.eclipse.swt.graphics.Font;
75: import org.eclipse.swt.graphics.Image;
76: import org.eclipse.swt.graphics.Point;
77: import org.eclipse.swt.graphics.RGB;
78: import org.eclipse.swt.layout.FormAttachment;
79: import org.eclipse.swt.layout.FormData;
80: import org.eclipse.swt.layout.FormLayout;
81: import org.eclipse.swt.layout.GridLayout;
82: import org.eclipse.swt.widgets.Composite;
83: import org.eclipse.swt.widgets.FileDialog;
84: import org.eclipse.swt.widgets.Label;
85: import org.eclipse.swt.widgets.ToolBar;
86: import org.eclipse.ui.IEditorPart;
87: import org.eclipse.ui.IEditorReference;
88: import org.eclipse.ui.IPartListener2;
89: import org.eclipse.ui.ISelectionListener;
90: import org.eclipse.ui.IWorkbench;
91: import org.eclipse.ui.IWorkbenchPage;
92: import org.eclipse.ui.IWorkbenchPart;
93: import org.eclipse.ui.IWorkbenchPartReference;
94: import org.eclipse.ui.IWorkbenchWindow;
95: import org.eclipse.ui.PlatformUI;
96: import org.eclipse.ui.part.ViewPart;
97: import org.osgi.framework.BundleContext;
98: import org.osgi.framework.FrameworkUtil;
99: import org.osgi.framework.ServiceReference;
100:
101: /** The {@link ViewPart} containing a rendered version a {@link VView}. */
102: public class PreviewView extends ViewPart implements ISelectionListener {
103:
104:         /**
105:          * @author Jonas
106:          *
107:          */
108:         private final class PreviewPaintListener implements PaintListener {
109:                 @Override
110:                 public void paintControl(PaintEvent e) {
111:                         // super.paintControl(e);
112:                         final Point point = container.computeSize(SWT.DEFAULT, SWT.DEFAULT);
113:                         scrolledComposite.setMinSize(point);
114:                         container.layout(true);
115:                         scrolledComposite.layout(true);
116:
117:                 }
118:         }
119:
120:         /**
121:          * @author Clemens Elflein
122:          *
123:          */
124:         private final class PreviewPartListener implements IPartListener2 {
125:                 @Override
126:                 public void partActivated(IWorkbenchPartReference partRef) {
127:                         if (ViewEditorPart.class.isInstance(partRef.getPart(true))) {
128:                                 final ViewEditorPart part = (ViewEditorPart) partRef.getPart(true);
129:                                 if (part.getView() != view) {
130:                                         setView(part.getView());
131:                                         sampleData = null;
132:                                         render(view);
133:                                 }
134:                                 if (updateAutomatic) {
135:                                         preView.registerForViewModelChanges();
136:                                 }
137:                         } else if (NEW_EDITOR_CONSTANT
138:                                 .equals(partRef.getPart(true) != null ? partRef.getPart(true).getClass().getName() : "")) { //$NON-NLS-1$
139:                                 final ViewModelEditor part = (ViewModelEditor) partRef.getPart(true);
140:                                 if (part.getView() != view) {
141:                                         setView(part.getView());
142:                                         sampleData = null;
143:                                         render(view);
144:                                 }
145:                                 if (updateAutomatic) {
146:                                         preView.registerForViewModelChanges();
147:                                 }
148:                         }
149:                 }
150:
151:                 @Override
152:                 public void partClosed(IWorkbenchPartReference partRef) {
153:                         if (PreviewView.class.isInstance(partRef.getPart(true))) {
154:
155:                                 getSite().getPage().removePartListener(this);
156:                         }
157:
158:                         if (ViewEditorPart.class.isInstance(partRef.getPart(true))) {
159:                                 if (updateAutomatic) {
160:                                         preView.clear();
161:                                 }
162:                                 preView.removeView();
163:                                 view = null;
164:                         } else if (NEW_EDITOR_CONSTANT
165:                                 .equals(partRef.getPart(true) != null ? partRef.getPart(true).getClass().getName() : "")) { //$NON-NLS-1$
166:                                 if (updateAutomatic) {
167:                                         preView.clear();
168:                                 }
169:                                 preView.removeView();
170:                                 view = null;
171:                         }
172:
173:                 }
174:
175:                 @Override
176:                 public void partDeactivated(IWorkbenchPartReference partRef) {
177:                         final IWorkbenchPart part = partRef.getPart(true);
178:                         if (ViewEditorPart.class.isInstance(part) || PreviewView.class.isInstance(part)) {
179:                                 removeAdapters();
180:                         } else if (NEW_EDITOR_CONSTANT
181:                                 .equals(partRef.getPart(true) != null ? partRef.getPart(true).getClass().getName() : "") //$NON-NLS-1$
182:                                 || PreviewView.class.isInstance(part)) {
183:                                 removeAdapters();
184:                         }
185:                 }
186:
187:                 @Override
188:                 public void partOpened(IWorkbenchPartReference partRef) {
189:                 }
190:
191:                 @Override
192:                 public void partHidden(IWorkbenchPartReference partRef) {
193:                 }
194:
195:                 @Override
196:                 public void partVisible(IWorkbenchPartReference partRef) {
197:                 }
198:
199:                 @Override
200:                 public void partInputChanged(IWorkbenchPartReference partRef) {
201:                 }
202:
203:                 @Override
204:                 public void partBroughtToTop(IWorkbenchPartReference partRef) {
205:                 }
206:         }
207:
208:         /**
209:          * The qualified name of the new editor. Currently needed to keep an optional dependency on the new editor.
210:          * TODO remove again
211:          */
212:         private static final String NEW_EDITOR_CONSTANT = "org.eclipse.emfforms.internal.editor.viewmodel.ViewModelEditor";//$NON-NLS-1$
213:
214:         private Preview preView;
215:         private IPartListener2 partListener;
216:         private Composite form;
217:         private EContentAdapter adapter;
218:         private VView view;
219:         private boolean updateAutomatic;
220:         private Composite parent;
221:         private Action automaticToggleButton, manualRefreshButton;
222:         private Color headerBgColor;
223:         private Font titleFont;
224:         private Color titleColor;
225:         private ScrolledComposite scrolledComposite;
226:         private Composite container;
227:         private Action loadDataButton;
228:         private EObject sampleData;
229:         private Action cleanDataButton;
230:         private Action exportDataButton;
231:
232:         private final Set<IPath> knownViews = new LinkedHashSet<IPath>();
233:         private BundleContext bundleContext;
234:         private ServiceReference<PreviewWorkspaceViewProvider> previewViewProviderServiceRef;
235:         private PreviewWorkspaceViewProvider workspaceViewProvider;
236:
237:         /** The constructor. */
238:         public PreviewView() {
239:                 super();
240:                 // PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()
241:                 // .addSelectionListener("org.eclipse.emf.ecp.ui.ModelExplorerView", this); //$NON-NLS-1$
242:         }
243:
244:         @Override
245:         public void setFocus() {
246:         }
247:
248:         @Override
249:         public void dispose() {
250:                 super.dispose();
251:                 getSite().getPage().removePartListener(partListener);
252:                 preView.clear();
253:                 preView.removeAdapter();
254:                 titleColor.dispose();
255:                 titleFont.dispose();
256:                 headerBgColor.dispose();
257:                 for (final IPath path : knownViews) {
258:                         workspaceViewProvider.removeViewModel(path);
259:                 }
260:                 knownViews.clear();
261:                 workspaceViewProvider = null;
262:                 bundleContext.ungetService(previewViewProviderServiceRef);
263:         }
264:
265:         @Override
266:         public void createPartControl(Composite parent) {
267:                 this.parent = parent;
268:                 bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
269:                 previewViewProviderServiceRef = bundleContext.getServiceReference(PreviewWorkspaceViewProvider.class);
270:                 workspaceViewProvider = bundleContext.getService(previewViewProviderServiceRef);
271:
272:                 /* The container composite */
273:                 form = new Composite(parent, SWT.BORDER);
274:                 form.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
275:                 form.setLayout(GridLayoutFactory.fillDefaults().create());
276:
277:                 /* The header */
278:                 createHeader(parent);
279:
280:                 /* The body */
281:                 createBody(parent);
282:
283:                 /* The container */
284:                 container = new Composite(scrolledComposite, SWT.FILL);
285:                 final GridLayout containerLayout = GridLayoutFactory.fillDefaults().create();
286:                 containerLayout.marginLeft = 10;
287:                 containerLayout.marginRight = 10;
288:                 container.setLayout(containerLayout);
289:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(container);
290:                 container.setBackground(scrolledComposite.getBackground());
291:                 scrolledComposite.setContent(container);
292:                 container.addPaintListener(new PreviewPaintListener());
293:                 container.addControlListener(new ControlListener() {
294:
295:                         @Override
296:                         public void controlResized(ControlEvent e) {
297:                                 final Point point = container.computeSize(SWT.DEFAULT, SWT.DEFAULT);
298:                                 scrolledComposite.setMinSize(point);
299:                                 container.layout(true);
300:                                 scrolledComposite.layout(true);
301:
302:                         }
303:
304:                         @Override
305:                         public void controlMoved(ControlEvent e) {
306:                                 final Point point = container.computeSize(SWT.DEFAULT, SWT.DEFAULT);
307:                                 scrolledComposite.setMinSize(point);
308:                                 container.layout(true);
309:                                 scrolledComposite.layout(true);
310:                         }
311:                 });
312:
313:                 preView = new Preview(container);
314:
315:                 final IWorkbench wb = PlatformUI.getWorkbench();
316:                 final IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
317:                 final IWorkbenchPage page = win.getActivePage();
318:
319:                 for (final IEditorReference reference : PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
320:                         .getEditorReferences()) {
321:                         final IEditorPart part = reference.getEditor(false);
322:                         if (page.isPartVisible(part)) {
323:                                 if (ViewEditorPart.class.isInstance(part)) {
324:                                         final ViewEditorPart viewPart = (ViewEditorPart) part;
325:                                         setView(viewPart.getView());
326:                                         render(view);
327:                                 } else if (NEW_EDITOR_CONSTANT.equals(part != null ? part.getClass().getName() : "")) { //$NON-NLS-1$
328:                                         final ViewModelEditor viewPart = (ViewModelEditor) part;
329:                                         setView(viewPart.getView());
330:                                         render(view);
331:                                 }
332:                         }
333:                 }
334:
335:                 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditorReferences();
336:                 partListener = new PreviewPartListener();
337:                 getSite().getPage().addPartListener(partListener);
338:         }
339:
340:         private void createBody(Composite parent) {
341:                 scrolledComposite = new ScrolledComposite(form, SWT.V_SCROLL | SWT.H_SCROLL);
342:                 scrolledComposite.setShowFocusedControl(true);
343:                 scrolledComposite.setExpandVertical(true);
344:                 scrolledComposite.setExpandHorizontal(true);
345:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(scrolledComposite);
346:                 scrolledComposite.setLayout(GridLayoutFactory.fillDefaults().create());
347:                 scrolledComposite.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
348:         }
349:
350:         private void createHeader(Composite parent) {
351:                 final Composite headerComposite = new Composite(form, SWT.FILL);
352:                 final GridLayout headerLayout = GridLayoutFactory.fillDefaults().create();
353:                 headerComposite.setLayout(headerLayout);
354:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, false).applyTo(headerComposite);
355:                 headerBgColor = new Color(parent.getDisplay(), new RGB(220, 240, 247));
356:                 headerComposite.setBackground(headerBgColor);
357:
358:                 final Composite header = getPageHeader(headerComposite);
359:                 final ToolBar toolBar = new ToolBar(header, SWT.FLAT | SWT.RIGHT);
360:                 final FormData formData = new FormData();
361:                 formData.right = new FormAttachment(100, 0);
362:                 toolBar.setLayoutData(formData);
363:                 toolBar.layout();
364:                 final ToolBarManager toolBarManager = new ToolBarManager(toolBar);
365:                 addButtonsToFormToolbar(toolBarManager);
366:                 header.layout();
367:         }
368:
369:         /**
370:          * @param parent
371:          * @return
372:          */
373:         private Composite getPageHeader(Composite parent) {
374:                 final Composite header = new Composite(parent, SWT.FILL);
375:                 final FormLayout layout = new FormLayout();
376:                 layout.marginHeight = 5;
377:                 layout.marginWidth = 5;
378:                 header.setLayout(layout);
379:                 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, false).applyTo(header);
380:
381:                 header.setBackground(parent.getBackground());
382:
383:                 final Label titleImage = new Label(header, SWT.FILL);
384:                 final ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(Activator.getDefault()
385:                         .getBundle()
386:                         .getResource("icons/preview.png")); //$NON-NLS-1$
387:                 titleImage.setImage(new Image(parent.getDisplay(), imageDescriptor.getImageData()));
388:                 final FormData titleImageData = new FormData();
389:                 final int imageOffset = -titleImage.computeSize(SWT.DEFAULT, SWT.DEFAULT).y / 2;
390:                 titleImageData.top = new FormAttachment(50, imageOffset);
391:                 titleImageData.left = new FormAttachment(0, 10);
392:                 titleImage.setLayoutData(titleImageData);
393:
394:                 final Label title = new Label(header, SWT.WRAP);
395:                 title.setText(Messages.PreviewView_EditorTitle);
396:                 titleFont = new Font(title.getDisplay(), getDefaultFontName(title), 12, SWT.BOLD);
397:                 title.setFont(titleFont);
398:                 title.setForeground(getTitleColor());
399:                 final int titleHeight = title.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
400:                 final FormData titleData = new FormData();
401:                 titleData.left = new FormAttachment(titleImage, 5, SWT.DEFAULT);
402:                 titleData.top = new FormAttachment(50, -titleHeight / 2);
403:                 title.setLayoutData(titleData);
404:
405:                 return header;
406:         }
407:
408:         /**
409:          * @param control
410:          * @return
411:          */
412:         private String getDefaultFontName(Label control) {
413:                 return control.getDisplay().getSystemFont().getFontData()[0].getName();
414:         }
415:
416:         private Color getTitleColor() {
417:                 if (titleColor == null) {
418:                         titleColor = new Color(form.getDisplay(), new RGB(25, 76, 127));
419:                 }
420:                 return titleColor;
421:         }
422:
423:         /**
424:          * @param toolBarManager toolBarManager the toolbar manager to which the buttons should be added.
425:          */
426:         private void addButtonsToFormToolbar(IToolBarManager toolBarManager) {
427:
428:                 addSampleDataButtons(toolBarManager);
429:                 toolBarManager.add(new Separator());
430:                 addRefreshButtons(toolBarManager);
431:                 toolBarManager.add(new Separator());
432:                 additionalViewsButtons(toolBarManager);
433:                 toolBarManager.update(true);
434:         }
435:
436:         private void additionalViewsButtons(IToolBarManager toolBarManager) {
437:                 final Action manageAdditionalViews = new Action() {
438:                         @Override
439:                         public void run() {
440:                                 super.run();
441:                                 openAdditionalViewsDialog();
442:                         }
443:                 };
444:                 manageAdditionalViews.setText(Messages.PreviewView_AdditionalViews);
445:                 final String exportDataImagePath = "icons/manageViews.png";//$NON-NLS-1$
446:                 manageAdditionalViews.setImageDescriptor(ImageDescriptor.createFromURL(Activator.getDefault()
447:                         .getBundle().getResource(exportDataImagePath)));
448:                 toolBarManager.add(manageAdditionalViews);
449:         }
450:
451:         private void openAdditionalViewsDialog() {
452:                 final Set<IPath> input = new LinkedHashSet<IPath>(knownViews);
453:                 final ManageAdditionalViewsDialog d = new ManageAdditionalViewsDialog(getSite().getShell(), input);
454:                 final int result = d.open();
455:                 if (result == Window.OK) {
456:                         // add views
457:                         final Set<IPath> viewsToAdd = new LinkedHashSet<IPath>(input);
458:                         viewsToAdd.removeAll(knownViews);
459:                         for (final IPath path : viewsToAdd) {
460:                                 knownViews.add(path);
461:                                 workspaceViewProvider.addViewModel(path);
462:                         }
463:                         // remove views
464:                         final Set<IPath> viewsToRemove = new LinkedHashSet<IPath>(knownViews);
465:                         viewsToRemove.removeAll(input);
466:                         for (final IPath path : viewsToRemove) {
467:                                 knownViews.remove(path);
468:                                 workspaceViewProvider.removeViewModel(path);
469:                         }
470:
471:                         render();
472:                 }
473:
474:         }
475:
476:         /**
477:          * Adds the load, export and clear sample data buttons to the toolbar.
478:          *
479:          * @param toolBarManager the toolbar manager to which the buttons should be added.
480:          */
481:         private void addSampleDataButtons(IToolBarManager toolBarManager) {
482:                 // load sample data
483:                 loadDataButton = new Action() {
484:                         @Override
485:                         public void run() {
486:                                 super.run();
487:                                 loadSampleData();
488:                         }
489:                 };
490:                 final String loadDataImagePath = "icons/loadData.png";//$NON-NLS-1$
491:                 loadDataButton.setImageDescriptor(ImageDescriptor.createFromURL(Activator.getDefault()
492:                         .getBundle()
493:                         .getResource(loadDataImagePath)));
494:
495:                 loadDataButton.setText(Messages.PreviewView_ImportSampleDataButton);
496:                 loadDataButton.setEnabled(true);
497:
498:                 // export sample data
499:                 exportDataButton = new Action() {
500:                         @Override
501:                         public void run() {
502:                                 super.run();
503:                                 exportSampleData();
504:                         }
505:                 };
506:                 final String exportDataImagePath = "icons/exportData.png";//$NON-NLS-1$
507:                 exportDataButton.setImageDescriptor(ImageDescriptor.createFromURL(Activator.getDefault()
508:                         .getBundle()
509:                         .getResource(exportDataImagePath)));
510:
511:                 exportDataButton.setText(Messages.PreviewView_ExportSampleDataButton);
512:                 exportDataButton.setEnabled(true);
513:
514:                 // clean sample data
515:                 cleanDataButton = new Action() {
516:                         @Override
517:                         public void run() {
518:                                 super.run();
519:                                 sampleData = null;
520:                                 preView.cleanSampleData();
521:                                 render();
522:                         }
523:                 };
524:                 final String cleanDataImagePath = "icons/cleanData.png";//$NON-NLS-1$
525:                 cleanDataButton.setImageDescriptor(ImageDescriptor.createFromURL(Activator.getDefault()
526:                         .getBundle()
527:                         .getResource(cleanDataImagePath)));
528:                 cleanDataButton.setText(Messages.PreviewView_ClearSampleDataButton);
529:                 cleanDataButton.setEnabled(true);
530:
531:                 toolBarManager.add(cleanDataButton);
532:                 toolBarManager.add(loadDataButton);
533:                 toolBarManager.add(exportDataButton);
534:
535:         }
536:
537:         /**
538:          * Adds the automatic and manual refresh buttons to the toolbar.
539:          *
540:          * @param toolBarManager the toolbar manager to which the buttons should be added.
541:          *
542:          */
543:
544:         private void addRefreshButtons(IToolBarManager toolBarManager) {
545:                 // automatic refresh
546:                 automaticToggleButton = new Action("", IAction.AS_CHECK_BOX) { //$NON-NLS-1$
547:                         @Override
548:                         public void run() {
549:                                 super.run();
550:                                 setUpdateAutomatic(isChecked());
551:                                 manualRefreshButton.setEnabled(!isChecked());
552:                         }
553:                 };
554:
555:                 final String autoRefreshImagePath = "icons/arrow_rotate_anticlockwise.png";//$NON-NLS-1$
556:                 automaticToggleButton.setImageDescriptor(ImageDescriptor.createFromURL(Activator.getDefault()
557:                         .getBundle()
558:                         .getResource(autoRefreshImagePath)));
559:
560:                 automaticToggleButton.setText(Messages.PreviewView_AutomaticRefresh);
561:                 automaticToggleButton.setEnabled(true);
562:                 automaticToggleButton.setChecked(false);
563:
564:                 // manual refresh
565:                 manualRefreshButton = new Action() {
566:                         @Override
567:                         public void run() {
568:                                 super.run();
569:                                 render();
570:                         }
571:                 };
572:                 final String manualRefreshImagePath = "icons/arrow_refresh.png";//$NON-NLS-1$
573:                 manualRefreshButton.setImageDescriptor(ImageDescriptor.createFromURL(Activator.getDefault()
574:                         .getBundle()
575:                         .getResource(manualRefreshImagePath)));
576:
577:                 manualRefreshButton.setText(Messages.PreviewView_ManualRefresh);
578:                 manualRefreshButton.setEnabled(true);
579:
580:                 toolBarManager.add(manualRefreshButton);
581:                 toolBarManager.add(automaticToggleButton);
582:
583:         }
584:
585:         /**
586:          * Exports the data from the preview as an xmi file.
587:          */
588:         protected void exportSampleData() {
589:                 if (preView == null) {
590:                         return;
591:                 }
592:
593:                 final EObject sampleData = preView.getSampleData();
594:                 if (sampleData == null) {
595:                         return;
596:                 }
597:
598:                 final FileDialog dialog = new FileDialog(parent.getShell(), SWT.SAVE);
599:                 dialog.setFilterExtensions(new String[] { "*.xmi" }); //$NON-NLS-1$
600:                 final String result = dialog.open();
601:                 if (result == null) {
602:                         return;
603:                 }
604:                 final ResourceSet rs = new ResourceSetImpl();
605:                 final Resource resource = rs.createResource(URI.createFileURI(result));
606:                 resource.getContents().add(sampleData);
607:                 try {
608:                         resource.save(Collections.singletonMap(XMLResource.OPTION_ENCODING, "UTF-8")); //$NON-NLS-1$
609:                 } catch (final IOException e) {
610:
611:                         final StringWriter sw = new StringWriter();
612:                         e.printStackTrace(new PrintWriter(sw));
613:                         final String stackTrace = sw.toString();
614:
615:                         /*
616:                          * splitting stack trace into children statuses, such that each line in the message will show up on a new
617:                          * line in the details section of the error dialog
618:                          */
619:                         final List<Status> childStatuses = new ArrayList<Status>();
620:                         for (final String line : stackTrace.split(System.getProperty("line.separator"))) { //$NON-NLS-1$
621:                                 childStatuses.add(new Status(IStatus.ERROR, Activator.PLUGIN_ID, line));
622:                         }
623:                         final MultiStatus status = new MultiStatus(Activator.PLUGIN_ID, IStatus.ERROR,
624:                                 childStatuses.toArray(new Status[] {}),
625:                                 e.getLocalizedMessage(), null);
626:                         ErrorDialog.openError(parent.getShell(), Messages.PreviewView_SaveErrorDialogTitle,
627:                                 Messages.PreviewView_SaveErrorDescription, status);
628:
629:                 }
630:
631:         }
632:
633:         /**
634:          * Loads an xmi into the preview.
635:          */
636:         private void loadSampleData() {
637:
638:                 if (view == null || view.getRootEClass() == null) {
639:                         return;
640:                 }
641:                 final FileDialog dialog = new FileDialog(parent.getShell(), SWT.OPEN);
642:                 dialog.setFilterExtensions(new String[] { "*.xmi" }); //$NON-NLS-1$
643:                 final String result = dialog.open();
644:                 if (result == null) {
645:                         return;
646:                 }
647:                 final ResourceSet rs = new ResourceSetImpl();
648:                 final AdapterFactoryEditingDomain domain = new AdapterFactoryEditingDomain(
649:                         new ComposedAdapterFactory(new AdapterFactory[] {
650:                                 new CustomReflectiveItemProviderAdapterFactory(),
651:                                 new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE) }),
652:                         new BasicCommandStack(), rs);
653:                 rs.eAdapters().add(
654:                         new AdapterFactoryEditingDomain.EditingDomainProvider(domain));
655:                 final Resource resource = rs.createResource(URI.createFileURI(result));
656:
657:                 try {
658:                         resource.load(null);
659:                 } catch (final IOException ex) {
660:                         // do nothing - exceptions treated below
661:                 }
662:                 if (!resource.getContents().isEmpty()) {
663:                         sampleData = resource.getContents().get(0);
664:                         if (sampleData != null && sampleData.eClass() == view.getRootEClass()) {
665:                                 render();
666:                         } else {
667:                                 new MessageDialog(
668:                                         parent.getShell(),
669:                                         Messages.PreviewView_WrongInputTypeError,
670:                                         null,
671:                                         String.format(Messages.PreviewView_WrongInputTypeErrorDetails,
672:                                                 sampleData.eClass().getName(),
673:                                                 view.getRootEClass().getName()),
674:                                         MessageDialog.ERROR, new String[] { Messages.PreviewView_OK }, 0).open();
675:                                 sampleData = null;
676:                         }
677:                 } else {
678:                         sampleData = null;
679:                         new MessageDialog(
680:                                 parent.getShell(), Messages.PreviewView_WrongInputFileContentError,
681:                                 null, Messages.PreviewView_WrongInputFileContentErrorDetails,
682:                                 MessageDialog.ERROR, new String[] { Messages.PreviewView_OK }, 0).open();
683:                 }
684:
685:         }
686:
687:         /**
688:          * {@inheritDoc}
689:          */
690:         @Override
691:         public void selectionChanged(IWorkbenchPart part, ISelection selection) {
692:                 final IStructuredSelection ss = (IStructuredSelection) selection;
693:                 final Object firstElement = ss.getFirstElement();
694:                 if (!VView.class.isInstance(firstElement)) {
695:                         return;
696:                 }
697:                 setView((VView) firstElement);
698:                 render(view);
699:         }
700:
701:         private void render(VView view) {
702:                 if (adapter != null) {
703:                         // remove adapter
704:                         removeAdapters();
705:
706:                 }
707:                 adapter = new EContentAdapter() {
708:
709:                         /**
710:                          * {@inheritDoc}
711:                          *
712:                          * @see org.eclipse.emf.ecore.util.EContentAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
713:                          */
714:                         @Override
715:                         public void notifyChanged(Notification notification) {
716:                                 if (form.isDisposed()) {
717:                                         return;
718:                                 }
719:                                 super.notifyChanged(notification);
720:                                 if (notification.isTouch()) {
721:                                         return;
722:                                 }
723:
724:                                 // TODO needed?
725:                                 if (EStructuralFeature.class.cast(notification.getFeature()).isTransient()) {
726:                                         return;
727:                                 }
728:
729:                                 final Point point = container.computeSize(SWT.DEFAULT, SWT.DEFAULT);
730:                                 scrolledComposite.setMinSize(point);
731:                                 scrolledComposite.layout(true);
732:                         }
733:                 };
734:
735:                 view.eAdapters().add(adapter);
736:                 preView.registerForViewModelChanges();
737:                 preView.render(view, sampleData);
738:                 final Point point = container.computeSize(SWT.DEFAULT, SWT.DEFAULT);
739:                 scrolledComposite.setMinSize(point);
740:                 scrolledComposite.layout(true);
741:         }
742:
743:         private void setView(VView view) {
744:                 if (this.view != view) {
745:                         removeAdapters();
746:                         this.view = view;
747:                 }
748:         }
749:
750:         private void removeAdapters() {
751:                 if (view != null && adapter != null) {
752:                         for (final Adapter a : view.eAdapters()) {
753:                                 if (a.equals(adapter)) {
754:                                         view.eAdapters().remove(adapter);
755:                                         adapter = null;
756:                                         break;
757:                                 }
758:                         }
759:                 }
760:                 preView.removeAdapter();
761:         }
762:
763:         /**
764:          * @return the updateAutomatic
765:          */
766:         public boolean isUpdateAutomatic() {
767:                 return updateAutomatic;
768:         }
769:
770:         /**
771:          * @param updateAutomatic the updateAutomatic to set
772:          */
773:         private void setUpdateAutomatic(boolean updateAutomatic) {
774:                 this.updateAutomatic = updateAutomatic;
775:                 if (preView != null) {
776:                         preView.setUpdateAutomatic(updateAutomatic);
777:                         final Point point = container.computeSize(SWT.DEFAULT, SWT.DEFAULT);
778:                         scrolledComposite.setMinSize(point);
779:                         scrolledComposite.layout(true);
780:                 }
781:         }
782:
783:         private void render() {
784:                 if (preView != null) {
785:                         if (view != null) {
786:                                 render(view);
787:                                 final Point point = container.computeSize(SWT.DEFAULT, SWT.DEFAULT);
788:                                 scrolledComposite.setMinSize(point);
789:                                 scrolledComposite.layout(true);
790:                                 parent.layout();
791:                         } else {
792:                                 preView.clear();
793:                         }
794:
795:                 }
796:         }
797: }