commit-gnue
[Top][All Lists]
Advanced

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

gnue/forms/src GFDisplayHandler.py GFInstance.p...


From: Jan Ischebeck
Subject: gnue/forms/src GFDisplayHandler.py GFInstance.p...
Date: Mon, 16 Jun 2003 17:32:30 -0400

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Branch:         
Changes by:     Jan Ischebeck <address@hidden>  03/06/16 17:32:30

Modified files:
        forms/src      : GFDisplayHandler.py GFInstance.py 
        forms/src/uidrivers/gtk2: UILoginHandler.py common.py 
        forms/src/uidrivers/gtk2/widgets: box.py button.py entry.py 
                                          _base.py 
        forms/src/uidrivers/gtk2/widgets/form: widget.py wrappers.py 

Log message:
        gtk2 uidriver updates:
        * add copyright header to common.py
        * Switch event system from key pressed/mouse clicked events to
        higher level (insert text/delete text) events.
        - add requestDELETERANGE and requestINSERTAT event types
        - move focus handling to _base.py
        - move insert/delete handling into entry.py
        - just leave basic keyboard overrides (connect_after) in common.py
        (TODO: add accelerator maps to allow use of global accelerators)
        * add unicode/textencoding fixes for 0.5.1
        (unicode is not internal encoding)
        * fix size of "Box" widget.
        * show login error messages in red (as in wx uidrv)
        * code cleanup + other minor fixes

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/GFDisplayHandler.py.diff?tr1=1.57&tr2=1.58&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/GFInstance.py.diff?tr1=1.113&tr2=1.114&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/UILoginHandler.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/common.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/box.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/button.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/entry.py.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/_base.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/form/widget.py.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/gtk2/widgets/form/wrappers.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text

Patches:
Index: gnue/forms/src/GFDisplayHandler.py
diff -c gnue/forms/src/GFDisplayHandler.py:1.57 
gnue/forms/src/GFDisplayHandler.py:1.58
*** gnue/forms/src/GFDisplayHandler.py:1.57     Wed Jun 11 21:00:09 2003
--- gnue/forms/src/GFDisplayHandler.py  Mon Jun 16 17:32:29 2003
***************
*** 243,249 ****
--- 243,263 ----
      self.modified = 1
      self._buildDisplay()
  
+   # Insert text at defined position
+   def insertTextAt(self, event):
+     # set cursor position
+     self.cursor = event.position
  
+     # add the event text
+     self.addText(event)
+ 
+   # Delete Text Range
+   def deleteRange(self, event):
+     self.selection1 = event.start_pos
+     self.selection2 = event.end_pos
+     self.cursor = event.position
+     self.delete(event)
+     
    # Delete backwards one character
    def backspace(self, event):
  
***************
*** 474,479 ****
--- 488,497 ----
                   'requestCOPY'         : self.clipboardCopy,
                   'requestCUT'          : self.clipboardCut,
                   'requestPASTE'        : self.clipboardPaste,
+ 
+                  # Request for direct buffer manipulation
+                  'requestINSERTAT'     : self.insertTextAt,
+                  'requestDELETERANGE'  : self.deleteRange,
          })
  
  
***************
*** 951,957 ****
      return im
      
  
! ############################################################################
  #
  # ComponentDiplayHandler
  #
--- 969,975 ----
      return im
      
  
! #############################################################################
  #
  # ComponentDiplayHandler
  #
***************
*** 960,964 ****
      FieldDisplayHandler.__init__(self, entry, eventHandler, None)
  
    def _buildDisplayHelper(self, value, editing):
!     if string.lower(self.entry.type) == 'url':
        return value
--- 978,982 ----
      FieldDisplayHandler.__init__(self, entry, eventHandler, None)
  
    def _buildDisplayHelper(self, value, editing):
!     if string.lower(self.entry.type) == 'url':    
        return value
Index: gnue/forms/src/GFInstance.py
diff -c gnue/forms/src/GFInstance.py:1.113 gnue/forms/src/GFInstance.py:1.114
*** gnue/forms/src/GFInstance.py:1.113  Thu May 22 16:11:02 2003
--- gnue/forms/src/GFInstance.py        Mon Jun 16 17:32:29 2003
***************
*** 119,124 ****
--- 119,126 ----
                             'requestTOGGLECHKBOX' : self.proxyEntryEvent,
                             'beginEDITMODE'       : self.proxyEntryEvent,
                             'endEDITMODE'         : self.proxyEntryEvent,
+                            'requestINSERTAT'     : self.proxyEntryEvent,
+                            'requestDELETERANGE'  : self.proxyEntryEvent,
  
                             # Selection/clipboard events (proxied)
                             'requestSELECTWITHMOUSE' : self.proxyEntryEvent,
Index: gnue/forms/src/uidrivers/gtk2/UILoginHandler.py
diff -c gnue/forms/src/uidrivers/gtk2/UILoginHandler.py:1.2 
gnue/forms/src/uidrivers/gtk2/UILoginHandler.py:1.3
*** gnue/forms/src/uidrivers/gtk2/UILoginHandler.py:1.2 Sun Jun  1 13:02:37 2003
--- gnue/forms/src/uidrivers/gtk2/UILoginHandler.py     Mon Jun 16 17:32:29 2003
***************
*** 114,119 ****
--- 114,123 ----
  
      if errortext:
        errorField = gtk.Label(str(errortext))
