Index: src/orca/scripts/gaim.py
===================================================================
--- src/orca/scripts/gaim.py	(revision 2330)
+++ src/orca/scripts/gaim.py	(working copy)
@@ -33,6 +33,8 @@
 __copyright__ = "Copyright (c) 2005-2007 Sun Microsystems Inc."
 __license__   = "LGPL"
 
+import gtk
+
 import orca.atspi as atspi
 import orca.braille as braille
 import orca.debug as debug
@@ -45,6 +47,10 @@
 
 from orca.orca_i18n import _
 
+# Whether we prefix chat room messages with the name of the chat room.
+#
+prefixChatMessage = False
+
 ########################################################################
 #                                                                      #
 # Ring List. A fixed size circular list by Flavio Catalani             #
@@ -106,10 +112,6 @@
         #
         self.debugLevel = debug.LEVEL_FINEST
 
-        # Whether we prefix chat room messages with the name of the chat room.
-        #
-        self.prefixChatMessage = False
-
         # Create two cyclic lists; one that will contain the previous
         # chat room messages and the other that will contain the names
         # of the associated chat rooms.
@@ -182,6 +184,40 @@
 
         return keyBindings
 
+    def getAppPreferencesGUI(self):
+        """Return a GtkVBox contain the application unique configuration
+        GUI items for the current application.
+        """
+
+        global prefixChatMessage
+
+        vbox = gtk.VBox(False, 0)
+        vbox.set_border_width(12)
+        gtk.Widget.show(vbox)
+        label = _("Speak Chat Room name")
+        self.speakNameCheckButton = gtk.CheckButton(label)
+        gtk.Widget.show(self.speakNameCheckButton)
+        gtk.Box.pack_start(vbox, self.speakNameCheckButton, False, False, 0)
+        gtk.ToggleButton.set_active(self.speakNameCheckButton, 
+                                    prefixChatMessage)
+
+        return vbox
+
+    def setAppPreferences(self, prefs):
+        """Write out the application specific preferences lines and set the
+        new values.
+
+        Arguments:
+        - prefs: file handle for application preferences.
+        """
+
+        global prefixChatMessage
+
+        prefixChatMessage = self.speakNameCheckButton.get_active()
+        prefs.writelines("\n")
+        prefs.writelines("orca.scripts.gaim.prefixChatMessage = %s\n" % \
+                         prefixChatMessage)
+
     def togglePrefix(self, inputEvent):
         """ Toggle whether we prefix chat room messages with the name of
         the chat room.
@@ -190,11 +226,13 @@
         - inputEvent: if not None, the input event that caused this action.
         """
 
+        global prefixChatMessage
+
         debug.println(self.debugLevel, "gaim.togglePrefix.")
 
         line = _("speak chat room name.")
-        self.prefixChatMessage = not self.prefixChatMessage
-        if not self.prefixChatMessage:
+        prefixChatMessage = not prefixChatMessage
+        if not prefixChatMessage:
             line = _("Do not speak chat room name.")
 
         speech.speak(line)
