/******************************************************************************* * 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(); } }