From ce37b8ff40fb24a289afa020181406cd8255dfd7 Mon Sep 17 00:00:00 2001 From: Roger Ferrel Date: Tue, 3 Apr 2012 13:28:40 -0500 Subject: [PATCH] Issue #244 Peer to Peer chat implemented. Change Passwor implemtned. Change-Id: I4949d5ff82a1046d344cd63e32842b2d67717681 Former-commit-id: 9dd257f28ac48637d4731de0d61ed59e4fd329d7 [formerly 7d7ee818554ad7c216fe575c7921a4c44e207a00 [formerly dde6ebb7a4ce4cdee62b1d4e31d33694c331309e]] Former-commit-id: 7d7ee818554ad7c216fe575c7921a4c44e207a00 Former-commit-id: 1db237e4081a73df470c6c6b52d577187c128952 --- .../data/CollaborationDataManager.java | 66 +++++ .../ui/ChangePasswordDialog.java | 227 ++++++++++++++++++ .../ui/CollaborationGroupView.java | 173 ++++++++----- .../ui/login/ChangeStatusDialog.java | 212 ++++++++++++++++ .../collaboration/ui/login/LoginDialog.java | 13 +- .../ui/session/AbstractSessionView.java | 106 ++++++++ .../ui/session/CollaborationSessionView.java | 42 ++++ .../ui/session/PeerToPeerView.java | 55 +++-- .../collaboration/ui/session/SessionView.java | 96 +------- 9 files changed, 806 insertions(+), 184 deletions(-) create mode 100644 cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/ChangePasswordDialog.java create mode 100644 cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/login/ChangeStatusDialog.java diff --git a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/data/CollaborationDataManager.java b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/data/CollaborationDataManager.java index 106562cedc..8f5bfbc48d 100644 --- a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/data/CollaborationDataManager.java +++ b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/data/CollaborationDataManager.java @@ -43,10 +43,13 @@ import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException; import com.raytheon.uf.viz.collaboration.comm.identity.IPresence.Type; +import com.raytheon.uf.viz.collaboration.comm.identity.ISession; import com.raytheon.uf.viz.collaboration.comm.identity.ISharedDisplaySession; import com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession; +import com.raytheon.uf.viz.collaboration.comm.identity.event.ITextMessageEvent; import com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueInvitationEvent; import com.raytheon.uf.viz.collaboration.comm.identity.user.IQualifiedID; +import com.raytheon.uf.viz.collaboration.comm.provider.TextMessage; import com.raytheon.uf.viz.collaboration.comm.provider.session.SessionManager; import com.raytheon.uf.viz.collaboration.ui.editor.CollaborationEditor; import com.raytheon.uf.viz.collaboration.ui.login.LoginData; @@ -56,6 +59,7 @@ import com.raytheon.uf.viz.collaboration.ui.role.DataProviderEventController; import com.raytheon.uf.viz.collaboration.ui.role.ParticipantEventController; import com.raytheon.uf.viz.collaboration.ui.role.SessionLeaderEventController; import com.raytheon.uf.viz.collaboration.ui.session.CollaborationSessionView; +import com.raytheon.uf.viz.collaboration.ui.session.PeerToPeerView; import com.raytheon.uf.viz.core.VizApp; /** @@ -220,6 +224,15 @@ public class CollaborationDataManager { if (isConnected()) { // Register handlers and events for the new manager. manager.registerEventHandler(this); + try { + ISession p2pSession = manager.getPeerToPeerSession(); + p2pSession.registerEventHandler(this); + } catch (CollaborationException e) { + // TODO Auto-generated catch block. Please revise as + // appropriate. + statusHandler.handle(Priority.PROBLEM, + e.getLocalizedMessage(), e); + } wbListener = new IWorkbenchListener() { @Override @@ -231,6 +244,16 @@ public class CollaborationDataManager { @Override public void postShutdown(IWorkbench workbench) { if (manager != null) { + try { + ISession p2pSession = manager + .getPeerToPeerSession(); + p2pSession.unRegisterEventHandler(this); + } catch (CollaborationException e) { + // TODO Auto-generated catch block. Please + // revise as appropriate. + statusHandler.handle(Priority.PROBLEM, + e.getLocalizedMessage(), e); + } manager.unRegisterEventHandler(this); manager.closeManager(); manager = null; @@ -463,6 +486,49 @@ public class CollaborationDataManager { }); } + /** + * This takes a peer to peer message and displays it in the proper view. + * + * @param messageEvent + */ + @Subscribe + public void peer2peerMessage(ITextMessageEvent messageEvent) { + final TextMessage message = messageEvent.getMessage(); + // System.out.println("p2pMsg from: " + message.getFrom().getFQName()); + // System.out.println("p2pMsgt body: " + message.getBody()); + VizApp.runAsync(new Runnable() { + + @Override + public void run() { + String id = message.getFrom().getFQName(); + for (IViewReference ref : PlatformUI.getWorkbench() + .getActiveWorkbenchWindow().getActivePage() + .getViewReferences()) { + if (id.equals(ref.getSecondaryId())) { + PeerToPeerView p2pView = (PeerToPeerView) ref + .getView(false); + p2pView.appendMessage(message); + return; + } + } + try { + PeerToPeerView p2pView = (PeerToPeerView) PlatformUI + .getWorkbench() + .getActiveWorkbenchWindow() + .getActivePage() + .showView(PeerToPeerView.ID, id, + IWorkbenchPage.VIEW_ACTIVATE); + p2pView.appendMessage(message); + } catch (PartInitException e) { + // TODO Auto-generated catch block. Please revise as + // appropriate. + statusHandler.handle(Priority.PROBLEM, + e.getLocalizedMessage(), e); + } + } + }); + } + public String joinCollaborationSession(String venueName, String sessionId) { String result = sessionId; if (sessionsMap.get(sessionId) == null) { diff --git a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/ChangePasswordDialog.java b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/ChangePasswordDialog.java new file mode 100644 index 0000000000..3d5fed2541 --- /dev/null +++ b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/ChangePasswordDialog.java @@ -0,0 +1,227 @@ +package com.raytheon.uf.viz.collaboration.ui; + +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +import com.raytheon.uf.viz.collaboration.data.CollaborationDataManager; +import com.raytheon.viz.ui.dialogs.CaveSWTDialog; + +/** + * TODO Add Description + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Apr 3, 2012            rferrel     Initial creation
+ * 
+ * 
+ * + * @author rferrel + * @version 1.0 + */ +public class ChangePasswordDialog extends CaveSWTDialog { + + private Label userLabel; + + private Text passwordTF; + + private Text verifyPasswordTF; + + public ChangePasswordDialog(Shell parentShell) { + super(parentShell); + setText("Change Password"); + } + + private Control createDialogArea(Composite parent) { + CollaborationDataManager manager = CollaborationDataManager + .getInstance(); + String user = manager.getLoginId(); + Composite body = new Composite(parent, SWT.NONE); + body.setLayout(new GridLayout(2, false)); + // body.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL + // | GridData.HORIZONTAL_ALIGN_FILL)); + Label label = null; + GridData gd = null; + userLabel = new Label(body, SWT.NONE); + gd = new GridData(SWT.FILL, SWT.FILL, true, true); + gd.horizontalSpan = 2; + userLabel.setLayoutData(gd); + userLabel.setText(user); + + label = new Label(body, SWT.NONE); + label.setText("New Password: "); + passwordTF = new Text(body, SWT.BORDER | SWT.PASSWORD); + gd = new GridData(SWT.FILL, SWT.FILL, true, true); + passwordTF.setLayoutData(gd); + + label = new Label(body, SWT.NONE); + label.setText("Verify Password: "); + verifyPasswordTF = new Text(body, SWT.BORDER | SWT.PASSWORD); + verifyPasswordTF.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, + true)); + + return body; + } + + @Override + protected void initializeComponents(Shell shell) { + shell.setLayout(new GridLayout(1, false)); + createDialogArea(shell); + createButtonBar(shell); + } + + private void createButtonBar(Composite parent) { + GridData gd = null; + Composite bar = new Composite(parent, SWT.NONE); + + // set up to center buttons. + bar.setLayout(new GridLayout(0, true)); + gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false); + bar.setLayoutData(gd); + createButton(bar, IDialogConstants.OK_ID, "Change", true); + + createButton(bar, IDialogConstants.CANCEL_ID, + IDialogConstants.CANCEL_LABEL, false); + } + + @Override + protected void preOpened() { + super.preOpened(); + } + + /** + * Creates a new button with the given id. + *

+ * The Dialog implementation of this framework method creates a + * standard push button, registers it for selection events including button + * presses, and registers default buttons with its shell. The button id is + * stored as the button's client data. If the button id is + * IDialogConstants.CANCEL_ID, the new button will be + * accessible from getCancelButton(). If the button id is + * IDialogConstants.OK_ID, the new button will be accesible + * from getOKButton(). Note that the parent's layout is assumed + * to be a GridLayout and the number of columns in this layout + * is incremented. Subclasses may override. + *

+ * + * @param parent + * the parent composite + * @param id + * the id of the button (see IDialogConstants.*_ID + * constants for standard dialog button ids) + * @param label + * the label from the button + * @param defaultButton + * true if the button is to be the default button, + * and false otherwise + * + * @return the new button + * + * @see #getCancelButton + * @see #getOKButton() + */ + protected Button createButton(Composite parent, int id, String label, + boolean defaultButton) { + // increment the number of columns in the button bar + ((GridLayout) parent.getLayout()).numColumns++; + Button button = new Button(parent, SWT.PUSH); + button.setText(label); + GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); + gd.minimumWidth = 70; + button.setLayoutData(gd); + button.setData(new Integer(id)); + button.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + Integer val = (Integer) event.widget.getData(); + if (val != IDialogConstants.OK_ID) { + setReturnValue(null); + ChangePasswordDialog.this.getShell().dispose(); + } else { + Text focusField = null; + List errorMessages = new ArrayList(); + String password = passwordTF.getText(); + String verifyPassword = verifyPasswordTF.getText(); + if (password.length() == 0) { + errorMessages.add("Must enter new password."); + focusField = passwordTF; + verifyPasswordTF.setText(""); + } else if (verifyPassword.length() == 0) { + errorMessages.add("Enter password again to verify."); + focusField = verifyPasswordTF; + } else if (password.equals(verifyPassword) == false) { + errorMessages + .add("New and verified password do not match."); + errorMessages.add("Enter them again."); + focusField = passwordTF; + verifyPasswordTF.setText(""); + } + + if (focusField == null) { + setReturnValue(password); + ChangePasswordDialog.this.getShell().dispose(); + } else { + StringBuilder sb = new StringBuilder(); + String prefix = ""; + for (String msg : errorMessages) { + sb.append(prefix).append(msg); + prefix = "\n"; + } + MessageBox messageBox = new MessageBox(event.widget + .getDisplay().getActiveShell(), SWT.ERROR); + messageBox.setText("Change Password Error"); + messageBox.setMessage(sb.toString()); + messageBox.open(); + event.doit = false; + setReturnValue(null); + focusField.setFocus(); + focusField.selectAll(); + } + } + } + }); + if (defaultButton) { + Shell shell = parent.getShell(); + if (shell != null) { + shell.setDefaultButton(button); + } + } + return button; + } +} diff --git a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/CollaborationGroupView.java b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/CollaborationGroupView.java index 22a9da2fd1..cf5954cd7e 100644 --- a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/CollaborationGroupView.java +++ b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/CollaborationGroupView.java @@ -28,8 +28,6 @@ import java.util.Map; import java.util.Set; import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.ActionContributionItem; -import org.eclipse.jface.action.IMenuCreator; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; @@ -73,6 +71,7 @@ import org.osgi.framework.Bundle; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException; import com.raytheon.uf.viz.collaboration.comm.identity.IPresence; import com.raytheon.uf.viz.collaboration.comm.identity.IPresence.Type; import com.raytheon.uf.viz.collaboration.comm.identity.ISession; @@ -90,6 +89,8 @@ import com.raytheon.uf.viz.collaboration.data.CollaborationUser; import com.raytheon.uf.viz.collaboration.data.LoginUser; import com.raytheon.uf.viz.collaboration.data.SessionGroup; import com.raytheon.uf.viz.collaboration.ui.editor.CollaborationEditor; +import com.raytheon.uf.viz.collaboration.ui.login.ChangeStatusDialog; +import com.raytheon.uf.viz.collaboration.ui.login.LoginData; import com.raytheon.uf.viz.collaboration.ui.session.AbstractSessionView; import com.raytheon.uf.viz.collaboration.ui.session.CollaborationSessionView; import com.raytheon.uf.viz.collaboration.ui.session.PeerToPeerView; @@ -157,13 +158,11 @@ public class CollaborationGroupView extends ViewPart implements IPartListener { private Action removeUserAction; - private Action changeMessageAction; + private Action changeStatusAction; private Action changePasswordAction; - private Action changeStatusAction; - - private Action refreshActiveSessionsAction; + // private Action refreshActiveSessionsAction; private Action collapseAllAction; @@ -227,13 +226,15 @@ public class CollaborationGroupView extends ViewPart implements IPartListener { String sessionId = getId(); IVenueSession session = CollaborationDataManager.getInstance() .getSession(sessionId); + String roomName = session.getVenue().getInfo() + .getVenueDescription(); List ids = new ArrayList(); + for (CollaborationUser user : getSelectedUsers()) { + // TODO not add to list if user is already in the session. String id = user.getId(); - if (!ids.contains(id)) { - System.out.println("Add Selected User: " + id); - ids.add(id); - } + System.out.println("Add Selected User: " + id); + ids.add(id); } IVenueInfo info = session.getVenue().getInfo(); System.out.println("room: " + info.getVenueName()); @@ -315,24 +316,24 @@ public class CollaborationGroupView extends ViewPart implements IPartListener { } }; - changeMessageAction = new Action("Change Message...") { + changeStatusAction = new Action("Change Status...") { public void run() { - System.out.println("Change message"); + changeStatus(); }; }; changePasswordAction = new Action("Change password...") { public void run() { - System.out.println("Change password here"); + changePassword(); }; }; - changeStatusAction = new Action("Change Status", - Action.AS_DROP_DOWN_MENU) { - public void run() { - System.out.println("Change Status here to: " + getId()); - }; - }; + // changeStatusAction = new Action("Change Status", + // Action.AS_DROP_DOWN_MENU) { + // public void run() { + // System.out.println("Change Status here to: " + getId()); + // }; + // }; // refreshActiveSessionsAction = new Action("Refresh") { // public void run() { @@ -353,30 +354,30 @@ public class CollaborationGroupView extends ViewPart implements IPartListener { collapseAllAction.setImageDescriptor(IconUtil.getImageDescriptor( bundle, "collapseall.gif")); - IMenuCreator creator = new IMenuCreator() { - - Menu menu; - - @Override - public Menu getMenu(Menu parent) { - menu = new Menu(parent); - fillStatusMenu(menu); - return menu; - } - - @Override - public Menu getMenu(Control parent) { - menu = new Menu(parent); - fillStatusMenu(menu); - return menu; - } - - @Override - public void dispose() { - menu.dispose(); - } - }; - changeStatusAction.setMenuCreator(creator); + // IMenuCreator creator = new IMenuCreator() { + // + // Menu menu; + // + // @Override + // public Menu getMenu(Menu parent) { + // menu = new Menu(parent); + // fillStatusMenu(menu); + // return menu; + // } + // + // @Override + // public Menu getMenu(Control parent) { + // menu = new Menu(parent); + // fillStatusMenu(menu); + // return menu; + // } + // + // @Override + // public void dispose() { + // menu.dispose(); + // } + // }; + // changeStatusAction.setMenuCreator(creator); removeGroupAction = new Action("Remove Group") { public void run() { @@ -388,6 +389,45 @@ public class CollaborationGroupView extends ViewPart implements IPartListener { }; } + private void changePassword() { + System.out.println("Change password here"); + ChangePasswordDialog dialog = new ChangePasswordDialog(Display + .getCurrent().getActiveShell()); + dialog.open(); + + Object result = dialog.getReturnValue(); + if (result != null) { + char[] password = result.toString().toCharArray(); + SessionManager sessionManager = CollaborationDataManager + .getInstance().getSessionManager(); + try { + sessionManager.getAccountManager().changePassword(password); + } catch (CollaborationException e) { + // TODO Auto-generated catch block. Please revise as + // appropriate. + statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + e); + } + } + } + + private void changeStatus() { + ChangeStatusDialog dialog = new ChangeStatusDialog(Display.getCurrent() + .getActiveShell()); + dialog.open(); + + LoginData loginData = (LoginData) dialog.getReturnValue(); + if (loginData != null) { + LoginUser loginUser = getLoginUser(); + loginUser.setMode(loginData.getMode()); + loginUser.setStatusMessage(loginData.getModeMessage()); + usersTreeViewer.refresh(loginUser, true); + System.err.println("send mode change here: " + + loginData.getMode().toString() + ", Message: \"" + + loginData.getModeMessage() + "\""); + } + } + /** * This displays a warning dialog then closes all collaboration views and * disconnects from the server. @@ -456,22 +496,22 @@ public class CollaborationGroupView extends ViewPart implements IPartListener { } - private void fillStatusMenu(Menu menu) { - for (IPresence.Mode type : CollaborationUtils.statusModes) { - Action action = new Action(type.getMode()) { - public void run() { - changeStatusAction.setId(getId()); - changeStatusAction.run(); - }; - }; - action.setId(type.name()); - ActionContributionItem item = new ActionContributionItem(action); - action.setImageDescriptor(IconUtil.getImageDescriptor(Activator - .getDefault().getBundle(), type.name().toLowerCase() - + ".gif")); - item.fill(menu, -1); - } - } + // private void fillStatusMenu(Menu menu) { + // for (IPresence.Mode type : CollaborationUtils.statusModes) { + // Action action = new Action(type.getMode()) { + // public void run() { + // changeStatusAction.setId(getId()); + // changeStatusAction.run(); + // }; + // }; + // action.setId(type.name()); + // ActionContributionItem item = new ActionContributionItem(action); + // action.setImageDescriptor(IconUtil.getImageDescriptor(Activator + // .getDefault().getBundle(), type.name().toLowerCase() + // + ".gif")); + // item.fill(menu, -1); + // } + // } private void createToolbar() { IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager(); @@ -500,8 +540,8 @@ public class CollaborationGroupView extends ViewPart implements IPartListener { mgr.add(addUserAction); mgr.add(selectGroups); mgr.add(new Separator()); + // mgr.add(changeStatusAction); mgr.add(changeStatusAction); - mgr.add(changeMessageAction); mgr.add(changePasswordAction); mgr.add(new Separator()); if (CollaborationDataManager.getInstance().isConnected()) { @@ -1043,6 +1083,17 @@ public class CollaborationGroupView extends ViewPart implements IPartListener { } } + private LoginUser getLoginUser() { + LoginUser loginUser = null; + for (CollaborationNode node : topLevel.getChildren()) { + if (node instanceof LoginUser) { + loginUser = (LoginUser) node; + break; + } + } + return loginUser; + } + /** * @return */ @@ -1051,7 +1102,7 @@ public class CollaborationGroupView extends ViewPart implements IPartListener { } /** - * Get the list of selected users that have a Type of AVAILABLE. + * Get a unique set of selected users that have a Type of AVAILABLE. * * @return */ diff --git a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/login/ChangeStatusDialog.java b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/login/ChangeStatusDialog.java new file mode 100644 index 0000000000..aebcb978c0 --- /dev/null +++ b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/login/ChangeStatusDialog.java @@ -0,0 +1,212 @@ +package com.raytheon.uf.viz.collaboration.ui.login; + +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ + +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +import com.raytheon.uf.viz.collaboration.comm.identity.IPresence; +import com.raytheon.uf.viz.collaboration.ui.CollaborationUtils; +import com.raytheon.viz.ui.dialogs.CaveSWTDialog; + +/** + * Change the user Mode Status and the optional message. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Apr 3, 2012            rferrel     Initial creation
+ * 
+ * 
+ * + * @author rferrel + * @version 1.0 + */ +public class ChangeStatusDialog extends CaveSWTDialog { + + private Label userLabel; + + private Combo statusCombo; + + private Text messageTF; + + private LoginData loginData; + + public ChangeStatusDialog(Shell parentShell) { + super(parentShell, SWT.DIALOG_TRIM); + setText("Collaboration Server Log On"); + } + + private Control createDialogArea(Composite parent) { + GridData gd = null; + Composite body = new Composite(parent, SWT.NONE); + body.setLayout(new GridLayout(2, false)); + Label label = null; + userLabel = new Label(body, SWT.NONE); + gd = new GridData(SWT.FILL, SWT.FILL, true, true); + gd.horizontalSpan = 2; + userLabel.setLayoutData(gd); + userLabel.setText(""); + + label = new Label(body, SWT.NONE); + label.setText("Status: "); + statusCombo = new Combo(body, SWT.DEFAULT); + + for (IPresence.Mode mode : CollaborationUtils.statusModes) { + statusCombo.add(mode.getMode()); + } + + label = new Label(body, SWT.NONE); + label.setText("Message: "); + + messageTF = new Text(body, SWT.BORDER); + gd = new GridData(SWT.FILL, SWT.FILL, true, true); + gd.minimumWidth = 200; + messageTF.setLayoutData(gd); + + return body; + } + + @Override + protected void initializeComponents(Shell shell) { + shell.setLayout(new GridLayout(1, false)); + createDialogArea(shell); + createButtonBar(shell); + } + + private void createButtonBar(Composite parent) { + GridData gd = null; + Composite bar = new Composite(parent, SWT.NONE); + gd = new GridData(SWT.CENTER, SWT.DEFAULT, true, false); + bar.setLayout(new GridLayout(0, true)); + bar.setLayoutData(gd); + createButton(bar, IDialogConstants.OK_ID, "Send", true); + + createButton(bar, IDialogConstants.CANCEL_ID, + IDialogConstants.CANCEL_LABEL, false); + } + + @Override + protected void preOpened() { + super.preOpened(); + this.loginData = LoginDialog.openUserLoginData(); + userLabel.setText(loginData.getAccount()); + statusCombo.select(CollaborationUtils.statusModesIndex(loginData + .getMode())); + statusCombo.select(CollaborationUtils.statusModesIndex(loginData + .getMode())); + messageTF.setText(loginData.getModeMessage()); + messageTF.selectAll(); + statusCombo.setFocus(); + } + + /** + * Creates a new button with the given id. + *

+ * The Dialog implementation of this framework method creates a + * standard push button, registers it for selection events including button + * presses, and registers default buttons with its shell. The button id is + * stored as the button's client data. If the button id is + * IDialogConstants.CANCEL_ID, the new button will be + * accessible from getCancelButton(). If the button id is + * IDialogConstants.OK_ID, the new button will be accesible + * from getOKButton(). Note that the parent's layout is assumed + * to be a GridLayout and the number of columns in this layout + * is incremented. Subclasses may override. + *

+ * + * @param parent + * the parent composite + * @param id + * the id of the button (see IDialogConstants.*_ID + * constants for standard dialog button ids) + * @param label + * the label from the button + * @param defaultButton + * true if the button is to be the default button, + * and false otherwise + * + * @return the new button + * + * @see #getCancelButton + * @see #getOKButton() + */ + protected Button createButton(Composite parent, int id, String label, + boolean defaultButton) { + // increment the number of columns in the button bar + ((GridLayout) parent.getLayout()).numColumns++; + Button button = new Button(parent, SWT.PUSH); + button.setText(label); + GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); + gd.minimumWidth = 70; + button.setLayoutData(gd); + button.setData(new Integer(id)); + button.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + Integer val = (Integer) event.widget.getData(); + if (val != IDialogConstants.OK_ID) { + setReturnValue(null); + } else { + boolean modified = false; + IPresence.Mode mode = CollaborationUtils.statusModes[statusCombo + .getSelectionIndex()]; + if (mode != loginData.getMode()) { + modified = true; + } + String modeMessage = messageTF.getText().trim(); + if (modeMessage.equals(loginData.getModeMessage()) == false) { + modified = true; + } + if (modified) { + loginData.setMode(mode); + loginData.setModeMessage(modeMessage); + LoginDialog.saveUserLoginData(loginData); + setReturnValue(loginData); + } else { + setReturnValue(null); + } + } + ChangeStatusDialog.this.getShell().dispose(); + } + }); + if (defaultButton) { + Shell shell = parent.getShell(); + if (shell != null) { + shell.setDefaultButton(button); + } + } + return button; + } +} diff --git a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/login/LoginDialog.java b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/login/LoginDialog.java index cbbca5da04..9b01456e3b 100644 --- a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/login/LoginDialog.java +++ b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/login/LoginDialog.java @@ -232,7 +232,7 @@ public class LoginDialog extends CaveSWTDialog { @Override protected void preOpened() { super.preOpened(); - initLoginData(); + this.loginData = LoginDialog.openUserLoginData(); userTF.setText(loginData.getUser()); serverTF.setText(loginData.getServer()); @@ -341,7 +341,7 @@ public class LoginDialog extends CaveSWTDialog { loginData.setModeMessage(modeMessage); } if (doSaveLoginData) { - saveLoginData(); + LoginDialog.saveUserLoginData(loginData); } // loginData = new LoginData(user, server, password, @@ -378,8 +378,8 @@ public class LoginDialog extends CaveSWTDialog { return button; } - private void initLoginData() { - loginData = null; + public static LoginData openUserLoginData() { + LoginData loginData = null; IPathManager pm = PathManagerFactory.getPathManager(); File fname = pm.getStaticFile(LOGIN_FILE_NAME); try { @@ -393,9 +393,10 @@ public class LoginDialog extends CaveSWTDialog { loginData = new LoginData(); } } + return loginData; } - private void saveLoginData() { + public static void saveUserLoginData(LoginData loginData) { try { LocalizationFile lFile = getFile(LOGIN_FILE_NAME); File file = lFile.getFile(false); @@ -418,7 +419,7 @@ public class LoginDialog extends CaveSWTDialog { * @return lFile * @throws FileNotFoundException */ - private LocalizationFile getFile(String filename) + private static LocalizationFile getFile(String filename) throws FileNotFoundException { IPathManager pm = PathManagerFactory.getPathManager(); LocalizationContext context = pm.getContext( diff --git a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/AbstractSessionView.java b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/AbstractSessionView.java index e9de84d36b..0fd905bc83 100644 --- a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/AbstractSessionView.java +++ b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/AbstractSessionView.java @@ -19,11 +19,16 @@ **/ package com.raytheon.uf.viz.collaboration.ui.session; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; @@ -40,6 +45,9 @@ import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.ViewPart; +import com.raytheon.uf.viz.collaboration.comm.identity.IMessage; +import com.raytheon.uf.viz.collaboration.comm.identity.user.ParticipantRole; +import com.raytheon.uf.viz.collaboration.data.CollaborationDataManager; import com.raytheon.uf.viz.collaboration.ui.Activator; import com.raytheon.uf.viz.core.icon.IconUtil; import com.raytheon.viz.ui.perspectives.VizPerspectiveListener; @@ -222,6 +230,104 @@ public abstract class AbstractSessionView extends ViewPart implements return message; } + /** + * Append the message into the message text field. + * + * @param message + */ + public void appendMessage(IMessage message) { + String fqName = message.getFrom().getFQName(); + String name = message.getFrom().getName(); + long timestamp = message.getTimeStamp(); + String body = message.getBody(); + appendMessage(fqName, name, timestamp, body); + } + + public void appendMessage(String fqName, String name, long timestamp, + String body) { + // String fqName = message.getFrom().getFQName(); + // String name = message.getFrom().getName(); + if (name == null) { + name = fqName.substring(0, fqName.indexOf("@")); + } + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(timestamp); + String time = String.format("%1$tI:%1$tM:%1$tS %1$Tp", cal); + StringBuilder sb = new StringBuilder(); + if (messagesText.getCharCount() != 0) { + sb.append("\n"); + } + sb.append("(").append(time).append(") "); + int offset = sb.length(); + + sb.append(name).append(": ").append(body); + + // here is the place to put the font and color changes for keywords + // read in localization file once and then don't read in again, per + // chat room? + Collection alertWords = findAlertWords(sb, + offset + name.length() + 2); + List ranges = new ArrayList(); + if (alertWords != null) { + for (String keyword : alertWords) { + if (sb.toString().toLowerCase().contains(keyword.toLowerCase())) { + StyleRange keywordRange = new StyleRange( + messagesText.getCharCount() + + sb.toString().toLowerCase() + .indexOf(keyword.toLowerCase()), + keyword.length(), null, null, SWT.BOLD | SWT.ITALIC); + ranges.add(keywordRange); + } + } + } + + ParticipantRole[] roles = getRoles(fqName); + + Color color = SessionColorAdvisor.getColor(roles, fqName + .equals(CollaborationDataManager.getInstance().getLoginId())); + StyleRange range = new StyleRange(messagesText.getCharCount() + offset, + name.length() + 1, color, null, SWT.BOLD); + messagesText.append(sb.toString()); + messagesText.setStyleRange(range); + for (StyleRange newRange : ranges) { + messagesText.setStyleRange(newRange); + } + messagesText.setTopIndex(messagesText.getLineCount() - 1); + + // room for other fun things here, such as sounds and such + executeSightsSounds(); + } + + /** + * Find keys words in body of message starting at offset. /** + * + * @param builder + * @param offset + * @return alertWords + */ + protected Collection findAlertWords(StringBuilder builder, + int offset) { + return null; + } + + /** + * Returns a list of Participant roles the user is assigned for the session. + * This sets up a default list of user as a PARTICIPANT. + * + * @param userId + * @return roles + */ + protected ParticipantRole[] getRoles(String userId) { + return new ParticipantRole[] { ParticipantRole.PARTICIPANT }; + } + + /** + * Place holder must override to do something. + */ + protected void executeSightsSounds() { + // placeholder for future things + } + /* * (non-Javadoc) * diff --git a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/CollaborationSessionView.java b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/CollaborationSessionView.java index 3e80deeec4..33247851c0 100644 --- a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/CollaborationSessionView.java +++ b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/CollaborationSessionView.java @@ -20,6 +20,9 @@ package com.raytheon.uf.viz.collaboration.ui.session; * further licensing information. **/ +import java.util.Collection; +import java.util.List; + import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IMenuCreator; @@ -32,7 +35,9 @@ import org.eclipse.ui.IWorkbenchPart; import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException; import com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession; import com.raytheon.uf.viz.collaboration.comm.identity.info.IVenueInfo; +import com.raytheon.uf.viz.collaboration.comm.identity.user.ParticipantRole; import com.raytheon.uf.viz.collaboration.data.CollaborationDataManager; +import com.raytheon.uf.viz.collaboration.data.CollaborationUser; /** * TODO Add Description @@ -126,6 +131,43 @@ public class CollaborationSessionView extends SessionView { return COLLABORATION_SESSION_IMAGE_NAME; } + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.collaboration.ui.session.AbstractSessionView#getRoles + * (java.lang.String) + */ + @SuppressWarnings("unchecked") + @Override + protected ParticipantRole[] getRoles(String userId) { + for (CollaborationUser u : ((List) usersTable + .getInput())) { + if (userId.equals(u.getId())) { + return u.getRoles(); + } + } + return new ParticipantRole[] { ParticipantRole.PARTICIPANT }; + } + + @Override + protected Collection findAlertWords(StringBuilder builder, + int offset) { + // TODO + // 1) if needed read in localized list of key words/sounds + // 2) search builder starting at offset for key works. besides the key + // words found may also want to return the location(s) of where they are + // found along with the sound to used. + return super.findAlertWords(builder, offset); + } + + @Override + protected void executeSightsSounds() { + // TODO From the alert words found determine what sound to play and for + // how long? + super.executeSightsSounds(); + } + /* * (non-Javadoc) * diff --git a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/PeerToPeerView.java b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/PeerToPeerView.java index b31f2219a0..220492b720 100644 --- a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/PeerToPeerView.java +++ b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/PeerToPeerView.java @@ -29,7 +29,6 @@ import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException; import com.raytheon.uf.viz.collaboration.comm.identity.IPeerToPeer; -import com.raytheon.uf.viz.collaboration.comm.identity.ISession; import com.raytheon.uf.viz.collaboration.comm.identity.listener.IMessageListener; import com.raytheon.uf.viz.collaboration.data.CollaborationDataManager; @@ -165,32 +164,42 @@ public class PeerToPeerView extends AbstractSessionView { // Get any open session to send peer-to-peer message IPeerToPeer p2p = null; try { - p2p = (IPeerToPeer) CollaborationDataManager.getInstance().getSessionManager().getPeerToPeerSession(); + p2p = (IPeerToPeer) CollaborationDataManager.getInstance() + .getSessionManager().getPeerToPeerSession(); } catch (CollaborationException e) { - // TODO Auto-generated catch block. Please revise as appropriate. - statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e); + // TODO Auto-generated catch block. Please revise as + // appropriate. + statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + e); } - if(p2p != null) { + if (p2p != null) { p2p.sendPeerToPeer(toUser, message); + // TODO need to put the message in messag text field here. + CollaborationDataManager manager = CollaborationDataManager + .getInstance(); + String fqName = manager.getLoginId(); + String name = null; + long timestamp = System.currentTimeMillis(); + appendMessage(fqName, name, timestamp, message); } - -// ISession session = CollaborationDataManager.getInstance() -// .getSession(null); -// if (session != null) { -// session.sendTextMessage(toUser, message); -// } else { -// try { -// session = CollaborationDataManager.getInstance() -// .getSessionManager().createPeerToPeerSession(); -// // session.sendTextMessage(toUser, message); -// // session.close(); -// } catch (CollaborationException e) { -// // TODO Auto-generated catch block. Please revise as -// // appropriate. -// statusHandler.handle(Priority.PROBLEM, -// e.getLocalizedMessage(), e); -// } -// } + + // ISession session = CollaborationDataManager.getInstance() + // .getSession(null); + // if (session != null) { + // session.sendTextMessage(toUser, message); + // } else { + // try { + // session = CollaborationDataManager.getInstance() + // .getSessionManager().createPeerToPeerSession(); + // // session.sendTextMessage(toUser, message); + // // session.close(); + // } catch (CollaborationException e) { + // // TODO Auto-generated catch block. Please revise as + // // appropriate. + // statusHandler.handle(Priority.PROBLEM, + // e.getLocalizedMessage(), e); + // } + // } } } diff --git a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/SessionView.java b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/SessionView.java index 93e295d3f2..4e3d3fb4c6 100644 --- a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/SessionView.java +++ b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/session/SessionView.java @@ -21,7 +21,6 @@ package com.raytheon.uf.viz.collaboration.ui.session; **/ import java.util.ArrayList; -import java.util.Calendar; import java.util.List; import org.eclipse.jface.action.Action; @@ -35,11 +34,9 @@ import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.custom.SashForm; -import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseTrackAdapter; -import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; @@ -71,7 +68,6 @@ import com.raytheon.uf.viz.collaboration.comm.identity.info.IVenueInfo; import com.raytheon.uf.viz.collaboration.comm.identity.user.IVenueParticipant; import com.raytheon.uf.viz.collaboration.comm.identity.user.ParticipantRole; import com.raytheon.uf.viz.collaboration.data.CollaborationDataManager; -import com.raytheon.uf.viz.collaboration.data.CollaborationKeywords; import com.raytheon.uf.viz.collaboration.data.CollaborationUser; import com.raytheon.uf.viz.core.VizApp; @@ -99,7 +95,7 @@ public class SessionView extends AbstractSessionView { public static final String ID = "com.raytheon.uf.viz.collaboration.SessionView"; - private TableViewer usersTable; + protected TableViewer usersTable; protected String sessionId; @@ -202,7 +198,7 @@ public class SessionView extends AbstractSessionView { @Override public void run() { - addMessage(msg); + appendMessage(msg); } }); } @@ -402,94 +398,6 @@ public class SessionView extends AbstractSessionView { } } - // @SuppressWarnings("unchecked") - // public void addUser(CollaborationUser user) { - // List list = (List) usersTable - // .getInput(); - // list.add(user); - // } - // - // @SuppressWarnings("unchecked") - // public void clearUsers() { - // List list = (List) usersTable - // .getInput(); - // list.clear(); - // ; - // } - // - // @SuppressWarnings("unchecked") - // public void removeUser(CollaborationUser user) { - // List list = (List) usersTable - // .getInput(); - // list.remove(user); - // } - - public void addMessage(IMessage message) { - String name = message.getFrom().getFQName(); - String user = message.getFrom().getName(); - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(message.getTimeStamp()); - String time = String.format("%1$tI:%1$tM:%1$tS %1$Tp", cal); - StringBuilder sb = new StringBuilder(); - if (messagesText.getCharCount() != 0) { - sb.append("\n"); - } - int offset = 0; - sb.append("(").append(time).append(") "); - offset = sb.length(); - - sb.append(user).append(": ").append(message.getBody()); - - // here is the place to put the font and color changes for keywords - // read in localization file once and then don't read in again, per - // chat room? - List keywords = CollaborationKeywords.parseKeywords(); - List ranges = new ArrayList(); - if (keywords != null) { - for (String keyword : keywords) { - if (sb.toString().toLowerCase().contains(keyword.toLowerCase())) { - StyleRange keywordRange = new StyleRange( - messagesText.getCharCount() - + sb.toString().toLowerCase() - .indexOf(keyword.toLowerCase()), - keyword.length(), null, null, SWT.BOLD | SWT.ITALIC); - ranges.add(keywordRange); - } - } - } - - ParticipantRole[] type = null; - for (CollaborationUser u : (List) usersTable - .getInput()) { - if (name.equals(u.getId())) { - type = u.getRoles(); - break; - } - } - - Color color = SessionColorAdvisor.getColor(type, name - .equals(CollaborationDataManager.getInstance().getLoginId())); - StyleRange range = new StyleRange(messagesText.getCharCount() + offset, - user.length() + 1, color, null, SWT.BOLD); - messagesText.append(sb.toString()); - messagesText.setStyleRange(range); - for (StyleRange newRange : ranges) { - messagesText.setStyleRange(newRange); - } - messagesText.setTopIndex(messagesText.getLineCount() - 1); - - // room for other fun things here, such as sounds and such - executeSightsSounds(); - } - - /** - * - */ - private void executeSightsSounds() { - // TODO Auto-generated method stub - // placeholder for future things - } - /* * (non-Javadoc) *