1 package org.columba.calendar.ui.box; 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.text.DateFormat ; 10 import java.util.Iterator ; 11 import java.util.List ; 12 13 import javax.swing.BorderFactory ; 14 import javax.swing.DefaultListModel ; 15 import javax.swing.JLabel ; 16 import javax.swing.JList ; 17 import javax.swing.JPanel ; 18 import javax.swing.JTextField ; 19 import javax.swing.ListCellRenderer ; 20 import javax.swing.ListModel ; 21 import javax.swing.border.AbstractBorder ; 22 import javax.swing.border.Border ; 23 24 import org.columba.calendar.model.api.IEventInfo; 25 import org.columba.calendar.resourceloader.IconKeys; 26 import org.columba.calendar.resourceloader.ResourceLoader; 27 import org.jdesktop.swingx.JXList; 28 import org.jdesktop.swingx.decorator.Highlighter; 29 import org.jdesktop.swingx.decorator.HighlighterPipeline; 30 import org.jdesktop.swingx.decorator.RolloverHighlighter; 31 32 public class CalendarList extends JXList { 33 34 private DefaultListModel listModel; 35 36 public CalendarList() { 37 super(); 38 39 setCellRenderer(new MyListCellRenderer()); 40 41 setBorder(null); 42 setHighlighters(new HighlighterPipeline( 43 new Highlighter[] { new RolloverHighlighter(new Color (248, 248, 44 248), Color.white) })); 45 setRolloverEnabled(true); 46 47 } 48 49 public void addAll(List <IEventInfo> list) { 50 Iterator <IEventInfo> it = list.iterator(); 51 while (it.hasNext()) { 52 addElement(it.next()); 53 } 54 } 55 56 public void add(IEventInfo result) { 57 addElement(result); 58 } 59 60 64 65 68 69 public void installJTextField(JTextField input) { 70 if (input != null) { 71 FilteringModel model = (FilteringModel) getModel(); 72 input.getDocument().addDocumentListener(model); 73 } 74 } 75 76 79 80 public void uninstallJTextField(JTextField input) { 81 if (input != null) { 82 FilteringModel model = (FilteringModel) getModel(); 83 input.getDocument().removeDocumentListener(model); 84 } 85 } 86 87 90 91 public void setModel(ListModel model) { 92 if (!(model instanceof FilteringModel)) { 93 throw new IllegalArgumentException (); 94 } else { 95 super.setModel(model); 96 } 97 } 98 99 102 public void addElement(IEventInfo element) { 103 ((FilteringModel) getModel()).addElement(element); 104 } 105 106 class MyListCellRenderer extends JPanel implements ListCellRenderer { 107 108 private JLabel iconLabel = new JLabel (); 109 110 private JLabel titleLabel = new JLabel (); 111 112 private JLabel descriptionLabel = new JLabel (); 113 114 private JPanel centerPanel; 115 116 private JLabel startDateLabel = new JLabel (); 117 118 private Border lineBorder = new HeaderSeparatorBorder(new Color (230, 119 230, 230)); 120 121 private DateFormat df = DateFormat.getDateTimeInstance(); 122 123 MyListCellRenderer() { 124 setLayout(new BorderLayout ()); 125 126 centerPanel = new JPanel (); 127 centerPanel.setLayout(new BorderLayout ()); 128 129 JPanel titlePanel = new JPanel (); 130 titlePanel.setLayout(new BorderLayout ()); 131 titlePanel.add(titleLabel, BorderLayout.WEST); 132 titlePanel.add(startDateLabel, BorderLayout.EAST); 133 134 centerPanel.add(titlePanel, BorderLayout.NORTH); 135 centerPanel.add(descriptionLabel, BorderLayout.CENTER); 136 centerPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 2)); 137 add(iconLabel, BorderLayout.WEST); 138 add(centerPanel, BorderLayout.CENTER); 139 140 descriptionLabel.setFont(descriptionLabel.getFont().deriveFont( 141 Font.ITALIC)); 142 143 setBorder(BorderFactory.createCompoundBorder(lineBorder, 144 BorderFactory.createEmptyBorder(2, 2, 2, 2))); 145 iconLabel.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 8)); 146 147 centerPanel.setOpaque(false); 148 titlePanel.setOpaque(false); 149 setOpaque(true); 150 151 } 152 153 public Component getListCellRendererComponent(JList list, Object value, 154 int index, boolean isSelected, boolean cellHasFocus) { 155 156 if (isSelected) { 157 setBackground(list.getSelectionBackground()); 158 setForeground(list.getSelectionForeground()); 159 } else { 160 setBackground(list.getBackground()); 161 setForeground(list.getForeground()); 162 } 163 164 IEventInfo result = (IEventInfo) value; 165 166 titleLabel.setText(result.getEvent().getSummary()); 167 iconLabel.setIcon(ResourceLoader 168 .getSmallIcon(IconKeys.NEW_APPOINTMENT)); 169 if (result.getEvent().getLocation() != null 170 && result.getEvent().getLocation().length() > 0) 171 descriptionLabel.setText(result.getEvent().getLocation()); 172 else 173 descriptionLabel.setText("no Location specified"); 174 175 startDateLabel.setText(df.format(result.getEvent().getDtStart().getTime())); 176 return this; 177 } 178 179 } 180 181 class HeaderSeparatorBorder extends AbstractBorder { 182 183 protected Color color; 184 185 public HeaderSeparatorBorder(Color color) { 186 super(); 187 188 this.color = color; 189 } 190 191 208 public void paintBorder(Component c, Graphics g, int x, int y, 209 int width, int height) { 210 Color oldColor = g.getColor(); 211 g.setColor(color); 212 g.drawLine(x, y + height - 1, x + width - 1, y + height - 1); 213 214 g.setColor(oldColor); 215 } 216 217 223 public Insets getBorderInsets(Component c) { 224 return new Insets (0, 0, 1, 0); 225 } 226 227 235 public Insets getBorderInsets(Component c, Insets insets) { 236 insets.left = insets.top = insets.right = insets.bottom = 1; 237 return insets; 238 } 239 240 } 241 242 } 243 | Popular Tags |