commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnue common/etc/sample.gnue.conf common/src/GCo...


From: Jason Cater
Subject: gnue common/etc/sample.gnue.conf common/src/GCo...
Date: Thu, 31 Jan 2002 00:41:31 -0500

CVSROOT:        /home/cvs
Module name:    gnue
Changes by:     Jason Cater <address@hidden>    02/01/31 00:41:31

Modified files:
        common/etc     : sample.gnue.conf 
        common/src     : GConfig.py 
        forms/src      : GFClient.py GFInstance.py GFKeyMapper.py 
                         UIcurses.py UIwxpython.py 

Log message:
        removed keystroke event logic out of UI* and into KeyMapper

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/common/etc/sample.gnue.conf.diff?cvsroot=OldCVS&tr1=1.14&tr2=1.15&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/common/src/GConfig.py.diff?cvsroot=OldCVS&tr1=1.8&tr2=1.9&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/GFClient.py.diff?cvsroot=OldCVS&tr1=1.32&tr2=1.33&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/GFInstance.py.diff?cvsroot=OldCVS&tr1=1.25&tr2=1.26&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/GFKeyMapper.py.diff?cvsroot=OldCVS&tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/UIcurses.py.diff?cvsroot=OldCVS&tr1=1.12&tr2=1.13&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/UIwxpython.py.diff?cvsroot=OldCVS&tr1=1.132&tr2=1.133&r1=text&r2=text

Patches:
Index: gnue/common/etc/sample.gnue.conf
diff -c gnue/common/etc/sample.gnue.conf:1.14 
gnue/common/etc/sample.gnue.conf:1.15
*** gnue/common/etc/sample.gnue.conf:1.14       Wed Jan 16 19:10:48 2002
--- gnue/common/etc/sample.gnue.conf    Thu Jan 31 00:41:30 2002
***************
*** 112,117 ****
--- 112,158 ----
  textPercentage = 100
  
  
+ #################################
+ #
+ # Bind keystrokes to events
+ #
+ # Keystrokes can be of the form:
+ # Ctrl-|Alt-|Shift-Keystroke
+ #
+ 
+ ##  Field navigation
+ # key_NextEntry = Tab
+ # key_PrevEntry = Shift-Tab
+ # key_NextBlock = PageDown
+ # key_PrevBlock = PageUp
+ 
+ ##  Record navigation
+ # key_PrevRecord = Up
+ # key_NextRecord = Down
+ # key_JumpRecord = F2
+ 
+ ##  Text editing
+ # key_CursorLeft = Left
+ # key_CursorRight = Right
+ # key_CursorEnd = End
+ # # key_CursorHome = Home
+ # key_Backspace = Backspace
+ # key_ModeToggle = Insert
+ # key_Delete = Delete
+ 
+ ##  Record modifications
+ # key_MarkForDelete = F5
+ # key_Commit = F6
+ # key_EnterQuery = F8
+ # key_ExecQuery = F9
+ # key_Rollback = F11
+ # key_NewRecord = F12
+ #
+ #################################
+ 
+ 
+ 
+ 
  #[designer]
  # Automatically log in to needed connections to do schema
  AutoConnect = 0
***************
*** 119,126 ****
  # Use syntax highlighting in the trigger editor
  ColorizeCode = 0
  
! # When auto-creating entries using drag-and-drop, 
! # create labels?  
  #    no = Do not create labels
  #    left = Create labels to the left of the widget
  #    above = Create labels above the widget
--- 160,167 ----
  # Use syntax highlighting in the trigger editor
  ColorizeCode = 0
  
! # When auto-creating entries using drag-and-drop,
! # create labels?
  #    no = Do not create labels
  #    left = Create labels to the left of the widget
  #    above = Create labels above the widget
***************
*** 128,135 ****
  CreateLabelsOnDrop = left
  
  
  [navigator]
  disableSplash = 1
  ProcessDir = processes
! #RunFormCommand = gfclient  
  
--- 169,177 ----
  CreateLabelsOnDrop = left
  
  
+ 
  [navigator]
  disableSplash = 1
  ProcessDir = processes
! #RunFormCommand = gfclient
  
Index: gnue/common/src/GConfig.py
diff -c gnue/common/src/GConfig.py:1.8 gnue/common/src/GConfig.py:1.9
*** gnue/common/src/GConfig.py:1.8      Tue Jan 15 17:51:41 2002
--- gnue/common/src/GConfig.py  Thu Jan 31 00:41:31 2002
***************
*** 13,19 ****
  #
  # You should have received a copy of the GNU General Public 
  # License along with program; see the file COPYING. If not, 
! # write to the Free Software Foundation, Inc., 59 Temple Place 
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
  # Copyright 2000, 2001 Free Software Foundation
--- 13,19 ----
  #
  # You should have received a copy of the GNU General Public 
  # License along with program; see the file COPYING. If not, 
! # write to the Free Software Foundation, Inc., 59 Temple Place
  # - Suite 330, Boston, MA 02111-1307, USA.
  #
  # Copyright 2000, 2001 Free Software Foundation
***************
*** 23,41 ****
  #
  # DESCRIPTION:
  # Class that loads the gnue.conf files so gnue apps can get
! # default settings. 
  #
  # NOTES:
  #
  # HISTORY:
  #
  
! from GConfigParser import * 
  import os, sys, string
  from gnue.common import openResource
  import GDebug
  import GDataObjects
  import GLoginHandler
  
  TRUE = 1
  FALSE = 0
--- 23,42 ----
  #
  # DESCRIPTION:
  # Class that loads the gnue.conf files so gnue apps can get
! # default settings.
  #
  # NOTES:
  #
  # HISTORY:
  #
  
! from GConfigParser import *
  import os, sys, string
  from gnue.common import openResource
  import GDebug
  import GDataObjects
  import GLoginHandler
+ import copy
  
  TRUE = 1
  FALSE = 0
***************
*** 52,57 ****
--- 53,64 ----
    else:
      GDebug.printMesg(1,"Returning default value %s for %s" % (varName, 
default))
      return default
+ 
+ def getDict():
+   try:
+     return copy.deepcopy(_OPTION.options)
+   except:
+     return {}
  
  class InvalidFormatError (StandardError):
    # Raised if the Connections Definition File is
