Author: dmaliarevich
Date: 2010-01-18 10:22:07 -0500 (Mon, 18 Jan 2010)
New Revision: 19792
Modified:
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPMultiPageEditor.java
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPMultiPageEditorPart.java
Log:
https://jira.jboss.org/jira/browse/JBIDE-5666, reverting, because
JSPMultiPageEditorPart's changes had influenced Ctrl+Space shortcut and content assist
got broken.
Modified:
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPMultiPageEditor.java
===================================================================
---
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPMultiPageEditor.java 2010-01-18
14:27:12 UTC (rev 19791)
+++
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPMultiPageEditor.java 2010-01-18
15:22:07 UTC (rev 19792)
@@ -35,7 +35,6 @@
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
@@ -791,11 +790,7 @@
.getString(IVpePreferencesPage.DEFAULT_VPE_TAB);
try {
int ind = Integer.parseInt(tabIndex);
- /*
- * After fixing
https://jira.jboss.org/jira/browse/JBIDE-5666
- * Getting a multipage container should return CTabFolder.
- */
- ((CTabFolder)getContainer()).setSelection(ind);
+ getTabFolder().setSelection(ind);
pageChange(ind);
} catch (NumberFormatException e) {
JspEditorPlugin.getPluginLog().logError(e);
Modified:
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPMultiPageEditorPart.java
===================================================================
---
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPMultiPageEditorPart.java 2010-01-18
14:27:12 UTC (rev 19791)
+++
trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPMultiPageEditorPart.java 2010-01-18
15:22:07 UTC (rev 19792)
@@ -10,27 +10,197 @@
******************************************************************************/
package org.jboss.tools.jst.jsp.jspeditor;
+import java.util.ArrayList;
+import java.util.Iterator;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.ui.IEditorActionBarContributor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IKeyBindingService;
+import org.eclipse.ui.INestableKeyBindingService;
+import org.eclipse.ui.IPropertyListener;
+import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.part.EditorPart;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.part.MultiPageEditorSite;
+import org.eclipse.ui.part.MultiPageSelectionProvider;
import org.jboss.tools.common.core.resources.XModelObjectEditorInput;
/**
*
*/
-public abstract class JSPMultiPageEditorPart extends MultiPageEditorPart {
+public abstract class JSPMultiPageEditorPart extends EditorPart {
+ private CTabFolder container;
+
+ private ArrayList nestedEditors = new ArrayList(3);
+
protected JSPMultiPageEditorPart() {
super();
}
+ public int addPage(Control control) {
+ createItem(control);
+ return getPageCount() - 1;
+ }
+
+ /**
+ *
+ */
+
+ Composite ppp = null;
+
+ public int addPage(IEditorPart editor, IEditorInput input)
+ throws PartInitException {
+ Composite parent2;
+ if (ppp == null) {
+ IEditorSite site = createSite(editor);
+ editor.init(site, input);
+ parent2 = new Composite(getContainer(), SWT.NONE);
+ ppp = parent2;
+ parent2.setLayout(new FillLayout());
+ editor.createPartControl(parent2);
+ editor.addPropertyListener(new IPropertyListener() {
+ public void propertyChanged(Object source, int propertyId) {
+ JSPMultiPageEditorPart.this
+ .handlePropertyChange(propertyId);
+ }
+ });
+ nestedEditors.add(editor);
+ } else {
+ parent2 = ppp;
+ }
+ Item item = createItem(parent2);
+ item.setData(editor);
+ return getPageCount() - 1;
+ }
+
+ /**
+ *
+ * @param parent
+ * @return
+ */
+ private CTabFolder createContainer(Composite parent) {
+ final CTabFolder newContainer = new CTabFolder(parent, SWT.BOTTOM
+ | SWT.FLAT);
+ newContainer.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ int newPageIndex = newContainer.indexOf((CTabItem) e.item);
+ pageChange(newPageIndex);
+ }
+ });
+ return newContainer;
+ }
+
+ /*
+ *
+ */
+ private CTabItem createItem(Control control) {
+ CTabItem item = new CTabItem(getTabFolder(), SWT.NONE);
+ item.setControl(control);
+ return item;
+ }
+
+ protected abstract void createPages();
+
+ public final void createPartControl(Composite parent) {
+ this.container = createContainer(parent);
+ createPages();
+ // set the active page (page 0 by default), unless it has already been
+ // done
+ if (getActivePage() == -1)
+ setActivePage(0);
+ }
+
+ protected abstract IEditorSite createSite(IEditorPart editor);
+
+ public void dispose() {
+ getSite().setSelectionProvider(null);
+ for (int i = 0; i < nestedEditors.size(); ++i) {
+ IEditorPart editor = (IEditorPart) nestedEditors.get(i);
+ disposePart(editor);
+ }
+ nestedEditors.clear();
+ }
+
protected IEditorPart getActiveEditor() {
- return super.getActiveEditor();
+ int index = getActivePage();
+ if (index != -1)
+ return getEditor(0);
+ return null;
}
+ protected int getActivePage() {
+ CTabFolder tabFolder = getTabFolder();
+ if (tabFolder != null && !tabFolder.isDisposed())
+ return tabFolder.getSelectionIndex();
+ return -1;
+ }
+
+ protected Composite getContainer() {
+ return container;
+ }
+
+ protected Control getControl(int pageIndex) {
+ return getItem(0).getControl();
+ }
+
+ protected IEditorPart getEditor(int pageIndex) {
+ Item item = getItem(pageIndex);
+ if (item != null) {
+ Object data = item.getData();
+ if (data instanceof IEditorPart) {
+ return (IEditorPart) data;
+ }
+ }
+ return null;
+ }
+
+ private CTabItem getItem(int pageIndex) {
+ return getTabFolder().getItem(pageIndex);
+ }
+
+ protected int getPageCount() {
+ CTabFolder folder = getTabFolder();
+ // May not have been created yet, or may have been disposed.
+ if (folder != null && !folder.isDisposed())
+ return folder.getItemCount();
+ return 0;
+ }
+
+ protected Image getPageImage(int pageIndex) {
+ return getItem(pageIndex).getImage();
+ }
+
+ protected String getPageText(int pageIndex) {
+ return getItem(pageIndex).getText();
+ }
+
+ protected CTabFolder getTabFolder() {
+ return container;
+ }
+
+ protected void handlePropertyChange(int propertyId) {
+ firePropertyChange(propertyId);
+ }
+
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
setSite(site);
@@ -38,4 +208,123 @@
site.setSelectionProvider(new JSPMultiPageSelectionProvider(this));
}
+ public boolean isDirty() {
+ // use nestedEditors to avoid SWT requests; see bug 12996
+ for (Iterator i = nestedEditors.iterator(); i.hasNext();) {
+ IEditorPart editor = (IEditorPart) i.next();
+ if (editor.isDirty()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected void pageChange(int newPageIndex) {
+ Control control = getControl(newPageIndex);
+ if (control != null) {
+ control.setVisible(true);
+ }
+
+ setFocus();
+ IEditorPart activeEditor = getEditor(newPageIndex);
+ IEditorActionBarContributor contributor = getEditorSite()
+ .getActionBarContributor();
+ if (contributor != null
+ && contributor instanceof MultiPageEditorActionBarContributor) {
+ ((MultiPageEditorActionBarContributor) contributor)
+ .setActivePage(activeEditor);
+ }
+ if (activeEditor != null) {
+ ISelectionProvider selectionProvider = activeEditor.getSite()
+ .getSelectionProvider();
+ if (selectionProvider != null) {
+ SelectionChangedEvent event = new SelectionChangedEvent(
+ selectionProvider, selectionProvider.getSelection());
+ ((MultiPageSelectionProvider) getSite().getSelectionProvider())
+ .fireSelectionChanged(event);
+ }
+ }
+ }
+
+ private void disposePart(final IWorkbenchPart part) {
+ SafeRunner.run(new SafeRunnable() {
+ public void run() {
+ if (part.getSite() instanceof MultiPageEditorSite) {
+ MultiPageEditorSite partSite = (MultiPageEditorSite) part
+ .getSite();
+ partSite.dispose();
+ }
+ part.dispose();
+ }
+
+ public void handleException(Throwable e) {
+ }
+ });
+ }
+
+ public void removePage(int pageIndex) {
+ Assert.isTrue(pageIndex >= 0 && pageIndex < getPageCount());
+ IEditorPart editor = getEditor(pageIndex);
+ getItem(pageIndex).dispose();
+ if (editor != null) {
+ nestedEditors.remove(editor);
+ disposePart(editor);
+ }
+ }
+
+ protected void setActivePage(int pageIndex) {
+ Assert.isTrue(pageIndex >= 0 && pageIndex < getPageCount());
+ getTabFolder().setSelection(pageIndex);
+ }
+
+ protected void setControl(int pageIndex, Control control) {
+ getItem(pageIndex).setControl(control);
+ }
+
+ public void setFocus() {
+ setFocus(getActivePage());
+ }
+
+ private void setFocus(int pageIndex) {
+ final IKeyBindingService service = getSite().getKeyBindingService();
+ if (pageIndex < 0 || pageIndex >= getPageCount()) {
+ if (service instanceof INestableKeyBindingService) {
+ final INestableKeyBindingService nestableService = (INestableKeyBindingService)
service;
+ nestableService.activateKeyBindingService(null);
+ }
+ return;
+ }
+
+ IEditorPart editor = getEditor(pageIndex);
+ if (editor != null) {
+ editor.setFocus();
+ if (service instanceof INestableKeyBindingService) {
+ INestableKeyBindingService nestableService = (INestableKeyBindingService) service;
+ if (editor != null) {
+ nestableService.activateKeyBindingService(editor
+ .getEditorSite());
+ } else {
+ nestableService.activateKeyBindingService(null);
+ }
+ }
+ } else {
+ if (service instanceof INestableKeyBindingService) {
+ INestableKeyBindingService nestableService = (INestableKeyBindingService) service;
+ nestableService.activateKeyBindingService(null);
+ }
+
+ Control control = getControl(pageIndex);
+ if (control != null) {
+ control.setFocus();
+ }
+ }
+ }
+
+ protected void setPageImage(int pageIndex, Image image) {
+ getItem(pageIndex).setImage(image);
+ }
+
+ protected void setPageText(int pageIndex, String text) {
+ getItem(pageIndex).setText(text);
+ }
}