/*
* Copyright 2008 Ayman Al-Sairafi ayman.alsairafi@gmail.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License
* at http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jsyntaxpane.actions;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.util.Vector;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
/**
*
* @author Ayman Al-Sairafi
*/
public class ComboCompletionDialog extends javax.swing.JDialog {
/**
* The result returned to the caller
*/
private String result = null;
/**
* The current filter, to avoid refiltering the items
*/
public String escapeChars = ";(= \t\n";
public String[] items;
/** Creates new form ComboCompletionDialog
* @param parent
* @param modal
* @param items
*/
public ComboCompletionDialog(java.awt.Frame parent, boolean modal,
String[] items) {
super(parent, modal);
initComponents();
this.items = items;
jLstItems.setListData(items);
jTxtItem.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
refilterList();
}
public void removeUpdate(DocumentEvent e) {
refilterList();
}
public void changedUpdate(DocumentEvent e) {
refilterList();
}
});
// This will allow the textfield to receive TAB keys
jTxtItem.setFocusTraversalKeysEnabled(false);
}
public void setFonts(Font font) {
jTxtItem.setFont(font);
jLstItems.setFont(font);
doLayout();
}
public void setText(String abbrev) {
jTxtItem.setText(abbrev);
}
private void refilterList() {
String prefix = jTxtItem.getText();
Vector<String> filtered = new Vector<String>();
Object selected = jLstItems.getSelectedValue();
for (String s : items) {
if (s.startsWith(prefix)) {
filtered.add(s);
}
}
jLstItems.setListData(filtered);
if (selected != null) {
jLstItems.setSelectedValue(selected, true);
} else {
jLstItems.setSelectedIndex(0);
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jTxtItem = new javax.swing.JTextField();
jScrollPane1 = new javax.swing.JScrollPane();
jLstItems = new javax.swing.JList();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setResizable(false);
setUndecorated(true);
jTxtItem.setBorder(null);
jTxtItem.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
jTxtItemKeyPressed(evt);
}
});
jLstItems.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jLstItems.setFocusable(false);
jScrollPane1.setViewportView(jLstItems);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jTxtItem, javax.swing.GroupLayout.DEFAULT_SIZE, 270, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 270, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jTxtItem, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, 0)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 111, Short.MAX_VALUE))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void jTxtItemKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTxtItemKeyPressed
int i = jLstItems.getSelectedIndex();
switch (evt.getKeyCode()) {
case KeyEvent.VK_ESCAPE:
result = jTxtItem.getText();
setVisible(false);
return;
case KeyEvent.VK_DOWN:
if (i < jLstItems.getModel().getSize() - 1) {
i++;
}
jLstItems.setSelectedIndex(i);
jLstItems.ensureIndexIsVisible(i);
break;
case KeyEvent.VK_UP:
if (i > 0) {
i--;
}
jLstItems.setSelectedIndex(i);
jLstItems.ensureIndexIsVisible(i);
break;
}
if (escapeChars.indexOf(evt.getKeyChar()) >= 0) {
if (jLstItems.getSelectedIndex() >= 0) {
result = jLstItems.getSelectedValue().toString();
} else {
result = jTxtItem.getText();
}
char pressed = evt.getKeyChar();
// we need to just accept ENTER, and replace the tab with a single
// space
if (pressed != '\n') {
result += (pressed == '\t') ? ' ' : pressed;
}
setVisible(false);
}
}//GEN-LAST:event_jTxtItemKeyPressed
/**
* Gets the selected text shown on the dialog.
* @return the selected text, or empty string if nothing is selected
*/
public String getResult() {
return result == null ? "" : result;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JList jLstItems;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField jTxtItem;
// End of variables declaration//GEN-END:variables
}