blob: 61db9f31338e3a950c2caa92434ff9d8107cf96c [file] [log] [blame]
/*
* 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) {
}
}
}