# HG changeset patch # User Ed Swartz # Date 1261144014 21600 # Node ID 670ab96c591c3d637a4acd5937e5716a424572b5 # Parent 3a27d56389d58ee16d1c300e843221b8c5c82b76# Parent 9441b6037cb61109bdff8b5dfe2875f0bef978d9 Merge commit diff -r 9441b6037cb6 -r 670ab96c591c connectivity/com.nokia.carbide.remoteConnections/plugin.xml --- a/connectivity/com.nokia.carbide.remoteConnections/plugin.xml Fri Dec 18 07:45:51 2009 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections/plugin.xml Fri Dec 18 07:46:54 2009 -0600 @@ -77,4 +77,17 @@ + + + + + + + + + diff -r 9441b6037cb6 -r 670ab96c591c connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/internal/remoteconnections/settings/ui/DeviceStatusSelectorContribution.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/internal/remoteconnections/settings/ui/DeviceStatusSelectorContribution.java Fri Dec 18 07:46:54 2009 -0600 @@ -0,0 +1,390 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +package com.nokia.carbide.internal.remoteconnections.settings.ui; + +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.layout.GridLayoutFactory; +import org.eclipse.jface.resource.ImageDescriptor; +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.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.menus.WorkbenchWindowControlContribution; + +import com.nokia.carbide.remoteconnections.Messages; +import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator; +import com.nokia.carbide.remoteconnections.interfaces.IConnection; +import com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager; +import com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager.IConnectionListener; +import com.nokia.carbide.remoteconnections.internal.IConnection2; +import com.nokia.carbide.remoteconnections.internal.IConnection2.IStatus; +import com.nokia.carbide.remoteconnections.internal.IConnection2.IStatusChangedListener; +import com.nokia.carbide.remoteconnections.view.ConnectionsView; +import com.nokia.cpp.internal.api.utils.core.TextUtils; +import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils; + + +/** + * This widget appears in the Eclipse trim and allows the user to select the + * "default" device connection and also see its status at a glance. + */ +public class DeviceStatusSelectorContribution extends WorkbenchWindowControlContribution + implements IConnectionListener, IStatusChangedListener { + + private Composite container; + private CLabel deviceInfo; + private IConnectionsManager manager; + private Image deviceImage; + private IConnection defaultConnection; + + public DeviceStatusSelectorContribution() { + manager = RemoteConnectionsActivator.getConnectionsManager(); + } + + /* + * (non-Javadoc) + * @see org.eclipse.jface.action.ControlContribution#createControl(org.eclipse.swt.widgets.Composite) + */ + @Override + protected Control createControl(Composite parent) { + + // This UI is recreated whenever the default connection changes. + + manager.addConnectionListener(this); + + container = new Composite(parent, SWT.NONE); + GridLayoutFactory.fillDefaults().margins(2, 0).applyTo(container); + + // Create a label for the trim. + deviceInfo = new CLabel(container, SWT.FLAT); + GridDataFactory.fillDefaults().grab(false, true).applyTo(deviceInfo); + + String text = Messages.getString("DeviceStatusSelectorContribution_NoDefaultConnectionMessage"); //$NON-NLS-1$ + defaultConnection = manager.getDefaultConnection(); + if (defaultConnection != null) { + text = defaultConnection.getDisplayName(); + if (defaultConnection instanceof IConnection2) { + ((IConnection2) defaultConnection).addStatusChangedListener(DeviceStatusSelectorContribution.this); + } + } + + deviceInfo.setText(text); + + updateDeviceStatus(getDeviceStatus(defaultConnection)); + + deviceInfo.addMouseListener (new MouseAdapter() { + public void mouseDown(MouseEvent event) { + Shell shell = deviceInfo.getShell(); + final Display display = shell.getDisplay(); + + final Menu menu = new Menu(shell, SWT.POP_UP); + populateConnectionMenu(menu); + + Point screenLoc = deviceInfo.toDisplay(event.x, event.y); + menu.setLocation(screenLoc.x, screenLoc.y); + menu.setVisible(true); + + while (!menu.isDisposed() && menu.isVisible()) { + if (!display.readAndDispatch()) + display.sleep(); + } + menu.dispose(); + } + /* (non-Javadoc) + * @see org.eclipse.swt.events.MouseAdapter#mouseDoubleClick(org.eclipse.swt.events.MouseEvent) + */ + @Override + public void mouseDoubleClick(MouseEvent ev) { + // NOTE: the menu usually comes up before double-click is seen + if (ev.button == 1) { + openConnectionsView(); + } + } + }); + + // TODO PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, null); + return container; + } + + /** + * @param ev + */ + protected void openConnectionsView() { + try { + WorkbenchUtils.getView(ConnectionsView.VIEW_ID); + } + catch (PartInitException e) { + RemoteConnectionsActivator.logError(e); + } + } + + /** + * @param defaultConnection + * @param status + * @return + */ + private String createDeviceStatusTooltip(IConnection defaultConnection, + IStatus status) { + if (defaultConnection == null) { + return Messages.getString("DeviceStatusSelectorContribution.NoDynamicOrManualConnectionsTooltip"); //$NON-NLS-1$ + } + + String statusString = null; + if (status != null) { + statusString = status.getDescription(); + } + + if (TextUtils.isEmpty(statusString)) + statusString = Messages.getString("DeviceStatusSelectorContribution.UnknownStatus"); //$NON-NLS-1$ + + return MessageFormat.format(Messages.getString("DeviceStatusSelectorContribution.DeviceStatusFormat"), defaultConnection.getDisplayName(), statusString); //$NON-NLS-1$ + } + + /** + * Get the image representing the device status. + * @param connection + * @return Image, to be disposed + */ + private IStatus getDeviceStatus(IConnection connection) { + if (!(connection instanceof IConnection2)) { + return null; + } else { + return ((IConnection2) connection).getStatus(); + } + } + + /** + * Get the image representing the device status. + * @param connection + * @return Image, to be disposed + */ + private Image createDeviceStatusImage(IStatus status) { + Image statusImage = null; + + String file = null; + if (status != null) { + IStatus.EStatus severity = status.getEStatus(); + + if (severity == IStatus.EStatus.READY) + file = "statusReady.png"; + else if (severity == IStatus.EStatus.IN_USE) + file = "statusInUse.png"; + else if (severity == IStatus.EStatus.NOT_READY) + file = "statusUnknown.png"; // <--- + else if (severity == IStatus.EStatus.IN_USE_DISCONNECTED) + file = "statusUnavailable.png"; + } + + if (file != null) { + ImageDescriptor descriptor; + descriptor = RemoteConnectionsActivator.getImageDescriptor("icons/" + file); + if (descriptor != null) { + statusImage = descriptor.createImage(); + } + } + return statusImage; + } + + /** + * @return + */ + protected void populateConnectionMenu(Menu menu) { + IConnection defaultConnection = manager.getDefaultConnection(); + + // Display the connections with dynamic ones first, + // then static ones, separated by a separator + + List dynamicConnections = new ArrayList(); + List staticConnections = new ArrayList(); + for (IConnection connection : RemoteConnectionsActivator.getConnectionsManager().getConnections()) { + if (connection instanceof IConnection2 && ((IConnection2)connection).isDynamic()) + dynamicConnections.add(connection); + else + staticConnections.add(connection); + } + + + Comparator connectionComparator = new Comparator() { + public int compare(IConnection o1, IConnection o2) { + return o1.getDisplayName().compareToIgnoreCase(o2.getDisplayName()); + } + }; + Collections.sort(dynamicConnections, connectionComparator); + Collections.sort(staticConnections, connectionComparator); + + MenuItem label = new MenuItem(menu, SWT.NONE); + label.setEnabled(false); + label.setText(Messages.getString("DeviceStatusSelectorContribution_SelectTheDefaultConnectionMessage")); //$NON-NLS-1$ + + for (IConnection connection : dynamicConnections) { + createConnectionMenuItem(menu, connection, defaultConnection); + } + + new MenuItem(menu, SWT.SEPARATOR); + + for (IConnection connection : staticConnections) { + createConnectionMenuItem(menu, connection, defaultConnection); + } + + new MenuItem(menu, SWT.SEPARATOR); + + MenuItem openView = new MenuItem(menu, SWT.PUSH); + openView.setText("Open Remote Connections view"); + openView.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + openConnectionsView(); + } + }); + } + + /** + * @param menu + * @param connection + * @param defaultConnection + */ + private MenuItem createConnectionMenuItem(Menu menu, final IConnection connection, IConnection defaultConnection) { + MenuItem item = new MenuItem(menu, SWT.CHECK); + + boolean isDefault = false; + isDefault = connection.equals(defaultConnection); + + item.setSelection(isDefault); + + item.setText(connection.getDisplayName()); + + item.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + manager.setDefaultConnection(connection); + } + }); + + return item; + } + + /* + * (non-Javadoc) + * @see org.eclipse.jface.action.ContributionItem#dispose() + */ + public void dispose() { + if (deviceImage != null) { + deviceImage.dispose(); + deviceImage = null; + } + if (defaultConnection instanceof IConnection2) + ((IConnection2) defaultConnection).removeStatusChangedListener(this); + + manager.removeConnectionListener(this); + super.dispose(); + } + + /* (non-Javadoc) + * @see com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager.IConnectionListener#connectionAdded(com.nokia.carbide.remoteconnections.interfaces.IConnection) + */ + public void connectionAdded(IConnection connection) { + updateUI(); + } + + /* (non-Javadoc) + * @see com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager.IConnectionListener#connectionRemoved(com.nokia.carbide.remoteconnections.interfaces.IConnection) + */ + public void connectionRemoved(IConnection connection) { + updateUI(); + } + /* (non-Javadoc) + * @see com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager.IConnectionListener#defaultConnectionSet(com.nokia.carbide.remoteconnections.interfaces.IConnection) + */ + public void defaultConnectionSet(IConnection connection) { + updateUI(); + } + + /* (non-Javadoc) + * @see com.nokia.carbide.remoteconnections.internal.IConnection2.IStatusChangedListener#statusChanged(com.nokia.carbide.remoteconnections.internal.IConnection2.IStatus) + */ + public void statusChanged(IStatus status) { + updateDeviceStatus(status); + } + + /** + * @param status + */ + private void updateDeviceStatus(IStatus status) { + if (deviceImage != null) + deviceImage.dispose(); + + deviceImage = createDeviceStatusImage(status); + deviceInfo.setImage(deviceImage); + deviceInfo.setToolTipText(createDeviceStatusTooltip(defaultConnection, status)); + } + + /** + * + */ + private void updateUI() { + // perform update in UI thread + final IWorkbench workbench = PlatformUI.getWorkbench(); + workbench.getDisplay().asyncExec(new Runnable() { + public void run() { + IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); + if (window != null) { + update(); + } + } + }); + } + + /* + * (non-Javadoc) + * @see org.eclipse.jface.action.ContributionItem#isDynamic() + */ + @Override + public boolean isDynamic() { + return true; + } + + /* + * (non-Javadoc) + * @see org.eclipse.jface.action.ContributionItem#update() + */ + @Override + public void update() { + getParent().update(true); + } + +} \ No newline at end of file diff -r 9441b6037cb6 -r 670ab96c591c connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/messages.properties --- a/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/messages.properties Fri Dec 18 07:45:51 2009 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/messages.properties Fri Dec 18 07:46:54 2009 -0600 @@ -51,6 +51,11 @@ ConnectionTypePage.SupportedServicesLabel=Supported Services: {0} ConnectionTypePage.Title=Edit connection name and type ConnectionTypePage.ViewerLabel=Connection Type: +DeviceStatusSelectorContribution_NoDefaultConnectionMessage=No default connection +DeviceStatusSelectorContribution_SelectTheDefaultConnectionMessage=Select the default connection: +DeviceStatusSelectorContribution.DeviceStatusFormat={0}: {1} +DeviceStatusSelectorContribution.NoDynamicOrManualConnectionsTooltip=No default connection selected. +DeviceStatusSelectorContribution.UnknownStatus=Unknown status ExportPage.BrowseGroupLabel=Connections file: ExportPage.Description=Select connections to export ExportPage.FileDialogTitle=Save As diff -r 9441b6037cb6 -r 670ab96c591c connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/settings/ui/OnDeviceConnectionAction.java --- a/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/settings/ui/OnDeviceConnectionAction.java Fri Dec 18 07:45:51 2009 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/settings/ui/OnDeviceConnectionAction.java Fri Dec 18 07:46:54 2009 -0600 @@ -19,6 +19,8 @@ package com.nokia.carbide.remoteconnections.settings.ui; import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator; +import com.nokia.carbide.remoteconnections.view.ConnectionsView; +import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; @@ -37,14 +39,11 @@ public void run(IAction action) { // Ensure the remote connections view is visible - IWorkbenchPage page = window.getActivePage(); - if (page != null) { - try { - page.showView("com.nokia.carbide.remoteconnections.view.ConnectionsView"); //$NON-NLS-1$ - } - catch (PartInitException e) { - RemoteConnectionsActivator.logError(e); - } + try { + WorkbenchUtils.getView(ConnectionsView.VIEW_ID); + } + catch (PartInitException e) { + RemoteConnectionsActivator.logError(e); } // Launch the new connection wizard diff -r 9441b6037cb6 -r 670ab96c591c connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/view/ConnectionsView.java --- a/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/view/ConnectionsView.java Fri Dec 18 07:45:51 2009 -0600 +++ b/connectivity/com.nokia.carbide.remoteConnections/src/com/nokia/carbide/remoteconnections/view/ConnectionsView.java Fri Dec 18 07:46:54 2009 -0600 @@ -89,6 +89,7 @@ */ @SuppressWarnings("deprecation") public class ConnectionsView extends ViewPart { + public static final String VIEW_ID = "com.nokia.carbide.remoteconnections.view.ConnectionsView"; //$NON-NLS-1$ private TreeViewer viewer; private IConnectionsManagerListener connectionStoreChangedListener; diff -r 9441b6037cb6 -r 670ab96c591c core/com.nokia.carbide.cpp.news.reader/src/com/nokia/carbide/cpp/internal/news/reader/ui/NewsControlContribution.java --- a/core/com.nokia.carbide.cpp.news.reader/src/com/nokia/carbide/cpp/internal/news/reader/ui/NewsControlContribution.java Fri Dec 18 07:45:51 2009 -0600 +++ b/core/com.nokia.carbide.cpp.news.reader/src/com/nokia/carbide/cpp/internal/news/reader/ui/NewsControlContribution.java Fri Dec 18 07:46:54 2009 -0600 @@ -45,6 +45,7 @@ private static NewsControlContribution sharedInstance; private Label label; private boolean alert; + private Composite container; /** * The constructor. @@ -61,12 +62,12 @@ */ @Override protected Control createControl(Composite parent) { - Composite container = new Composite(parent, SWT.NONE); + container = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().margins(2, 2).applyTo(container); // Create a label for the trim. - label = new Label(container, SWT.CENTER); - GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo(label); + label = new Label(container, SWT.BOTTOM); + GridDataFactory.swtDefaults().grab(false, true).applyTo(label); String text = CarbideNewsReaderPlugin.getFeedManager().getUnreadEntriesCount() + " unread"; label.setText(text); if (alert) { @@ -74,7 +75,7 @@ label.setFont(font); alert = false; } - + PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, NewsUIHelpIDs.NEWSREADER_TRIM_COMMAND); return container; }