@@ -210,8 +248,10 @@
         - message: the chat room message.
         """
 
+        global prefixChatMessage
+
         text = ""
-        if self.prefixChatMessage:
+        if prefixChatMessage:
             if chatRoomName and chatRoomName != "":
                 text += _("Message from chat room %s") % chatRoomName + " "
         if message and message != "":
Index: src/orca/scripts/StarOffice.py
===================================================================
--- src/orca/scripts/StarOffice.py	(revision 2330)
+++ src/orca/scripts/StarOffice.py	(working copy)
@@ -25,6 +25,9 @@
 __copyright__ = "Copyright (c) 2005-2007 Sun Microsystems Inc."
 __license__   = "LGPL"
 
+import atk
+import gtk
+
 import orca.debug as debug
 import orca.atspi as atspi
 import orca.chnames as chnames
@@ -802,6 +805,53 @@
 
         return keyBindings
 
+    def getAppPreferencesGUI(self):
+        """Return a GtkVBox contain the application unique configuration
+        GUI items for the current application.
+        """
+
+        vbox = gtk.VBox(False, 0)
+        vbox.set_border_width(12)
+        gtk.Widget.show(vbox)
+
+        hbox = gtk.HBox(False, 0)
+        gtk.Widget.show(hbox)
+
+        self.textAttributesLabel = gtk.Label(_("Enabled Text Attributes:"))
+        gtk.Widget.show(self.textAttributesLabel)
+        gtk.Box.pack_start(hbox, self.textAttributesLabel, False, False, 5)
+
+        self.enabledTextAttributes = gtk.Entry()
+        gtk.Widget.show(self.enabledTextAttributes)
+        self.enabledTextAttributes.set_text(orca.settings.enabledTextAttributes)
+        gtk.Box.pack_end(hbox, self.enabledTextAttributes, True, True, 5)
+
+        acc_targets = []
+        acc_src = self.textAttributesLabel.get_accessible()
+        relation_set = acc_src.ref_relation_set()
+        acc_targ = self.enabledTextAttributes.get_accessible()
+        acc_targets.append(acc_targ)
+        relation = atk.Relation(acc_targets, 1)
+        relation.set_property('relation-type', atk.RELATION_LABEL_FOR)
+        relation_set.add(relation)
+
+        gtk.Box.pack_start(vbox, hbox, False, False, 0)
+
+        return vbox
+
+    def setAppPreferences(self, prefs):
+        """Write out the application specific preferences lines and set the
+        new values.
+
+        Arguments:
+        - prefs: file handle for application preferences.
+        """
+
+        settings.enabledTextAttributes = self.enabledTextAttributes.get_text()
+        prefs.writelines("\n")
+        prefs.writelines("orca.settings.enabledTextAttributes = '%s'\n" %  \
+                         settings.enabledTextAttributes)
+
     def adjustForWriterTable(self, obj):
         """Check to see if we are in Writer, where the object with focus
         is a paragraph, and the parent is the table cell. If it is, then,
Index: src/orca/app_gui_prefs.py
===================================================================
--- src/orca/app_gui_prefs.py	(revision 2330)
+++ src/orca/app_gui_prefs.py	(working copy)
@@ -31,6 +31,10 @@
 import sys
 
 import braille
+import debug
+import default
+import input_event
+import keybindings
 import orca_gui_prefs
 import orca_prefs
 import orca_state
@@ -40,22 +44,37 @@
 
 from orca_i18n import _  # for gettext support
 
+applicationName = None
+appScript = None
 OS = None
 
 class orcaSetupGUI(orca_gui_prefs.orcaSetupGUI):
 
-    def _initAppGUIState(self):
+    def _initAppGUIState(self, appScript):
         """Before we show the GUI to the user we want to remove the
         General tab and gray out the Speech systems and servers 
         controls on the speech tab.
+
+        Arguments:
+        - appScript: the application script.
         """
 
+        # Save away the application script so that it can be used later
+        # by writeUserPreferences().
+        #
+        self.appScript = appScript
+
         self.notebook.remove_page(0)
         self.speechSystemsLabel.set_sensitive(False)
         self.speechSystems.set_sensitive(False)
         self.speechServersLabel.set_sensitive(False)
         self.speechServers.set_sensitive(False)
 
