1 package org.columba.calendar.ui.box; 2 3 import java.awt.BorderLayout ; 4 import java.awt.Point ; 5 import java.awt.event.ActionEvent ; 6 import java.awt.event.ActionListener ; 7 import java.awt.event.MouseAdapter ; 8 import java.awt.event.MouseEvent ; 9 import java.util.ArrayList ; 10 import java.util.Iterator ; 11 import java.util.List ; 12 13 import javax.swing.BorderFactory ; 14 import javax.swing.ImageIcon ; 15 import javax.swing.JComponent ; 16 import javax.swing.JLabel ; 17 import javax.swing.JMenuItem ; 18 import javax.swing.JOptionPane ; 19 import javax.swing.JPanel ; 20 import javax.swing.JPopupMenu ; 21 import javax.swing.JScrollPane ; 22 23 import org.columba.calendar.model.api.IComponent; 24 import org.columba.calendar.model.api.IComponentInfo; 25 import org.columba.calendar.model.api.IComponentInfoList; 26 import org.columba.calendar.model.api.IEvent; 27 import org.columba.calendar.model.api.IEventInfo; 28 import org.columba.calendar.store.CalendarStoreFactory; 29 import org.columba.calendar.store.api.ICalendarStore; 30 import org.columba.calendar.store.api.StoreException; 31 import org.columba.calendar.ui.dialog.EditEventDialog; 32 import org.columba.core.gui.base.DoubleClickListener; 33 import org.columba.core.gui.base.IconTextField; 34 import org.columba.core.gui.frame.api.IComponentBox; 35 import org.columba.core.resourceloader.IconKeys; 36 import org.columba.core.resourceloader.ImageLoader; 37 38 import com.jgoodies.forms.builder.DefaultFormBuilder; 39 import com.jgoodies.forms.layout.FormLayout; 40 41 public class CalendarBox extends JPanel implements IComponentBox { 42 43 private final static ImageIcon icon = ImageLoader 44 .getSmallIcon(IconKeys.EDIT_FIND); 45 46 private IconTextField textField; 47 48 private JLabel label; 49 50 private CalendarList list; 51 52 private JPopupMenu contextMenu; 53 54 public CalendarBox() { 55 56 setLayout(new BorderLayout ()); 57 58 label = new JLabel ("Quick Find:"); 59 label.setDisplayedMnemonic('F'); 60 61 textField = new IconTextField(icon, 10); 62 label.setLabelFor(textField); 63 64 list = new CalendarList(); 65 list.setModel(new FilteringModel()); 66 List <IEventInfo> eventList = populateListModel("work"); 67 list.addAll(eventList); 68 69 list.installJTextField(textField); 70 71 CalendarMenu popup = new CalendarMenu(new ActionListener () { 72 public void actionPerformed(ActionEvent event) { 73 String calendarId = event.getActionCommand(); 74 75 List <IEventInfo> eventList = populateListModel(calendarId); 76 list.setModel(new FilteringModel()); 77 list.addAll(eventList); 78 list.installJTextField(textField); 79 textField.setText(textField.getText()); 80 } 81 }); 82 textField.setPopupMenu(popup); 83 84 list.addMouseListener(new DoubleClickListener() { 85 86 @Override 87 public void doubleClick(MouseEvent event) { 88 IEventInfo selected = (IEventInfo) list.getSelectedValue(); 89 openEditCalendarEventDialog(selected); 90 } 91 }); 92 93 94 list.add(getPopupMenu()); 95 list.addMouseListener(new MyMouseListener()); 96 97 setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); 98 99 JPanel p = new JPanel (); 100 p.setBorder(BorderFactory.createEmptyBorder(0, 0, 4, 0)); 101 FormLayout layout = new FormLayout("pref, 2dlu, fill:default:grow", 102 "fill:default:grow"); 104 105 DefaultFormBuilder builder = new DefaultFormBuilder(layout, p); 107 builder.append(label); 108 builder.append(textField); 109 add(p, BorderLayout.NORTH); 110 111 JScrollPane scrollPane = new JScrollPane (list); 112 add(scrollPane, BorderLayout.CENTER); 113 } 114 115 private JPopupMenu getPopupMenu() { 116 if ( contextMenu != null) return contextMenu; 117 118 contextMenu = new JPopupMenu (); 119 120 JMenuItem item = new JMenuItem ("Open.."); 121 item.addActionListener(new ActionListener () { 122 public void actionPerformed(ActionEvent event) { 123 IEventInfo selected = (IEventInfo) list.getSelectedValue(); 124 openEditCalendarEventDialog(selected); 125 } 126 }); 127 128 contextMenu.add(item); 129 return contextMenu; 130 } 131 132 private List <IEventInfo> populateListModel(String calendarId) { 133 ICalendarStore store = CalendarStoreFactory.getInstance() 134 .getLocaleStore(); 135 136 IComponentInfoList infoList = store.getComponentInfoList(calendarId); 137 List <IEventInfo> eventList = new ArrayList <IEventInfo>(); 138 Iterator <IComponentInfo> it = infoList.iterator(); 139 while (it.hasNext()) { 140 IComponentInfo info = it.next(); 141 if (info.getType().equals(IComponent.TYPE.EVENT)) { 142 eventList.add((IEventInfo) info); 143 } 144 } 145 return eventList; 146 } 147 148 public String getDescription() { 149 return "Calendar"; 150 } 151 152 public ImageIcon getIcon() { 153 return ImageLoader.getSmallIcon(IconKeys.CALENDAR); 154 } 155 156 public String getTechnicalName() { 157 return "calendar_box"; 158 } 159 160 public String getName() { 161 return "Calendar"; 162 } 163 164 public JComponent getView() { 165 return this; 166 } 167 168 private void openEditCalendarEventDialog(IEventInfo selected) { 169 170 ICalendarStore store = CalendarStoreFactory.getInstance() 171 .getLocaleStore(); 172 173 try { 175 IEventInfo model = (IEventInfo) store.get(selected.getId()); 176 177 EditEventDialog dialog = new EditEventDialog(null, model); 178 if (dialog.success()) { 179 IEventInfo updatedModel = dialog.getModel(); 180 181 store.modify(selected.getId(), updatedModel); 183 } 184 185 } catch (StoreException e1) { 186 JOptionPane.showMessageDialog(this, e1.getMessage()); 187 e1.printStackTrace(); 188 } 189 } 190 191 class MyMouseListener extends MouseAdapter { 192 193 @Override 194 public void mouseClicked(MouseEvent e) { 195 handleEvent(e); 196 } 197 198 @Override 199 public void mousePressed(MouseEvent e) { 200 handlePopupEvent(e); 201 } 202 203 @Override 204 public void mouseReleased(MouseEvent e) { 205 handlePopupEvent(e); 206 } 207 208 211 private void handlePopupEvent(MouseEvent e) { 212 Point p = e.getPoint(); 213 if (e.isPopupTrigger()) { 214 if ( list.getSelectedIndices().length <= 1 ) { 216 int index = list.locationToIndex(p); 218 list.setSelectedIndex(index); 219 } 220 getPopupMenu().show(e.getComponent(), p.x, p.y); 222 } 223 } 224 225 228 private void handleEvent(MouseEvent e) { 229 } 230 } 231 } 232 | Popular Tags |