+       errorField.set_line_wrap(gtk.TRUE)
+       # Write in errortext in red
+       errorField.modify_fg(gtk.STATE_NORMAL,gtk.gdk.color_parse('red'))
+       
        t = len(self.textEntryList)
        table1.attach_defaults(errorField,1,3,t+4,t+5)
  
***************
*** 125,130 ****
--- 129,136 ----
      self.dlg.show_all()
  
      response=self.dlg.run()
+ 
+     self.dlg.destroy()
        
      if response==gtk.RESPONSE_OK:
        self.loginCompleted(1)
***************
*** 163,166 ****
        except IndexError:
          # for the last event in the list, trigger OK button
          self.dlg.response(gtk.RESPONSE_OK)
-         self.dlg.destroy()
--- 169,171 ----
Index: gnue/forms/src/uidrivers/gtk2/common.py
diff -c gnue/forms/src/uidrivers/gtk2/common.py:1.2 
gnue/forms/src/uidrivers/gtk2/common.py:1.3
*** gnue/forms/src/uidrivers/gtk2/common.py:1.2 Mon May 19 20:06:35 2003
--- gnue/forms/src/uidrivers/gtk2/common.py     Mon Jun 16 17:32:29 2003
***************
*** 1,3 ****
--- 1,34 ----
+ #
+ # This file is part of GNU Enterprise.
+ #
+ # GNU Enterprise is free software; you can redistribute it
+ # and/or modify it under the terms of the GNU General Public
+ # License as published by the Free Software Foundation; either
+ # version 2, or (at your option) any later version.
+ #
+ # GNU Enterprise is distributed in the hope that it will be
+ # useful, but WITHOUT ANY WARRANTY; without even the implied
+ # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ # PURPOSE. See the GNU General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public
+ # License along with program; see the file COPYING. If not,
+ # write to the Free Software Foundation, Inc., 59 Temple Place
+ # - Suite 330, Boston, MA 02111-1307, USA.
+ #
+ # Copyright 2000-2003 Free Software Foundation
+ #
+ # FILE:
+ # gtk2/common.py
+ #
+ # DESCRIPTION:
+ # A part of the gtk2 based user interface driver for GNUe forms.
+ #
+ # NOTES:
+ #
+ # TODO:
+ #  * add global accelerator maps
+ #  * cleanup event stuff
  
  
  import string
***************
*** 14,32 ****
  
  def _setDefaultEventHandlers(newWidget, eventHandler, initialize, uiDriver):
      if initialize:
!         # care for focus-in-eventfocus-out-event etc.?
!         # need to set event MASK with newWidget.add_events() ?
!         newWidget.connect("key-press-event", _keyPressHandler,\
!                           uiDriver, eventHandler)
! 
!         # Just care for focus in events, because focus out events
!         # (user switches to other applications are irrelevant for us
! ##         newWidget.connect("focus-in-event", _focusInHandler,\
! ##                           uiDriver, eventHandler)
! ##         newWidget.connect("focus-out-event", _focusOutHandler,\
! ##                           uiDriver, eventHandler)
!         newWidget.connect("button-press-event", _buttonPressHandler,\
!                           uiDriver, eventHandler)
          return
  
  
--- 45,57 ----
  
  def _setDefaultEventHandlers(newWidget, eventHandler, initialize, uiDriver):
      if initialize:
!         # Just care for keypresses which get not handled
!         newWidget.connect_after("key-press-event", _keyPressHandler,\
!                               uiDriver, eventHandler)
! 
!         #OLD: Mouse event stuff
!         #newWidget.connect("button-press-event", _buttonPressHandler,\
!         #                  uiDriver, eventHandler)
          return
  
  
***************
*** 38,43 ****
--- 63,70 ----
  # GNUe events passed back to the form
  #
  
+ # should be replaced by accelerators ONLY
+ 
  def _keyPressHandler(widget, event, uiDriver, eventHandler):
      # just care for keypresses
      if event.type!=gtk.gdk.KEY_PRESS:
***************
*** 50,56 ****
      isCtrl = event.state and gtk.gdk.CONTROL_MASK
      isMod1 = event.state and gtk.gdk.MOD1_MASK
  
!     object = uiDriver._WidgetToGFObj[widget]
  
      #
      # Sigh... a hack for using <enter> in multiline entries
--- 77,86 ----
      isCtrl = event.state and gtk.gdk.CONTROL_MASK
      isMod1 = event.state and gtk.gdk.MOD1_MASK
  
!     try:
!         object = uiDriver._WidgetToGFObj[widget]
!     except:
!         return
  
      #
      # Sigh... a hack for using <enter> in multiline entries
***************
*** 97,112 ****
        else:
            # maybe some background error message here
            pass
!     elif not event.state: # no special modifier keys pressed
!       try:
!         char = chr(keycode)
!         if char in string.printable or char == "\n" or \
!            128 <= keycode <= 255:
!           action = events.Event('requestKEYPRESS', char,
!                          text=char,
!                          code=keycode)
!       except ValueError:
!         pass 
  
      if action:
        # Add the object's _form to the outgoing event
--- 127,150 ----
        else:
            # maybe some background error message here
            pass
