commit-gnue
[Top][All Lists]
Advanced

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

gnue/forms/src/uidrivers/gtk2 UIdriver.py __ini...


From: Jan Ischebeck
Subject: gnue/forms/src/uidrivers/gtk2 UIdriver.py __ini...
Date: Sat, 17 May 2003 10:46:04 -0400

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     Jan Ischebeck <address@hidden>  03/05/17 10:46:04

Modified files:
        forms/src/uidrivers/gtk2: UIdriver.py __init__.py 
Added files:
        forms/src/uidrivers/gtk2/widgets: _base.py box.py button.py 
                                          entry.py image.py __init__.py 
                                          label.py page.py scrollbar.py 
        forms/src/uidrivers/gtk2: ErrorHandler.py MenuBar.py 
                                  SplashScreen.py ToolBar.py 
                                  UILoginHandler.py common.py 

Log message:
        first part of rewritten gtk2 uidriver

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/_base.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/box.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/button.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/entry.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/image.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/__init__.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/label.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/page.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/scrollbar.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/ErrorHandler.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/MenuBar.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/SplashScreen.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/ToolBar.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/UILoginHandler.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/common.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/UIdriver.py.diff?tr1=1.23&tr2=1.24&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/__init__.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text

Patches:
Index: gnue/forms/src/uidrivers/gtk2/UIdriver.py
diff -c gnue/forms/src/uidrivers/gtk2/UIdriver.py:1.23 
gnue/forms/src/uidrivers/gtk2/UIdriver.py:1.24
*** gnue/forms/src/uidrivers/gtk2/UIdriver.py:1.23      Sun Apr 27 11:51:36 2003
--- gnue/forms/src/uidrivers/gtk2/UIdriver.py   Sat May 17 10:46:04 2003
***************
*** 19,69 ****
  # Copyright 2000-2003 Free Software Foundation
  #
  # FILE:
! # UIpythongtk.py
  #
  # DESCRIPTION:
! # A Pythongtk2 based user interface driver for GNUE forms.
  #
  # NOTES:
- #  TODO: why does UIhelper not inherit from UIwidget?
  #
  
- ################## GP ISSUES ################
- #$ Pending issues as on 8 June 2002
- #$ 1. Does not ask to save on exit after making changes. (fixed on 2002-9-8)
- #$ 2. Tabbed notebook overlays all fields on one frame and needs to be 
switched
- #$    in reverse order to show the frames correctly. (activate form?)
- #$ 3. Placement of windows should be in the center
- #$ 4. Checkboxes not supported
- #$ 5. Clipboard not implemented.
- #$ 6. Statusbar implemented as five statusbars, and not updated for all 
widgets.
- #$ 7. Not seen printing at all
- #$ 8. width, height, etc. of font is hardcoded.
- #$ 9. Waiting cursor change
- #$ 10. Bell not supported.
- #$ 11. Scrollbar not working
- #$ 12. Buttons not checked for working yet
- #$ 13. Selecting a value from combo list does not change focus first
- #############################################
- 
- 
- # On Debian/unstable systems, you probably like to uncomment the following two
- # lines to use gtk2.0 instead of 1.2
- #
- # TODO:  reading the FAQs on PyGTK, this should be done
- # TODO:  REGARDLESS of debian unstable (it has to do with
- # TODO:  parallel installs of GTK) but it seems RedHat 8.0
- # TODO:  has an older, buggy version of PyGTK :(
- # TODO:  I've enclosed in a try: block... does this work
- # TODO:  on RH8?
- #
- #try:
  import pygtk
  pygtk.require('2.0')
- #except ImportError:
- #  pass
  
  import gtk
  
  ## check if we really imported gtk 2.0
  if not hasattr(gtk,"keysyms"):
--- 19,41 ----
  # Copyright 2000-2003 Free Software Foundation
  #
  # FILE:
! # gtk2/UIdriver.py
  #
  # DESCRIPTION:
! # A gtk2 based user interface driver for GNUe forms.
  #
  # NOTES:
  #
+ import sys
+ import string
  
  import pygtk
  pygtk.require('2.0')
  
  import gtk
+ import pango
+ 
+ __gtk_mainloop = None
  
  ## check if we really imported gtk 2.0
  if not hasattr(gtk,"keysyms"):
***************
*** 73,116 ****
          "and pygtk %s.%s.%s ."% gtk.pygtk_version
  
  
- from gnue.forms.GFForm import *
  from gnue.common import events
- from gnue.forms import GFKeyMapper
- from gnue.forms.uidrivers._base.UIdriver import *
- from gnue.forms.uidrivers._base.UIWidget import *
- 
- import os
- import sys
- import string
- from gnue.forms import VERSION
  from gnue.common.apps import GDebug
- from gnue.common.datasources import GLoginHandler
  from gnue.common.apps import GConfig
  from gnue.common.utils.TextUtils import lineWrap
  
! _NOTEBOOK = None
! _LOOPTRAP = 0
! _EVENTPROCESSOR = None
! _PROMPTFORRECORD = None
! _charWidth = 0
! _WidgetToGFObj = {}
! _WidgetToUIObj = {}
! count=0
! # hack for wxPython 2.2 (2.3+ doesn't need this)
! #$def _eventObjTowxWindow(event):
!   #$eo = event.GetEventObject()
!   #$return wxPyTypeCast(eo, 'wxWindow')
  
! #
! # Little global helper routine to set font according to options
! #
! # TODO: Not completed
! #
! #$def initFont(widget, affectsLayout=1):
!   #$if int(gConfig('fixedWidthFont')):
!     
#$widget.SetFont(wxFont(int(gConfig('pointSize')),wxMODERN,wxNORMAL,wxNORMAL))
!   #$style=gtk.Style()
!   
#$gtk.Style.set_font(style,gtk.gdk.Font.font_load('-sibal-devanagari-medium-r-normal--14-140-75-75-p--iso10646-dev'))
  
  #
  # GFUserInterface
--- 45,67 ----
          "and pygtk %s.%s.%s ."% gtk.pygtk_version
  
  
  from gnue.common import events
  from gnue.common.apps import GDebug
  from gnue.common.apps import GConfig
  from gnue.common.utils.TextUtils import lineWrap
  
! from gnue.forms.GFForm import *
  
! from gnue.forms.uidrivers._commonGuiToolkit import UIdriver as commonToolkit
! 
! #from gnue.forms.uidrivers.gtk2.GFApp import *
! from gnue.forms.uidrivers.gtk2.SplashScreen import *
! from gnue.forms.uidrivers.gtk2.widgets._base  import *
! 
! 
! def initFont(widget):
!   font_desc = pango.FontDescription('monospace 12')
!   widget.modify_font(font_desc)
  
  #
  # GFUserInterface
***************
*** 118,556 ****
  # The public interface to the User Interface
  # All UIs must provide this class
  #
! class GFUserInterface(GFUserInterfaceBase):
    def __init__(self, eventController, disableSplash = None):
  
-     GFUserInterfaceBase.__init__(self,eventController)
- 
-     self._WIDGETS = {'GFLabel'     : UILabel,
-                      'GFBox'       : UIBox,
-                      'GFPage'      : UIPage,
-                      'GFForm'      : UIForm,
-                      'GFEntry'     : UIEntry,
-                      'GFButton'    : UIButton,
-                      'GFScrollBar' : UIScrollBar,
-                      }
  
!     self._DIALOGS = {'about'       :UIAbout,
!                      'messageBox'  :UIMessageBox,
!                      }
! 
!     self._disableSplash = disableSplash
! 
!     global _EVENTPROCESSOR
!     _EVENTPROCESSOR = self.dispatchEvent
!     global _PROMPTFORRECORD
!     _PROMPTFORRECORD = self.promptForRecordNumber
! 
!     self.init(disableSplash)
! 
!   #
!   # init
!   #
!   # Routine called by wxWindows when wxApp instance is created
!   # It is used the build the basic UI
!   #
!   def init(self,disableSplash):
  
      #
!     # Splash screen
      #
