/****************************************************************************
* 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.internal.presence.ui.dialogs;
import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.ecf.core.ContainerCreateException;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.internal.presence.ui.Messages;
import org.eclipse.ecf.presence.chatroom.*;
import org.eclipse.ecf.presence.ui.MultiRosterAccount;
import org.eclipse.ecf.ui.SharedImages;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.viewers.deferred.DeferredContentProvider;
import org.eclipse.jface.viewers.deferred.SetModel;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
public class ChatRoomSelectionDialog extends TitleAreaDialog {
private static final int X_INITIAL_SIZE = 640;
private static final int Y_INITIAL_SIZE = 400;
private Room loadingRoom = new Room();
MultiRosterAccount[] accounts = null;
private Room selectedRoom = null;
private Job roomRetrieveJob = null;
public class Room {
IChatRoomInfo info;
MultiRosterAccount account;
public Room() {
this.info = new IChatRoomInfo() {
/**
* @throws ContainerCreateException
*/
public IChatRoomContainer createChatRoomContainer() throws ContainerCreateException {
return null;
}
public ID getConnectedID() {
return null;
}
public String getDescription() {
return null;
}
public String getName() {
return "Retrieving chat room list from servers..."; //$NON-NLS-1$
}
public int getParticipantsCount() {
return 0;
}
public ID getRoomID() {
return null;
}
public String getSubject() {
return null;
}
public boolean isModerated() {
return false;
}
public boolean isPersistent() {
return false;
}
public boolean requiresPassword() {
return false;
}
public Object getAdapter(Class adapter) {
return null;
}
};
}
public Room(IChatRoomInfo info, MultiRosterAccount man) {
this.info = info;
this.account = man;
}
public IChatRoomInfo getRoomInfo() {
return info;
}
public MultiRosterAccount getAccount() {
return account;
}
}
private SetModel rooms = new SetModel();
public ChatRoomSelectionDialog(Shell parentShell, MultiRosterAccount[] accounts) {
super(parentShell);
this.accounts = accounts;
setTitleImage(SharedImages.getImage(SharedImages.IMG_CHAT_WIZARD));
}
protected boolean isResizable() {
return true;
}
protected Point getInitialSize() {
return getShell().computeSize(X_INITIAL_SIZE, Y_INITIAL_SIZE, true);
}
protected Control createDialogArea(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
main.setLayout(new GridLayout());
main.setLayoutData(new GridData(GridData.FILL_BOTH));
TableViewer viewer = new TableViewer(main, SWT.VIRTUAL | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
TableColumn tc = new TableColumn(table, SWT.NONE);
tc.setText(Messages.ChatRoomSelectionDialog_ROOM_NAME_COLUMN);
// tc.pack();
// int width = tc.getWidth();
tc.setWidth(X_INITIAL_SIZE / 3);
tc = new TableColumn(table, SWT.NONE);
tc.setText(Messages.ChatRoomSelectionDialog_SUBJECT_COLUMN);
tc.pack();
int width;
width = tc.getWidth();
tc.setWidth(width + (width / 4));
tc = new TableColumn(table, SWT.NONE);
tc.setText(Messages.ChatRoomSelectionDialog_DESCRIPTION_COLUMN);
tc.pack();
width = tc.getWidth();
tc.setWidth(width + (width / 4));
tc = new TableColumn(table, SWT.NONE);
tc.setText(Messages.ChatRoomSelectionDialog_MEMBERS_COLUMN);
tc.pack();
tc = new TableColumn(table, SWT.NONE);
tc.setText(Messages.ChatRoomSelectionDialog_MODERATED_COLUMN);
tc.pack();
tc = new TableColumn(table, SWT.NONE);
tc.setText(Messages.ChatRoomSelectionDialog_PERSISTENT_COLUMN);
tc.pack();
tc = new TableColumn(table, SWT.NONE);
tc.setText(Messages.ChatRoomSelectionDialog_ACCOUNT_COLUMN);
tc.pack();
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
IStructuredSelection ss = (IStructuredSelection) ((selection instanceof IStructuredSelection) ? selection : null);
Object firstElement = (ss == null) ? null : ss.getFirstElement();
if (!event.getSelection().isEmpty() && !loadingRoom.equals(firstElement)) {
ChatRoomSelectionDialog.this.getButton(Window.OK).setEnabled(true);
}
}
});
viewer.setContentProvider(new DeferredContentProvider(new Comparator() {
public int compare(Object r1, Object r2) {
Room room1 = (Room) r1;
Room room2 = (Room) r2;
return room1.getRoomInfo().getName().compareTo(room2.getRoomInfo().getName());
}
}));
viewer.setLabelProvider(new ChatRoomLabelProvider());
rooms.addAll(Arrays.asList(new Room[] {loadingRoom}));
viewer.setInput(rooms);
this.setTitle(Messages.ChatRoomSelectionDialog_TITLE);
this.setMessage(Messages.ChatRoomSelectionDialog_MESSAGE);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent e) {
IStructuredSelection s = (IStructuredSelection) e.getSelection();
Object o = s.getFirstElement();
if (o instanceof Room) {
selectedRoom = (Room) o;
}
}
});
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
if (selectedRoom != null) {
ChatRoomSelectionDialog.this.okPressed();
}
}
});
startRetrieveJob();
applyDialogFont(parent);
return parent;
}
private void startRetrieveJob() {
roomRetrieveJob = new Job("Chat Room Retrieve") { //$NON-NLS-1$
protected IStatus run(IProgressMonitor monitor) {
ArrayList add = new ArrayList();
for (int i = 0; i < accounts.length; i++) {
IChatRoomManager chatRoomManager = accounts[i].getPresenceContainerAdapter().getChatRoomManager();
if (chatRoomManager != null) {
try {
IChatRoomInfo[] infos = chatRoomManager.getChatRoomInfos();
if (infos != null) {
for (int j = 0; j < infos.length; j++) {
if (infos[j] != null && accounts[i] != null) {
add.add(new Room(infos[j], accounts[i]));
}
}
}
} catch (Exception e) {
// Ignore
}
}
}
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
rooms.removeAll(new Room[] {loadingRoom});
rooms.addAll(add);
return Status.OK_STATUS;
}
};
roomRetrieveJob.schedule();
}
private class ChatRoomLabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
Room room = (Room) element;
IChatRoomInfo info = room.getRoomInfo();
MultiRosterAccount account = room.getAccount();
switch (columnIndex) {
case 0 :
return info.getName();
case 1 :
return info.getSubject();
case 2 :
return info.getDescription();
case 3 :
return (account == null) ? null : String.valueOf(info.getParticipantsCount());
case 4 :
return (account == null) ? null : String.valueOf(info.isModerated());
case 5 :
return (account == null) ? null : String.valueOf(info.isPersistent());
case 6 :
return (account == null) ? null : account.getContainer().getConnectedID().getName();
default :
return ""; //$NON-NLS-1$
}
}
public void addListener(ILabelProviderListener listener) {
// do nothing
}
public void dispose() {
// do nothing
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
// do nothing
}
}
protected Control createButtonBar(Composite parent) {
Control bar = super.createButtonBar(parent);
this.getButton(Window.OK).setText(Messages.ChatRoomSelectionDialog_ENTER_CHAT_BUTTON_TEXT);
this.getButton(Window.OK).setEnabled(false);
return bar;
}
public Room getSelectedRoom() {
return selectedRoom;
}
public boolean close() {
if (roomRetrieveJob != null) {
roomRetrieveJob.cancel();
roomRetrieveJob = null;
rooms.clear();
}
return super.close();
}
}