! ##     elif not event.state: # no special modifier keys pressed
! ##       try:
! ##         char = chr(keycode)
! ##         if char in string.printable or char == "\n" or \
! ##            128 <= keycode <= 255:
! ##           action = events.Event('requestKEYPRESS', char,
! ##                          text=char,
! ##                          code=keycode)
! ##       except ValueError:
! ##         pass 
!       
! 
! #   print "'%s'" % command
! ##     if command in ('CURSORLEFT', 'CURSORRIGHT','NEXTRECORD', 'PREVRECORD',
! ##                    'BACKSPACE','DELETE','SELECTLEFT','SELECTRIGHT') and \
! ##                     isinstance(widget,gtk.Entry):
! ##         print 'stopped'
! ##         action=0
  
      if action:
        # Add the object's _form to the outgoing event
***************
*** 121,137 ****
  # Traps most mouse events and translates them into
  # GNUe events passed back to the form
  #
- # TODO: fix focus change events raised by page change
- #       through clicking on notebook tabs
- 
- def _focusInHandler(widget, event, uiDriver, eventHandler):
-     print "focus in: widget",widget
-     object = uiDriver._WidgetToGFObj[widget]
-     eventHandler('requestFOCUS',object,_form=object._form)
- #    return gtk.TRUE
- def _focusOutHandler(widget, event, uiDriver, eventHandler):
-     print "focus out: widget",widget
- #    return gtk.TRUE # can make gtk.application segfault
      
  def _buttonPressHandler(widget, event, uiDriver, eventHandler):
      if (event.type!=gtk.gdk.BUTTON_PRESS and \
--- 159,164 ----
***************
*** 144,150 ****
      isCtrl = event.state and gtk.gdk.CONTROL_MASK
      isMod1 = event.state and gtk.gdk.MOD1_MASK
  
!     object = uiDriver._WidgetToGFObj[widget]
  
      #
      #  Focus
--- 171,180 ----
      isCtrl = event.state and gtk.gdk.CONTROL_MASK
      isMod1 = event.state and gtk.gdk.MOD1_MASK
  
!     try:
!         object = uiDriver._WidgetToGFObj[widget]
!     except:
!         object = uiDriver._WidgetToGFObj[widget._parent]
  
      #
      #  Focus
Index: gnue/forms/src/uidrivers/gtk2/widgets/_base.py
diff -c gnue/forms/src/uidrivers/gtk2/widgets/_base.py:1.2 
gnue/forms/src/uidrivers/gtk2/widgets/_base.py:1.3
*** gnue/forms/src/uidrivers/gtk2/widgets/_base.py:1.2  Mon May 19 20:06:35 2003
--- gnue/forms/src/uidrivers/gtk2/widgets/_base.py      Mon Jun 16 17:32:30 2003
***************
*** 22,38 ****
  # gtk2/widgets/_base.py
  #
  # DESCRIPTION:
! # Part of a gtk2 based user interface driver for GNUe forms.
  #
  # NOTES:
  #
! from gtk import *
  
  from gnue.common import events
  
  from gnue.forms.GFForm import *
! from gnue.forms.uidrivers._base.widgets._base import *
! from gnue.forms.uidrivers.gtk2.common import *
  
  
  #############################################################################
--- 22,39 ----
  # gtk2/widgets/_base.py
  #
  # DESCRIPTION:
! # Part of a gtk2 based user interface driver for GNUe forms: Base Widget
  #
  # NOTES:
  #
! 
! import gtk
  
  from gnue.common import events
  
  from gnue.forms.GFForm import *
! from gnue.forms.uidrivers._base.widgets._base import UIWidget
! from gnue.forms.uidrivers.gtk2.common import _setDefaultEventHandlers
  
  
  #############################################################################
***************
*** 60,147 ****
    def _addToCrossRef(self, widget,gfobject, uiobject):
      self._uiDriver._WidgetToGFObj[widget]=gfobject
      self._uiDriver._WidgetToUIObj[widget]=uiobject
-     #widget.__origBackgroundColor = widget.GetBackgroundColour()
  
    def _deleteFromCrossRef(self, widget, object):
      try:
-       #del self._uiDriver._WidgetToTkObj[widget]
        del self._uiDriver._WidgetToGFObj[widget]
        del self._uiDriver._WidgetToUIObj[widget]
      except:
        pass
  
    #
    # Override the base UIWidget functions
    #
    def show(self):
      for widget in self.widgets:
!       widget.Show(1)
! #      widget.Raise()
  
    def hide(self):
      for widget in self.widgets:
!       widget.Show(0)
            
    def showModal(self):
      print "showModal not implemented for gtk2 driver"
      for widget in self.widgets:      
-       # widget.ShowModal()
        pass
  
    def destroy(self):
      print "destroy not implemented for gtk2 driver"
      for widget in self.widgets:
-       # self.Destroy()
        pass
          
    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):
      widget = self.widgets[index]
      
      if widget.get_name()=='GtkCombo':
  
-       # Check if foreign key changed
        object = self._uiDriver._WidgetToGFObj[widget]
!       try:
!         if object.style == "dropdown" and \
!                not object._field._allowedValues == widget._origAllowedValues:
!           # These must be here or dropdown style controls
!           # will get events they shouldn't and break.
!           ##  widget.SetEvtHandlerEnabled(FALSE)
!           try:
!             # Not in gtk2 2.2.x
!             widget.Freeze()
!           except AttributeError:
!             pass
!           widget._origAllowedValues = object._field._allowedValues
!           widget.Clear()
!           for value in object._field._allowedValuesDescr:
!             widget.Append(value)
!             widget.SetValue("")
!             try:
!               # Not in wx 2.2.x
!               widget.Thaw()
!             except AttributeError:
!               pass
!           ##     widget.SetEvtHandlerEnabled(TRUE)
  
