1 19 20 package org.netbeans.modules.xml.xam.ui.search; 21 22 import java.awt.BorderLayout ; 23 import java.awt.Toolkit ; 24 import java.awt.event.ActionEvent ; 25 import java.awt.event.ActionListener ; 26 import java.util.Collection ; 27 import java.util.Iterator ; 28 import java.util.List ; 29 import javax.swing.JPanel ; 30 import org.netbeans.modules.xml.xam.Component; 31 import org.netbeans.modules.xml.xam.ui.category.SearchComponent; 32 import org.netbeans.modules.xml.xam.ui.highlight.Highlight; 33 import org.netbeans.modules.xml.xam.ui.highlight.HighlightGroup; 34 import org.netbeans.modules.xml.xam.ui.highlight.HighlightManager; 35 import org.openide.util.NbBundle; 36 37 42 public abstract class SearchControlPanel extends JPanel 43 implements ActionListener , SearchComponent, SearchListener { 44 45 private static final long serialVersionUID = 1L; 46 47 private SearchFieldPanel searchField; 48 49 private List <Object > searchResults; 50 51 private int searchResultIndex; 52 53 56 public SearchControlPanel() { 57 initComponents(); 58 nextButton.setEnabled(false); 59 prevButton.setEnabled(false); 60 closeButton.addActionListener(this); 61 nextButton.addActionListener(this); 62 prevButton.addActionListener(this); 63 resetButton.addActionListener(this); 64 searchField = new SearchFieldPanel(); 65 searchField.addSearchListener(this); 66 fieldPanel.add(searchField, BorderLayout.CENTER); 67 } 68 69 public void actionPerformed(ActionEvent event) { 70 Object src = event.getSource(); 71 if (src == closeButton) { 72 dismissSearch(); 73 hideComponent(); 74 } else if (src == resetButton) { 75 dismissSearch(); 76 searchField.prepareForInput(true); 77 } else if (src == nextButton) { 78 searchResultIndex++; 79 80 if (searchResultIndex >= searchResults.size()) { 81 searchResultIndex = 0; 82 beep(); 83 } 84 showSearchResult(searchResults.get(searchResultIndex)); 85 } else if (src == prevButton) { 86 searchResultIndex--; 87 88 if (searchResultIndex < 0) { 89 searchResultIndex = searchResults.size() - 1; 90 beep(); 91 } 92 showSearchResult(searchResults.get(searchResultIndex)); 93 } 94 } 95 96 private void beep() { 97 Toolkit.getDefaultToolkit().beep(); 98 } 99 100 103 private void dismissSearch() { 104 hideResults(); 105 searchResults = null; 107 nextButton.setEnabled(false); 109 prevButton.setEnabled(false); 110 resultsLabel.setText(" "); 111 } 112 113 protected void hideResults() { 114 HighlightManager hm = HighlightManager.getDefault(); 115 List <HighlightGroup> groups = hm.getHighlightGroups(HighlightGroup.SEARCH); 116 if (groups != null) { 117 for (HighlightGroup group : groups) { 118 hm.removeHighlightGroup(group); 119 } 120 } 121 } 122 123 public java.awt.Component getComponent() { 124 return this; 125 } 126 127 public void hideComponent() { 128 setVisible(false); 129 } 130 131 public void showComponent() { 132 setVisible(true); 133 } 134 135 public void setVisible(boolean visible) { 136 super.setVisible(visible); 137 138 if (visible) { 139 searchField.prepareForInput(false); 140 } 141 revalidate(); 142 repaint(); 143 } 144 145 public void searchCommenced(SearchEvent event) { 146 dismissSearch(); 147 } 148 149 public void searchDismissed(SearchEvent event) { 150 dismissSearch(); 151 hideComponent(); 152 } 153 154 public void searchFailed(SearchEvent event) { 155 nextButton.setEnabled(false); 156 prevButton.setEnabled(false); 157 SearchException exc = event.getException(); 158 String msg = null; 159 if (exc != null) { 160 msg = exc.getMessage(); 161 if (msg == null || msg.length() == 0) { 162 msg = exc.toString(); 163 } 164 } else { 165 msg = NbBundle.getMessage(SearchControlPanel.class, 166 "LBL_SearchControlPanel_Failed"); 167 } 168 resultsLabel.setText(msg); 169 } 170 171 public void searchFinished(SearchEvent event) { 172 searchResults = event.getResults(); 173 if (searchResults.isEmpty()) { 174 nextButton.setEnabled(false); 175 prevButton.setEnabled(false); 176 resultsLabel.setText(NbBundle.getMessage(SearchControlPanel.class, 177 "LBL_SearchControlPanel_NoResults")); 178 } else { 179 nextButton.setEnabled(true); 180 prevButton.setEnabled(true); 181 HighlightManager hm = HighlightManager.getDefault(); 184 HighlightGroup group = new HighlightGroup(HighlightGroup.SEARCH); 185 Iterator <Object > iter = searchResults.iterator(); 186 187 while (iter.hasNext()) { 188 Object object = iter.next(); 189 190 if ( !(object instanceof Component)) { 191 continue; 192 } 193 Component comp = (Component) object; 194 SearchHighlight h = new SearchHighlight(comp, Highlight.SEARCH_RESULT); 195 group.addHighlight(h); 196 Component parent = comp.getParent(); 197 198 while (parent != null) { 199 h = new SearchHighlight(parent, Highlight.SEARCH_RESULT_PARENT); 200 group.addHighlight(h); 201 parent = parent.getParent(); 202 } 203 } 204 hm.addHighlightGroup(group); 205 searchResultIndex = 0; 207 showSearchResult(searchResults.get(searchResultIndex)); 208 int count = searchResults.size(); 209 if (count == 1) { 210 resultsLabel.setText(NbBundle.getMessage(SearchControlPanel.class, 211 "LBL_SearchControlPanel_OneResult")); 212 } else { 213 resultsLabel.setText(NbBundle.getMessage(SearchControlPanel.class, 214 "LBL_SearchControlPanel_MultipleResults", count)); 215 } 216 } 217 } 218 219 224 public void setProviders(Collection providers) { 225 if (providers != null && providers.size() > 0) { 226 searchField.setProviders(providers); 227 searchField.setEnabled(true); 228 } else { 229 searchField.setEnabled(false); 230 } 231 } 232 233 238 protected abstract void showSearchResult(Object result); 239 240 243 private static class SearchHighlight extends Highlight { 244 245 public SearchHighlight(Component comp, String searchResults) { 246 super(comp, searchResults); 247 } 248 } 249 250 255 private void initComponents() { 257 closeButton = new javax.swing.JButton (); 258 fieldLabel = new javax.swing.JLabel (); 259 fieldPanel = new javax.swing.JPanel (); 260 nextButton = new javax.swing.JButton (); 261 prevButton = new javax.swing.JButton (); 262 resetButton = new javax.swing.JButton (); 263 resultsLabel = new javax.swing.JLabel (); 264 265 setBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createMatteBorder(1, 0, 0, 0, new java.awt.Color (0, 0, 0)), javax.swing.BorderFactory.createEmptyBorder(2, 2, 2, 2))); 266 closeButton.setIcon(new javax.swing.ImageIcon (getClass().getResource("/org/netbeans/modules/xml/xam/ui/search/search_close.png"))); 267 closeButton.setToolTipText(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("HINT_SearchControlPanel_Close")); 268 closeButton.setBorderPainted(false); 269 closeButton.setContentAreaFilled(false); 270 closeButton.setMargin(new java.awt.Insets (2, 2, 2, 2)); 271 closeButton.setRolloverIcon(new javax.swing.ImageIcon (getClass().getResource("/org/netbeans/modules/xml/xam/ui/search/search_close_light.png"))); 272 273 fieldLabel.setLabelFor(fieldPanel); 274 fieldLabel.setText(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("LBL_SearchControlPanel_Find")); 275 276 fieldPanel.setLayout(new java.awt.BorderLayout ()); 277 278 nextButton.setMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("KEY_SearchControlPanel_FindNext").charAt(0)); 279 nextButton.setText(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("LBL_SearchControlPanel_FindNext")); 280 nextButton.setToolTipText(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("HINT_SearchControlPanel_FindNext")); 281 282 prevButton.setMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("KEY_SearchControlPanel_FindPrevious").charAt(0)); 283 prevButton.setText(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("LBL_SearchControlPanel_FindPrevious")); 284 prevButton.setToolTipText(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("HINT_SearchControlPanel_FindPrevious")); 285 286 resetButton.setMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("KEY_SearchControlPanel_Reset").charAt(0)); 287 resetButton.setText(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("LBL_SearchControlPanel_Reset")); 288 resetButton.setToolTipText(java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/xam/ui/search/Bundle").getString("TIP_SearchControlPanel_Reset")); 289 290 resultsLabel.setText(" "); 291 292 org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); 293 this.setLayout(layout); 294 layout.setHorizontalGroup( 295 layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 296 .add(layout.createSequentialGroup() 297 .add(closeButton) 298 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 299 .add(fieldLabel) 300 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 301 .add(fieldPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) 302 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 303 .add(nextButton) 304 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 305 .add(prevButton) 306 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 307 .add(resetButton) 308 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 309 .add(resultsLabel) 310 .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 311 ); 312 layout.setVerticalGroup( 313 layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 314 .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) 315 .add(closeButton) 316 .add(fieldLabel) 317 .add(nextButton) 318 .add(prevButton) 319 .add(resetButton) 320 .add(resultsLabel)) 321 .add(fieldPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) 322 ); 323 } 325 private javax.swing.JButton closeButton; 327 private javax.swing.JLabel fieldLabel; 328 private javax.swing.JPanel fieldPanel; 329 private javax.swing.JButton nextButton; 330 private javax.swing.JButton prevButton; 331 private javax.swing.JButton resetButton; 332 private javax.swing.JLabel resultsLabel; 333 } 335 | Popular Tags |