/******************************************************************************* * Copyright (c) 2004, 2005 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.presentations.defaultpresentation; import org.eclipse.jface.util.Geometry; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.custom.ViewForm; 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.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.internal.dnd.DragUtil; import org.eclipse.ui.internal.layout.SizeCache; import org.eclipse.ui.internal.presentations.util.AbstractTabFolder; import org.eclipse.ui.internal.presentations.util.AbstractTabItem; import org.eclipse.ui.internal.presentations.util.PartInfo; import org.eclipse.ui.internal.presentations.util.ProxyControl; import org.eclipse.ui.internal.presentations.util.StandardSystemToolbar; import org.eclipse.ui.internal.presentations.util.TabFolderEvent; import org.eclipse.ui.internal.util.Util; /** * @since 3.1 */ public class NativeTabFolder extends AbstractTabFolder { private TabFolder control; private ViewForm viewForm; private StandardSystemToolbar systemToolbar; private CLabel title; private ProxyControl topCenter; private SizeCache topCenterCache; private Listener selectionListener = new Listener() { public void handleEvent(Event e) { fireEvent(TabFolderEvent.EVENT_TAB_SELECTED, getTab(e.item)); } }; private IPropertyListener systemToolbarListener = new IPropertyListener() { public void propertyChanged(Object source, int propId) { Point location; if (propId == TabFolderEvent.EVENT_PANE_MENU) { location = getPaneMenuLocation(); } else { location = new Point(0,0); } fireEvent(propId, getSelection(), location); } }; public NativeTabFolder(Composite parent) { control = new TabFolder(parent, SWT.BOTTOM); control.addListener(SWT.Selection, selectionListener); attachListeners(control, false); viewForm = new ViewForm(control, SWT.FLAT); attachListeners(viewForm, false); systemToolbar = new StandardSystemToolbar(viewForm, true, false, true, true, true); systemToolbar.addListener(systemToolbarListener); viewForm.setTopRight(systemToolbar.getControl()); topCenter = new ProxyControl(viewForm); topCenterCache = new SizeCache(); title = new CLabel(viewForm, SWT.LEFT); attachListeners(title, false); viewForm.setTopLeft(title); } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#computeSize(int, int) */ public Point computeSize(int widthHint, int heightHint) { return new Point(50, 50); } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#add(int) */ public AbstractTabItem add(int index, int flags) { NativeTabItem item = new NativeTabItem(this, index); item.getWidget().setData(item); return item; } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#layout(boolean) */ public void layout(boolean flushCache) { super.layout(flushCache); Rectangle oldBounds = viewForm.getBounds(); Rectangle newBounds = control.getClientArea(); viewForm.setBounds(newBounds); if (Util.equals(oldBounds, newBounds)) { viewForm.layout(flushCache); } } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getPaneMenuLocation() */ public Point getPaneMenuLocation() { return systemToolbar.getPaneMenuLocation(); } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#setState(int) */ public void setState(int state) { super.setState(state); systemToolbar.setState(state); } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getClientArea() */ public Rectangle getClientArea() { Control content = viewForm.getContent(); if (content == null) { return new Rectangle(0,0,0,0); } return Geometry.toControl(control, DragUtil.getDisplayBounds(content)); } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getItems() */ public AbstractTabItem[] getItems() { TabItem[] items = control.getItems(); AbstractTabItem[] result = new AbstractTabItem[items.length]; for (int i = 0; i < result.length; i++) { result[i] = getTab(items[i]); } return result; } /** * @param item * @return * @since 3.1 */ private AbstractTabItem getTab(Widget item) { return (AbstractTabItem)item.getData(); } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#setSelection(org.eclipse.ui.internal.presentations.util.Widget) */ public void setSelection(AbstractTabItem toSelect) { if (toSelect == null) { return; } NativeTabItem tab = (NativeTabItem) toSelect; control.setSelection(new TabItem[] {(TabItem)tab.getWidget()}); } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#setSelectedInfo(org.eclipse.ui.internal.presentations.util.PartInfo) */ public void setSelectedInfo(PartInfo info) { if (!Util.equals(title.getText(), info.title)) { title.setText(info.title); } if (title.getImage() != info.image) { title.setImage(info.image); } } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getToolbarParent() */ public Composite getToolbarParent() { return viewForm; } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getTabArea() */ public Rectangle getTabArea() { Rectangle bounds = control.getBounds(); Rectangle clientArea = control.getClientArea(); bounds.x = 0; bounds.y = 0; Geometry.expand(bounds, 0, 0, - (clientArea.height + clientArea.y), 0); return Geometry.toDisplay(control.getParent(), bounds); } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#setToolbar(org.eclipse.swt.widgets.Control) */ public void setToolbar(Control toolbarControl) { if (toolbarControl != null) { topCenterCache.setControl(toolbarControl); topCenter.setTarget(topCenterCache); viewForm.setTopCenter(topCenter.getControl()); } else { topCenterCache.setControl(null); topCenter.setTarget(null); viewForm.setTopCenter(null); } super.setToolbar(toolbarControl); } public Control getControl() { return control; } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#isOnBorder(org.eclipse.swt.graphics.Point) */ public boolean isOnBorder(Point globalPos) { Point localPos = getControl().toControl(globalPos); Rectangle clientArea = getClientArea(); return localPos.y > clientArea.y && localPos.y < clientArea.y + clientArea.height; } public AbstractTabItem getSelection() { TabItem[] sel = control.getSelection(); if (sel.length == 0) { return null; } return getTab(sel[0]); } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getContentParent() */ public Composite getContentParent() { return viewForm; } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#setContent(org.eclipse.swt.widgets.Control) */ public void setContent(Control newContent) { viewForm.setContent(newContent); } /** * @return * @since 3.1 */ public TabFolder getTabFolder() { return control; } /** * @param item * @param newTitle * @since 3.1 */ /* protected */ void setSelectedTitle(String newTitle) { title.setText(newTitle); } /** * @param image * @since 3.1 */ /* protected */ void setSelectedImage(Image image) { title.setImage(image); } /* (non-Javadoc) * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getItem(org.eclipse.swt.graphics.Point) */ public AbstractTabItem getItem(Point toFind) { return getSelection(); } /** * @param enabled * @since 3.1 */ public void enablePaneMenu(boolean enabled) { systemToolbar.enablePaneMenu(enabled); } }