KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > table > TableController


1 // The contents of this file are subject to the Mozilla Public License Version
2
// 1.1
3
// (the "License"); you may not use this file except in compliance with the
4
// License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
5
//
6
// Software distributed under the License is distributed on an "AS IS" basis,
7
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
8
// for the specific language governing rights and
9
// limitations under the License.
10
//
11
// The Original Code is "The Columba Project"
12
//
13
// The Initial Developers of the Original Code are Frederik Dietz and Timo
14
// Stich.
15
// Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
16
//
17
// All Rights Reserved.
18
package org.columba.mail.gui.table;
19
20 import java.awt.Dimension JavaDoc;
21 import java.awt.event.MouseAdapter JavaDoc;
22 import java.awt.event.MouseEvent JavaDoc;
23 import java.io.IOException JavaDoc;
24 import java.io.InputStream JavaDoc;
25 import java.util.List JavaDoc;
26 import java.util.Observable JavaDoc;
27 import java.util.Vector JavaDoc;
28 import java.util.logging.Logger JavaDoc;
29
30 import javax.swing.ImageIcon JavaDoc;
31 import javax.swing.JLabel JavaDoc;
32 import javax.swing.JPopupMenu JavaDoc;
33 import javax.swing.ListSelectionModel JavaDoc;
34 import javax.swing.SwingUtilities JavaDoc;
35 import javax.swing.event.EventListenerList JavaDoc;
36 import javax.swing.event.ListSelectionEvent JavaDoc;
37 import javax.swing.event.ListSelectionListener JavaDoc;
38 import javax.swing.table.DefaultTableColumnModel JavaDoc;
39 import javax.swing.table.JTableHeader JavaDoc;
40 import javax.swing.table.TableColumn JavaDoc;
41 import javax.swing.table.TableColumnModel JavaDoc;
42 import javax.swing.tree.TreePath JavaDoc;
43
44 import org.columba.api.gui.frame.IFrameMediator;
45 import org.columba.core.folder.api.IFolder;
46 import org.columba.core.folder.api.IFolderCommandReference;
47 import org.columba.core.gui.base.AscendingIcon;
48 import org.columba.core.gui.base.DescendingIcon;
49 import org.columba.core.gui.menu.ExtendablePopupMenu;
50 import org.columba.core.gui.menu.MenuXMLDecoder;
51 import org.columba.core.io.DiskIO;
52 import org.columba.mail.folder.IMailFolder;
53 import org.columba.mail.folder.IMailbox;
54 import org.columba.mail.folder.event.FolderEventDelegator;
55 import org.columba.mail.folderoptions.FolderOptionsController;
56 import org.columba.mail.gui.frame.MailFrameMediator;
57 import org.columba.mail.gui.table.model.HeaderTableModel;
58 import org.columba.mail.gui.table.model.MessageNode;
59 import org.columba.mail.gui.table.model.TableModelChangedEvent;
60 import org.columba.mail.gui.table.model.TableModelChangedListener;
61 import org.columba.mail.gui.table.model.TableModelSorter;
62 import org.columba.mail.gui.table.model.TableModelThreadedView;
63 import org.columba.mail.message.IColumbaHeader;
64 import org.columba.mail.message.IHeaderList;
65 import org.columba.mail.util.MailResourceLoader;
66 import org.frapuccino.treetable.Tree;
67
68 /**
69  * Shows the message list. By default, this is the read/unread state if a message, Subject:, Date:, From: and Size headerfields.
70  * <p>
71  * Folder-specific configuration options are handled by <code>FolderOptionsController</code> and can be configured by the user
72  * in the AbstractMessageFolder Options Dialog.
73  *
74  * @author fdietz
75  */