+        vbox = appScript.getAppPreferencesGUI()
+        if vbox:
+            label = gtk.Label(orca_state.locusOfFocus.app.name)
+            self.notebook.append_page(vbox, label)
+
     def _showGUI(self):
         """Show the app-specific Orca configuration GUI window. This 
         assumes that the GUI has already been created.
@@ -77,8 +96,78 @@
 
         moduleName = settings.getScriptModuleName(self.app)
         orca_prefs.writeAppPreferences(self.prefsDict, moduleName,
-                                       self.keyBindingsModel)
+                                       self.appScript, self.keyBindingsModel)
 
+    def _markModified(self):
+        """ Mark as modified the user application specific custom key bindings:
+        """
+
+        global appScript
+
+        try:
+            appScript.setupInputEventHandlers()
+            keyBinds = keybindings.KeyBindings()
+            keyBinds = appScript.overrideAppKeyBindings(appScript, keyBinds)
+            keyBind = keybindings.KeyBinding(None, None, None, None)
+            treeModel = self.keyBindingsModel
+
+            myiter = treeModel.get_iter_first()
+            while myiter != None:
+                iterChild = treeModel.iter_children(myiter)
+                while iterChild != None:
+                    descrip = treeModel.get_value(iterChild, 
+                                                  orca_gui_prefs.DESCRIP)
+                    keyBind.handler = input_event.InputEventHandler(None,
+                                                                    descrip)
+                    if keyBinds.hasKeyBinding(keyBind,
+                                              typeOfSearch="description"):
+                        treeModel.set_value(iterChild, 
+                                            orca_gui_prefs.MODIF, True)
+                    iterChild = treeModel.iter_next(iterChild)
+                myiter = treeModel.iter_next(myiter)
+        except:
+            debug.printException(debug.LEVEL_SEVERE)
+
+    def _populateKeyBindings(self, clearModel=True):
+        """Fills the TreeView with the list of Orca keybindings. The
+        application specific ones are prepended to the list.
+
+        Arguments:        
+        - clearModel: if True, initially clear out the key bindings model. 
+        """
+
+        global applicationName, appScript
+
+        # Get the key bindings for the application script.
+        #
+        self.appKeyBindings = appScript.getKeyBindings()
+        self.appKeyBindings = appScript.overrideAppKeyBindings(appScript, 
+                                                     self.appKeyBindings)
+
+        # Get the key bindings for the default script.
+        #
+        defScript = default.Script(None)
+        self.defKeyBindings = defScript.getKeyBindings()
+
+        nodeCreated = False
+
+        # Find the key bindings that are in the application script but 
+        # not in the default script.
+        #
+        for kb in self.appKeyBindings.keyBindings:
+            if not self.defKeyBindings.hasKeyBinding(kb, "strict"):
+                if not self._addAlternateKeyBinding(kb):
+                    handl = appScript.getInputEventHandlerKey(kb.handler)
+                    if not nodeCreated:
+                        iterOrca = self._createNode(applicationName)
+                        nodeCreated = True
+                    self._insertRow(handl, kb, iterOrca)
+
+        # Call the parent class to add in the default key bindings.
+        #
+        orca_gui_prefs.orcaSetupGUI._populateKeyBindings(self, False)
+
+
     def okButtonClicked(self, widget):
         """Signal handler for the "clicked" signal for the okButton
            GtkButton widget. The user has clicked the OK button.
@@ -110,7 +199,7 @@
         OS = None
 
 def showPreferencesUI():
-    global OS
+    global applicationName, appScript, OS
 
     # There must be an application with focus for this to work.
     #
@@ -120,6 +209,8 @@
         speech.speak(message)
         return
 
+    appScript = orca_state.activeScript
+
     # The name of the application that currently has focus.
     #
     applicationName = orca_state.locusOfFocus.app.name
@@ -145,7 +236,7 @@
 
     OS._init()
     if removeGeneralPane:
-        OS._initAppGUIState()
+        OS._initAppGUIState(appScript)
     OS._showGUI()
 
 def main():
Index: src/orca/orca_prefs.py
===================================================================
--- src/orca/orca_prefs.py	(revision 2330)
+++ src/orca/orca_prefs.py	(working copy)
@@ -27,6 +27,8 @@
 
 import os
 import pprint
+
+import orca_state
 import settings
 
 from orca_i18n import _  # for gettext support
@@ -302,6 +304,17 @@
 
     return
 
+def _writeAppKeyBindingsPreamble(prefs):
+    """Writes the preamble to the  ~/.orca/app-settings/<APPNAME>.py
+    keyBindings section."""
+
+    prefs.writelines("\n")
+    prefs.writelines("# Set up a user key-bindings profile\n")
+    prefs.writelines("#\n")
+    prefs.writelines('def overrideAppKeyBindings(script, keyB):\n')
+
+    return
+
 def _writeKeyBinding(prefs, tupl):
     """Writes a single keyBinding to the user-settings.py keyBindings section.
 
@@ -345,6 +358,20 @@
     prefs.writelines("\n")
     return
 
+def _writeAppKeyBindingsPostamble(prefs, appName, appScript):
+    """Writes the postamble to the ~/.orca/app-settings/<APPNAME>.py
+    keyBindings section.
+
+    Arguments:
+    - prefs: file handle for application preferences.
+    - appName: the application these preferences are for.
+    - appScript: the application script.
+    """
+
+    prefs.writelines('   return keyB')
+    prefs.writelines("\n\n")
+    return
+
 def _writeKeyBindingsMap(prefs, treeModel):
     """Write to configuration file 'prefs' the key bindings passed in the
     model treeModel.
