aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/XmlEditorMultiOutline.java
diff options
context:
space:
mode:
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.java221
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) {
+ }
+ }
+}