blob: adbb5e20996d90de6d0fe30d715ca1b2704e2f6f [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.util;
import org.eclipse.core.commands.common.EventManager;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.util.Geometry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
import org.eclipse.ui.internal.WorkbenchImages;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.presentations.IStackPresentationSite;
/**
* @since 3.1
*/
public class StandardSystemToolbar extends EventManager {
private ToolBarManager toolbarManager;
private Composite control;
private class SystemMenuContribution extends ContributionItem {
ToolItem item;
Image img;
String text;
int flags;
public SystemMenuContribution() {
this(SWT.PUSH);
}
public SystemMenuContribution(int flags) {
this.flags = flags;
}
public void setToolTipText(String text) {
this.text = text;
if (item != null) {
item.setToolTipText(text);
}
}
public void setImage(Image img) {
this.img = img;
if (item != null) {
item.setImage(img);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.ContributionItem#setVisible(boolean)
*/
public void setVisible(boolean visible) {
if (visible != isVisible()) {
toolbarManager.markDirty();
}
super.setVisible(visible);
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.ToolBar, int)
*/
public void fill(ToolBar parent, int index) {
if (!isVisible()) {
return;
}
item = new ToolItem(parent, flags, index);
if (img != null) {
item.setImage(img);
}
if (text != null) {
item.setToolTipText(text);
}
item.addSelectionListener(selectionListener);
}
}
private class PaneMenu extends SystemMenuContribution {
public PaneMenu() {
super(SWT.NONE);
}
public void setToolTipText(String text) {
super.setToolTipText(text);
}
public void setImage(Image img) {
super.setImage(img);
}
/* (non-Javadoc)
* @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.ToolBar, int)
*/
public void fill(ToolBar parent, int index) {
if (!isVisible()) {
return;
}
super.fill(parent, index);
}
}
private MouseListener mouseListener = new MouseAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.MouseAdapter#mouseDown(org.eclipse.swt.events.MouseEvent)
*/
public void mouseDown(MouseEvent e) {
ToolItem item = toolbarManager.getControl().getItem(new Point(e.x, e.y));
if (item == paneMenu.item && e.button == 1) {
fireEvent(TabFolderEvent.EVENT_PANE_MENU);
}
}
};
private SystemMenuContribution paneMenu = new PaneMenu();
private SystemMenuContribution showToolbar = new SystemMenuContribution();
private SystemMenuContribution min = new SystemMenuContribution();
private SystemMenuContribution max = new SystemMenuContribution();
private SystemMenuContribution close = new SystemMenuContribution();
private int state = IStackPresentationSite.STATE_RESTORED;
private boolean showingToolbar = true;
private SelectionAdapter selectionListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (e.widget == paneMenu.item) {
//fireEvent(TabFolderEvent.EVENT_PANE_MENU);
} else if (e.widget == showToolbar.item) {
if (showingToolbar) {
fireEvent(TabFolderEvent.EVENT_HIDE_TOOLBAR);
} else {
fireEvent(TabFolderEvent.EVENT_SHOW_TOOLBAR);
}
} else if (e.widget == min.item) {
if (state == IStackPresentationSite.STATE_MINIMIZED) {
fireEvent(TabFolderEvent.EVENT_RESTORE);
} else {
fireEvent(TabFolderEvent.EVENT_MINIMIZE);
}
} else if (e.widget == max.item) {
if (state == IStackPresentationSite.STATE_MAXIMIZED) {
fireEvent(TabFolderEvent.EVENT_RESTORE);
} else {
fireEvent(TabFolderEvent.EVENT_MAXIMIZE);
}
} else if (e.widget == close.item) {
fireEvent(TabFolderEvent.EVENT_CLOSE);
}
}
};
public StandardSystemToolbar(Composite parent, boolean showPaneMenu,
boolean showHideToolbar, boolean showMinimize, boolean showMaximize, boolean enableClose) {
control = new Composite(parent, SWT.NONE);
control.setLayout(new EnhancedFillLayout());
toolbarManager = new ToolBarManager(SWT.FLAT);
toolbarManager.createControl(control);
toolbarManager.getControl().addMouseListener(mouseListener);
toolbarManager.add(paneMenu);
paneMenu.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_VIEW_MENU_THIN));
paneMenu.setVisible(showPaneMenu);
paneMenu.setToolTipText(WorkbenchMessages.Menu);
toolbarManager.add(showToolbar);
showToolbar.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_HIDE_TOOLBAR_THIN));
showToolbar.setVisible(showHideToolbar);
toolbarManager.add(min);
min.setVisible(showMinimize);
toolbarManager.add(max);
max.setVisible(showMaximize);
toolbarManager.add(close);
close.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_CLOSE_VIEW_THIN));
close.setVisible(enableClose);
setState(IStackPresentationSite.STATE_RESTORED);
toolbarManager.update(true);
}
public Point getPaneMenuLocation() {
Rectangle bounds = Geometry.toDisplay(paneMenu.item.getParent(), paneMenu.item.getBounds());
return new Point(bounds.x, bounds.y + bounds.height);
}
public void enableClose(boolean enabled) {
close.setVisible(enabled);
toolbarManager.update(false);
}
public void enableMinimize(boolean enabled) {
min.setVisible(enabled);
toolbarManager.update(false);
}
public void enableMaximize(boolean enabled) {
max.setVisible(enabled);
toolbarManager.update(false);
}
public void enableShowToolbar(boolean enabled) {
showToolbar.setVisible(enabled);
toolbarManager.update(false);
}
public void enablePaneMenu(boolean enabled) {
paneMenu.setVisible(enabled);
toolbarManager.update(false);
}
/**
* Updates the icons on the state buttons to match the given state
* @param newState
* @since 3.1
*/
public void setState(int newState) {
if (min != null) {
if (newState == IStackPresentationSite.STATE_MINIMIZED) {
min.setToolTipText(WorkbenchMessages.StandardSystemToolbar_Restore);
min.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_RESTORE_VIEW_THIN));
} else {
min.setToolTipText(WorkbenchMessages.StandardSystemToolbar_Minimize);
min.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_MIN_VIEW_THIN));
}
}
if (max != null) {
if (newState == IStackPresentationSite.STATE_MAXIMIZED) {
max.setToolTipText(WorkbenchMessages.StandardSystemToolbar_Restore);
max.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_RESTORE_VIEW_THIN));
} else {
max.setToolTipText(WorkbenchMessages.StandardSystemToolbar_Maximize);
max.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_MAX_VIEW_THIN));
}
}
state = newState;
}
public void setToolbarShowing(boolean isShowing) {
showingToolbar = isShowing;
if (showToolbar != null) {
if (isShowing) {
showToolbar.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_HIDE_TOOLBAR_THIN));
} else {
showToolbar.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_SHOW_TOOLBAR_THIN));
}
}
}
public void addListener(IPropertyListener propertyListener) {
addListenerObject(propertyListener);
}
public void removeListener(IPropertyListener propertyListener) {
removeListenerObject(propertyListener);
}
public Control getControl() {
return control;
}
private void fireEvent(int event) {
Object[] list = getListeners();
for (int i = 0; i < list.length; i++) {
IPropertyListener listener = (IPropertyListener)list[i];
listener.propertyChanged(this, event);
}
}
}