/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.ui.update; import com.google.dart.tools.deploy.Activator; import com.google.dart.tools.update.core.Revision; import com.google.dart.tools.update.core.UpdateAdapter; import com.google.dart.tools.update.core.UpdateCore; import com.google.dart.tools.update.core.UpdateManager; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.util.Util; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.menus.WorkbenchWindowControlContribution; /** * Contributes the Settings/Update button control to the main dart editor toolbar. */ public class SettingsControlContribution extends UpdateAdapter implements DisposeListener { final class LinuxControl extends SettingsControl<Button> { LinuxControl(Composite composite) { super(new Button(composite, SWT.NO_FOCUS)); GridDataFactory.fillDefaults().indent(0, 0).grab(true, true).applyTo(control); } @Override void addSelectionListener(SelectionAdapter listener) { control.addSelectionListener(listener); } @Override void setImage(Image image) { control.setImage(image); } @Override void setToolTipText(String tooltipText) { control.setToolTipText(tooltipText); } } final class StandardControl extends SettingsControl<ToolItem> { StandardControl(Composite composite) { super(new ToolItem(new ToolBar(composite, SWT.NONE), SWT.DROP_DOWN | SWT.NO_TRIM)); } @Override void addSelectionListener(SelectionAdapter listener) { control.addSelectionListener(listener); } @Override void setImage(Image image) { control.setImage(image); } @Override void setToolTipText(String tooltipText) { control.setToolTipText(tooltipText); } } private abstract class SettingsControl<T extends Widget> { final T control; SettingsControl(T settingsButton) { this.control = settingsButton; refresh(); addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateState.performAction(controlContribution.getWorkbenchWindow()); } }); } abstract void addSelectionListener(SelectionAdapter listener); boolean isDisposed() { return control.isDisposed(); } void refresh() { setImage(updateState.getButtonImage()); setToolTipText(updateState.getTooltipText()); } abstract void setImage(Image image); abstract void setToolTipText(String tooltipText); } private static enum UpdateState { UNKNOWN("icons/full/obj16/wrench.gif", "Preferences") { @Override void performAction(IWorkbenchWindow window) { openPreferences(null); } }, AVAILABLE("icons/full/obj16/wrench-update.gif", "Update available") { @Override void performAction(IWorkbenchWindow window) { openPreferences(UpdatePreferencePage.PAGE_ID); } }; private final String imagePath; private final String tooltipText; UpdateState(String imagePath, String tooltipText) { this.imagePath = imagePath; this.tooltipText = tooltipText; } Image getButtonImage() { return Activator.getImage(imagePath); } String getTooltipText() { return tooltipText; } abstract void performAction(IWorkbenchWindow window); } private static void asyncExec(Runnable runnable) { Display.getDefault().asyncExec(runnable); } private static void openPreferences(final String preferencePageId) { asyncExec(new Runnable() { @Override public void run() { PreferencesUtil.createPreferenceDialogOn(null, preferencePageId, null, null).open(); } }); } private final WorkbenchWindowControlContribution controlContribution; private SettingsControl<? extends Widget> settingsButton; private UpdateState updateState = UpdateState.UNKNOWN; public SettingsControlContribution(WorkbenchWindowControlContribution controlContribution) { this.controlContribution = controlContribution; } public void createControl(Composite composite) { settingsButton = createSettingsControl(composite); composite.addDisposeListener(this); UpdateManager updateManager = UpdateCore.getUpdateManager(); updateManager.addListener(this); } @Override public void updateAvailable(Revision revision) { updateState = UpdateState.AVAILABLE; refreshButton(); } @Override public void widgetDisposed(DisposeEvent e) { UpdateCore.getUpdateManager().removeListener(this); } private SettingsControl<? extends Widget> createSettingsControl(Composite composite) { if (Util.isLinux()) { return new LinuxControl(composite); } return new StandardControl(composite); } private void refreshButton() { asyncExec(new Runnable() { @Override public void run() { if (!settingsButton.isDisposed()) { settingsButton.refresh(); } } }); } }