1 package org.columba.core.gui.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.event.ActionEvent ; 10 import java.awt.event.ActionListener ; 11 12 import javax.swing.Action ; 13 import javax.swing.BorderFactory ; 14 import javax.swing.JLabel ; 15 import javax.swing.JPanel ; 16 import javax.swing.UIManager ; 17 import javax.swing.border.Border ; 18 import javax.swing.border.CompoundBorder ; 19 20 import org.columba.api.gui.frame.IFrameMediator; 21 import org.columba.core.gui.search.api.IResultPanel; 22 import org.columba.core.search.ResultListenerAdapter; 23 import org.columba.core.search.api.IResultEvent; 24 import org.columba.core.search.api.ISearchCriteria; 25 import org.columba.core.search.api.ISearchManager; 26 import org.columba.core.search.api.ISearchProvider; 27 import org.jdesktop.swingx.JXCollapsiblePane; 28 import org.jdesktop.swingx.JXHyperlink; 29 30 public class SearchResultBox extends JPanel { 31 32 private final static Color borderColor2 = UIManager 33 .getColor("controlShadow"); 34 35 private final static Color borderColor1 = UIManager 36 .getColor("controlHighlight"); 37 38 private JXHyperlink link; 39 40 private JXHyperlink moreLink; 41 42 private JXCollapsiblePane collapsible; 43 44 private IResultPanel resultPanel; 45 46 private ISearchCriteria criteria; 47 48 private ISearchProvider searchProvider; 49 50 58 public SearchResultBox(final IFrameMediator mediator, 59 final ISearchProvider p, final ISearchCriteria criteria, 60 IResultPanel resultPanel) { 61 this.resultPanel = resultPanel; 62 this.criteria = criteria; 63 this.searchProvider = p; 64 65 collapsible = new JXCollapsiblePane(); 66 collapsible.add(resultPanel.getView()); 68 69 Action toggleAction = collapsible.getActionMap().get( 70 JXCollapsiblePane.TOGGLE_ACTION); 71 toggleAction.putValue(JXCollapsiblePane.COLLAPSE_ICON, UIManager 73 .getIcon("Tree.expandedIcon")); 74 toggleAction.putValue(JXCollapsiblePane.EXPAND_ICON, UIManager 75 .getIcon("Tree.collapsedIcon")); 76 link = new JXHyperlink(toggleAction); 77 if (criteria != null) 78 link.setText(criteria.getTitle()); 79 else 80 link.setText(p.getName()); 81 82 if (criteria != null) 83 link.setToolTipText(criteria.getDescription()); 84 else 85 link.setToolTipText(p.getDescription()); 86 87 link.setOpaque(true); 89 link.setFocusPainted(false); 91 92 link.setUnclickedColor(UIManager.getColor("Label.foreground")); 93 link.setClickedColor(UIManager.getColor("Label.foreground")); 94 95 moreLink = new JXHyperlink(); 96 moreLink.setEnabled(false); 97 moreLink.setText("Show More .."); 98 Font font = UIManager.getFont("Label.font"); 99 Font smallFont = new Font (font.getName(), font.getStyle(), font 100 .getSize() - 2); 101 moreLink.setFont(smallFont); 102 moreLink.addActionListener(new ActionListener () { 103 public void actionPerformed(ActionEvent e) { 104 if ( criteria != null) 105 p.showAllResults(mediator, "test", criteria.getTechnicalName()); 106 else 107 p.showAllResults(mediator, "test", null); 108 } 109 }); 110 111 setLayout(new BorderLayout ()); 112 JPanel top = new JPanel (); 113 top.setOpaque(true); 114 115 Border border1 = new CompoundBorder (new SeparatorBorder(), 116 BorderFactory.createEmptyBorder(2, 4, 2, 4)); 117 118 Border border = new CompoundBorder (BorderFactory.createEmptyBorder(2, 119 4, 2, 4), border1); 120 121 top.setBorder(border1); 122 top.setLayout(new BorderLayout ()); 124 JLabel iconLabel = new JLabel (); 125 iconLabel.setIcon(p.getIcon()); 127 iconLabel.setOpaque(true); 128 iconLabel.setBorder(BorderFactory.createEmptyBorder(1, 2, 1, 6)); 129 top.add(iconLabel, BorderLayout.WEST); 130 top.add(link, BorderLayout.CENTER); 131 top.add(moreLink, BorderLayout.EAST); 132 add(top, BorderLayout.NORTH); 133 add(collapsible, BorderLayout.CENTER); 134 } 135 136 public void installListener(ISearchManager searchManager) { 137 searchManager.addResultListener(new MyResultListener()); 138 } 139 140 class MyResultListener extends ResultListenerAdapter { 141 @Override 142 public void resultArrived(IResultEvent event) { 143 if (event.getProviderName() == null) 144 return; 145 146 if (!event.getProviderName().equals( 147 resultPanel.getProviderTechnicalName())) 148 return; 149 if (event.getSearchCriteria() != null) { 150 if (!event.getSearchCriteria().getTechnicalName().equals( 151 resultPanel.getSearchCriteriaTechnicalName())) 152 return; 153 } 154 155 if (criteria != null) 156 link.setText(criteria.getTitle()); 157 else 158 link.setText(searchProvider.getName()); 159 160 if (criteria != null) 161 link.setToolTipText(criteria.getDescription()); 162 else 163 link.setToolTipText(searchProvider.getDescription()); 164 165 if (event.getTotalResultCount() == 0) { 166 moreLink.setText("Show More .."); 167 moreLink.setEnabled(false); 168 } else { 169 moreLink.setText("Show More" + " (" 170 + event.getTotalResultCount() + ") .."); 171 moreLink.setEnabled(true); 172 } 173 174 revalidate(); 175 } 176 177 MyResultListener() { 178 } 179 } 180 181 185 class SeparatorBorder implements Border { 186 187 boolean isFirst(Component c) { 188 return c.getParent() == null || c.getParent().getComponent(0) == c; 189 } 190 191 public Insets getBorderInsets(Component c) { 192 if (c instanceof JXCollapsiblePane) { 195 if (((JXCollapsiblePane) c).isCollapsed()) { 196 return new Insets (0, 0, 0, 0); 197 } 198 } 199 return new Insets (isFirst(c) ? 4 : 1, 0, 1, 0); 200 } 201 202 public boolean isBorderOpaque() { 203 return true; 204 } 205 206 public void paintBorder(Component c, Graphics g, int x, int y, 207 int width, int height) { 208 g.setColor(borderColor1); 209 if (isFirst(c)) { 210 g.drawLine(x, y + 2, x + width, y + 2); 211 } 212 } 215 } 216 217 } 218 | Popular Tags |