src/ext/amaretto/scriptshell/default.py
changeset 0 ca70ae20a155
--- /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()