!     # how to get rid of this thing???
!     # disabled for now...
!     if not disableSplash and 0:
!         self.splash = gtk.Window(gtk.TRUE)
!         # not the best, but working decision
!         self.splash.connect('destroy', lambda win: self.splash.hide())
!         self.splash.set_resizable(gtk.TRUE)
!         self.splash.resize(525,200)
!         self.splash.set_position(1) # for center
!         img = gtk.Image()
!         img.set_from_file(images_dir + gConfig('splashScreenPNG'))
!         self.splash.add(img)
!         self.splash.show_all()
  
      #
!     # Create the main window
      #
!     self.mainWindow = gtk.Window()
!     self.mainWindow.connect('delete_event', self.windowExitEvent)
! 
!     self.mainWindow.set_resizable(gtk.FALSE)
!     self.mainWindow.set_title("")
!     table = gtk.Table(4, 1, gtk.FALSE)
!     self.mainWindow.add(table)
  
!     #$set the other window parameters later.....
!     #$initFont(self.mainWindow,1)
  
      #
      # Find the max size of printable characters
      #  used to setup the grid
      #
      maxWidth, maxHeight, maxDescent, maxLeading = [0,0,0,0]
      checkchars = string.printable
-     print checkchars
      for letter in checkchars:
        width,height,descent,leading =9,15,3,0
-       #$find its gtk equivalent...later...
-       #$self.mainWindow.GetFullTextExtent(letter)
        maxWidth = max(maxWidth,width)
        maxHeight = max(maxHeight,height)
        maxDescent = max(maxDescent,descent)
        maxLeading = max(maxLeading,leading)
  