@@ -366,6 +393,33 @@
 
     return
 
+def _writeAppKeyBindingsMap(prefs, appName, appScript, treeModel):
+    """Write to an application specific configuration file 'prefs', the 
+    key bindings passed in the model treeModel.
+
+    Arguments:
+    - prefs: file handle for application preferences.
+    - appName: the application these preferences are for.
+    - appScript: the application script.
+    - treeModel: key bindings treemodel.
+    """
+
+    _writeAppKeyBindingsPreamble(prefs)
+
+    iter = treeModel.get_iter_first()
+    while iter != None:
+        iterChild = treeModel.iter_children(iter)
+        while iterChild != None:
+            values = treeModel.get(iterChild, 0,1,2,3,4,5,6,7,8,9,10,11)
+            if values[MODIF]:
+                _writeKeyBinding(prefs, values)
+            iterChild = treeModel.iter_next(iterChild)
+        iter = treeModel.iter_next(iter)
+
+    _writeAppKeyBindingsPostamble(prefs, appName, appScript)
+
+    return
+
 def readPreferences():
     """Returns a dictionary containing the names and values of the
     customizable features of Orca."""
@@ -511,7 +565,7 @@
     prefs.writelines("except ImportError:\n")
     prefs.writelines("    pass\n")
 
-def writeAppPreferences(prefsDict, appName, treeModel=None):
+def writeAppPreferences(prefsDict, appName, appScript, treeModel=None):
     """Creates the directory and files to hold application specific
     user preferences.  Write out any preferences that are different
     from the generic Orca preferences for this user. Note that callers 
@@ -522,6 +576,7 @@
     - prefsDict: a dictionary where the keys are orca preferences
     names and the values are the values for the preferences.
     - appName: the application these preferences are for.
+    - appScript: the application script.
     - treeModel: key bindings treemodel.
     """
 
@@ -544,7 +599,12 @@
             prefs.writelines("orca.settings.%s = %s\n" % (key, value))
 
     if treeModel:
-        _writeKeyBindingsMap(prefs, treeModel)
+        _writeAppKeyBindingsMap(prefs, appName, appScript, treeModel)
 
+    # Write out the application unique preferences (if any) and set the
+    # new values.
+    #
+    appScript.setAppPreferences(prefs)
+
     _writeAppPreferencesPostamble(prefs, appName)
     prefs.close()
Index: src/orca/focus_tracking_presenter.py
===================================================================
--- src/orca/focus_tracking_presenter.py	(revision 2330)
+++ src/orca/focus_tracking_presenter.py	(working copy)
@@ -301,13 +301,14 @@
     #                                                                      #
     ########################################################################
 
-    def loadAppSettings(self, app):
+    def loadAppSettings(self, script):
         """Load the users application specific settings for an app.
 
         Arguments:
-        - app: the Python app
+        - script: the current active script.
         """
 
+        app = script.app
         settingsPackages = settings.settingsPackages
         moduleName = settings.getScriptModuleName(app)
         module = None
@@ -328,6 +329,21 @@
                             __import__(name, globals(), locals(), [''])
                     debug.println(debug.LEVEL_FINEST,
                                   "...found %s.py" % name)
