/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.e4.ui.compatibility; import org.eclipse.gef.editparts.ZoomListener; import org.eclipse.gef.editparts.ZoomManager; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.menus.WorkbenchWindowControlContribution; /** * @author Enrico Persiani */ public class ZoomControlContribution extends WorkbenchWindowControlContribution implements IPartListener, FocusListener, SelectionListener, ZoomListener { private IWorkbenchPage activePage; private ZoomManager zoomManager; private Combo combo; public ZoomControlContribution() { } @Override protected Control createControl(Composite parent) { GridLayout layout = new GridLayout(1, false); layout.marginTop = SWT.DEFAULT; layout.marginHeight = layout.marginWidth = 0; Composite container = new Composite(parent, SWT.NONE); container.setLayout(layout); GridData layoutData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); layoutData.widthHint = 100; combo = new Combo(container, SWT.DROP_DOWN); combo.setLayoutData(layoutData); combo.addSelectionListener(this); combo.addFocusListener(this); try { activePage = getWorkbenchWindow().getActivePage(); activePage.addPartListener(this); setZoomManager((ZoomManager) activePage.getActivePart().getAdapter(ZoomManager.class)); } catch (Exception e) { } return container; } @Override protected int computeWidth(Control control) { return combo.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x; } @Override public void dispose() { if (activePage != null) activePage.removePartListener(this); if (zoomManager != null) zoomManager.removeZoomListener(this); if (combo != null) { combo.removeFocusListener(this); combo.removeSelectionListener(this); } } @Override public void partActivated(IWorkbenchPart part) { setZoomManager((ZoomManager) part.getAdapter(ZoomManager.class)); } @Override public void partBroughtToTop(IWorkbenchPart part) { } @Override public void partClosed(IWorkbenchPart part) { } @Override public void partDeactivated(IWorkbenchPart part) { } @Override public void partOpened(IWorkbenchPart part) { } public void widgetSelected(SelectionEvent event) { setZoomAndUpdate(event); } public void widgetDefaultSelected(SelectionEvent event) { setZoomAndUpdate(event); } @Override public void focusGained(FocusEvent event) { } @Override public void focusLost(FocusEvent event) { update(false); } @Override public void zoomChanged(double zoom) { update(false); } protected void setZoomAndUpdate(SelectionEvent event) { if (zoomManager == null) return; zoomManager.setZoomAsText(combo.getSelectionIndex() >= 0 ? combo.getItem(combo.getSelectionIndex()) : combo.getText()); update(false); } protected void setZoomManager(ZoomManager zoomManager) { if (this.zoomManager == zoomManager) return; if (this.zoomManager != null) this.zoomManager.removeZoomListener(this); if ((this.zoomManager = zoomManager) != null) this.zoomManager.addZoomListener(this); update(true); } protected void update(boolean repopulate) { if (combo.isDisposed()) return; boolean hasUpdateManager = zoomManager != null; if (hasUpdateManager) { if (repopulate) combo.setItems(zoomManager.getZoomLevelsAsText()); String zoom = zoomManager.getZoomAsText(); int index = combo.indexOf(zoom); combo.setText(zoom); if (index != -1) combo.select(index); } else combo.setText(""); combo.setEnabled(hasUpdateManager); } }