!       except AttributeError:
!         pass
!       except:
!         pass
        widget.entry.set_text(value)
!     elif widget.get_name()=='GtkTextView':
!       widget.get_buffer().set_text(value)
      elif widget.get_name()=='GtkCheckButton':
        widget.set_active(value)
      else:
        widget.set_text(value)
  
      if enabled:
        widget.set_sensitive(1)
--- 61,168 ----
    def _addToCrossRef(self, widget,gfobject, uiobject):
      self._uiDriver._WidgetToGFObj[widget]=gfobject
      self._uiDriver._WidgetToUIObj[widget]=uiobject
  
    def _deleteFromCrossRef(self, widget, object):
      try:
        del self._uiDriver._WidgetToGFObj[widget]
        del self._uiDriver._WidgetToUIObj[widget]
      except:
        pass
  
+   def _addDefaultEventHandler(self,widget,eventHandler,uiDriver):
+     widget._focus_sig_handler = widget.connect("focus-in-event",
+                                                self._focusInHandler,\
+                                                uiDriver,
+                                                eventHandler)
+     # add key press handlers from ../common.py
+     _setDefaultEventHandlers(widget, eventHandler, 1, uiDriver)
+ 
+ 
    #
    # Override the base UIWidget functions
    #
    def show(self):
      for widget in self.widgets:
!       widget.show()
  
    def hide(self):
      for widget in self.widgets:
!       widget.hide()
            
    def showModal(self):
      print "showModal not implemented for gtk2 driver"
      for widget in self.widgets:      
        pass
  
    def destroy(self):
      print "destroy not implemented for gtk2 driver"
      for widget in self.widgets:
        pass
          
    def indexedFocus(self, index):
!     widget = self.widgets[index]
! 
!     if widget.get_name()=='GtkCombo':
!       widget=widget.entry
! 
!     # Block focus events
!     try:
!       widget.handler_block(widget._focus_sig_handler)
!     except:
!       pass
!     
!     #focus
!     widget.grab_focus()
! 
!     # unblock focus events
!     try:
!       widget.handler_unblock(widget._focus_sig_handler)
!     except:
!       pass
  
  
    def setValue(self, value, index=0, enabled=1):
+     # fix for 0.5.1 (Unicode is not internal encoding)
+     value = value.decode(gConfig('textEncoding'))
+     
      widget = self.widgets[index]
      
      if widget.get_name()=='GtkCombo':
  
        object = self._uiDriver._WidgetToGFObj[widget]
!       
!       # Check if foreign key changed
!       if object.style == "dropdown" and \
!              not object._field._allowedValues == widget._origAllowedValues:
!         
!         widget._origAllowedValues = object._field._allowedValues
!         widget.Clear()
!         for value in object._field._allowedValuesDescr:
!           widget.Append(value)
!           widget.SetValue("")
  
!       # set the value
        widget.entry.set_text(value)
!       
      elif widget.get_name()=='GtkCheckButton':
        widget.set_active(value)
+       
+     elif widget.get_name()=='MultiLineEdit':
+       widget.set_text(value)
+       
      else:
+       try:
+         widget.handler_block(widget._insert_handler)
+         widget.handler_block(widget._delete_handler)
+       except:
+         pass
+       # print "set to '%s'" % value
        widget.set_text(value)
+       try:
+         widget.handler_unblock(widget._insert_handler)
+         widget.handler_unblock(widget._delete_handler)
+       except:
+         pass      
  
      if enabled:
        widget.set_sensitive(1)
***************
*** 169,174 ****
--- 190,196 ----
        pass
      if event.initialize: 
        self._addToCrossRef(newWidget,event.object,self)
+       
      return newWidget
  
    def cleanup(self, object):
***************
*** 180,182 ****
--- 202,235 ----
          pass
        self.widgets.pop(0)
        self._deleteFromCrossRef(widget, object)
+ 
+ 
+   ###########################################################
+   #
+   #  Internal Event Handler
+   #
+   #
+ 
+   def _focusInHandler(self, widget, event, uiDriver, eventHandler):
+     #print "focus in: widget",widget
+     try:
+       object = uiDriver._WidgetToGFObj[widget]
+     except:
+       try:
+         #  for the entry in a dropdown widget
+         object = uiDriver._WidgetToGFObj[widget.get_parent()]
+       except:
+         # for the gtk.TextView widget in a MultiLineEdit Object
+         object = uiDriver._WidgetToGFObj[widget._parent]
+         
+       
+     action = events.Event('requestFOCUS',object,_form=object._form)
+     # TODO: fix VETO
+     # widget.emit_stop_by_name('focus-in-event')
+     gtk.idle_add(eventHandler,action)
+     # return gtk.TRUE
+ 
+ 
+   def _focusOutHandler(self,widget, event, uiDriver, eventHandler):
+     print "focus out: widget",widget
+     # return gtk.TRUE # can make gtk.application segfault
Index: gnue/forms/src/uidrivers/gtk2/widgets/box.py
diff -c gnue/forms/src/uidrivers/gtk2/widgets/box.py:1.2 
gnue/forms/src/uidrivers/gtk2/widgets/box.py:1.3
*** gnue/forms/src/uidrivers/gtk2/widgets/box.py:1.2    Sun Jun  1 11:58:52 2003
--- gnue/forms/src/uidrivers/gtk2/widgets/box.py        Mon Jun 16 17:32:29 2003
***************
*** 40,53 ****
      object = event.object
      
      newWidget = gtk.Frame()
