diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/XmlEditorMultiOutline.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/XmlEditorMultiOutline.java | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/XmlEditorMultiOutline.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/XmlEditorMultiOutline.java new file mode 100644 index 000000000..61db9f313 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/XmlEditorMultiOutline.java @@ -0,0 +1,221 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.adt.internal.editors; + +import com.android.ide.eclipse.adt.AdtPlugin; + +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IStatusLineManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.part.IPageBookViewPage; +import org.eclipse.ui.part.Page; +import org.eclipse.ui.part.PageBook; +import org.eclipse.ui.views.contentoutline.IContentOutlinePage; + +import java.util.ArrayList; +import java.util.List; + +/** + * Outline used for XML editors that have multiple pages with separate outlines: + * switches between them + * <p> + * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=1917 + * <p> + * Modeled after .org.eclipse.pde.internal.ui.editor.PDEMultiPageContentOutline + */ +public class XmlEditorMultiOutline extends Page implements IContentOutlinePage, + ISelectionChangedListener { + private boolean mDisposed; + private PageBook mPageBook; + private IContentOutlinePage mCurrentPage; + private IActionBars mActionBars; + private IContentOutlinePage mEmptyPage; + private List<ISelectionChangedListener> mListeners; + private ISelection mSelection; + + public XmlEditorMultiOutline() { + } + + @Override + public Control getControl() { + return mPageBook; + } + + @Override + public void createControl(Composite parent) { + mPageBook = new PageBook(parent, SWT.NONE); + } + + @Override + public void dispose() { + mDisposed = true; + mListeners = null; + if (mPageBook != null && !mPageBook.isDisposed()) { + mPageBook.dispose(); + mPageBook = null; + } + if (mEmptyPage != null) { + mEmptyPage.dispose(); + mEmptyPage = null; + } + } + + public boolean isDisposed() { + return mDisposed; + } + + @Override + public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, + IStatusLineManager statusLineManager) { + } + + @Override + public void setActionBars(IActionBars actionBars) { + mActionBars = actionBars; + if (mCurrentPage != null) { + setPageActive(mCurrentPage); + } + } + + @Override + public void setFocus() { + if (mCurrentPage != null) { + mCurrentPage.setFocus(); + } + } + + @Override + public void addSelectionChangedListener(ISelectionChangedListener listener) { + if (mListeners == null) { + mListeners = new ArrayList<ISelectionChangedListener>(2); + } + mListeners.add(listener); + } + + @Override + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + mListeners.remove(listener); + } + + @Override + public ISelection getSelection() { + return mSelection; + } + + @Override + public void selectionChanged(SelectionChangedEvent event) { + setSelection(event.getSelection()); + } + + public void setPageActive(IContentOutlinePage page) { + if (page == null) { + if (mEmptyPage == null) { + mEmptyPage = new EmptyPage(); + } + page = mEmptyPage; + } + if (mCurrentPage != null) { + mCurrentPage.removeSelectionChangedListener(this); + } + page.addSelectionChangedListener(this); + mCurrentPage = page; + // Still initializing? + if (mPageBook == null) { + return; + } + Control control = page.getControl(); + if (control == null || control.isDisposed()) { + if (page instanceof IPageBookViewPage) { + try { + ((IPageBookViewPage) page).init(getSite()); + } catch (PartInitException e) { + AdtPlugin.log(e, null); + } + } + page.createControl(mPageBook); + page.setActionBars(mActionBars); + control = page.getControl(); + } + mPageBook.showPage(control); + } + + @Override + public void setSelection(ISelection selection) { + mSelection = selection; + if (mListeners != null) { + SelectionChangedEvent e = new SelectionChangedEvent(this, selection); + for (int i = 0; i < mListeners.size(); i++) { + mListeners.get(i).selectionChanged(e); + } + } + } + + private static class EmptyPage implements IContentOutlinePage { + private Composite mControl; + + private EmptyPage() { + } + + @Override + public void createControl(Composite parent) { + mControl = new Composite(parent, SWT.NULL); + } + + @Override + public void dispose() { + } + + @Override + public Control getControl() { + return mControl; + } + + @Override + public void setActionBars(IActionBars actionBars) { + } + + @Override + public void setFocus() { + } + + @Override + public void addSelectionChangedListener(ISelectionChangedListener listener) { + } + + @Override + public ISelection getSelection() { + return StructuredSelection.EMPTY; + } + + @Override + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + } + + @Override + public void setSelection(ISelection selection) { + } + } +} |