blob: fcf159ff70fb71aa194719ec1c008e3b0208eff3 [file] [log] [blame]
/****************************************************************************
* Copyright (c) 2004 Composent, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Composent, Inc. - initial API and implementation
*****************************************************************************/
package org.eclipse.ecf.presence.ui;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.IContainerListener;
import org.eclipse.ecf.core.events.IContainerConnectedEvent;
import org.eclipse.ecf.core.events.IContainerDisconnectedEvent;
import org.eclipse.ecf.core.events.IContainerEvent;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.sharedobject.ISharedObjectContainer;
import org.eclipse.ecf.core.user.IUser;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.internal.presence.ui.Activator;
import org.eclipse.ecf.presence.IAccountManager;
import org.eclipse.ecf.presence.IIMMessageEvent;
import org.eclipse.ecf.presence.IIMMessageListener;
import org.eclipse.ecf.presence.IPresence;
import org.eclipse.ecf.presence.IPresenceContainerAdapter;
import org.eclipse.ecf.presence.IPresenceListener;
import org.eclipse.ecf.presence.IPresenceSender;
import org.eclipse.ecf.presence.Presence;
import org.eclipse.ecf.presence.im.IChatManager;
import org.eclipse.ecf.presence.im.IChatMessageEvent;
import org.eclipse.ecf.presence.im.IChatMessageSender;
import org.eclipse.ecf.presence.im.ITypingMessageEvent;
import org.eclipse.ecf.presence.im.ITypingMessageSender;
import org.eclipse.ecf.presence.roster.IRosterEntry;
import org.eclipse.ecf.presence.roster.IRosterSubscriptionListener;
import org.eclipse.ecf.presence.roster.IRosterSubscriptionSender;
import org.eclipse.ecf.ui.dialogs.ReceiveAuthorizeRequestDialog;
import org.eclipse.ecf.ui.views.ILocalInputHandler;
import org.eclipse.ecf.ui.views.RosterView;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
/**
* Presence user interface
*/
public class PresenceUI {
protected static final String ROSTER_VIEW_ID = "org.eclipse.ecf.ui.view.rosterview";
protected static final int SEND_ERRORCODE = IStatus.ERROR;
protected RosterView rosterView = null;
protected IPresenceSender presenceSender = null;
protected IAccountManager accountManager = null;
protected IRosterSubscriptionSender rosterSubscriptionSender = null;
protected IPresenceContainerAdapter presenceAdapter = null;
protected ISharedObjectContainer soContainer = null;
protected IUser localUser = null;
protected ID groupID = null;
protected IContainer container;
protected IChatManager chatManager;
protected IChatMessageSender chatMessageSender;
protected ITypingMessageSender typingMessageSender;
public PresenceUI(IContainer container,
IPresenceContainerAdapter presenceAdapter) {
this.container = container;
this.presenceAdapter = presenceAdapter;
this.presenceSender = this.presenceAdapter.getRosterManager()
.getPresenceSender();
this.rosterSubscriptionSender = this.presenceAdapter.getRosterManager()
.getRosterSubscriptionSender();
this.accountManager = this.presenceAdapter.getAccountManager();
this.chatManager = this.presenceAdapter.getChatManager();
this.chatMessageSender = this.chatManager.getChatMessageSender();
this.typingMessageSender = this.chatManager.getTypingMessageSender();
this.soContainer = (ISharedObjectContainer) this.container
.getAdapter(ISharedObjectContainer.class);
this.groupID = container.getConnectedID();
}
public void showForUser(final IUser localUser) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
try {
IWorkbenchWindow ww = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow();
IWorkbenchPage wp = ww.getActivePage();
IViewPart view = wp.showView(ROSTER_VIEW_ID);
rosterView = (RosterView) view;
PresenceUI.this.localUser = localUser;
} catch (Exception e) {
Activator.getDefault().getLog().log(
new Status(IStatus.ERROR, Activator.PLUGIN_ID,
SEND_ERRORCODE,
"Exception showing presence view", e));
}
}
});
chatManager.addMessageListener(new IIMMessageListener() {
public void handleMessageEvent(
final IIMMessageEvent chatMessageEvent) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
if (chatMessageEvent instanceof IChatMessageEvent) {
rosterView.handleMessageEvent(chatMessageEvent);
} else if (chatMessageEvent instanceof ITypingMessageEvent) {
rosterView.handleTyping(chatMessageEvent
.getFromID());
}
}
});
}
});
container.addListener(new IContainerListener() {
public void handleEvent(IContainerEvent event) {
if (event instanceof IContainerConnectedEvent) {
IContainerConnectedEvent cce = (IContainerConnectedEvent) event;
final ID joinedContainer = cce.getTargetID();
Display.getDefault().syncExec(new Runnable() {
public void run() {
ILocalInputHandler handler = new ILocalInputHandler() {
public void inputText(ID userID, String text) {
try {
if (chatMessageSender != null)
chatMessageSender.sendChatMessage(
userID, text);
} catch (ECFException e) {
Activator
.getDefault()
.getLog()
.log(
new Status(
IStatus.ERROR,
Activator
.getDefault()
.getBundle()
.getSymbolicName(),
SEND_ERRORCODE,
"Error in sendMessage",
e));
}
}
public void startTyping(ID userID) {
try {
if (typingMessageSender != null)
typingMessageSender
.sendTypingMessage(userID,
true, "");
} catch (ECFException e) {
Activator
.getDefault()
.getLog()
.log(
new Status(
IStatus.ERROR,
Activator
.getDefault()
.getBundle()
.getSymbolicName(),
SEND_ERRORCODE,
"Error in startTyping",
e));
}
}
public void disconnect() {
container.disconnect();
}
public void updatePresence(ID userID,
IPresence presence) {
try {
if (presenceSender != null)
presenceSender.sendPresenceUpdate(
userID, presence);
} catch (ECFException e) {
Activator
.getDefault()
.getLog()
.log(
new Status(
IStatus.ERROR,
Activator
.getDefault()
.getBundle()
.getSymbolicName(),
SEND_ERRORCODE,
"Error in sendPresenceUpdate",
e));
}
}
public void sendRosterAdd(String user,
String name, String[] groups) {
// Send roster add
try {
rosterSubscriptionSender.sendRosterAdd(
user, name, groups);
} catch (ECFException e) {
Activator
.getDefault()
.getLog()
.log(
new Status(
IStatus.ERROR,
Activator
.getDefault()
.getBundle()
.getSymbolicName(),
SEND_ERRORCODE,
"Error in sendRosterAdd",
e));
}
}
public void sendRosterRemove(ID userID) {
try {
if (rosterSubscriptionSender != null)
rosterSubscriptionSender
.sendRosterRemove(userID);
} catch (ECFException e) {
Activator
.getDefault()
.getLog()
.log(
new Status(
IStatus.ERROR,
Activator
.getDefault()
.getBundle()
.getSymbolicName(),
SEND_ERRORCODE,
"Error in sendRosterRemove",
e));
}
}
};
PresenceUI.this.groupID = joinedContainer;
rosterView.addAccount(joinedContainer,
PresenceUI.this.localUser,
handler, container, presenceAdapter,
soContainer);
}
});
} else if (event instanceof IContainerDisconnectedEvent) {
final IContainerDisconnectedEvent de = (IContainerDisconnectedEvent) event;
Display.getDefault().syncExec(new Runnable() {
public void run() {
rosterView.accountDisconnected(de.getTargetID());
}
});
}
}
});
presenceAdapter.getRosterManager().addPresenceListener(
new IPresenceListener() {
public void handleRosterEntryAdd(final IRosterEntry entry) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
rosterView
.handleRosterEntryAdd(
PresenceUI.this.groupID,
entry);
}
});
}
public void handlePresence(final ID fromID,
final IPresence presence) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
rosterView.handlePresence(
PresenceUI.this.groupID,
fromID, presence);
}
});
}
public void handleRosterEntryUpdate(final IRosterEntry entry) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
rosterView
.handleRosterEntryUpdate(
PresenceUI.this.groupID,
entry);
}
});
}
public void handleRosterEntryRemove(final IRosterEntry entry) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
rosterView
.handleRosterEntryRemove(
PresenceUI.this.groupID,
entry);
}
});
}
});
presenceAdapter.getRosterManager().addRosterSubscriptionListener(
new IRosterSubscriptionListener() {
public void handleSubscribeRequest(final ID fromID) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
try {
IWorkbenchWindow ww = PlatformUI
.getWorkbench()
.getActiveWorkbenchWindow();
ReceiveAuthorizeRequestDialog authRequest = new ReceiveAuthorizeRequestDialog(
ww.getShell(), fromID.getName(),
localUser.getName());
authRequest.setBlockOnOpen(true);
authRequest.open();
int res = authRequest.getButtonPressed();
if (res == ReceiveAuthorizeRequestDialog.AUTHORIZE_AND_ADD) {
if (presenceSender != null) {
presenceSender
.sendPresenceUpdate(
fromID,
new Presence(
IPresence.Type.SUBSCRIBED));
if (rosterView != null)
rosterView.sendRosterAdd(
localUser.getID(),
fromID.getName(), null);
}
} else if (res == ReceiveAuthorizeRequestDialog.AUTHORIZE_ID) {
if (presenceSender != null) {
presenceSender
.sendPresenceUpdate(
fromID,
new Presence(
IPresence.Type.SUBSCRIBED));
}
} else if (res == ReceiveAuthorizeRequestDialog.REFUSE_ID) {
// do nothing
} else {
// do nothing
}
} catch (Exception e) {
Activator
.getDefault()
.getLog()
.log(
new Status(
IStatus.ERROR,
Activator.PLUGIN_ID,
SEND_ERRORCODE,
"Exception showing authorization dialog",
e));
}
}
});
}
public void handleSubscribed(ID fromID) {
// System.out.println("subscribed from "+fromID);
}
public void handleUnsubscribed(ID fromID) {
// System.out.println("unsubscribed from "+fromID);
}
});
}
}