!     newWidget.set_size_request(self.itemWidth - 1 * event.widgetWidth,
!                                self.itemHeight)
      
-     newWidget.modify_font(self._uiDriver.mono_font)
      newWidget.set_label(str(object.label))
  
      event.container.put(newWidget, (object.Char__x+0.5) * event.widgetWidth,
!       (object.Char__y + spacer) * event.widgetHeight)
  
      return newWidget
  
--- 40,53 ----
      object = event.object
      
      newWidget = gtk.Frame()
!     newWidget.set_size_request(self.itemWidth - (1 * event.widgetWidth),
!                                self.itemHeight - (0.5 * event.widgetHeight))
      
      newWidget.set_label(str(object.label))
+     newWidget.get_label_widget().modify_font(self._uiDriver.mono_font)
  
      event.container.put(newWidget, (object.Char__x+0.5) * event.widgetWidth,
!                         (object.Char__y + spacer + 0.5) * event.widgetHeight)
  
      return newWidget
  
Index: gnue/forms/src/uidrivers/gtk2/widgets/button.py
diff -c gnue/forms/src/uidrivers/gtk2/widgets/button.py:1.2 
gnue/forms/src/uidrivers/gtk2/widgets/button.py:1.3
*** gnue/forms/src/uidrivers/gtk2/widgets/button.py:1.2 Mon May 19 20:06:35 2003
--- gnue/forms/src/uidrivers/gtk2/widgets/button.py     Mon Jun 16 17:32:30 2003
***************
*** 19,35 ****
  # Copyright 2000-2003 Free Software Foundation
  #
  # FILE:
! # UIwxpython.py
  #
  # DESCRIPTION:
! # A wxPython based user interface driver for GNUe forms.
  #
  # NOTES:
  #
  import gtk
  
  from gnue.common import events
- from gnue.forms.uidrivers.gtk2.common import _setDefaultEventHandlers
  from gnue.forms.uidrivers.gtk2.widgets._base import UIHelper
  
  #
--- 19,34 ----
  # Copyright 2000-2003 Free Software Foundation
  #
  # FILE:
! # gtk2/widgets/button.py
  #
  # DESCRIPTION:
! # A part of a gtk2 based user interface driver for GNUe forms: Button Widget
  #
  # NOTES:
  #
  import gtk
  
  from gnue.common import events
  from gnue.forms.uidrivers.gtk2.widgets._base import UIHelper
  
  #
***************
*** 46,58 ****
      newWidget.get_child().modify_font(self._uiDriver.mono_font)
  
      event.container.put(newWidget, object.Char__x * event.widgetWidth,
!       (object.Char__y + spacer) * event.widgetHeight)
  
      if event.initialize:
        self._eventHandler = event.eventHandler
        newWidget.connect('clicked', self.buttonHandler, newWidget)
!       _setDefaultEventHandlers(newWidget, event.eventHandler, \
!                                event.initialize, self._uiDriver)
  
      return newWidget
  
--- 45,57 ----
      newWidget.get_child().modify_font(self._uiDriver.mono_font)
  
      event.container.put(newWidget, object.Char__x * event.widgetWidth,
!                         (object.Char__y + spacer) * event.widgetHeight)
  
      if event.initialize:
        self._eventHandler = event.eventHandler
        newWidget.connect('clicked', self.buttonHandler, newWidget)
!       self._addDefaultEventHandler(newWidget, event.eventHandler, \
!                                    self._uiDriver)
  
      return newWidget
  
Index: gnue/forms/src/uidrivers/gtk2/widgets/entry.py
diff -c gnue/forms/src/uidrivers/gtk2/widgets/entry.py:1.3 
gnue/forms/src/uidrivers/gtk2/widgets/entry.py:1.4
*** gnue/forms/src/uidrivers/gtk2/widgets/entry.py:1.3  Mon May 26 03:07:21 2003
--- gnue/forms/src/uidrivers/gtk2/widgets/entry.py      Mon Jun 16 17:32:30 2003
***************
*** 26,36 ****
  #
  # NOTES:
  #
  import gtk
  from gnue.common import events
- 
  from gnue.forms.uidrivers.gtk2.widgets._base import UIHelper
- from gnue.forms.uidrivers.gtk2.common import _setDefaultEventHandlers
  
  #
  # UIEntry
--- 26,42 ----
  #
  # NOTES:
  #
+ # TODO:
+ #  * fix "selection" for gtk.entry
+ #  * fix position to byteindex conversion (UTF-8)
+ #       Update: working for Unicode Strings, i.e. when using Unicode as
+ #               internal data representation has to be unicode, which is
+ #               postponed for > ver. 0.5.1
+ #
+ 
  import gtk
  from gnue.common import events
  from gnue.forms.uidrivers.gtk2.widgets._base import UIHelper
  
  #
  # UIEntry
***************
*** 49,113 ****
          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,self._uiDriver)
!       _setDefaultEventHandlers(newWidget.list, event.initialize, 
newWidget,self._uiDriver)
  
      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)
      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)
  
!     else: # Normal text box
        value=""
        if hasattr(object,'Char__height') and object.Char__height>1:
