001: // The contents of this file are subject to the Mozilla Public License Version
002: // 1.1
003: //(the "License"); you may not use this file except in compliance with the
004: //License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
005: //
006: //Software distributed under the License is distributed on an "AS IS" basis,
007: //WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
008: //for the specific language governing rights and
009: //limitations under the License.
010: //
011: //The Original Code is "The Columba Project"
012: //
013: //The Initial Developers of the Original Code are Frederik Dietz and Timo
014: // Stich.
015: //Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
016: //
017: //All Rights Reserved.
018: package org.columba.mail.gui.table.action;
019:
020: import java.awt.event.ActionEvent;
021: import java.awt.event.ActionListener;
022: import java.util.Enumeration;
023: import java.util.Observable;
024: import java.util.Observer;
025: import java.util.Vector;
026:
027: import javax.swing.ButtonGroup;
028: import javax.swing.JRadioButtonMenuItem;
029:
030: import org.columba.api.gui.frame.IFrameMediator;
031: import org.columba.api.selection.ISelectionListener;
032: import org.columba.api.selection.SelectionChangedEvent;
033: import org.columba.core.gui.menu.IMenu;
034: import org.columba.core.xml.XmlElement;
035: import org.columba.mail.folder.IMailFolder;
036: import org.columba.mail.folder.IMailbox;
037: import org.columba.mail.gui.frame.MailFrameMediator;
038: import org.columba.mail.gui.frame.TableViewOwner;
039: import org.columba.mail.gui.table.SortingStateObservable;
040: import org.columba.mail.gui.tree.selection.TreeSelectionChangedEvent;
041: import org.columba.mail.util.MailResourceLoader;
042:
043: public class SortMessagesMenu extends IMenu implements ActionListener,
044: Observer, ISelectionListener {
045: private ButtonGroup columnGroup;
046:
047: private ButtonGroup orderGroup;
048:
049: private JRadioButtonMenuItem ascendingMenuItem;
050:
051: private JRadioButtonMenuItem descendingMenuItem;
052:
053: private Observable observable;
054:
055: private IMailbox selectedFolder;
056:
057: public SortMessagesMenu(IFrameMediator controller) {
058: super (controller, MailResourceLoader.getString("menu",
059: "mainframe", "menu_view_sort"), "menu_view_sort");
060:
061: ((MailFrameMediator) controller)
062: .registerTreeSelectionListener(this );
063:
064: // register as Observer
065: TableViewOwner table = (TableViewOwner) getFrameMediator();
066: observable = table.getTableController()
067: .getSortingStateObservable();
068: observable.addObserver(this );
069:
070: // createSubMenu();
071: }
072:
073: protected void createSubMenu() {
074: removeAll();
075:
076: XmlElement columns = ((MailFrameMediator) getFrameMediator())
077: .getFolderOptionsController().getConfigNode(
078: selectedFolder, "ColumnOptions");
079:
080: Vector v = new Vector();
081:
082: // *20040510, karlpeder* columns may be null (first time we visit a
083: // folder!?)
084: if (columns != null) {
085: for (int i = 0; i < columns.count(); i++) {
086: XmlElement column = columns.getElement(i);
087:
088: String name = column.getAttribute("name");
089: v.add(name);
090: }
091: }
092:
093: Object[] items = new String[v.size()];
094: items = v.toArray();
095:
096: columnGroup = new ButtonGroup();
097:
098: JRadioButtonMenuItem headerMenuItem;
099:
100: for (int i = 0; i < items.length; i++) {
101: String item = (String) items[i];
102:
103: // all headerfields are lowercase in property file
104: String i18n = MailResourceLoader.getString("header", item
105: .toLowerCase());
106:
107: headerMenuItem = new JRadioButtonMenuItem(i18n);
108: headerMenuItem.setActionCommand(item);
109: headerMenuItem.addActionListener(this );
110: columnGroup.add(headerMenuItem);
111: add(headerMenuItem);
112: }
113:
114: addSeparator();
115:
116: orderGroup = new ButtonGroup();
117: ascendingMenuItem = new JRadioButtonMenuItem(MailResourceLoader
118: .getString("menu", "mainframe", "menu_view_sort_asc"));
119: ascendingMenuItem.setActionCommand("Ascending");
120: ascendingMenuItem.addActionListener(this );
121: orderGroup.add(ascendingMenuItem);
122: add(ascendingMenuItem);
123: descendingMenuItem = new JRadioButtonMenuItem(
124: MailResourceLoader.getString("menu", "mainframe",
125: "menu_view_sort_desc"));
126: descendingMenuItem.setActionCommand("Descending");
127: descendingMenuItem.addActionListener(this );
128: orderGroup.add(descendingMenuItem);
129: add(descendingMenuItem);
130:
131: // update(observable, null);
132: }
133:
134: /*
135: * (non-Javadoc)
136: *
137: * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
138: */
139: public void actionPerformed(ActionEvent e) {
140: String action = e.getActionCommand();
141:
142: TableViewOwner table = (TableViewOwner) getFrameMediator();
143:
144: if (action.equals("Ascending")) {
145: table.getTableController().setSortingOrder(true);
146:
147: } else if (action.equals("Descending")) {
148: table.getTableController().setSortingOrder(false);
149:
150: } else {
151: table.getTableController().setSortingColumn(action);
152:
153: }
154:
155: table.getTableController().getSortingStateObservable()
156: .notifyObservers();
157:
158: // update(observable, null);
159: }
160:
161: /*
162: * (non-Javadoc)
163: *
164: * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
165: */
166: public void update(Observable observable, Object object) {
167: String column = ((SortingStateObservable) observable)
168: .getColumn();
169: boolean ascending = ((SortingStateObservable) observable)
170: .isOrder();
171:
172: updateState(column, ascending);
173: }
174:
175: private void updateState(String column, boolean ascending) {
176: if (columnGroup == null) {
177: return;
178: }
179:
180: Enumeration enumeration = columnGroup.getElements();
181:
182: while (enumeration.hasMoreElements()) {
183: JRadioButtonMenuItem item = (JRadioButtonMenuItem) enumeration
184: .nextElement();
185:
186: if (item.getActionCommand().equals(column)) {
187: item.setSelected(true);
188:
189: break;
190: }
191: }
192:
193: if (ascending) {
194: ascendingMenuItem.setSelected(true);
195: } else {
196: descendingMenuItem.setSelected(true);
197: }
198: }
199:
200: /**
201: * @see org.columba.core.gui.util.ISelectionListener#connectionChanged(org.columba.core.gui.util.SelectionChangedEvent)
202: */
203: public void selectionChanged(SelectionChangedEvent e) {
204: IMailFolder[] selection = ((TreeSelectionChangedEvent) e)
205: .getSelected();
206:
207: if (selection.length == 1) {
208: if (!(selection[0] instanceof IMailbox)) {
209: return;
210: }
211:
212: selectedFolder = (IMailbox) selection[0];
213:
214: createSubMenu();
215:
216: XmlElement xmlElement = ((MailFrameMediator) getFrameMediator())
217: .getFolderOptionsController().getConfigNode(
218: selectedFolder, "SortingOptions");
219:
220: if (xmlElement != null) {
221: // *20040510, karlpeder* columns may be null (first time we
222: // visit a folder!?)
223: // IDefaultItem item = new DefaultItem(xmlElement);
224:
225: // String column = xmlElement.getAttribute("column");
226: // String s = threadedview.getAttribute("order");
227: // boolean order = item.getBoolean("order");
228: }
229: }
230: }
231: }
|