package com.google.dart.tools.ui.server; import com.google.dart.server.AnalysisServerStatusListener; import com.google.dart.server.generated.AnalysisServer; import com.google.dart.tools.core.DartCore; import com.google.dart.tools.core.DartCoreDebug; import com.google.dart.tools.ui.themes.Fonts; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseTrackAdapter; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.menus.WorkbenchWindowControlContribution; public class AnalysisServerControlContribution implements AnalysisServerStatusListener { private static String failMessage = "Use \"{0}\" to send feedback about the failure, and relaunch {1} to restart Analysis Server."; private Control control; private boolean inControl; private CLabel label; private WorkbenchWindowControlContribution controlContribution; public AnalysisServerControlContribution(WorkbenchWindowControlContribution controlContribution) { this.controlContribution = controlContribution; } public Control createControl(Composite parent) { if (DartCoreDebug.ENABLE_ANALYSIS_SERVER) { control = createLabel(parent); AnalysisServer server = DartCore.getAnalysisServer(); if (server != null) { server.addStatusListener(this); } else { isAliveServer(false); } hookupLabelListeners(); } else { control = new Composite(parent, SWT.NONE); } return control; } @Override public void isAliveServer(boolean isAlive) { if (!isAlive) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { updateLabelText("Analysis Server Inactive"); } }); } } protected void handleMouseEnter() { inControl = true; } protected void handleMouseExit() { inControl = false; } protected void handleSelection() { String message; if (DartCore.isPluginsBuild()) { message = NLS.bind(failMessage, "Help > Send feedback about Dart", "Eclipse"); } else { message = NLS.bind(failMessage, "Send Feedback", "Dart Editor"); } MessageDialog.openInformation(getActiveShell(), "Analaysis Server Inactive", message); } private Control createLabel(Composite parent) { Label spacer = new Label(parent, SWT.NONE); GridDataFactory.fillDefaults().hint(2, 0).applyTo(spacer); label = new CLabel(parent, SWT.NONE); label.setAlignment(SWT.CENTER); label.setFont(Fonts.getBoldFont(label.getFont())); int fgColor = SWT.COLOR_WHITE; int bgColor = SWT.COLOR_DARK_RED; Display display = label.getDisplay(); label.setBackground(display.getSystemColor(bgColor)); label.setForeground(display.getSystemColor(fgColor)); updateLabelText(" Analysis Server Active "); label.setToolTipText("Analysis Server status"); GridDataFactory.fillDefaults().grab(true, false).applyTo(label); label.setVisible(false); return label; } private Shell getActiveShell() { return controlContribution.getWorkbenchWindow().getShell(); } private void hookupLabelListeners() { label.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { if (inControl && e.button == 1) { handleSelection(); } } }); label.addMouseTrackListener(new MouseTrackAdapter() { @Override public void mouseEnter(MouseEvent e) { handleMouseEnter(); } @Override public void mouseExit(MouseEvent e) { handleMouseExit(); } }); } private void updateLabelText(String message) { if (label != null && !label.isDisposed()) { label.setText(message); label.setVisible(true); } } }