76 public class TableController implements ListSelectionListener JavaDoc, TableModelChangedListener, ITableController {
77
78   /** JDK 1.4+ logging framework logger, used for logging. */
79   private static final Logger JavaDoc LOG = Logger.getLogger("org.columba.mail.gui.table");
80
81   /**
82    * table model
83    */

84   private HeaderTableModel headerTableModel;
85
86   /**
87    * table view
88    */

89   protected TableView view;
90
91   /**
92    * reference to mail framemediator
93    */

94   protected IFrameMediator frameController;
95
96   /**
97    * table view context menu
98    */

99   protected ExtendablePopupMenu menu;
100
101   /**
102    * sorting model
103    */

104   protected TableModelSorter tableModelSorter;
105
106   /**
107    * threaded-view model
108    */

109   protected TableModelThreadedView tableModelThreadedView;
110
111   /**
112    * previously selected rows
113    */

114   protected int[] previouslySelectedRows;
115
116   private MessageNode[] previouslySelectedNodes;
117
118   /**
119    * previously selected folder
120    */

121   private IMailbox previouslySelectedFolder;
122
123   /**
124    * tooltip mouse handler
125    */

126   private ColumnHeaderTooltips tips;
127
128   protected EventListenerList JavaDoc listenerList = new EventListenerList JavaDoc();
129
130   /**
131    * Constructor
132    *
133    * @param mailFrameController
134    * mail framemediator
135    */

136   public TableController(IFrameMediator frameController) {
137     this.frameController = frameController;
138
139     // init table model
140
headerTableModel = new HeaderTableModel();
141
142     // init threaded-view model
143
tableModelThreadedView = new TableModelThreadedView();
144     headerTableModel.registerVisitor(tableModelThreadedView);
145
146     // init sorting model
147
tableModelSorter = new TableModelSorter();
148     headerTableModel.registerVisitor(tableModelSorter);
149
150     // init view
151
view = new TableView(headerTableModel, tableModelSorter);
152
153     // pass tree to model, used by the threaded-view
154
headerTableModel.setTree((Tree) view.getTree());
155
156     getView().setTransferHandler(new TableViewTransferHandler(getFrameController()));
157     getView().setDragEnabled(true);
158
159     // MouseListener sorts table when clicking on a column header
160
new TableHeaderMouseListener(getTableModelSorter());
161     view.getColumnModel().addColumnModelListener(headerTableModel);
162
163     // we need this for the focus manager
164
getView().getSelectionModel().addListSelectionListener(this);
165
166     JTableHeader JavaDoc header = view.getTableHeader();
167
168     tips = new ColumnHeaderTooltips();
169     header.addMouseMotionListener(tips);
170
171     // register interest on folder events
172
FolderEventDelegator.getInstance().addTableListener(this);
173
174   }
175
176   /**
177    * Assigns a tooltip for each column
178    * <p>
179    * Tooltips for columns can be found in org.columba.mail.i18n.header.header.properties.
180    *
181    * @see org.columba.mail.folderoptions.ColumnOptionsPlugin
182    */

183   public void initTooltips() {
184     tips.clear();
185
186     // Assign a tooltip for each of the columns
187
for (int c = 0; c < view.getColumnCount(); c++) {
188       TableColumn JavaDoc col = view.getColumnModel().getColumn(c);
189
190       // column IDs are all lower case
191
String JavaDoc lookup = ((String JavaDoc) col.getIdentifier()).toLowerCase();
192
193       // append "_tooltip"
194
lookup = lookup + "_tooltip";
195
196       // get translation
197
String JavaDoc s = MailResourceLoader.getString("header", "header", lookup);
198
199       tips.setToolTip(col, s);
200     }
201   }
202
203   /**
204    * Get view of table controller
205    *
206    * @return table view
207    */

208   public TableView getView() {
209     return view;
210   }
211
212   /**
213    * Get table model
214    *
215    * @return table model
216    */

217   public IHeaderTableModel getHeaderTableModel() {
218     return headerTableModel;
219   }
220
221   /**
222    * Select messages with UIDs.
223    * <p>
224    * Message UIDs are converted to {@link MessageNode}objects.
225    *
226    * @param uids
227    * array of message UIDs
228    */

229   public void setSelected(Object JavaDoc[] uids) {
230
231     // select nodes
232
MessageNode[] nodes = new MessageNode[uids.length];
233
234     for (int i = 0; i < uids.length; i++) {
235       nodes[i] = ((HeaderTableModel) getHeaderTableModel()).getMessageNode(uids[i]);
236     }
237
238     int[] rows = new int[nodes.length];
239     for (int i = 0; i < nodes.length; i++) {
240       TreePath JavaDoc path = new TreePath JavaDoc(nodes[i].getPath());
241       rows[i] = view.getTree().getRowForPath(path);
242
243     }
244     view.selectRow(rows[0]);
245
246   }
247
248   /** ************************ actions ******************************* */
249   /**
250    * create the PopupMenu
251    */

252   public void createPopupMenu() {
253     try {
254       InputStream JavaDoc is = DiskIO.getResourceStream("org/columba/mail/action/table_contextmenu.xml");
255
256       menu = new MenuXMLDecoder(getFrameController()).createPopupMenu(is);
257     } catch (IOException JavaDoc e) {
258       e.printStackTrace();
259     }
260   }
261
262   /**
263    * Get popup menu
264    *
265    * @return popup menu
266    */

267   public JPopupMenu JavaDoc getPopupMenu() {
268     return menu;
269   }
270
271   /**
272    * Method is called if folder data changed.
273    * <p>
274    * It is responsible for updating the correct underlying model.
275    *
276    * @param event
277    * update event
278    */

279   public void tableChanged(TableModelChangedEvent event) {
280
281     // selected rows before updating the model
282
// -> used later to restore the selection
283
previouslySelectedRows = view.getSelectedRows();
284     previouslySelectedNodes = getView().getSelectedNodes();
285
286     // folder in which the update occurs
287
IFolder folder = event.getSrcFolder();
288
289     if (folder == null) {
290       return;
291     }
292
293     LOG.info("source folder=" + folder.getName());
294
295     // get current selection
296
IFolderCommandReference r = (IFolderCommandReference) ((MailFrameMediator) frameController).getTableSelection();
297     IFolder srcFolder = r.getSourceFolder();
298
299     // its always possible that no folder is currenlty selected
300
if (srcFolder != null) {
301       LOG.info("selected folder=" + srcFolder.getName());
302     }
303
304     // update infopanel (gray panel below the toolbar)
305
// showing total/unread/recent messages count
306
/*
307      * if (getFrameController() instanceof MailFrameMediator) { if (srcFolder != null) { ((ThreePaneMailFrameController)
308      * getFrameController()) .getFolderInfoPanel().setFolder((IMailFolder) srcFolder); } }
309      */

310
311     // only update table if, this folder is the same
312
// as the currently selected
313
if (!folder.equals(srcFolder)) {
314       return;
315     }
316
317     switch (event.getEventType()) {
318     case -1: {
319       getHeaderTableModel().set(event.getHeaderList());
320
321       // FIXME threaded-view auto collapse
322
/*
323        * if (getTableModelThreadedView().isEnabled()) { // expand all unread message nodes for (int i = 0; i <
324        * getView().getRowCount(); i++) { System.out.println("i=" + i + " count=" + getView().getRowCount()); TreePath path =
325        * getView().getTree().getPathForRow(i); MessageNode node = (MessageNode) path .getLastPathComponent(); IColumbaHeader h =
326        * node.getHeader(); boolean unseen = !h.getFlags().getSeen(); if (unseen) { getView().getTree().expandPath(path); } } }
327        */

328       break;
329     }
330
331     case TableModelChangedEvent.UPDATE: {
332       getHeaderTableModel().update();
333
334       break;
335     }
336
337     case TableModelChangedEvent.REMOVE: {
338       getHeaderTableModel().remove(event.getUids());
339
340       break;
341     }
342
343     case TableModelChangedEvent.MARK: {
344       getHeaderTableModel().modify(event.getUids());
345
346       break;
347     }
348     }
349
350     // when marking messages, don't touch selection
351
if (event.getEventType() == TableModelChangedEvent.MARK)
352       return;
353
354     // re-select previous selection
355
if (previouslySelectedRows != null) {
356       // only re-select if only a single row was formerly selected
357
if ((previouslySelectedRows.length == 1) && (previouslySelectedNodes.length > 0)) {
358         int row = ((HeaderTableModel) getHeaderTableModel()).getRow(previouslySelectedNodes[0]);
359
360         // if message was removed from JTable
361
if (row == -1)
362           row = previouslySelectedRows[0];
363
364         // select row
365
view.selectRow(row);
366
367         // scrolling to the selected row
368
getView().makeRowVisible(row);
369
370       }
371     }
372
373   }
374
375   /**
376    * Returns the mailFrameController.
377    *
378    * @return MailFrameController
379    */

380   public IFrameMediator getFrameController() {
381     return frameController;
382   }
383
384   /**
385    * Show the headerlist of currently selected folder.
386    * <p>
387    * Additionally, implements folderoptions plugin entrypoint.
388    *
389    * @see org.columba.mail.folder.folderoptions
390    * @see org.columba.mail.gui.frame.ViewHeaderListInterface#showHeaderList(org.columba.mail.folder.Folder,
391    * org.columba.mail.message.HeaderList)
392    */

393   public void showHeaderList(IMailbox folder, IHeaderList headerList) throws Exception JavaDoc {
394
395     // save previously selected folder options
396
if (previouslySelectedFolder != null) {
397       ((MailFrameMediator) getFrameController()).getFolderOptionsController().save(previouslySelectedFolder);
398     }
399
400     // load options of newly selected folder
401
((MailFrameMediator) getFrameController()).getFolderOptionsController().load(folder, FolderOptionsController.STATE_BEFORE);
402
403     getHeaderTableModel().set(headerList);
404
405     // load options of newly selected folder
406
((MailFrameMediator) getFrameController()).getFolderOptionsController().load(folder, FolderOptionsController.STATE_AFTER);
407
408     // remember previously selected folder
409
previouslySelectedFolder = folder;
410   }
411
412   /**
413    * Show empty messagelist with no elements.
414    */

415   public void clear() {
416     // clear model
417
getHeaderTableModel().set(null);
418
419   }
420
421   /** *********** implement getter/setter methods ******************** */
422   /**
423    * return the table model sorter
424    */

425   public TableModelSorter getTableModelSorter() {
426     return tableModelSorter;
427   }
428
429   /**
430    * return the threaded view model
431    */

432   public TableModelThreadedView getTableModelThreadedView() {
433     return tableModelThreadedView;
434   }
435
436   /** ************************* ListSelectionListener interface ************* */
437
438   /**
439    * @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent)
440    */

441   public void valueChanged(ListSelectionEvent JavaDoc arg0) {
442
443     // enable/disable cut/copy/paste/selectall actions
444
// FocusManager.getInstance().updateActions();
445

446     // if user is currently changing selection, don't do anything
447
// -> wait until the final selection is available
448
if (arg0.getValueIsAdjusting())
449       return;
450
451     /*
452      * // @author fdietz // bug #983931, message jumps while downloading new messages if (getView().getSelectedNodes().length ==
453      * 0) { // skip if no message selected if (getView().getRowCount() > 0) // if folder contains messages // -> skip to fix
454      * above bug return; }
455      */

456     //System.out.println("selection changed="+getView().getSelectedRow());
457

458     // selected nodes
459
MessageNode[] nodes = getView().getSelectedNodes();
460
461     List JavaDoc<String JavaDoc> v = new Vector JavaDoc<String JavaDoc>();
462
463     for (int i = 0; i < nodes.length; i++) {
464       final MessageNode _node = nodes[i];
465       if (_node != null) {
466         final Integer JavaDoc _selectedNode = (Integer JavaDoc) _node.getUid();
467         if (_selectedNode != null) {
468           v.add(_selectedNode.toString());
469         }
470       }
471     }
472
473     fireMessageListSelectionChangedEvent(v);
474
475   }
476
477   /**
478    * @see org.columba.mail.gui.table.model.TableModelChangedListener#isInterestedIn(IFolder)
479    */

480   public boolean isInterestedIn(IMailFolder folder) {
481
482     return folder == previouslySelectedFolder;
483   }
484
485   /**
486    * @see org.columba.mail.gui.table.ITableController#getSelectedNodes()
487    */

488   public IMessageNode[] getSelectedNodes() {
489     return getView().getSelectedNodes();
490   }
491
492   /**
493    * @see org.columba.mail.gui.table.ITableController#selectFirstRow()
494    */

495   public Object JavaDoc selectFirstRow() {
496     Object JavaDoc result = getView().selectFirstRow();
497
498     return result;
499   }
500
501   /**
502    * @see org.columba.mail.gui.table.ITableController#selectLastRow()
503    */

504   public Object JavaDoc selectLastRow() {
505     if (getView().getColumnCount() > 0) {
506       Object JavaDoc result = getView().selectLastRow();
507       return result;
508     } else {
509       return null;
510     }
511
512   }
513
514   /**
515    * @see org.columba.mail.gui.table.ITableController#selectRow(int)
516    */

517   public void selectRow(int row) {
518     getView().selectRow(row);
519
520   }
521
522   /**
523    * @see org.columba.mail.gui.table.ITableController#getMessagNode(java.lang.Object)
524    */

525   public IMessageNode getMessageNode(Object JavaDoc uid) {
526     return getView().getMessagNode(uid);
527   }
528
529   /**
530    * @see org.columba.mail.gui.table.ITableController#enableThreadedView(boolean)
531    */

532   public void enableThreadedView(boolean enableThreadedMode, boolean updateModel) {
533     getTableModelThreadedView().setEnabled(enableThreadedMode);
534     getHeaderTableModel().enableThreadedView(enableThreadedMode);
535     getView().enableThreadedView(enableThreadedMode);
536
537     if (updateModel)
538       getHeaderTableModel().update();
539
540     if (enableThreadedMode) {
541       // expand all unread message nodes
542
for (int i = 0; i < getView().getRowCount(); i++) {
543         LOG.info("i=" + i + " count=" //$NON-NLS-1$ //$NON-NLS-2$
544
+ getView().getRowCount());
545
546         TreePath JavaDoc path = getView().getTree().getPathForRow(i);
547         MessageNode node = (MessageNode) path.getLastPathComponent();
548         IColumbaHeader h = node.getHeader();
549         boolean unseen = !h.getFlags().getSeen();
550         if (unseen) {
551           getView().getTree().expandPath(path);
552         }
553       }
554     }
555   }
556
557   /**
558    * @see org.columba.mail.gui.table.ITableController#clearSelection()
559    */

560   public void clearSelection() {
561     getView().getSelectionModel().clearSelection();
562   }
563
564   /**
565    * @see org.columba.mail.gui.table.ITableController#makeSelectedRow
566    */

567   public void makeSelectedRowVisible() {
568     getView().scrollRectToVisible(getView().getCellRect(getView().getSelectedRow(), 0, false));
569   }
570
571   /**
572    * @see org.columba.mail.gui.table.ITableController#getSortingStateObservable()
573    */

574   public Observable JavaDoc getSortingStateObservable() {
575     return getTableModelSorter().getSortingStateObservable();
576   }
577
578   /**
579    * @see org.columba.mail.gui.table.ITableController#setSortingOrder(boolean)
580    */

581   public void setSortingOrder(boolean order) {
582     getTableModelSorter().setSortingOrder(order);
583   }
584
585   /**
586    * @see org.columba.mail.gui.table.ITableController#setSortingColumn(java.lang.String)
587    */

588   public void setSortingColumn(String JavaDoc column) {
589     getTableModelSorter().setSortingColumn(column);
590   }
591
592   /**
593    * @see org.columba.mail.gui.table.ITableController#getSortingColumn()
594    */

595   public String JavaDoc getSortingColumn() {
596     return getTableModelSorter().getSortingColumn();
597   }
598
599   /**
600    * @see org.columba.mail.gui.table.ITableController#getSortingOrder()
601    */

602   public boolean getSortingOrder() {
603     return getTableModelSorter().getSortingOrder();
604   }
605
606   /**
607    * @see org.columba.mail.gui.table.ITableController#isThreadedViewEnabled()
608    */

609   public boolean isThreadedViewEnabled() {
610     return getTableModelThreadedView().isEnabled();
611   }
612
613   /**
614    * @see org.columba.mail.gui.table.ITableController#getRowCount()
615    */

616   public int getRowCount() {
617     return getView().getRowCount();
618   }
619
620   /**
621    * @see org.columba.mail.gui.table.ITableController#getColumnModel()
622    */

623   public TableColumnModel JavaDoc getColumnModel() {
624     return view.getColumnModel();
625   }
626
627   /**
628    * @see org.columba.mail.gui.table.ITableController#resetColumnModel()
629    */

630   public void resetColumnModel() {
631     TableView view = getView();
632
633     // remove all columns from table model
634
getHeaderTableModel().clearColumns();
635
636     // reset row height
637
view.resetRowHeight();
638     view.setShowHorizontalLines(false);
639
640     // remove all columns for column model
641
view.getColumnModel().removeColumnModelListener(getHeaderTableModel());
642     view.setColumnModel(new DefaultTableColumnModel JavaDoc());
643     view.getColumnModel().addColumnModelListener(getHeaderTableModel());
644
645     // for some weird reason the table loses its inter-cell spacing
646
// property, when changing the underlying column model
647
// -> setting this to (0,0) again
648
view.setIntercellSpacing(new Dimension JavaDoc(0, 0));
649
650     // if new columns were added, we have to initialize the tooltips
651
initTooltips();
652   }
653
654   /**
655    * @see org.columba.mail.gui.table.ITableController#createColumn(java.lang.String, int)
656    */

657   public TableColumn JavaDoc createTableColumn(String JavaDoc name, int size) {
658     return view.createTableColumn(name, size);
659   }
660
661   /**
662    * @see org.columba.mail.gui.table.ITableController#addColumn(javax.swing.table.TableColumn)
663    */

664   public void addColumn(TableColumn JavaDoc column) {
665     view.addColumn(column);
666   }
667
668   /**
669    * Mouse listener for selecting columns with the left mouse to change the sorting order.
670    * <p>
671    * Also responsible for changing the icon in the renderer
672    *
673    * @author fdietz
674    */

675   class TableHeaderMouseListener extends MouseAdapter JavaDoc {
676
677     private TableModelSorter sorter;
678
679     private SortingStateObservable observable;
680
681     private ImageIcon JavaDoc ascending = new AscendingIcon();
682
683     private ImageIcon JavaDoc descending = new DescendingIcon();
684
685     /**
686      *
687      */

688     public TableHeaderMouseListener(TableModelSorter sorter) {
689
690       this.sorter = sorter;
691
692       this.observable = sorter.getSortingStateObservable();
693
694       JTableHeader JavaDoc th = view.getTableHeader();
695       th.addMouseListener(this);
696     }
697
698     public void mouseClicked(MouseEvent JavaDoc e) {
699       TableColumnModel JavaDoc columnModel = view.getColumnModel();
700       int viewColumn = columnModel.getColumnIndexAtX(e.getX());
701       int column = viewColumn;
702
703       // int column = view.convertColumnIndexToModel(viewColumn);
704
// int column2 = view.convertColumnIndexToView(viewColumn);
705
if (column != -1) {
706         ImageIcon JavaDoc icon = null;
707
708         if (sorter.getSortingOrder() == true) {
709           icon = ascending;
710         } else {
711           icon = descending;
712         }
713
714         // disable every icon
715
// -> set appropriate icon for selected column
716
for (int i = 0; i < columnModel.getColumnCount(); i++) {
717           JLabel JavaDoc renderer = (JLabel JavaDoc) columnModel.getColumn(i).getHeaderRenderer();
718
719           if (i == column) {
720             renderer.setIcon(icon);
721           } else {
722             renderer.setIcon(null);
723           }
724         }
725
726         // remember selected node
727
MessageNode[] nodes = view.getSelectedNodes();
728         Object JavaDoc uid = null;
729
730         if ((nodes != null) && (nodes.length > 0))
731           uid = nodes[0].getUid();
732
733         // repaint table header
734
SwingUtilities.invokeLater(new Runnable JavaDoc() {
735           public void run() {
736             view.getTableHeader().repaint();
737           }
738         });
739
740         String JavaDoc columnName = getHeaderTableModel().getColumnName(column);
741
742         // notify the model to sort the table
743
// sorter.sort(column);
744
boolean order = false;
745
746         if (sorter.getSortingColumn().equals(columnName)) {
747           order = !sorter.getSortingOrder();
748         }
749         // notify observers (sorting state submenu)
750
observable.setSortingState(columnName, order);
751
752         setSortingColumn(columnName);
753         setSortingOrder(order);
754         getHeaderTableModel().update();
755
756         // make selected row visible again
757
if (uid != null)
758           setSelected(new Object JavaDoc[] { uid });
759
760       }
761     }
762   }
763
764   public ListSelectionModel JavaDoc getListSelectionModel() {
765     return view.getSelectionModel();
766   }
767
768   /**
769    * @see org.columba.mail.gui.table.ITableController#getSelectedRows()
770    */

771   public int[] getSelectedRows() {
772     return view.getSelectedRows();
773   }
774
775   /**
776    * @see org.columba.mail.gui.table.ITableController#getPathForRow(int)
777    */

778   public TreePath JavaDoc getPathForRow(int row) {
779     return view.getTree().getPathForRow(row);
780   }
781
782   public void addMessageListSelectionListener(IMessageListSelectionListener l) {
783     listenerList.add(IMessageListSelectionListener.class, l);
784   }
785
786   public void removeMessageListSelectionListener(IMessageListSelectionListener l) {
787     listenerList.remove(IMessageListSelectionListener.class, l);
788   }
789
790   protected void fireMessageListSelectionChangedEvent(List JavaDoc<String JavaDoc> messageIds) {
791
792     IMessageListSelectionEvent e = new MessageListSelectionEvent(this, messageIds);
793     // Guaranteed to return a non-null array
794
Object JavaDoc[] listeners = listenerList.getListenerList();
795
796     // Process the listeners last to first, notifying
797
// those that are interested in this event
798
for (int i = listeners.length - 2; i >= 0; i -= 2) {
799       if (listeners[i] == IMessageListSelectionListener.class) {
800         ((IMessageListSelectionListener) listeners[i + 1]).selectionChanged(e);
801       }
802     }
803   }
804
805 }
Popular Tags