|
What this is
Other links
The source code
/*
* $Id: PHPCompletePopup.java,v 1.1 2003/02/14 01:05:29 gfx Exp $
*
* PHP Plugin for Jext
*
* Copyright (C) 2002 Nicolas Thouvenin
* touv at yahoo dot fr
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import org.jext.*;
import org.jext.gui.*;
public class PHPCompletePopup extends JWindow implements CaretListener
{
private boolean selfInput;
private JList itemsList;
private String word;
private JextFrame parent;
private JextTextArea textArea;
private PHPCompleteList truc;
public PHPCompletePopup(JextFrame parent, String word)
{
super(parent);
this.parent = parent;
this.textArea = parent.getTextArea();
this.word = word;
truc = new PHPCompleteList();
JPanel pane = new JPanel();
pane.setLayout(new BorderLayout());
Font font = new Font("Monospaced", Font.PLAIN, 11);
JLabel label = new JLabel("PHP Functions");
label.setFont(font);
pane.add(label, BorderLayout.NORTH);
Object[] list = truc.buildFunctionList(word);
itemsList = new JList(list);
itemsList.setFont(font);
itemsList.setVisibleRowCount(list.length < 5 ? list.length : 5);
itemsList.setSelectedIndex(0);
itemsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
itemsList.addMouseListener(new MouseHandler());
itemsList.setCellRenderer(new FunctionsCellRenderer());
FontMetrics fm = getFontMetrics(font);
itemsList.setPreferredSize(new Dimension(40 * fm.charWidth('m'),(int) itemsList.getPreferredSize().height));
JScrollPane scroll = new JScrollPane(itemsList);
scroll.setBorder(null);
pane.add(scroll, BorderLayout.SOUTH);
pane.setBorder(LineBorder.createBlackLineBorder());
getContentPane().add(pane);
setBackground(Color.lightGray);
GUIUtilities.requestFocus(this, itemsList);
pack();
int offset = textArea.getCaretPosition();
int line = textArea.getCaretLine();
int x = textArea.offsetToX(line, offset-textArea.getLineStartOffset(line));
Dimension parentSize = parent.getSize();
Point parentLocation = parent.getLocationOnScreen();
Insets parentInsets = parent.getInsets();
Point tapLocation = textArea.getLocationOnScreen();
Dimension popupSize = getSize();
x += tapLocation.x;
if ((x + popupSize.width) > (parentLocation.x + parentSize.width - parentInsets.right)) {
x -= popupSize.width;
}
setLocation(x, tapLocation.y + textArea.lineToY(line) + fm.getHeight() + fm.getDescent() + fm.getLeading());
setVisible(true);
KeyHandler handler = new KeyHandler();
addKeyListener(handler);
itemsList.addKeyListener(handler);
parent.setKeyEventInterceptor(handler);
textArea.addCaretListener(this);
}
public void caretUpdate(CaretEvent evt)
{
if (!selfInput) {
dispose();
}
else {
selfInput = !selfInput;
}
}
public void dispose()
{
parent.setKeyEventInterceptor(null);
textArea.removeCaretListener(this);
super.dispose();
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
textArea.requestFocus();
}
});
}
private void insertFunction()
{
textArea.setSelectedText(((PHPFunction) itemsList.getSelectedValue()).name.substring(word.length()));
}
class KeyHandler extends KeyAdapter
{
public void keyTyped(KeyEvent evt)
{
char ch = evt.getKeyChar();
if (ch != '\b') {
selfInput = true;
textArea.setSelectedText(String.valueOf(ch));
word += ch;
Object[] list = truc.buildFunctionList(word);
itemsList.setListData(list);
itemsList.setSelectedIndex(0);
}
}
public void keyPressed(KeyEvent evt)
{
switch (evt.getKeyCode())
{
case KeyEvent.VK_ENTER: //case KeyEvent.VK_SPACE:
insertFunction();
evt.consume();
dispose();
break;
case KeyEvent.VK_ESCAPE:
dispose();
evt.consume();
break;
case KeyEvent.VK_PAGE_UP:
if (getFocusOwner() == itemsList)
return;
int selected = itemsList.getSelectedIndex();
selected -= 5;
if (selected < 0)
selected = itemsList.getModel().getSize() - 1;
itemsList.setSelectedIndex(selected);
itemsList.ensureIndexIsVisible(selected);
evt.consume();
break;
case KeyEvent.VK_PAGE_DOWN:
if (getFocusOwner() == itemsList)
return;
selected = itemsList.getSelectedIndex();
selected += 5;
if (selected >= itemsList.getModel().getSize())
selected = 0;
itemsList.setSelectedIndex(selected);
itemsList.ensureIndexIsVisible(selected);
evt.consume();
break;
case KeyEvent.VK_UP:
if (getFocusOwner() == itemsList)
return;
selected = itemsList.getSelectedIndex();
if (selected == 0)
selected = itemsList.getModel().getSize() - 1;
else
selected--;
itemsList.setSelectedIndex(selected);
itemsList.ensureIndexIsVisible(selected);
evt.consume();
break;
case KeyEvent.VK_DOWN:
if (getFocusOwner() == itemsList)
return;
selected = itemsList.getSelectedIndex();
if (selected == itemsList.getModel().getSize() - 1)
return;
selected++;
itemsList.setSelectedIndex(selected);
itemsList.ensureIndexIsVisible(selected);
evt.consume();
break;
default:
if (evt.isActionKey()) {
dispose();
parent.processKeyEvent(evt);
}
break;
}
}
}
class MouseHandler extends MouseAdapter
{
public void mouseClicked(MouseEvent me)
{
insertFunction();
dispose();
}
}
class FunctionsCellRenderer extends DefaultListCellRenderer
{
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
setComponentOrientation(list.getComponentOrientation());
PHPFunction t = (PHPFunction) value;
if (isSelected) {
setBackground(list.getSelectionBackground());
value = t.proto;
}
else {
setBackground(list.getBackground());
}
setText((value == null) ? "" : value.toString());
setOpaque(isSelected);
setEnabled(list.isEnabled());
setFont(list.getFont());
setBorder((cellHasFocus) ? UIManager.getBorder("List.focusCellHighlightBorder") : noFocusBorder);
return this;
}
}
/***************************************************************************
Patch
-> Memory management improvements : it may help the garbage collector.
-> Author : Julien Ponge (julien@izforge.com)
-> Date : 23, May 2001
***************************************************************************/
protected void finalize() throws Throwable
{
super.finalize();
itemsList = null;
word = null;
parent = null;
textArea = null;
}
// End of patch
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.