001    /*
002     * UserChooser.java
003     *
004     * Created on October 28, 2005, 7:27 AM
005     *
006     * To change this template, choose Tools | Template Manager
007     * and open the template in the editor.
008     */
009    
010    package com.valhalla.jbother;
011    
012    import javax.swing.*;
013    import javax.swing.table.*;
014    import javax.swing.event.*;
015    import java.awt.*;
016    import java.awt.event.*;
017    import java.util.*;
018    import org.jivesoftware.smack.*;
019    import org.jivesoftware.smackx.*;
020    import com.valhalla.jbother.jabber.*;
021    
022    /**
023     *
024     * @author synic
025     */
026    public class UserChooser extends JDialog {
027        protected ResourceBundle resources = ResourceBundle.getBundle("JBotherBundle", Locale.getDefault());
028        
029        JPanel main;
030        JButton ok = new JButton(resources.getString("okButton"));
031        JButton cancel = new JButton(resources.getString("cancelButton"));
032        JButton check = new JButton(resources.getString("checkAll"));
033        ArrayList items = new ArrayList();    
034        UserModel model = new UserModel();
035        JTable table = new JTable(model);
036        ArrayList listeners = new ArrayList();
037        JScrollPane scroll = new JScrollPane(table);
038        
039        /** Creates a new instance of UserChooser */
040        public UserChooser(JFrame parent, String title, String instructions, boolean all) {
041            super(parent, title);
042            
043            model.setTable();
044            
045            JLabel label = new JLabel(instructions);
046            label.setAlignmentX(Container.CENTER_ALIGNMENT);
047            label.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
048            
049            main = (JPanel)getContentPane();
050            main.setLayout(new BorderLayout());
051            main.add(label, BorderLayout.NORTH);
052            main.setBorder(BorderFactory.createTitledBorder(title));
053            
054            updateUsers(all);
055            
056            scroll.getViewport().setBackground(Color.WHITE);
057            main.add(scroll, BorderLayout.CENTER);
058            
059            JPanel buttons = new JPanel();
060            buttons.setLayout(new BoxLayout(buttons, BoxLayout.X_AXIS));
061            buttons.add(check);
062            buttons.add(Box.createHorizontalGlue());
063            buttons.add(cancel);
064            buttons.add(ok);
065            
066            buttons.setBorder(BorderFactory.createEmptyBorder(5, 0,0,0));
067            main.add(buttons, BorderLayout.SOUTH);
068            
069            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
070            
071            cancel.addActionListener(new ActionListener()
072            {
073                public void actionPerformed(ActionEvent e)
074                {
075                    dispose();
076                }
077            } );
078            
079            ok.addActionListener(new ActionListener()
080            {
081                public void actionPerformed(ActionEvent e)
082                {
083                    okHandler();
084                }
085            } );
086            
087            check.addActionListener(new ActionListener()
088            {
089                public void actionPerformed(ActionEvent e)
090                {
091                    for(int i = 0; i < items.size(); i++)
092                    {
093                        Item item = (Item)items.get(i);
094                        item.setState(!item.getState());
095                    }
096                    
097                    table.repaint();
098                }
099            } );
100            
101            pack();
102            setSize(500, 450);
103            setLocationRelativeTo(parent);       
104    
105        }
106        
107        public UserChooser(JFrame parent, String title)
108        {
109            this(parent, title, "", false);
110        }
111    
112        public void setEditChooser(boolean edit) 
113        {
114            model.setEditChooser(edit);
115            table = new JTable(model);
116            scroll.setViewportView(table);
117            model.setTable();
118        }    
119        
120        public void addListener(UserChooserListener l)
121        {
122            listeners.add(l);
123        }
124        
125        public void clearEntries()
126        {
127            items.clear();
128        }
129        public void addEntries(Iterator entries)
130        {
131            while(entries.hasNext())
132            {
133                RemoteRosterEntry entry = (RemoteRosterEntry)entries.next();
134                Item item = new Item(entry.getName(), entry.getUser(), false);
135                
136                String group = null;
137                Iterator i = entry.getGroupNames();
138                while(i.hasNext())
139                {
140                    group = (String)i.next();
141                    break;
142                }
143                
144                item.setGroup(group);
145                items.add(item);            
146            }
147            
148            model.update();
149        }
150        
151        private void okHandler()
152        {
153            setVisible(false);
154            ArrayList list = new ArrayList();
155            int count = 0;
156            for( int i = 0; i < items.size(); i++)
157            {
158                Item item = (Item)items.get(i);
159                if(item.getState()) 
160                {
161                    list.add(item);
162                    count++;
163                }
164            }
165            
166            Item[] array = (Item[])list.toArray(new Item[count]);
167            
168            for( int i = 0; i < listeners.size(); i++)
169            {
170                UserChooserListener listener = (UserChooserListener)listeners.get(i);
171                listener.usersChosen(array);
172            }
173            
174            dispose();
175        }
176        
177        private void updateUsers(boolean all)
178        {
179            Roster roster = BuddyList.getInstance().getConnection().getRoster();
180            Iterator i = roster.getEntries();
181            
182            while(i.hasNext())
183            {
184                RosterEntry entry = (RosterEntry)i.next();
185                BuddyStatus buddy = BuddyList.getInstance().getBuddyStatus(entry.getUser());
186                
187                if(buddy.size() > 0 || all)
188                {
189                    items.add(new Item(buddy.getName(), buddy.getUser(), false));
190                }
191            }
192            
193            Item[] array = (Item[])items.toArray(new Item[items.size()]);
194            Arrays.sort(array, new Comparator()
195            {
196                public int compare(Object o1, Object o2)
197                {
198                    Item item1 = (Item)o1;
199                    Item item2 = (Item)o2;
200                    
201                    return item1.getName().compareTo(item2.getName());
202                }
203            });
204            
205            items = new ArrayList();
206            for( int ii = 0; ii < array.length; ii++)
207            {
208                items.add(array[ii]);
209            }
210        }
211        
212        class UserModel extends AbstractTableModel
213        {    
214            private boolean editChooser = false;
215    
216            public void setEditChooser(boolean edit) 
217            { 
218                editChooser = edit; 
219            }
220            
221            public void update()
222            {
223                fireTableChanged(new TableModelEvent(this));
224            }
225            
226            public void setTable()
227            {
228                int width = 400;
229    
230                JComboBox comboBox = null;
231                if( editChooser ) 
232                {
233                    width = 300;
234                    
235                    ArrayList groups = new ArrayList();
236                    groups.add("None");
237                    Roster roster = BuddyList.getInstance().getConnection().getRoster();
238                    Iterator i = roster.getGroups();
239                    
240                    while(i.hasNext())
241                    {
242                        RosterGroup group = (RosterGroup)i.next();
243                        groups.add(group.getName());
244                    }
245                    comboBox = new JComboBox(groups.toArray(new String[groups.size()]));
246                    comboBox.setEditable(true);
247                }           
248                
249                // set the default column widths
250                for (int i = 0; i < getColumnCount(); i++) {
251                    TableColumn column = table.getColumnModel().getColumn(i);
252                    if (i == 0) {
253                        column.setPreferredWidth(20);
254                    } else if (i == 1)
255                    {
256                        column.setPreferredWidth(80);
257                    }
258                    else if( i == 2 )
259                    {
260                        column.setPreferredWidth(width);
261                    }
262                    else if( i == 3 )
263                    {
264                        column.setPreferredWidth(100);
265                        column.setCellEditor(new DefaultCellEditor(comboBox));
266                    }    
267                    
268                }
269            }
270            
271            public Class getColumnClass( int index )
272            {
273                if(index == 0) return Boolean.class;
274                else return String.class;
275            }
276            
277            public String getColumnName( int index )
278            {
279                switch(index)
280                {
281                    case 0:
282                        return " ";
283    
284                    case 1: 
285                        return "Nick";
286    
287                    case 2:
288                        return "JID";
289    
290                    case 3:
291                        return "Group";
292    
293                    default:
294                        return " ";                            
295                }
296            }
297            
298            public int getColumnCount() 
299            {  
300                if(editChooser) return 4;
301                return 3; 
302            }
303            public int getRowCount() { return items.size(); }
304            public Object getValueAt(int row, int column)
305            {
306                Item item = (Item)items.get(row);
307                
308                if(column == 0) return new Boolean(item.getState());
309                else if(column == 1) return item.getName();
310                else if(column == 2) return item.getJID();
311                else return item.getGroup();
312            }
313            
314            public boolean isCellEditable(int row, int column) {
315                
316                if(editChooser && ( column == 1 || column == 3 )) return true;
317                
318                if (column == 0)
319                    return true;
320                else
321                    return false;
322            }
323            
324            public void setValueAt(Object value, int row, int col) {
325    
326                
327                Item item = (Item)items.get(row);
328                
329                if(col == 0)
330                {
331                    boolean b = ((Boolean) value).booleanValue();
332                    item.setState(b);
333                }
334                else if(col == 1)
335                {
336                    item.setName((String)value);
337                }
338                
339                else if( col == 3 )
340                {
341                    String group = (String)value;
342                    item.setGroup(group);
343                }
344    
345                fireTableCellUpdated(row, col);
346            }
347    
348        }
349        
350        public static class Item
351        {
352            String name;
353            String jid;
354            boolean state;
355            String group = "None";
356            public Item(String name, String jid, boolean state)
357            {
358                this.name = name;
359                this.jid = jid;
360                this.state = state;
361            }
362            
363            public boolean getState() { return state; }
364            public String getName() { return name; }
365            public String getJID() { return jid; }
366            public String getGroup() { return group; }
367            
368            public void setState(boolean s) { state = s; }
369            public void setName(String name) { this.name = name; }
370            public void setGroup(String group) 
371            { 
372                if(group == null) group = "None";
373                this.group = group; 
374            }
375        }
376    }