blob: b3940d7ca20f784be533481493f38251e7758ff4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.views.properties.tabbed.view;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.IContributedContentsView;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.AbstractOverridableTabListPropertySection;
import org.eclipse.ui.views.properties.tabbed.IOverridableTabListContentProvider;
import org.eclipse.ui.views.properties.tabbed.ISection;
import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
import org.eclipse.ui.views.properties.tabbed.ITabItem;
import org.eclipse.ui.views.properties.tabbed.ITabSelectionListener;
import org.eclipse.ui.views.properties.tabbed.TabContents;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
/**
* An extended implementation of the content provider for the tabbed property
* sheet page's list of tabs.
* <p>
* This implementation allows the section to override the list of what tabs are
* displayed, rather than using the default list of tabs from the tabbed
* property registry.
*
* @author Anthony Hunter
* @since 3.4
*/
public class OverridableTabListContentProvider extends TabListContentProvider
implements IOverridableTabListContentProvider, ITabSelectionListener {
/**
* Constructor for OverrideTabListContentProvider.
*
* @param registry
* the tabbed property registry.
*/
public OverridableTabListContentProvider(TabbedPropertyRegistry registry) {
super(registry);
}
private TabbedPropertySheetPage tabbedPropertySheetPage;
private TabbedPropertyViewer tabbedPropertyViewer;
/**
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
if (tabbedPropertySheetPage.getCurrentTab() == null) {
/*
* In this case, return the default list of tabs from the registry.
* The contributor will not have had a chance to load and override
* the tabs.
*/
return registry.getTabDescriptors(currentPart,
(ISelection) inputElement);
}
return getOverrideTabs(inputElement);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.views.properties.tabbed.view.TabListContentProvider#dispose()
*/
public void dispose() {
stopListening();
this.tabbedPropertyViewer = null;
this.currentPart = null;
this.tabbedPropertySheetPage = null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.views.properties.tabbed.view.TabListContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
* java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (tabbedPropertyViewer == null) {
Assert.isTrue(viewer instanceof TabbedPropertyViewer);
init((TabbedPropertyViewer) viewer);
}
}
/**
* Initialize the content provider for a tabbed property viewer.
*
* @param tabbedPropertyViewer
* a tabbed property viewer.
*/
private void init(TabbedPropertyViewer newTabbedPropertyViewer) {
this.tabbedPropertyViewer = newTabbedPropertyViewer;
currentPart = tabbedPropertyViewer.getWorkbenchPart();
if (currentPart.getAdapter(IPropertySheetPage.class) != null) {
tabbedPropertySheetPage = (TabbedPropertySheetPage) currentPart
.getAdapter(IPropertySheetPage.class);
} else {
/*
* Is the part is a IContributedContentsView for the contributor,
* for example, outline view.
*/
IContributedContentsView view = (IContributedContentsView) currentPart
.getAdapter(IContributedContentsView.class);
if (view != null) {
IWorkbenchPart part = view.getContributingPart();
if (part != null) {
tabbedPropertySheetPage = (TabbedPropertySheetPage) part
.getAdapter(IPropertySheetPage.class);
}
}
}
Assert
.isNotNull(
tabbedPropertySheetPage,
"DynamicTabListContentProvider could not find the TabbedPropertySheetPage for the active part");//$NON-NLS-1$
startListening();
}
/**
* Start listening to tab selection change events.
*/
private void startListening() {
tabbedPropertySheetPage.addTabSelectionListener(this);
}
/**
* Stop listening to tab selection change events.
*/
private void stopListening() {
tabbedPropertySheetPage.removeTabSelectionListener(this);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.views.properties.tabbed.ITabSelectionListener#tabSelected(org.eclipse.ui.views.properties.tabbed.ITabDescriptor)
*/
public void tabSelected(ITabDescriptor tabDescriptor) {
AbstractOverridableTabListPropertySection section = getOverridableTabListPropertySection();
Assert.isNotNull(section);
int selectedIndex = tabbedPropertyViewer.getSelectionIndex();
section.selectTab(selectedIndex);
}
/**
* set the selected tab from the list of tabs provided by the section.
*/
private void setSelectedTab() {
TabDescriptor currentSelectedTabInList = null;
IStructuredSelection selectionFromList = (IStructuredSelection) tabbedPropertyViewer
.getSelection();
if (!selectionFromList.equals(StructuredSelection.EMPTY)) {
currentSelectedTabInList = (TabDescriptor) selectionFromList
.getFirstElement();
}
AbstractOverridableTabListPropertySection section = getOverridableTabListPropertySection();
if (section == null) {
if (currentSelectedTabInList == null) {
/*
* make sure there is a selected tab in the list.
*/
TabDescriptor newSelectedTab = (TabDescriptor) tabbedPropertyViewer
.getElementAt(0);
if (newSelectedTab != null) {
tabbedPropertyViewer.setSelection(new StructuredSelection(
newSelectedTab), true);
}
}
return;
}
ITabItem[] dynamicTabItems = section.getTabs();
if (dynamicTabItems == null) {
/*
* if the section does not provide overridden tabs, return.
*/
return;
}
int selectedTabIndex = -1;
for (int i = 0; i < dynamicTabItems.length; i++) {
if (dynamicTabItems[i].isSelected()) {
selectedTabIndex = i;
}
}
if (currentSelectedTabInList == null ||
!currentSelectedTabInList.getText().equals(
dynamicTabItems[selectedTabIndex].getText())) {
TabDescriptor newSelectedTab = (TabDescriptor) tabbedPropertyViewer
.getElementAt(selectedTabIndex);
tabbedPropertyViewer.setSelection(new StructuredSelection(
newSelectedTab), true);
}
}
/**
* Get the list of tabs to display in the tabbed property sheet page.
*
* @param inputElement
* The current input element.
* @return the list of tabs.
*/
private ITabDescriptor[] getOverrideTabs(Object inputElement) {
ITabDescriptor tabDescriptors[] = registry.getTabDescriptors(
currentPart, (ISelection) inputElement);
if (tabDescriptors == TabbedPropertyRegistry.EMPTY_DESCRIPTOR_ARRAY) {
/*
* We clone the dynamic tabs from the single tab in the registry. If
* the registry has no tabs for the selection, return.
*/
return tabDescriptors;
}
AbstractOverridableTabListPropertySection section = getOverridableTabListPropertySection();
Assert.isNotNull(section);
ITabItem[] tabItems = section.getTabs();
if (tabItems == null) {
/*
* if the section does not provide overridden tabs, return the
* default tabs from the registry.
*/
return tabDescriptors;
}
ITabDescriptor[] overrideTabDescriptors = new ITabDescriptor[tabItems.length];
TabDescriptor target = (TabDescriptor) tabDescriptors[0];
for (int i = 0; i < tabItems.length; i++) {
TabDescriptor cloneTabDescriptor = (TabDescriptor) target.clone();
cloneTabDescriptor.setLabel(tabItems[i].getText());
cloneTabDescriptor.setImage(tabItems[i].getImage());
cloneTabDescriptor.setIndented(tabItems[i].isIndented());
cloneTabDescriptor.setSelected(tabItems[i].isSelected());
overrideTabDescriptors[i] = cloneTabDescriptor;
// System.out.print("override " + i + " [" + //$NON-NLS-1$//$NON-NLS-2$
// tabItems[i].getText() + "]");//$NON-NLS-1$
// if (tabItems[i].isSelected()) {
// System.out.print(" selected");//$NON-NLS-1$
// }
// System.out.println("");//$NON-NLS-1$
}
return overrideTabDescriptors;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.views.properties.tabbed.IOverridableTabListContentProvider#overrideTabs()
*/
public void overrideTabs() {
stopListening();
Object input = tabbedPropertyViewer.getInput();
tabbedPropertyViewer.setInput(input);
setSelectedTab();
startListening();
}
/**
* Get the section implementation that provides the list of tabs. In our
* implementation, all the sections provide the list of tabs, so we select
* the first section from the tab descriptor.
*
* @return the section.
*/
private AbstractOverridableTabListPropertySection getOverridableTabListPropertySection() {
TabContents tab = tabbedPropertySheetPage.getCurrentTab();
Assert.isNotNull(tab);
if (tab != null) {
ISection section = tab.getSectionAtIndex(0);
if (section instanceof AbstractOverridableTabListPropertySection) {
return (AbstractOverridableTabListPropertySection) section;
}
}
return null;
}
}