+
+                    # Setup the user's application specific key bindings.
+                    # (if any). Note this method might not have been
+                    # defined, so just catch it and continue.
+                    # 
+                    try:
+                        script.overrideAppKeyBindings = \
+                            self._knownAppSettings[name].overrideAppKeyBindings
+                        script.keyBindings = \
+                         self._knownAppSettings[name].overrideAppKeyBindings( \
+                            script, script.keyBindings)
+                    except:
+                        debug.printException(debug.LEVEL_SEVERE)
+                        pass
+
                     break
                 except ImportError:
                     debug.println(debug.LEVEL_FINEST,
@@ -505,7 +521,8 @@
                         # Load in the application specific settings for the
                         # app for this event (if found).
                         #
-                        appSettings = self.loadAppSettings(event.source.app)
+                        appSettings = self.loadAppSettings( \
+                                                      orca_state.activeScript)
 
                         # Tell BrlTTY which commands we care about.
                         #
Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 2330)
+++ src/orca/Gecko.py	(working copy)
@@ -29,6 +29,8 @@
 __copyright__ = "Copyright (c) 2005-2007 Sun Microsystems Inc."
 __license__   = "LGPL"
 
+import gtk
+
 import atspi
 import braille
 import braillegenerator
@@ -1741,6 +1743,162 @@
 
         return keyBindings
 
