001: package org.columba.contact.gui.box;
002:
003: import java.awt.BorderLayout;
004: import java.awt.Point;
005: import java.awt.event.ActionEvent;
006: import java.awt.event.ActionListener;
007: import java.awt.event.MouseAdapter;
008: import java.awt.event.MouseEvent;
009: import java.util.List;
010:
011: import javax.swing.BorderFactory;
012: import javax.swing.ImageIcon;
013: import javax.swing.JComponent;
014: import javax.swing.JLabel;
015: import javax.swing.JMenuItem;
016: import javax.swing.JPanel;
017: import javax.swing.JPopupMenu;
018: import javax.swing.JScrollPane;
019:
020: import org.columba.addressbook.folder.IContactFolder;
021: import org.columba.addressbook.gui.dialog.contact.ContactEditorDialog;
022: import org.columba.addressbook.gui.tree.AddressbookTreeModel;
023: import org.columba.addressbook.model.IContactModel;
024: import org.columba.addressbook.model.IContactModelPartial;
025: import org.columba.api.exception.ServiceNotFoundException;
026: import org.columba.api.gui.frame.IContainer;
027: import org.columba.api.gui.frame.IFrameMediator;
028: import org.columba.core.facade.ServiceFacadeRegistry;
029: import org.columba.core.gui.base.DoubleClickListener;
030: import org.columba.core.gui.base.IconTextField;
031: import org.columba.core.gui.dialog.ErrorDialog;
032: import org.columba.core.gui.frame.FrameManager;
033: import org.columba.core.gui.frame.api.IComponentBox;
034: import org.columba.core.logging.Logging;
035: import org.columba.core.resourceloader.IconKeys;
036: import org.columba.core.resourceloader.ImageLoader;
037: import org.columba.mail.facade.IDialogFacade;
038:
039: import com.jgoodies.forms.builder.DefaultFormBuilder;
040: import com.jgoodies.forms.layout.FormLayout;
041:
042: public class ContactBox extends JPanel implements IComponentBox {
043:
044: private final static ImageIcon icon = ImageLoader
045: .getSmallIcon(IconKeys.EDIT_FIND);
046:
047: private ContactList list;
048:
049: private IconTextField textField;
050:
051: private JLabel label;
052:
053: private IContactFolder selectedFolder;
054:
055: private JPopupMenu contextMenu;
056:
057: public ContactBox() {
058:
059: setLayout(new BorderLayout());
060:
061: label = new JLabel("Quick Find:");
062: label.setDisplayedMnemonic('F');
063: textField = new IconTextField(icon, 10);
064: label.setLabelFor(textField);
065:
066: AddressbookTreeModel model = AddressbookTreeModel.getInstance();
067: selectedFolder = (IContactFolder) model.getFolder("101");
068:
069: list = new ContactList();
070: list.setModel(new FilteringModel());
071: list.addAll(selectedFolder.getHeaderItemList());
072:
073: FolderListMenu popup = new FolderListMenu(new ActionListener() {
074: public void actionPerformed(ActionEvent event) {
075: String id = event.getActionCommand();
076: AddressbookTreeModel model = AddressbookTreeModel
077: .getInstance();
078: selectedFolder = (IContactFolder) model.getFolder(id);
079: List<IContactModelPartial> contactList = selectedFolder
080: .getHeaderItemList();
081: list.setModel(new FilteringModel());
082: list.addAll(contactList);
083: list.installJTextField(textField);
084: textField.setText(textField.getText());
085: }
086: });
087: textField.setPopupMenu(popup);
088:
089: list.installJTextField(textField);
090:
091: list.addMouseListener(new DoubleClickListener() {
092:
093: @Override
094: public void doubleClick(MouseEvent event) {
095: IContactModelPartial selected = (IContactModelPartial) list
096: .getSelectedValue();
097: openEditContactDialog(selected);
098: }
099: });
100:
101: list.add(getPopupMenu());
102: list.addMouseListener(new MyMouseListener());
103:
104: //setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
105:
106: JPanel p = new JPanel();
107: p.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));
108: FormLayout layout = new FormLayout(
109: "pref, 2dlu, fill:default:grow",
110: // 2 columns
111: "fill:default:grow");
112:
113: // create a form builder
114: DefaultFormBuilder builder = new DefaultFormBuilder(layout, p);
115: builder.append(label);
116: builder.append(textField);
117: add(p, BorderLayout.NORTH);
118:
119: JScrollPane scrollPane = new JScrollPane(list);
120: //scrollPane.setBorder(null);
121: add(scrollPane, BorderLayout.CENTER);
122: }
123:
124: private JPopupMenu getPopupMenu() {
125: if (contextMenu != null)
126: return contextMenu;
127:
128: contextMenu = new JPopupMenu();
129:
130: JMenuItem item = new JMenuItem("Open..");
131: item.addActionListener(new ActionListener() {
132: public void actionPerformed(ActionEvent event) {
133: IContactModelPartial selected = (IContactModelPartial) list
134: .getSelectedValue();
135: openEditContactDialog(selected);
136: }
137: });
138: contextMenu.add(item);
139:
140: item = new JMenuItem("Compose Message..");
141: item.addActionListener(new ActionListener() {
142: public void actionPerformed(ActionEvent event) {
143: IContactModelPartial selected = (IContactModelPartial) list
144: .getSelectedValue();
145: String address = selected.getAddress();
146:
147: try {
148: IDialogFacade facade = (IDialogFacade) ServiceFacadeRegistry
149: .getInstance()
150: .getService(
151: org.columba.mail.facade.IDialogFacade.class);
152: facade.openComposer(address);
153: } catch (ServiceNotFoundException e) {
154: e.printStackTrace();
155: }
156: }
157: });
158:
159: contextMenu.add(item);
160: return contextMenu;
161: }
162:
163: /**
164: * *************** IComponentBox implementation
165: * *******************************
166: */
167:
168: public String getDescription() {
169: return "Contacts";
170: }
171:
172: public ImageIcon getIcon() {
173: return ImageLoader.getSmallIcon(IconKeys.ADDRESSBOOK);
174: }
175:
176: public String getName() {
177: return "Contacts";
178: }
179:
180: public String getTechnicalName() {
181: return "contact_list";
182: }
183:
184: public JComponent getView() {
185: return this ;
186: }
187:
188: private void openEditContactDialog(IContactModelPartial selected) {
189:
190: IContactModel card = null;
191: try {
192: card = (IContactModel) selectedFolder.get(selected.getId());
193: } catch (Exception e) {
194: if (Logging.DEBUG)
195: e.printStackTrace();
196: ErrorDialog.createDialog(e.getMessage(), e);
197: }
198:
199: IContainer[] container = FrameManager.getInstance()
200: .getOpenFrames();
201: if (container == null || container.length == 0)
202: throw new RuntimeException("No frames available");
203:
204: IFrameMediator frameMediator = container[0].getFrameMediator();
205:
206: ContactEditorDialog dialog = new ContactEditorDialog(
207: frameMediator.getView().getFrame(), card);
208:
209: if (dialog.getResult()) {
210:
211: try {
212: // modify card properties in folder
213: selectedFolder.modify(selected.getId(), dialog
214: .getDestModel());
215: } catch (Exception e1) {
216: if (Logging.DEBUG)
217: e1.printStackTrace();
218:
219: ErrorDialog.createDialog(e1.getMessage(), e1);
220: }
221:
222: }
223: }
224:
225: class MyMouseListener extends MouseAdapter {
226:
227: @Override
228: public void mouseClicked(MouseEvent e) {
229: handleEvent(e);
230: }
231:
232: @Override
233: public void mousePressed(MouseEvent e) {
234: handlePopupEvent(e);
235: }
236:
237: @Override
238: public void mouseReleased(MouseEvent e) {
239: handlePopupEvent(e);
240: }
241:
242: /**
243: * @param e
244: */
245: private void handlePopupEvent(MouseEvent e) {
246: Point p = e.getPoint();
247: if (e.isPopupTrigger()) {
248: // check if a single entry is selected
249: if (list.getSelectedIndices().length <= 1) {
250: // select new item
251: int index = list.locationToIndex(p);
252: list.setSelectedIndex(index);
253: }
254: // show context menu
255: getPopupMenu().show(e.getComponent(), p.x, p.y);
256: }
257: }
258:
259: /**
260: * @param e
261: */
262: private void handleEvent(MouseEvent e) {
263: }
264: }
265:
266: }
|