gvsig-scripting / org.gvsig.scripting.app / trunk / org.gvsig.scripting.app / org.gvsig.scripting.app.extension / src / main / resources / scripting / lib / console / popup.py @ 359
History | View | Annotate | Download (4.23 KB)
1 |
from java.lang import Character |
---|---|
2 |
from javax.swing import JWindow, JList, JScrollPane |
3 |
from java.awt import Color, Dimension |
4 |
from java.awt.event import KeyAdapter |
5 |
from java.awt.event import KeyEvent |
6 |
import string |
7 |
|
8 |
__author__ = "Don Coleman <dcoleman@chariotsolutions.com>"
|
9 |
__cvsid__ = "$Id: popup.py 5782 2006-06-12 07:56:49Z jmvivo $"
|
10 |
|
11 |
class Popup(JWindow): |
12 |
"""Popup window to display list of methods for completion"""
|
13 |
|
14 |
MAX_HEIGHT = 300
|
15 |
MIN_WIDTH = 200
|
16 |
MAX_WIDTH = 400
|
17 |
|
18 |
def __init__(self, frame, textComponent): |
19 |
JWindow.__init__(self, frame)
|
20 |
self.textComponent = textComponent
|
21 |
self.size = (200,200) |
22 |
self.list = JList(keyPressed=self.key) |
23 |
self.list.setBackground(Color(255,255,225)) # TODO move this color |
24 |
self.getContentPane().add(JScrollPane(self.list)) |
25 |
self.list.setSelectedIndex(0) |
26 |
|
27 |
self.originalData = "" |
28 |
self.data = "" |
29 |
self.typed = "" |
30 |
|
31 |
def key(self, e): |
32 |
# key listener
|
33 |
#print "Other Listener"
|
34 |
code = e.getKeyCode() |
35 |
#print 'keychar:',e.getKeyChar()
|
36 |
|
37 |
if code == KeyEvent.VK_ESCAPE:
|
38 |
self.hide()
|
39 |
|
40 |
elif code == KeyEvent.VK_ENTER or code == KeyEvent.VK_TAB: |
41 |
self.chooseSelected()
|
42 |
e.consume() |
43 |
|
44 |
elif code == 8: # BACKSPACE |
45 |
self.typed = self.typed[:-1] |
46 |
self.data = filter(self.originalData, self.typed) |
47 |
self.list.setListData(self.data) |
48 |
self.list.setSelectedIndex(0) |
49 |
|
50 |
elif code == KeyEvent.VK_UP:
|
51 |
self.previous()
|
52 |
# consume event to avoid history previous
|
53 |
e.consume() |
54 |
|
55 |
elif code == KeyEvent.VK_DOWN:
|
56 |
self.next()
|
57 |
# consume event to avoid history next
|
58 |
e.consume() |
59 |
|
60 |
else:
|
61 |
char = e.getKeyChar() |
62 |
if Character.isJavaLetterOrDigit(char):
|
63 |
self.typed += char
|
64 |
self.data = filter(self.data, self.typed) |
65 |
self.list.setListData(self.data) |
66 |
self.list.setSelectedIndex(0) |
67 |
|
68 |
def next(self): |
69 |
index = self.list.getSelectedIndex()
|
70 |
max = (self.list.getModel().getSize() - 1) |
71 |
|
72 |
if index < max: |
73 |
index += 1
|
74 |
self.list.setSelectedIndex(index)
|
75 |
self.list.ensureIndexIsVisible(index)
|
76 |
|
77 |
def previous(self): |
78 |
index = self.list.getSelectedIndex()
|
79 |
|
80 |
if index > 0: |
81 |
index -= 1
|
82 |
self.list.setSelectedIndex(index)
|
83 |
self.list.ensureIndexIsVisible(index)
|
84 |
|
85 |
def chooseSelected(self): |
86 |
"""Choose the selected value in the list"""
|
87 |
value = self.list.getSelectedValue()
|
88 |
startPosition = self.dotPosition + 1 |
89 |
caretPosition = self.textComponent.getCaretPosition()
|
90 |
self.textComponent.select(startPosition, caretPosition)
|
91 |
self.textComponent.replaceSelection(value)
|
92 |
self.textComponent.setCaretPosition(startPosition + len(value)) |
93 |
self.hide()
|
94 |
|
95 |
def setMethods(self, methodList): |
96 |
methodList.sort() |
97 |
self.data = methodList
|
98 |
self.originalData = methodList
|
99 |
self.typed = "" |
100 |
self.list.setListData(methodList)
|
101 |
|
102 |
def show(self): |
103 |
# when the popup becomes visible, get the cursor
|
104 |
# so we know how to replace the selection
|
105 |
self.dotPosition = self.textComponent.getCaretPosition() |
106 |
self.setSize(self.getPreferredSize()) |
107 |
JWindow.show(self)
|
108 |
|
109 |
def getPreferredSize(self): |
110 |
# need to add a magic amount to the size to avoid scrollbars
|
111 |
# I'm sure there's a better way to do this
|
112 |
MAGIC = 20
|
113 |
size = self.list.getPreferredScrollableViewportSize()
|
114 |
height = size.height + MAGIC |
115 |
width = size.width + MAGIC |
116 |
if height > Popup.MAX_HEIGHT:
|
117 |
height = Popup.MAX_HEIGHT |
118 |
if width > Popup.MAX_WIDTH:
|
119 |
width = Popup.MAX_WIDTH |
120 |
if width < Popup.MIN_WIDTH:
|
121 |
widht = Popup.MIN_WIDTH |
122 |
return Dimension(width, height)
|
123 |
|
124 |
|
125 |
# this needs a list renderer that will hilight the prefix
|
126 |
def filter(list, prefix): |
127 |
prefix = prefix.lower() |
128 |
list = [eachItem for eachItem in list if str(eachItem).lower().startswith(prefix)] |
129 |
return list |
130 |
|