+    def getAppPreferencesGUI(self):
+        """Return a GtkVBox contain the application unique configuration
+        GUI items for the current application.
+        """
+
+        global controlCaretNavigation, arrowToLineBeginning
+        global structuralNavigationEnabled
+        global speakCellCoordinates, speakCellSpan
+        global speakCellHeaders, skipBlankCells
+
+        vbox = gtk.VBox(False, 0)
+        vbox.set_border_width(12)
+        gtk.Widget.show(vbox)
+
+        # General ("Page") Navigation frame.
+        #
+        generalFrame = gtk.Frame()
+        gtk.Widget.show(generalFrame)
+        gtk.Box.pack_start(vbox, generalFrame, False, False, 5)
+
+        generalAlignment = gtk.Alignment(0.5, 0.5, 1, 1)
+        gtk.Widget.show(generalAlignment)
+        gtk.Container.add(generalFrame, generalAlignment)
+        gtk.Alignment.set_padding(generalAlignment, 0, 0, 12, 0)
+
+        generalVBox = gtk.VBox(False, 0)
+        gtk.Widget.show(generalVBox)
+        gtk.Container.add(generalAlignment, generalVBox)
+
+        label = _("Use _Orca Caret Navigation")
+        self.controlCaretNavigationCheckButton = gtk.CheckButton(label)
+        gtk.Widget.show(self.controlCaretNavigationCheckButton)
+        gtk.Box.pack_start(generalVBox, self.controlCaretNavigationCheckButton, 
+                           False, False, 0)
+        gtk.ToggleButton.set_active(self.controlCaretNavigationCheckButton,
+                                    controlCaretNavigation)
+
+        label = _("Use Orca _Structural Navigation")
+        self.structuralNavigationCheckButton = gtk.CheckButton(label)
+        gtk.Widget.show(self.structuralNavigationCheckButton)
+        gtk.Box.pack_start(generalVBox, self.structuralNavigationCheckButton,
+                           False, False, 0)
+        gtk.ToggleButton.set_active(self.structuralNavigationCheckButton,
+                                    structuralNavigationEnabled)
+
+        label = _("_Position cursor at start of line when navigating vertically")
+        self.arrowToLineBeginningCheckButton = gtk.CheckButton(label)
+        gtk.Widget.show(self.arrowToLineBeginningCheckButton)
+        gtk.Box.pack_start(generalVBox, self.arrowToLineBeginningCheckButton,
+                           False, False, 0)
+        gtk.ToggleButton.set_active(self.arrowToLineBeginningCheckButton,
+                                    arrowToLineBeginning)
+
+        generalLabel = gtk.Label(_("<b>Page Navigation</b>"))
+        gtk.Widget.show(generalLabel)
+        gtk.Frame.set_label_widget(generalFrame, generalLabel)
+        gtk.Label.set_use_markup(generalLabel, True)
+
+        # Table Navigation frame.
+        #
+        tableFrame = gtk.Frame()
+        gtk.Widget.show(tableFrame)
+        gtk.Box.pack_start(vbox, tableFrame, False, False, 5)
+
+        tableAlignment = gtk.Alignment(0.5, 0.5, 1, 1)
+        gtk.Widget.show(tableAlignment)
+        gtk.Container.add(tableFrame, tableAlignment)
+        gtk.Alignment.set_padding(tableAlignment, 0, 0, 12, 0)
+
+        tableVBox = gtk.VBox(False, 0)
+        gtk.Widget.show(tableVBox)
+        gtk.Container.add(tableAlignment, tableVBox)
+
+        label = _("Speak _cell coordinates")
+        self.speakCellCoordinatesCheckButton = gtk.CheckButton(label)
+        gtk.Widget.show(self.speakCellCoordinatesCheckButton)
+        gtk.Box.pack_start(tableVBox, self.speakCellCoordinatesCheckButton,
+                           False, False, 0)
+        gtk.ToggleButton.set_active(self.speakCellCoordinatesCheckButton,
+                                    speakCellCoordinates)
+
+        label = _("Speak _multiple cell spans")
+        self.speakCellSpanCheckButton = gtk.CheckButton(label)
+        gtk.Widget.show(self.speakCellSpanCheckButton)
+        gtk.Box.pack_start(tableVBox, self.speakCellSpanCheckButton,
+                           False, False, 0)
+        gtk.ToggleButton.set_active(self.speakCellSpanCheckButton,
+                                    speakCellSpan)
+
+        label = _("Announce cell _header")
+        self.speakCellHeadersCheckButton = gtk.CheckButton(label)
+        gtk.Widget.show(self.speakCellHeadersCheckButton)
+        gtk.Box.pack_start(tableVBox, self.speakCellHeadersCheckButton, 
+                           False, False, 0)
+        gtk.ToggleButton.set_active(self.speakCellHeadersCheckButton,
+                                    speakCellHeaders)
+
+        label = _("Skip _blank cells")
+        self.skipBlankCellsCheckButton = gtk.CheckButton(label)
+        gtk.Widget.show(self.skipBlankCellsCheckButton)
+        gtk.Box.pack_start(tableVBox, self.skipBlankCellsCheckButton,
+                           False, False, 0)
+        gtk.ToggleButton.set_active(self.skipBlankCellsCheckButton,
+                                    skipBlankCells)
+
+        tableLabel = gtk.Label(_("<b>Table Navigation</b>"))
+        gtk.Widget.show(tableLabel)
+        gtk.Frame.set_label_widget(tableFrame, tableLabel)
+        gtk.Label.set_use_markup(tableLabel, True)
+
+        return vbox
+
+    def setAppPreferences(self, prefs):
+        """Write out the application specific preferences lines and set the
+        new values.
+
+        Arguments:
+        - prefs: file handle for application preferences.
+        """
+
+        global controlCaretNavigation, arrowToLineBeginning
+        global structuralNavigationEnabled
+        global speakCellCoordinates, speakCellSpan
+        global speakCellHeaders, skipBlankCells
+
+        prefs.writelines("\n")
+
+        value = self.controlCaretNavigationCheckButton.get_active()
+        prefs.writelines("orca.Gecko.controlCaretNavigation = %s\n" % value)
+        controlCaretNavigation = value
+
+        value = self.structuralNavigationCheckButton.get_active()
+        prefs.writelines("orca.Gecko.structuralNavigationEnabled = %s\n" % \
+                         value)
+        structuralNavigationEnabled = value
+
+        value = self.arrowToLineBeginningCheckButton.get_active()
+        prefs.writelines("orca.Gecko.arrowToLineBeginning = %s\n" % value)
+        arrowToLineBeginning = value
+
+        value = self.speakCellCoordinatesCheckButton.get_active()
+        prefs.writelines("orca.Gecko.speakCellCoordinates = %s\n" % value)
+        speakCellCoordinates = value
+
+        value = self.speakCellSpanCheckButton.get_active()
+        prefs.writelines("orca.Gecko.speakCellSpan = %s\n" % value)
+        speakCellSpan = value
+
+        value = self.speakCellHeadersCheckButton.get_active()
+        prefs.writelines("orca.Gecko.speakCellHeaders = %s\n" % value)
+        speakCellHeaders = value
+
+        value = self.skipBlankCellsCheckButton.get_active()
+        prefs.writelines("orca.Gecko.skipBlankCells = %s\n" % value)
+        skipBlankCells = value
+
     def consumesKeyboardEvent(self, keyboardEvent):
         """Called when a key is pressed on the keyboard.
 
Index: src/orca/script.py
===================================================================
--- src/orca/script.py	(revision 2330)
+++ src/orca/script.py	(working copy)
@@ -181,6 +181,21 @@
         """
         return where_am_I.WhereAmI(self)
 
