1 17 package org.eclipse.emf.mapping.ecore2xml.presentation; 18 19 20 import org.eclipse.emf.common.command.BasicCommandStack; 21 import org.eclipse.emf.common.command.Command; 22 import org.eclipse.emf.common.command.CommandStack; 23 import org.eclipse.emf.common.command.CommandStackListener; 24 25 import org.eclipse.emf.common.notify.AdapterFactory; 26 27 import org.eclipse.emf.common.ui.ViewerPane; 28 29 import org.eclipse.emf.common.ui.viewer.IViewerProvider; 30 31 import org.eclipse.emf.common.util.URI; 32 33 import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; 34 import org.eclipse.emf.edit.domain.EditingDomain; 35 import org.eclipse.emf.edit.domain.IEditingDomainProvider; 36 37 import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator; 38 import org.eclipse.emf.edit.provider.ComposedAdapterFactory; 39 import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory; 40 41 import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory; 42 43 import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor; 44 45 import org.eclipse.emf.edit.ui.celleditor.AdapterFactoryTreeEditor; 46 47 import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter; 48 import org.eclipse.emf.edit.ui.dnd.LocalTransfer; 49 import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter; 50 51 import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; 52 import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; 53 54 import org.eclipse.emf.ecore.EObject; 55 import org.eclipse.emf.ecore.EValidator; 56 57 import org.eclipse.emf.ecore.resource.Resource; 58 import org.eclipse.emf.ecore.resource.ResourceSet; 59 60 import java.io.IOException ; 61 62 import java.util.ArrayList ; 63 import java.util.Collection ; 64 import java.util.Collections ; 65 import java.util.EventObject ; 66 import java.util.Iterator ; 67 import java.util.List ; 68 69 import org.eclipse.core.resources.IFile; 70 import org.eclipse.core.resources.IMarker; 71 import org.eclipse.core.resources.IResource; 72 import org.eclipse.core.resources.IResourceChangeListener; 73 import org.eclipse.core.resources.IResourceChangeEvent; 74 import org.eclipse.core.resources.IResourceDelta; 75 import org.eclipse.core.resources.IResourceDeltaVisitor; 76 import org.eclipse.core.resources.ResourcesPlugin; 77 78 import org.eclipse.core.runtime.CoreException; 79 import org.eclipse.core.runtime.IPath; 80 import org.eclipse.core.runtime.IProgressMonitor; 81 82 import org.eclipse.jface.action.IMenuListener; 83 import org.eclipse.jface.action.IMenuManager; 84 import org.eclipse.jface.action.IStatusLineManager; 85 import org.eclipse.jface.action.IToolBarManager; 86 import org.eclipse.jface.action.MenuManager; 87 import org.eclipse.jface.action.Separator; 88 89 import org.eclipse.jface.dialogs.MessageDialog; 90 import org.eclipse.jface.dialogs.ProgressMonitorDialog; 91 92 import org.eclipse.jface.viewers.ColumnWeightData; 93 import org.eclipse.jface.viewers.ISelection; 94 import org.eclipse.jface.viewers.ISelectionChangedListener; 95 import org.eclipse.jface.viewers.ISelectionProvider; 96 import org.eclipse.jface.viewers.IStructuredSelection; 97 import org.eclipse.jface.viewers.ListViewer; 98 import org.eclipse.jface.viewers.SelectionChangedEvent; 99 import org.eclipse.jface.viewers.StructuredSelection; 100 import org.eclipse.jface.viewers.StructuredViewer; 101 import org.eclipse.jface.viewers.TableLayout; 102 import org.eclipse.jface.viewers.TableViewer; 103 import org.eclipse.jface.viewers.TreeViewer; 104 import org.eclipse.jface.viewers.Viewer; 105 106 import org.eclipse.swt.SWT; 107 108 import org.eclipse.swt.custom.CTabFolder; 109 110 import org.eclipse.swt.dnd.DND; 111 import org.eclipse.swt.dnd.Transfer; 112 113 import org.eclipse.swt.events.ControlAdapter; 114 import org.eclipse.swt.events.ControlEvent; 115 116 import org.eclipse.swt.graphics.Point; 117 118 import org.eclipse.swt.layout.FillLayout; 119 120 import org.eclipse.swt.widgets.Composite; 121 import org.eclipse.swt.widgets.Control; 122 import org.eclipse.swt.widgets.Menu; 123 import org.eclipse.swt.widgets.Table; 124 import org.eclipse.swt.widgets.TableColumn; 125 import org.eclipse.swt.widgets.Tree; 126 127 import org.eclipse.swt.widgets.TreeColumn; 128 129 import org.eclipse.ui.IActionBars; 130 import org.eclipse.ui.IEditorInput; 131 import org.eclipse.ui.IEditorPart; 132 import org.eclipse.ui.IEditorSite; 133 import org.eclipse.ui.IFileEditorInput; 134 import org.eclipse.ui.IPartListener; 135 import org.eclipse.ui.IWorkbenchPart; 136 137 import org.eclipse.ui.dialogs.SaveAsDialog; 138 139 import org.eclipse.ui.ide.IGotoMarker; 140 141 import org.eclipse.ui.part.FileEditorInput; 142 import org.eclipse.ui.part.MultiPageEditorPart; 143 144 import org.eclipse.ui.views.contentoutline.ContentOutline; 145 import org.eclipse.ui.views.contentoutline.ContentOutlinePage; 146 import org.eclipse.ui.views.contentoutline.IContentOutlinePage; 147 148 import org.eclipse.ui.views.properties.IPropertySheetPage; 149 import org.eclipse.ui.views.properties.PropertySheet; 150 import org.eclipse.ui.views.properties.PropertySheetPage; 151 152 import org.eclipse.emf.mapping.ecore2xml.provider.Ecore2XMLItemProviderAdapterFactory; 153 154 155 import java.util.HashMap ; 156 157 import org.eclipse.core.runtime.NullProgressMonitor; 158 159 import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory; 160 161 import org.eclipse.emf.mapping.ecore2xml.ui.Ecore2XMLUIPlugin; 162 163 import org.eclipse.ui.actions.WorkspaceModifyOperation; 164 165 166 172 public class Ecore2XMLEditor 173 extends MultiPageEditorPart 174 implements IEditingDomainProvider, ISelectionProvider, IMenuListener, IViewerProvider, IGotoMarker 175 { 176 182 protected AdapterFactoryEditingDomain editingDomain; 183 184 190 protected ComposedAdapterFactory adapterFactory; 191 192 198 protected IContentOutlinePage contentOutlinePage; 199 200 206 protected IStatusLineManager contentOutlineStatusLineManager; 207 208 214 protected TreeViewer contentOutlineViewer; 215 216 222 protected PropertySheetPage propertySheetPage; 223 224 231 protected TreeViewer selectionViewer; 232 233 239 protected TreeViewer parentViewer; 240 241 247 protected TreeViewer treeViewer; 248 249 256 protected ListViewer listViewer; 257 258 265 protected TableViewer tableViewer; 266 267 273 protected TreeViewer treeViewerWithColumns; 274 275 281 protected ViewerPane currentViewerPane; 282 283 289 protected Viewer currentViewer; 290 291 297 protected ISelectionChangedListener selectionChangedListener; 298 299 305 protected Collection selectionChangedListeners = new ArrayList (); 306 307 313 protected ISelection editorSelection = StructuredSelection.EMPTY; 314 315 321 protected IPartListener partListener = 322 new IPartListener() 323 { 324 public void partActivated(IWorkbenchPart p) 325 { 326 if (p instanceof ContentOutline) 327 { 328 if (((ContentOutline)p).getCurrentPage() == contentOutlinePage) 329 { 330 getActionBarContributor().setActiveEditor(Ecore2XMLEditor.this); 331 332 setCurrentViewer(contentOutlineViewer); 333 } 334 } 335 else if (p instanceof PropertySheet) 336 { 337 if (((PropertySheet)p).getCurrentPage() == propertySheetPage) 338 { 339 getActionBarContributor().setActiveEditor(Ecore2XMLEditor.this); 340 handleActivate(); 341 } 342 } 343 else if (p == Ecore2XMLEditor.this) 344 { 345 handleActivate(); 346 } 347 } 348 public void partBroughtToTop(IWorkbenchPart p) 349 { 350 } 351 public void partClosed(IWorkbenchPart p) 352 { 353 } 354 public void partDeactivated(IWorkbenchPart p) 355 { 356 } 357 public void partOpened(IWorkbenchPart p) 358 { 359 } 360 }; 361 362 366 Collection removedResources = new ArrayList (); 367 368 372 Collection changedResources = new ArrayList (); 373 374 378 Collection savedResources = new ArrayList (); 379 380 386 protected IResourceChangeListener resourceChangeListener = 387 new IResourceChangeListener() 388 { 389 public void resourceChanged(IResourceChangeEvent event) 390 { 391 { 394 IResourceDelta delta = event.getDelta(); 395 try 396 { 397 class ResourceDeltaVisitor implements IResourceDeltaVisitor 398 { 399 protected ResourceSet resourceSet = editingDomain.getResourceSet(); 400 protected Collection changedResources = new ArrayList (); 401 protected Collection removedResources = new ArrayList (); 402 403 public boolean visit(IResourceDelta delta) 404 { 405 if (delta.getFlags() != IResourceDelta.MARKERS && 406 delta.getResource().getType() == IResource.FILE) 407 { 408 if ((delta.getKind() & (IResourceDelta.CHANGED | IResourceDelta.REMOVED)) != 0) 409 { 410 Resource resource = resourceSet.getResource(URI.createURI(delta.getFullPath().toString()), false); 411 if (resource != null) 412 { 413 if ((delta.getKind() & IResourceDelta.REMOVED) != 0) 414 { 415 removedResources.add(resource); 416 } 417 else 418 { 419 changedResources.add(resource); 420 } 421 } 422 } 423 } 424 425 return true; 426 } 427 428 public Collection getChangedResources() 429 { 430 return changedResources; 431 } 432 433 public Collection getRemovedResources() 434 { 435 return removedResources; 436 } 437 } 438 439 ResourceDeltaVisitor visitor = new ResourceDeltaVisitor(); 440 delta.accept(visitor); 441 442 if (!visitor.getRemovedResources().isEmpty()) 443 { 444 removedResources.addAll(visitor.getRemovedResources()); 445 if (!isDirty()) 446 { 447 getSite().getShell().getDisplay().asyncExec 448 (new Runnable () 449 { 450 public void run() 451 { 452 getSite().getPage().closeEditor(Ecore2XMLEditor.this, false); 453 Ecore2XMLEditor.this.dispose(); 454 } 455 }); 456 } 457 } 458 459 if (!visitor.getChangedResources().isEmpty()) 460 { 461 changedResources.addAll(visitor.getChangedResources()); 462 } 463 } 464 catch (CoreException exception) 465 { 466 Ecore2XMLUIPlugin.INSTANCE.log(exception); 467 } 468 } 469 } 470 }; 471 472 476 protected void handleActivate() 477 { 478 if (editingDomain.getResourceToReadOnlyMap() != null) 481 { 482 editingDomain.getResourceToReadOnlyMap().clear(); 483 484 setSelection(getSelection()); 487 } 488 489 if (!removedResources.isEmpty()) 490 { 491 if (handleDirtyConflict()) 492 { 493 getSite().getPage().closeEditor(Ecore2XMLEditor.this, false); 494 Ecore2XMLEditor.this.dispose(); 495 } 496 else 497 { 498 removedResources.clear(); 499 changedResources.clear(); 500 savedResources.clear(); 501 } 502 } 503 else if (!changedResources.isEmpty()) 504 { 505 changedResources.removeAll(savedResources); 506 handleChangedResources(); 507 changedResources.clear(); 508 savedResources.clear(); 509 } 510 } 511 512 513 517 protected void handleChangedResources() 518 { 519 if (!changedResources.isEmpty() && (!isDirty() || handleDirtyConflict())) 520 { 521 editingDomain.getCommandStack().flush(); 522 523 for (Iterator i = changedResources.iterator(); i.hasNext(); ) 524 { 525 Resource resource = (Resource)i.next(); 526 if (resource.isLoaded()) 527 { 528 resource.unload(); 529 try 530 { 531 resource.load(Collections.EMPTY_MAP); 532 } 533 catch (IOException exception) 534 { 535 Ecore2XMLUIPlugin.INSTANCE.log(exception); 536 } 537 } 538 } 539 } 540 } 541 542 546 protected boolean handleDirtyConflict() 547 { 548 return 549 MessageDialog.openQuestion 550 (getSite().getShell(), 551 getString("_UI_FileConflict_label"), getString("_WARN_FileConflict")); } 554 555 561 public Ecore2XMLEditor() 562 { 563 super(); 564 565 List factories = new ArrayList (); 568 factories.add(new ResourceItemProviderAdapterFactory()); 569 factories.add(new Ecore2XMLItemProviderAdapterFactory()); 570 factories.add(new EcoreItemProviderAdapterFactory()); 571 factories.add(new ReflectiveItemProviderAdapterFactory()); 572 573 adapterFactory = new ComposedAdapterFactory(factories); 574 575 BasicCommandStack commandStack = new BasicCommandStack(); 578 579 commandStack.addCommandStackListener 582 (new CommandStackListener() 583 { 584 public void commandStackChanged(final EventObject event) 585 { 586 getContainer().getDisplay().asyncExec 587 (new Runnable () 588 { 589 public void run() 590 { 591 firePropertyChange(IEditorPart.PROP_DIRTY); 592 593 Command mostRecentCommand = ((CommandStack)event.getSource()).getMostRecentCommand(); 596 if (mostRecentCommand != null) 597 { 598 setSelectionToViewer(mostRecentCommand.getAffectedObjects()); 599 } 600 if (propertySheetPage != null) 601 { 602 propertySheetPage.refresh(); 603 } 604 } 605 }); 606 } 607 }); 608 609 editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap ()); 612 } 613 614 620 protected void firePropertyChange(int action) 621 { 622 super.firePropertyChange(action); 623 } 624 625 631 public void setSelectionToViewer(Collection collection) 632 { 633 final Collection theSelection = collection; 634 if (theSelection != null && !theSelection.isEmpty()) 637 { 638 Runnable runnable = 644 new Runnable () 645 { 646 public void run() 647 { 648 if (currentViewer != null) 651 { 652 currentViewer.setSelection(new StructuredSelection(theSelection.toArray()), true); 653 } 654 } 655 }; 656 runnable.run(); 657 } 658 } 659 660 668 public EditingDomain getEditingDomain() 669 { 670 return editingDomain; 671 } 672 673 678 public class ReverseAdapterFactoryContentProvider extends AdapterFactoryContentProvider 679 { 680 public ReverseAdapterFactoryContentProvider(AdapterFactory adapterFactory) 681 { 682 super(adapterFactory); 683 } 684 685 public Object [] getElements(Object object) 686 { 687 Object parent = super.getParent(object); 688 return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray(); 689 } 690 691 public Object [] getChildren(Object object) 692 { 693 Object parent = super.getParent(object); 694 return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray(); 695 } 696 697 public boolean hasChildren(Object object) 698 { 699 Object parent = super.getParent(object); 700 return parent != null; 701 } 702 703 public Object getParent(Object object) 704 { 705 return null; 706 } 707 } 708 709 714 public void setCurrentViewerPane(ViewerPane viewerPane) 715 { 716 if (currentViewerPane != viewerPane) 717 { 718 if (currentViewerPane != null) 719 { 720 currentViewerPane.showFocus(false); 721 } 722 currentViewerPane = viewerPane; 723 } 724 setCurrentViewer(currentViewerPane.getViewer()); 725 } 726 727 734 public void setCurrentViewer(Viewer viewer) 735 { 736 if (currentViewer != viewer) 739 { 740 if (selectionChangedListener == null) 741 { 742 selectionChangedListener = 745 new ISelectionChangedListener() 746 { 747 public void selectionChanged(SelectionChangedEvent selectionChangedEvent) 750 { 751 setSelection(selectionChangedEvent.getSelection()); 752 } 753 }; 754 } 755 756 if (currentViewer != null) 759 { 760 currentViewer.removeSelectionChangedListener(selectionChangedListener); 761 } 762 763 if (viewer != null) 766 { 767 viewer.addSelectionChangedListener(selectionChangedListener); 768 } 769 770 currentViewer = viewer; 773 774 setSelection(currentViewer == null ? StructuredSelection.EMPTY : currentViewer.getSelection()); 777 } 778 } 779 780 786 public Viewer getViewer() 787 { 788 return currentViewer; 789 } 790 791 797 protected void createContextMenuFor(StructuredViewer viewer) 798 { 799 MenuManager contextMenu = new MenuManager("#PopUp"); contextMenu.add(new Separator("additions")); contextMenu.setRemoveAllWhenShown(true); 802 contextMenu.addMenuListener(this); 803 Menu menu= contextMenu.createContextMenu(viewer.getControl()); 804 viewer.getControl().setMenu(menu); 805 getSite().registerContextMenu(contextMenu, viewer); 806 807 int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK; 808 Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() }; 809 viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer)); 810 viewer.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(editingDomain, viewer)); 811 } 812 813 819 public void createModel() 820 { 821 IFileEditorInput modelFile = (IFileEditorInput)getEditorInput(); 824 825 try 826 { 827 editingDomain.loadResource(URI.createPlatformResourceURI(modelFile.getFile().getFullPath().toString()).toString()); 830 } 831 catch (Exception exception) 832 { 833 Ecore2XMLUIPlugin.INSTANCE.log(exception); 834 } 835 } 836 837 843 public void createPages() 844 { 845 createModel(); 848 849 { 852 ViewerPane viewerPane = 853 new ViewerPane(getSite().getPage(), Ecore2XMLEditor.this) 854 { 855 public Viewer createViewer(Composite composite) 856 { 857 Tree tree = new Tree(composite, SWT.MULTI); 858 TreeViewer newTreeViewer = new TreeViewer(tree); 859 return newTreeViewer; 860 } 861 public void requestActivation() 862 { 863 super.requestActivation(); 864 setCurrentViewerPane(this); 865 } 866 }; 867 viewerPane.createControl(getContainer()); 868 869 selectionViewer = (TreeViewer)viewerPane.getViewer(); 870 selectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); 871 872 selectionViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); 873 selectionViewer.setInput(editingDomain.getResourceSet()); 874 viewerPane.setTitle(editingDomain.getResourceSet()); 875 876 new AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory); 877 878 createContextMenuFor(selectionViewer); 879 int pageIndex = addPage(viewerPane.getControl()); 880 setPageText(pageIndex, getString("_UI_SelectionPage_label")); } 882 883 { 886 ViewerPane viewerPane = 887 new ViewerPane(getSite().getPage(), Ecore2XMLEditor.this) 888 { 889 public Viewer createViewer(Composite composite) 890 { 891 Tree tree = new Tree(composite, SWT.MULTI); 892 TreeViewer newTreeViewer = new TreeViewer(tree); 893 return newTreeViewer; 894 } 895 public void requestActivation() 896 { 897 super.requestActivation(); 898 setCurrentViewerPane(this); 899 } 900 }; 901 viewerPane.createControl(getContainer()); 902 903 parentViewer = (TreeViewer)viewerPane.getViewer(); 904 parentViewer.setAutoExpandLevel(30); 905 parentViewer.setContentProvider(new ReverseAdapterFactoryContentProvider(adapterFactory)); 906 parentViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); 907 908 createContextMenuFor(parentViewer); 909 int pageIndex = addPage(viewerPane.getControl()); 910 setPageText(pageIndex, getString("_UI_ParentPage_label")); } 912 913 { 916 ViewerPane viewerPane = 917 new ViewerPane(getSite().getPage(), Ecore2XMLEditor.this) 918 { 919 public Viewer createViewer(Composite composite) 920 { 921 return new ListViewer(composite); 922 } 923 public void requestActivation() 924 { 925 super.requestActivation(); 926 setCurrentViewerPane(this); 927 } 928 }; 929 viewerPane.createControl(getContainer()); 930 listViewer = (ListViewer)viewerPane.getViewer(); 931 listViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); 932 listViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); 933 934 createContextMenuFor(listViewer); 935 int pageIndex = addPage(viewerPane.getControl()); 936 setPageText(pageIndex, getString("_UI_ListPage_label")); } 938 939 { 942 ViewerPane viewerPane = 943 new ViewerPane(getSite().getPage(), Ecore2XMLEditor.this) 944 { 945 public Viewer createViewer(Composite composite) 946 { 947 return new TreeViewer(composite); 948 } 949 public void requestActivation() 950 { 951 super.requestActivation(); 952 setCurrentViewerPane(this); 953 } 954 }; 955 viewerPane.createControl(getContainer()); 956 treeViewer = (TreeViewer)viewerPane.getViewer(); 957 treeViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); 958 treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); 959 960 new AdapterFactoryTreeEditor(treeViewer.getTree(), adapterFactory); 961 962 createContextMenuFor(treeViewer); 963 int pageIndex = addPage(viewerPane.getControl()); 964 setPageText(pageIndex, getString("_UI_TreePage_label")); } 966 967 { 970 ViewerPane viewerPane = 971 new ViewerPane(getSite().getPage(), Ecore2XMLEditor.this) 972 { 973 public Viewer createViewer(Composite composite) 974 { 975 return new TableViewer(composite); 976 } 977 public void requestActivation() 978 { 979 super.requestActivation(); 980 setCurrentViewerPane(this); 981 } 982 }; 983 viewerPane.createControl(getContainer()); 984 tableViewer = (TableViewer)viewerPane.getViewer(); 985 986 Table table = tableViewer.getTable(); 987 TableLayout layout = new TableLayout(); 988 table.setLayout(layout); 989 table.setHeaderVisible(true); 990 table.setLinesVisible(true); 991 992 TableColumn objectColumn = new TableColumn(table, SWT.NONE); 993 layout.addColumnData(new ColumnWeightData(3, 100, true)); 994 objectColumn.setText(getString("_UI_ObjectColumn_label")); objectColumn.setResizable(true); 996 997 TableColumn selfColumn = new TableColumn(table, SWT.NONE); 998 layout.addColumnData(new ColumnWeightData(2, 100, true)); 999 selfColumn.setText(getString("_UI_SelfColumn_label")); selfColumn.setResizable(true); 1001 1002 tableViewer.setColumnProperties(new String [] {"a", "b"}); tableViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); 1004 tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); 1005 1006 createContextMenuFor(tableViewer); 1007 int pageIndex = addPage(viewerPane.getControl()); 1008 setPageText(pageIndex, getString("_UI_TablePage_label")); } 1010 1011 { 1014 ViewerPane viewerPane = 1015 new ViewerPane(getSite().getPage(), Ecore2XMLEditor.this) 1016 { 1017 public Viewer createViewer(Composite composite) 1018 { 1019 return new TreeViewer(composite); 1020 } 1021 public void requestActivation() 1022 { 1023 super.requestActivation(); 1024 setCurrentViewerPane(this); 1025 } 1026 }; 1027 viewerPane.createControl(getContainer()); 1028 1029 treeViewerWithColumns = (TreeViewer)viewerPane.getViewer(); 1030 1031 Tree tree = treeViewerWithColumns.getTree(); 1032 tree.setLayoutData(new FillLayout()); 1033 tree.setHeaderVisible(true); 1034 tree.setLinesVisible(true); 1035 1036 TreeColumn objectColumn = new TreeColumn(tree, SWT.NONE); 1037 objectColumn.setText(getString("_UI_ObjectColumn_label")); objectColumn.setResizable(true); 1039 objectColumn.setWidth(250); 1040 1041 TreeColumn selfColumn = new TreeColumn(tree, SWT.NONE); 1042 selfColumn.setText(getString("_UI_SelfColumn_label")); selfColumn.setResizable(true); 1044 selfColumn.setWidth(200); 1045 1046 treeViewerWithColumns.setColumnProperties(new String [] {"a", "b"}); treeViewerWithColumns.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); 1048 treeViewerWithColumns.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); 1049 1050 createContextMenuFor(treeViewerWithColumns); 1051 int pageIndex = addPage(viewerPane.getControl()); 1052 setPageText(pageIndex, getString("_UI_TreeWithColumnsPage_label")); } 1054 1055 setActivePage(0); 1056 1057 getContainer().addControlListener 1058 (new ControlAdapter() 1059 { 1060 boolean guard = false; 1061 public void controlResized(ControlEvent event) 1062 { 1063 if (!guard) 1064 { 1065 guard = true; 1066 hideTabs(); 1067 guard = false; 1068 } 1069 } 1070 }); 1071 } 1072 1073 1080 protected void hideTabs() 1081 { 1082 if (getPageCount() <= 1) 1083 { 1084 setPageText(0, ""); if (getContainer() instanceof CTabFolder) 1086 { 1087 ((CTabFolder)getContainer()).setTabHeight(1); 1088 Point point = getContainer().getSize(); 1089 getContainer().setSize(point.x, point.y + 6); 1090 } 1091 } 1092 } 1093 1094 1100 protected void pageChange(int pageIndex) 1101 { 1102 super.pageChange(pageIndex); 1103 1104 Control control = getControl(pageIndex); 1107 if (control != null) 1108 { 1109 control.setVisible(true); 1110 control.setFocus(); 1111 } 1112 1113 if (contentOutlinePage != null) 1114 { 1115 handleContentOutlineSelection(contentOutlinePage.getSelection()); 1116 } 1117 } 1118 1119 1125 public Object getAdapter(Class key) 1126 { 1127 if (key.equals(IContentOutlinePage.class)) 1128 { 1129 return getContentOutlinePage(); 1130 } 1131 else if (key.equals(IPropertySheetPage.class)) 1132 { 1133 return getPropertySheetPage(); 1134 } 1135 else if (key.equals(IGotoMarker.class)) 1136 { 1137 return this; 1138 } 1139 else 1140 { 1141 return super.getAdapter(key); 1142 } 1143 } 1144 1145 1151 public IContentOutlinePage getContentOutlinePage() 1152 { 1153 if (contentOutlinePage == null) 1154 { 1155 class MyContentOutlinePage extends ContentOutlinePage 1158 { 1159 public void createControl(Composite parent) 1160 { 1161 super.createControl(parent); 1162 contentOutlineViewer = getTreeViewer(); 1163 contentOutlineViewer.addSelectionChangedListener(this); 1164 1165 contentOutlineViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); 1168 contentOutlineViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); 1169 contentOutlineViewer.setInput(editingDomain.getResourceSet()); 1170 1171 createContextMenuFor(contentOutlineViewer); 1174 1175 if (!editingDomain.getResourceSet().getResources().isEmpty()) 1176 { 1177 ArrayList selection = new ArrayList (); 1180 selection.add(editingDomain.getResourceSet().getResources().get(0)); 1181 contentOutlineViewer.setSelection(new StructuredSelection(selection), true); 1182 } 1183 } 1184 1185 public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) 1186 { 1187 super.makeContributions(menuManager, toolBarManager, statusLineManager); 1188 contentOutlineStatusLineManager = statusLineManager; 1189 } 1190 1191 public void setActionBars(IActionBars actionBars) 1192 { 1193 super.setActionBars(actionBars); 1194 getActionBarContributor().shareGlobalActions(this, actionBars); 1195 } 1196 } 1197 1198 contentOutlinePage = new MyContentOutlinePage(); 1199 1200 contentOutlinePage.addSelectionChangedListener 1203 (new ISelectionChangedListener() 1204 { 1205 public void selectionChanged(SelectionChangedEvent event) 1208 { 1209 handleContentOutlineSelection(event.getSelection()); 1210 } 1211 }); 1212 } 1213 1214 return contentOutlinePage; 1215 } 1216 1217 1223 public IPropertySheetPage getPropertySheetPage() 1224 { 1225 if (propertySheetPage == null) 1226 { 1227 propertySheetPage = 1228 new PropertySheetPage() 1229 { 1230 public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) 1231 { 1232 super.makeContributions(menuManager, toolBarManager, statusLineManager); 1233 } 1234 1235 public void setActionBars(IActionBars actionBars) 1236 { 1237 super.setActionBars(actionBars); 1238 getActionBarContributor().shareGlobalActions(this, actionBars); 1239 } 1240 }; 1241 propertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory)); 1242 } 1243 1244 return propertySheetPage; 1245 } 1246 1247 1253 public void handleContentOutlineSelection(ISelection selection) 1254 { 1255 if (currentViewerPane != null && !selection.isEmpty() && selection instanceof IStructuredSelection) 1256 { 1257 Iterator selectedElements = ((IStructuredSelection)selection).iterator(); 1258 if (selectedElements.hasNext()) 1259 { 1260 Object selectedElement = selectedElements.next(); 1263 1264 if (currentViewerPane.getViewer() == selectionViewer) 1267 { 1268 ArrayList selectionList = new ArrayList (); 1269 selectionList.add(selectedElement); 1270 while (selectedElements.hasNext()) 1271 { 1272 selectionList.add(selectedElements.next()); 1273 } 1274 1275 selectionViewer.setSelection(new StructuredSelection(selectionList)); 1278 } 1279 else 1280 { 1281 if (currentViewerPane.getViewer().getInput() != selectedElement) 1284 { 1285 currentViewerPane.getViewer().setInput(selectedElement); 1286 currentViewerPane.setTitle(selectedElement); 1287 } 1288 } 1289 } 1290 } 1291 } 1292 1293 1299 public boolean isDirty() 1300 { 1301 return ((BasicCommandStack)editingDomain.getCommandStack()).isSaveNeeded(); 1302 } 1303 1304 1310 public void doSave(IProgressMonitor progressMonitor) 1311 { 1312 WorkspaceModifyOperation operation = 1315 new WorkspaceModifyOperation() 1316 { 1317 public void execute(IProgressMonitor monitor) 1320 { 1321 try 1322 { 1323 Resource savedResource = (Resource)editingDomain.getResourceSet().getResources().get(0); 1326 savedResources.add(savedResource); 1327 savedResource.save(Collections.EMPTY_MAP); 1328 } 1329 catch (Exception exception) 1330 { 1331 Ecore2XMLUIPlugin.INSTANCE.log(exception); 1332 } 1333 } 1334 }; 1335 1336 try 1337 { 1338 new ProgressMonitorDialog(getSite().getShell()).run(true, false, operation); 1341 1342 ((BasicCommandStack)editingDomain.getCommandStack()).saveIsDone(); 1345 firePropertyChange(IEditorPart.PROP_DIRTY); 1346 } 1347 catch (Exception exception) 1348 { 1349 Ecore2XMLUIPlugin.INSTANCE.log(exception); 1352 } 1353 } 1354 1355 1361 public boolean isSaveAsAllowed() 1362 { 1363 return true; 1364 } 1365 1366 1372 public void doSaveAs() 1373 { 1374 SaveAsDialog saveAsDialog= new SaveAsDialog(getSite().getShell()); 1375 saveAsDialog.open(); 1376 IPath path= saveAsDialog.getResult(); 1377 if (path != null) 1378 { 1379 IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path); 1380 if (file != null) 1381 { 1382 doSaveAs(URI.createPlatformResourceURI(file.getFullPath().toString()), new FileEditorInput(file)); 1383 } 1384 } 1385 } 1386 1387 1392 protected void doSaveAs(URI uri, IEditorInput editorInput) 1393 { 1394 ((Resource)editingDomain.getResourceSet().getResources().get(0)).setURI(uri); 1395 setInput(editorInput); 1396 setPartName(editorInput.getName()); 1397 IProgressMonitor progressMonitor = 1398 getActionBars().getStatusLineManager() != null ? 1399 getActionBars().getStatusLineManager().getProgressMonitor() : 1400 new NullProgressMonitor(); 1401 doSave(progressMonitor); 1402 } 1403 1404 1409 public void gotoMarker(IMarker marker) 1410 { 1411 try 1412 { 1413 if (marker.getType().equals(EValidator.MARKER)) 1414 { 1415 String uriAttribute = marker.getAttribute(EValidator.URI_ATTRIBUTE, null); 1416 if (uriAttribute != null) 1417 { 1418 URI uri = URI.createURI(uriAttribute); 1419 EObject eObject = editingDomain.getResourceSet().getEObject(uri, true); 1420 if (eObject != null) 1421 { 1422 setSelectionToViewer(Collections.singleton(editingDomain.getWrapper(eObject))); 1423 } 1424 } 1425 } 1426 } 1427 catch (CoreException exception) 1428 { 1429 Ecore2XMLUIPlugin.INSTANCE.log(exception); 1430 } 1431 } 1432 1433 1439 public void init(IEditorSite site, IEditorInput editorInput) 1440 { 1441 setSite(site); 1442 setInput(editorInput); 1443 setPartName(editorInput.getName()); 1444 site.setSelectionProvider(this); 1445 site.getPage().addPartListener(partListener); 1446 ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener, IResourceChangeEvent.POST_CHANGE); 1447 } 1448 1449 1454 public void setFocus() 1455 { 1456 getControl(getActivePage()).setFocus(); 1457 } 1458 1459 1465 public void addSelectionChangedListener(ISelectionChangedListener listener) 1466 { 1467 selectionChangedListeners.add(listener); 1468 } 1469 1470 1476 public void removeSelectionChangedListener(ISelectionChangedListener listener) 1477 { 1478 selectionChangedListeners.remove(listener); 1479 } 1480 1481 1487 public ISelection getSelection() 1488 { 1489 return editorSelection; 1490 } 1491 1492 1499 public void setSelection(ISelection selection) 1500 { 1501 editorSelection = selection; 1502 1503 for (Iterator listeners = selectionChangedListeners.iterator(); listeners.hasNext(); ) 1504 { 1505 ISelectionChangedListener listener = (ISelectionChangedListener)listeners.next(); 1506 listener.selectionChanged(new SelectionChangedEvent(this, selection)); 1507 } 1508 setStatusLineManager(selection); 1509 } 1510 1511 1516 public void setStatusLineManager(ISelection selection) 1517 { 1518 IStatusLineManager statusLineManager = currentViewer != null && currentViewer == contentOutlineViewer ? 1519 contentOutlineStatusLineManager : getActionBars().getStatusLineManager(); 1520 1521 if (statusLineManager != null) 1522 { 1523 if (selection instanceof IStructuredSelection) 1524 { 1525 Collection collection = ((IStructuredSelection)selection).toList(); 1526 switch (collection.size()) 1527 { 1528 case 0: 1529 { 1530 statusLineManager.setMessage(getString("_UI_NoObjectSelected")); break; 1532 } 1533 case 1: 1534 { 1535 String text = new AdapterFactoryItemDelegator(adapterFactory).getText(collection.iterator().next()); 1536 statusLineManager.setMessage(getString("_UI_SingleObjectSelected", text)); break; 1538 } 1539 default: 1540 { 1541 statusLineManager.setMessage(getString("_UI_MultiObjectSelected", Integer.toString(collection.size()))); break; 1543 } 1544 } 1545 } 1546 else 1547 { 1548 statusLineManager.setMessage(""); } 1550 } 1551 } 1552 1553 1559 private static String getString(String key) 1560 { 1561 return Ecore2XMLUIPlugin.INSTANCE.getString(key); 1562 } 1563 1564 1570 private static String getString(String key, Object s1) 1571 { 1572 return Ecore2XMLUIPlugin.INSTANCE.getString(key, new Object [] { s1 }); 1573 } 1574 1575 1581 public void menuAboutToShow(IMenuManager menuManager) 1582 { 1583 ((IMenuListener)getEditorSite().getActionBarContributor()).menuAboutToShow(menuManager); 1584 } 1585 1586 1591 public EditingDomainActionBarContributor getActionBarContributor() 1592 { 1593 return (EditingDomainActionBarContributor)getEditorSite().getActionBarContributor(); 1594 } 1595 1596 1601 public IActionBars getActionBars() 1602 { 1603 return getActionBarContributor().getActionBars(); 1604 } 1605 1606 1611 public AdapterFactory getAdapterFactory() 1612 { 1613 return adapterFactory; 1614 } 1615 1616 1621 public void dispose() 1622 { 1623 ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener); 1624 1625 getSite().getPage().removePartListener(partListener); 1626 1627 adapterFactory.dispose(); 1628 1629 if (getActionBarContributor().getActiveEditor() == this) 1630 { 1631 getActionBarContributor().setActiveEditor(null); 1632 } 1633 1634 if (propertySheetPage != null) 1635 { 1636 propertySheetPage.dispose(); 1637 } 1638 1639 if (contentOutlinePage != null) 1640 { 1641 contentOutlinePage.dispose(); 1642 } 1643 1644 super.dispose(); 1645 } 1646 1647} 1648 | Popular Tags |