diff options
| author | slewis | 2005-04-15 07:12:21 +0000 |
|---|---|---|
| committer | slewis | 2005-04-15 07:12:21 +0000 |
| commit | 061a195edc4168a2de56c54a2dc47c00c4d3f2ed (patch) | |
| tree | 9430a19accc4efb36a9198ff7d82a9801ec54e13 | |
| parent | cde1859649def31e6d3cefd0f34c37715e102fad (diff) | |
| download | org.eclipse.ecf-061a195edc4168a2de56c54a2dc47c00c4d3f2ed.tar.gz org.eclipse.ecf-061a195edc4168a2de56c54a2dc47c00c4d3f2ed.tar.xz org.eclipse.ecf-061a195edc4168a2de56c54a2dc47c00c4d3f2ed.zip | |
Fixed bugs in buddy list view. Added ability to handle iq set events properly.
6 files changed, 202 insertions, 48 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 818304003..6593fc7ac 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 @@ -433,6 +433,14 @@ public class Client { messageSender = null; rosterView = null; } + + public void handleSetRosterEntry(final IRosterEntry entry) { + Display.getDefault().syncExec(new Runnable() { + public void run() { + rosterView.handleSetRosterEntry(entry); + } + }); + } }); pc.addSubscribeListener(new ISubscribeListener() { @@ -458,7 +466,7 @@ public class Client { 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) { + if (sg.getResult() == Window.OK) { String group = sg.getGroup(); String user = sg.getUser(); String nickname = sg.getNickname(); @@ -490,7 +498,6 @@ 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)); } diff --git a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceListener.java b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceListener.java index 347f847ba..d17d4ac5e 100644 --- a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceListener.java +++ b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceListener.java @@ -16,6 +16,7 @@ public interface IPresenceListener { public void handleContainerJoined(ID joinedContainer); public void handleRosterEntry(IRosterEntry entry); + public void handleSetRosterEntry(IRosterEntry entry); public void handlePresence(ID fromID, IPresence presence); public void handleContainerDeparted(ID departedContainer); 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 index dc17b8c7e..da75ca73d 100644 --- 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 @@ -2,10 +2,16 @@ package org.eclipse.ecf.ui.dialogs; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Point; 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; @@ -23,11 +29,13 @@ public class AddBuddyDialog extends Dialog { private String [] existing = null; private int selectedGroup = -1; - private int result; + private int result = Window.CANCEL; - private String userresult = null; - private String nicknameresult = null; - private String groupsresult = null; + private String userresult = ""; + private String nicknameresult = ""; + private String groupsresult = ""; + + Button okButton = null; public AddBuddyDialog(Shell parentShell,String username, String [] existingGroups, int selectedGroup) { super(parentShell); @@ -56,6 +64,13 @@ public class AddBuddyDialog extends Dialog { usertext.setText(user); usertext.setEnabled(false); } + usertext.addModifyListener(new ModifyListener() { + + public void modifyText(ModifyEvent e) { + if (usertext.getText().length() > 3 && usertext.getText().indexOf("@") != -1) { + okButton.setEnabled(true); + } + }}); final Label label_1 = new Label(composite, SWT.NONE); label_1.setText("Group:"); @@ -86,9 +101,13 @@ public class AddBuddyDialog extends Dialog { protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, - true); + false); createButton(parent, IDialogConstants.CANCEL_ID, - IDialogConstants.CANCEL_LABEL, false); + IDialogConstants.CANCEL_LABEL, true); + okButton = getButton(IDialogConstants.OK_ID); + if (okButton != null) { + okButton.setEnabled(false); + } } public String getGroup() { return groupsresult; @@ -109,6 +128,9 @@ public class AddBuddyDialog extends Dialog { groupsresult = groups.getText(); close(); } + public int getResult() { + return result; + } 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/views/RosterView.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java index 078112df5..592bc017f 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 @@ -32,6 +32,7 @@ import org.eclipse.ecf.presence.IPresenceListener; import org.eclipse.ecf.presence.IRosterEntry; import org.eclipse.ecf.presence.IRosterGroup; import org.eclipse.ecf.presence.impl.RosterEntry; +import org.eclipse.ecf.presence.impl.RosterGroup; import org.eclipse.ecf.ui.UiPlugin; import org.eclipse.ecf.ui.UiPluginConstants; import org.eclipse.ecf.ui.dialogs.AddBuddyDialog; @@ -75,6 +76,8 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL public static final String INSTANT_MESSAGE_ICON = "icons/enabled/message.gif"; public static final String ADDGROUP_ICON = "icons/enabled/addgroup.gif"; + public static final String UNFILED_GROUP_NAME = "Unfiled"; + protected static final int TREE_EXPANSION_LEVELS = 2; private TreeViewer viewer; private Action chatAction; @@ -82,6 +85,7 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL private Action selectedDoubleClickAction; private Action disconnectAction; private Action addGroupAction; + private Action addBuddyAction; protected IUser localUser; protected ILocalInputHandler inputHandler; @@ -128,7 +132,9 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL public String getName() { return name; } - + public void setName(String name) { + this.name = name; + } public ID getUserID() { return userID; } @@ -303,7 +309,10 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL IPresence presence = entry.getPresenceState(); TreeBuddy newBuddy = null; if (oldBuddy==null) newBuddy = new TreeBuddy(name,entry.getUserID(),presence); - else newBuddy = oldBuddy; + else { + newBuddy = oldBuddy; + if (entry.getName() != null) newBuddy.setName(entry.getName()); + } if (presence != null) fillPresence(newBuddy, presence); else if (oldBuddy == null) newBuddy.addChild(new TreeObject("Account: "+newBuddy.getUserID().getName())); return newBuddy; @@ -356,20 +365,17 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL return null; } - public TreeBuddy findAndReplaceEntry(TreeParent parent, IRosterEntry entry) { + public void addEntry(TreeParent parent, IRosterEntry entry) { + TreeBuddy tb = findBuddy(parent,entry); - TreeBuddy result = createBuddy(tb,entry); + TreeBuddy newBuddy = createBuddy(tb,entry); // If buddy found already, then remove old and add new if (tb != null) { TreeParent tbparent = tb.getParent(); tbparent.removeChild(tb); - tbparent.addChild(result); + tbparent.addChild(newBuddy); } - return result; - } - public void addEntry(TreeParent parent, IRosterEntry entry) { - - TreeBuddy newBuddy = findAndReplaceEntry(parent,entry); + TreeParent buddyParent = newBuddy.getParent(); if (buddyParent == null) { @@ -387,12 +393,43 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL parent.addChild(newgrp); } } else { - TreeGroup tg = new TreeGroup("Unfiled"); + TreeGroup tg = findGroup(parent,UNFILED_GROUP_NAME); + if (tg == null) tg = new TreeGroup(UNFILED_GROUP_NAME); tg.addChild(newBuddy); parent.addChild(tg); } } } + public void replaceEntry(TreeParent parent, IRosterEntry entry) { + + TreeBuddy tb = findBuddy(parent,entry); + // If entry already in tree, remove it from current position + if (tb != null) { + TreeParent tp = (TreeParent) tb.getParent(); + if (tp != null) tp.removeChild(tb); + } + // Create new buddy + TreeBuddy newBuddy = createBuddy(tb,entry); + + Iterator groups = entry.getGroups(); + if (groups.hasNext()) { + // There's a group associated with entry...so add with group name + String groupName = ((IRosterGroup) groups.next()).getName(); + TreeGroup oldgrp = findGroup(parent,groupName); + if (oldgrp != null) { + oldgrp.addChild(newBuddy); + } else { + TreeGroup newgrp = new TreeGroup(groupName); + newgrp.addChild(newBuddy); + parent.addChild(newgrp); + } + } else { + TreeGroup tg = findGroup(parent,UNFILED_GROUP_NAME); + if (tg == null) tg = new TreeGroup(UNFILED_GROUP_NAME); + tg.addChild(newBuddy); + parent.addChild(tg); + } + } public void addGroup(String name) { if (name == null) return; @@ -424,6 +461,9 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL public void addEntry(IRosterEntry entry) { addEntry(root, entry); } + public void replaceEntry(IRosterEntry entry) { + replaceEntry(root, entry); + } public void removeRosterEntry(ID entry) { removeEntry(root,entry); } @@ -530,6 +570,8 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL } private void fillLocalPullDown(IMenuManager manager) { + manager.add(addBuddyAction); + manager.add(new Separator()); manager.add(addGroupAction); manager.add(new Separator()); manager.add(chatAction); @@ -560,6 +602,16 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL tg = (TreeGroup) parent; } final TreeGroup treeGroup = tg; + + Action requestAuthUserAction = new Action() { + public void run() { + requestAuthFrom(tb,treeGroup); + } + }; + requestAuthUserAction.setText("Re-Request authorization from "+treeObject.getName()); + manager.add(requestAuthUserAction); + + Action removeUserAction = new Action() { public void run() { removeUserFromGroup(tb,treeGroup); @@ -570,6 +622,9 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL } else { removeUserAction.setText("Remove "+treeObject.getName()); } + removeUserAction.setImageDescriptor(PlatformUI.getWorkbench() + .getSharedImages().getImageDescriptor( + ISharedImages.IMG_TOOL_DELETE)); manager.add(removeUserAction); } else if (treeObject instanceof TreeGroup) { @@ -584,6 +639,19 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL addUserAction.setImageDescriptor(ImageDescriptor.createFromURL( UiPlugin.getDefault().find(new Path(ADDGROUP_ICON)))); manager.add(addUserAction); + + Action removeGroupAction = new Action() { + public void run() { + removeGroup(groupName); + } + }; + removeGroupAction.setText("Remove "+treeObject.getName()); + removeGroupAction.setEnabled(treeGroup.getTotalCount() == 0); + removeGroupAction.setImageDescriptor(PlatformUI.getWorkbench() + .getSharedImages().getImageDescriptor( + ISharedImages.IMG_TOOL_DELETE)); + if (removeGroupAction.isEnabled()) manager.add(removeGroupAction); + } } @@ -591,29 +659,51 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL // Other plug-ins can contribute there actions here manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } - - protected void addUserToGroup(String 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); + + protected void openDialogAndSendRequest(String name, String groupName) { + String [] groupNames = this.getGroupNames(); + List g = Arrays.asList(groupNames); + int selected = (groupName==null)?-1:g.indexOf(groupName); + AddBuddyDialog sg = new AddBuddyDialog(viewer.getControl().getShell(),name,groupNames,selected); sg.open(); - if (sg.getReturnCode() == Window.OK) { + if (sg.getResult() == 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); + this.addGroup(group); } - inputHandler.sendRosterAdd(user,nickname,new String[] { group } ); + String [] sendGroups = new String [] { group }; + // Finally, send the information and request subscription + inputHandler.sendRosterAdd(user,nickname,sendGroups); + addPendingEntry(user,nickname,group); + } + } + protected void requestAuthFrom(TreeBuddy buddy,TreeGroup tg) { + if (buddy == null) return; + ID buddyID = buddy.getUserID(); + String name = buddyID.getName(); + String groupName = (tg==null)?null:tg.getName(); + if (inputHandler != null) { + openDialogAndSendRequest(name,groupName); } } + protected void addUserToGroup(String groupName) { + openDialogAndSendRequest(null,groupName); + } + protected void addPendingEntry(String user,String nickname,String group) { + ID newID = null; + try { + newID = IDFactory.makeStringID(user); + } catch (Exception e) { + } + IRosterEntry newEntry = new RosterEntry(newID,nickname); + newEntry.add(new RosterGroup(group)); + handleRosterEntry(newEntry); + } protected void removeUserFromGroup(TreeBuddy buddy, TreeGroup group) { if (inputHandler != null) { inputHandler.sendRosterRemove(buddy.getUserID()); @@ -627,6 +717,8 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL return treeObject; } private void fillLocalToolBar(IToolBarManager manager) { + manager.add(addBuddyAction); + manager.add(new Separator()); manager.add(addGroupAction); manager.add(new Separator()); manager.add(chatAction); @@ -662,7 +754,7 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL } }; chatAction.setText("Send Instant Message..."); - chatAction.setToolTipText("Send instant message to arbitrary user"); + chatAction.setToolTipText("Send instant message"); chatAction.setImageDescriptor(ImageDescriptor.createFromURL( UiPlugin.getDefault().find(new Path(INSTANT_MESSAGE_ICON)))); chatAction.setEnabled(false); @@ -677,9 +769,7 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL public void run() { if (inputHandler != null) { inputHandler.disconnect(); - chatAction.setEnabled(false); - addGroupAction.setEnabled(false); - disconnectAction.setEnabled(false); + setToolbarEnabled(false); this.setEnabled(false); } } @@ -692,7 +782,6 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL disconnectAction.setDisabledImageDescriptor(ImageDescriptor.createFromURL( UiPlugin.getDefault().find(new Path(DISCONNECT_ICON_DISABLED)))); - addGroupAction = new Action() { public void run() { // handle add group operation here @@ -725,7 +814,18 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL addGroupAction.setEnabled(false); addGroupAction.setImageDescriptor(ImageDescriptor.createFromURL( UiPlugin.getDefault().find(new Path(ADDGROUP_ICON)))); - } + + addBuddyAction = new Action() { + public void run() { + addUserToGroup(null); + } + }; + addBuddyAction.setText("Add Buddy..."); + addBuddyAction.setToolTipText("Add buddy"); + addBuddyAction.setEnabled(false); + addBuddyAction.setImageDescriptor(ImageDescriptor.createFromURL( + UiPlugin.getDefault().find(new Path(ADDGROUP_ICON)))); +} protected ChatWindow openChatWindowForTarget(ID targetID) { @@ -884,12 +984,15 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL public void setGroup(ID groupManager) { if (groupManager != null) { groupID = groupManager; - disconnectAction.setEnabled(true); - chatAction.setEnabled(true); - addGroupAction.setEnabled(true); + setToolbarEnabled(true); } } - + protected void setToolbarEnabled(boolean enabled) { + disconnectAction.setEnabled(enabled); + chatAction.setEnabled(enabled); + addGroupAction.setEnabled(enabled); + addBuddyAction.setEnabled(enabled); + } public void memberDeparted(ID member) { if (groupID != null) { if (groupID.equals(member)) { @@ -969,4 +1072,18 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL disconnectAction.setEnabled(false); } + public void handleSetRosterEntry(IRosterEntry entry) { + if (entry == null) + return; + ViewContentProvider vcp = (ViewContentProvider) viewer + .getContentProvider(); + if (vcp != null) { + if (entry.getInterestType() == IRosterEntry.InterestType.REMOVE || + entry.getInterestType() == IRosterEntry.InterestType.NONE) { + vcp.removeRosterEntry(entry.getUserID()); + } else vcp.replaceEntry(entry); + refreshView(); + } + } + }
\ No newline at end of file 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 b90845ab1..74b08d705 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 @@ -90,6 +90,11 @@ public class XMPPClientSOContainer extends ClientSOContainer { fireContainerEvent(new SharedObjectContainerJoinedEvent(this .getID(), originalTarget)); } + // If we've got the connection then pass it onto shared object also + ChatConnection conn = (ChatConnection) getConnection(); + if (conn != null && sharedObject != null) { + sharedObject.setConnection(conn.getXMPPConnection()); + } // If we've got roster data then pass it onto shared object if (serverData != null && serverData instanceof Roster) { Roster roster = (Roster) serverData; @@ -97,11 +102,6 @@ public class XMPPClientSOContainer extends ClientSOContainer { sharedObject.handleRoster(roster); } } - // If we've got the connection then pass it onto shared object also - ChatConnection conn = (ChatConnection) getConnection(); - if (conn != null && sharedObject != null) { - sharedObject.setConnection(conn.getXMPPConnection()); - } return originalTarget; } 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 38c417309..13a3cb2af 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 @@ -13,6 +13,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; + import org.eclipse.ecf.core.ISharedObject; import org.eclipse.ecf.core.ISharedObjectConfig; import org.eclipse.ecf.core.ISharedObjectContext; @@ -30,10 +31,10 @@ import org.eclipse.ecf.presence.IAccountManager; import org.eclipse.ecf.presence.IMessageListener; import org.eclipse.ecf.presence.IPresence; import org.eclipse.ecf.presence.IPresenceListener; -import org.eclipse.ecf.presence.ISubscribeListener; import org.eclipse.ecf.presence.IRosterEntry; import org.eclipse.ecf.presence.IRosterGroup; import org.eclipse.ecf.presence.ISharedObjectMessageListener; +import org.eclipse.ecf.presence.ISubscribeListener; import org.eclipse.ecf.provider.xmpp.Trace; import org.eclipse.ecf.provider.xmpp.events.IQEvent; import org.eclipse.ecf.provider.xmpp.events.MessageEvent; @@ -174,6 +175,12 @@ public class XMPPPresenceSharedObject implements ISharedObject, IAccountManager } } + protected void fireSetRosterEntry(IRosterEntry entry) { + for (Iterator i = presenceListeners.iterator(); i.hasNext();) { + IPresenceListener l = (IPresenceListener) i.next(); + l.handleSetRosterEntry(entry); + } + } protected void fireRosterEntry(IRosterEntry entry) { for (Iterator i = presenceListeners.iterator(); i.hasNext();) { IPresenceListener l = (IPresenceListener) i.next(); @@ -268,7 +275,7 @@ public class XMPPPresenceSharedObject implements ISharedObject, IAccountManager for (Iterator i = rosterPacket.getRosterItems(); i.hasNext();) { IRosterEntry entry = makeRosterEntry((RosterPacket.Item) i .next()); - fireRosterEntry(entry); + fireSetRosterEntry(entry); } } } else { |