Index: gnue/forms/src/GFClient.py
diff -c gnue/forms/src/GFClient.py:1.32 gnue/forms/src/GFClient.py:1.33
*** gnue/forms/src/GFClient.py:1.32     Tue Nov 20 14:40:12 2001
--- gnue/forms/src/GFClient.py  Thu Jan 31 00:41:31 2002
***************
*** 31,38 ****
  #    make the next/prec methods more generic in the GFForm
  #    change self._form in here to a list
  
! import pstats
! import os
  import os.path
  import sys
  import urllib
--- 31,37 ----
  #    make the next/prec methods more generic in the GFForm
  #    change self._form in here to a list
  
! import os, copy
  import os.path
  import sys
  import urllib
***************
*** 40,45 ****
--- 39,45 ----
  from gnue.forms.GFInstance import *
  from gnue.forms.GFForm import *
  from gnue.forms.GFParser import loadForm
+ from gnue.forms import GFKeyMapper
  from gnue.common import GDebug
  from gnue.common import GConfig, GDataObjects, GConnections
  from gnue.common.GClientApp import *
***************
*** 53,59 ****
    COMMAND = "gfclient"
    NAME = "GNUe Forms"
    USAGE = "gfclient [options] file" 
!   COMMAND_OPTIONS = [ 
        [ 'user_interface', 'u', 'user_interface', 1, 'gui', 'type',  
            'The currently supported values for <type> are ' \
            +'gui, text (unstable), and pytext' ],
--- 53,59 ----
    COMMAND = "gfclient"
    NAME = "GNUe Forms"
    USAGE = "gfclient [options] file" 
!   COMMAND_OPTIONS = [
        [ 'user_interface', 'u', 'user_interface', 1, 'gui', 'type',  
            'The currently supported values for <type> are ' \
            +'gui, text (unstable), and pytext' ],
***************
*** 92,100 ****
        try:
          if string.split(string.lower(os.path.basename(sys.argv[0])),'.')[0] 
!= 'gfclient':
            formfile = 
os.environ['INSTALL_PREFIX']+'/'+GConfig.get('FormDir')+"/"+os.path.basename(sys.argv[0])+".gfd"
!         else: 
            raise IndexError
!       except IndexError: 
          self.handleStartupError ("No Forms Definition File Specified.")
  
  
--- 92,100 ----
        try:
          if string.split(string.lower(os.path.basename(sys.argv[0])),'.')[0] 
!= 'gfclient':
            formfile = 
os.environ['INSTALL_PREFIX']+'/'+GConfig.get('FormDir')+"/"+os.path.basename(sys.argv[0])+".gfd"
!         else:
            raise IndexError
!       except IndexError:
          self.handleStartupError ("No Forms Definition File Specified.")
  
  
***************
*** 115,125 ****
--- 115,138 ----
        from gnue.forms import UIcurses
        self._ui=UIcurses
  
+     self.loadKeyMappings()
      self.runForm(formfile, self.disableSplash)
  
  
+   def loadKeyMappings(self):
+     options = GConfig.getDict()
+     mapping = {}
+ 
+     for key in options.keys():
+       if string.lower(key)[:4] == 'key_':
+         mapping[key] = options[key]
+ 
+     GFKeyMapper.KeyMapper.loadUserKeyMap(mapping)
+ 
+ 
    def runFormFromTrigger(self, formFile):
      self.runForm(formFile, disableSplash=1)
+ 
  
    def runForm(self, formFile, disableSplash=0):
      try:
Index: gnue/forms/src/GFInstance.py
diff -c gnue/forms/src/GFInstance.py:1.25 gnue/forms/src/GFInstance.py:1.26
*** gnue/forms/src/GFInstance.py:1.25   Mon Jan  7 18:55:24 2002
--- gnue/forms/src/GFInstance.py        Thu Jan 31 00:41:31 2002
***************
*** 31,52 ****
  #    make the next/prec methods more generic in the GFForm
  #    change self._form in here to a list
  
- import pstats
  import os
- import os.path
  import sys
- import urllib
  import gnue.common.GConfig
  from gnue.forms.GFForm import *
  from gnue.forms.GFParser import loadForm
  from gnue.forms import VERSION
  from gnue.common import GDebug, GDataObjects
  
! from gnue.common.GClientApp import * 
  
  
  class GFInstance(GFEventAware):
!   # 
    # Initialize the class
    #
    def __init__(self, manager, serial, connections, ui, disableSplash):
--- 31,49 ----
  #    make the next/prec methods more generic in the GFForm
  #    change self._form in here to a list
  
  import os
  import sys
  import gnue.common.GConfig
  from gnue.forms.GFForm import *
  from gnue.forms.GFParser import loadForm
  from gnue.forms import VERSION
  from gnue.common import GDebug, GDataObjects
  
! from gnue.common.GClientApp import *
  
  
  class GFInstance(GFEventAware):
!   #
    # Initialize the class
    #
    def __init__(self, manager, serial, connections, ui, disableSplash):
***************
*** 54,60 ****
  
      self.connections = connections
      self.manager = manager
!     self._serial = serial 
      #self._uimodule = ui.GFUserInterface
      self._uimodule = ui
      self._disableSplash = disableSplash
--- 51,57 ----
  
      self.connections = connections
      self.manager = manager
!     self._serial = serial
      #self._uimodule = ui.GFUserInterface
      self._uimodule = ui
      self._disableSplash = disableSplash
***************
*** 67,73 ****
                             'requestNEXTRECORD'   : self.nextRecord,
                             'requestRECORDNUMBER' : self.jumpRecords,
                             'requestPAGE'         : self.gotoPage,
!                            
                             'requestKEYPRESS'     : self.keyPress,
                             'requestREPLACEVALUE' : self.replaceValue,
                             'requestCURSORLEFT'   : self.cursorMove,
--- 64,70 ----
                             'requestNEXTRECORD'   : self.nextRecord,
                             'requestRECORDNUMBER' : self.jumpRecords,
                             'requestPAGE'         : self.gotoPage,
! 
                             'requestKEYPRESS'     : self.keyPress,
                             'requestREPLACEVALUE' : self.replaceValue,
                             'requestCURSORLEFT'   : self.cursorMove,
***************
*** 81,89 ****
  
                             'requestNEWRECORD'     : self.newRecord,
                             'requestMARKFORDELETE' : self.deleteRecord,
!                            
!                            'requestQUERY'      : self.requestQuery,
!                            'executeQUERY'      : self.executeQuery,
                             'requestCOMMIT'     : self.executeCommit,
                             'requestPRINTOUT'   : self.executePrintout,
                             'requestROLLBACK'   : self.executeRollback,
--- 78,86 ----
  
                             'requestNEWRECORD'     : self.newRecord,
                             'requestMARKFORDELETE' : self.deleteRecord,
! 
!                            'requestENTERQUERY' : self.requestQuery,
!                            'requestEXECQUERY'  : self.executeQuery,
                             'requestCOMMIT'     : self.executeCommit,
                             'requestPRINTOUT'   : self.executePrintout,
                             'requestROLLBACK'   : self.executeRollback,
***************
*** 91,115 ****
                             'requestABOUT'      : self.executeAbout,
                             'fireTRIGGER'       : self.fireTrigger,
  
!                            'requestTOGGLECHKBOX'  : self.toggleCheckBox,      
                    
                             }
!     
    #
    # Associate a form object with this instance
    #
!   def setForm(self, form): 
      self._form = form
  
    #
    # Return this instance's serial number
    #
!   def getSerialNumber(self): 
      return self._serial
  
    #
    # Return this instance's manager
    #
!   def getManager(self): 
      return self.manager
  
    #
--- 88,112 ----
                             'requestABOUT'      : self.executeAbout,
                             'fireTRIGGER'       : self.fireTrigger,
  
!                            'requestTOGGLECHKBOX'  : self.toggleCheckBox,
                             }
