[nobug] restore IDesignViewer as the provider of the design page's control, remove the assumption on AbstractTreeViewers, make expand/collapse support both pages, and provide a runtime mechanism to not create the toolbar at all
diff --git a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLMultiPageEditorPart.java b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLMultiPageEditorPart.java index b1fed5c..28c4128 100644 --- a/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLMultiPageEditorPart.java +++ b/bundles/org.eclipse.wst.xml.ui/src-multipage/org/eclipse/wst/xml/ui/internal/tabletree/XMLMultiPageEditorPart.java
@@ -18,10 +18,13 @@ import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.action.ToolBarManager; +import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextInputListener; import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.source.projection.ProjectionViewer; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.IPostSelectionProvider; @@ -38,7 +41,6 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IEditorActionBarContributor; @@ -422,7 +424,11 @@ private ILabelProvider fStatusLineLabelProvider; private PageInitializationData fPageInitializer; + + private ToolBarManager fToolbarManager; + private boolean fAllocateToolbar = true; + /** * StructuredTextMultiPageEditorPart constructor comment. */ @@ -592,42 +598,89 @@ // note: By adding the design page as a Control instead of an // IEditorPart, page switches will indicate // a "null" active editor when the design page is made active - fDesignPageIndex = addPage(designViewer.getControl().getParent()); + fDesignPageIndex = addPage(designViewer.getControl()); setPageText(fDesignPageIndex, designViewer.getTitle()); } protected IDesignViewer createDesignPage() { - Composite container = new Composite(getContainer(), SWT.NONE); - GridLayout layout = new GridLayout(); - layout.marginHeight = 0; - layout.verticalSpacing = 0; - layout.marginWidth = 0; - container.setLayout(layout); + XMLTableTreeViewer tableTreeViewer = new XMLTableTreeViewer(getContainer()); + // Set the default info-pop for XML design viewer. + XMLUIPlugin.getInstance().getWorkbench().getHelpSystem().setHelp(tableTreeViewer.getControl(), XMLTableTreeHelpContextIds.XML_DESIGN_VIEW_HELPID); - ToolBar tb = new ToolBar(container, SWT.FLAT); - - ToolBarManager manager = new ToolBarManager(tb); - tb.setLayoutData(new GridData(GridData.END, GridData.VERTICAL_ALIGN_BEGINNING, true, false)); - - IDesignViewer designViewer = new XMLTableTreeViewer(container); - designViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); - // Set the default infopop for XML design viewer. - XMLUIPlugin.getInstance().getWorkbench().getHelpSystem().setHelp(designViewer.getControl(), XMLTableTreeHelpContextIds.XML_DESIGN_VIEW_HELPID); - - addToolBarActions(manager, designViewer); - - return designViewer; + if (fToolbarManager != null) { + addToolBarActions(fToolbarManager, tableTreeViewer); + } + return tableTreeViewer; } - private void addToolBarActions(ToolBarManager manager, IDesignViewer viewer) { - ViewerExpandCollapseAction expand = new ViewerExpandCollapseAction(true); - ViewerExpandCollapseAction collapse = new ViewerExpandCollapseAction(false); - manager.add(expand); - manager.add(collapse); - manager.update(true); + private void addToolBarActions(final ToolBarManager manager, IDesignViewer viewer) { + if (viewer instanceof AbstractTreeViewer) { + // "dual-mode" actions for both pages + final ViewerExpandCollapseAction expand = new ViewerExpandCollapseAction(true) { + public void run() { + if (getActivePage() == fDesignPageIndex) { + super.run(); + } + else if (getActivePage() == fSourcePageIndex) { + ITextViewer viewer = fTextEditor.getTextViewer(); + if (viewer instanceof ProjectionViewer) { + ProjectionViewer projectionViewer = (ProjectionViewer) viewer; + if (projectionViewer.isProjectionMode()) + projectionViewer.doOperation(ProjectionViewer.EXPAND_ALL); + } + } + } + }; + final ViewerExpandCollapseAction collapse = new ViewerExpandCollapseAction(false) { + public void run() { + if (getActivePage() == fDesignPageIndex) { + super.run(); + } + else if (getActivePage() == fSourcePageIndex) { + ITextViewer viewer = fTextEditor.getTextViewer(); + if (viewer instanceof ProjectionViewer) { + ProjectionViewer projectionViewer = (ProjectionViewer) viewer; + if (projectionViewer.isProjectionMode()) + projectionViewer.doOperation(ProjectionViewer.COLLAPSE_ALL); + } + } + } + }; + expand.setViewer((AbstractTreeViewer) viewer); + collapse.setViewer((AbstractTreeViewer) viewer); - expand.setViewer((AbstractTreeViewer) viewer); - collapse.setViewer((AbstractTreeViewer) viewer); + manager.add(expand); + manager.add(collapse); + manager.getControl().pack(true); + manager.update(true); + } + } + + protected Composite createPageContainer(Composite parent) { + if (fAllocateToolbar) { + Composite container = new Composite(super.createPageContainer(parent), SWT.NONE); + GridLayout layout = new GridLayout(1, true); + layout.horizontalSpacing = 0; + layout.verticalSpacing = 0; + layout.marginBottom = 0; + layout.marginTop = 0; + layout.marginHeight = 0; + layout.marginWidth = 0; + layout.marginLeft = 0; + layout.marginRight = 0; + layout.horizontalSpacing = 0; + container.setLayout(layout); + + fToolbarManager = new ToolBarManager(); + GridData data = GridDataFactory.fillDefaults().align(SWT.END, SWT.BEGINNING).grab(true, false).create(); + fToolbarManager.createControl(container).setLayoutData(data); + + Composite composite = new Composite(container, SWT.NONE); + composite.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create()); + + return composite; + } + return super.createPageContainer(parent); } /** @@ -749,7 +802,7 @@ if ((fTextEditor != null) && (fPropertyListener != null)) { fTextEditor.removePropertyListener(fPropertyListener); } - + // moved to last when added window ... seems like // we'd be in danger of losing some data, like site, // or something. @@ -904,6 +957,14 @@ } return isDirty(); } + + /** + * Prevents the creation of the in-editor toolbar, if called before + * createPageContainer() during editor initialization. + */ + protected final void noToolbar() { + fAllocateToolbar = false; + } /* * (non-Javadoc)