!     self.charWidth = int(maxWidth+maxLeading)
!     self.charHeight = int(maxHeight+maxDescent)
! 
!     self.widgetWidth = self.charWidth       # The pixel width of a 1 char 
widget (for things like buttons)
!     self.widgetHeight = self.charHeight + 3 # The pixel height of a 1 char 
widget (for things like buttons)
!     self.textWidth = self.charWidth         # The pixel width of text inside 
a widget
!     self.textHeight = self.charHeight       # The pixel height of text inside 
a widget
! 
!     global _charWidth
!     _charWidth = self.charWidth             # Used by the mouse handler to 
compute char offset into widget
! 
!     self.menu_sb_space=4 # the extra spaces needed by the menu, toolbar and 
statusbar
! 
! 
! 
! 
! 
!     #$STATUS BAR.................
!     self.statusBar1 =gtk.Statusbar()
!     self.statusBar2=gtk.Statusbar()
!     self.statusBar3=gtk.Statusbar()
!     self.statusBar4=gtk.Statusbar()
!     self.statusBar5=gtk.Statusbar()
!     #$self.statusBar.push(self.statusBar.get_context_id("status bar"),"Shri 
Harih")
!     #$initFont(self.statusBar,0)
!     status_bar_table=gtk.Table(1,5)
!     status_bar_table.attach_defaults(self.statusBar1,0,1,0,1)
!     status_bar_table.attach_defaults(self.statusBar2,1,2,0,1)
!     status_bar_table.attach_defaults(self.statusBar3,2,3,0,1)
!     status_bar_table.attach_defaults(self.statusBar4,3,4,0,1)
!     status_bar_table.attach_defaults(self.statusBar5,4,5,0,1)
! 
!     table.attach(status_bar_table,
!                  # X direction           Y direction
!                  0,1,                    3, 4,
!                  gtk.EXPAND | gtk.FILL,  0,
!                  0,                      0)
! 
! 
! 
!     #$print self.dispatchEvent(events.Event('requestCOMMIT'))
!     
! 
! 
!     #$FILE MENU..............
!     menu_items = (
!     (_("/_File"),            None,         None,        0, '<Branch>' ),
!     (_("/File/Save"),    'F6', lambda window, userdata, widget, 
l=self:l.dispatchEvent(events.Event('requestCOMMIT')), 0, 
'<StockItem>','SAVE_CHANGES'),
!     (_("/File/Clear Form"), 'F11', lambda window, userdata, widget, l=self: 
l.dispatchEvent(events.Event('requestROLLBACK')),0,'<StockItem>','CLEAR_FORM' ),
!     (_("/File/Print"),       None, lambda window, userdata, widget, l=self: 
l.dispatchEvent(events.Event('requestPRINTOUT')), 0, None),
!     (_("/File/Exit"),       None, lambda window,userdata,widget,l=self: 
l.menuExitEvent(), 0 , '<StockItem>','EXIT_FORM'),
! 
!     (_("/_Edit"),   None,None ,0, '<Branch>'),
!     (_("/_Edit/Cut"),None,lambda window, userdata, widget, l=self: 
l.dispatchEvent(events.Event('requestCUT')),0,'<StockItem>',gtk.STOCK_CUT),
!     (_("/_Edit/Copy"),None,lambda window, userdata, widget, l=self: 
l.dispatchEvent(events.Event('requestCOPY')),0,'<StockItem>',gtk.STOCK_COPY),
!     (_("/_Edit/Paste"),None,lambda window, userdata, widget, l=self: 
l.dispatchEvent(events.Event('requestPASTE')),0,'<StockItem>',gtk.STOCK_PASTE),
! 
!     (_("/_Data"),                  None, None,        0, '<Branch>'),
!     (_("/_Data/First Record"), '<Shft>Up',lambda window, userdata, widget, 
l=self: 
l.dispatchEvent(events.Event('requestFIRSTRECORD')),0,'<StockItem>','FIRST_RECORD'),
!     (_("/_Data/Previous Record"),'Up', lambda window, userdata, widget, 
l=self: l.dispatchEvent(events.Event('requestPREVRECORD')), 
0,'<StockItem>','PREVIOUS_RECORD'),
!     (_("/_Data/Next Record"),'Down', lambda window, userdata, widget, l=self: 
l.dispatchEvent(events.Event('requestNEXTRECORD')), 0, 
'<StockItem>','NEXT_RECORD'),
!     (_("/_Data/Last Record"),'<Shft>Down',lambda window, userdata, widget, 
l=self: l.dispatchEvent(events.Event('requestLASTRECORD')), 0, 
'<StockItem>','LAST_RECORD'),
!     (_("/_Data/Jump to Record ..."),'F2', lambda 
window,userdata,widget:_PROMPTFORRECORD(), 0, '<StockItem>','JUMP_TO_RECORD'),
!     (_("/_Data/New Record"),'F12', lambda window, userdata, widget, l=self: 
l.dispatchEvent(events.Event('requestNEWRECORD')),0,None),
!     (_("/_Data/Mark Record For Delete"),'F5',lambda window, userdata, widget, 
l=self: l.dispatchEvent(events.Event('requestMARKFORDELETE')), 0, None),
!     (_("/_Data/Next Block"),'Page_Down',lambda window, userdata, widget, 
l=self: l.dispatchEvent(events.Event('requestNEXTBLOCK')), 0,None),
!     (_("/_Data/Previous Block"),  'Page_Up', lambda window, userdata, widget, 
l=self: l.dispatchEvent(events.Event('requestPREVBLOCK')), 0, None),
!     (_("/_Data/Enter Query"), 'F8', lambda window, userdata, widget, l=self: 
l.dispatchEvent(events.Event('requestENTERQUERY')), 0, None),
!     (_("/_Data/Execute Query"),'F9',lambda window, userdata, widget, l=self: 
l.dispatchEvent(events.Event('requestEXECQUERY')), 0, 
'<StockItem>','EXECUTE_QUERY'),
! 
! 
!     (_("/_Help"),       None, None, 0, '<Branch>'),
!     (_("/Help/_About"), None,  lambda window, userdata, widget, l=self: 
l.dispatchEvent(events.Event('requestABOUT')), 0, ''),
!     )
! 
!     #$print "after menu"
!     GDebug.printMesg(1,"after menu")
! 
!     #MENU BAR
!     accel_group = gtk.AccelGroup()
!     self.mainWindow.add_accel_group(accel_group)
! 
!     item_factory = gtk.ItemFactory(gtk.MenuBar, '<main>', accel_group)
! 
!     # create menu items
! 
!     item_factory.create_items(menu_items,self.mainWindow)
! 
!     table.attach(item_factory.get_widget('<main>'),
!                  # X direction           Y direction
!                  0, 1,                      0, 1,
!                  gtk.EXPAND | gtk.FILL,     0,
!                  0,                         0)
! 
! 
! 
! 
!     toolbar=gtk.Toolbar()
!     items = [ ('SAVE_CHANGES', '', 0, 0, ''),
!               ('INSERT_RECORD','',0,0,''),
!               ('DELETE_RECORD','',0,0,''),
!               ('FIRST_RECORD','',0,0,''),
!               ('PREVIOUS_RECORD','',0,0,''),
!               ('NEXT_RECORD','',0,0,''),
!               ('LAST_RECORD','',0,0,''),
!               ('JUMP_TO_RECORD','',0,0,''),
!               ('PREPARE_QUERY','',0,0,''),
!               ('EXECUTE_QUERY','',0,0,''),
!               ('CLEAR_FORM','',0,0,''),
!               ('EXIT_FORM','',0,0,''),
!             ]
!  
! 
!     gtk.stock_add(items)
!     factory = gtk.IconFactory ()
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_commit'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('SAVE_CHANGES', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load SAVE_CHANGES logo for toolbar'
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_insert'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('INSERT_RECORD', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load INSERT_RECORD logo for toolbar'
! 
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_delete'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('DELETE_RECORD', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load DELETE_RECORD logo for toolbar'
! 
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_first'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('FIRST_RECORD', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load FIRST_RECORD logo for toolbar'
! 
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_previous'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('PREVIOUS_RECORD', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load PREVIOUS_RECORD logo for toolbar'
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_next'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('NEXT_RECORD', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load NEXT_RECORD logo for toolbar'
! 
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_last'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('LAST_RECORD', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load LAST_RECORD logo for toolbar'
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_jump'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('JUMP_TO_RECORD', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load JUMP_TO_RECORD logo for toolbar'
! 
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file 
(images_dir+gConfig('tb_query_prep'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('PREPARE_QUERY', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load PREPARE_QUERY logo for toolbar'
! 
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_query'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('EXECUTE_QUERY', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load EXECUTE_QUERY logo for toolbar'
! 
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_rollback'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet (pixbuf)
!       factory.add ('CLEAR_FORM',icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load CLEAR_FORM logo for toolbar'
! 
! 
!     pixbuf = gtk.gdk.pixbuf_new_from_file (images_dir+gConfig('tb_exit'))
!       # Register icon to accompany stock item
!     if pixbuf:
!       icon_set = gtk.IconSet(pixbuf)
!       factory.add ('EXIT_FORM', icon_set)
!       #$icon_set.unref()
!     else:
!       print 'failed to load EXIT_FORM logo for toolbar'
! 
!     factory.add_default()
!     toolbar.insert_stock( 'SAVE_CHANGES',
!                         _("Save all changes to database"),
!                          None,
!                          lambda button,window, 
l=self:l.dispatchEvent(events.Event('requestCOMMIT')),
!                          self.mainWindow,
!                          -1)
! 
! 
!     toolbar.insert_stock('INSERT_RECORD',
!                          _("insert a new record"),
!                          None,
!                          lambda button,window, l=self: 
l.dispatchEvent(events.Event('requestNEWRECORD')),
!                          self.mainWindow,
!                          -1)
!     toolbar.insert_stock('DELETE_RECORD',
!                          _("delete record"),
!                          None,
!                          lambda button,window,l=self: 
l.dispatchEvent(events.Event('requestMARKFORDELETE')),
!                          self.mainWindow,
!                          -1)
!     toolbar.insert_stock('FIRST_RECORD',
!                          _("first record"),
!                          None,
!                          lambda button,window,l=self: 
l.dispatchEvent(events.Event('requestFIRSTRECORD')),
!                          self.mainWindow,
!                          -1)
!     toolbar.insert_stock('PREVIOUS_RECORD',
!                          _("previous record"),
!                          None,
!                          lambda button,window,l=self: 
l.dispatchEvent(events.Event('requestPREVRECORD')),
!                          self.mainWindow,
!                          -1)
!     toolbar.insert_stock('NEXT_RECORD',
!                          _("next record"),
!                          None,
!                          lambda button,window,l=self: 
l.dispatchEvent(events.Event('requestNEXTRECORD')),
!                          self.mainWindow,
!                          -1)
!     toolbar.insert_stock('LAST_RECORD',
!                          _("last record"),
!                          None,
!                          lambda button,window,l=self: 
l.dispatchEvent(events.Event('requestLASTRECORD')),
!                          self.mainWindow,
!                          -1)
!     toolbar.insert_stock('JUMP_TO_RECORD',
!                          _("jump to record"),
!                          None,
!                          lambda button ,window:_PROMPTFORRECORD(),
!                          self.mainWindow,
!                          -1)
!     toolbar.insert_stock('PREPARE_QUERY',
!                          _("prepare a query"),
!                          None,
!                          lambda button,window,l=self: 
l.dispatchEvent(events.Event('requestENTERQUERY')),
!                          self.mainWindow,
!                          -1)
!     toolbar.insert_stock('EXECUTE_QUERY',
!                          _("execute query"),
!                          None,
!                          lambda button,window,l=self: 
l.dispatchEvent(events.Event('requestEXECQUERY')),
!                          self.mainWindow,
!                          -1)
!     toolbar.insert_stock('CLEAR_FORM',
!                          _("clear data"),
!                          None ,
!                          lambda 
button,window,l=self:l.dispatchEvent(events.Event('requestROLLBACK')),
!                          self.mainWindow,
!                          -1)
! 
! 
!     toolbar.insert_stock('EXIT_FORM',
!                          _("exit"),
!                          None,
!                          lambda button,window,l=self:l.menuExitEvent(),
!                          self.mainWindow,
!                          -1)
! #toolbar :A GtkToolbar
! #stock_id :The id of the stock item you want to insert
! #tooltip_text :The text in the tooltip of the toolbar button
! #tooltip_private_text :The private text of the tooltip
! #callback :The callback called when the toolbar button is clicked.
! #user_data :user data passed to callback
! #position :The position the button shall be inserted at. -1 means at the end.
! #Returns :the inserted widget
! 
!     table.attach(toolbar,0,1,1,2,gtk.EXPAND |gtk.FILL,0,0,0)
! 
!     main_frame=gtk.Frame()
!     table.attach(main_frame,0,1,2,3,gtk.EXPAND|gtk.FILL,0,0,0)
!     self.currentWidget=[main_frame]
!     #$self.mainWindow.set_default_size(200,200)
!     self.mainWindow.show_all()
!     return 1
! 
! 
  
  
  
-   #############################################################
-   #        FUNCTION ACTIVATE FORM...
-   #############################################################
- 
- 
- 
-   def activateForm(self, form):
-     self.mainWindow.set_title(str(self._form.title))
-     
-  
    
#############################################################################
    #
    # Private UIBase support functions
--- 69,130 ----
  # The public interface to the User Interface
  # All UIs must provide this class
  #
! class GFUserInterface(commonToolkit.GFUserInterface):
    def __init__(self, eventController, disableSplash = None):
+     commonToolkit.GFUserInterface.__init__(self,eventController,disableSplash)
+     self._disabledColour = gtk.gdk.color_parse("light_grey")
  
  
!   def initialize(self):
!     ################################################################
!     # GTK Specifics
!     ################################################################
!     #self._gtkapp = getGTKApp()
  
      #
!     # SplashScreen
      #
!     if not self._disableSplash:
!       pass
! #      self.splash = UISplashScreen()
! #      self.splash.Show()
  
      #
!     # Create a dummy window used to compute sizes
      #
! #    dummyWindow = wxFrame(NULL, -1, "", wxDefaultPosition)
  
! #    panel = wxPanel(dummyWindow, -1)
!     self._disabledColour = 0 # panel.GetBackgroundColour()
  
+     #self.mono_font = pango.FontDescription('monospace 12')
+     #gtk.Window().
      #
      # Find the max size of printable characters
      #  used to setup the grid
      #
      maxWidth, maxHeight, maxDescent, maxLeading = [0,0,0,0]
      checkchars = string.printable
      for letter in checkchars:
+       # width,height,descent,leading = dummyWindow.GetFullTextExtent(letter)
+       # TODO: use gtk2 function instead
        width,height,descent,leading =9,15,3,0
        maxWidth = max(maxWidth,width)
        maxHeight = max(maxHeight,height)
        maxDescent = max(maxDescent,descent)
        maxLeading = max(maxLeading,leading)
  
!     self.textWidth    = int(maxWidth+maxLeading)  # The pixel width of text 
inside a widget
!     self.textHeight   = int(maxHeight+maxDescent) # The pixel height of text 
inside a widget
!     self.widgetWidth  = self.textWidth            # The pixel width of a 1 
char widget (for things like buttons)
!     self.widgetHeight = self.textHeight + 3       # The pixel height of a 1 
char widget (for things like buttons)
  
+     #
+     # Close dummy window so app doesn't hang when all other windows closed
+     #
+     #dummyWindow.Close()
  
  
    
#############################################################################
    #
    # Private UIBase support functions
***************
*** 564,633 ****
    #
    # Tells the application to close it's main window
    #
!   def _exit(self):
!     self.mainWindow.destroy()
!     gtk.main_quit()
! 
!   #
!   # _setStatusBar
!   #
!   def _setStatusBar(self,tip, statusValue, insertValue, currentRecord, 
maxRecord, currentPage, maxPage):
! 
!     if tip != None:
!       self.statusBar1.push(self.statusBar1.get_context_id("tip"),str(tip))
!     #$self.statusBar.push(self.statusBar.get_context_id("status bar"),"Shri 
Harih")
!     #$self.statusBar.get_context_id("")
!     if statusValue:
!       context_id=self.statusBar2.get_context_id("statusValue")
!       self.statusBar2.push(context_id,statusValue)
!     if insertValue:
!       context_id=self.statusBar3.get_context_id("insertValue")
!       self.statusBar3.push(context_id,insertValue)
!       #$self.statusBar.SetStatusText(insertValue,2)
!     if currentRecord and  maxRecord:
!       context_id=self.statusBar4.get_context_id("currentRecord_and_maxRecord")
!       messg="%s/%s" %(currentRecord,maxRecord)
!       self.statusBar4.push(context_id,messg)
!       #$self.statusBar.SetStatusText(string.strip("%s/%s" % 
(currentRecord,maxRecord)),3)
!     if currentPage and  maxPage:
!       context_id=self.statusBar5.get_context_id("currentPage_and_maxPage")
!       messg="%s/%s"%(currentPage,maxPage)
!       self.statusBar5.push(context_id,messg)
! 
!     None
! 
! 
!     #
!     # Adjust the status fields to reflect width of text in them
!     #
!     # This is a hack
!     #
!     #$tipWidth = -1 # Fill whatever remains
!     #$statusWidth,unused = 
self.statusBar.GetTextExtent(self.statusBar.GetStatusText(1))
!     #$insertWidth,unused = 
self.statusBar.GetTextExtent(self.statusBar.GetStatusText(2))
!     #$recordWidth,unused = 
self.statusBar.GetTextExtent(self.statusBar.GetStatusText(3))
!     #$pageWidth,unused = 
self.statusBar.GetTextExtent(self.statusBar.GetStatusText(4))
! 
!     # Either double the width if it's set or default to 5
!     #$statusWidth = statusWidth and (statusWidth * 2) or 5
!     #$insertWidth = insertWidth and (insertWidth * 2) or 5
!     #$recordWidth = recordWidth and (recordWidth * 2) or 5
!     #$pageWidth   = pageWidth   and (pageWidth   * 2) or 5
! 
!     
#$self.statusBar.SetStatusWidths([tipWidth,statusWidth,insertWidth,recordWidth,pageWidth])
! 
! 
! 
! 
! 
  
    
#############################################################################
    #
    # Incoming Event Processors
    #
    # Processes the incoming events from other objects
!   #
! 
    #
    # mainLoop
    #
--- 138,167 ----
    #
    # Tells the application to close it's main window
    #
!   def _exit(self,formName):
!     exitApp = 1    
!     for child in self._children:
!       if child._form.name == formName:
!         child.mainWindow.hide()
! 
!       #exitApp = exitApp and not child.mainWindow.visible
! 
!     if exitApp:
!       for child in self._children:
!         child.mainWindow.destroy()
!       gtk.main_quit()
! 
!   def _beep(self):
!     # wxBell()
!     pass
  
    
#############################################################################
    #
    # Incoming Event Processors
    #
    # Processes the incoming events from other objects
!   # From here down should be nothing but eventListeners listed
!   
    #
    # mainLoop
    #
***************
*** 635,666 ****
    # fully activated
    #
    def mainLoop(self):
!     gtk.main() # simply call the wxApp's MainLoop method
! 
! 
! 
! 
! 
! 
!   #
!   # gotoPage
!   #
!   # makes the requested page visible on the screen
!   #
! 
!   def gotoPage(self, event):
! 
!     if not _NOTEBOOK:
!       self.visiblePage = self._formToUI[event.data][0]
!       
self.visiblePage.set_size_request(self._form._layout.Char__width*self.widgetWidth,
!                                       
(self._form._layout.Char__height+self.menu_sb_space)*self.widgetHeight)
!     else:
!       self.visiblePage = self._formToUI[event.data][0]
! 
! 
!     self.visiblePage.show_all()
! 
! 
  
  
    #
--- 169,182 ----
    # fully activated
    #
    def mainLoop(self):
!     global __gtk_mainloop
!     try:
!       if __gtk_mainloop==None:
!         __gtk_mainloop= 1
!         gtk.main()
!     except:
!       __gtk_mainloop= 1
!       gtk.main()
  
  
    #
***************
*** 671,681 ****
    #
    def formAlert(self, event):
      #wxBell()
!     #self._setStatusBar(event.data,0)
      
self.statusBar1.push(self.statusBar1.get_context_id("tip"),str(event.data))
-    
- 
- 
  
  
    #
--- 187,195 ----
    #
    def formAlert(self, event):
      #wxBell()
!     #ui = self._gfObjToUIWidget[event._form]
!     #ui.statusBar.SetStatusText(event.data,0)
      
self.statusBar1.push(self.statusBar1.get_context_id("tip"),str(event.data))
  
  
    #
***************
*** 684,707 ****
    #
    def beginWait (self, event):
      self.cursor= gtk.gdk.Cursor(gtk.gdk.WATCH)
-     #$print "i am in beginWait"
      GDebug.printMesg(2, "i am in beginWait")
-     #$self.cursor.ref()
- 
- 
- 
  
    #
    # Called whenever forms leaves a "wait" state
    #
    def endWait (self, event):
!     #$print "i am in end wait"
      GDebug.printMesg(2, "i am in endWait")
-     #$self.cursor.unref()
-     None
- 
- 
- 
  
  
    #
--- 198,211 ----
    #
    def beginWait (self, event):
      self.cursor= gtk.gdk.Cursor(gtk.gdk.WATCH)
      GDebug.printMesg(2, "i am in beginWait")
  
    #
    # Called whenever forms leaves a "wait" state
    #
    def endWait (self, event):
!     self.cursor= gtk.gdk.Cursor(gtk.gdk.WATCH)
      GDebug.printMesg(2, "i am in endWait")
  
  
    #
***************
*** 731,738 ****
      event.__result__ = value
  
  
- 
- 
    def setClipboardContents(self, event):
  
      GDebug.printMesg(5,"Setting clipboard '%s'" % event.text)
--- 235,240 ----
***************
*** 746,754 ****
        GDebug.printMesg(5,'Unable to open clipboard for write')
  
  
- 
- 
- 
    
#############################################################################
    #
    # Internal Event Processors
--- 248,253 ----
***************
*** 756,1603 ****
    # Processes the events from the widget set
    #
  
-   #
-   # windowExitEvent
-   #
-   # Catches the Exit event from the menu and make sure it closes in such a 
way to
-   # trigger the closeTrap method
-   #
-   def windowExitEvent(self,*args):
-    self.dispatchEvent(events.Event('requestEXIT'))
-    return gtk.TRUE
- 
-   #
-   # menuExitEvent
-   #
-   # Catches the Exit event from the menu and make sure it closes in such a 
way to
-   # trigger the closeTrap method
-   #
-   def menuExitEvent(self):
-    self.dispatchEvent(events.Event('requestEXIT'))
  
  
    #
!   # promptForRecordNumber
    #
!   # Presents a dialog to user asking for the record number to jump to
!   #
!   def promptForRecordNumber(self, event= None):
!     dlg =gtk.Dialog(_("Which 
record"),self.mainWindow,gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, \
!                                            (_("_JUMP"),  
gtk.RESPONSE_OK,_("_CANCEL"),gtk.RESPONSE_CANCEL ))
! 
!     label=gtk.Label(_("Enter record number to jump to"))
!     entry=gtk.Entry()
!     table=gtk.Table(2,1)
!     table.attach_defaults(label,0,1,0,1)
!     table.attach_defaults(entry,0,1,1,2)
!     dlg.vbox.pack_start(table, gtk.TRUE, gtk.TRUE, 0)
!     dlg.show_all()
! 
! 
!     response=dlg.run()
!     if response==gtk.RESPONSE_OK: 
!       action = self.dispatchEvent(events.Event('requestRECORDNUMBER', 
entry.get_text()))
      else:
!       action = None
! 
!     dlg.destroy()
!     return action
! 
! 
! 
! 
! 
! #############################################################################
! #############################################################################
! #
! # UI Objects
! #
! # A set of standard UI objects that allow us to move more code into UIbase
! # These map generic functionality to the specific UI widget set in use by
! # this driver.
! #
! #############################################################################
! #############################################################################
! 
! #
! # UIHelper
! #
! # Provides a UI widget set of std functions to reduce the number of functions
! # require in each UIclass listed below
! 
! 
! 
! class UIHelper(UIWidget):
!   def showModal(self):
!     #$self.ShowModal()
!     None
! 
!   def show(self, flag=1):
!     self.Show(flag)
! 
!   def destroy(self):
!     #$self.destroy()
!     None
! 
!   def indexedFocus(self, index):
!     if self.widgets[index].get_name()=='GtkCombo':
!       self.widgets[index].entry.grab_focus()
!     else:
!       self.widgets[index].grab_focus()
!       
!   def setValue(self, value, index=0, enabled=1):
!     # These must be here or dropdown style controls
!     # will get events they shouldn't and break.
!     #$self.widgets[index].SetEvtHandlerEnabled(FALSE
!     #$print self.widgets[index].get_name()
!     #$print value
! 
!     if self.widgets[index].get_name()=='GtkCombo':
!       self.widgets[index].entry.set_text(value)
!     elif self.widgets[index].get_name()=='GtkTextView':
!       self.widgets[index].get_buffer().set_text(value)
!     elif self.widgets[index].get_name()=='GtkCheckButton':
!       self.widgets[index].set_active(value)
!     else:
!       self.widgets[index].set_text(value)
! 
! 
!   def setCursorPosition(self, position, index=0):
!     try:
!       self.widgets[index].set_position(position)
!     except AttributeError:
!       pass  # For label-style entries
! 
!   def setSelectedArea(self, selection1, selection2, index=0):
!     try:
!       self.widgets[index].SetSelection(selection1, selection2)
!     except (AttributeError, TypeError):
!       pass  # For label-style & dropdown entries
! 
! 
!   def _addToCrossRef(self, widget,gfobject, uiobject):
!     _WidgetToGFObj[widget]=gfobject
!     _WidgetToUIObj[widget]=uiobject
! 
!   def _deleteFromCrossRef(self, widget, object):
!     try:
!       del _WidgetToGFObj[widget]
!       del _WidgetToUIObj[widget]
!     except:
!       pass
! 
! 
!   def createWidget(self, event, spacer):
!     newWidget = self._createWidget(event, spacer)
!     #$initFont(newWidget)
!     self._addToCrossRef(newWidget, event.object, self)
!     return newWidget
! 
! 
!   def cleanup(self, object):
!     for widget in self.widgets[:]:
!       del _WidgetToGFObj[widget]
!       del _WidgetToUIObj[widget]
!       self.widgets.pop(0)
!       self._deleteFromCrossRef(widget, object)
! 
! 
! 
! 
! 
! 
! 
! 
! #
! # UILabel
! #
! # Widget set specific function that creates a single instance of a label
! #
! 
! 
! class UILabel(UIHelper):
!   alignmentStyle = { 'left'  : gtk.JUSTIFY_LEFT,
!                      'center': gtk.JUSTIFY_CENTER,
!                      'right' : gtk.JUSTIFY_RIGHT,
!                    }
! 
!   def _createWidget(self, event, spacer):
!     object = event.object
! 
!     newWidget = gtk.Label(str(object.text))
!     newWidget.set_size_request(self.itemWidth, self.itemHeight)
!     event.container.put(newWidget, object.Char__x * event.widgetWidth,
!       (object.Char__y + spacer + (spacer * object._gap)) * event.widgetHeight)
!     newWidget.set_justify(self.alignmentStyle[object.alignment])
!     event.container.show_all()
!     return newWidget
! 
! 
! 
! 
! 
! 
! 
! #
! # UIBox
! #
! # Widget set specific function that creates a single instance of a border box
! #
! class UIBox(UIHelper):
!   def _createWidget(self, event, spacer):
!     #$print "inside UIBOX"
!     GDebug.printMesg(1, "inside UIBOX")
!     return None
! 
! 
! #
! # UIScrollBar
! #
! # Widget set specific function that creates a single instance of a scroll bar 
used
! # to navigate multiple records
! #
! class UIScrollBar(UIHelper):
!   def _createWidget(self, event, spacer):
!     object = event.object
! 
!     #$print 
object.Char__height*widgetHeight,(object.Char__y+spacer)*widgetHeight
!     GDebug.printMesg(2, "size #1: " + str(object.Char__height * 
event.widgetHeight) +
!       ", " +str((object.Char__y + spacer) * event.widgetHeight))
!     adjustment = gtk.Adjustment(70,500,80,2,3,80)
!     newWidget = gtk.VScrollbar(adjustment)
!     newWidget.set_size_request(object.Char__width * event.widgetWidth,
!       object.Char__height * event.widgetHeight)
!     event.container.put(newWidget,600,60)
!     #$print object.Char__x*widgetWidth,(object.Char__y+spacer)*widgetHeight
!     GDebug.printMesg(2, "size #2: " + str(object.Char__x * event.widgetWidth) 
+ 
!       ", " + str((object.Char__y + spacer) * event.widgetHeight))
!     event.container.show_all()
!     #$print "i am in UIScrollBar"
!     GDebug.printMesg(1, "i am in UIScrollBar")
!     return newWidget
! 
! 
! 
! 
! 
! 
! #
! # UIButton
! #
! # Widget set specific function that creates a single instance of a button
! #
! class UIButton(UIHelper):
!   def _createWidget(self, event, spacer):
!     object = event.object
! 
!     newWidget = gtk.Button(str(object.label))
!     newWidget.set_size_request(object.Char__x * event.widgetWidth,
!       (object.Char__y + spacer) * event.widgetHeight)
!     event.container.put(newWidget, object.Char__x * event.widgetWidth,
!       (object.Char__y + spacer) * event.widgetHeight)
!     if event.initialize:
!       newWidget.connect('clicked', self.buttonHandler, newWidget)
!       #_setDefaultEventHandlers(newWidget,initialize)
! 
!     return newWidget
! 
!   def buttonHandler(self,event,newWidget):
!     action = None
!     gfObject  = _WidgetToGFObj[newWidget]
!     action = events.Event('buttonActivated',gfObject)
! 
!     if action:
!       _EVENTPROCESSOR(action)
! 
! 
! 
! 
! 
! 
! #
! # UIPage
! #
! # Widget set specific function that creates a single instance of a page
! #
! # Note: The event trap for changing notebook pages is attached to the UIForm
! #
! class UIPage(UIHelper):
!   def _createWidget(self, event, spacer):
!     if _NOTEBOOK:
!       newWidget = gtk.Fixed()
!       tab_label=gtk.Label(event.object.name)
!       _NOTEBOOK.append_page(newWidget, tab_label)
!     else:
!       newWidget = gtk.Fixed()
!       _SINGLEPAGE.add(newWidget)
! 
!     #$_setDefaultEventHandlers(newWidget,initialize)
! 
!     event.interface._pageList.append(newWidget)
!     return newWidget
! 
! 
! 
! 
! 
! 
! 
! 
! #
! # UIEntry
! #
! # Widget set specific function that creates a single instance of a data entry 
widget
! #
! 
! class UIEntry(UIHelper):
!   def _createWidget(self, event, spacer):
!     object = event.object
!     style = object.style
! 
!     if style == 'dropdown':
!       if event.initialize:
!         self.choices = object._field.allowedValues()[1]
!       else:
!         self.choices = [""]
! 
!       self.choices.sort()
!       newWidget = gtk.Combo()
!       newWidget.set_popdown_strings(self.choices)
!       newWidget.set_size_request(self.itemWidth, self.itemHeight)
!       event.container.put(newWidget, object.Char__x * event.widgetWidth,
!         (object.Char__y + spacer + (object._gap * spacer)) * 
event.widgetHeight)
!       newWidget.list.connect('select-child', self.comboHandler, newWidget)
! 
!       #$print self.comboHandlerID
!       _setDefaultEventHandlers(newWidget.entry, event.initialize, newWidget)
!       _setDefaultEventHandlers(newWidget.list, event.initialize, newWidget)
! 
!     elif style == 'label':
!       newWidget = gtk.Label("")
!       newWidget.set_size_request(self.itemWidth, self.itemHeight + 1)
!       event.container.put(newWidget, object.Char__x * event.widgetWidth,
!         (object.Char__y + spacer + (object._gap * spacer)) * 
event.widgetHeight)
!       _setDefaultEventHandlers(newWidget, event.initialize, newWidget)
! 
!     elif style == 'checkbox':
!       newWidget = gtk.CheckButton()
!       newWidget.set_size_request(2 * event.textWidth, event.textHeight)
!       event.container.put(newWidget, object.Char__x * event.widgetWidth,
!         (object.Char__y + spacer + (object._gap * spacer)) * 
event.widgetHeight)
!       newWidget.connect('toggled', self.checkboxHandler, newWidget)
! 
!       #$_setDefaultEventHandlers(newWidget,initialize,newWidget)
! 
!     else: # Normal text box
!       value=""
!       #$textTagTable=gtk.TextTagTable()
!       #$textBuffer=gtk.TextBuffer(textTagTable)
!       #$newWidget=gtk.TextView()
!       #$newWidget.set_buffer(textBuffer)
!       #$textBuffer.set_text(value)
!       newWidget=gtk.Entry()
!       newWidget.set_size_request(self.itemWidth, self.itemHeight+1)
!       event.container.put(newWidget, object.Char__x * event.widgetWidth,
!         (object.Char__y + spacer + (object._gap * spacer)) * 
event.widgetHeight)
!       _setDefaultEventHandlers(newWidget, event.initialize, newWidget)
! 
!     event.container.show_all()
!     return newWidget
! 
! 
!   def comboHandler(self, combo_list, list_child, combo):
!     selection = combo_list.child_position(list_child)
!     selected_text = self.choices[selection]
! 
!     gfObject = _WidgetToGFObj[combo]
!     eventdata = [gfObject, selected_text]
!     action = 
events.Event('requestREPLACEVALUE',object=gfObject,index=selection,
!                            text=selected_text)
!     _EVENTPROCESSOR(action)
!     #$ to ensure default handler does not get called after this
!     return 1
! 
! 
! 
! 
!   def checkboxHandler(self,event,newWidget):
!     buttonStatus=newWidget.get_active()
!     #$print "buttonstatus"
!     #$print buttonStatus
!     GDebug.printMesg(1, "buttonStatus: " + str(buttonStatus))
!     _EVENTPROCESSOR(events.Event('requestTOGGLECHKBOX',buttonStatus))
!     return 1
! 
! 
! 
! 
! #
! # UIForm
! #
! # Widget set specific function that creates a single instance of a Form widget
! #
! class UIForm(UIHelper):
!   tabStyles = {'left':gtk.POS_LEFT,
!                'right':gtk.POS_RIGHT,
!                'bottom':gtk.POS_BOTTOM,
!                'top':gtk.POS_TOP,
!               }
! 
!   def _createWidget(self, event, spacer):
!     global _NOTEBOOK, _SINGLEPAGE
! 
!     if event.object._layout:
!       tabstyle = self.tabStyles[event.object._layout.tabbed]
!       newWidget = gtk.Notebook()
!       newWidget.set_tab_pos(tabstyle)
!       event.interface.currentWidget[0].add(newWidget)
!       newWidget.connect('switch-page', self.notebookTabHandler, newWidget)
!       newWidget.show_all()
!       _NOTEBOOK  = newWidget
! 
!     else:
!       newWidget = gtk.Frame()
!       event.interface.currentWidget[0].add(newWidget)
!       newWidget.show_all()
!       _SINGLEPAGE=newWidget
! 
! #    if event.initialize:
! #      event.interface.mainWindow.connect('destroy', 
event.interface.closeTrap)
! 
!     return newWidget
! 
! 
! 
!   def notebookTabHandler(self,notebook,notebookpage,pagenumber,userdata):
!     action = None
!     global _LOOPTRAP
!     #$global count
!     #$print "inside notebookTabHandler"
!     #$print count
!     #$count=count+1     
! 
!     if _LOOPTRAP == 0:
!       action = events.Event('requestPAGE',pagenumber)
!       _EVENTPROCESSOR(action)
! 
! 
! 
! 
! 
! 
! 
! #####################################################################
! ##
! ##               Required Dialog box support
! ##
! #####################################################################
! 
! #
! # UIAbout
! #
! # A dialog box providing about info
! #
! class UIAbout(UIHelper):
!   def __init__(self, interface, programVersion, formName, formVersion, 
author, description):
!     text = _("GNUE Forms")+"\n"+      \
!     _("  Version : ")+"%s\n"+         \
!     _("  Driver  : UIwxpython")+"\n"+ \
!     _("-= Form Info =-")+"\n"+        \
!     _("  Name   : ")+"%s\n"+          \
!     _("  Version: ")+"%s\n"+          \
!     _("  Author : ")+"%s\n"+          \
!     _("  Description:")+"%s\n"                                                
                                                                                
                                              
!     gtkMessageDialog = gtk.MessageDialog(interface, \
!                              gtk.DIALOG_DESTROY_WITH_PARENT,\
!                              gtk.MESSAGE_INFO, gtk.BUTTONS_OK,\
!                              text % (programVersion, formName 
,formVersion,author,description))
!     gtkMessageDialog.show_all()
!     gtkMessageDialog.connect('response',lambda dialog, response: 
gtkMessageDialog.destroy())
! 
! 
! #
! # UImessageBox
! #
! # A dialog box providing basic message info
! #
! class UIMessageBox(UIHelper):
!   def __init__(self, interface, message, caption):
!     message = lineWrap(message,60)
!     
gtkMessageDialog=gtk.MessageDialog(interface,gtk.DIALOG_DESTROY_WITH_PARENT,gtk.MESSAGE_INFO,gtk.BUTTONS_OK,
 message)
!     gtkMessageDialog.show_all()
!     gtkMessageDialog.connect('response',lambda dialog, response: 
gtkMessageDialog.destroy())
! 
! 
! #####################################################################
! ##
! ## Keymapper Support
! ##
! #####################################################################
! from gnue.forms.GFKeyMapper import vk
! 
! # Translate from wx keystrokes to our virtual keystrokes
! gtkKeyTranslations = {
!    vk.F1     :gtk.keysyms.F1,        vk.F2        :gtk.keysyms.F2,
!    vk.F3     :gtk.keysyms.F3,        vk.F4        :gtk.keysyms.F4,
!    vk.F5     :gtk.keysyms.F5,        vk.F6        :gtk.keysyms.F6,
!    vk.F7     :gtk.keysyms.F7,        vk.F8        :gtk.keysyms.F8,
!    vk.F9     :gtk.keysyms.F9,        vk.F10       :gtk.keysyms.F10,
!    vk.F11    :gtk.keysyms.F11,       vk.F12       :gtk.keysyms.F12,
!    vk.INSERT :gtk.keysyms.Insert,    vk.DELETE    :gtk.keysyms.Delete,
!    vk.HOME   :gtk.keysyms.Home,      vk.END       :gtk.keysyms.End,
!    vk.PAGEUP :gtk.keysyms.Prior,     vk.PAGEDOWN  :gtk.keysyms.Next,
!    vk.UP     :gtk.keysyms.Up,        vk.DOWN      :gtk.keysyms.Down,
!    vk.LEFT   :gtk.keysyms.Left,      vk.RIGHT     :gtk.keysyms.Right,
!    vk.TAB    :gtk.keysyms.Tab,
!    vk.ENTER  :gtk.keysyms.Return,    vk.BACKSPACE :gtk.keysyms.BackSpace }
! 
! GFKeyMapper.KeyMapper.setUIKeyMap(gtkKeyTranslations)
! 
! 
! 
! 
! 
! ####################################################################
! #                                                                #
! #                  Basic Event Processing                          #
! #                                                                #
! ####################################################################
! 
! def _setDefaultEventHandlers(newWidget, initialize, main_widget):
!   global _EVENTPROCESSOR
!   if initialize:
!     # TODO: this should use one instance
!     
newWidget.connect('button-press-event',_handleButtonPressEvent,main_widget)
!     newWidget.connect('key-press-event',_handleKeyPressEvent,main_widget)
!     #$newWidget.connect('toggled',_handleButtonPressEvent,main_widget)
! 
! 
! def _handleButtonPressEvent(widget, event, main_widget):
!   global _EVENTPROCESSOR
!   global _charWidth
!   #$ compute the location of the character in the widget
!   x = event.x
!   cursorPosition = x/_charWidth
! 
!   gfObject = _WidgetToGFObj[main_widget]
!   count    = _WidgetToUIObj[main_widget].widgets.index(main_widget)
!   _EVENTPROCESSOR(events.Event('requestFOCUS',gfObject))
!   _EVENTPROCESSOR(events.Event('requestJUMPRECORD',count - 
gfObject._visibleIndex))
!   _EVENTPROCESSOR(events.Event('requestCURSORMOVE',position=0))
! 
!   #$ do not allow the default handler to be called
!   return 1
! 
! def _handleKeyPressEvent(widget, event, main_widget):
!   global _EVENTPROCESSOR
! 
!   action = None
!   shift_mask=0
!   ctrl_mask=0
!   alt_mask=0
! 
!   keycode = event.keyval
!   if event.state == gtk.gdk.SHIFT_MASK:
!     shift_mask=1
!   elif event.state == gtk.gdk.CONTROL_MASK:
!     ctrl_mask=1
!   elif event.state == gtk.gdk.MOD1_MASK:
!     alt_mask=1
! 
!   #
!   # Sigh... a hack for using <enter> in multiline entries
!   #
!   if  keycode == 13 and \
!       not shift_mask and \
!       not ctrl_mask and \
!       not alt_mask and \
!       int (gConfig('enterIsNewLine')) and \
!       _WidgetToGFObj[main_widget].height > 1:
! 
!     command = 'NEWLINE'
! 
!   else:
! 
!     #
!     # Get the event to process from the KeyMapper
!     #
!     command = GFKeyMapper.KeyMapper.getEvent(
!       keycode,
!       shift_mask,
!       ctrl_mask,
!       alt_mask)
! 
!   if command == 'JUMPRECORD':
!     global _PROMPTFORRECORD
!     action = _PROMPTFORRECORD()
! 
!   elif command == 'NEWLINE':
!     action = events.Event('requestKEYPRESS', '\n',
!                   text='\n',
!                   code=10)
! 
!   elif command:
!     action = events.Event('request%s' % command)
! 
!   else:
!     try:
!       #$ string will be multibyte for Hindi input
!       international_string = event.string
!       #$ if it is only a single byte do standard checking
!       if (len(international_string)==1 and \
!             (international_string in string.printable or \
!              international_string == "\n" or 128 <= keycode <= 255)) \
!          or \
!          (len(international_string) > 1): #$ if it is multibyte, send it too
!         action = events.Event('requestKEYPRESS', international_string,
!                       text=international_string,
!                       code=keycode)
!     except ValueError:
!       pass #event.Skip()
! 
!   if action:
!     _EVENTPROCESSOR(action)
! 
!   #$ do not allow the default handler to be called
!   return 1
! 
! 
! 
! 
! #####################################################################
! ##
! ## Login Support
! ##
! #####################################################################
! 
! #
! # UILoginHandler
! #
! 
! 
! class UILoginHandler(GLoginHandler.LoginHandler):
!   def __init__(self):
!     global loginWindow
!     loginWindow=gtk.Window()
!     loginWindow.set_title(_("LOGIN WINDOW"))
!     loginWindow.set_border_width(8)
!     #$loginWindow.connect('destroy', lambda win: gtk.main_quit())
!     self.dlg = None
! 
! 
! 
! 
!   def getLogin(self, loginData, errortext=None):#"Invalid username/password"):
!     if 1: # TODO: This is left here to prevent me from having to unindent 
this code
!           # TODO: Since the UI stuff is currently being gutted I'm not 
wasting the time
!           # TODO: to do the right thing
!       if len(loginData[1]):
!         loginMesg = _('Login required for\n"%s"') % (loginData[1])
!       else:
!         loginMesg = _('Login required for %s') % (loginData[0])
!       self.dlg = gtk.Dialog(_("GNU Enterprise: Login to %s") % loginData[0], 
loginWindow,
!         gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
!         (_("_LOGIN"), gtk.RESPONSE_OK,_("_CANCEL"), gtk.RESPONSE_CANCEL))
! 
!       table1 = gtk.Table(len(loginData[2])+10, 6) # row, column
!       table1.set_row_spacings(4)
!       table1.set_col_spacings(4)
!       bmp = gtk.Image()
!       if os.path.isabs(gConfigForms('loginPNG')):
!         imageFile = gConfigForms('loginPNG')
!       else:
!         imageFile = images_dir+gConfigForms('loginPNG')
! 
!       bmp.set_from_file(imageFile)
! 
!       messageField = gtk.Label(str(loginMesg))
!       # left, right, top, bottom
!       table1.attach_defaults(bmp,1,3,0,1)
!       table1.attach_defaults(messageField,1,3,2,3)
! 
!       self.textEntryList = []
!       labelList = []
! 
!       xSpacing = 0
!       ySpacing = 0
!       fieldLabelWidth = 0
! 
!       raghav=gtk.Entry()
!       raghav.set_visibility(0)
! 
!       for prompt in loginData[2]:
!         s = gtk.Label('%s:' % prompt[1])
!         s.set_use_underline(gtk.TRUE)
!         labelList.append(s)
!         if prompt[2]:
!           t = gtk.Entry()
!           t.set_visibility(0)
!         else:
!           t = gtk.Entry()
! 
!         myID = len(self.textEntryList)
!         self.textEntryList.append(t)
!         #$EVT_CHAR(t, LoginFieldHandler(self, myID).loginFieldEventTrap)
! 
!         #$fieldLabelWidth = max(fieldLabelWidth,
!                   #$s.GetSize().GetWidth() + t.GetSize().GetWidth() + 10)
! 
!         #$dlgWidth = max(dlgWidth, \
!                        #$s.GetSize().GetWidth() + t.GetSize().GetWidth() + 20)
! 
!         #$xSpacing = max(xSpacing, s.GetSize().GetWidth())
!         #$ySpacing = max(ySpacing, s.GetSize().GetHeight())
!         #$ySpacing = max(ySpacing, t.GetSize().GetHeight())
! 
! 
!       #$loginId = wxNewId()
!       #$cancelId = wxNewId()
! 
! 
!       #$dlgWidth = max(dlgWidth, loginButton.GetSize().GetWidth() +
!                             #$cancelButton.GetSize().GetWidth() + 6) + 20
! 
!       #$dlgHeight += max(loginButton.GetSize().GetHeight(),
!                        #$cancelButton.GetSize().GetHeight()) - 6
! 
!       #$if errortext:
!         #$errorField = WrappedStaticText(self.dlg, -1, str(errortext), 300,
!                                        #$style=wxALIGN_CENTER)
!         #$errorField.SetForegroundColour(wxColour(223,0,0))
! 
!         #$dlgWidth = max(dlgWidth, errorField.GetSize().width+10)
!         #$dlgHeight += errorField.GetSize().height + 6
! 
! 
!       #$firstY = bmp.GetHeight() + messageField.GetSize().GetHeight() + 50
!       #$lastY = firstY
!       #$xSpacing += 10        # Add whitespace between widgets
!       #$ySpacing += 6 # Add whitespace between widgets
!       #$xPos = dlgWidth/2 - fieldLabelWidth/2
! 
!       num_rows=len(loginData[2])
!       # Move the fields and labels into position
!       for i in range(0, len(self.textEntryList)):
!        table1.attach_defaults(labelList[i],1,2,i+3,i+4)
!        table1.attach_defaults(self.textEntryList[i],2,3,i+3,i+4)
! 
!       if errortext:
!         errorField = gtk.Label(str(errortext))
!         t = len(self.textEntryList)
!         table1.attach_defaults(errorField,1,3,t+4,t+5)
! 
!        #$if errortext:
!         #$errorField.SetPosition(
!           #$wxPoint(dlgWidth/2 - errorField.GetSize().width/2,
!                 #$lastY+3))
! 
!       # Set the focus to the first text entry field
!       #$self.textctrlList[0].SetFocus()
! 
!       # Create and position the logo
!       #$wxStaticBitmap(self.dlg,-1, bmp,
!                      #$wxPoint((dlgWidth-bmp.GetWidth())/2, 12),
!                      #$wxSize(bmp.GetWidth(), bmp.GetHeight()))
! 
!       # Move the various widgets into position
!       #$messageField.SetPosition(
!         #$wxPoint(dlgWidth/2 - messageField.GetSize().GetWidth()/2,
!                 #$30 + bmp.GetHeight()))
! 
!       #$cancelButton.SetPosition(
!         #$wxPoint(dlgWidth - 10 - cancelButton.GetSize().GetWidth(),
!                 #$dlgHeight - 10 - max(loginButton.GetSize().GetHeight(),
!                                             
#$cancelButton.GetSize().GetHeight())))
!       #$loginButton.SetPosition(
!         #$wxPoint(dlgWidth - 16 - cancelButton.GetSize().GetWidth() - \
!                 #$loginButton.GetSize().GetWidth(),
!                 #$dlgHeight - 10 - max(loginButton.GetSize().GetHeight(),
!                                             
#$cancelButton.GetSize().GetHeight())))
! 
!       #$self.loginButton = loginButton
! 
!       #$self.dlg.SetSize(wxSize(dlgWidth, dlgHeight))
!       #$loginWindow.show_all()
!       #$gtk.main()
!       self.dlg.vbox.pack_start(table1, gtk.TRUE, gtk.TRUE, 0)
!       self.dlg.set_position(1)  #for center
!       self.dlg.show_all()
! 
!       response=self.dlg.run()
!       if response==gtk.RESPONSE_OK:
!         self.loginCompleted(1)
!       else:
!         self.loginCompleted(0)
!         raise GLoginHandler.UserCanceledLogin
! 
!     # To close this window when 'Login' is clicked
!     self.destroyLoginDialog()
!     rv = {}
!     for i in range(0, len(loginData[2])):
!       rv[loginData[2][i][0]] = self.textEntryList[i].get_text()
! 
!     return rv
! 
!   #
!   # Login is completed, for whatever reason
!   #
!   def loginCompleted(self, successful):
!     self._completed = successful
!     #$print "inside login completed"
!     GDebug.printMesg(1, "inside login completed")
!     #$self.dlg.EndModal(1)
! 
!   #
!   # Called when user clicks "login"
!   #
!   #$def loginButtonEventTrap(self, event):
!     #$self.loginCompleted(1)
!     #self.destroyLoginDialog() #this does not work
! 
!   #
!   # Called when user clicks "cancel"
!   #
!   #$def loginCancelEventTrap(self, event):
!     #$self.loginCompleted(0)
! 
!   #
!   # TODO: This is a hack required because windows
!   # TODO: seems to have issues with wxWindows dialogs
!   #
!   def destroyLoginDialog(self):
!     #$print "inside destroy login dialog"
!     GDebug.printMesg(1, "inside destroy login dialog")
!     self.dlg.destroy()
!     loginWindow.destroy()
!     #$self.dlg.Destroy()
! 
! #
! # LoginFieldHandler
! #
! # Used by the login handler
! # enables the user to press return and have it jump to the next box
! #
! #$class LoginFieldHandler:
!   #$def __init__(self, app, seq):
!     #$self.app = app
!     #$self.seq = seq
! 
!   #$def loginFieldEventTrap(self, event):
!      #$if event.KeyCode() in (WXK_RETURN, WXK_TAB):
!        #$if self.seq < len(self.app.textctrlList) - 1:
!          #$self.app.textctrlList[self.seq+1].SetFocus()
!        #$else:
!          #$if event.KeyCode() == WXK_TAB:
!            #$if event.ShiftDown():
!              #$self.app.textctrlList[self.seq-1].SetFocus()
!            #$else:
!              #$self.app.loginButton.SetFocus()
!          #$else:
!            #$self.app.loginCompleted(1)
!      #$else:
!       #$event.Skip()
! 
! # Shortcut
! images_dir = GConfig.getInstalledBase('forms_images','common_images') + '/'
! 
! 
--- 255,272 ----
    # Processes the events from the widget set
    #
  
  
  
    #
!   # closeTrap
    #
!   # intercepts the applications closure and generates an event to the form 
requesting
!   # closure.  Allows the form to control closure.  If the form approves it'll 
send
!   # back an event closing the application
!   #`
!   def closeTrap(self,event):
!     if event.CanVeto():
!       self.dispatchEvent('requestEXIT',_form=self._form)
      else:
!       event.object.Destroy()
!       # wxExit() TODO: Try and work this into navigator or here if it still 
hangs
Index: gnue/forms/src/uidrivers/gtk2/__init__.py
diff -c gnue/forms/src/uidrivers/gtk2/__init__.py:1.1 
gnue/forms/src/uidrivers/gtk2/__init__.py:1.2
*** gnue/forms/src/uidrivers/gtk2/__init__.py:1.1       Wed Aug 28 05:18:51 2002
--- gnue/forms/src/uidrivers/gtk2/__init__.py   Sat May 17 10:46:04 2003
***************
*** 1 ****
! from UIdriver import *
--- 1,3 ----
! from UIdriver import GFUserInterface
! from UILoginHandler import *
! from ErrorHandler import handleStartupError, handleUncaughtException




reply via email to

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