! 
    #
    # Associate a form object with this instance
    #
!   def setForm(self, form):
      self._form = form
  
    #
    # Return this instance's serial number
    #
!   def getSerialNumber(self):
      return self._serial
  
    #
    # Return this instance's manager
    #
!   def getManager(self):
      return self.manager
  
    #
***************
*** 225,231 ****
      if message:
        messageBox = GFMsgBox(self,message)
        messageBox.show()
!       return                    
  
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
      self.updateRecordCounter()
--- 222,228 ----
      if message:
        messageBox = GFMsgBox(self,message)
        messageBox.show()
!       return
  
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
      self.updateRecordCounter()
***************
*** 269,275 ****
        self.updateRecordStatus()
      else:
        self.dispatchEvent(GFEvent('formALERT','Form is readonly'))
!       
  
    #
    # executeAbout
--- 266,272 ----
        self.updateRecordStatus()
      else:
        self.dispatchEvent(GFEvent('formALERT','Form is readonly'))
! 
  
    #
    # executeAbout
Index: gnue/forms/src/GFKeyMapper.py
diff -c gnue/forms/src/GFKeyMapper.py:1.2 gnue/forms/src/GFKeyMapper.py:1.3
*** gnue/forms/src/GFKeyMapper.py:1.2   Sat Jan 19 16:43:24 2002
--- gnue/forms/src/GFKeyMapper.py       Thu Jan 31 00:41:31 2002
***************
*** 56,62 ****
    #
    def setUIKeyMap(self, keyset):
      self.__keyTranslations = keyset
!     self._translateUserKeyMap
  
    #
    # Install a key/event mapping.
--- 56,62 ----
    #
    def setUIKeyMap(self, keyset):
      self.__keyTranslations = keyset
!     self._translateUserKeyMap()
  
    #
    # Install a key/event mapping.
***************
*** 67,73 ****
    #
    def setUserKeyMap(self, keymap):
      self.__functionMap = keymap
!     self._translateUserKeyMap
  
  
    #
--- 67,73 ----
    #
    def setUserKeyMap(self, keymap):
      self.__functionMap = keymap
!     self._translateUserKeyMap()
  
  
    #
***************
*** 117,123 ****
  
        usermap[(base, shifted, ctrl, meta)] = event
  
!     self.setUserKeyMap(userMap)
  
  
    #
--- 117,136 ----
  
        usermap[(base, shifted, ctrl, meta)] = event
  
! 
!     # Now, load any default keys they forgot to bind
!     for key in DefaultMapping.keys():
!       if  DefaultMapping[key] not in usermap.values() and \
!           not usermap.has_key(key):
!         usermap[key] = DefaultMapping[key]
! 
!     # Just in case...
!     usermap.update( {
!           (vk.TAB,      0, 0, 0) : 'NEXTENTRY',
!           (vk.ENTER,    0, 0, 0) : 'NEXTENTRY',
!           (vk.RETURN,   0, 0, 0) : 'NEXTENTRY' } )
! 
!     self.setUserKeyMap(usermap)
  
  
    #
***************
*** 156,161 ****
--- 169,175 ----
    # as it gets called for each keystroke
    #
    def getEvent(self, basekey, shift=0, ctrl=0, meta=0):
+     ##print "(basekey, shift, ctrl, meta)=(%s,%s,%s,%s)" % (basekey, shift, 
ctrl, meta)
      try:
        return self._translatedUserKeyMap[(basekey, shift, ctrl, meta)]
      except KeyError:
***************
*** 165,177 ****
    # Used internally to create a quick lookup
    # hash for time-sensitive methods.
    #
!   def _translateUserKeyMap(self, keymap):
!     self._quickFunctionMap = {}
      for keys in self.__functionMap.keys():
!       base, sh, ctrl, meta = keys
!       base = self._translatedUserKeyMap[(self.__keyTranslations[base],
                     sh, ctrl, meta)] = self.__functionMap[keys]
! 
  
  
  
--- 179,193 ----
    # Used internally to create a quick lookup
    # hash for time-sensitive methods.
    #
!   def _translateUserKeyMap(self):
!     self._translatedUserKeyMap = {}
      for keys in self.__functionMap.keys():
!       try:
!         base, sh, ctrl, meta = keys
!         self._translatedUserKeyMap[(self.__keyTranslations[base],
                     sh, ctrl, meta)] = self.__functionMap[keys]
!       except KeyError:
!         pass
  
  
  
***************
*** 235,241 ****
        return key
    return None
  
!   
  #####################################################################
  #
  # Default event mappings
--- 251,257 ----
        return key
    return None
  
! 
  #####################################################################
  #
  # Default event mappings
