1 package org.columba.calendar.ui.search; 2 3 import java.awt.BorderLayout ; 4 import java.awt.Color ; 5 import java.awt.Component ; 6 import java.awt.Font ; 7 import java.awt.Graphics ; 8 import java.awt.Insets ; 9 import java.awt.Point ; 10 import java.awt.event.ActionEvent ; 11 import java.awt.event.ActionListener ; 12 import java.awt.event.MouseAdapter ; 13 import java.awt.event.MouseEvent ; 14 import java.net.URI ; 15 import java.text.DateFormat ; 16 import java.util.Calendar ; 17 import java.util.Iterator ; 18 import java.util.List ; 19 20 import javax.swing.BorderFactory ; 21 import javax.swing.DefaultListModel ; 22 import javax.swing.JLabel ; 23 import javax.swing.JList ; 24 import javax.swing.JMenuItem ; 25 import javax.swing.JPanel ; 26 import javax.swing.JPopupMenu ; 27 import javax.swing.ListCellRenderer ; 28 import javax.swing.border.AbstractBorder ; 29 import javax.swing.border.Border ; 30 31 import org.columba.calendar.facade.DialogFacade; 32 import org.columba.calendar.model.api.IComponent; 33 import org.columba.calendar.model.api.IEvent; 34 import org.columba.calendar.model.api.ITodo; 35 import org.columba.calendar.resourceloader.IconKeys; 36 import org.columba.calendar.resourceloader.ResourceLoader; 37 import org.columba.calendar.search.CalendarSearchResult; 38 import org.columba.core.gui.base.DoubleClickListener; 39 import org.columba.core.search.api.ISearchResult; 40 import org.jdesktop.swingx.JXList; 41 import org.jdesktop.swingx.decorator.Highlighter; 42 import org.jdesktop.swingx.decorator.HighlighterPipeline; 43 import org.jdesktop.swingx.decorator.RolloverHighlighter; 44 45 public class SearchResultList extends JXList { 46 47 private DefaultListModel listModel; 48 49 private JPopupMenu contextMenu; 50 51 public SearchResultList() { 52 super(); 53 54 listModel = new DefaultListModel (); 55 setModel(listModel); 56 setCellRenderer(new MyListCellRenderer()); 57 58 setBorder(null); 59 setHighlighters(new HighlighterPipeline( 60 new Highlighter[] { new RolloverHighlighter(new Color (248, 248, 61 248), Color.white) })); 62 setRolloverEnabled(true); 63 64 addMouseListener(new DoubleClickListener() { 65 @Override  66 public void doubleClick(MouseEvent event) { 67 ISearchResult result = (ISearchResult) getSelectedValue(); 68 URI uri = result.getLocation(); 69 new DialogFacade().openEventEditorDialog(uri); 70 } 71 }); 72 73 add(getPopupMenu()); 74 addMouseListener(new MyMouseListener()); 75 } 76 77 private JPopupMenu getPopupMenu() { 78 if (contextMenu != null) 79 return contextMenu; 80 81 contextMenu = new JPopupMenu (); 82 83 JMenuItem item = new JMenuItem ("Open.."); 84 item.addActionListener(new ActionListener () { 85 public void actionPerformed(ActionEvent event) { 86 ISearchResult result = (ISearchResult) getSelectedValue(); 87 URI uri = result.getLocation(); 88 new DialogFacade().openEventEditorDialog(uri); 89 } 90 }); 91 92 contextMenu.add(item); 93 return contextMenu; 94 } 95 96 public void addAll(List <ISearchResult> result) { 97 Iterator <ISearchResult> it = result.iterator(); 98 while (it.hasNext()) { 99 listModel.addElement(it.next()); 100 } 101 } 102 103 public void add(ISearchResult result) { 104 listModel.addElement(result); 105 } 106 107 public void clear() { 108 listModel.clear(); 109 } 110 111 class MyListCellRenderer extends JPanel implements ListCellRenderer { 112 113 private JLabel iconLabel = new JLabel (); 114 115 private JLabel titleLabel = new JLabel (); 116 117 private JLabel startDateLabel = new JLabel (); 118 119 private JLabel descriptionLabel = new JLabel (); 120 121 private JPanel centerPanel; 122 123 private Border lineBorder = new HeaderSeparatorBorder(new Color (230, 124 230, 230)); 125 126 private DateFormat df = DateFormat.getDateTimeInstance(); 127 128 MyListCellRenderer() { 129 setLayout(new BorderLayout ()); 130 131 centerPanel = new JPanel (); 132 centerPanel.setLayout(new BorderLayout ()); 133 134 JPanel titlePanel = new JPanel (); 135 titlePanel.setLayout(new BorderLayout ()); 136 titlePanel.add(titleLabel, BorderLayout.WEST); 137 titlePanel.add(startDateLabel, BorderLayout.EAST); 138 139 centerPanel.add(titlePanel, BorderLayout.NORTH); 140 centerPanel.add(descriptionLabel, BorderLayout.CENTER); 141 centerPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 2)); 142 add(iconLabel, BorderLayout.WEST); 143 add(centerPanel, BorderLayout.CENTER); 144 145 descriptionLabel.setFont(descriptionLabel.getFont().deriveFont( 146 Font.ITALIC)); 147 148 setBorder(BorderFactory.createCompoundBorder(lineBorder, 149 BorderFactory.createEmptyBorder(2, 2, 2, 2))); 150 iconLabel.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 8)); 151 152 titlePanel.setOpaque(false); 153 centerPanel.setOpaque(false); 154 setOpaque(true); 155 156 } 157 158 public Component getListCellRendererComponent(JList list, Object value, 159 int index, boolean isSelected, boolean cellHasFocus) { 160 161 if (isSelected) { 162 setBackground(list.getSelectionBackground()); 163 setForeground(list.getSelectionForeground()); 164 165 } else { 166 setBackground(list.getBackground()); 167 setForeground(list.getForeground()); 168 169 } 170 171 CalendarSearchResult result = (CalendarSearchResult) value; 172 173 titleLabel.setText(result.getTitle()); 174 iconLabel.setIcon(ResourceLoader 175 .getSmallIcon(IconKeys.NEW_APPOINTMENT)); 176 if (result.getDescription() != null 177 && result.getDescription().length() > 0) 178 descriptionLabel.setText(result.getDescription()); 179 else 180 descriptionLabel.setText("no Description specified"); 181 182 IComponent c = result.getModel(); 183 if (c.getType().equals(IComponent.TYPE.EVENT)) { 184 IEvent event = (IEvent) c; 185 Calendar startDate = event.getDtStart(); 186 187 startDateLabel.setText(df.format(startDate.getTime())); 188 } else if (c.getType().equals(IComponent.TYPE.TODO)) { 189 ITodo todo = (ITodo) c; 190 Calendar startDate = todo.getDtStart(); 191 startDateLabel.setText(df.format(startDate.getTime())); 192 } else 193 throw new IllegalArgumentException ( 194 "unsupported component type " + c.getType()); 195 196 return this; 197 } 198 199 } 200 201 class MyMouseListener extends MouseAdapter { 202 203 @Override  204 public void mouseClicked(MouseEvent e) { 205 handleEvent(e); 206 } 207 208 @Override  209 public void mousePressed(MouseEvent e) { 210 handlePopupEvent(e); 211 } 212 213 @Override  214 public void mouseReleased(MouseEvent e) { 215 handlePopupEvent(e); 216 } 217 218 221 private void handlePopupEvent(MouseEvent e) { 222 Point p = e.getPoint(); 223 if (e.isPopupTrigger()) { 224 if (getSelectedIndices().length <= 1) { 226 int index = locationToIndex(p); 228 setSelectedIndex(index); 229 } 230 getPopupMenu().show(e.getComponent(), p.x, p.y); 232 } 233 } 234 235 238 private void handleEvent(MouseEvent e) { 239 } 240 } 241 242 class HeaderSeparatorBorder extends AbstractBorder { 243 244 protected Color color; 245 246 public HeaderSeparatorBorder(Color color) { 247 super(); 248 249 this.color = color; 250 } 251 252 269 public void paintBorder(Component c, Graphics g, int x, int y, 270 int width, int height) { 271 Color oldColor = g.getColor(); 272 g.setColor(color); 273 g.drawLine(x, y + height - 1, x + width - 1, y + height - 1); 274 275 g.setColor(oldColor); 276 } 277 278 284 public Insets getBorderInsets(Component c) { 285 return new Insets (0, 0, 1, 0); 286 } 287 288 296 public Insets getBorderInsets(Component c, Insets insets) { 297 insets.left = insets.top = insets.right = insets.bottom = 1; 298 return insets; 299 } 300 301 } 302 } 303 | Popular Tags |