!         textTagTable=gtk.TextTagTable()
!         textBuffer=gtk.TextBuffer(textTagTable)
!         newWidget=gtk.TextView()
!         newWidget.set_buffer(textBuffer)
!         newWidget.set_wrap_mode(gtk.WRAP_CHAR)
!         textBuffer.set_text(value)
!         viewport=gtk.ScrolledWindow()
!         viewport.add_with_viewport(newWidget)
!         viewport.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        else:
          newWidget=viewport=gtk.Entry()
          
        viewport.set_size_request(self.itemWidth, self.itemHeight+1)
        event.container.put(viewport, object.Char__x * event.widgetWidth,
                            (object.Char__y + spacer + (object._gap * spacer))\
                            * event.widgetHeight)
  
!     self._eventHandler = event.eventHandler
!     
!     if event.initialize:
!       _setDefaultEventHandlers(newWidget, event.eventHandler, 
event.initialize,self._uiDriver)
! 
!     event.container.show_all()
      return newWidget
  
    def setCursorPosition(self, position, index=0):
      widget=self.widgets[index]
!     if isinstance(widget,gtk.Entry):
        widget.set_position(position)
!     elif  isinstance(widget,gtk.TextView):
!       buffer = widget.get_buffer()
!       iter = buffer.get_iter_at_offset(position)
!       buffer.place_cursor(iter)      
  
    def setSelectedArea(self, selection1, selection2, index=0):
      widget=self.widgets[index]
--- 55,130 ----
          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)
  
!       if event.initialize:
!         self._addDefaultEventHandler(newWidget.entry, event.eventHandler, \
!                                      self._uiDriver)
!         self._addDefaultEventHandler(newWidget.list,  event.eventHandler, \
!                                      self._uiDriver)
  
      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)
!       
      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)      
!       if event.initialize:
!         self._addDefaultEventHandler(newWidget, event.eventHandler,\
!                                      self._uiDriver)
  
!     else:    
        value=""
        if hasattr(object,'Char__height') and object.Char__height>1:
!         newWidget = MultiLineEdit(value, event.eventHandler,self._uiDriver)
!         viewport = newWidget.viewport        
        else:
          newWidget=viewport=gtk.Entry()
+         newWidget._insert_handler = newWidget.connect('insert-text', \
+                                                       self.insertTextHandler,\
+                                                       event.eventHandler, \
+                                                       self._uiDriver)
          
+         newWidget._delete_handler = newWidget.connect('delete-text',\
+                                                       self.deleteTextHandler,\
+                                                       event.eventHandler,\
+                                                       self._uiDriver)
+                 
        viewport.set_size_request(self.itemWidth, self.itemHeight+1)
        event.container.put(viewport, object.Char__x * event.widgetWidth,
                            (object.Char__y + spacer + (object._gap * spacer))\
                            * event.widgetHeight)
+       if event.initialize:
+         self._addDefaultEventHandler(newWidget, event.eventHandler,\
+                                      self._uiDriver)
  
!     self._eventHandler = event.eventHandler          
!     event.container.show_all()    
      return newWidget
  
+ 
    def setCursorPosition(self, position, index=0):
      widget=self.widgets[index]
!     if isinstance(widget,gtk.Entry) or isinstance(widget,MultiLineEdit):      
        widget.set_position(position)
!     else:
!       print "Wrong Place to execute set CursorPosition"
  
    def setSelectedArea(self, selection1, selection2, index=0):
      widget=self.widgets[index]
***************
*** 116,121 ****
--- 133,207 ----
      elif  isinstance(widget,gtk.TextView):
        widget.get_buffer().select_region(position)      
  
+   ###########################################################
+   #
+   #  Internal Event Handler
+   #
+   #
+ 
+   #
+   #  eventHandler for gtk.Entry, interrupts default insertText procedure and
+   #  passes the text to the normal displayhandler
+   #
+ 
+   def 
insertTextHandler(self,widget,newtext,length,position,eventHandler,uiDriver):
+     #print "insert '%s' at %s" % (newtext,widget.get_position())
+     if isinstance(widget,gtk.TextBuffer):
+       object=uiDriver._WidgetToGFObj[widget._textview]
+       object._displayHandler.cursor = widget.get_insert()
+ 
+     else:
+       object=uiDriver._WidgetToGFObj[widget]
+       object._displayHandler.cursor = widget.get_position()
+     # HACK: set the cursor position for display handler
+     #       this should be passed with the event
+ 
+     # Compatibility layer for 0.5.1
+     #text = newtext.decode('utf-8')    
+     text = newtext.decode('utf-8').encode(gConfig('textEncoding'))
+     
+     action = events.Event('requestKEYPRESS', text, text=text,
+                           code=0, _form=object._form)
+     
+     # don't process event further
+     widget.emit_stop_by_name('insert-text')
+     
+     gtk.idle_add(eventHandler,action)  # our eventHandler will be called later
+ 
+   #
+   #  eventHandler for gtk.Entry, interrupts default deleteText procedure,
+   #  passes event to displayhandler in two parts (1. selection, 2. delete)
+   #
+ 
+   def deleteTextHandler(self,widget,start_pos,end_pos,eventHandler,uiDriver):
+     #print "delete (%s..%s)" % (start_pos,end_pos)
+     object=uiDriver._WidgetToGFObj[widget]
+ 
+     # HACK:
+     # it should be possible to possible to pass the area to be deleted
+     # with the gnue internal event.
+     #object._displayHandler.selection1=start_pos
+     #object._displayHandler.selection2=end_pos
+     #object._displayHandler.cursor = widget.get_position()
+     #action = events.Event('requestDELETE',
+     try:
+       CursorPos = widget.get_position()
+     except:
+       CursorPos = widget.get_insert()
+     
+     action = events.Event('requestDELETERANGE',
+                           start_pos=start_pos,
+                           end_pos=end_pos,
+                           position=CursorPos,
+                           _form=object._form)
+         
+     widget.emit_stop_by_name('delete-text')
+     gtk.idle_add(eventHandler,action)
+ 
+   #
+   #  eventHandler for gtk.Combo,  no interruption, etc.
+   #
+ 
    def comboHandler(self, combo_list, list_child, combo):
      selection = combo_list.child_position(list_child)
      selected_text = self.choices[selection]
