org.eclipse.ecf.internal.presence.ui.dialogs.ChatRoomSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ecf.internal.presence.ui.dialogs.ChatRoomSelectionDialog.java

Source

/****************************************************************************
 * 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();
    }
}