summaryrefslogtreecommitdiffstats
path: root/Tools/idle/CallTips.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1999-06-02 18:12:55 (GMT)
committerGuido van Rossum <guido@python.org>1999-06-02 18:12:55 (GMT)
commit6290dabdbbf19f2ad93bd7800226f2c6761c61b1 (patch)
tree4e887525c77c8cb03f81d4721ac79a7db0e5ee0c /Tools/idle/CallTips.py
parent85b973576887f174f4f12fa643eeb232dba2be66 (diff)
downloadcpython-6290dabdbbf19f2ad93bd7800226f2c6761c61b1.zip
cpython-6290dabdbbf19f2ad93bd7800226f2c6761c61b1.tar.gz
cpython-6290dabdbbf19f2ad93bd7800226f2c6761c61b1.tar.bz2
A version that Mark Hammond posted to the newsgroup. Has some newer
stuff for getting the tip. Had to fix the Key-( and Key-) events for Unix. Will have to re-apply my patch for catching KeyRelease and ButtonRelease events.
Diffstat (limited to 'Tools/idle/CallTips.py')
-rw-r--r--Tools/idle/CallTips.py65
1 files changed, 38 insertions, 27 deletions
diff --git a/Tools/idle/CallTips.py b/Tools/idle/CallTips.py
index 7b1fd6a..0ff9a63 100644
--- a/Tools/idle/CallTips.py
+++ b/Tools/idle/CallTips.py
@@ -2,6 +2,18 @@ import string
import sys
import types
+# These keys check if cancellation is nesessary.
+_check_cancel_keys = ["Left", "Right"]
+
+# These keys (with the modifiers) call cancel unconditionally.
+_cancel_keys_base = ["Up", "Down", "Next", "Prior", "Home"]
+_cancel_keys_modifiers = ['Key-', 'Control-', 'Shift-', 'Control-Shift-']
+
+_cancel_keys = []
+for key in _cancel_keys_base:
+ for mod in _cancel_keys_modifiers:
+ _cancel_keys.append(mod+key)
+
class CallTips:
menudefs = [
@@ -10,8 +22,10 @@ class CallTips:
keydefs = {
'<<paren-open>>': ['<Key-parenleft>'],
'<<paren-close>>': ['<Key-parenright>'],
- '<<check-calltip-cancel>>': ['<KeyRelease>', '<ButtonRelease>']
+ '<<check-calltip-cancel>>': map(lambda key: "<Key-%s>" % key, _check_cancel_keys),
+ '<<calltip-cancel>>': map(lambda key: "<%s>" % key, _cancel_keys),
}
+
windows_keydefs = {
}
@@ -43,13 +57,13 @@ class CallTips:
self.calltip_start = self.text.index("insert")
self.calltip = self._make_calltip_window()
self.calltip.showtip(arg_text)
- # dont return "break" so the key is inserted.
+ return "" #so the event is handled normally.
def paren_close_event(self, event):
# Now just hides, but later we should check if other
# paren'd expressions remain open.
- # dont return "break" so the key is inserted.
self._remove_calltip_window()
+ return "" #so the event is handled normally.
def check_calltip_cancel_event(self, event):
# This doesnt quite work correctly as it is processed
@@ -63,27 +77,24 @@ class CallTips:
if self.text.compare("insert", "<=", self.calltip_start) or \
self.text.compare("insert", ">", self.calltip_start + " lineend"):
self._remove_calltip_window()
-
- # dont return "break" so the event is handled normally.
-
+ return "" #so the event is handled normally.
+
+ def calltip_cancel_event(self, event):
+ self._remove_calltip_window()
+ return "" #so the event is handled normally.
+
def get_object_at_cursor(self,
wordchars="._" + string.uppercase + string.lowercase + string.digits):
# XXX - This need to be moved to a better place
# as the "." attribute lookup code can also use it.
text = self.text
- index = 0
- while 1:
- index = index + 1
- indexspec = "insert-%dc" % index
- ch = text.get(indexspec)
- if ch not in wordchars:
- break
- if text.compare(indexspec, "<=", "1.0"):
- break
- # Now attempt to locate the object.
- # How is this for a hack!
- word = text.get("insert-%dc" % (index-1,), "insert")
- if word:
+ chars = text.get("insert linestart", "insert")
+ i = len(chars)
+ while i and chars[i-1] in wordchars:
+ i = i-1
+ word = chars[i:]
+ if word:
+ # How is this for a hack!
import sys, __main__
namespace = sys.modules.copy()
namespace.update(__main__.__dict__)
@@ -92,7 +103,7 @@ class CallTips:
except:
pass
return None # Can't find an object.
-
+
def get_arg_text(ob):
# Get a string describing the arguments for the given object.
argText = ""
@@ -118,10 +129,11 @@ def get_arg_text(ob):
except:
pass
# Can't build an argument list - see if we can use a docstring.
- if not argText and hasattr(ob, "__doc__") and ob.__doc__:
+ if hasattr(ob, "__doc__") and ob.__doc__:
pos = string.find(ob.__doc__, "\n")
if pos<0 or pos>70: pos=70
- argText = ob.__doc__[:pos]
+ if argText: argText = argText + "\n"
+ argText = argText + ob.__doc__[:pos]
return argText
@@ -146,17 +158,16 @@ if __name__=='__main__':
def t5(self, a, *args): "(a, ...)"
def t6(self, a, b=None, *args, **kw): "(a, b=None, ...)"
-
def test( tests ):
failed=[]
for t in tests:
- if get_arg_text(t) != t.__doc__:
+ if get_arg_text(t) != t.__doc__ + "\n" + t.__doc__:
failed.append(t)
print "%s - expected %s, but got %s" % (t, `t.__doc__`, `get_arg_text(t)`)
print "%d of %d tests failed" % (len(failed), len(tests))
- tc = TC()
- tests = t1, t2, t3, t4, t5, t6, \
- tc.t1, tc.t2, tc.t3, tc.t4, tc.t5, tc.t6
+ tc = TC()
+ tests = t1, t2, t3, t4, t5, t6, \
+ tc.t1, tc.t2, tc.t3, tc.t4, tc.t5, tc.t6
test(tests)