***************
*** 125,134 ****
--- 211,225 ----
      action = events.Event('requestREPLACEVALUE',object=gfObject,
                            index=selection, text=selected_text,
                            _form=gfObject._form)
+ 
+     # TODO: allow veto
      self._eventHandler(action)
  
      return gtk.TRUE
  
+   #
+   #  eventHandler for gtk.CheckBox,  no interruption, etc.
+   #
  
    def checkboxHandler(self,event,widget):
      buttonStatus=newWidget.get_active()
***************
*** 136,144 ****
      gfObject     = self._uiDriver._WidgetToGFObj[widget]
      eventdata = [gfObject, buttonStatus]
      action = events.Event('requestTOGGLECHKBOX', _form=gfObject._form)
      self._eventHandler(action)
!     return 1
  
  
  
  
--- 227,325 ----
      gfObject     = self._uiDriver._WidgetToGFObj[widget]
      eventdata = [gfObject, buttonStatus]
      action = events.Event('requestTOGGLECHKBOX', _form=gfObject._form)
+     # TODO: allow veto
      self._eventHandler(action)
!     return gtk.TRUE
! 
! 
  
+ class MultiLineEdit:  
+   def __init__(self,value,eventHandler,uiDriver):
+     self.textTagTable=gtk.TextTagTable()
+     self.textBuffer=gtk.TextBuffer(self.textTagTable)
+     self.baseWidget=gtk.TextView()
+     self.baseWidget.set_buffer(self.textBuffer)
+     self.baseWidget.set_wrap_mode(gtk.WRAP_CHAR)
+     self.baseWidget._parent=self
+     self.textBuffer.set_text(value)
+     self.viewport=gtk.ScrolledWindow()
+     self.viewport.add_with_viewport(self.baseWidget)
+     self.viewport.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ 
+     self.insert_handler = self.textBuffer.connect('insert-text', \
+                                              self.insertTextHandler,\
+                                              eventHandler, \
+                                              uiDriver)
+         
+     self.delete_handler = self.textBuffer.connect('delete-range',\
+                                              self.deleteTextHandler,\
+                                              eventHandler,\
+                                              uiDriver)
+ 
+   # Return own name to let other objects identify this obj.
+   def get_name(self):
+     return 'MultiLineEdit'
+ 
+   def set_position(self,position):
+     pos_iter = self.textBuffer.get_iter_at_offset(position)
+     self.textBuffer.place_cursor(pos_iter)
+ 
+   def set_text(self,value):
+     try:
+       self.textBuffer.handler_block(self.insert_handler)
+       self.textBuffer.handler_block(self.delete_handler)
+     except:
+       pass
+     self.textBuffer.set_text(value)
+     try:
+       self.textBuffer.handler_unblock(self.insert_handler)
+       self.textBuffer.handler_unblock(self.delete_handler)
+     except:
+       pass      
+ 
+   # pass through function calls 
+   def __getattr__(self, attr):
+     if self.baseWidget and attr[1] != '_' and hasattr(self.baseWidget,attr):
+       return getattr(self.baseWidget,attr)
+     else:
+       raise AttributeError, attr
+ 
+ 
+   def 
insertTextHandler(self,widget,textiter,newtext,position,eventHandler,uiDriver):
+     #print "insertText %s " % newtext
+     object=uiDriver._WidgetToGFObj[self]
+ #    object._displayHandler.cursor = widget.get_insert()
+     object._displayHandler.cursor = textiter.get_offset()
+ 
+     # Compatibility layer for 0.5.1
+     #text = newtext.decode('utf-8')    
+     text = newtext.decode('utf-8').encode(gConfig('textEncoding'))
+     
+     action = events.Event('requestKEYPRESS', text, text=text,
+                           code=0, _form=object._form)
+     
+     # don't process event further
+     widget.emit_stop_by_name('insert-text')
+     
+     gtk.idle_add(eventHandler,action)  # our eventHandler will be called later
+ 
+ 
+   def deleteTextHandler(self,widget,start_pos,end_pos,eventHandler,uiDriver):
+     #print "delete (%s..%s)" % (start_pos.get_offset(),end_pos.get_offset())
+ 
+     object=uiDriver._WidgetToGFObj[self]
+ 
+     cursor_iter = widget.get_iter_at_mark(widget.get_insert())
+     
+     
+     action = events.Event('requestDELETERANGE',
+                           start_pos=start_pos.get_offset(),
+                           end_pos=end_pos.get_offset(),
+                           position=cursor_iter.get_offset(),
+                           _form=object._form)
+         
+     widget.emit_stop_by_name('delete-range')
+     gtk.idle_add(eventHandler,action)
  
  
  
