/******************************************************************************* * 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.tests.views.properties.tabbed.override.tablist; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsSelection; import org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsView; import org.eclipse.ui.tests.views.properties.tabbed.model.Element; import org.eclipse.ui.views.properties.tabbed.ISection; import org.eclipse.ui.views.properties.tabbed.ITabItem; import org.eclipse.ui.views.properties.tabbed.TabContents; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; /** * The content manager for the override tests example for the tabbed property * sheet page. * <p> * The OverrideTestsView TabbedPropertySheetPage example is a look at the * properties view after the migration of a TabFolder/TabItem framework to the * tabbed properties view. In the case of a TabFolder, the folder (provider) * knows both the tab labels and tab items. This aligns to the tabbed properties * view, but the tab labels are tab descriptors and tab items are section * descriptions. This does not work with the default framework as the tabs * provide the sections. In this case, the IOverridableTabListContentProvider * framework has been provided. * <p> * The overridable tab list is a content provider that provides both the * sections and the tab labels. * * @author Anthony Hunter * @since 3.4 */ public class OverrideTestsTabListsContentsManager { private Element activeElement; private IOverrideTestsTabList activeFolder; private ITabItem[] activeTabs; private Composite composite; private IOverrideTestsTabList emptyFolder; private IOverrideTestsTabList[] folders; private boolean processingUpdateTabs; private OverrideTestsView sampleView; private ISection section; private TabbedPropertySheetPage tabbedPropertySheetPage; public OverrideTestsTabListsContentsManager(Composite aComposite, TabbedPropertySheetPage aTabbedPropertySheetPage, ISection aSection) { this.composite = aComposite; this.section = aSection; this.tabbedPropertySheetPage = aTabbedPropertySheetPage; this.folders = new IOverrideTestsTabList[] { new BasicTabList(), new AdvancedTabList() }; this.emptyFolder = new EmptyTabList(); } private boolean compareTab(OverrideTestsTabItem a, OverrideTestsTabItem b) { return a.getItem().equals(b.getItem()) && a.isSelected() == b.isSelected() && a.getText().equals(b.getText()); } private boolean compareTabs(ITabItem[] a, ITabItem[] b) { if (a != null && b != null) { if (a.length != b.length) { return false; } for (int i = 0; i < a.length; i++) { if (!compareTab((OverrideTestsTabItem) a[i], (OverrideTestsTabItem) b[i])) { return false; } } return true; } return a == null && b == null; } public void dispose() { if (activeFolder != null) { activeFolder.dispose(); } } public ITabItem[] getTabs() { if (activeFolder != null) { return activeFolder.getTabs(); } return new ITabItem[] {}; } public void selectionChanged(IWorkbenchPart part, ISelection selection) { if (composite.isDisposed()) { return; } if (processingUpdateTabs) { return; } if (!validateSection()) { return; } Assert.isTrue(part instanceof OverrideTestsView); this.sampleView = (OverrideTestsView) part; Assert.isTrue(selection instanceof OverrideTestsSelection); Element newElement = ((OverrideTestsSelection) selection).getElement(); IOverrideTestsTabList newFolder = null; if (newElement == null) { newFolder = emptyFolder; } else { for (int i = 0; i < folders.length; i++) { if (folders[i].appliesTo(newElement)) { newFolder = folders[i]; break; } } } if (newFolder != activeFolder) { if (activeFolder != null) { activeFolder.dispose(); activeFolder = null; } activeFolder = newFolder; if (newElement != null) { activeFolder.selectionChanged(newElement); } newFolder.createControls(composite); composite.layout(true); } else if (newElement != activeElement) { activeFolder.dispose(); if (newElement != null) { activeFolder.selectionChanged(newElement); } activeFolder.createControls(composite); composite.layout(true); activeElement = newElement; return; } ITabItem[] newTabs = activeFolder.getTabs(); if (!compareTabs(newTabs, activeTabs)) { processingUpdateTabs = true; tabbedPropertySheetPage.overrideTabs(); processingUpdateTabs = false; activeTabs = newTabs; } } public void selectTab(int index) { if (activeTabs == null) { return; } OverrideTestsTabItem selectedTab = (OverrideTestsTabItem) activeTabs[index]; sampleView.setSelection(selectedTab.getItem().getElement()); OverrideTestsSelection selection = (OverrideTestsSelection) sampleView .getSelection(); Element newElement = selection.getElement(); activeFolder.dispose(); activeFolder.selectionChanged(newElement); activeFolder.createControls(composite); composite.layout(true); activeElement = newElement; activeTabs = getTabs(); } /** * Returns true if the section is valid. */ private boolean validateSection() { TabContents tab = tabbedPropertySheetPage.getCurrentTab(); if (tab != null) { ISection[] sections = tab.getSections(); if (sections != null) { for (int i = 0; i < sections.length; i++) { if (sections[i] == section) { return true; } } } } return false; } }