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 }