diff -r 000000000000 -r ca70ae20a155 src/ext/amaretto/scriptshell/default.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ext/amaretto/scriptshell/default.py Tue Feb 16 10:07:05 2010 +0530 @@ -0,0 +1,146 @@ +# Copyright (c) 2005-2009 Nokia Corporation +# +# 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. + +import sys +import os +import appuifw +import series60_console +import e32 + + +class SelfClearingNamespace: + + def __init__(self): + self.namespace={'__builtins__': __builtins__, + '__name__': '__main__'} + + def __del__(self): + # Here's a subtle case. The default namespace is deleted at interpreter + # exit, but these namespaces aren't since all but the most trivial + # scripts create reference cycles between the functions defined in the + # script and the namespace of the script. To avoid this we explicitly + # clear the old namespace to break these reference cycles. + self.namespace.clear() + +script_namespace = SelfClearingNamespace() + + +def query_and_exec(): + + def is_py(x): + ext=os.path.splitext(x)[1].lower() + return ext == '.py' or ext == '.pyc' or ext == '.pyo' + + script_list = [] + script_names = [] + final_script_list = [] + final_script_names = [] + for nickname, path in script_dirs: + if os.path.exists(path): + script_list = map(lambda x: (nickname + x, path + '\\' + x), + map(lambda x: unicode(x, 'utf-8'), + filter(is_py, os.listdir(path)))) + script_names = map(lambda x: unicode(x[0]), script_list) + script_names.reverse() + script_list.reverse() + final_script_list += script_list + final_script_names += script_names + + index = appuifw.selection_list(final_script_names) + # We make a fresh, clean namespace every time we run a new script, but + # use the old namespace for the interactive console and btconsole sessions. + # This allows you to examine the script environment in a console + # session after running a script. + global script_namespace + + script_namespace = SelfClearingNamespace() + if index >= 0: + execfile(final_script_list[index][1].encode('utf-8'), + script_namespace.namespace) + + +def exec_interactive(): + import interactive_console + interactive_console.Py_console(my_console).interactive_loop( + script_namespace.namespace) + + +def exec_btconsole(): + import btconsole + btconsole.main(script_namespace.namespace) + + +def set_defaults(): + appuifw.app.body = my_console.text + appuifw.app.title = u'Python' + sys.stderr = sys.stdout = my_console + appuifw.app.screen = 'normal' + appuifw.app.orientation = 'automatic' + if appuifw.touch_enabled(): + appuifw.app.directional_pad = True + else: + appuifw.app.directional_pad = False + init_options_menu() + + +def show_copyright(): + print str(copyright) + u"\nSee www.python.org for more information." + + +def menu_action(f): + appuifw.app.menu = [] + saved_exit_key_handler = appuifw.app.exit_key_handler + + try: + try: + f() + finally: + appuifw.app.exit_key_handler = saved_exit_key_handler + set_defaults() + except: + import traceback + traceback.print_exc() + + +def init_options_menu(): + appuifw.app.menu = [(u"Run script", + lambda: menu_action(query_and_exec)), + (u"Interactive console", + lambda: menu_action(exec_interactive)), + (u"Bluetooth console", + lambda: menu_action(exec_btconsole)), + (u"About", + lambda: menu_action(show_copyright))] + +# In case of emu, the path to non-base modules needs to be added +if e32.in_emulator(): + sys.path.append('c:\\resource\\python25\\python25_repo.zip') + +script_dirs = [(u'c:', 'c:\\data\\python'), (u'e:', 'e:\\python'), + (u'e:', 'e:\\data\\python')] +for path in ('c:\\data\\python\\lib', 'e:\\python\\lib'): + if os.path.exists(path): + sys.path.append(path) + +my_console = series60_console.Console() +set_defaults() +lock = e32.Ao_lock() +appuifw.app.exit_key_handler = lock.signal +print 'Python for S60 Version ' + e32.pys60_version +print 'Capabilities Present:', e32.get_capabilities() +print '\nSelect:' +print '"Options -> Run script" to run a script' +print '"Options -> About" to view copyright\n' +lock.wait() +appuifw.app.set_exit()