Link Here
|
43 |
|
43 |
|
44 |
package org.netbeans.modules.quicksearch; |
44 |
package org.netbeans.modules.quicksearch; |
45 |
|
45 |
|
|
|
46 |
import java.awt.Cursor; |
46 |
import java.awt.Dimension; |
47 |
import java.awt.Dimension; |
47 |
import java.awt.EventQueue; |
48 |
import java.awt.EventQueue; |
48 |
import java.awt.FontMetrics; |
49 |
import java.awt.FontMetrics; |
Link Here
|
51 |
import java.awt.Window; |
52 |
import java.awt.Window; |
52 |
import java.awt.event.ActionEvent; |
53 |
import java.awt.event.ActionEvent; |
53 |
import java.awt.event.ActionListener; |
54 |
import java.awt.event.ActionListener; |
|
|
55 |
import java.awt.event.MouseAdapter; |
56 |
import java.awt.event.MouseEvent; |
57 |
import java.awt.event.MouseMotionAdapter; |
54 |
import java.util.logging.Level; |
58 |
import java.util.logging.Level; |
55 |
import java.util.logging.Logger; |
59 |
import java.util.logging.Logger; |
|
|
60 |
import java.util.prefs.Preferences; |
56 |
import javax.swing.JComponent; |
61 |
import javax.swing.JComponent; |
57 |
import javax.swing.JLayeredPane; |
62 |
import javax.swing.JLayeredPane; |
58 |
import javax.swing.JList; |
63 |
import javax.swing.JList; |
Link Here
|
64 |
import org.netbeans.modules.quicksearch.recent.RecentSearches; |
69 |
import org.netbeans.modules.quicksearch.recent.RecentSearches; |
65 |
import org.netbeans.modules.quicksearch.ResultsModel.ItemResult; |
70 |
import org.netbeans.modules.quicksearch.ResultsModel.ItemResult; |
66 |
import org.openide.util.NbBundle; |
71 |
import org.openide.util.NbBundle; |
|
|
72 |
import org.openide.util.NbPreferences; |
67 |
import org.openide.util.RequestProcessor; |
73 |
import org.openide.util.RequestProcessor; |
68 |
import org.openide.util.Task; |
74 |
import org.openide.util.Task; |
69 |
import org.openide.util.TaskListener; |
75 |
import org.openide.util.TaskListener; |
Link Here
|
75 |
public class QuickSearchPopup extends javax.swing.JPanel |
81 |
public class QuickSearchPopup extends javax.swing.JPanel |
76 |
implements ListDataListener, ActionListener, TaskListener, Runnable { |
82 |
implements ListDataListener, ActionListener, TaskListener, Runnable { |
77 |
|
83 |
|
|
|
84 |
private static final String CUSTOM_WIDTH = "customWidth"; //NOI18N |
85 |
private static final int RESIZE_AREA_WIDTH = 5; |
78 |
private AbstractQuickSearchComboBar comboBar; |
86 |
private AbstractQuickSearchComboBar comboBar; |
79 |
|
87 |
|
80 |
private ResultsModel rModel; |
88 |
private ResultsModel rModel; |
Link Here
|
90 |
|
98 |
|
91 |
private int catWidth; |
99 |
private int catWidth; |
92 |
private int resultWidth; |
100 |
private int resultWidth; |
|
|
101 |
private int customWidth = -1; |
102 |
private boolean canResize = false; |
93 |
private Task evalTask; |
103 |
private Task evalTask; |
|
|
104 |
private Task saveTask; |
94 |
private static final RequestProcessor RP = new RequestProcessor(QuickSearchPopup.class); |
105 |
private static final RequestProcessor RP = new RequestProcessor(QuickSearchPopup.class); |
95 |
private static final RequestProcessor evaluatorRP = new RequestProcessor(QuickSearchPopup.class + ".evaluator"); //NOI18N |
106 |
private static final RequestProcessor evaluatorRP = new RequestProcessor(QuickSearchPopup.class + ".evaluator"); //NOI18N |
96 |
private static final Logger LOG = Logger.getLogger(QuickSearchPopup.class.getName()); |
107 |
private static final Logger LOG = Logger.getLogger(QuickSearchPopup.class.getName()); |
Link Here
|
98 |
public QuickSearchPopup (AbstractQuickSearchComboBar comboBar) { |
109 |
public QuickSearchPopup (AbstractQuickSearchComboBar comboBar) { |
99 |
this.comboBar = comboBar; |
110 |
this.comboBar = comboBar; |
100 |
initComponents(); |
111 |
initComponents(); |
|
|
112 |
loadSettings(); |
113 |
makeResizable(); |
101 |
rModel = ResultsModel.getInstance(); |
114 |
rModel = ResultsModel.getInstance(); |
102 |
jList1.setModel(rModel); |
115 |
jList1.setModel(rModel); |
103 |
jList1.setCellRenderer(new SearchResultRender(this)); |
116 |
jList1.setCellRenderer(new SearchResultRender(this)); |
Link Here
|
222 |
public void mouseClicked(java.awt.event.MouseEvent evt) { |
235 |
public void mouseClicked(java.awt.event.MouseEvent evt) { |
223 |
jList1MouseClicked(evt); |
236 |
jList1MouseClicked(evt); |
224 |
} |
237 |
} |
|
|
238 |
public void mousePressed(java.awt.event.MouseEvent evt) { |
239 |
jList1MousePressed(evt); |
240 |
} |
225 |
}); |
241 |
}); |
226 |
jList1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { |
242 |
jList1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { |
|
|
243 |
public void mouseDragged(java.awt.event.MouseEvent evt) { |
244 |
jList1MouseDragged(evt); |
245 |
} |
227 |
public void mouseMoved(java.awt.event.MouseEvent evt) { |
246 |
public void mouseMoved(java.awt.event.MouseEvent evt) { |
228 |
jList1MouseMoved(evt); |
247 |
jList1MouseMoved(evt); |
229 |
} |
248 |
} |
Link Here
|
276 |
}// </editor-fold>//GEN-END:initComponents |
295 |
}// </editor-fold>//GEN-END:initComponents |
277 |
|
296 |
|
278 |
private void jList1MouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jList1MouseMoved |
297 |
private void jList1MouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jList1MouseMoved |
|
|
298 |
// toggle resize/default cursor |
299 |
if (evt.getX() < RESIZE_AREA_WIDTH) { |
300 |
QuickSearchPopup.this.setCursor(Cursor.getPredefinedCursor( |
301 |
Cursor.W_RESIZE_CURSOR)); |
302 |
} else { |
303 |
QuickSearchPopup.this.setCursor(Cursor.getDefaultCursor()); |
304 |
} |
279 |
// selection follows mouse move |
305 |
// selection follows mouse move |
280 |
Point loc = evt.getPoint(); |
306 |
Point loc = evt.getPoint(); |
281 |
int index = jList1.locationToIndex(loc); |
307 |
int index = jList1.locationToIndex(loc); |
Link Here
|
298 |
|
324 |
|
299 |
}//GEN-LAST:event_jList1MouseClicked |
325 |
}//GEN-LAST:event_jList1MouseClicked |
300 |
|
326 |
|
|
|
327 |
private void jList1MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jList1MouseDragged |
328 |
QuickSearchPopup.this.processMouseMotionEvent(evt); |
329 |
}//GEN-LAST:event_jList1MouseDragged |
330 |
|
331 |
private void jList1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jList1MousePressed |
332 |
QuickSearchPopup.this.processMouseEvent(evt); |
333 |
}//GEN-LAST:event_jList1MousePressed |
301 |
|
334 |
|
302 |
// Variables declaration - do not modify//GEN-BEGIN:variables |
335 |
// Variables declaration - do not modify//GEN-BEGIN:variables |
303 |
private javax.swing.JLabel hintLabel; |
336 |
private javax.swing.JLabel hintLabel; |
Link Here
|
412 |
if (resultWidth <= 0) { |
445 |
if (resultWidth <= 0) { |
413 |
resultWidth = computeWidth(jList1, 42, 50); |
446 |
resultWidth = computeWidth(jList1, 42, 50); |
414 |
} |
447 |
} |
415 |
return resultWidth; |
448 |
if (customWidth > 0) { |
|
|
449 |
return Math.max(resultWidth, customWidth); |
450 |
} else { |
451 |
return resultWidth; |
452 |
} |
416 |
} |
453 |
} |
417 |
|
454 |
|
418 |
/** Implementation of TaskListener, listen to when providers are finished |
455 |
/** Implementation of TaskListener, listen to when providers are finished |
Link Here
|
516 |
comboBar.getKeyStroke())); |
553 |
comboBar.getKeyStroke())); |
517 |
} |
554 |
} |
518 |
|
555 |
|
|
|
556 |
/** |
557 |
* Register listeners that make this pop-up resizable. |
558 |
*/ |
559 |
private void makeResizable() { |
560 |
this.addMouseMotionListener(new MouseMotionAdapter() { |
561 |
@Override |
562 |
public void mouseDragged(MouseEvent e) { |
563 |
if (canResize) { |
564 |
customWidth = getResultWidth() - e.getX(); |
565 |
run(); |
566 |
saveSettings(); |
567 |
} |
568 |
} |
569 |
}); |
570 |
this.addMouseListener(new MouseAdapter() { |
571 |
@Override |
572 |
public void mousePressed(MouseEvent e) { |
573 |
canResize = e.getX() < RESIZE_AREA_WIDTH; |
574 |
} |
575 |
}); |
576 |
} |
577 |
|
578 |
/** |
579 |
* Load settings from preferences file. |
580 |
*/ |
581 |
private void loadSettings() { |
582 |
RP.post(new Runnable() { |
583 |
@Override |
584 |
public void run() { |
585 |
Preferences p = NbPreferences.forModule(QuickSearchPopup.class); |
586 |
customWidth = p.getInt(CUSTOM_WIDTH, -1); |
587 |
} |
588 |
}); |
589 |
} |
590 |
|
591 |
/** |
592 |
* Save settings to preferences file. Do nothing if this operation is |
593 |
* already scheduled. |
594 |
*/ |
595 |
private synchronized void saveSettings() { |
596 |
if (saveTask == null) { |
597 |
saveTask = RP.create(new Runnable() { |
598 |
@Override |
599 |
public void run() { |
600 |
Preferences p = NbPreferences.forModule( |
601 |
QuickSearchPopup.class); |
602 |
p.putInt(CUSTOM_WIDTH, customWidth); |
603 |
synchronized (QuickSearchPopup.this) { |
604 |
saveTask = null; |
605 |
} |
606 |
} |
607 |
}); |
608 |
RP.post(saveTask, 1000); |
609 |
} |
610 |
} |
519 |
} |
611 |
} |