1 package org.columba.core.gui.context; 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.context.ContextResultListenerAdapter; 22 import org.columba.core.context.api.IContextProvider; 23 import org.columba.core.context.api.IContextResultEvent; 24 import org.columba.core.context.api.IContextSearchManager; 25 import org.jdesktop.swingx.JXCollapsiblePane; 26 import org.jdesktop.swingx.JXHyperlink; 27 28 public class ContextResultBox extends JPanel { 29 30 private final static Color borderColor2 = UIManager 31 .getColor("controlShadow"); 32 33 private final static Color borderColor1 = UIManager 34 .getColor("controlHighlight"); 35 36 private JXHyperlink link; 37 38 private JXHyperlink moreLink; 39 40 private JXCollapsiblePane collapsible; 41 42 private IContextProvider provider; 43 44 private IContextSearchManager contextSearchManager; 45 46 public ContextResultBox(final IFrameMediator frameMediator, 47 final IContextProvider provider, 48 final IContextSearchManager contextSearchManager) { 49 super(); 50 51 this.provider = provider; 52 this.contextSearchManager = contextSearchManager; 53 54 this.contextSearchManager 56 .addResultListener(new MyContextResultListener()); 57 58 collapsible = new JXCollapsiblePane(); 59 collapsible.add(provider.getView()); 61 collapsible.setCollapsed(true); 62 63 Action toggleAction = collapsible.getActionMap().get( 64 JXCollapsiblePane.TOGGLE_ACTION); 65 toggleAction.putValue(JXCollapsiblePane.COLLAPSE_ICON, UIManager 67 .getIcon("Tree.expandedIcon")); 68 toggleAction.putValue(JXCollapsiblePane.EXPAND_ICON, UIManager 69 .getIcon("Tree.collapsedIcon")); 70 link = new JXHyperlink(toggleAction); 71 link.setText(provider.getName()); 72 link.setToolTipText(provider.getDescription()); 73 74 link.setOpaque(true); 76 link.setFocusPainted(false); 78 79 link.setUnclickedColor(UIManager.getColor("Label.foreground")); 80 link.setClickedColor(UIManager.getColor("Label.foreground")); 81 82 moreLink = new JXHyperlink(); 83 moreLink.setEnabled(false); 84 moreLink.setText("Show More .."); 85 Font font = UIManager.getFont("Label.font"); 86 Font smallFont = new Font (font.getName(), font.getStyle(), font 87 .getSize() - 2); 88 moreLink.setFont(smallFont); 89 moreLink.addActionListener(new ActionListener () { 90 public void actionPerformed(ActionEvent e) { 91 provider.showMoreResults(frameMediator); 92 } 93 }); 94 95 setLayout(new BorderLayout ()); 96 JPanel top = new JPanel (); 97 98 top.setBorder(new CompoundBorder (new SeparatorBorder(), BorderFactory 99 .createEmptyBorder(2, 4, 2, 4))); 100 101 top.setLayout(new BorderLayout ()); 102 JLabel iconLabel = new JLabel (); 103 104 iconLabel.setIcon(provider.getIcon()); 105 106 iconLabel.setBorder(BorderFactory.createEmptyBorder(1, 2, 1, 6)); 107 top.add(iconLabel, BorderLayout.WEST); 108 top.add(link, BorderLayout.CENTER); 109 top.add(moreLink, BorderLayout.EAST); 110 add(top, BorderLayout.NORTH); 111 add(collapsible, BorderLayout.CENTER); 112 } 113 114 public void showResults() { 115 116 if (provider.isEnabledShowMoreLink()) { 117 int count = provider.getTotalResultCount(); 118 moreLink.setEnabled(count > 0); 119 120 if (count > 0) { 121 moreLink.setText("Show More (" + count + ") .."); 122 } 123 } 124 } 125 126 class MyContextResultListener extends ContextResultListenerAdapter { 127 128 @Override 129 public void resultArrived(final IContextResultEvent event) { 130 if (!event.getProviderName().equals(provider.getTechnicalName())) 131 return; 132 133 provider.showResult(); 134 showResults(); 135 136 } 137 138 } 139 140 144 class SeparatorBorder implements Border { 145 146 boolean isFirst(Component c) { 147 return c.getParent() == null || c.getParent().getComponent(0) == c; 148 } 149 150 public Insets getBorderInsets(Component c) { 151 if (c instanceof JXCollapsiblePane) { 154 if (((JXCollapsiblePane) c).isCollapsed()) { 155 return new Insets (0, 0, 0, 0); 156 } 157 } 158 return new Insets (isFirst(c) ? 4 : 1, 0, 1, 0); 159 } 160 161 public boolean isBorderOpaque() { 162 return true; 163 } 164 165 public void paintBorder(Component c, Graphics g, int x, int y, 166 int width, int height) { 167 g.setColor(borderColor1); 168 if (isFirst(c)) { 169 g.drawLine(x, y + 2, x + width, y + 2); 170 } 171 } 174 } 175 176 } 177 | Popular Tags |