[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/forms/src/uidrivers/gtk2 UIdriver.py __ini...,
Jan Ischebeck <=