diff options
| author | slewis | 2005-04-14 06:32:05 +0000 |
|---|---|---|
| committer | slewis | 2005-04-14 06:32:05 +0000 |
| commit | a544f56fe0c27998fdf84edbf6410c49b39e0915 (patch) | |
| tree | bf239791f64dfbc20a75e3febdf857e768c91c79 | |
| parent | c60ceea0e94b3a5208c8a9c2c4070b67fb8b75d8 (diff) | |
| download | org.eclipse.ecf-a544f56fe0c27998fdf84edbf6410c49b39e0915.tar.gz org.eclipse.ecf-a544f56fe0c27998fdf84edbf6410c49b39e0915.tar.xz org.eclipse.ecf-a544f56fe0c27998fdf84edbf6410c49b39e0915.zip | |
Fixes for many IM bugs. Group creation, add/remove of buddy, etc.
13 files changed, 339 insertions, 169 deletions
diff --git a/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java b/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java index b7bba52ab..818304003 100644 --- a/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java +++ b/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java @@ -13,10 +13,12 @@ package org.eclipse.ecf.example.collab; import java.net.ConnectException; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; +import java.util.List; import java.util.Vector; import org.eclipse.core.resources.IResource; @@ -47,9 +49,11 @@ import org.eclipse.ecf.presence.IPresenceSender; import org.eclipse.ecf.presence.IRosterEntry; import org.eclipse.ecf.presence.ISubscribeListener; import org.eclipse.ecf.presence.impl.Presence; -import org.eclipse.ecf.ui.dialogs.AuthorizeRequest; +import org.eclipse.ecf.ui.dialogs.AddBuddyDialog; +import org.eclipse.ecf.ui.dialogs.ReceiveAuthorizeRequestDialog; import org.eclipse.ecf.ui.views.ILocalInputHandler; import org.eclipse.ecf.ui.views.RosterView; +import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; @@ -356,6 +360,15 @@ public class Client { public void updatePresence(ID userID, IPresence presence) { presenceSender.sendPresenceUpdate(localUser,userID,presence); } + + public void sendRosterAdd(String user, String name, String[] groups) { + // Send roster add + presenceSender.sendRosterAdd(localUser, user,name,groups); + } + + public void sendRosterRemove(ID userID) { + presenceSender.sendRosterRemove(localUser, userID); + } }); } catch (Exception e) { @@ -430,24 +443,40 @@ public class Client { try { IWorkbenchWindow ww = PlatformUI.getWorkbench() .getActiveWorkbenchWindow(); - AuthorizeRequest authRequest = new AuthorizeRequest(ww.getShell(),fromID.getName(),localUser.getName()); + ReceiveAuthorizeRequestDialog authRequest = new ReceiveAuthorizeRequestDialog(ww.getShell(),fromID.getName(),localUser.getName()); + authRequest.setBlockOnOpen(true); authRequest.open(); int res = authRequest.getButtonPressed(); - if (res == AuthorizeRequest.AUTHORIZE_AND_ADD) { + if (res == ReceiveAuthorizeRequestDialog.AUTHORIZE_AND_ADD) { if (presenceSender != null) { presenceSender.sendPresenceUpdate(localUser,fromID,new Presence(IPresence.Type.SUBSCRIBED)); // Get group info here if (rosterView != null) { String [] groupNames = rosterView.getGroupNames(); - // XXX TODO + List g = Arrays.asList(groupNames); + String selectedGroup = rosterView.getSelectedGroupName(); + int selected = (selectedGroup==null)?-1:g.indexOf(selectedGroup); + AddBuddyDialog sg = new AddBuddyDialog(ww.getShell(),fromID.getName(),groupNames,selected); + sg.open(); + if (sg.getReturnCode() == Window.OK) { + String group = sg.getGroup(); + String user = sg.getUser(); + String nickname = sg.getNickname(); + sg.close(); + if (!g.contains(group)) { + // create group with name + rosterView.addGroup(group); + } + // Finally, send the information and request subscription + presenceSender.sendRosterAdd(localUser, user,nickname,new String[] { group } ); + } } - presenceSender.sendPresenceUpdate(localUser,fromID,new Presence(IPresence.Type.SUBSCRIBE)); } - } else if (res == AuthorizeRequest.AUTHORIZE_ID) { + } else if (res == ReceiveAuthorizeRequestDialog.AUTHORIZE_ID) { if (presenceSender != null) { presenceSender.sendPresenceUpdate(localUser,fromID,new Presence(IPresence.Type.SUBSCRIBED)); } - } else if (res == AuthorizeRequest.REFUSE_ID) { + } else if (res == ReceiveAuthorizeRequestDialog.REFUSE_ID) { System.out.println("Refuse hit"); } else { System.out.println("No buttons hit"); @@ -462,6 +491,9 @@ public class Client { public void handleUnsubscribeRequest(ID fromID, IPresence presence) { System.out.println("unsubscribe request from "+fromID); + if (presenceSender != null) { + presenceSender.sendPresenceUpdate(localUser,fromID,new Presence(IPresence.Type.UNSUBSCRIBED)); + } } public void handleSubscribed(ID fromID, IPresence presence) { diff --git a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java index baa3c97ac..e596e1d81 100644 --- a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java +++ b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java @@ -15,5 +15,6 @@ import org.eclipse.ecf.core.identity.ID; public interface IPresenceSender { public void sendPresenceUpdate(ID fromID, ID toID, IPresence presence); - + public void sendRosterAdd(ID fromID, String user, String name, String [] groups); + public void sendRosterRemove(ID fromID, ID userID); } diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AddBuddyDialog.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AddBuddyDialog.java new file mode 100644 index 000000000..dc17b8c7e --- /dev/null +++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AddBuddyDialog.java @@ -0,0 +1,117 @@ +package org.eclipse.ecf.ui.dialogs; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +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.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class AddBuddyDialog extends Dialog { + + private Text usertext; + private Text nicknametext; + private Combo groups; + + private String user = null; + private String [] existing = null; + private int selectedGroup = -1; + + private int result; + + private String userresult = null; + private String nicknameresult = null; + private String groupsresult = null; + + public AddBuddyDialog(Shell parentShell,String username, String [] existingGroups, int selectedGroup) { + super(parentShell); + this.user = username; + this.existing = existingGroups; + this.selectedGroup = selectedGroup; + } + protected Control createDialogArea(Composite parent) { + Composite container = (Composite) super.createDialogArea(parent); + final GridLayout gridLayout = new GridLayout(); + gridLayout.horizontalSpacing = 0; + container.setLayout(gridLayout); + + final Composite composite = new Composite(container, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + final GridLayout gridLayout_2 = new GridLayout(); + gridLayout_2.numColumns = 2; + composite.setLayout(gridLayout_2); + + final Label label_3 = new Label(composite, SWT.NONE); + label_3.setText("User ID:"); + + usertext = new Text(composite, SWT.BORDER); + usertext.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + if (user != null) { + usertext.setText(user); + usertext.setEnabled(false); + } + + final Label label_1 = new Label(composite, SWT.NONE); + label_1.setText("Group:"); + + groups = new Combo(composite, SWT.NONE); + groups.setToolTipText("Select group or enter new group"); + final GridData gridData = new GridData(GridData.FILL_HORIZONTAL); + gridData.widthHint = 141; + groups.setLayoutData(gridData); + if (existing != null) { + for(int i=0; i < existing.length; i++) { + groups.add(existing[i]); + } + if (selectedGroup != -1) groups.select(selectedGroup); + else groups.select(0); + } + + final Label label_2 = new Label(composite, SWT.NONE); + label_2.setText("Nickname:"); + + nicknametext = new Text(composite, SWT.BORDER); + final GridData gridData_1 = new GridData(GridData.FILL_HORIZONTAL); + gridData_1.widthHint = 192; + nicknametext.setLayoutData(gridData_1); + // + return container; + } + + protected void createButtonsForButtonBar(Composite parent) { + createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, + true); + createButton(parent, IDialogConstants.CANCEL_ID, + IDialogConstants.CANCEL_LABEL, false); + } + public String getGroup() { + return groupsresult; + } + public String getUser() { + return userresult; + } + public String getNickname() { + return nicknameresult; + } + protected Point getInitialSize() { + return new Point(302, 168); + } + public void buttonPressed(int button) { + result = button; + userresult = usertext.getText(); + nicknameresult = nicknametext.getText(); + groupsresult = groups.getText(); + close(); + } + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText("Add Buddy"); + } + +} diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AuthorizeRequest.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/ReceiveAuthorizeRequestDialog.java index 5de15784e..b37313c88 100644 --- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AuthorizeRequest.java +++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/ReceiveAuthorizeRequestDialog.java @@ -11,7 +11,7 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; -public class AuthorizeRequest extends Dialog { +public class ReceiveAuthorizeRequestDialog extends Dialog { private String targetName = "target"; private String requesterName = "requester"; @@ -24,11 +24,11 @@ public class AuthorizeRequest extends Dialog { int buttonPressed = 0; - public AuthorizeRequest(Shell parentShell) { + public ReceiveAuthorizeRequestDialog(Shell parentShell) { super(parentShell); } - public AuthorizeRequest(Shell parentShell, String fromName, String toName) { + public ReceiveAuthorizeRequestDialog(Shell parentShell, String fromName, String toName) { super(parentShell); this.requesterName = fromName; this.targetName = toName; diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SelectGroup.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SelectGroup.java deleted file mode 100644 index 6a3813392..000000000 --- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SelectGroup.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.eclipse.ecf.ui.dialogs; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; -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.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; - -public class SelectGroup extends Dialog { - - private Label username; - private Combo groups; - - private String user = null; - private String [] existing = null; - - private int result; - - public SelectGroup(Shell parentShell,String username, String [] existing) { - super(parentShell); - this.user = username; - this.existing = existing; - } - protected Control createDialogArea(Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); - final GridLayout gridLayout = new GridLayout(); - gridLayout.horizontalSpacing = 0; - container.setLayout(gridLayout); - - final Composite composite_1 = new Composite(container, SWT.NONE); - final GridLayout gridLayout_1 = new GridLayout(); - gridLayout_1.horizontalSpacing = 0; - gridLayout_1.numColumns = 2; - composite_1.setLayout(gridLayout_1); - - final Label label = new Label(composite_1, SWT.NONE); - label.setText("Please select a group for"); - - username = new Label(composite_1, SWT.NONE); - username.setText(" user"); - - final Composite composite = new Composite(container, SWT.NONE); - composite.setLayoutData(new GridData(GridData.FILL_BOTH)); - composite.setLayout(new GridLayout()); - - groups = new Combo(composite, SWT.NONE); - groups.setToolTipText("Select group or enter new group"); - final GridData gridData = new GridData(GridData.GRAB_HORIZONTAL); - gridData.widthHint = 141; - groups.setLayoutData(gridData); - // - return container; - } - - protected void createButtonsForButtonBar(Composite parent) { - createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, - true); - createButton(parent, IDialogConstants.CANCEL_ID, - IDialogConstants.CANCEL_LABEL, false); - } - - public String getGroup() { - return groups.getText(); - } - protected Point getInitialSize() { - return new Point(292, 141); - } - protected void configureShell(Shell newShell) { - super.configureShell(newShell); - newShell.setText("Select Group"); - } - -} diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SendAuthorizeRequest.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SendAuthorizeRequest.java deleted file mode 100644 index 36c2cd8d5..000000000 --- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/SendAuthorizeRequest.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.eclipse.ecf.ui.dialogs; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Shell; - -public class SendAuthorizeRequest extends Dialog { - - public SendAuthorizeRequest(Shell parentShell) { - super(parentShell); - } - - protected Control createDialogArea(Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); - // - return container; - } - - protected void createButtonsForButtonBar(Composite parent) { - createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, - true); - createButton(parent, IDialogConstants.CANCEL_ID, - IDialogConstants.CANCEL_LABEL, false); - } - - protected Point getInitialSize() { - return new Point(500, 375); - } - protected void configureShell(Shell newShell) { - super.configureShell(newShell); - newShell.setText("Send Subscribe Request"); - } - -} diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/ILocalInputHandler.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/ILocalInputHandler.java index 35c43cb46..ed7410df1 100644 --- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/ILocalInputHandler.java +++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/ILocalInputHandler.java @@ -18,5 +18,7 @@ public interface ILocalInputHandler { public void inputText(ID userID, String text); public void startTyping(ID userID); public void updatePresence(ID userID, IPresence presence); + public void sendRosterAdd(String user, String name, String [] groups); + public void sendRosterRemove(ID userID); public void disconnect(); } diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java index be7f24402..078112df5 100644 --- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java +++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java @@ -13,11 +13,13 @@ package org.eclipse.ecf.ui.views; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; + import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Path; import org.eclipse.ecf.core.identity.ID; @@ -32,6 +34,7 @@ import org.eclipse.ecf.presence.IRosterGroup; import org.eclipse.ecf.presence.impl.RosterEntry; import org.eclipse.ecf.ui.UiPlugin; import org.eclipse.ecf.ui.UiPluginConstants; +import org.eclipse.ecf.ui.dialogs.AddBuddyDialog; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; @@ -53,6 +56,7 @@ import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; @@ -80,7 +84,7 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL private Action addGroupAction; protected IUser localUser; - protected ILocalInputHandler textInputHandler; + protected ILocalInputHandler inputHandler; protected Hashtable chatThreads = new Hashtable(); protected ID groupID; @@ -91,15 +95,19 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL protected String getUserNameFromID(ID userID) { if (userID == null) return ""; String uname = userID.getName(); - String username = uname.substring(0,uname.indexOf("@")); + int index = uname.indexOf("@"); + String username = uname; + if (index >= 0) { + username = uname.substring(0,index); + } if (username.equals("")) { return uname; } else return username; } public void dispose() { - if (textInputHandler != null) { - textInputHandler.disconnect(); - textInputHandler = null; + if (inputHandler != null) { + inputHandler.disconnect(); + inputHandler = null; } super.dispose(); } @@ -267,6 +275,8 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL public TreeBuddy fillPresence(TreeBuddy obj, IPresence presence) { obj.setPresence(presence); + obj.removeChildren(); + obj.addChild(new TreeObject("Account: "+obj.getUserID().getName())); TreeObject type = new TreeObject("Status: " + presence.getType().toString()); obj.addChild(type); @@ -325,23 +335,27 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL } else return new String[0]; } public TreeBuddy findBuddy(TreeParent parent, IRosterEntry entry) { + return findBuddy(parent,entry.getUserID()); + } + + public TreeBuddy findBuddy(TreeParent parent, ID entryID) { TreeObject [] objs = parent.getChildren(); if (objs == null) return null; for(int i=0; i < objs.length; i++) { if (objs[i] instanceof TreeBuddy) { TreeBuddy tb = (TreeBuddy) objs[i]; ID tbid = tb.getUserID(); - if (tbid != null && tbid.equals(entry.getUserID())) { + if (tbid != null && tbid.equals(entryID)) { return (TreeBuddy) objs[i]; } } else if (objs[i] instanceof TreeGroup) { - TreeBuddy found = findBuddy((TreeParent) objs[i],entry); + TreeBuddy found = findBuddy((TreeParent) objs[i],entryID); if (found != null) return found; } } return null; } - + public TreeBuddy findAndReplaceEntry(TreeParent parent, IRosterEntry entry) { TreeBuddy tb = findBuddy(parent,entry); TreeBuddy result = createBuddy(tb,entry); @@ -373,7 +387,9 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL parent.addChild(newgrp); } } else { - parent.addChild(newBuddy); + TreeGroup tg = new TreeGroup("Unfiled"); + tg.addChild(newBuddy); + parent.addChild(tg); } } } @@ -408,7 +424,18 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL public void addEntry(IRosterEntry entry) { addEntry(root, entry); } - + public void removeRosterEntry(ID entry) { + removeEntry(root,entry); + } + public void removeEntry(TreeParent parent, ID entry) { + TreeBuddy buddy = findBuddy(parent,entry); + if (buddy == null) return; + TreeParent p = buddy.getParent(); + if (p != null) { + p.removeChild(buddy); + refreshView(); + } + } public void removeAllEntries() { root = null; } @@ -526,17 +553,25 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL UiPlugin.getDefault().find(new Path(INSTANT_MESSAGE_ICON)))); manager.add(selectedChatAction); + TreeObject parent = treeObject.getParent(); + TreeGroup tg = null; if (parent != null && parent instanceof TreeGroup) { - final TreeGroup treeGroup = (TreeGroup) parent; - Action removeUserAction = new Action() { - public void run() { - removeUserFromGroup(tb,treeGroup); - } - }; + tg = (TreeGroup) parent; + } + final TreeGroup treeGroup = tg; + Action removeUserAction = new Action() { + public void run() { + removeUserFromGroup(tb,treeGroup); + } + }; + if (treeGroup != null) { removeUserAction.setText("Remove "+treeObject.getName()+" from "+treeGroup.getName()); - manager.add(removeUserAction); + } else { + removeUserAction.setText("Remove "+treeObject.getName()); } + manager.add(removeUserAction); + } else if (treeObject instanceof TreeGroup) { final TreeGroup treeGroup = (TreeGroup) treeObject; final String groupName = treeGroup.getName(); @@ -545,7 +580,7 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL addUserToGroup(groupName); } }; - addUserAction.setText("Add buddy to "+treeObject.getName()+" group"); + addUserAction.setText("Add buddy to "+treeObject.getName()); addUserAction.setImageDescriptor(ImageDescriptor.createFromURL( UiPlugin.getDefault().find(new Path(ADDGROUP_ICON)))); manager.add(addUserAction); @@ -558,13 +593,31 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL } protected void addUserToGroup(String groupName) { - // XXX TODO - System.out.println("adding user to group "+groupName); + String [] groupNames = getGroupNames(); + String selected = getSelectedGroupName(); + int index = -1; + if (selected != null && selected.equals(groupName)) { + index = 0; + } + AddBuddyDialog sg = new AddBuddyDialog(viewer.getControl().getShell(),null,new String[] { groupName },index); + sg.open(); + if (sg.getReturnCode() == Window.OK) { + String group = sg.getGroup(); + String user = sg.getUser(); + String nickname = sg.getNickname(); + sg.close(); + if (!Arrays.asList(groupNames).contains(group)) { + // create group with name + addGroup(group); + } + inputHandler.sendRosterAdd(user,nickname,new String[] { group } ); + } } protected void removeUserFromGroup(TreeBuddy buddy, TreeGroup group) { - // XXX TODO - System.out.println("removing user "+buddy.getName()+ " from group "+group); + if (inputHandler != null) { + inputHandler.sendRosterRemove(buddy.getUserID()); + } } protected TreeObject getSelectedTreeObject() { ISelection selection = viewer.getSelection(); @@ -622,8 +675,8 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL }; disconnectAction = new Action() { public void run() { - if (textInputHandler != null) { - textInputHandler.disconnect(); + if (inputHandler != null) { + inputHandler.disconnect(); chatAction.setEnabled(false); addGroupAction.setEnabled(false); disconnectAction.setEnabled(false); @@ -668,7 +721,7 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL } }; addGroupAction.setText("Add Group..."); - addGroupAction.setToolTipText("Add group to list"); + addGroupAction.setToolTipText("Add group"); addGroupAction.setEnabled(false); addGroupAction.setImageDescriptor(ImageDescriptor.createFromURL( UiPlugin.getDefault().find(new Path(ADDGROUP_ICON)))); @@ -728,7 +781,10 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL ViewContentProvider vcp = (ViewContentProvider) viewer .getContentProvider(); if (vcp != null) { - vcp.addEntry(entry); + if (entry.getInterestType() == IRosterEntry.InterestType.REMOVE || + entry.getInterestType() == IRosterEntry.InterestType.NONE) { + vcp.removeRosterEntry(entry.getUserID()); + } else vcp.addEntry(entry); refreshView(); } } @@ -746,38 +802,52 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL */ public void setLocalUser(IUser user, ILocalInputHandler textInputHandler) { this.localUser = user; - this.textInputHandler = textInputHandler; + this.inputHandler = textInputHandler; } public Object getAdapter(Class clazz) { if (clazz != null && clazz.equals(ILocalInputHandler.class)) { return new ILocalInputHandler() { public void inputText(ID userID, String text) { - if (textInputHandler != null) { - textInputHandler.inputText(userID, text); + if (inputHandler != null) { + inputHandler.inputText(userID, text); } else System.out.println("handleTextLine(" + text + ")"); } public void startTyping(ID userID) { - if (textInputHandler != null) { - textInputHandler.startTyping(userID); + if (inputHandler != null) { + inputHandler.startTyping(userID); } else System.out.println("handleStartTyping()"); } public void disconnect() { - if (textInputHandler != null) { - textInputHandler.disconnect(); + if (inputHandler != null) { + inputHandler.disconnect(); } else System.out.println("disconnect()"); } public void updatePresence(ID userID, IPresence presence) { - if (textInputHandler != null) { - textInputHandler.updatePresence(userID,presence); + if (inputHandler != null) { + inputHandler.updatePresence(userID,presence); } else System.out.println("disconnect()"); } + + public void sendRosterAdd(String user, String name, String[] groups) { + if (inputHandler != null) { + inputHandler.sendRosterAdd(user,name,groups); + } else + System.out.println("sendRosterAdd()"); + } + + public void sendRosterRemove(ID userID) { + if (inputHandler != null) { + inputHandler.sendRosterRemove(userID); + } else + System.out.println("sendRosterRemove()"); + } }; } else if (clazz.equals(IPresenceListener.class)) { return this; @@ -884,6 +954,14 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL refreshView(); } } + public void removeRosterEntry(ID id) { + ViewContentProvider vcp = (ViewContentProvider) viewer + .getContentProvider(); + if (vcp != null) { + vcp.removeRosterEntry(id); + refreshView(); + } + } protected void handleGroupManagerDeparted() { removeAllRosterEntries(); disposeAllChatWindows("Disconnected from server. Chat is inactive"); diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/IIMMessageSender.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/IIMMessageSender.java index eee180899..95f5d7fe9 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/IIMMessageSender.java +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/IIMMessageSender.java @@ -23,5 +23,6 @@ public interface IIMMessageSender { public void sendPresenceUpdate(ID target, Presence presence) throws IOException; public Roster getRoster() throws IOException; - + public void sendRosterAdd(String user, String name, String [] groups) throws IOException; + public void sendRosterRemove(String user) throws IOException; } diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java index b41a6fef7..b90845ab1 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java @@ -298,13 +298,25 @@ public class XMPPClientSOContainer extends ClientSOContainer { protected Presence makePresenceFromIPresence(IPresence presence) { return sharedObject.makePresence(presence); } - public void sendPresenceUpdate(ID target, Presence presence) throws IOException { + protected void sendPresenceUpdate(ID target, Presence presence) throws IOException { if (messageSender != null) { if (presence == null) throw new NullPointerException("presence cannot be null"); messageSender.sendPresenceUpdate(target, presence); } } + protected void sendRosterAdd(String user, String name, String [] groups) throws IOException { + if (messageSender != null) { + messageSender.sendRosterAdd(user,name,groups); + } + } + + protected void sendRosterRemove(String user) throws IOException { + if (messageSender != null) { + messageSender.sendRosterRemove(user); + } + } + public Object getAdapter(Class clazz) { if (clazz.equals(IPresenceContainer.class)) { return new IPresenceContainer() { @@ -345,7 +357,24 @@ public class XMPPClientSOContainer extends ClientSOContainer { dumpStack("Exception in sendPresenceUpdate to "+toID+" with presence "+presence,e); } } - + + public void sendRosterAdd(ID fromID, String user, String name, String[] groups) { + try { + XMPPClientSOContainer.this.sendRosterAdd(user,name,groups); + } catch (IOException e) { + dumpStack("Exception in sendRosterAdd",e); + } + } + + public void sendRosterRemove(ID fromID, ID userID) { + try { + if (userID == null) return; + XMPPClientSOContainer.this.sendRosterRemove(userID.getName()); + } catch (IOException e) { + dumpStack("Exception in sendRosterAdd",e); + } + } + }; } diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPContainerContext.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPContainerContext.java index a17115804..1fb712f13 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPContainerContext.java +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPContainerContext.java @@ -10,9 +10,9 @@ package org.eclipse.ecf.provider.xmpp.container; import java.io.IOException; import java.util.Map; + import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.util.IQueueEnqueue; -import org.eclipse.ecf.presence.IPresence; import org.eclipse.ecf.provider.generic.SOContainer; import org.eclipse.ecf.provider.generic.SOContext; import org.jivesoftware.smack.Roster; @@ -34,8 +34,6 @@ public class XMPPContainerContext extends SOContext { public void sendMessage(ID target, String message) throws IOException { ((XMPPClientSOContainer) container).sendMessage(target,message); } - public void sendPresenceUpdate(ID target, IPresence presence) throws IOException { - } public Roster getRoster() throws IOException { return ((XMPPClientSOContainer) container).getRoster(); } @@ -43,6 +41,12 @@ public class XMPPContainerContext extends SOContext { if (presence == null) throw new NullPointerException("presence cannot be null"); ((XMPPClientSOContainer) container).sendPresenceUpdate(target,presence); } + public void sendRosterAdd(String user, String name, String[] groups) throws IOException { + ((XMPPClientSOContainer) container).sendRosterAdd(user,name,groups); + } + public void sendRosterRemove(String user) throws IOException { + ((XMPPClientSOContainer) container).sendRosterRemove(user); + } }; } else return null; } diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java index 8e41d9c27..38c417309 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java @@ -264,11 +264,13 @@ public class XMPPPresenceSharedObject implements ISharedObject, IAccountManager if (iq instanceof RosterPacket) { // Roster packet...report to UI RosterPacket rosterPacket = (RosterPacket) iq; + if (rosterPacket.getType() == IQ.Type.SET || rosterPacket.getType() == IQ.Type.RESULT) { for (Iterator i = rosterPacket.getRosterItems(); i.hasNext();) { IRosterEntry entry = makeRosterEntry((RosterPacket.Item) i .next()); fireRosterEntry(entry); } + } } else { debug("Received unknown IQ message: " + iq.toXML()); } diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/smack/ChatConnection.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/smack/ChatConnection.java index 25c8405e3..754060a62 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/smack/ChatConnection.java +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/smack/ChatConnection.java @@ -24,6 +24,7 @@ import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ConnectionListener; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.Roster; +import org.jivesoftware.smack.RosterEntry; import org.jivesoftware.smack.SmackConfiguration; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; @@ -135,7 +136,7 @@ public class ChatConnection implements ISynchAsynchConnection, IIMMessageSender } }, null); // Login - connection.login(username, (String) data, "ECF"); + connection.login(username, (String) data, "ECF_XMPP"); isConnected = true; debug("User: " + username + " logged into " + serverName); roster = getRoster(); @@ -310,6 +311,24 @@ public class ChatConnection implements ISynchAsynchConnection, IIMMessageSender connection.sendPacket(presence); } } + + public void sendRosterAdd(String user, String name, String [] groups) throws IOException { + Roster r = getRoster(); + try { + r.createEntry(user,name,groups); + } catch (XMPPException e) { + e.printStackTrace(); + } + } + public void sendRosterRemove(String user) throws IOException { + Roster r = getRoster(); + RosterEntry re = r.getEntry(user); + try { + r.removeEntry(re); + } catch (XMPPException e) { + e.printStackTrace(); + } + } /* * (non-Javadoc) * @@ -323,4 +342,5 @@ public class ChatConnection implements ISynchAsynchConnection, IIMMessageSender Roster roster = connection.getRoster(); return roster; } + } |