***************
*** 248,254 ****
        (vk.TAB,      0, 0, 0) : 'NEXTENTRY',
        (vk.ENTER,    0, 0, 0) : 'NEXTENTRY',
        (vk.RETURN,   0, 0, 0) : 'NEXTENTRY',
!       (vk.TAB,      1, 0, 0) : 'NEXTENTRY',
        (vk.LEFT,     0, 0, 0) : 'CURSORLEFT',
        (vk.RIGHT,    0, 0, 0) : 'CURSORRIGHT',
        (vk.END,      0, 0, 0) : 'CURSOREND',
--- 264,270 ----
        (vk.TAB,      0, 0, 0) : 'NEXTENTRY',
        (vk.ENTER,    0, 0, 0) : 'NEXTENTRY',
        (vk.RETURN,   0, 0, 0) : 'NEXTENTRY',
!       (vk.TAB,      1, 0, 0) : 'PREVENTRY',
        (vk.LEFT,     0, 0, 0) : 'CURSORLEFT',
        (vk.RIGHT,    0, 0, 0) : 'CURSORRIGHT',
        (vk.END,      0, 0, 0) : 'CURSOREND',
***************
*** 258,270 ****
        (vk.DELETE,   0, 0, 0) : 'DELETE',
        (vk.UP,       0, 0, 0) : 'PREVRECORD',
        (vk.DOWN,     0, 0, 0) : 'NEXTRECORD',
        (vk.F5,       0, 0, 0) : 'MARKFORDELETE',
        (vk.F6,       0, 0, 0) : 'COMMIT',
        (vk.F8,       0, 0, 0) : 'ENTERQUERY',
        (vk.F9,       0, 0, 0) : 'EXECQUERY',
        (vk.F11,      0, 0, 0) : 'ROLLBACK',
        (vk.F12,      0, 0, 0) : 'NEWRECORD',
- 
     }
  
  
--- 274,286 ----
        (vk.DELETE,   0, 0, 0) : 'DELETE',
        (vk.UP,       0, 0, 0) : 'PREVRECORD',
        (vk.DOWN,     0, 0, 0) : 'NEXTRECORD',
+       (vk.F2,       0, 0, 0) : 'JUMPRECORD',
        (vk.F5,       0, 0, 0) : 'MARKFORDELETE',
        (vk.F6,       0, 0, 0) : 'COMMIT',
        (vk.F8,       0, 0, 0) : 'ENTERQUERY',
        (vk.F9,       0, 0, 0) : 'EXECQUERY',
        (vk.F11,      0, 0, 0) : 'ROLLBACK',
        (vk.F12,      0, 0, 0) : 'NEWRECORD',
     }
  
  
Index: gnue/forms/src/UIcurses.py
diff -c gnue/forms/src/UIcurses.py:1.12 gnue/forms/src/UIcurses.py:1.13
*** gnue/forms/src/UIcurses.py:1.12     Mon Jan 21 20:41:55 2002
--- gnue/forms/src/UIcurses.py  Thu Jan 31 00:41:31 2002
***************
*** 70,100 ****
      self.widgetConstructorFunction['GFForm'] = self._formHandler
      self.widgetConstructorFunction['GFPage'] = self.pageHandler
  