Index: gnue/forms/src/uidrivers/gtk2/widgets/form/widget.py
diff -c gnue/forms/src/uidrivers/gtk2/widgets/form/widget.py:1.3 
gnue/forms/src/uidrivers/gtk2/widgets/form/widget.py:1.4
*** gnue/forms/src/uidrivers/gtk2/widgets/form/widget.py:1.3    Fri Jun  6 
20:51:41 2003
--- gnue/forms/src/uidrivers/gtk2/widgets/form/widget.py        Mon Jun 16 
17:32:30 2003
***************
*** 84,89 ****
--- 84,90 ----
                   gtk.EXPAND | gtk.FILL,  gtk.EXPAND | gtk.FILL,
                   0,                      0)
        self.createStatusBar()
+       
  
      else:      
        self.mainWindow = gtk.Window()
***************
*** 120,125 ****
--- 121,138 ----
      if not self._form._features['GUI:TOOLBAR:SUPPRESS']:
        ToolBar(self._uiDriver, self, self._form)
       
+ 
+     # compute default window size
+     #
+     #paneSize=self.containerFrame.get_allocation()
+     #winSize=self.mainWindow.get_allocation()
+     #offsetX=winSize.width-paneSize.width
+     #offsetY=winSize.height-paneSize.height
+     #print "Size %s,%s" % (offsetX,offsetY)
+     #(w,h)=self.containerFrame.get_size_request()
+     #print 'size: %s,%s' %(w,h)
+     #(w,h)=self.mainWindow.get_size_request()
+     #print 'size: %s,%s' %(w,h)
        
      self._eventHandler = event.eventHandler
      self._wrapper.finalize()
***************
*** 227,232 ****
--- 240,246 ----
  
  
    def show(self):
+     self.containerFrame.show()
      self.mainWindow.show_all()
      self._visible = 1
  
***************
*** 255,260 ****
    #
    def windowExitEvent(self,*args):
     self._uiDriver.dispatchEvent('requestEXIT',_form=self._form)
- #   self.dispatchEvent(events.Event('requestEXIT'))
     return gtk.TRUE
  
--- 269,273 ----
Index: gnue/forms/src/uidrivers/gtk2/widgets/form/wrappers.py
diff -c gnue/forms/src/uidrivers/gtk2/widgets/form/wrappers.py:1.2 
gnue/forms/src/uidrivers/gtk2/widgets/form/wrappers.py:1.3
*** gnue/forms/src/uidrivers/gtk2/widgets/form/wrappers.py:1.2  Mon May 19 
20:06:35 2003
--- gnue/forms/src/uidrivers/gtk2/widgets/form/wrappers.py      Mon Jun 16 
17:32:30 2003
***************
*** 67,73 ****
      self.pane = self
      self.margin = 2
      gtk.Notebook.__init__(self)
-     #self.set_border_width(self.margin)
      try:
        tabstyle  = _tabStyles[self.form._layout.tabbed]
        self.set_tab_pos(tabstyle)
--- 67,72 ----
***************
*** 111,127 ****
      
  
    def notebookTabHandler(self,notebook,notebookpage,page_number):
- #    print "change %s (%s) to %s " % (self._oldpage,
- #                                     self.get_current_page(),
- #                                     page_number)
      if self._oldpage!=page_number:
        
        action = events.Event('requestPAGE',page_number, _form=self.form)
        self.uiform._eventHandler(action)
!       # care for not 'vetoed' page changes
!       # TODO: check why vetoes don't work      
!       if self._oldpage!=page_number:
!         self.set_current_page(self._oldpage)
  
    def setPage(self, page):
      # get Scroll Window for page
--- 110,121 ----
      
  
    def notebookTabHandler(self,notebook,notebookpage,page_number):
      if self._oldpage!=page_number:
        
        action = events.Event('requestPAGE',page_number, _form=self.form)
        self.uiform._eventHandler(action)
! 
!       notebook.emit_stop_by_name('switch-page')
  
    def setPage(self, page):
      # get Scroll Window for page
***************
*** 140,175 ****
      ScrollableWrapper.__init__(self, *args, **parms)
      self.pane = gtk.Fixed()
      self.add_with_viewport(self.pane)
      
!     self.pane.show_all()
  
    def createPage(self, object):
      newWidget = gtk.Fixed()
      self.pane.add(newWidget)
-     # , -1,  size=self.layoutSize)
  
      # Only show first page
!     if not self._fitted:
        newWidget.show_all()
!     else:
!       newWidget.show(0)
! 
      self._pageList.append(newWidget)
      return newWidget
    
!   def setPage(self, page):
      for p in self._pageList:
        if p != page:
!         p.Show(0)
        else:
!         p.Show(1)
! 
!     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)
! 
! 
!     self.visiblePage.show_all()
  
          
  _tabStyles = {'left':gtk.POS_LEFT,
--- 134,161 ----
      ScrollableWrapper.__init__(self, *args, **parms)
      self.pane = gtk.Fixed()
      self.add_with_viewport(self.pane)
+     self.set_size_request(self.layoutXSize,self.layoutYSize)
      
!   def finalize(self):
!     self.pane.set_size_request(self.layoutXSize,self.layoutYSize)
  
    def createPage(self, object):
      newWidget = gtk.Fixed()
      self.pane.add(newWidget)
  
      # Only show first page
!     if len(self._pageList)<1:
        newWidget.show_all()
!       
      self._pageList.append(newWidget)
      return newWidget
    
!   def setPage(self, page):    
      for p in self._pageList:
        if p != page:
!         p.show_all()
        else:
!         p.hide()
  
          
  _tabStyles = {'left':gtk.POS_LEFT,




reply via email to

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