blob: 64c73c125e720402e341167bc75d1de2b0a8f2be [file] [log] [blame]
/*******************************************************************************
* 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);
}
}