blob: 7760f9b34a3572faa9ce8fcb9144f7e9e24a7754 [file] [log] [blame]
/*******************************************************************************
* Copyright 2005-2006, CHISEL Group, University of Victoria, Victoria, BC,
* Canada. 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: The Chisel Group, University of Victoria
******************************************************************************/
package org.eclipse.zest.core.viewers;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuAdapter;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.CoolBar;
import org.eclipse.swt.widgets.CoolItem;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.zest.core.viewers.internal.ZoomListener;
import org.eclipse.zest.core.viewers.internal.ZoomManager;
/**
* A contribution item that adds a combo to a toolbar or coolbar, or a list of
* zooms to a menu. Can only be used for one toolbar, coolbar, or menu.
*
* In order to use this item, let your workbench part implement
* IZoomableWorkbenchPart. If the workbench part then supplies a viewer that is
* zoomable, the combo or menu created by this item will be enabled.
*
* @author Del Myers
*
*/
//@tag zest.bug.156286-Zooming.fix : create a contribution item that can set zooming on Zest views.
public class ZoomContributionViewItem extends ContributionItem implements ZoomListener {
/**
* Zooms to fit the width.
*/
public static final String FIT_WIDTH = ZoomManager.FIT_WIDTH;
/**
* Zooms to fit the height.
*/
public static final String FIT_HEIGHT = ZoomManager.FIT_HEIGHT;
/**
* Zooms to fit entirely within the viewport.
*/
public static final String FIT_ALL = ZoomManager.FIT_ALL;
private String[] zoomLevels;
private ZoomManager zoomManager;
private Combo combo;
private Menu fMenu;
private MenuAdapter menuAdapter = new MenuAdapter() {
public void menuShown(MenuEvent e) {
refresh(true);
}
};
/**
* Creates a new contribution item that will work on the given part
* service.initialZooms will be used to populate the combo or the menu.
* Valid values for initialZooms are percentage numbers (e.g., "100%"), or
* FIT_WIDTH, FIT_HEIGHT, FIT_ALL.
*
* @param partService
* service used to see whether the view is zoomable.
*/
public ZoomContributionViewItem(IZoomableWorkbenchPart part) {
zoomManager = part.getZoomableViewer().getZoomManager();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu,
* int)
*/
public void fill(Menu menu, int index) {
if (this.fMenu == null || this.fMenu != menu) {
if (this.fMenu != null) {
this.fMenu.removeMenuListener(menuAdapter);
this.fMenu = null;
}
this.fMenu = menu;
menu.addMenuListener(menuAdapter);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.CoolBar,
* int)
*/
public void fill(CoolBar parent, int index) {
CoolItem item = new CoolItem(parent, SWT.DROP_DOWN);
Combo combo = createCombo(parent);
item.setControl(combo);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.ToolBar,
* int)
*/
public void fill(ToolBar parent, int index) {
ToolItem item = new ToolItem(parent, SWT.SEPARATOR, index);
Combo combo = createCombo(parent);
item.setControl(combo);
item.setWidth(combo.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
}
private Combo createCombo(Composite parent) {
this.combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
if (zoomLevels == null) {
zoomLevels = zoomManager.getZoomLevelsAsText();
}
this.combo.setItems(zoomLevels);
this.combo.addSelectionListener(new SelectionAdapter() {
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e) {
int selection = combo.getSelectionIndex();
if (selection > 0) {
doZoom(combo.getItem(selection));
} else {
doZoom(combo.getItem(0));
}
}
});
this.combo.pack();
return this.combo;
}
private void doZoom(String zoom) {
if (zoomManager != null) {
zoomManager.setZoomAsText(zoom);
}
}
private void refresh(boolean rebuild) {
//
if (combo != null && !combo.isDisposed()) {
refreshCombo(rebuild);
} else if (fMenu != null && !fMenu.isDisposed()) {
refreshMenu(rebuild);
}
}
/**
* @param rebuild
*/
private void refreshMenu(boolean rebuild) {
fMenu.setEnabled(false);
if (zoomManager == null) {
return;
}
if (rebuild) {
zoomLevels = zoomManager.getZoomLevelsAsText();
MenuItem[] oldItems = fMenu.getItems();
for (int i = 0; i < oldItems.length; i++) {
if (oldItems[i].getData() == this) {
oldItems[i].dispose();
}
}
for (int i = 0; i < zoomLevels.length; i++) {
MenuItem item = new MenuItem(fMenu, SWT.RADIO);
item.setText(zoomLevels[i]);
item.setData(this);
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
MenuItem source = (MenuItem) e.getSource();
doZoom(source.getText());
}
});
}
}
String zoom = zoomManager.getZoomAsText();
MenuItem[] items = fMenu.getItems();
for (int i = 0; i < items.length; i++) {
MenuItem item = items[i];
if (item.getData() == this) {
item.setSelection(false);
if (zoom.equalsIgnoreCase(item.getText())) {
item.setSelection(true);
}
}
}
fMenu.setEnabled(true);
}
/**
* @param rebuild
*/
private void refreshCombo(boolean rebuild) {
combo.setEnabled(false);
if (zoomManager == null) {
return;
}
if (rebuild) {
combo.setItems(zoomManager.getZoomLevelsAsText());
}
String zoom = zoomManager.getZoomAsText();
int index = combo.indexOf(zoom);
if (index > 0) {
combo.select(index);
}
combo.setEnabled(true);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.ZoomListener#zoomChanged(double)
*/
public void zoomChanged(double z) {
refresh(false);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.ContributionItem#dispose()
*/
public void dispose() {
if (combo != null) {
combo = null;
}
if (fMenu != null) {
fMenu = null;
}
// @tag zest.bug.159667-ZoomDispose : make sure that we no longer listen to the part service.
super.dispose();
}
}