// ================================================================== // CTabFolderStackPresentation.java // ================================================================== // IBM Confidential // OCO Source Materials // � Copyright IBM Corp. 2005 // ================================================================== package org.eclipse.swt.nebula.presentations.shelf; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabFolder2Listener; import org.eclipse.swt.custom.CTabFolderEvent; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.presentations.IPresentablePart; import org.eclipse.ui.presentations.IStackPresentationSite; import org.eclipse.ui.presentations.StackDropResult; import org.eclipse.ui.presentations.StackPresentation; import java.net.URL; /** * * * @author chris.gross@us.ibm.com * @since 2.0.0 */ public class CTabFolderStackPresentation extends StackPresentation { private static final String DATAKEY_PART = "IPresentablePart"; private static final String DATAKEY_ANIMATION = "Busy Anim Player"; private Composite partParent; private CTabFolder tabFolder; private boolean ignoreSelection; private Image[] busyImages; /** * @param stackSite */ public CTabFolderStackPresentation(IStackPresentationSite stackSite, Composite parent) { super(stackSite); partParent = parent; tabFolder = new CTabFolder(parent, SWT.BORDER | SWT.FLAT | SWT.CLOSE); tabFolder.setMaximizeVisible(true); //tabFolder.setSimple(false); tabFolder.setTabHeight(tabFolder.getTabHeight() + 6); tabFolder.setSelectionForeground(tabFolder.getDisplay().getSystemColor(SWT.COLOR_TITLE_FOREGROUND)); Color[] colors = new Color[]{tabFolder.getDisplay().getSystemColor(SWT.COLOR_TITLE_BACKGROUND_GRADIENT),tabFolder.getDisplay().getSystemColor(SWT.COLOR_TITLE_BACKGROUND)}; tabFolder.setSelectionBackground(colors, new int[]{50}, true); tabFolder.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (event.item == null) return; if (!ignoreSelection) getSite().selectPart((IPresentablePart)event.item.getData(DATAKEY_PART)); } }); tabFolder.addCTabFolder2Listener(new CTabFolder2Listener() { public void showList(CTabFolderEvent event) { } public void restore(CTabFolderEvent event) { getSite().setState(IStackPresentationSite.STATE_RESTORED); } public void minimize(CTabFolderEvent event) { getSite().setState(IStackPresentationSite.STATE_MINIMIZED); } public void maximize(CTabFolderEvent event) { getSite().setState(IStackPresentationSite.STATE_MAXIMIZED); } public void close(CTabFolderEvent event) { IPresentablePart part = (IPresentablePart)event.item.getData(DATAKEY_PART); getSite().close(new IPresentablePart[]{part}); } }); tabFolder.addListener(SWT.MouseDoubleClick, new Listener() { public void handleEvent(Event event) { if (event.y > tabFolder.getTabHeight()) return; if (getSite().getState() == IStackPresentationSite.STATE_MAXIMIZED) { getSite().setState(IStackPresentationSite.STATE_RESTORED); } else { getSite().setState(IStackPresentationSite.STATE_MAXIMIZED); } } }); Menu contextMenu = new Menu(tabFolder); MenuItem close = new MenuItem(contextMenu,SWT.NONE); close.setText("Close"); close.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { IPresentablePart part = getSite().getSelectedPart(); if (part == null) return; getSite().close(new IPresentablePart[]{part}); } }); MenuItem closeOthers = new MenuItem(contextMenu,SWT.NONE); closeOthers.setText("Close Others"); closeOthers.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { IPresentablePart part = getSite().getSelectedPart(); if (part == null) return; IPresentablePart[] parts = getSite().getPartList(); if (parts.length < 2) return; IPresentablePart[] closeParts = new IPresentablePart[parts.length - 1]; int j = 0; for (int i = 0; i < parts.length; i++) { if (parts[i] != part) { closeParts[j] = parts[i]; j++; } } getSite().close(closeParts); } }); MenuItem closeAll = new MenuItem(contextMenu,SWT.NONE); closeAll.setText("Close All"); closeAll.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { IPresentablePart[] parts = getSite().getPartList(); if (parts == null) return; getSite().close(parts); } }); tabFolder.setMenu(contextMenu); //init busy images busyImages = new Image[8]; for (int i = 0; i < 8; i++) { URL imgURL = Platform.getBundle("org.eclipse.swt.nebula.presentations.shelf").getResource("icons/busy" + (i + 1) + ".gif"); Image img = ImageDescriptor.createFromURL(imgURL).createImage(); busyImages[i] = img; } } /** * {@inheritDoc} */ @Override public void addPart(final IPresentablePart newPart, Object cookie) { ignoreSelection = true; final CTabItem item = new CTabItem(tabFolder,SWT.NONE); ignoreSelection = false; item.setData(DATAKEY_PART,newPart); updateItem(newPart); newPart.addPropertyListener(new IPropertyListener() { public void propertyChanged(Object source, int propId) { updateItem(newPart); } }); } private void updateItem(final IPresentablePart part) { CTabItem item = getItem(part); String dirty = ""; if (part.isDirty()) dirty = "*"; item.setText(dirty + part.getName()); item.setImage(part.getTitleImage()); resizeSelectedPart(); if (part.isBusy() && item.getData(DATAKEY_ANIMATION) == null) { BusyItemAnimation busyAnim = new BusyItemAnimation(item); busyAnim.setImages(busyImages); item.setData(DATAKEY_ANIMATION,busyAnim); busyAnim.start(); } else if (!part.isBusy() && item.getData(DATAKEY_ANIMATION) != null) { BusyItemAnimation busyAnim = (BusyItemAnimation)item.getData(DATAKEY_ANIMATION); busyAnim.stop(); item.setData(DATAKEY_ANIMATION,null); item.setImage(part.getTitleImage()); } } /** * {@inheritDoc} */ @Override public void dispose() { tabFolder.dispose(); for (int i = 0; i < busyImages.length; i++) { busyImages[i].dispose(); } } /** * {@inheritDoc} */ @Override public StackDropResult dragOver(Control currentControl, Point location) { return null; } /** * {@inheritDoc} */ @Override public Control getControl() { return tabFolder; } /** * {@inheritDoc} */ @Override public Control[] getTabList(IPresentablePart part) { // TODO Auto-generated method stub return null; } /** * {@inheritDoc} */ @Override public void removePart(IPresentablePart oldPart) { getItem(oldPart).dispose(); resizeSelectedPart(); } private CTabItem getItem(IPresentablePart part) { CTabItem[] items = tabFolder.getItems(); for (int i = 0; i < items.length; i++) { if (items[i].getData(DATAKEY_PART) == part) { return items[i]; } } return null; } /** * {@inheritDoc} */ @Override public void selectPart(IPresentablePart toSelect) { tabFolder.setSelection(getItem(toSelect)); IPresentablePart[] parts = getSite().getPartList(); for (int i = 0; i < parts.length; i++) { parts[i].setVisible(parts[i] == toSelect); } resizeSelectedPart(); } /** * {@inheritDoc} */ @Override public void setActive(int newState) { } /** * {@inheritDoc} */ @Override public void setBounds(Rectangle bounds) { tabFolder.setBounds(bounds); resizeSelectedPart(); } private void resizeSelectedPart() { IPresentablePart part = getSite().getSelectedPart(); if (part == null) return; CTabItem item = getItem(part); if (item == null) return; Rectangle bounds = tabFolder.getClientArea(); bounds = item.getDisplay().map(tabFolder, partParent, bounds); part.setBounds(bounds); } /** * {@inheritDoc} */ @Override public void setState(int state) { if (state == IStackPresentationSite.STATE_MAXIMIZED) tabFolder.setMaximized(true); if (state == IStackPresentationSite.STATE_RESTORED) { tabFolder.setMaximized(false); tabFolder.setMinimized(false); } if (state == IStackPresentationSite.STATE_MINIMIZED) tabFolder.setMinimized(true); } /** * {@inheritDoc} */ @Override public void setVisible(boolean isVisible) { tabFolder.setVisible(isVisible); if (getSite().getSelectedPart() == null) return; getSite().getSelectedPart().setVisible(isVisible); if (getSite().getSelectedPart().getToolBar() != null) getSite().getSelectedPart().getToolBar().setVisible(isVisible); } /** * {@inheritDoc} */ @Override public void showPaneMenu() { } /** * {@inheritDoc} */ @Override public void showSystemMenu() { } }