1 package org.columba.addressbook.gui.search; 2 3 import java.awt.BorderLayout ; 4 import java.awt.Color ; 5 import java.awt.Component ; 6 import java.awt.Graphics ; 7 import java.awt.Insets ; 8 import java.awt.Point ; 9 import java.awt.event.ActionEvent ; 10 import java.awt.event.ActionListener ; 11 import java.awt.event.MouseAdapter ; 12 import java.awt.event.MouseEvent ; 13 import java.util.Iterator ; 14 import java.util.List ; 15 16 import javax.swing.BorderFactory ; 17 import javax.swing.DefaultListModel ; 18 import javax.swing.JLabel ; 19 import javax.swing.JList ; 20 import javax.swing.JMenuItem ; 21 import javax.swing.JPanel ; 22 import javax.swing.JPopupMenu ; 23 import javax.swing.ListCellRenderer ; 24 import javax.swing.border.AbstractBorder ; 25 import javax.swing.border.Border ; 26 27 import org.columba.addressbook.facade.DialogFacade; 28 import org.columba.api.exception.ServiceNotFoundException; 29 import org.columba.contact.search.ContactSearchResult; 30 import org.columba.core.facade.ServiceFacadeRegistry; 31 import org.columba.core.gui.base.DoubleClickListener; 32 import org.columba.core.resourceloader.IconKeys; 33 import org.columba.core.resourceloader.ImageLoader; 34 import org.columba.core.search.api.ISearchResult; 35 import org.jdesktop.swingx.JXHyperlink; 36 import org.jdesktop.swingx.JXList; 37 import org.jdesktop.swingx.decorator.Highlighter; 38 import org.jdesktop.swingx.decorator.HighlighterPipeline; 39 import org.jdesktop.swingx.decorator.RolloverHighlighter; 40 41 public class SearchResultList extends JXList { 42 43 private DefaultListModel listModel; 44 private JPopupMenu contextMenu; 45 46 public SearchResultList() { 47 super(); 48 49 listModel = new DefaultListModel (); 50 setModel(listModel); 51 setCellRenderer(new MyListCellRenderer()); 52 53 setBorder(null); 54 setHighlighters(new HighlighterPipeline( 55 new Highlighter[] { new RolloverHighlighter(new Color (248, 248, 56 248), Color.white) })); 57 setRolloverEnabled(true); 58 59 addMouseListener(new DoubleClickListener() { 60 @Override  61 public void doubleClick(MouseEvent event) { 62 ISearchResult selected = (ISearchResult) getSelectedValue(); 63 new DialogFacade().openContactDialog(selected.getLocation()); 64 } 65 }); 66 67 add(getPopupMenu()); 68 addMouseListener(new MyMouseListener()); 69 } 70 71 private JPopupMenu getPopupMenu() { 72 if (contextMenu != null) 73 return contextMenu; 74 75 contextMenu = new JPopupMenu (); 76 77 JMenuItem item = new JMenuItem ("Open.."); 78 item.addActionListener(new ActionListener () { 79 public void actionPerformed(ActionEvent event) { 80 ISearchResult selected = (ISearchResult)getSelectedValue(); 81 new DialogFacade().openContactDialog(selected.getLocation()); 82 } 83 }); 84 contextMenu.add(item); 85 86 item = new JMenuItem ("Compose Message.."); 87 item.addActionListener(new ActionListener () { 88 public void actionPerformed(ActionEvent event) { 89 ContactSearchResult selected = (ContactSearchResult) getSelectedValue(); 90 91 String address = selected.getDescription(); 92 93 try { 94 org.columba.mail.facade.IDialogFacade facade = (org.columba.mail.facade.IDialogFacade) ServiceFacadeRegistry 95 .getInstance() 96 .getService( 97 org.columba.mail.facade.IDialogFacade.class); 98 facade.openComposer(address); 99 } catch (ServiceNotFoundException e) { 100 e.printStackTrace(); 101 } 102 } 103 }); 104 105 contextMenu.add(item); 106 return contextMenu; 107 } 108 109 public void addAll(List <ISearchResult> result) { 110 Iterator <ISearchResult> it = result.iterator(); 111 while (it.hasNext()) { 112 listModel.addElement(it.next()); 113 } 114 } 115 116 public void add(ISearchResult result) { 117 listModel.addElement(result); 118 } 119 120 public void clear() { 121 listModel.clear(); 122 } 123 124 125 class MyMouseListener extends MouseAdapter { 126 127 @Override  128 public void mouseClicked(MouseEvent e) { 129 handleEvent(e); 130 } 131 132 @Override  133 public void mousePressed(MouseEvent e) { 134 handlePopupEvent(e); 135 } 136 137 @Override  138 public void mouseReleased(MouseEvent e) { 139 handlePopupEvent(e); 140 } 141 142 145 private void handlePopupEvent(MouseEvent e) { 146 Point p = e.getPoint(); 147 if (e.isPopupTrigger()) { 148 if (getSelectedIndices().length <= 1) { 150 int index = locationToIndex(p); 152 setSelectedIndex(index); 153 } 154 getPopupMenu().show(e.getComponent(), p.x, p.y); 156 } 157 } 158 159 162 private void handleEvent(MouseEvent e) { 163 } 164 } 165 166 class MyListCellRenderer extends JPanel implements ListCellRenderer { 167 168 private JLabel iconLabel = new JLabel (); 169 170 private JLabel titleLabel = new JLabel (); 171 172 private JXHyperlink descriptionLabel = new JXHyperlink(); 173 174 private JPanel centerPanel; 175 176 private Border lineBorder = new HeaderSeparatorBorder(new Color (230, 177 230, 230)); 178 179 MyListCellRenderer() { 180 setLayout(new BorderLayout ()); 181 182 centerPanel = new JPanel (); 183 centerPanel.setLayout(new BorderLayout ()); 184 185 centerPanel.add(titleLabel, BorderLayout.NORTH); 186 centerPanel.add(descriptionLabel, BorderLayout.CENTER); 187 add(iconLabel, BorderLayout.WEST); 188 add(centerPanel, BorderLayout.CENTER); 189 190 setBorder(BorderFactory.createCompoundBorder(lineBorder, 191 BorderFactory.createEmptyBorder(2, 2, 2, 2))); 192 iconLabel.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 8)); 193 194 centerPanel.setOpaque(false); 195 setOpaque(true); 196 197 } 198 199 public Component getListCellRendererComponent(JList list, Object value, 200 int index, boolean isSelected, boolean cellHasFocus) { 201 202 if (isSelected) { 203 setBackground(list.getSelectionBackground()); 204 setForeground(list.getSelectionForeground()); 205 206 } else { 207 setBackground(list.getBackground()); 208 setForeground(list.getForeground()); 209 210 } 211 212 ISearchResult result = (ISearchResult) value; 213 214 titleLabel.setText(result.getTitle()); 215 iconLabel.setIcon(ImageLoader.getSmallIcon(IconKeys.USER)); 216 descriptionLabel.setText(result.getDescription()); 217 218 return this; 219 } 220 221 } 222 223 class HeaderSeparatorBorder extends AbstractBorder { 224 225 protected Color color; 226 227 public HeaderSeparatorBorder(Color color) { 228 super(); 229 230 this.color = color; 231 } 232 233 250 public void paintBorder(Component c, Graphics g, int x, int y, 251 int width, int height) { 252 Color oldColor = g.getColor(); 253 g.setColor(color); 254 g.drawLine(x, y + height - 1, x + width - 1, y + height - 1); 255 256 g.setColor(oldColor); 257 } 258 259 265 public Insets getBorderInsets(Component c) { 266 return new Insets (0, 0, 1, 0); 267 } 268 269 277 public Insets getBorderInsets(Component c, Insets insets) { 278 insets.left = insets.top = insets.right = insets.bottom = 1; 279 return insets; 280 } 281 282 } 283 } 284 | Popular Tags |