!     self.keyEvents = {curses.KEY_PPAGE:       GFEvent('requestPREVBLOCK'),
!                       curses.KEY_NPAGE:       GFEvent('requestNEXTBLOCK'),
!                       curses.KEY_ENTER:       GFEvent('requestEXIT'),
!                       curses.KEY_LEFT:        GFEvent('requestCURSORLEFT'),
!                       curses.KEY_RIGHT:       GFEvent('requestCURSORRIGHT'),
!                       curses.KEY_END:         GFEvent('requestCURSOREND'),
!                       curses.KEY_HOME:        GFEvent('requestCURSORHOME'),
!                       curses.KEY_BACKSPACE:   GFEvent('requestBACKSPACE'),
!                       curses.KEY_DC:          GFEvent('requestDELETE'),
!                       curses.KEY_DOWN:        GFEvent('requestNEXTRECORD'),
!                       curses.KEY_UP:          GFEvent('requestPREVRECORD'),
!                       curses.KEY_F5:          GFEvent('requestMARKFORDELETE'),
!                       curses.KEY_F6:          GFEvent('requestCOMMIT'),
!                       curses.KEY_F8:          GFEvent('requestQUERY'),
!                       curses.KEY_F9:          GFEvent('executeQUERY'),
!                       curses.KEY_F11:         GFEvent('requestROLLBACK'),
!                       curses.KEY_F12:         GFEvent('requestNEWRECORD') ,
!                       # Hacks for odd mismatch of keycodes returns vs 
curses.KEY_*
!                       9             :         GFEvent('requestNEXTENTRY'),
!                       127           :         GFEvent('requestBACKSPACE'),
!                       }
  
      self.incommingEvent.update( {'gotoENTRY'  : self.switchFocus,
                                   'updateENTRY': self.updateEntry,
!                                'gotoPAGE': self.gotoPage,
                                   'uiUPDATESTATUS': self.updateStatus,
                                   'uiNEXTRECORD' : self.adjustMultiView,
                                   'uiPREVRECORD' : self.adjustMultiView,
--- 70,102 ----
      self.widgetConstructorFunction['GFForm'] = self._formHandler
      self.widgetConstructorFunction['GFPage'] = self.pageHandler
  
! ##
! ##    self.keyEvents = {curses.KEY_PPAGE:       GFEvent('requestPREVBLOCK'),
! ##                      curses.KEY_NPAGE:       GFEvent('requestNEXTBLOCK'),
! ##                      curses.KEY_ENTER:       GFEvent('requestEXIT'),
! ##                      curses.KEY_LEFT:        GFEvent('requestCURSORLEFT'),
! ##                      curses.KEY_RIGHT:       GFEvent('requestCURSORRIGHT'),
! ##                      curses.KEY_END:         GFEvent('requestCURSOREND'),
! ##                      curses.KEY_HOME:        GFEvent('requestCURSORHOME'),
! ##                      curses.KEY_BACKSPACE:   GFEvent('requestBACKSPACE'),
! ##                      curses.KEY_DC:          GFEvent('requestDELETE'),
! ##                      curses.KEY_DOWN:        GFEvent('requestNEXTRECORD'),
! ##                      curses.KEY_UP:          GFEvent('requestPREVRECORD'),
! ##                      curses.KEY_F5:          
GFEvent('requestMARKFORDELETE'),
! ##                      curses.KEY_F6:          GFEvent('requestCOMMIT'),
! ##                      curses.KEY_F8:          GFEvent('requestQUERY'),
! ##                      curses.KEY_F9:          GFEvent('requestEXEQUERY'),
! ##                      curses.KEY_F11:         GFEvent('requestROLLBACK'),
! ##                      curses.KEY_F12:         GFEvent('requestNEWRECORD') ,
! ##                      # Hacks for odd mismatch of keycodes returns vs 
curses.KEY_*
! ##                      9             :         GFEvent('requestNEXTENTRY'),
! ##                      127           :         GFEvent('requestBACKSPACE'),
! ##                      }
! ##
  
      self.incommingEvent.update( {'gotoENTRY'  : self.switchFocus,
                                   'updateENTRY': self.updateEntry,
!                                  'gotoPAGE': self.gotoPage,
                                   'uiUPDATESTATUS': self.updateStatus,
                                   'uiNEXTRECORD' : self.adjustMultiView,
                                   'uiPREVRECORD' : self.adjustMultiView,
***************
*** 135,151 ****
        self.frame.refresh()
        self.ncfield.refresh()
  
    def uiEventTrap(self, event):
!     try:
!       action = self.keyEvents[event]
!       self.dispatchEvent(action)
!     except KeyError:
!       if (32 <= event <= 126):
!         action = GFEvent('requestKEYPRESS',chr(event))
!         self.dispatchEvent(action)
!       else:            
!         GDebug.printMesg(3, "Dude!  Unsupported Event! %s"% event)
!     
  #
  #
  # Handlers used by buildUI to add widgets to the UI
--- 137,178 ----
        self.frame.refresh()
        self.ncfield.refresh()
  
+       
    def uiEventTrap(self, event):
! 
! ##    try:
! ##      action = self.keyEvents[event]
! ##      self.dispatchEvent(action)
! ##    except KeyError:
! ##      if (32 <= event <= 126):
! ##        action = GFEvent('requestKEYPRESS',chr(event))
! ##        self.dispatchEvent(action)
! ##      else:
! ##        GDebug.printMesg(3, "Dude!  Unsupported Event! %s"% event)
! 
! 
!     # TODO: Find whether Shift, Control, or Alt is down!
!     command = GFKeyMapper.KeyMapper.getEvent(
!           event, # Key Code,
!           0,     # Shift Down?,
!           0,     # Control Down?,
!           0)     # Alt Down?
! 
!     if command == 'JUMPRECORD':
!       self.promptForRecordNumber()
! 
!     elif command:
!       action = GFEvent('request%s' % command)
! 
!     else:
!       try:
!         action = GFEvent('requestKEYPRESS', chr(event),
!                            code=event)
!       except ValueError:
!         pass
! 
! 
! 
  #
  #
  # Handlers used by buildUI to add widgets to the UI
***************
*** 166,172 ****
      page = NCPage( container, self._form.height, self._form.width )
      
      return page
!   
    def boxHandler(self):
      object = self._currentObject[0]
      self.panel.addBox( int(object.height), int(object.width),
--- 193,199 ----
      page = NCPage( container, self._form.height, self._form.width )
      
      return page
! 
    def boxHandler(self):
      object = self._currentObject[0]
      self.panel.addBox( int(object.height), int(object.width),
***************
*** 243,249 ****
      curses.beep()
      # need to convert to curses model
      #self.statusBar.SetStatusText(event.data,0)
!     
    def adjustMultiView(self, event):
      block = event.data._block._form._currentBlock
  
--- 270,276 ----
      curses.beep()
      # need to convert to curses model
      #self.statusBar.SetStatusText(event.data,0)
! 
    def adjustMultiView(self, event):
      block = event.data._block._form._currentBlock
  
***************
*** 364,370 ****
      # move the cursor to where it should be on the screen
      ncfield.window.move(positiony, positionx)
      #ncfield.window.refresh ()
!     
      curses.doupdate()
      
    def updateStatus(self, event):
--- 391,397 ----
      # move the cursor to where it should be on the screen
      ncfield.window.move(positiony, positionx)
      #ncfield.window.refresh ()
! 
      curses.doupdate()
      
    def updateStatus(self, event):
***************
*** 404,410 ****
  
    def getLogin(self, event):
      lines, cols = self.stdscr.getmaxyx()
!     
      panel = NCForm( None, lines*2/3, cols*2/3, lines/6, cols/6 )
  
      NCLabel(panel, 2, 2, "Database %s requires login."%event.data[2].dbname, 
attr=curses.A_NORMAL)
--- 431,437 ----
  
    def getLogin(self, event):
      lines, cols = self.stdscr.getmaxyx()
! 
      panel = NCForm( None, lines*2/3, cols*2/3, lines/6, cols/6 )
  
      NCLabel(panel, 2, 2, "Database %s requires login."%event.data[2].dbname, 
attr=curses.A_NORMAL)
***************
*** 463,468 ****
--- 490,499 ----
      panel.erase()
  
  
+   # TODO!!!!
+   def promptForRecordNumber(self):
+     pass
+ 
  
  #
  #
***************
*** 936,954 ****
  from GFKeyMapper import vk
  
  cursesKeyTranslations = {
!    curses.KEY_F1        : vk.F1,        curses.KEY_F2      : vk.F2,
!    curses.KEY_F3        : vk.F3,        curses.KEY_F4      : vk.F4,
!    curses.KEY_F5        : vk.F5,        curses.KEY_F6      : vk.F6,
!    curses.KEY_F7        : vk.F7,        curses.KEY_F8      : vk.F8,
!    curses.KEY_F9        : vk.F9,        curses.KEY_F10     : vk.F10,
!    curses.KEY_F11       : vk.F11,       curses.KEY_F12     : vk.F12,
!    curses.KEY_INSERT    : vk.INSERT,    curses.KEY_DC      : vk.DELETE,
!    curses.KEY_HOME      : vk.HOME,      curses.KEY_END     : vk.END,
!    curses.KEY_NPAGE     : vk.PAGEUP,    curses.KEY_NPAGE   : vk.PAGEDOWN,
!    curses.KEY_UP        : vk.UP,        curses.KEY_DOWN    : vk.DOWN,
!    curses.KEY_LEFT      : vk.LEFT,      curses.KEY_RIGHT   : vk.RIGHT,
!    curses.KEY_TAB       : vk.TAB,       curses.KEY_ENTER   : vk.ENTER,
!    curses.KEY_BACKSPACE : vk.BACKSPACE }
  
  GFKeyMapper.KeyMapper.setUIKeyMap(wxKeyTranslations)
  
--- 967,985 ----
  from GFKeyMapper import vk
  
  cursesKeyTranslations = {
!    vk.F1,        : curses.KEY_F1,        vk.F2       : curses.KEY_F2,
!    vk.F3,        : curses.KEY_F3,        vk.F4       : curses.KEY_F4,
!    vk.F5,        : curses.KEY_F5,        vk.F6       : curses.KEY_F6,
!    vk.F7,        : curses.KEY_F7,        vk.F8       : curses.KEY_F8,
!    vk.F9,        : curses.KEY_F9,        vk.F10      : curses.KEY_F10,
!    vk.F11,       : curses.KEY_F11,       vk.F12      : curses.KEY_F12,
!    vk.INSERT,    : curses.KEY_INSERT,    vk.DELETE   : curses.KEY_DC,
!    vk.HOME,      : curses.KEY_HOME,      vk.END      : curses.KEY_END,
!    vk.PAGEUP,    : curses.KEY_NPAGE,     vk.PAGEDOWN : curses.KEY_NPAGE,
!    vk.UP,        : curses.KEY_UP,        vk.DOWN     : curses.KEY_DOWN,
!    vk.LEFT,      : curses.KEY_LEFT,      vk.RIGHT    : curses.KEY_RIGHT,
!    vk.TAB,       : curses.KEY_TAB,       vk.ENTER    : curses.KEY_ENTER,
!    vk.BACKSPACE  : curses.KEY_BACKSPACE }
  
  GFKeyMapper.KeyMapper.setUIKeyMap(wxKeyTranslations)
  
Index: gnue/forms/src/UIwxpython.py
diff -c gnue/forms/src/UIwxpython.py:1.132 gnue/forms/src/UIwxpython.py:1.133
*** gnue/forms/src/UIwxpython.py:1.132  Tue Jan 22 21:48:53 2002
--- gnue/forms/src/UIwxpython.py        Thu Jan 31 00:41:31 2002
***************
*** 138,165 ****
      self._disableSplash = disableSplash
      GFUserInterfaceBase.__init__(self)
  
!     self.keyEvents = {WXK_PRIOR:  GFEvent('requestPREVBLOCK'),
!                       WXK_NEXT:   GFEvent('requestNEXTBLOCK'),
!                       WXK_TAB:    GFEvent('requestNEXTENTRY'),
!                       WXK_LEFT:   GFEvent('requestCURSORLEFT'),
!                       WXK_RIGHT:  GFEvent('requestCURSORRIGHT'),
!                       WXK_END:    GFEvent('requestCURSOREND'),
!                       WXK_HOME:   GFEvent('requestCURSORHOME'),
!                       WXK_BACK:   GFEvent('requestBACKSPACE'),
! 
!                       WXK_INSERT: GFEvent('requestMODETOGGLE'),
!                       WXK_DELETE: GFEvent('requestDELETE'),
! 
!                       WXK_UP:     GFEvent('requestPREVRECORD'),
!                       WXK_DOWN:   GFEvent('requestNEXTRECORD'),
! 
!                       WXK_F5:     GFEvent('requestMARKFORDELETE'),
!                       WXK_F6:     GFEvent('requestCOMMIT'),
!                       WXK_F8:     GFEvent('requestQUERY'),
!                       WXK_F9:     GFEvent('executeQUERY'),
!                       WXK_F11:    GFEvent('requestROLLBACK'),
!                       WXK_F12:    GFEvent('requestNEWRECORD'),
!                      }
      self.forms = {}
  
      self.init()
--- 138,165 ----
      self._disableSplash = disableSplash
      GFUserInterfaceBase.__init__(self)
  
! ##    self.keyEvents = {WXK_PRIOR:  GFEvent('requestPREVBLOCK'),
! ##                      WXK_NEXT:   GFEvent('requestNEXTBLOCK'),
! ##                      WXK_TAB:    GFEvent('requestNEXTENTRY'),
! ##                      WXK_LEFT:   GFEvent('requestCURSORLEFT'),
! ##                      WXK_RIGHT:  GFEvent('requestCURSORRIGHT'),
! ##                      WXK_END:    GFEvent('requestCURSOREND'),
! ##                      WXK_HOME:   GFEvent('requestCURSORHOME'),
! ##                      WXK_BACK:   GFEvent('requestBACKSPACE'),
! ##
! ##                      WXK_INSERT: GFEvent('requestMODETOGGLE'),
! ##                      WXK_DELETE: GFEvent('requestDELETE'),
! ##
! ##                      WXK_UP:     GFEvent('requestPREVRECORD'),
! ##                      WXK_DOWN:   GFEvent('requestNEXTRECORD'),
! ##
! ##                      WXK_F5:     GFEvent('requestMARKFORDELETE'),
! ##                      WXK_F6:     GFEvent('requestCOMMIT'),
! ##                      WXK_F8:     GFEvent('requestQUERY'),
! ##                      WXK_F9:     GFEvent('requestEXEQUERY'),
! ##                      WXK_F11:    GFEvent('requestROLLBACK'),
! ##                      WXK_F12:    GFEvent('requestNEWRECORD'),
! ##                     }
      self.forms = {}
  
      self.init()
***************
*** 215,221 ****
        wxStaticText(parent=self.splash, id=-1, label=str(text),
                     size=wxSize(swidth,theight), 
pos=wxPoint(1,25),style=wxALIGN_CENTRE)
  
!       text = "(c)2000-2001 Free Software Foundation"
        twidth,theight = self.splash.GetTextExtent(text)
        wxStaticText(self.splash, -1, str(text),
                     wxPoint(1,50),wxSize(swidth,theight),wxALIGN_CENTRE)
--- 215,221 ----
        wxStaticText(parent=self.splash, id=-1, label=str(text),
                     size=wxSize(swidth,theight), 
pos=wxPoint(1,25),style=wxALIGN_CENTRE)
  
!       text = "(c)2000-2002 Free Software Foundation"
        twidth,theight = self.splash.GetTextExtent(text)
        wxStaticText(self.splash, -1, str(text),
                     wxPoint(1,50),wxSize(swidth,theight),wxALIGN_CENTRE)
***************
*** 247,253 ****
  
      self.charWidth = maxWidth+maxLeading
      self.charHeight = maxHeight+maxDescent
!     
      self.borderPercentage = (int(GConfig.get('borderPercentage')) / 100.0)
      self.textPercentage = (int(GConfig.get('textPercentage')) / 100.0)
  
--- 247,253 ----
  
      self.charWidth = maxWidth+maxLeading
      self.charHeight = maxHeight+maxDescent
! 
      self.borderPercentage = (int(GConfig.get('borderPercentage')) / 100.0)
      self.textPercentage = (int(GConfig.get('textPercentage')) / 100.0)
  
***************
*** 297,304 ****
      dataMenu.Append( 207, "Enter Query            
(F8)",GConfig.get('msg_query_prep'))
      EVT_MENU(self._wxapp, 207, lambda event, l=self: 
l.dispatchEvent(GFEvent('requestQUERY')))
      dataMenu.Append( 208, "Execute Query        (F9)", 
GConfig.get('msg_query'))
!     EVT_MENU(self._wxapp, 208, lambda event, l=self: 
l.dispatchEvent(GFEvent('executeQUERY')))
!     
      helpMenu = wxMenu()
      helpMenu.Append( 300, "&About...", GConfig.get('msg_help'))
      EVT_MENU(self._wxapp, 300, lambda event, l=self: 
l.dispatchEvent(GFEvent('requestABOUT')))
--- 297,304 ----
      dataMenu.Append( 207, "Enter Query            
(F8)",GConfig.get('msg_query_prep'))
      EVT_MENU(self._wxapp, 207, lambda event, l=self: 
l.dispatchEvent(GFEvent('requestQUERY')))
      dataMenu.Append( 208, "Execute Query        (F9)", 
GConfig.get('msg_query'))
!     EVT_MENU(self._wxapp, 208, lambda event, l=self: 
l.dispatchEvent(GFEvent('requestEXEQUERY')))
! 
      helpMenu = wxMenu()
      helpMenu.Append( 300, "&About...", GConfig.get('msg_help'))
      EVT_MENU(self._wxapp, 300, lambda event, l=self: 
l.dispatchEvent(GFEvent('requestABOUT')))
***************
*** 308,314 ****
      menuBar.Append( dataMenu, "&Data" )
      menuBar.Append( helpMenu, "&Help" )
  
!     self.mainWindow.SetMenuBar( menuBar );    
  
      #
      #  There has got to be better way to call events to ride off the EVT_MENU
--- 308,314 ----
      menuBar.Append( dataMenu, "&Data" )
      menuBar.Append( helpMenu, "&Help" )
  
!     self.mainWindow.SetMenuBar( menuBar );
  
      #
      #  There has got to be better way to call events to ride off the EVT_MENU
***************
*** 347,354 ****
  
  
    # Called by SplashScreen when timer expires
!   def onCloseSplash(self): 
!     # For some reason, a simple Close() doesn't cooperate with 
      # the modal login box and all hell breaks loose
      self.splash.Show(0)
      self.splash.Destroy()
--- 347,354 ----
  
  
    # Called by SplashScreen when timer expires
!   def onCloseSplash(self):
!     # For some reason, a simple Close() doesn't cooperate with
      # the modal login box and all hell breaks loose
      self.splash.Show(0)
      self.splash.Destroy()
***************
*** 376,382 ****
        child = _NOTEBOOK.GetParent()
        while child:
          child.Fit()
!         child = child.GetParent()    
  
      self.mainWindow.CenterOnScreen()
  
--- 376,382 ----
        child = _NOTEBOOK.GetParent()
        while child:
          child.Fit()
!         child = child.GetParent()
  
      self.mainWindow.CenterOnScreen()
  
***************
*** 399,405 ****
  
    #
    # _setStatusBar
!   # 
    def _setStatusBar(self,tip, statusValue, insertValue, currentRecord, 
maxRecord, currentPage, maxPage):
      if tip != None: self.statusBar.SetStatusText(str(tip),0)
  
--- 399,405 ----
  
    #
    # _setStatusBar
!   #
    def _setStatusBar(self,tip, statusValue, insertValue, currentRecord, 
maxRecord, currentPage, maxPage):
      if tip != None: self.statusBar.SetStatusText(str(tip),0)
  
***************
*** 408,414 ****
  
      if insertValue != None:
        self.statusBar.SetStatusText(insertValue,2)
!       
      if currentRecord != None and  maxRecord != None:
        self.statusBar.SetStatusText(string.strip("%s/%s" % 
(currentRecord,maxRecord)),3)
  
--- 408,414 ----
  
      if insertValue != None:
        self.statusBar.SetStatusText(insertValue,2)
! 
      if currentRecord != None and  maxRecord != None:
        self.statusBar.SetStatusText(string.strip("%s/%s" % 
(currentRecord,maxRecord)),3)
  
***************
*** 440,446 ****
      
    
#############################################################################
    #
!   # Incomming Event Processors
    #
    # Processes the incomming events from other objects
    #
--- 440,446 ----
      
    
#############################################################################
    #
!   # Incoming Event Processors
    #
    # Processes the incomming events from other objects
    #
***************
*** 465,474 ****
          if self.visiblePage.GetId() == _NOTEBOOK.GetPage(count).GetId():
            _NOTEBOOK.SetSelection(count)
            break
!         
      self.visiblePage.Show(TRUE)
  
!                                                           
    #
    # formAlert
    #
--- 465,474 ----
          if self.visiblePage.GetId() == _NOTEBOOK.GetPage(count).GetId():
            _NOTEBOOK.SetSelection(count)
            break
! 
      self.visiblePage.Show(TRUE)
  
! 
    #
    # formAlert
    #
***************
*** 531,558 ****
    # really need to be recoded to something more friendly - maybe multiple 
event handlers
    #
    def uiEventTrap(self, event):
      action = None
      #
      # KeyBoard Events
      #
      if event.GetEventType() == wxEVT_CHAR:
!       if event.ShiftDown() == TRUE and event.KeyCode() == WXK_TAB:
!         action = GFEvent('requestPREVENTRY')
        else:
          try:
!           action = self.keyEvents[event.KeyCode()]
!         except KeyError:
!           if event.ControlDown():
!             GDebug.printMesg(2, "Control %s" % (chr(event.KeyCode())))
!             action = GFEvent('requestHOTKEY',chr(event.KeyCode()))
!           elif (32 <= event.KeyCode() <= 126) or (event.KeyCode() == 
WXK_RETURN):
!             action = GFEvent('requestKEYPRESS',chr(event.KeyCode()))
!           # quick hack for for russian support from Dmitry Sorokin 
<address@hidden>
!           elif (192 <= event.KeyCode() <= 255):
!             action = GFEvent('requestKEYPRESS',chr(event.KeyCode()))
!           elif event.KeyCode() == WXK_F2:
!             self.promptForRecordNumber()
  
  
      #
      # Mouse Events
--- 531,582 ----
    # really need to be recoded to something more friendly - maybe multiple 
event handlers
    #
    def uiEventTrap(self, event):
+ 
      action = None
+     
      #
      # KeyBoard Events
      #
      if event.GetEventType() == wxEVT_CHAR:
! 
!       command = GFKeyMapper.KeyMapper.getEvent(
!           event.KeyCode(),
!           event.ShiftDown(),
!           event.ControlDown(),
!           event.AltDown())
! 
! 
!       if command == 'JUMPRECORD':
!         self.promptForRecordNumber()
! 
!       elif command:
!         action = GFEvent('request%s' % command)
! 
        else:
          try:
!           action = GFEvent('requestKEYPRESS', chr(event.KeyCode()),
!                            code=event.KeyCode())
!         except ValueError:
!           event.Skip()
  
+ ##
+ ##      if event.ShiftDown() == TRUE and event.KeyCode() == WXK_TAB:
+ ##        action = GFEvent('requestPREVENTRY')
+ ##      else:
+ ##        try:
+ ##          action = self.keyEvents[event.KeyCode()]
+ ##        except KeyError:
+ ##          if event.ControlDown():
+ ##            GDebug.printMesg(2, "Control %s" % (chr(event.KeyCode())))
+ ##            action = GFEvent('requestHOTKEY',chr(event.KeyCode()))
+ ##          elif (32 <= event.KeyCode() <= 126) or (event.KeyCode() == 
WXK_RETURN):
+ ##            action = GFEvent('requestKEYPRESS',chr(event.KeyCode()))
+ ##          # quick hack for for russian support from Dmitry Sorokin 
<address@hidden>
+ ##          elif (192 <= event.KeyCode() <= 255):
+ ##            action = GFEvent('requestKEYPRESS',chr(event.KeyCode()))
+ ##          elif event.KeyCode() == WXK_F2:
+ ##            self.promptForRecordNumber()
+ ##
  
      #
      # Mouse Events
***************
*** 924,930 ****
        
      if initialize: 
        EVT_CLOSE(interface.mainWindow,interface.closeTrap)
!     
      return newWidget
  
  #
--- 948,954 ----
        
      if initialize: 
        EVT_CLOSE(interface.mainWindow,interface.closeTrap)
! 
      return newWidget
  
  #
***************
*** 1183,1201 ****
  from GFKeyMapper import vk
  
  wxKeyTranslations = {
!    WXK_F1     : vk.F1,           WXK_F2     : vk.F2,
!    WXK_F3     : vk.F3,           WXK_F4     : vk.F4,
!    WXK_F5     : vk.F5,           WXK_F6     : vk.F6,
!    WXK_F7     : vk.F7,           WXK_F8     : vk.F8,
!    WXK_F9     : vk.F9,           WXK_F10    : vk.F10,
!    WXK_F11    : vk.F11,          WXK_F12    : vk.F12,
!    WXK_INSERT : vk.INSERT,       WXK_DELETE : vk.DELETE,
!    WXK_HOME   : vk.HOME,         WXK_END    : vk.END,
!    WXK_PRIOR  : vk.PAGEUP,       WXK_NEXT   : vk.PAGEDOWN,
!    WXK_UP     : vk.UP,           WXK_DOWN   : vk.DOWN,
!    WXK_LEFT   : vk.LEFT,         WXK_RIGHT  : vk.RIGHT,
!    WXK_TAB    : vk.TAB,          #WXK_ENTER  : vk.ENTER,
!    WXK_RETURN : vk.ENTER,        WXK_BACK   : vk.BACKSPACE   }
  
  GFKeyMapper.KeyMapper.setUIKeyMap(wxKeyTranslations)
  
--- 1207,1225 ----
  from GFKeyMapper import vk
  
  wxKeyTranslations = {
!    vk.F1     : WXK_F1,        vk.F2        : WXK_F2,
!    vk.F3     : WXK_F3,        vk.F4        : WXK_F4,
!    vk.F5     : WXK_F5,        vk.F6        : WXK_F6,
!    vk.F7     : WXK_F7,        vk.F8        : WXK_F8,
!    vk.F9     : WXK_F9,        vk.F10       : WXK_F10,
!    vk.F11    : WXK_F11,       vk.F12       : WXK_F12,
!    vk.INSERT : WXK_INSERT,    vk.DELETE    : WXK_DELETE,
!    vk.HOME   : WXK_HOME,      vk.END       : WXK_END,
!    vk.PAGEUP : WXK_PRIOR,     vk.PAGEDOWN  : WXK_NEXT,
!    vk.UP     : WXK_UP,        vk.DOWN      : WXK_DOWN,
!    vk.LEFT   : WXK_LEFT,      vk.RIGHT     : WXK_RIGHT,
!    vk.TAB    : WXK_TAB,
!    vk.ENTER  : WXK_RETURN,    vk.BACKSPACE : WXK_BACK }
  
  GFKeyMapper.KeyMapper.setUIKeyMap(wxKeyTranslations)
  



reply via email to

[Prev in Thread] Current Thread [Next in Thread]