# HG changeset patch # Parent 1786e1bff617aea86204b2dfd2072149f14728bc diff --git a/spi.quicksearch/src/org/netbeans/modules/quicksearch/QuickSearchPopup.form b/spi.quicksearch/src/org/netbeans/modules/quicksearch/QuickSearchPopup.form --- a/spi.quicksearch/src/org/netbeans/modules/quicksearch/QuickSearchPopup.form +++ b/spi.quicksearch/src/org/netbeans/modules/quicksearch/QuickSearchPopup.form @@ -1,4 +1,4 @@ - +
@@ -50,6 +50,8 @@ + + diff --git a/spi.quicksearch/src/org/netbeans/modules/quicksearch/QuickSearchPopup.java b/spi.quicksearch/src/org/netbeans/modules/quicksearch/QuickSearchPopup.java --- a/spi.quicksearch/src/org/netbeans/modules/quicksearch/QuickSearchPopup.java +++ b/spi.quicksearch/src/org/netbeans/modules/quicksearch/QuickSearchPopup.java @@ -43,6 +43,7 @@ package org.netbeans.modules.quicksearch; +import java.awt.Cursor; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FontMetrics; @@ -51,8 +52,12 @@ import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.prefs.Preferences; import javax.swing.JComponent; import javax.swing.JLayeredPane; import javax.swing.JList; @@ -64,6 +69,7 @@ import org.netbeans.modules.quicksearch.recent.RecentSearches; import org.netbeans.modules.quicksearch.ResultsModel.ItemResult; import org.openide.util.NbBundle; +import org.openide.util.NbPreferences; import org.openide.util.RequestProcessor; import org.openide.util.Task; import org.openide.util.TaskListener; @@ -75,6 +81,8 @@ public class QuickSearchPopup extends javax.swing.JPanel implements ListDataListener, ActionListener, TaskListener, Runnable { + private static final String CUSTOM_WIDTH = "customWidth"; //NOI18N + private static final int RESIZE_AREA_WIDTH = 5; private AbstractQuickSearchComboBar comboBar; private ResultsModel rModel; @@ -90,7 +98,10 @@ private int catWidth; private int resultWidth; + private int customWidth = -1; + private boolean canResize = false; private Task evalTask; + private Task saveTask; private static final RequestProcessor RP = new RequestProcessor(QuickSearchPopup.class); private static final RequestProcessor evaluatorRP = new RequestProcessor(QuickSearchPopup.class + ".evaluator"); //NOI18N private static final Logger LOG = Logger.getLogger(QuickSearchPopup.class.getName()); @@ -98,6 +109,8 @@ public QuickSearchPopup (AbstractQuickSearchComboBar comboBar) { this.comboBar = comboBar; initComponents(); + loadSettings(); + makeResizable(); rModel = ResultsModel.getInstance(); jList1.setModel(rModel); jList1.setCellRenderer(new SearchResultRender(this)); @@ -222,8 +235,14 @@ public void mouseClicked(java.awt.event.MouseEvent evt) { jList1MouseClicked(evt); } + public void mousePressed(java.awt.event.MouseEvent evt) { + jList1MousePressed(evt); + } }); jList1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { + public void mouseDragged(java.awt.event.MouseEvent evt) { + jList1MouseDragged(evt); + } public void mouseMoved(java.awt.event.MouseEvent evt) { jList1MouseMoved(evt); } @@ -276,6 +295,13 @@ }// //GEN-END:initComponents private void jList1MouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jList1MouseMoved + // toggle resize/default cursor + if (evt.getX() < RESIZE_AREA_WIDTH) { + QuickSearchPopup.this.setCursor(Cursor.getPredefinedCursor( + Cursor.W_RESIZE_CURSOR)); + } else { + QuickSearchPopup.this.setCursor(Cursor.getDefaultCursor()); + } // selection follows mouse move Point loc = evt.getPoint(); int index = jList1.locationToIndex(loc); @@ -298,6 +324,13 @@ }//GEN-LAST:event_jList1MouseClicked + private void jList1MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jList1MouseDragged + QuickSearchPopup.this.processMouseMotionEvent(evt); + }//GEN-LAST:event_jList1MouseDragged + + private void jList1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jList1MousePressed + QuickSearchPopup.this.processMouseEvent(evt); + }//GEN-LAST:event_jList1MousePressed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel hintLabel; @@ -412,7 +445,11 @@ if (resultWidth <= 0) { resultWidth = computeWidth(jList1, 42, 50); } - return resultWidth; + if (customWidth > 0) { + return Math.max(resultWidth, customWidth); + } else { + return resultWidth; + } } /** Implementation of TaskListener, listen to when providers are finished @@ -516,4 +553,59 @@ comboBar.getKeyStroke())); } + /** + * Register listeners that make this pop-up resizable. + */ + private void makeResizable() { + this.addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseDragged(MouseEvent e) { + if (canResize) { + customWidth = getResultWidth() - e.getX(); + run(); + saveSettings(); + } + } + }); + this.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + canResize = e.getX() < RESIZE_AREA_WIDTH; + } + }); + } + + /** + * Load settings from preferences file. + */ + private void loadSettings() { + RP.post(new Runnable() { + @Override + public void run() { + Preferences p = NbPreferences.forModule(QuickSearchPopup.class); + customWidth = p.getInt(CUSTOM_WIDTH, -1); + } + }); + } + + /** + * Save settings to preferences file. Do nothing if this operation is + * already scheduled. + */ + private synchronized void saveSettings() { + if (saveTask == null) { + saveTask = RP.create(new Runnable() { + @Override + public void run() { + Preferences p = NbPreferences.forModule( + QuickSearchPopup.class); + p.putInt(CUSTOM_WIDTH, customWidth); + synchronized (QuickSearchPopup.this) { + saveTask = null; + } + } + }); + RP.post(saveTask, 1000); + } + } }