[orca/new-settings] Implemented basic settings manager and classic and gconf backends.



commit 9b6502c384ec8ce8bcc6ee59feee01ea2e06f530
Author: Javier Hernandez Antunez <jhernandez emergya es>
Date:   Wed Jul 7 11:31:47 2010 +0200

    Implemented basic settings manager and classic and gconf backends.

 configure.in                        |    1 +
 src/orca/Makefile.am                |    5 +-
 src/orca/acss.py                    |   30 +-
 src/orca/backends/Makefile.am       |    9 +
 src/orca/backends/classic.py        |  877 ++++++++++++++++++++++++++
 src/orca/backends/gconf_backend.py  | 1164 +++++++++++++++++++++++++++++++++++
 src/orca/backends/gconf_defaults.py |  141 +++++
 src/orca/default.py                 |    7 +-
 src/orca/orca.py                    |   10 +-
 src/orca/orca_gui_prefs.py          |   15 +-
 src/orca/settings.py                |    4 +-
 src/orca/settings_manager.py        |   90 +++
 12 files changed, 2331 insertions(+), 22 deletions(-)
---
diff --git a/configure.in b/configure.in
index 473c8de..a864220 100644
--- a/configure.in
+++ b/configure.in
@@ -114,6 +114,7 @@ src/orca/scripts/toolkits/Makefile
 src/orca/scripts/toolkits/Gecko/Makefile
 src/orca/scripts/toolkits/J2SE-access-bridge/Makefile
 src/orca/scripts/toolkits/CALLY/Makefile
+src/orca/backends/Makefile
 src/orca/orca
 src/orca/orca_i18n.py
 src/orca/platform.py
diff --git a/src/orca/Makefile.am b/src/orca/Makefile.am
index 697cd00..6d67d14 100644
--- a/src/orca/Makefile.am
+++ b/src/orca/Makefile.am
@@ -62,6 +62,7 @@ orca_python_PYTHON = \
 	script.py \
 	script_utilities.py \
 	settings.py \
+        settings_manager.py \
 	sound.py \
 	speech.py \
 	speechdispatcherfactory.py \
@@ -74,7 +75,9 @@ orca_python_PYTHON = \
 
 orca_pythondir=$(pyexecdir)/orca
 
-SUBDIRS = scripts
+SUBDIRS = \
+        scripts \
+        backends
 
 ui_DATA = \
 	orca-advanced-magnification.ui \
diff --git a/src/orca/acss.py b/src/orca/acss.py
index 7ce0254..7451cab 100644
--- a/src/orca/acss.py
+++ b/src/orca/acss.py
@@ -63,19 +63,23 @@ class ACSS(dict):
         """Create and initialize ACSS structure."""
         dict.__init__(self)
         props = props or {}
-        for k in props:
-            if k in ACSS.settings:
-                # Do a 'deep copy' of the family.  Otherwise,
-                # the new ACSS shares the actual data with the
-                # props passed in.  This can cause unexpected
-                # side effects.
-                #
-                if k == ACSS.FAMILY:
-                    self[k] = {}
-                    for j in props[k].keys():
-                        self[k][j] = props[k][j]
-                else:
-                    self[k] = props[k]
+        if props:
+            for k in props:
+                if k in ACSS.settings:
+                    # Do a 'deep copy' of the family.  Otherwise,
+                    # the new ACSS shares the actual data with the
+                    # props passed in.  This can cause unexpected
+                    # side effects.
+                    #
+                    if k == ACSS.FAMILY:
+                        self[k] = {}
+                        for j in props[k].keys():
+                            self[k][j] = props[k][j]
+                    else:
+                        self[k] = props[k]
+        else: 
+            self['established'] = False
+
 
     def __setitem__ (self, key, value):
         """Update name when we change values."""