+    def getAppPreferencesGUI(self):
+        """Return a GtkVBox contain the application unique configuration
+        GUI items for the current application.
+        """
+        return None
+
+    def setAppPreferences(self, prefs):
+        """Write out the application specific preferences lines and set the
+        new values.
+
+        Arguments:
+        - prefs: file handle for application preferences.
+        """
+        pass
+
     # [[[WDW - There is a circular reference going on somewhere (see
     # bug 333168).  In the presence of this reference, the existence
     # of a __del__ method prevents the garbage collector from
Index: src/orca/orca_gui_prefs.py
===================================================================
--- src/orca/orca_gui_prefs.py	(revision 2330)
+++ src/orca/orca_gui_prefs.py	(working copy)
@@ -1243,11 +1243,16 @@
         except:
             debug.printException(debug.LEVEL_SEVERE)
 
-    def _populateKeyBindings(self):
+    def _populateKeyBindings(self, clearModel=True):
         """Fills the TreeView with the list of Orca keybindings
+
+        Arguments:
+        - clearModel: if True, initially clear out the key bindings model.
         """
-        self.keyBindingsModel.clear()
 
+        if clearModel:
+            self.keyBindingsModel.clear()
+
         self.kbindings = keybindings.KeyBindings()
 
         iterOrca = self._createNode(_("Orca"))
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 2330)
+++ ChangeLog	(working copy)
@@ -1,3 +1,51 @@
+2007-05-01  Rich Burridge <rich.burridge@sun.com>
+
+        * src/orca/scripts/gaim.py:
+          src/orca/scripts/StarOffice.py:
+          src/orca/Gecko.py:
+          src/orca/orca_prefs.py:
+          src/orca/app_gui_prefs.py:
+          src/orca/script.py:
+          Work on bug #433146 – Add ability to configure app-unique
+          settings via GUI.
+
+          Added two new methods to the Script class:
+              def getAppPreferencesGUI(self):
+              Returns a GtkVBox contain the application unique configuration
+              GUI items for the current application.
+
+              def setAppPreferences(self, prefs):
+              Write out the application specific preferences lines and
+              set the new values.
+
+          Any application that has application unique settings need to
+          overridge those methods any implement them.
+
+          If <script>.getAppPreferencesGUI() does return something other
+          than None (the default), then that is assumed to be a Gtk widget
+          that can be given to a new tab in the application configuration
+          dialog.
+
+          Adjusted the gaim script to do exactly that. What this does seem
+          to mean is that those settings values need to be global variables
+          within the application script file rather than script variables
+          (self.<whatever>).
+
+          Similar adjustments for the StarOffice and Gecko scripts.
+
+        * src/orca/app_gui_prefs.py:
+          src/orca/orca_gui_prefs.py:
+          Added in the application specific key bindings to the key bindings
+          list in the application configuration dialog.
+
+          Added in the writing out of the application specific key bindings
+          to the ~/.orca/app-settings/<APPNAME>.py file.
+
+        * src/orca/focus_tracking_presenter.py:
+          Adjusted the loadAppSettings() method to pass in the current 
+          active script, so that the user's application specific key 
+          bindings can be set.
+
 2007-04-30  Rich Burridge <rich.burridge@sun.com>
 
         * src/orca/orca_prefs.py:
@@ -103,7 +151,6 @@
 	in keystroke files, when Orca is not speaking
 	during the test runs.
 
-
 2007-04-24  Rich Burridge <rich.burridge@sun.com>
 
         * src/orca/app_gui_prefs.py:   (new)