diff --git a/src/orca/backends/Makefile.am b/src/orca/backends/Makefile.am
new file mode 100644
index 0000000..a137dd4
--- /dev/null
+++ b/src/orca/backends/Makefile.am
@@ -0,0 +1,9 @@
+orca_pathdir=$(pyexecdir)
+
+orca_python_PYTHON = \
+        __init__.py \
+        classic.py \
+        gconf_backend.py \
+        gconf_defaults.py
+
+orca_pythondir=$(pyexecdir)/orca/backends
diff --git a/src/orca/backends/classic.py b/src/orca/backends/classic.py
new file mode 100644
index 0000000..edf1a8b
--- /dev/null
+++ b/src/orca/backends/classic.py
@@ -0,0 +1,877 @@
+# Orca
+#
+# Copyright 2004-2008 Sun Microsystems Inc.
+# Author: Javier Hernandez Antunez <jhernandez emergya es>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Common utilities to manage the writing of the user preferences file."""
+
+__id__        = "$Id$"
+__version__   = "$Revision$"
+__date__      = "$Date$"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import os
+import pprint
+
+from orca import settings
+
+# The same fields than in orca_gui_prefs.py:
+#
+(HANDLER, DESCRIP, MOD_MASK1, MOD_USED1, KEY1, CLICK_COUNT1, OLDTEXT1, \
+ TEXT1, MOD_MASK2, MOD_USED2, KEY2, CLICK_COUNT2, OLDTEXT2, TEXT2, MODIF, \
+ EDITABLE) = range(16)
+
+(ACTUAL, REPLACEMENT) = range(2)
+
+class OrcaPrefs:
+
+    def __init__(self, prefsDict, keyBindingsTreeModel=None,
+                 pronunciationTreeModel=None):
+        """Creates a new OrcaPrefs instance that will be used to write out
+        application specific preferences.
+
+        Arguments:
+        - prefsDict: a dictionary where the keys are orca preferences
+          names and the values are the values for the preferences.
+        - keyBindingsTreeModel - key bindings tree model, or None if we are
+          writing out console preferences.
+        - pronunciationTreeModel - pronunciation dictionary tree model, or
+          None if we are writing out console preferences.
+        """
+
+        self.prefsDict = prefsDict
+        self.keyBindingsTreeModel = keyBindingsTreeModel
+        self.pronunciationTreeModel = pronunciationTreeModel
+
+    def _createDir(self, dirname):
+        """Creates the given directory if it doesn't already exist.
+        """
+
+        try:
+            os.chdir(dirname)
+        except:
+            os.mkdir(dirname)
+
+    def _writePreferencesPreamble(self, prefs):
+        """Writes the preamble to the user-settings.py file."""
+
+        prefs.writelines("# -*- coding: utf-8 -*-\n")
+        prefs.writelines("# user-settings.py - custom Orca settings\n")
+        prefs.writelines("# Generated by orca.  DO NOT EDIT THIS FILE!!!\n")
+        prefs.writelines( \
+            "# If you want permanent customizations that will not\n")
+        prefs.writelines("# be overwritten, edit orca-customizations.py.\n")
+        prefs.writelines("#\n")
+        prefs.writelines("import re\n")
+        prefs.writelines("import time\n")
+        prefs.writelines("\n")
+        prefs.writelines("import orca.debug\n")
+        prefs.writelines("import orca.settings\n")
+        prefs.writelines("import orca.acss\n")
+        prefs.writelines("\n")
+
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_OFF\n")
+        prefs.writelines("orca.debug.debugLevel = orca.debug.LEVEL_SEVERE\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_WARNING\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_INFO\n")
+        prefs.writelines( \
+            "#orca.debug.debugLevel = orca.debug.LEVEL_CONFIGURATION\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_FINE\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_FINER\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_FINEST\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_ALL\n")
+        prefs.writelines("\n")
+        prefs.writelines("#orca.debug.eventDebugLevel = " \
+                         "orca.debug.LEVEL_OFF\n")
+        prefs.writelines("#orca.debug.eventDebugFilter = None\n")
+        prefs.writelines("#orca.debug.eventDebugFilter = " \
+                         "re.compile('[\S]*focus|[\S]*activ')\n")
+        prefs.writelines( \
+            "#orca.debug.eventDebugFilter = re.compile('nomatch')\n")
+        prefs.writelines("#orca.debug.eventDebugFilter = " \
+                         "re.compile('[\S]*:accessible-name')\n")
+        prefs.writelines("#orca.debug.eventDebugFilter = " \
+                         "re.compile('[\S]*:(?!bounds-changed)')\n")
+
+        prefs.writelines("\n")
+
+        prefs.writelines("#orca.debug.debugFile = " \
+                         "open(time.strftime('debug-%Y-%m-%d-%H:%M:%S.out'), "\
+                         "'w', 0)\n")
+        prefs.writelines("#orca.debug.debugFile = open('debug.out', 'w', 0)\n")
+        prefs.writelines("\n")
+
+        prefs.writelines("#orca.settings.useBonoboMain=False\n")
+        prefs.writelines("#orca.settings.debugEventQueue=True\n")
+        prefs.writelines("#orca.settings.gilSleepTime=0\n")
+        prefs.writelines("\n")
+
+        prefs.writelines("if False:\n")
+        prefs.writelines("    import sys\n")
+        prefs.writelines("    import orca.debug\n")
+        prefs.writelines("    sys.settrace(orca.debug.traceit)\n")
+        prefs.writelines("    orca.debug.debugLevel = orca.debug.LEVEL_ALL\n")
+        prefs.writelines("\n")
+
+    def _writePreferencesPostamble(self, prefs):
+        """Writes the postamble to the user-settings.py file."""
+
+        prefs.writelines("\nimport orca.orca_state\n")
+        prefs.writelines("\ntry:\n")
+        prefs.writelines("    reload(orca.orca_state.orcaCustomizations)\n")
+        prefs.writelines("except AttributeError:\n")
+        prefs.writelines("    try:\n")
+        prefs.writelines("        orca.orca_state.orcaCustomizations = "
+                         "__import__(\"orca-customizations\")\n")
+        prefs.writelines("    except ImportError:\n")
+        prefs.writelines("        pass\n")
+
+    def _enableAccessibility(self):
+        """Enables the GNOME accessibility flag.  Users need to log out and
+        then back in for this to take effect.
+
+        Returns True if an action was taken (i.e., accessibility was not
+        set prior to this call).
+        """
+
+        alreadyEnabled = settings.isAccessibilityEnabled()
+        if not alreadyEnabled:
+            settings.setAccessibilityEnabled(True)
+
+        return not alreadyEnabled
+
+    def _getDisplayString(self, display):
+        """Returns a string that represents the source or target 
+        magnifier display.
+
+        Arguments:
+        - display: the magnifier source or taget display string.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if not display:
+            return "''"
+        else:
+            return "'%s'" % display
+
+    def _getSpeechServerFactoryString(self, factory):
+        """Returns a string that represents the speech server factory passed in.
+
+        Arguments:
+        - factory: the speech server factory
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if not factory:
+            return None
+        elif isinstance(factory, basestring):
+            return "'%s'" % factory
+        else:
+            return "'%s'" % factory.__name__
+
+    def _getSpeechServerString(self, server):
+        """Returns a string that represents the speech server passed in.
+
+        Arguments:
+        - server: a speech server
+
+        Returns a string suitable for the preferences file.
+        """
+        if not server:
+            return None
+        elif isinstance(server, [].__class__):
+            return repr(server)
+        else:
+            return repr(server.getInfo())
+
+    def _getVoicesString(self, voices):
+        """Returns a string that represents the list of voices passed in.
+
+        Arguments:
+        - voices: a list of ACSS instances.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        voicesStr = "{\n"
+        for voice in voices:
+            voicesStr += "'%s' : orca.acss.ACSS(" % voice
+            voicesStr += pprint.pformat(voices[voice]) + "),\n"
+        voicesStr += "}"
+
+        return voicesStr
+
+    def _getKeyboardLayoutString(self, keyboardLayout):
+        """Returns a string that represents the keyboard layout passed in."""
+
+        if keyboardLayout == settings.GENERAL_KEYBOARD_LAYOUT_DESKTOP:
+            return "orca.settings.GENERAL_KEYBOARD_LAYOUT_DESKTOP"
+        else:
+            return "orca.settings.GENERAL_KEYBOARD_LAYOUT_LAPTOP"
+
+    def _getOrcaModifierKeysString(self, orcaModifierKeys):
+        """Returns a string that represents the Orca modifier keys passed in."""
+
+        if orcaModifierKeys == settings.DESKTOP_MODIFIER_KEYS:
+            return "orca.settings.DESKTOP_MODIFIER_KEYS"
+        else:
+            return "orca.settings.LAPTOP_MODIFIER_KEYS"
+
+    def _getSpokenTextAttributesString(self, enabledSpokenTextAttributes):
+        """ Returns a string that represents the enabled spoken text attributes 
+        passed in.
+        """
+
+        return "\"" + enabledSpokenTextAttributes + "\""
+
+    def _getBrailledTextAttributesString(self, enabledBrailledTextAttributes):
+        """ Returns a string that represents the enabled brailled text 
+        attributes passed in.
+        """
+
+        return "\"" + enabledBrailledTextAttributes + "\""
+
+    def _getTextAttributesBrailleIndicatorString(self, brailleIndicator):
+        """Returns a string that represents the text attribute braille indicator
+        value passed in."""
+
+        if brailleIndicator == settings.TEXT_ATTR_BRAILLE_NONE:
+            return "orca.settings.TEXT_ATTR_BRAILLE_NONE"
+        elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_7:
+            return "orca.settings.TEXT_ATTR_BRAILLE_7"
+        elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_8:
+            return "orca.settings.TEXT_ATTR_BRAILLE_8"
+        elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_BOTH:
+            return "orca.settings.TEXT_ATTR_BRAILLE_BOTH"
+        else:
+            return "orca.settings.TEXT_ATTR_BRAILLE_NONE"
+
+    def _getBrailleSelectionIndicatorString(self, selectionIndicator):
+        """Returns a string that represents the braille selection indicator
+        value passed in."""
+
+        if selectionIndicator == settings.BRAILLE_SEL_NONE:
+            return "orca.settings.BRAILLE_SEL_NONE"
+        elif selectionIndicator == settings.BRAILLE_SEL_7:
+            return "orca.settings.BRAILLE_SEL_7"
+        elif selectionIndicator == settings.BRAILLE_SEL_8:
+            return "orca.settings.BRAILLE_SEL_8"
+        elif selectionIndicator == settings.BRAILLE_SEL_BOTH:
+            return "orca.settings.BRAILLE_SEL_BOTH"
+        else:
+            return "orca.settings.BRAILLE_SEL_NONE"
+
+    def _getBrailleLinkIndicatorString(self, linkIndicator):
+        """Returns a string that represents the braille link indicator
+        value passed in."""
+
+        if linkIndicator == settings.BRAILLE_LINK_NONE:
+            return "orca.settings.BRAILLE_LINK_NONE"
+        elif linkIndicator == settings.BRAILLE_LINK_7:
+            return "orca.settings.BRAILLE_LINK_7"
+        elif linkIndicator == settings.BRAILLE_LINK_8:
+            return "orca.settings.BRAILLE_LINK_8"
+        elif linkIndicator == settings.BRAILLE_LINK_BOTH:
+            return "orca.settings.BRAILLE_LINK_BOTH"
+        else:
+            return "orca.settings.BRAILLE_LINK_NONE"
+
+    def _getVerbosityString(self, verbosityLevel):
+        """Returns a string that represents the verbosity level passed in."""
+
+        if verbosityLevel == settings.VERBOSITY_LEVEL_BRIEF:
+            return "orca.settings.VERBOSITY_LEVEL_BRIEF"
+        elif verbosityLevel == settings.VERBOSITY_LEVEL_VERBOSE:
+            return "orca.settings.VERBOSITY_LEVEL_VERBOSE"
+        else:
+            return "orca.settings.VERBOSITY_LEVEL_VERBOSE"
+
+    def _getBrailleRolenameStyleString(self, rolenameStyle):
+        """Returns a string that represents the rolename style passed in."""
+
+        if rolenameStyle == settings.BRAILLE_ROLENAME_STYLE_SHORT:
+            return "orca.settings.BRAILLE_ROLENAME_STYLE_SHORT"
+        elif rolenameStyle == settings.BRAILLE_ROLENAME_STYLE_LONG:
+            return "orca.settings.BRAILLE_ROLENAME_STYLE_LONG"
+        else:
+            return "orca.settings.BRAILLE_ROLENAME_STYLE_LONG"
+
+    def _getBrailleAlignmentStyleString(self, brailleAlignmentStyle):
+        """Returns a string that represents the brailleAlignmentStyle
+         passed in."""
+
+        if brailleAlignmentStyle == settings.ALIGN_BRAILLE_BY_WORD:
+            return "orca.settings.ALIGN_BRAILLE_BY_WORD"
+        if brailleAlignmentStyle == settings.ALIGN_BRAILLE_BY_MARGIN:
+            return "orca.settings.ALIGN_BRAILLE_BY_MARGIN"
+        else:
+            return "orca.settings.ALIGN_BRAILLE_BY_EDGE"
+
+    def _getVerbalizePunctuationStyleString(self, punctuationStyle):
+        """Returns a string that represents the punctuation style passed in."""
+
+        if punctuationStyle == settings.PUNCTUATION_STYLE_NONE:
+            return "orca.settings.PUNCTUATION_STYLE_NONE"
+        elif punctuationStyle == settings.PUNCTUATION_STYLE_SOME:
+            return "orca.settings.PUNCTUATION_STYLE_SOME"
+        elif punctuationStyle == settings.PUNCTUATION_STYLE_MOST:
+            return "orca.settings.PUNCTUATION_STYLE_MOST"
+        elif punctuationStyle == settings.PUNCTUATION_STYLE_ALL:
+            return "orca.settings.PUNCTUATION_STYLE_ALL"
+        else:
+            return "orca.settings.PUNCTUATION_STYLE_ALL"
+
+    def _getPresentTimeString(self, val):
+        if val == settings.TIME_FORMAT_24_HMS:
+            return "orca.settings.TIME_FORMAT_24_HMS"
+        elif val == settings.TIME_FORMAT_24_HMS_WITH_WORDS:
+            return "orca.settings.TIME_FORMAT_24_HMS_WITH_WORDS"
+        elif val == settings.TIME_FORMAT_24_HM:
+            return "orca.settings.TIME_FORMAT_24_HM"
+        elif val == settings.TIME_FORMAT_24_HM_WITH_WORDS:
+            return "orca.settings.TIME_FORMAT_24_HM_WITH_WORDS"
+        else:
+            return "orca.settings.TIME_FORMAT_LOCALE"
+
+    def _getPresentDateString(self, val):
+        if val == settings.DATE_FORMAT_WITH_LONG_NAMES:
+            return "orca.settings.DATE_FORMAT_WITH_LONG_NAMES"
+        elif val == settings.DATE_FORMAT_WITH_SHORT_NAMES:
+            return "orca.settings.DATE_FORMAT_WITH_SHORT_NAMES"
+        else:
+            return "orca.settings.DATE_FORMAT_LOCALE"
+
+
+    def _getSayAllStyleString(self, sayAllStyle):
+        """Returns a string that represents the say all style passed in."""
+
+        if sayAllStyle == settings.SAYALL_STYLE_LINE:
+            return "orca.settings.SAYALL_STYLE_LINE"
+        elif sayAllStyle == settings.SAYALL_STYLE_SENTENCE:
+            return "orca.settings.SAYALL_STYLE_SENTENCE"
+
+    def _getMagColorString(self, cursorColor):
+        """Returns a string that represents the magnification object's color
+        passed in.
+
+        Arguments:
+        - cursorColor: magnification object's color
+
+        Returns a string suitable for the preferences file.
+        """
+
+        cursorColorStr = "'%s'" % cursorColor
+
+        return cursorColorStr
+
+    def _getMagSmoothingModeString(self, smoothingMode):
+        """Returns a string that represents the magnification smoothing mode
+        passed in.
+
+        Arguments:
+        - smoothingMode: magnification smoothing mode.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if smoothingMode == settings.MAG_SMOOTHING_MODE_BILINEAR:
+            return "orca.settings.MAG_SMOOTHING_MODE_BILINEAR"
+        elif smoothingMode == settings.MAG_SMOOTHING_MODE_NONE:
+            return "orca.settings.MAG_SMOOTHING_MODE_NONE"
+        else:
+            return "orca.settings.MAG_SMOOTHING_MODE_BILINEAR"
+
+    def _getMagMouseTrackingModeString(self, mouseTrackingMode):
+        """Returns a string that represents the magnification mouse tracking
+        mode passed in.
+
+        Arguments:
+        - mouseTrackingMode: magnification mouse tracking mode.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if mouseTrackingMode == settings.MAG_TRACKING_MODE_CENTERED:
+            return "orca.settings.MAG_TRACKING_MODE_CENTERED"
+        elif mouseTrackingMode == settings.MAG_TRACKING_MODE_NONE:
+            return "orca.settings.MAG_TRACKING_MODE_NONE"
+        elif mouseTrackingMode == settings.MAG_TRACKING_MODE_PROPORTIONAL:
+            return "orca.settings.MAG_TRACKING_MODE_PROPORTIONAL"
+        elif mouseTrackingMode == settings.MAG_TRACKING_MODE_PUSH:
+            return "orca.settings.MAG_TRACKING_MODE_PUSH"
+        else:
+            return "orca.settings.MAG_TRACKING_MODE_CENTERED"
+
+    def _getMagControlTrackingModeString(self, controlTrackingMode):
+        """Returns a string that represents the magnification control
+        and menu item tracking mode passed in.
+
+        Arguments:
+        - controlTrackingMode: magnification control and menu item tracking 
+                               mode.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if controlTrackingMode == settings.MAG_TRACKING_MODE_CENTERED:
+            return "orca.settings.MAG_TRACKING_MODE_CENTERED"
+        elif controlTrackingMode == settings.MAG_TRACKING_MODE_NONE:
+            return "orca.settings.MAG_TRACKING_MODE_NONE"
+        elif controlTrackingMode == settings.MAG_TRACKING_MODE_PUSH:
+            return "orca.settings.MAG_TRACKING_MODE_PUSH"
+        else:
+            return "orca.settings.MAG_TRACKING_MODE_PUSH"
+
+    def _getMagTextTrackingModeString(self, textTrackingMode):
+        """Returns a string that represents the magnification text cursor
+        tracking mode passed in.
+
+        Arguments:
+        - textTrackingMode: magnification text cursor tracking mode.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if textTrackingMode == settings.MAG_TRACKING_MODE_CENTERED:
+            return "orca.settings.MAG_TRACKING_MODE_CENTERED"
+        elif textTrackingMode == settings.MAG_TRACKING_MODE_NONE:
+            return "orca.settings.MAG_TRACKING_MODE_NONE"
+        elif textTrackingMode == settings.MAG_TRACKING_MODE_PUSH:
+            return "orca.settings.MAG_TRACKING_MODE_PUSH"
+        else:
+            return "orca.settings.MAG_TRACKING_MODE_PUSH"
+
+    def _getMagColorFilteringModeString(self, mode):
+        """Returns a string that represents the magnification color filtering
+        mode passed in.
+
+        Arguments:
+        - mode: magnification color filtering mode.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if mode == settings.MAG_COLOR_FILTERING_MODE_NONE:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_NONE"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_SATURATE_RED:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_SATURATE_RED"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_SATURATE_GREEN:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_SATURATE_GREEN"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_SATURATE_BLUE:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_SATURATE_BLUE"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_DESATURATE_RED:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_DESATURATE_RED"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_DESATURATE_GREEN:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_DESATURATE_GREEN"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_DESATURATE_BLUE:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_DESATURATE_BLUE"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_POSITIVE_HUE_SHIFT:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_POSITIVE_HUE_SHIFT"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_NEGATIVE_HUE_SHIFT:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_NEGATIVE_HUE_SHIFT"
+        else:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_NONE"
+
+    def _getMagZoomerTypeString(self, magZoomerType):
+        """Returns a string that represents the magnification zoomer position
+        type passed in.
+
+        Arguments:
+        - magZoomerType: magnification zoomer position type.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if magZoomerType == settings.MAG_ZOOMER_TYPE_FULL_SCREEN:
+            return "orca.settings.MAG_ZOOMER_TYPE_FULL_SCREEN"
+        elif magZoomerType == settings.MAG_ZOOMER_TYPE_TOP_HALF:
+            return "orca.settings.MAG_ZOOMER_TYPE_TOP_HALF"
+        elif magZoomerType == settings.MAG_ZOOMER_TYPE_BOTTOM_HALF:
+            return "orca.settings.MAG_ZOOMER_TYPE_BOTTOM_HALF"
+        elif magZoomerType == settings.MAG_ZOOMER_TYPE_LEFT_HALF:
+            return "orca.settings.MAG_ZOOMER_TYPE_LEFT_HALF"
+        elif magZoomerType == settings.MAG_ZOOMER_TYPE_RIGHT_HALF:
+            return "orca.settings.MAG_ZOOMER_TYPE_RIGHT_HALF"
+        elif magZoomerType == settings.MAG_ZOOMER_TYPE_CUSTOM:
+            return "orca.settings.MAG_ZOOMER_TYPE_CUSTOM"
+        else:
+            return "orca.settings.MAG_ZOOMER_TYPE_FULL_SCREEN"
+
+    def _getProgressBarVerbosityString(self, verbosityLevel):
+        """Returns a string that represents the progress bar verbosity level
+        passed in.
+
+        Arguments:
+        - verbosityLevel: verbosity level for progress bars.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if verbosityLevel == settings.PROGRESS_BAR_ALL:
+            return "orca.settings.PROGRESS_BAR_ALL"
+        elif verbosityLevel == settings.PROGRESS_BAR_WINDOW:
+            return "orca.settings.PROGRESS_BAR_WINDOW"
+        else:
+            return "orca.settings.PROGRESS_BAR_APPLICATION"
+
+    def _writeKeyBindingsPreamble(self, prefs):
+        """Writes the preamble to the user-settings.py keyBindings section."""
+
+        prefs.writelines("\n")
+        prefs.writelines("# Set up a user key-bindings profile\n")
+        prefs.writelines("#\n")
+        prefs.writelines('def overrideKeyBindings(script, keyB):\n')
+
+    def _writeKeyBinding(self, prefs, tupl):
+        """Writes a single keyBinding to the user-settings.py 
+        keyBindings section.
+
+        Arguments:
+        - prefs: text string - file to write the key binding to.
+        - tupl:    tuple     - a tuple with the values of the
+                                 keybinding (gtk.TreeStore model columns)
+        """
+
+
+        prefs.writelines("   keyB.removeByHandler(script.inputEventHandlers['" \
+                         + str(tupl[HANDLER])+"'])\n")
+        if not (tupl[TEXT1] or tupl[TEXT2]):
+            prefs.writelines("   keyB.add(orca.keybindings.KeyBinding(\n")
+            prefs.writelines("      '',\n")
+            prefs.writelines("      %d,\n" % settings.defaultModifierMask)
+            prefs.writelines("      0,\n")
+            prefs.writelines('      script.inputEventHandlers["' + \
+                             str(tupl[HANDLER]) +'"]))\n\n')
+
+        if (tupl[TEXT1]):
+            prefs.writelines("   keyB.add(orca.keybindings.KeyBinding(\n")
+            prefs.writelines("      '" + str(tupl[KEY1]) + "',\n")
+            if tupl[MOD_MASK1] or tupl[MOD_USED1]:
+                prefs.writelines("      " + str(tupl[MOD_MASK1]) + ",\n")
+                prefs.writelines("      " + str(tupl[MOD_USED1]) + ",\n")
+            else:
+                prefs.writelines("      0,\n")
+                prefs.writelines("      0,\n")
+            if (tupl[CLICK_COUNT1] == "1"):
+                prefs.writelines('      script.inputEventHandlers["' + \
+                                 str(tupl[HANDLER]) +'"]))\n\n')
+            else:
+                prefs.writelines('      script.inputEventHandlers["' + \
+                                 str(tupl[HANDLER]) +'"],\n')
+                prefs.writelines("      " + str(tupl[CLICK_COUNT1])  + \
+                                 "))\n\n")
+
+        if (tupl[TEXT2]):
+            prefs.writelines("   keyB.add(orca.keybindings.KeyBinding(\n")
+            prefs.writelines("      '" + str(tupl[KEY2]) + "',\n")
+            if tupl[MOD_MASK2] or tupl[MOD_USED2]:
+                prefs.writelines("      " + str(tupl[MOD_MASK2]) + ",\n")
+                prefs.writelines("      " + str(tupl[MOD_USED2]) + ",\n")
+            else:
+                prefs.writelines("      %d,\n" % settings.defaultModifierMask)
+                prefs.writelines("      0,\n")
+            if (tupl[CLICK_COUNT2] == "1"):
+                prefs.writelines('      script.inputEventHandlers["' + \
+                                 str(tupl[HANDLER]) +'"]))\n\n')
+            else:
+                prefs.writelines('      script.inputEventHandlers["' + \
+                                 str(tupl[HANDLER]) +'"],\n')
+                prefs.writelines("      " + str(tupl[CLICK_COUNT2])  + \
+                                 "))\n\n")
+
+    def _writeKeyBindingsPostamble(self, prefs):
+        """Writes the postamble to the user-settings.py keyBindings section."""
+
+        prefs.writelines('   return keyB')
+        prefs.writelines("\n\n")
+        prefs.writelines( \
+            'orca.settings.overrideKeyBindings = overrideKeyBindings')
+        prefs.writelines("\n")
+
+    def _iterateKeyBindings(self, prefs, treeModel):
+        """Iterate over all the key bindings in the tree model and write
+        out all that the user has modified.
+        """
+
+        thisIter = treeModel.get_iter_first()
+        while thisIter != None:
+            iterChild = treeModel.iter_children(thisIter)
+            while iterChild != None:
+                values = treeModel.get(iterChild,
+                                       0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
+                if values[MODIF]:
+                    self._writeKeyBinding(prefs, values)
+                iterChild = treeModel.iter_next(iterChild)
+            thisIter = treeModel.iter_next(thisIter)
+
+    def _writeKeyBindingsMap(self, prefs, treeModel):
+        """Write to configuration file 'prefs' the key bindings passed in the
+        model treeModel.
+        """
+
+        self._writeKeyBindingsPreamble(prefs)
+        self._iterateKeyBindings(prefs, treeModel)
+        self._writeKeyBindingsPostamble(prefs)
+
+    def _writePronunciationsPreamble(self, prefs):
+        """Writes the preamble to the  ~/.orca/user-settings.py
+        pronunciations section."""
+
+        prefs.writelines("\n")
+        prefs.writelines( \
+            "# User customized pronunciation dictionary settings\n")
+        prefs.writelines("#\n")
+        prefs.writelines("import orca.pronunciation_dict\n\n")
+        prefs.writelines("orca.pronunciation_dict.pronunciation_dict={}\n")
+
+    def _writePronunciation(self, prefs, word, value):
+        """Write out a single pronunciation entry to the 
+        ~/.orca/user-setting.py settings file.
+
+        Arguments:
+        - prefs: file handle for user preferences.
+        - word: the actual word to be pronunced.
+        - value: the replacement string to use.
+        """
+
+        prefs.writelines("orca.pronunciation_dict.setPronunciation(" + \
+                         repr(word) + ", " + repr(value) + ")\n")
+
+    def _iteratePronunciations(self, prefs, treeModel):
+        """Iterate over each of the entries in the tree model and write out
+        a pronunciation diction entry for them.  If any strings with an
+        actual string of "" are found, they are ignored.
+        """
+
+        thisIter = treeModel.get_iter_first()
+        while thisIter != None:
+            values = treeModel.get(thisIter, ACTUAL, REPLACEMENT)
+            word = values[ACTUAL]
+            value = values[REPLACEMENT]
+
+            if word != "":
+                self._writePronunciation(prefs, word, value)
+
+            thisIter = treeModel.iter_next(thisIter)
+
+    def _writePronunciationMap(self, prefs, treeModel):
+        """Write to configuration file 'prefs' the new pronunciation dictionary
+        entries passed in the model treeModel.
+
+        Arguments:
+        - prefs: file handle for application preferences.
+        - treeModel: pronunciation dictionary tree model.
+        """
+
+        self._writePronunciationsPreamble(prefs)
+        self._iteratePronunciations(prefs, treeModel)
+
+    def _setupPreferencesDirs(self):
+        """Creates the directories and standard files to hold user 
+        preferences."""
+
+        # Set up the user's preferences directory (~/.orca by default).
+        #
+        orcaDir = settings.userPrefsDir
+        self._createDir(orcaDir)
+
+        # Set up ~/.orca/orca-scripts as a Python package
+        #
+        orcaScriptDir = os.path.join(orcaDir, "orca-scripts")
+        self._createDir(orcaScriptDir)
+        initFile = os.path.join(orcaScriptDir, "__init__.py")
+        if not os.path.exists(initFile):
+            os.close(os.open(initFile, os.O_CREAT, 0700))
+
+        # Set up ~/.orca/app-settings as a Python package.
+        #
+        orcaSettingsDir = os.path.join(orcaDir, "app-settings")
+        self._createDir(orcaSettingsDir)
+        initFile = os.path.join(orcaSettingsDir, "__init__.py")
+        if not os.path.exists(initFile):
+            os.close(os.open(initFile, os.O_CREAT, 0700))
+
+    def _getValueForKey(self, prefsDict, key):
+        """Return the value associated with this preferences dictionary key
+
+        Arguments:
+        - prefsDict: a dictionary where the keys are orca preferences
+        names and the values are the values for the preferences.
+        - key: the preferences dictionary key.
+
+        Return the value of the given preferences dictionary key.
+        """
+
+        value = None
+        if key in prefsDict:
+            if key == "voices":
+                value = self._getVoicesString(prefsDict[key])
+            elif key == "speechServerInfo":
+                value = self._getSpeechServerString(prefsDict[key])
+            elif key == "speechServerFactory":
+                value = self._getSpeechServerFactoryString(prefsDict[key])
+            elif key.endswith("VerbosityLevel"):
+                value = self._getVerbosityString(prefsDict[key])
+            elif key == "brailleRolenameStyle":
+                value = self._getBrailleRolenameStyleString(prefsDict[key])
+            elif key == "brailleSelectorIndicator":
+                value = self._getBrailleSelectionIndicatorString(prefsDict[key])
+            elif key == "brailleLinkIndicator":
+                value = self._getBrailleLinkIndicatorString(prefsDict[key])
+            elif key == "brailleAlignmentStyle":
+                value = self._getBrailleAlignmentStyleString(prefsDict[key])
+            elif key == "verbalizePunctuationStyle":
+                value = self._getVerbalizePunctuationStyleString(prefsDict[key])
+            elif key == "presentDateFormat":
+                value = self._getPresentDateString(prefsDict[key])
+            elif key == "presentTimeFormat":
+                value = self._getPresentTimeString(prefsDict[key])
+            elif key == "sayAllStyle":
+                value = self._getSayAllStyleString(prefsDict[key])
+            elif key in ["magCursorColor",
+                         "magCrossHairColor",
+                         "magZoomerBorderColor"]:
+                value = self._getMagColorString(prefsDict[key])
+            elif key == "magSmoothingMode":
+                value = self._getMagSmoothingModeString(prefsDict[key])
+            elif key == "magMouseTrackingMode":
+                value = self._getMagMouseTrackingModeString(prefsDict[key])
+            elif key == "magControlTrackingMode":
+                value = self._getMagControlTrackingModeString(prefsDict[key])
+            elif key == "magTextTrackingMode":
+                value = self._getMagTextTrackingModeString(prefsDict[key])
+            elif key == "magZoomerType":
+                value = self._getMagZoomerTypeString(prefsDict[key])
+            elif key == "magColorFilteringMode":
+                value = self._getMagColorFilteringModeString(prefsDict[key])
+            elif key == "magSourceDisplay" or key == "magTargetDisplay":
+                value = self._getDisplayString(prefsDict[key])
+            elif key == "keyboardLayout":
+                value = self._getKeyboardLayoutString(prefsDict[key])
+            elif key == "orcaModifierKeys":
+                value = self._getOrcaModifierKeysString(prefsDict[key])
+            elif key == "enabledSpokenTextAttributes":
+                value = self._getSpokenTextAttributesString(prefsDict[key])
+            elif key == "enabledBrailledTextAttributes":
+                value = self._getBrailledTextAttributesString(prefsDict[key])
+            elif key == "textAttributesBrailleIndicator":
+                value = self._getTextAttributesBrailleIndicatorString( \
+                                                              prefsDict[key])
+            elif key == "progressBarVerbosity":
+                value = self._getProgressBarVerbosityString(prefsDict[key])
+            elif key == "brailleContractionTable":
+                value = "'%s'" % prefsDict[key]
+            elif key == "brailleEOLIndicator":
+                value = "'%s'" % prefsDict[key]
+            elif key == "brailleRequiredStateString":
+                value = "'%s'" % prefsDict[key]
+            elif key == "speechRequiredStateString":
+                value = "'%s'" % prefsDict[key]
+            else:
+                value = prefsDict[key]
+
+        return value
+
+    def writePreferences(self):
+        """Creates the directory and files to hold user preferences.  Note
+        that callers of this method may want to consider using an ordered
+        dictionary so that the keys are output in a deterministic order.
+
+        Returns True if accessibility was enabled as a result of this
+        call.
+        """
+
+        self._setupPreferencesDirs()
+
+        # Write ~/.orca/user-settings.py
+        #
+        orcaDir = settings.userPrefsDir
+        prefs = open(os.path.join(orcaDir, "user-settings.py"), "w")
+        self._writePreferencesPreamble(prefs)
+
+        for key in settings.userCustomizableSettings:
+            value = self._getValueForKey(self.prefsDict, key)
+            if value != None:
+                prefs.writelines("orca.settings.%s = %s\n" % (key, value))
+
+        if self.keyBindingsTreeModel:
+            self._writeKeyBindingsMap(prefs, self.keyBindingsTreeModel)
+
+        if self.pronunciationTreeModel:
+            self._writePronunciationMap(prefs, self.pronunciationTreeModel)
+
+        self._writePreferencesPostamble(prefs)
+        prefs.close()
+
+        # Return True if this caused accessibility to be enabled
+        # as a result of this call.
+        #
+        return self._enableAccessibility()
+
+    def loadSettings(self):
+        """Load settings"""
+
+        UserSettings = __import__("user-settings")
+        return UserSettings
+
+def readPreferences():
+    """Returns a dictionary containing the names and values of the
+    customizable features of Orca."""
+
+    prefsDict = {}
+    for key in settings.userCustomizableSettings:
+        try:
+            prefsDict[key] = getattr(settings, key)
+        except:
+            pass 
+
+    return prefsDict
+
+def writePreferences(prefsDict, keyBindingsTreeModel=None,
+                     pronunciationTreeModel=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
+    of this method may want to consider using an ordered dictionary so
+    that the keys are output in a deterministic order.
+
+    Arguments:
+    - prefsDict: a dictionary where the keys are orca preferences
+    names and the values are the values for the preferences.
+    - keyBindingsTreeModel - key bindings tree model, or None if we are
+    writing out console preferences.
+    - pronunciationTreeModel - pronunciation dictionary tree model, or
+    None if we are writing out console preferences.
+
+    Returns True if the user needs to log out for accessibility settings
+    to take effect.
+    """
+
+    orcaPrefs = OrcaPrefs(prefsDict, 
+                          keyBindingsTreeModel, 
+                          pronunciationTreeModel)
+    return orcaPrefs.writePreferences()
+
+def loadSettings():
+    """Load settings"""
+
+    UserSettings = __import__("user-settings")
+    return UserSettings
diff --git a/src/orca/backends/gconf_backend.py b/src/orca/backends/gconf_backend.py
new file mode 100644
index 0000000..1155e67
--- /dev/null
+++ b/src/orca/backends/gconf_backend.py
@@ -0,0 +1,1164 @@
+# Orca
+#
+# Copyright 2004-2008 Sun Microsystems Inc.
+# Author: Javier Hernandez Antunez <jhernandez emergya es>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Common utilities to manage the store user preferences over gconf."""
+
+__id__        = "$Id$"
+__version__   = "$Revision$"
+__date__      = "$Date$"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import os
+import pprint
+
+import orca
+from orca import settings
+import orca.acss
+import gconf
+import types
+
+# The same fields than in orca_gui_prefs.py:
+(HANDLER, DESCRIP, MOD_MASK1, MOD_USED1, KEY1, CLICK_COUNT1, OLDTEXT1, \
+ TEXT1, MOD_MASK2, MOD_USED2, KEY2, CLICK_COUNT2, OLDTEXT2, TEXT2, MODIF, \
+ EDITABLE) = range(16)
+
+(ACTUAL, REPLACEMENT) = range(2)
+
+class GConfKeysDict(dict):
+    VALID_KEY_TYPES = (bool, str, int, float, list, tuple)
+
+    def __init__(self, *args, **kwargs):
+        super(dict, self).__init__(*args, **kwargs)
+
+    def __setitem__(self, key, val):
+        if not type(val) in self.VALID_KEY_TYPES:
+            raise 'Invalid %s for gconf key' % type(val)
+        else:
+            dict.__setitem__(self, key, val)
+
+
+class OrcaPrefs():
+    # set gconf configuration properties
+    GCONF_DIR = '/apps/gnome-orca'
+    VALID_KEY_TYPES = (bool, str, int, list, tuple)
+    import gconf_defaults
+
+    DEFAULTS = gconf_defaults.defaults
+    
+    need2repr = ['brailleEOLIndicator', 'brailleContractionTable', 'brailleRequiredStateString',
+                'enabledBrailledTextAttributes', 'enabledSpokenTextAttributes', 'magZoomerBorderColor',
+                'magCursorColor', 'magCrossHairColor', 'magTargetDisplay', 'magSourceDisplay',
+                'speechRequiredStateString', 'speechServerFactory', 'presentDateFormat', 'presentTimeFormat']
+
+#    need2repr = ['speechServerFactory', 'brailleEOLIndicator', 'magCursorColor', 'magCrossHairColor', 
+#                'magZoomerBorderColor', 'magTargetDisplay', 'magSourceDisplay', 'enabledSpokenTextAttributes',
+#                'enabledBrailledTextAttributes', 'brailleContractionTable']
+
+#    DEFAULTS = {
+#        'speakCellHeaders': True,
+#        'magEdgeMargin': 0,
+#        'brailleContractionTable': '',
+#        'magPointerFollowsFocus': False,
+#        'magTextTrackingMode': 2
+#    }
+
+#    DEFAULTS = {'key-1' : 1,
+#                'key-2' : 'dos',
+#                'key-3' : ['uno', 2],
+#                'key-4' : {'key-4.1': 1, 'clave-4.2' : 'key 4.2 string value',
+#                            'key-4.3' : {'key-4.3.1' : 'key 4.3.1 string value'},
+#                            'key-4.4': ['4.4 List #1', '4.4 List #2', 4.403]
+#                            },
+#                'key-5' : 'key 5 string value',
+#                'key-6' : {'key-6.1' : 'key 6.1 string value'},
+#                'key-7' : 7
+#               }
+
+
+    def __init__(self, prefsDict=None, keyBindingsTreeModel=None,
+                 pronunciationTreeModel=None):
+        """Creates a new OrcaPrefs instance that will be used to load/store
+        application specific preferences.
+
+        Arguments:
+        - prefsDict: a dictionary where the keys are orca preferences
+          names and the values are the values for the preferences, or none if
+          we are loading user settings.
+        - keyBindingsTreeModel - key bindings tree model, or None if we are
+          writing out console preferences.
+        - pronunciationTreeModel - pronunciation dictionary tree model, or
+          None if we are writing out console preferences.
+        """
+
+        # init gconf
+        self.__app_key = self.GCONF_DIR
+        self._client = gconf.client_get_default()
+        self._client.add_dir(self.GCONF_DIR[:-1], gconf.CLIENT_PRELOAD_RECURSIVE)
+        self._notifications = []
+
+        self.options = GConfKeysDict()
+        self.options.update(self.DEFAULTS)
+
+        # store dicts if needed
+        self.prefsDict = prefsDict
+        self.keyBindingsTreeModel = keyBindingsTreeModel
+        self.pronunciationTreeModel = pronunciationTreeModel
+
+        if prefsDict:
+            self.options = self.prefsDict
+
+
+    def gconf_load(self, dir = None):
+        casts = {gconf.VALUE_BOOL:   gconf.Value.get_bool,
+            gconf.VALUE_INT:    gconf.Value.get_int,
+            gconf.VALUE_FLOAT:  gconf.Value.get_float,
+            gconf.VALUE_STRING: gconf.Value.get_string,
+            gconf.VALUE_LIST:   gconf.Value.get_list}
+
+        new_settings = False
+
+        if dir:
+            self.__app_key = dir
+
+        for entry in self._client.all_entries(self.__app_key):
+#PORQUE?            self.options[entry.key.split(self.__app_key + '/')[1]] = self._client.get(entry.key).to_string()
+            gval = self._client.get(entry.key)
+            if gval == None: continue
+ 
+            if gval.type == gconf.VALUE_LIST:
+                string_list = [item.get_string() for item in gval.get_list()]
+                if dir:
+                    dictString = ''
+                    dictString = self.__format_gconf_dir(dir, entry)
+                    dictString += ' = %s ' % string_list
+                    exec(dictString)
+                else:
+                    self.options[entry.key.split('/')[-1]] = string_list
+            else:
+                if dir:
+                    dictString = ''
+                    dictString = self.__format_gconf_dir(dir, entry)
+                    dictString += ' = %s ' % repr(casts[gval.type](gval))
+                    exec(dictString)
+                else:
+                    self.options[entry.key.split('/')[-1]] = casts[gval.type](gval)
+
+        for dir in self._client.all_dirs(self.__app_key):
+            self.gconf_load(dir)
+            self.__app_key = \
+                self.__app_key.split(reversed(self.__app_key.split('/')).next())[0][:-1]
+
+        if not new_settings:
+            return True
+
+    def __format_gconf_dir(self, dir, entry):
+        formatDir = dir.split('/')
+
+        for item in range(3):
+            formatDir.pop(0)
+        dictString = 'self.options'
+
+        for item in formatDir:
+            dictString += repr([item])
+        dictString += repr([entry.key.split('/')[-1]])
+
+        return dictString
+
+
+    def gconf_save(self, key = None, keyDictionary = None):
+        casts = {types.BooleanType: gconf.Client.set_bool,
+            types.IntType:     gconf.Client.set_int,
+            types.FloatType:   gconf.Client.set_float,
+            types.StringType:  gconf.Client.set_string,
+            types.ListType:    gconf.Client.set_list,
+            types.TupleType:   gconf.Client.set_list}
+
+        if key and keyDictionary:
+            self.__app_key += '/%s' % key
+            keyDict = keyDictionary
+        else:
+            if not self.prefsDict:
+                keyDict = self.options = self.DEFAULTS
+            else:
+                keyDict = self.options = self.prefsDict
+
+ 
+        for name, value in keyDict.items():
+            print '### Guardando %s = %s' % (name, value)
+            if isinstance(value, dict) and len(value) != 0:
+                self.gconf_save(name, value)
+                self.__app_key = \
+                    self.__app_key[:len(self.__app_key) - (len(name) + 1)]
+                continue
+
+            if type(value) in (list, tuple) and value != 0:
+                string_value = [str(item) for item in value]
+                casts[type(value)](self._client, self.__app_key + '/' + name,
+                    gconf.VALUE_STRING, string_value)
+            else:
+                if name == 'sayAllStyle':
+                    print 'que pasa con sayAllStyle = %s' % value
+                if name in self.need2repr and value != None:
+                    value = self._fix_quotes(value)
+                if value != None and not isinstance(value, dict):
+                    casts[type(value)](self._client, self.__app_key + '/' + name,
+                        value)
+                else:
+                    print 'se obvia %s por ser None' % name
+
+
+    def _writePreferencesPreamble(self, prefs):
+        """Writes the preamble to the user-settings.py file."""
+
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_OFF\n")
+        prefs.writelines("orca.debug.debugLevel = orca.debug.LEVEL_SEVERE\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_WARNING\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_INFO\n")
+        prefs.writelines( \
+            "#orca.debug.debugLevel = orca.debug.LEVEL_CONFIGURATION\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_FINE\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_FINER\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_FINEST\n")
+        prefs.writelines("#orca.debug.debugLevel = orca.debug.LEVEL_ALL\n")
+        prefs.writelines("\n")
+        prefs.writelines("#orca.debug.eventDebugLevel = " \
+                         "orca.debug.LEVEL_OFF\n")
+        prefs.writelines("#orca.debug.eventDebugFilter = None\n")
+        prefs.writelines("#orca.debug.eventDebugFilter = " \
+                         "re.compile('[\S]*focus|[\S]*activ')\n")
+        prefs.writelines( \
+            "#orca.debug.eventDebugFilter = re.compile('nomatch')\n")
+        prefs.writelines("#orca.debug.eventDebugFilter = " \
+                         "re.compile('[\S]*:accessible-name')\n")
+        prefs.writelines("#orca.debug.eventDebugFilter = " \
+                         "re.compile('[\S]*:(?!bounds-changed)')\n")
+
+        prefs.writelines("\n")
+
+        prefs.writelines("#orca.debug.debugFile = " \
+                         "open(time.strftime('debug-%Y-%m-%d-%H:%M:%S.out'), "\
+                         "'w', 0)\n")
+        prefs.writelines("#orca.debug.debugFile = open('debug.out', 'w', 0)\n")
+        prefs.writelines("\n")
+
+        prefs.writelines("#orca.settings.useBonoboMain=False\n")
+        prefs.writelines("#orca.settings.debugEventQueue=True\n")
+        prefs.writelines("#orca.settings.gilSleepTime=0\n")
+        prefs.writelines("\n")
+
+        prefs.writelines("if False:\n")
+        prefs.writelines("    import sys\n")
+        prefs.writelines("    import orca.debug\n")
+        prefs.writelines("    sys.settrace(orca.debug.traceit)\n")
+        prefs.writelines("    orca.debug.debugLevel = orca.debug.LEVEL_ALL\n")
+        prefs.writelines("\n")
+
+    def _writePreferencesPostamble(self, prefs):
+        """Writes the postamble to the user-settings.py file."""
+
+        prefs.writelines("\nimport orca.orca_state\n")
+        prefs.writelines("\ntry:\n")
+        prefs.writelines("    reload(orca.orca_state.orcaCustomizations)\n")
+        prefs.writelines("except AttributeError:\n")
+        prefs.writelines("    try:\n")
+        prefs.writelines("        orca.orca_state.orcaCustomizations = "
+                         "__import__(\"orca-customizations\")\n")
+        prefs.writelines("    except ImportError:\n")
+        prefs.writelines("        pass\n")
+
+    def _enableAccessibility(self):
+        """Enables the GNOME accessibility flag.  Users need to log out and
+        then back in for this to take effect.
+
+        Returns True if an action was taken (i.e., accessibility was not
+        set prior to this call).
+        """
+
+        alreadyEnabled = settings.isAccessibilityEnabled()
+        if not alreadyEnabled:
+            settings.setAccessibilityEnabled(True)
+
+        return not alreadyEnabled
+
+    def _getDisplayString(self, display):
+        """Returns a string that represents the source or target 
+        magnifier display.
+
+        Arguments:
+        - display: the magnifier source or taget display string.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if not display:
+            return "''"
+        else:
+            return "'%s'" % display
+
+    def _getSpeechServerFactoryString(self, factory):
+        """Returns a string that represents the speech server factory passed in.
+
+        Arguments:
+        - factory: the speech server factory
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if not factory:
+            return None
+        elif isinstance(factory, basestring):
+            return "'%s'" % factory
+        else:
+            return "'%s'" % factory.__name__
+
+    def _getSpeechServerString(self, server):
+        """Returns a string that represents the speech server passed in.
+
+        Arguments:
+        - server: a speech server
+
+        Returns a string suitable for the preferences file.
+        """
+        if not server:
+            return None
+        elif isinstance(server, [].__class__):
+            return repr(server)
+        else:
+            return repr(server.getInfo())
+
+    def _getVoicesString(self, voices):
+        """Returns a string that represents the list of voices passed in.
+
+        Arguments:
+        - voices: a list of ACSS instances.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        voicesStr = "{\n"
+        for voice in voices:
+            voicesStr += "'%s' : orca.acss.ACSS(" % voice
+            voicesStr += pprint.pformat(voices[voice]) + "),\n"
+        voicesStr += "}"
+
+        return voicesStr
+
+    def _getKeyboardLayoutString(self, keyboardLayout):
+        """Returns a string that represents the keyboard layout passed in."""
+
+        if keyboardLayout == settings.GENERAL_KEYBOARD_LAYOUT_DESKTOP:
+            return "orca.settings.GENERAL_KEYBOARD_LAYOUT_DESKTOP"
+        else:
+            return "orca.settings.GENERAL_KEYBOARD_LAYOUT_LAPTOP"
+
+    def _getOrcaModifierKeysString(self, orcaModifierKeys):
+        """Returns a string that represents the Orca modifier keys passed in."""
+
+        if orcaModifierKeys == settings.DESKTOP_MODIFIER_KEYS:
+            return "orca.settings.DESKTOP_MODIFIER_KEYS"
+        else:
+            return "orca.settings.LAPTOP_MODIFIER_KEYS"
+
+    def _getSpokenTextAttributesString(self, enabledSpokenTextAttributes):
+        """ Returns a string that represents the enabled spoken text attributes 
+        passed in.
+        """
+
+        return "\"" + enabledSpokenTextAttributes + "\""
+
+    def _getBrailledTextAttributesString(self, enabledBrailledTextAttributes):
+        """ Returns a string that represents the enabled brailled text 
+        attributes passed in.
+        """
+
+        return "\"" + enabledBrailledTextAttributes + "\""
+
+    def _getTextAttributesBrailleIndicatorString(self, brailleIndicator):
+        """Returns a string that represents the text attribute braille indicator
+        value passed in."""
+
+        if brailleIndicator == settings.TEXT_ATTR_BRAILLE_NONE:
+            return "orca.settings.TEXT_ATTR_BRAILLE_NONE"
+        elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_7:
+            return "orca.settings.TEXT_ATTR_BRAILLE_7"
+        elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_8:
+            return "orca.settings.TEXT_ATTR_BRAILLE_8"
+        elif brailleIndicator == settings.TEXT_ATTR_BRAILLE_BOTH:
+            return "orca.settings.TEXT_ATTR_BRAILLE_BOTH"
+        else:
+            return "orca.settings.TEXT_ATTR_BRAILLE_NONE"
+
+    def _getBrailleSelectionIndicatorString(self, selectionIndicator):
+        """Returns a string that represents the braille selection indicator
+        value passed in."""
+
+        if selectionIndicator == settings.BRAILLE_SEL_NONE:
+            return "orca.settings.BRAILLE_SEL_NONE"
+        elif selectionIndicator == settings.BRAILLE_SEL_7:
+            return "orca.settings.BRAILLE_SEL_7"
+        elif selectionIndicator == settings.BRAILLE_SEL_8:
+            return "orca.settings.BRAILLE_SEL_8"
+        elif selectionIndicator == settings.BRAILLE_SEL_BOTH:
+            return "orca.settings.BRAILLE_SEL_BOTH"
+        else:
+            return "orca.settings.BRAILLE_SEL_NONE"
+
+    def _getBrailleLinkIndicatorString(self, linkIndicator):
+        """Returns a string that represents the braille link indicator
+        value passed in."""
+
+        if linkIndicator == settings.BRAILLE_LINK_NONE:
+            return "orca.settings.BRAILLE_LINK_NONE"
+        elif linkIndicator == settings.BRAILLE_LINK_7:
+            return "orca.settings.BRAILLE_LINK_7"
+        elif linkIndicator == settings.BRAILLE_LINK_8:
+            return "orca.settings.BRAILLE_LINK_8"
+        elif linkIndicator == settings.BRAILLE_LINK_BOTH:
+            return "orca.settings.BRAILLE_LINK_BOTH"
+        else:
+            return "orca.settings.BRAILLE_LINK_NONE"
+
+    def _getVerbosityString(self, verbosityLevel):
+        """Returns a string that represents the verbosity level passed in."""
+
+        if verbosityLevel == settings.VERBOSITY_LEVEL_BRIEF:
+            return "orca.settings.VERBOSITY_LEVEL_BRIEF"
+        elif verbosityLevel == settings.VERBOSITY_LEVEL_VERBOSE:
+            return "orca.settings.VERBOSITY_LEVEL_VERBOSE"
+        else:
+            return "orca.settings.VERBOSITY_LEVEL_VERBOSE"
+
+    def _getBrailleRolenameStyleString(self, rolenameStyle):
+        """Returns a string that represents the rolename style passed in."""
+
+        if rolenameStyle == settings.BRAILLE_ROLENAME_STYLE_SHORT:
+            return "orca.settings.BRAILLE_ROLENAME_STYLE_SHORT"
+        elif rolenameStyle == settings.BRAILLE_ROLENAME_STYLE_LONG:
+            return "orca.settings.BRAILLE_ROLENAME_STYLE_LONG"
+        else:
+            return "orca.settings.BRAILLE_ROLENAME_STYLE_LONG"
+
+    def _getBrailleAlignmentStyleString(self, brailleAlignmentStyle):
+        """Returns a string that represents the brailleAlignmentStyle
+         passed in."""
+
+        if brailleAlignmentStyle == settings.ALIGN_BRAILLE_BY_WORD:
+            return "orca.settings.ALIGN_BRAILLE_BY_WORD"
+        if brailleAlignmentStyle == settings.ALIGN_BRAILLE_BY_MARGIN:
+            return "orca.settings.ALIGN_BRAILLE_BY_MARGIN"
+        else:
+            return "orca.settings.ALIGN_BRAILLE_BY_EDGE"
+
+    def _getVerbalizePunctuationStyleString(self, punctuationStyle):
+        """Returns a string that represents the punctuation style passed in."""
+
+        if punctuationStyle == settings.PUNCTUATION_STYLE_NONE:
+            return "orca.settings.PUNCTUATION_STYLE_NONE"
+        elif punctuationStyle == settings.PUNCTUATION_STYLE_SOME:
+            return "orca.settings.PUNCTUATION_STYLE_SOME"
+        elif punctuationStyle == settings.PUNCTUATION_STYLE_MOST:
+            return "orca.settings.PUNCTUATION_STYLE_MOST"
+        elif punctuationStyle == settings.PUNCTUATION_STYLE_ALL:
+            return "orca.settings.PUNCTUATION_STYLE_ALL"
+        else:
+            return "orca.settings.PUNCTUATION_STYLE_ALL"
+
+    def _getPresentTimeString(self, val):
+        if val == settings.TIME_FORMAT_24_HMS:
+            return "orca.settings.TIME_FORMAT_24_HMS"
+        elif val == settings.TIME_FORMAT_24_HMS_WITH_WORDS:
+            return "orca.settings.TIME_FORMAT_24_HMS_WITH_WORDS"
+        elif val == settings.TIME_FORMAT_24_HM:
+            return "orca.settings.TIME_FORMAT_24_HM"
+        elif val == settings.TIME_FORMAT_24_HM_WITH_WORDS:
+            return "orca.settings.TIME_FORMAT_24_HM_WITH_WORDS"
+        else:
+            return "orca.settings.TIME_FORMAT_LOCALE"
+
+    def _getPresentDateString(self, val):
+        if val == settings.DATE_FORMAT_WITH_LONG_NAMES:
+            return "orca.settings.DATE_FORMAT_WITH_LONG_NAMES"
+        elif val == settings.DATE_FORMAT_WITH_SHORT_NAMES:
+            return "orca.settings.DATE_FORMAT_WITH_SHORT_NAMES"
+        else:
+            return "orca.settings.DATE_FORMAT_LOCALE"
+
+    def _getSayAllStyleString(self, sayAllStyle):
+        """Returns a string that represents the say all style passed in."""
+
+        if sayAllStyle == settings.SAYALL_STYLE_LINE:
+            return "orca.settings.SAYALL_STYLE_LINE"
+        elif sayAllStyle == settings.SAYALL_STYLE_SENTENCE:
+            return "orca.settings.SAYALL_STYLE_SENTENCE"
+
+    def _getMagColorString(self, cursorColor):
+        """Returns a string that represents the magnification object's color
+        passed in.
+
+        Arguments:
+        - cursorColor: magnification object's color
+
+        Returns a string suitable for the preferences file.
+        """
+
+        cursorColorStr = "'%s'" % cursorColor
+
+        return cursorColorStr
+
+    def _getMagSmoothingModeString(self, smoothingMode):
+        """Returns a string that represents the magnification smoothing mode
+        passed in.
+
+        Arguments:
+        - smoothingMode: magnification smoothing mode.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if smoothingMode == settings.MAG_SMOOTHING_MODE_BILINEAR:
+            return "orca.settings.MAG_SMOOTHING_MODE_BILINEAR"
+        elif smoothingMode == settings.MAG_SMOOTHING_MODE_NONE:
+            return "orca.settings.MAG_SMOOTHING_MODE_NONE"
+        else:
+            return "orca.settings.MAG_SMOOTHING_MODE_BILINEAR"
+
+    def _getMagMouseTrackingModeString(self, mouseTrackingMode):
+        """Returns a string that represents the magnification mouse tracking
+        mode passed in.
+
+        Arguments:
+        - mouseTrackingMode: magnification mouse tracking mode.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if mouseTrackingMode == settings.MAG_TRACKING_MODE_CENTERED:
+            return "orca.settings.MAG_TRACKING_MODE_CENTERED"
+        elif mouseTrackingMode == settings.MAG_TRACKING_MODE_NONE:
+            return "orca.settings.MAG_TRACKING_MODE_NONE"
+        elif mouseTrackingMode == settings.MAG_TRACKING_MODE_PROPORTIONAL:
+            return "orca.settings.MAG_TRACKING_MODE_PROPORTIONAL"
+        elif mouseTrackingMode == settings.MAG_TRACKING_MODE_PUSH:
+            return "orca.settings.MAG_TRACKING_MODE_PUSH"
+        else:
+            return "orca.settings.MAG_TRACKING_MODE_CENTERED"
+
+    def _getMagControlTrackingModeString(self, controlTrackingMode):
+        """Returns a string that represents the magnification control
+        and menu item tracking mode passed in.
+
+        Arguments:
+        - controlTrackingMode: magnification control and menu item tracking 
+                               mode.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if controlTrackingMode == settings.MAG_TRACKING_MODE_CENTERED:
+            return "orca.settings.MAG_TRACKING_MODE_CENTERED"
+        elif controlTrackingMode == settings.MAG_TRACKING_MODE_NONE:
+            return "orca.settings.MAG_TRACKING_MODE_NONE"
+        elif controlTrackingMode == settings.MAG_TRACKING_MODE_PUSH:
+            return "orca.settings.MAG_TRACKING_MODE_PUSH"
+        else:
+            return "orca.settings.MAG_TRACKING_MODE_PUSH"
+
+    def _getMagTextTrackingModeString(self, textTrackingMode):
+        """Returns a string that represents the magnification text cursor
+        tracking mode passed in.
+
+        Arguments:
+        - textTrackingMode: magnification text cursor tracking mode.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if textTrackingMode == settings.MAG_TRACKING_MODE_CENTERED:
+            return "orca.settings.MAG_TRACKING_MODE_CENTERED"
+        elif textTrackingMode == settings.MAG_TRACKING_MODE_NONE:
+            return "orca.settings.MAG_TRACKING_MODE_NONE"
+        elif textTrackingMode == settings.MAG_TRACKING_MODE_PUSH:
+            return "orca.settings.MAG_TRACKING_MODE_PUSH"
+        else:
+            return "orca.settings.MAG_TRACKING_MODE_PUSH"
+
+    def _getMagColorFilteringModeString(self, mode):
+        """Returns a string that represents the magnification color filtering
+        mode passed in.
+
+        Arguments:
+        - mode: magnification color filtering mode.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if mode == settings.MAG_COLOR_FILTERING_MODE_NONE:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_NONE"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_SATURATE_RED:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_SATURATE_RED"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_SATURATE_GREEN:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_SATURATE_GREEN"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_SATURATE_BLUE:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_SATURATE_BLUE"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_DESATURATE_RED:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_DESATURATE_RED"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_DESATURATE_GREEN:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_DESATURATE_GREEN"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_DESATURATE_BLUE:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_DESATURATE_BLUE"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_POSITIVE_HUE_SHIFT:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_POSITIVE_HUE_SHIFT"
+        elif mode == settings.MAG_COLOR_FILTERING_MODE_NEGATIVE_HUE_SHIFT:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_NEGATIVE_HUE_SHIFT"
+        else:
+            return "orca.settings.MAG_COLOR_FILTERING_MODE_NONE"
+
+    def _getMagZoomerTypeString(self, magZoomerType):
+        """Returns a string that represents the magnification zoomer position
+        type passed in.
+
+        Arguments:
+        - magZoomerType: magnification zoomer position type.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if magZoomerType == settings.MAG_ZOOMER_TYPE_FULL_SCREEN:
+            return "orca.settings.MAG_ZOOMER_TYPE_FULL_SCREEN"
+        elif magZoomerType == settings.MAG_ZOOMER_TYPE_TOP_HALF:
+            return "orca.settings.MAG_ZOOMER_TYPE_TOP_HALF"
+        elif magZoomerType == settings.MAG_ZOOMER_TYPE_BOTTOM_HALF:
+            return "orca.settings.MAG_ZOOMER_TYPE_BOTTOM_HALF"
+        elif magZoomerType == settings.MAG_ZOOMER_TYPE_LEFT_HALF:
+            return "orca.settings.MAG_ZOOMER_TYPE_LEFT_HALF"
+        elif magZoomerType == settings.MAG_ZOOMER_TYPE_RIGHT_HALF:
+            return "orca.settings.MAG_ZOOMER_TYPE_RIGHT_HALF"
+        elif magZoomerType == settings.MAG_ZOOMER_TYPE_CUSTOM:
+            return "orca.settings.MAG_ZOOMER_TYPE_CUSTOM"
+        else:
+            return "orca.settings.MAG_ZOOMER_TYPE_FULL_SCREEN"
+
+    def _getProgressBarVerbosityString(self, verbosityLevel):
+        """Returns a string that represents the progress bar verbosity level
+        passed in.
+
+        Arguments:
+        - verbosityLevel: verbosity level for progress bars.
+
+        Returns a string suitable for the preferences file.
+        """
+
+        if verbosityLevel == settings.PROGRESS_BAR_ALL:
+            return "orca.settings.PROGRESS_BAR_ALL"
+        elif verbosityLevel == settings.PROGRESS_BAR_WINDOW:
+            return "orca.settings.PROGRESS_BAR_WINDOW"
+        else:
+            return "orca.settings.PROGRESS_BAR_APPLICATION"
+
+    def _writeKeyBinding(self, prefs, tupl):
+        """Writes a single keyBinding to the user-settings.py 
+        keyBindings section.
+
+        Arguments:
+        - prefs: text string - file to write the key binding to.
+        - tupl:    tuple     - a tuple with the values of the
+                                 keybinding (gtk.TreeStore model columns)
+        """
+
+        prefs.writelines("   keyB.removeByHandler(script.inputEventHandlers['" \
+                         + str(tupl[HANDLER])+"'])\n")
+        if not (tupl[TEXT1] or tupl[TEXT2]):
+            prefs.writelines("   keyB.add(orca.keybindings.KeyBinding(\n")
+            prefs.writelines("      '',\n")
+            prefs.writelines("      %d,\n" % settings.defaultModifierMask)
+            prefs.writelines("      0,\n")
+            prefs.writelines('      script.inputEventHandlers["' + \
+                             str(tupl[HANDLER]) +'"]))\n\n')
+
+        if (tupl[TEXT1]):
+            prefs.writelines("   keyB.add(orca.keybindings.KeyBinding(\n")
+            prefs.writelines("      '" + str(tupl[KEY1]) + "',\n")
+            if tupl[MOD_MASK1] or tupl[MOD_USED1]:
+                prefs.writelines("      " + str(tupl[MOD_MASK1]) + ",\n")
+                prefs.writelines("      " + str(tupl[MOD_USED1]) + ",\n")
+            else:
+                prefs.writelines("      0,\n")
+                prefs.writelines("      0,\n")
+            if (tupl[CLICK_COUNT1] == "1"):
+                prefs.writelines('      script.inputEventHandlers["' + \
+                                 str(tupl[HANDLER]) +'"]))\n\n')
+            else:
+                prefs.writelines('      script.inputEventHandlers["' + \
+                                 str(tupl[HANDLER]) +'"],\n')
+                prefs.writelines("      " + str(tupl[CLICK_COUNT1])  + \
+                                 "))\n\n")
+
+        if (tupl[TEXT2]):
+            prefs.writelines("   keyB.add(orca.keybindings.KeyBinding(\n")
+            prefs.writelines("      '" + str(tupl[KEY2]) + "',\n")
+            if tupl[MOD_MASK2] or tupl[MOD_USED2]:
+                prefs.writelines("      " + str(tupl[MOD_MASK2]) + ",\n")
+                prefs.writelines("      " + str(tupl[MOD_USED2]) + ",\n")
+            else:
+                prefs.writelines("      %d,\n" % settings.defaultModifierMask)
+                prefs.writelines("      0,\n")
+            if (tupl[CLICK_COUNT2] == "1"):
+                prefs.writelines('      script.inputEventHandlers["' + \
+                                 str(tupl[HANDLER]) +'"]))\n\n')
+            else:
+                prefs.writelines('      script.inputEventHandlers["' + \
+                                 str(tupl[HANDLER]) +'"],\n')
+                prefs.writelines("      " + str(tupl[CLICK_COUNT2])  + \
+                                 "))\n\n")
+
+    def _writeKeyBindingsPostamble(self, prefs):
+        """Writes the postamble to the user-settings.py keyBindings section."""
+
+        prefs.writelines('   return keyB')
+        prefs.writelines("\n\n")
+        prefs.writelines( \
+            'orca.settings.overrideKeyBindings = overrideKeyBindings')
+        prefs.writelines("\n")
+
+    def _iterateKeyBindings(self, prefs, treeModel):
+        """Iterate over all the key bindings in the tree model and write
+        out all that the user has modified.
+        """
+
+        thisIter = treeModel.get_iter_first()
+        while thisIter != None:
+            iterChild = treeModel.iter_children(thisIter)
+            while iterChild != None:
+                values = treeModel.get(iterChild,
+                                       0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
+                if values[MODIF]:
+                    self._writeKeyBinding(prefs, values)
+                iterChild = treeModel.iter_next(iterChild)
+            thisIter = treeModel.iter_next(thisIter)
+
+    def _writeKeyBindingsMap(self, prefs, treeModel):
+        """Write to configuration file 'prefs' the key bindings passed in the
+        model treeModel.
+        """
+
+        self._writeKeyBindingsPreamble(prefs)
+        self._iterateKeyBindings(prefs, treeModel)
+        self._writeKeyBindingsPostamble(prefs)
+
+    def _writePronunciationsPreamble(self, prefs):
+        """Writes the preamble to the  ~/.orca/user-settings.py
+        pronunciations section."""
+
+        prefs.writelines("\n")
+        prefs.writelines( \
+            "# User customized pronunciation dictionary settings\n")
+        prefs.writelines("#\n")
+        prefs.writelines("import orca.pronunciation_dict\n\n")
+        prefs.writelines("orca.pronunciation_dict.pronunciation_dict={}\n")
+
+    def _writePronunciation(self, prefs, word, value):
+        """Write out a single pronunciation entry to the 
+        ~/.orca/user-setting.py settings file.
+
+        Arguments:
+        - prefs: file handle for user preferences.
+        - word: the actual word to be pronunced.
+        - value: the replacement string to use.
+        """
+
+        prefs.writelines("orca.pronunciation_dict.setPronunciation(" + \
+                         repr(word) + ", " + repr(value) + ")\n")
+
+    def _iteratePronunciations(self, prefs, treeModel):
+        """Iterate over each of the entries in the tree model and write out
+        a pronunciation diction entry for them.  If any strings with an
+        actual string of "" are found, they are ignored.
+        """
+
+        thisIter = treeModel.get_iter_first()
+        while thisIter != None:
+            values = treeModel.get(thisIter, ACTUAL, REPLACEMENT)
+            word = values[ACTUAL]
+            value = values[REPLACEMENT]
+
+            if word != "":
+                self._writePronunciation(prefs, word, value)
+
+            thisIter = treeModel.iter_next(thisIter)
+
+    def _writePronunciationMap(self, prefs, treeModel):
+        """Write to configuration file 'prefs' the new pronunciation dictionary
+        entries passed in the model treeModel.
+
+        Arguments:
+        - prefs: file handle for application preferences.
+        - treeModel: pronunciation dictionary tree model.
+        """
+
+        self._writePronunciationsPreamble(prefs)
+        self._iteratePronunciations(prefs, treeModel)
+
+    def _setupPreferencesDirs(self):
+        """Creates the directories and standard files to hold user 
+        preferences."""
+
+        # Set up the user's preferences directory (~/.orca by default).
+        #
+        orcaDir = settings.userPrefsDir
+        self._createDir(orcaDir)
+
+        # Set up ~/.orca/orca-scripts as a Python package
+        #
+        orcaScriptDir = os.path.join(orcaDir, "orca-scripts")
+        self._createDir(orcaScriptDir)
+        initFile = os.path.join(orcaScriptDir, "__init__.py")
+        if not os.path.exists(initFile):
+            os.close(os.open(initFile, os.O_CREAT, 0700))
+
+        # Set up ~/.orca/app-settings as a Python package.
+        #
+        orcaSettingsDir = os.path.join(orcaDir, "app-settings")
+        self._createDir(orcaSettingsDir)
+        initFile = os.path.join(orcaSettingsDir, "__init__.py")
+        if not os.path.exists(initFile):
+            os.close(os.open(initFile, os.O_CREAT, 0700))
+
+
+    def _getValueForKey(self, prefsDict, key):
+        """Return the value associated with this preferences dictionary key
+
+        Arguments:
+        - prefsDict: a dictionary where the keys are orca preferences
+        names and the values are the values for the preferences.
+        - key: the preferences dictionary key.
+
+        Return the value of the given preferences dictionary key.
+        """
+
+        value = None
+        if key in prefsDict:
+            if key == "voices":
+                value = self._getVoicesString(prefsDict[key])
+            elif key == "speechServerInfo":
+                if isinstance(prefsDict[key], str):
+                    prefsDict[key] = prefsDict[key].replace('[','').replace(']','').split(',')
+                value = self._getSpeechServerString(prefsDict[key])
+            elif key == "speechServerFactory":
+                value = self._getSpeechServerFactoryString(prefsDict[key])
+            elif key.endswith("VerbosityLevel"):
+                value = self._getVerbosityString(prefsDict[key])
+            elif key == "brailleRolenameStyle":
+                value = self._getBrailleRolenameStyleString(prefsDict[key])
+            elif key == "brailleSelectorIndicator":
+                value = self._getBrailleSelectionIndicatorString(prefsDict[key])
+            elif key == "brailleLinkIndicator":
+                value = self._getBrailleLinkIndicatorString(prefsDict[key])
+            elif key == "brailleAlignmentStyle":
+                value = self._getBrailleAlignmentStyleString(prefsDict[key])
+            elif key == "verbalizePunctuationStyle":
+                value = self._getVerbalizePunctuationStyleString(prefsDict[key])
+            elif key == "presentDateFormat":
+                value = self._getPresentDateString(prefsDict[key])
+            elif key == "presentTimeFormat":
+                value = self._getPresentTimeString(prefsDict[key])
+            elif key == "sayAllStyle":
+                value = self._getSayAllStyleString(prefsDict[key])
+            elif key in ["magCursorColor",
+                         "magCrossHairColor",
+                         "magZoomerBorderColor"]:
+                value = self._getMagColorString(prefsDict[key])
+            elif key == "magSmoothingMode":
+                value = self._getMagSmoothingModeString(prefsDict[key])
+            elif key == "magMouseTrackingMode":
+                value = self._getMagMouseTrackingModeString(prefsDict[key])
+            elif key == "magControlTrackingMode":
+                value = self._getMagControlTrackingModeString(prefsDict[key])
+            elif key == "magTextTrackingMode":
+                value = self._getMagTextTrackingModeString(prefsDict[key])
+            elif key == "magZoomerType":
+                value = self._getMagZoomerTypeString(prefsDict[key])
+            elif key == "magColorFilteringMode":
+                value = self._getMagColorFilteringModeString(prefsDict[key])
+            elif key == "magSourceDisplay" or key == "magTargetDisplay":
+                value = self._getDisplayString(prefsDict[key])
+            elif key == "keyboardLayout":
+                value = self._getKeyboardLayoutString(prefsDict[key])
+            elif key == "orcaModifierKeys":
+                value = self._getOrcaModifierKeysString(prefsDict[key])
+            elif key == "enabledSpokenTextAttributes":
+                value = self._getSpokenTextAttributesString(prefsDict[key])
+            elif key == "enabledBrailledTextAttributes":
+                value = self._getBrailledTextAttributesString(prefsDict[key])
+            elif key == "textAttributesBrailleIndicator":
+                value = self._getTextAttributesBrailleIndicatorString( \
+                                                              prefsDict[key])
+            elif key == "progressBarVerbosity":
+                value = self._getProgressBarVerbosityString(prefsDict[key])
+            elif key == "brailleContractionTable":
+                value = "'%s'" % prefsDict[key]
+            elif key == "brailleEOLIndicator":
+                value = "'%s'" % prefsDict[key]
+            elif key == "brailleRequiredStateString":
+                value = "'%s'" % prefsDict[key]
+            elif key == "speechRequiredStateString":
+                value = "'%s'" % prefsDict[key]
+            else:
+                value = prefsDict[key]
+
+        return value
+
+    def writePreferences(self):
+        """Creates the gconf schema and files to hold user preferences.  Note
+        that callers of this method may want to consider using an ordered
+        dictionary so that the keys are output in a deterministic order.
+
+        Returns True if accessibility was enabled as a result of this
+        call.
+        """
+
+        #self._setupPreferencesDirs()
+        
+        #self._writePreferencesPreamble(prefs)
+
+        # Only userCustomizableSettings will be stored in gconf
+        #for key in settings.userCustomizableSettings:
+        #    value = self._getValueForKey(self.prefsDict, key)
+        #    if value != None:
+        #        prefs.writelines("orca.settings.%s = %s\n" % (key, value))
+
+        #if self.keyBindingsTreeModel:
+        #    self._writeKeyBindingsMap(prefs, self.keyBindingsTreeModel)
+
+        #if self.pronunciationTreeModel:
+        #    self._writePronunciationMap(prefs, self.pronunciationTreeModel)
+
+        #self._writePreferencesPostamble(prefs)
+        #prefs.close()
+
+        # Return True if this caused accessibility to be enabled
+        # as a result of this call.
+        #
+
+        if self.prefsDict:
+                for key in settings.userCustomizableSettings:
+                    if key != 'voices':
+                        self.prefsDict[key] = self._getValueForKey(self.prefsDict, key) 
+                    if key in self.need2repr:
+                        self.prefsDict[key] = self._fix_quotes(self.prefsDict[key])
+
+        if self.keyBindingsTreeModel:
+            self.prefsDict['overridenKeyBindings'] = {}
+            thisIter = self.keyBindingsTreeModel.get_iter_first()
+            while thisIter != None:
+                iterChild = self.keyBindingsTreeModel.iter_children(thisIter)
+                while iterChild != None:
+                    values = self.keyBindingsTreeModel.get(iterChild,
+                                       0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
+                    if values[MODIF] and not values[KEY1]  == None:
+                        key = values[HANDLER]                         
+                        self.prefsDict['overridenKeyBindings'][key] = [values[DESCRIP], \
+                            values[MOD_MASK1], values[MOD_USED1], values[KEY1], \
+                            values[CLICK_COUNT1], values[OLDTEXT1], values[TEXT1], \
+                            values[MOD_MASK2], values[MOD_USED2], values[KEY2], \
+                            values[CLICK_COUNT2], values[OLDTEXT2], values[TEXT2], \
+                            values[MODIF], values[EDITABLE]]
+                    iterChild = self.keyBindingsTreeModel.iter_next(iterChild)
+
+                thisIter = self.keyBindingsTreeModel.iter_next(thisIter)
+            # Clear overridenkeybindings gconf's dir for a safe store/load 
+            self._client.recursive_unset(self.GCONF_DIR + '/overridenKeyBindings', 
+                gconf.UNSET_INCLUDING_SCHEMA_NAMES)           
+            self._client.suggest_sync()
+
+        if self.pronunciationTreeModel:
+            self.prefsDict['pronunciations'] = {}
+            thisIter = self.pronunciationTreeModel.get_iter_first()
+
+            while thisIter != None:
+                values = self.pronunciationTreeModel.get(thisIter, ACTUAL, REPLACEMENT)
+                word = values[ACTUAL]
+                value = values[REPLACEMENT]
+
+                if word != "" and value != "":
+                    self.prefsDict['pronunciations'][word] = value
+ 
+                thisIter = self.pronunciationTreeModel.iter_next(thisIter)
+
+            # Clear pronunciations gconf's dir for a safe store/load 
+            self._client.recursive_unset(self.GCONF_DIR + '/pronunciations',
+                gconf.UNSET_INCLUDING_SCHEMA_NAMES)
+            self._client.suggest_sync()
+            
+
+        self.gconf_save()
+
+        self.prefsDict = self.options
+
+        return self._enableAccessibility()
+
+    def loadSettings(self):
+        """Load settings"""
+        
+        import orca.debug
+        import orca.settings
+        from orca import acss
+        orca.debug.debugLevel = orca.debug.LEVEL_SEVERE
+       
+        if False:
+            import sys
+            import orca.debug
+            sys.settrace(orca.debug.traceit)
+            orca.debug.debugLevel = orca.debug.LEVEL_ALL
+
+        if not self._client.all_entries(self.__app_key):
+            self.options = self.DEFAULTS
+            self.gconf_save()
+ 
+        self.gconf_load()
+
+        self.settingsDict = self.prefsDict = self.options
+
+        for key in settings.userCustomizableSettings:
+            if key != 'voices' and key != 'speechServerFactory':
+                #value = self._getValueForKey(self.settingsDict, key)
+                value = self.settingsDict[key]
+                if value != None:
+                    if value == 'true' or value == 'false':
+                        value = value.capitalize()
+                    if key in self.need2repr:
+                        value = self._fix_quotes(value)
+                    setting = 'orca.settings.%s = %s' % (key, value)
+                    exec setting
+
+        # Load orca.settings.voices
+        ssfLoad = "orca.settings.speechServerFactory = %s" % self.settingsDict['speechServerFactory']
+        exec(ssfLoad)
+
+
+        orca.settings.voices = {
+                'default' : acss.ACSS(self.settingsDict['voices']['default']),
+                'uppercase' : acss.ACSS(self.settingsDict['voices']['uppercase']),
+                'hyperlink' : acss.ACSS(self.settingsDict['voices']['hyperlink'])}
+
+
+        #return UserSettings
+        import orca.pronunciation_dict
+
+        orca.pronunciation_dict.pronunciation_dict={}
+        for key, value in self.settingsDict['pronunciations'].items():
+           orca.pronunciation_dict.setPronunciation(str(key), str(value))
+
+        import orca.orca_state
+
+        ## Load keybindings
+        
+        orca.settings.overrideKeyBindings = self.__loadOverridenKeyBindings
+
+        try:
+            reload(orca.orca_state.orcaCustomizations)
+        except AttributeError:
+            try:
+                orca.orca_state.orcaCustomizations = __import__("orca-customizations")
+            except ImportError:
+                pass
+
+        self.prefsDict = self.settingsDict
+
+        return True
+
+    def __loadOverridenKeyBindings(self, script, keyB):
+        """Load overriden keybindings defined by user"""
+
+        if len(self.prefsDict['overridenKeyBindings']) == 0: return keyB
+
+        for key in self.prefsDict['overridenKeyBindings']:
+            keyB.removeByHandler(script.inputEventHandlers[key])
+            keyB.add(orca.keybindings.KeyBinding(
+                str(self.prefsDict['overridenKeyBindings'][key][3]),
+                int(self.prefsDict['overridenKeyBindings'][key][1]),
+                int(self.prefsDict['overridenKeyBindings'][key][2]),
+                script.inputEventHandlers[key],
+                int(self.prefsDict['overridenKeyBindings'][key][4])))
+            if self.prefsDict['overridenKeyBindings'][key][9] != 'None' :
+                keyB.add(orca.keybindings.KeyBinding(
+                    str(self.prefsDict['overridenKeyBindings'][key][9]),
+                    int(self.prefsDict['overridenKeyBindings'][key][7]),
+                    int(self.prefsDict['overridenKeyBindings'][key][8]),
+                    script.inputEventHandlers[key],
+                    int(self.prefsDict['overridenKeyBindings'][key][10])))
+
+        return keyB
+
+    def _fix_quotes(self, value):
+        """Checks for quotes and return a valid loadable setting"""
+
+        new_value = value.replace("\'", "").replace("\"", "").replace("\\", "")
+        if value.startswith("\""):
+            return "\"%s\"" % new_value
+        else:
+            return "'%s'" % new_value
+        
+
+def readPreferences():
+    """Returns a dictionary containing the names and values of the
+    customizable features of Orca."""
+
+    prefsDict = {}
+    for key in settings.userCustomizableSettings:
+        try:
+            prefsDict[key] = getattr(settings, key)
+        except:
+            pass 
+
+    return prefsDict
+
+def writePreferences(prefsDict, keyBindingsTreeModel=None,
+                     pronunciationTreeModel=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
+    of this method may want to consider using an ordered dictionary so
+    that the keys are output in a deterministic order.
+
+    Arguments:
+    - prefsDict: a dictionary where the keys are orca preferences
+    names and the values are the values for the preferences.
+    - keyBindingsTreeModel - key bindings tree model, or None if we are
+    writing out console preferences.
+    - pronunciationTreeModel - pronunciation dictionary tree model, or
+    None if we are writing out console preferences.
+
+    Returns True if the user needs to log out for accessibility settings
+    to take effect.
+    """
+
+    orcaPrefs = OrcaPrefs(prefsDict, 
+                          keyBindingsTreeModel, 
+                          pronunciationTreeModel)
+    return orcaPrefs.writePreferences()
+
+def loadSettings():
+    """Load settings"""
+
+    orcaPrefs = OrcaPrefs()
+    print '\n## loaded from gconf_backend!!'
+    
+    return orcaPrefs.loadSettings()
diff --git a/src/orca/backends/gconf_defaults.py b/src/orca/backends/gconf_defaults.py
new file mode 100644
index 0000000..aea9c8e
--- /dev/null
+++ b/src/orca/backends/gconf_defaults.py
@@ -0,0 +1,141 @@
+# Orca
+#
+# Copyright 2004-2008 Sun Microsystems Inc.
+# Author: Javier Hernandez Antunez <jhernandez emergya es>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+import orca
+import orca.acss
+
+defaults = {'speakCellHeaders': True,
+ 'magEdgeMargin': 0,
+ 'brailleContractionTable': '',
+ 'magPointerFollowsFocus': False,
+ 'magTextTrackingMode': 'orca.settings.MAG_TRACKING_MODE_PUSH',
+ 'magZoomerBorderSize': 1,
+ 'brailleAlignmentStyle': 'orca.settings.ALIGN_BRAILLE_BY_EDGE',
+ 'enableEchoByWord': False,
+ 'enableMagZoomerColorInversion': False,
+ 'magCursorSize': 32,
+ 'magSmoothingMode': 'orca.settings.MAG_SMOOTHING_MODE_BILINEAR',
+ 'magZoomerLeft': 512,
+ 'showMainWindow': True,
+ 'sayAllStyle': 'orca.settings.SAYALL_STYLE_SENTENCE',
+ 'brailleSelectorIndicator': 'orca.settings.BRAILLE_SEL_BOTH',
+ 'presentDateFormat': 'orca.settings.DATE_FORMAT_LOCALE',
+ 'magContrastLevel': 0,
+ 'magMouseTrackingMode': 'orca.settings.MAG_TRACKING_MODE_CENTERED',
+ 'speakCellSpan': True,
+ 'progressBarUpdateInterval': 10,
+ 'speakCellCoordinates': True,
+ 'enablePauseBreaks': True,
+ 'brailleEOLIndicator': ' $l',
+ 'verbalizePunctuationStyle': 'orca.settings.PUNCTUATION_STYLE_MOST',
+ 'brailleRequiredStateString': 'requerido',
+ 'progressBarVerbosity': 'orca.settings.PROGRESS_BAR_APPLICATION',
+ 'enableSpeech': True,
+ 'enableBraille': False,
+ 'mouseDwellDelay': 0,
+ 'enableBrailleGrouping': False,
+ 'readTableCellRow': True,
+ 'textAttributesBrailleIndicator': 'orca.settings.TEXT_ATTR_BRAILLE_NONE',
+ 'enableMagCursorExplicitSize': False,
+ 'messageVerbosityLevel': 'orca.settings.VERBOSITY_LEVEL_VERBOSE',
+ 'enableMagLiveUpdating': True,
+ 'enableSpeechIndentation': False,
+ 'enableKeyEcho': True,
+ 'magHideCursor': False,
+ 'magZoomerBorderColor': '#000000',
+ 'magBrightnessLevelRed': 0,
+ 'enableMagnifier': False,
+ 'magZoomFactor': 4.0,
+ 'speechServerFactory': 'orca.gnomespeechfactory',
+ 'enableMagZoomerBorder': False,
+ 'flashVerbosityLevel': 'orca.settings.VERBOSITY_LEVEL_VERBOSE',
+ 'enableFlashMessages': True,
+ 'speechServerInfo': ['Speech Dispatcher GNOME Speech Driver',
+                      'OAFIID:GNOME_Speech_SynthesisDriver_Speech_Dispatcher:proto0.3'],
+ 'presentToolTips': False,
+ 'flashIsPersistent': False,
+ 'skipBlankCells': False,
+ 'largeObjectTextLength': 75,
+ 'enableEchoBySentence': False,
+ 'magContrastLevelBlue': 0,
+ 'magContrastLevelRed': 0,
+ 'enableContractedBraille': False,
+ 'orcaModifierKeys': 'orca.settings.DESKTOP_MODIFIER_KEYS',
+ 'enableMagCursor': True,
+ 'speechRequiredStateString': 'requerido',
+ 'chatAnnounceBuddyTyping': False,
+ 'quitOrcaNoConfirmation': False,
+ 'magPointerFollowsZoomer': True,
+ 'magCursorColor': '#000000',
+ 'enablePositionSpeaking': False,
+ 'magZoomerType': 'orca.settings.MAG_ZOOMER_TYPE_FULL_SCREEN',
+ 'enableProgressBarUpdates': True,
+ 'wrappedStructuralNavigation': True,
+ 'brailleVerbosityLevel': 'orca.settings.VERBOSITY_LEVEL_VERBOSE',
+ 'enableFunctionKeys': True,
+ 'enableModifierKeys': True,
+ 'magCrossHairColor': '#000000',
+ 'enableTutorialMessages': False,
+ 'enableActionKeys': True,
+ 'speakBlankLines': True,
+ 'magColorFilteringMode': 'orca.settings.MAG_COLOR_FILTERING_MODE_NONE',
+ 'magZoomerRight': 1024,
+ 'keyboardLayout': 'orca.settings.GENERAL_KEYBOARD_LAYOUT_DESKTOP',
+ 'magTargetDisplay': ':0.0',
+ 'disableBrailleEOL': False,
+ 'magZoomerTop': 0,
+ 'magSourceDisplay': ':0.0',
+ 'enableDiacriticalKeys': False,
+ 'enableMnemonicSpeaking': False,
+ 'magContrastLevelGreen': 0,
+ 'speechVerbosityLevel': 'orca.settings.VERBOSITY_LEVEL_VERBOSE',
+ 'enableMagCrossHair': True,
+ 'enableBrailleMonitor': False,
+ 'voices': {'default' : orca.acss.ACSS({'average-pitch': 5.0,
+                                        'gain': 10.0,
+                                        'rate': 50.0,
+                                        'family' : {}}),
+            'uppercase' : orca.acss.ACSS({'average-pitch': 5.5999999999999996}),
+            'hyperlink' : orca.acss.ACSS({'average-pitch': 5.5999999999999996})},
+ 'enabledBrailledTextAttributes': "size:; family-name:; weight:400; indent:0; underline:none; strikethrough:false; justification:left; style:normal; text-spelling:none;",
+ 'brailleFlashTime': 5000,
+ 'magCrossHairSize': 16,
+ 'enableMouseReview': False,
+ 'enableNavigationKeys': False,
+ 'magBrightnessLevelGreen': 0,
+ 'enableLockingKeys': True,
+ 'speakMultiCaseStringsAsWords': False,
+ 'brailleRolenameStyle': 'orca.settings.BRAILLE_ROLENAME_STYLE_LONG',
+ 'brailleLinkIndicator': 'orca.settings.BRAILLE_LINK_BOTH',
+ 'enableEchoByCharacter': False,
+ 'magBrightnessLevelBlue': 0,
+ 'enableBrailleContext': True,
+ 'magControlTrackingMode': 'orca.settings.MAG_TRACKING_MODE_PUSH',
+ 'magZoomerBottom': 768,
+ 'enablePrintableKeys': True,
+ 'enabledSpokenTextAttributes': "size:; family-name:; weight:400; indent:0; underline:none; strikethrough:false; justification:left; style:normal; paragraph-style:; text-spelling:none;",
+ 'chatMessageVerbosity': 0,
+ 'presentTimeFormat': 'orca.settings.TIME_FORMAT_LOCALE',
+ 'magBrightnessLevel': 0,
+ 'presentRequiredState': False,
+ 'enableMagCrossHairClip': False,
+ 'overridenKeyBindings' : {},
+ 'pronunciations' : {}
+}
diff --git a/src/orca/default.py b/src/orca/default.py
index bd3db4a..6b02766 100644
--- a/src/orca/default.py
+++ b/src/orca/default.py
@@ -5033,7 +5033,12 @@ class Script(script.Script):
         """Save a copy of all the existing application specific settings
         (as specified by the settings.userCustomizableSettings dictionary)."""
 
-        return orca_prefs.readPreferences()
+        import settings_manager
+        _settingsManager = SettingsManager()
+        _settingsManager.loadBackend()
+         
+        #return orca_prefs.readPreferences()
+        return _settingsManager.readPreferences()
 
     def restoreOldAppSettings(self, prefsDict):
         """Restore a copy of all the previous saved application settings.
diff --git a/src/orca/orca.py b/src/orca/orca.py
index 76b0892..adb19cb 100644
--- a/src/orca/orca.py
+++ b/src/orca/orca.py
@@ -93,6 +93,8 @@ from input_event import keyEventToString
 
 from orca_i18n import _           # for gettext support
 
+from settings_manager import SettingsManager
+
 if settings.debugMemoryUsage:
     import gc
     gc.set_debug(gc.DEBUG_UNCOLLECTABLE
@@ -104,6 +106,8 @@ if settings.debugMemoryUsage:
 # The user-settings module (see loadUserSettings).
 #
 _userSettings = None
+_settingsManager = SettingsManager()
+_settingsManager.loadBackend()
 
 # Command line options that override any other settings.
 #
@@ -1032,7 +1036,8 @@ def loadUserSettings(script=None, inputEvent=None):
     reloaded = False
     if _userSettings:
         try:
-            reload(_userSettings)
+            _userSettings = _settingsManager.loadSettings() 
+            #reload(_userSettings)
             reloaded = True
         except ImportError:
             debug.printException(debug.LEVEL_FINEST)
@@ -1040,7 +1045,8 @@ def loadUserSettings(script=None, inputEvent=None):
             debug.printException(debug.LEVEL_SEVERE)
     else:
         try:
-            _userSettings = __import__("user-settings")
+            _userSettings = _settingsManager.loadSettings()
+            #_userSettings = __import__("user-settings")
             if _debugSwitch:
                 debug.debugLevel = debug.LEVEL_ALL
                 debug.eventDebugLevel = debug.LEVEL_OFF
diff --git a/src/orca/orca_gui_prefs.py b/src/orca/orca_gui_prefs.py
index 6f4040d..96bdca6 100644
--- a/src/orca/orca_gui_prefs.py
+++ b/src/orca/orca_gui_prefs.py
@@ -54,6 +54,8 @@ import speech
 import speechserver
 import text_attribute_names
 
+from settings_manager import SettingsManager
+
 try:
     import louis
 except ImportError:
@@ -490,7 +492,10 @@ class OrcaSetupGUI(orca_gtkbuilder.GtkBuilderWrapper):
         """Write out the user's generic Orca preferences.
         """
 
-        if orca_prefs.writePreferences(self.prefsDict, self.keyBindingsModel,
+        _settingsManager = SettingsManager()
+        _settingsManager.loadBackend()
+
+        if _settingsManager.writeSettings(self.prefsDict, self.keyBindingsModel,
                                        self.pronunciationModel):
             self._say( \
                 _("Accessibility support for GNOME has just been enabled."))
@@ -4458,7 +4463,6 @@ class OrcaAdvancedMagGUI(OrcaSetupGUI):
         - green: the green brightness value.
         - blue:  the blue brightness value.
         """
-
         self.get_widget("magBrightnessRedSpinButton").set_value(red)
         self.get_widget("magBrightnessGreenSpinButton").set_value(green)
         self.get_widget("magBrightnessBlueSpinButton").set_value(blue)
@@ -5016,7 +5020,12 @@ def showPreferencesUI():
         braille.displayMessage(line)
         speech.speak(line)
 
-        prefsDict = orca_prefs.readPreferences()
+        #prefsDict = orca_prefs.readPreferences()
+        _settingsManager = SettingsManager()
+        _settingsManager.loadBackend()
+
+        prefsDict = _settingsManager.readPreferences()
+
         orca_state.prefsUIFile = \
             os.path.join(platform.prefix,
                          platform.datadirname,
diff --git a/src/orca/settings.py b/src/orca/settings.py
index 88d3206..03e1cd4 100644
--- a/src/orca/settings.py
+++ b/src/orca/settings.py
@@ -188,9 +188,9 @@ userCustomizableSettings = [
     "brailleRequiredStateString",
     "speechRequiredStateString",
     "chatMessageVerbosity",
-    "chatPrefixMessageWithName",
+#    "chatPrefixMessageWithName",
     "chatAnnounceBuddyTyping",
-    "chatSeparateRoomHistories",
+#    "chatSeparateRoomHistories",
     "enableFlashMessages",
     "brailleFlashTime",
     "flashIsPersistent",
diff --git a/src/orca/settings_manager.py b/src/orca/settings_manager.py
new file mode 100644
index 0000000..8086eed
--- /dev/null
+++ b/src/orca/settings_manager.py
@@ -0,0 +1,90 @@
+# Orca
+#
+# Copyright 2004-2009 Sun Microsystems Inc.
+# Author: Javier Hernandez Antunez <jhernandez emergya es>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Settings manager module. This will load/save user settings from a 
+defined settings backend."""
+
+__id__        = "$Id$"
+__version__   = "$Revision$"
+__date__      = "$Date$"
+__copyright__ = "Copyright (c) 2004-2009 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import os
+import orca
+
+SettingsBackend = None
+
+class Singleton(object):
+     def __new__(cls, *args, **kwargs):
+         if '__instance' not in vars(cls):
+             cls.__instance = object.__new__(cls, *args, **kwargs)
+         return cls.__instance
+
+class SettingsManager(Singleton):
+    """Settings backend manager. This class manages orca user's settings
+    using different backends"""
+
+    # At the moment, DEFAULT_BACKEND can be established here
+    # Possible values are: classic and gconf
+    DEFAULT_BACKEND = 'gconf_backend'
+
+    def __init__(self, backend = None):
+        """Initialize a SettingsManager Object.
+        If backend isn't defined then uses default backend, in this
+        case gconf-backend"""
+
+        self.UserSettings = None
+
+        if not backend:
+            self.backend = self.DEFAULT_BACKEND
+        else:
+            self.backend = backend
+
+    def loadBackend(self):
+        """Load specific backend for manage user settings"""
+
+        settingsBackend = 'from backends import %s as SettingsBackend' % self.backend
+        
+        exec settingsBackend
+
+        try:
+            exec settingsBackend
+            print '\nimporting %s backend OK!' % self.backend
+        except:
+            print '\nUnable to load %s backend' % self.backend
+
+        globals()['SettingsBackend'] = SettingsBackend
+
+    def loadSettings(self):
+        """Load settings from active backend"""
+
+        return SettingsBackend.loadSettings()
+
+    def writeSettings(self, prefsDict, keyBindingsTreeModel=None,
+                     pronunciationTreeModel=None):
+        """Write user settings using active backend"""
+ 
+        return SettingsBackend.writePreferences(prefsDict, keyBindingsTreeModel, pronunciationTreeModel)
+
+    def readPreferences(self):
+
+        return SettingsBackend.readPreferences()
+



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