#   Programmer: Daniel Pozmanter
#   E-mail:     drpython@bluebottle.com
#   Note:       You must reply to the verification e-mail to get through.
#
#   Copyright 2003-2007 Daniel Pozmanter
#
#   Distributed under the terms of the GPL (GNU Public License)
#
#    DrPython is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

#Preferences

#LongLineCol from Chris McDonough
#Changed name from longlinecol to doclonglinecol

#The idea for using a dictionary for reading/writing preferences
#ame from submitted code by limodou that was never incorporated
#into DrPython.  (It used an array of preferences,
#and called modified versions of drPrefsFile functions using
#setattr and getattr to read and write preferences).

import os.path, re
import wx

rekey = re.compile('(?<=\[).*(?=\])')

def _getkey(target):
    return int(rekey.search(target).group())

def _stringify(x):
    return (x, '')

def GetPreferencesDictionary():
    #Each item in the Dictionary:
    #(Key, Array)
    #Each item in the Array:
    #(Preference, Preferences File String, Function)
    #Function: 0: (GetPref, Not an Integer,), 1: (GetPref, Integer), 2: (ExtractPref, Not an Integer).
    return {'General': [('rememberwindowsizeandposition', 'remember.window.size.and.position', 1),
('rememberdialogsizesandpositions', 'remember.dialog.sizes.and.positions', 1),
('rememberpanelsizes', 'remember.panel.sizes', 1),
('autodetectencoding', 'auto.detect.encoding', 1),
('defaultencoding', 'default.encoding', 2),
('saveonrun', 'save.on.run', 1),
('checksyntaxonsave', 'check.syntax.on.save', 1),
('checksyntaxextensions', 'check.syntax.extensions', 0),
('promptonsaveall', 'prompt.on.save.all', 1),
('doubleclicktoclosetab', 'double.click.to.close.tab', 1),
('iconsize', 'icon.size', 1),
('recentfileslimit', 'max.recent.files', 1),
('vieweol', 'view.eol', 1),
('checkeol', 'check.line.ending.type', 1),
('checkindentation', 'check.indentation.type', 1),
('pythonargs', 'python.arguments', 2),
('defaultdirectory', 'default.directory', 2),
('enablefeedback', 'enable.feedback', 1),
('debugmodus', 'debug.modus', 1),
('alwayspromptonexit', 'always.prompt.on.exit', 1),
('backupfileonsave', 'backup.file.on.save', 1)],
'File Types': [('extensions[0]', 'filetypes.extensions.python', 0),
('extensions[1]', 'filetypes.extensions.cpp', 0),
('extensions[2]', 'filetypes.extensions.html', 0),
('extensions[3]', 'filetypes.extensions.text', 0),
('docfolding[0]', 'filetypes.docfolding.python', 1),
('docfolding[1]', 'filetypes.docfolding.cpp', 1),
('docfolding[2]', 'filetypes.docfolding.html', 1),
('docfolding[3]', 'filetypes.docfolding.text', 1),
('doctabwidth[0]', 'filetypes.doctabwidth.python', 1),
('doctabwidth[1]', 'filetypes.doctabwidth.cpp', 1),
('doctabwidth[2]', 'filetypes.doctabwidth.html', 1),
('doctabwidth[3]', 'filetypes.doctabwidth.text', 1),
('docusetabs[0]', 'filetypes.docusetabs.python', 1),
('docusetabs[1]', 'filetypes.docusetabs.cpp', 1),
('docusetabs[2]', 'filetypes.docusetabs.html', 1),
('docusetabs[3]', 'filetypes.docusetabs.text', 1),
('docuseintellibackspace[0]', 'filetypes.docuseintellibackspace.python', 1),
('docuseintellibackspace[1]', 'filetypes.docuseintellibackspace.cpp', 1),
('docuseintellibackspace[2]', 'filetypes.docuseintellibackspace.html', 1),
('docuseintellibackspace[3]', 'filetypes.docuseintellibackspace.text', 1),
('docremovetrailingwhitespace[0]', 'filetypes.docremovetrailingwhitespace.python', 1),
('docremovetrailingwhitespace[1]', 'filetypes.docremovetrailingwhitespace.cpp', 1),
('docremovetrailingwhitespace[2]', 'filetypes.docremovetrailingwhitespace.html', 1),
('docremovetrailingwhitespace[3]', 'filetypes.docremovetrailingwhitespace.text', 1),
('doceolmode[0]', 'filetypes.doceolmode.python', 1),
('doceolmode[1]', 'filetypes.doceolmode.cpp', 1),
('doceolmode[2]', 'filetypes.doceolmode.html', 1),
('doceolmode[3]', 'filetypes.doceolmode.text', 1),
('doccommentstring[0]', 'filetypes.doccommentstring.python', 0),
('doccommentstring[1]', 'filetypes.doccommentstring.cpp', 0),
('doccommentstring[2]', 'filetypes.doccommentstring.html', 0),
('doccommentstring[3]', 'filetypes.doccommentstring.text', 0),
('docwordwrap[0]', 'filetypes.docwordwrap.python', 1),
('docwordwrap[1]', 'filetypes.docwordwrap.cpp', 1),
('docwordwrap[2]', 'filetypes.docwordwrap.html', 1),
('docwordwrap[3]', 'filetypes.docwordwrap.text', 1)],
'File Dialog': [('constantwildcard', 'constant.wildcard', 0),
('wildcard', 'wildcard', 0),
('windowsshortcutreplacetable', 'windows.shortcut.replace.table', 0),
('defaultextension', 'default.extension', 1),
('usewxfiledialog', 'use.wx.filedialog', 1)],
'Drag and Drop': [('draganddropmode', 'drag.and.drop.mode', 1),
('draganddroptextmode', 'drag.and.drop.text.mode', 1)],
'Document': [('docshowlinenumbers', 'doc.show.line.numbers', 1),
('docautoindent', 'doc.autoindent', 1),
('docautoreload', 'doc.autoreload', 1),
('docupdateindentation', 'doc.update.indentation', 1),
('docparenthesismatching', 'doc.parenthesis.matching', 1),
('docusefileindentation', 'doc.use.file.indentation', 1),
('docwhitespaceisvisible', 'doc.whitespace.is.visible.on.startup', 1),
('dochighlightcurrentline', 'doc.highlight.current.line', 1),
('docignorectrlpageupdown', 'doc.ignore.ctrlpageupdown', 1),
('doccaretwidth', 'doc.caret.width', 1),
('doccommentmode', 'doc.comment.mode', 1),
('docusestyles', 'doc.use.styles', 1),
('docuseindentationguides', 'doc.use.indentation.guides', 1),
('doclonglinecol', 'doc.long.line.col', 1),
('docscrollextrapage', 'doc.scroll.extra.page', 1),
('docdefaultsyntaxhighlighting', 'doc.default.syntax.highlighting', 1),
('doconlyusedefaultsyntaxhighlighting', 'doc.only.use.default.syntax.highlighting', 1),
('PythonStyleDictionary[0]', 'doc.style.normal', 0),
('PythonStyleDictionary[1]', 'doc.style.linenumber', 0),
('PythonStyleDictionary[2]', 'doc.style.brace.match', 0),
('PythonStyleDictionary[3]', 'doc.style.brace.nomatch', 0),
('PythonStyleDictionary[4]', 'doc.style.character', 0),
('PythonStyleDictionary[5]', 'doc.style.class', 0),
('PythonStyleDictionary[6]', 'doc.style.comment', 0),
('PythonStyleDictionary[7]', 'doc.style.comment.block', 0),
('PythonStyleDictionary[8]', 'doc.style.definition', 0),
('PythonStyleDictionary[9]', 'doc.style.keyword', 0),
('PythonStyleDictionary[10]', 'doc.style.number', 0),
('PythonStyleDictionary[11]', 'doc.style.operator', 0),
('PythonStyleDictionary[12]', 'doc.style.string', 0),
('PythonStyleDictionary[13]', 'doc.style.string.eol', 0),
('PythonStyleDictionary[14]', 'doc.style.triple.string', 0),
('PythonStyleDictionary[15]', 'doc.style.caret', 0),
('PythonStyleDictionary[16]', 'doc.style.selection', 0),
('PythonStyleDictionary[17]', 'doc.style.folding', 0),
('PythonStyleDictionary[18]', 'doc.style.longlinecol', 0),
('PythonStyleDictionary[19]', 'doc.style.current.line', 0),
('PythonStyleDictionary[20]', 'doc.style.indentation.guide', 0),
('CPPStyleDictionary[0]', 'doc.cstyle.normal', 0),
('CPPStyleDictionary[1]', 'doc.cstyle.linenumber', 0),
('CPPStyleDictionary[2]', 'doc.cstyle.brace.match', 0),
('CPPStyleDictionary[3]', 'doc.cstyle.brace.nomatch', 0),
('CPPStyleDictionary[4]', 'doc.cstyle.character', 0),
('CPPStyleDictionary[5]', 'doc.cstyle.preprocessor', 0),
('CPPStyleDictionary[6]', 'doc.cstyle.comment', 0),
('CPPStyleDictionary[7]', 'doc.cstyle.verbatim', 0),
('CPPStyleDictionary[8]', 'doc.cstyle.keyword', 0),
('CPPStyleDictionary[9]', 'doc.cstyle.c.identifier', 0),
('CPPStyleDictionary[10]', 'doc.cstyle.number', 0),
('CPPStyleDictionary[11]', 'doc.cstyle.operator', 0),
('CPPStyleDictionary[12]', 'doc.cstyle.string', 0),
('CPPStyleDictionary[13]', 'doc.cstyle.string.eol', 0),
('CPPStyleDictionary[14]', 'doc.cstyle.globalclass', 0),
('CPPStyleDictionary[15]', 'doc.cstyle.regex', 0),
('CPPStyleDictionary[16]', 'doc.cstyle.uuid', 0),
('CPPStyleDictionary[17]', 'doc.cstyle.caret', 0),
('CPPStyleDictionary[18]', 'doc.cstyle.selection', 0),
('CPPStyleDictionary[19]', 'doc.cstyle.folding', 0),
('CPPStyleDictionary[20]', 'doc.cstyle.longlinecol', 0),
('CPPStyleDictionary[21]', 'doc.cstyle.current.line', 0),
('HTMLStyleDictionary[0]', 'doc.htmlstyle.normal', 0),
('HTMLStyleDictionary[1]', 'doc.htmlstyle.linenumber', 0),
('HTMLStyleDictionary[2]', 'doc.htmlstyle.brace.match', 0),
('HTMLStyleDictionary[3]', 'doc.htmlstyle.brace.nomatch', 0),
('HTMLStyleDictionary[4]', 'doc.htmlstyle.tag', 0),
('HTMLStyleDictionary[5]', 'doc.htmlstyle.unknown.tag', 0),
('HTMLStyleDictionary[6]', 'doc.htmlstyle.attribute', 0),
('HTMLStyleDictionary[7]', 'doc.htmlstyle.unknown.attribute', 0),
('HTMLStyleDictionary[8]', 'doc.htmlstyle.number', 0),
('HTMLStyleDictionary[9]', 'doc.htmlstyle.string', 0),
('HTMLStyleDictionary[10]', 'doc.htmlstyle.character', 0),
('HTMLStyleDictionary[11]', 'doc.htmlstyle.comment', 0),
('HTMLStyleDictionary[12]', 'doc.htmlstyle.entity', 0),
('HTMLStyleDictionary[13]', 'doc.htmlstyle.tag.end', 0),
('HTMLStyleDictionary[14]', 'doc.htmlstyle.xml.start', 0),
('HTMLStyleDictionary[15]', 'doc.htmlstyle.xml.end', 0),
('HTMLStyleDictionary[16]', 'doc.htmlstyle.script', 0),
('HTMLStyleDictionary[17]', 'doc.htmlstyle.value', 0),
('HTMLStyleDictionary[18]', 'doc.htmlstyle.caret', 0),
('HTMLStyleDictionary[19]', 'doc.htmlstyle.selection', 0),
('HTMLStyleDictionary[20]', 'doc.htmlstyle.folding', 0),
('HTMLStyleDictionary[21]', 'doc.htmlstyle.longlinecol', 0),
('HTMLStyleDictionary[22]', 'doc.htmlstyle.current.line', 0)],
'Prompt': [('promptisvisible', 'prompt.is.visible.on.startup', 1),
('promptmarginwidth', 'prompt.margin.width', 1),
('promptsize', 'prompt.size', 1),
('prompttabwidth', 'prompt.tabwidth', 1),
('prompteolmode', 'prompt.eolmode', 1),
('promptusetabs', 'prompt.use.tabs', 1),
('promptwordwrap', 'prompt.wordwrap', 1),
('promptwhitespaceisvisible', 'prompt.whitespace.is.visible.on.startup', 1),
('promptcaretwidth', 'prompt.caret.width', 1),
('promptusestyles', 'prompt.use.styles', 1),
('promptscrollextrapage', 'prompt.scroll.extra.page', 1),
('promptstartupscript', 'prompt.startup.script', 0),
('txtPromptStyleDictionary[0]', 'prompt.style.normal', 0),
('txtPromptStyleDictionary[1]', 'prompt.style.linenumber', 0),
('txtPromptStyleDictionary[2]', 'prompt.style.brace.match', 0),
('txtPromptStyleDictionary[3]', 'prompt.style.brace.nomatch', 0),
('txtPromptStyleDictionary[4]', 'prompt.style.character', 0),
('txtPromptStyleDictionary[5]', 'prompt.style.class', 0),
('txtPromptStyleDictionary[6]', 'prompt.style.comment', 0),
('txtPromptStyleDictionary[7]', 'prompt.style.comment.block', 0),
('txtPromptStyleDictionary[8]', 'prompt.style.definition', 0),
('txtPromptStyleDictionary[9]', 'prompt.style.keyword', 0),
('txtPromptStyleDictionary[10]', 'prompt.style.number', 0),
('txtPromptStyleDictionary[11]', 'prompt.style.operator', 0),
('txtPromptStyleDictionary[12]', 'prompt.style.string', 0),
('txtPromptStyleDictionary[13]', 'prompt.style.string.eol', 0),
('txtPromptStyleDictionary[14]', 'prompt.style.triple.string', 0),
('txtPromptStyleDictionary[15]', 'prompt.style.caret', 0),
('txtPromptStyleDictionary[16]', 'prompt.style.selection', 0)],
'Side Panels': [('sidepanelleftsize', 'side.panel.left.size', 1),
('sidepanelrightsize', 'side.panel.right.size', 1),
('sidepaneltopsize', 'side.panel.top.size', 1)],
'Find/Replace': [('findreplaceregularexpression', 'find.replace.regular.expression', 1),
('findreplacematchcase', 'find.replace.match.case', 1),
('findreplacefindbackwards', 'find.replace.find.backwards', 1),
('findreplacewholeword', 'find.replace.whole.word', 1),
('findreplaceinselection', 'find.replace.in.selection', 1),
('findreplacefromcursor', 'find.replace.from.cursor', 1),
('findreplacepromptonreplace', 'find.replace.prompt.on.replace', 1),
('findreplaceautowrap', 'find.replace.auto.wrap', 1),
('findreplaceundercursor', 'find.replace.prompt.under.cursor', 1)],
'Source Browser': [('sourcebrowserpanel', 'sourcebrowser.panel', 1),
('sourcebrowsersize', 'sourcebrowser.size', 1),
('sourcebrowserisvisible', 'sourcebrowser.is.visible', 1),
('sourcebrowsercloseonactivate', 'sourcebrowser.close.on.activate', 1),
('sourcebrowserissorted', 'sourcebrowser.is.sorted', 1),
('sourcebrowserautorefreshonsave', 'sourcebrowser.auto.refresh.on.save', 1),
('sourcebrowserautorefresh', 'sourcebrowser.auto.refresh', 1),
('sourcebrowseruseimages', 'sourcebrowser.use.images', 1),
('sourcebrowserstyle', 'sourcebrowser.style', 0)],
'Bookmarks': [('bookmarksstyle', 'bookmarks.style', 0)],
'Plugins': [('pluginsdirectory', 'plugins.directory', 2)],
'DrScript': [('drscriptsdirectory', 'drscripts.directory', 2),
('drscriptstyle', 'drscript.style', 0),
('drscriptloadexamples', 'drscript.load.examples', 1)],
'Printing': [('printdoclinenumbers', 'print.doc.linenumbers', 1),
('printpromptlinenumbers', 'print.prompt.linenumbers', 1),
('printtabwidth', 'print.tab.width', 1)],
'Documentation': [('documentationbrowser', 'documentation.browser', 0),
('documentationpythonlocation', 'documentation.python.location', 0),
('documentationwxwidgetslocation', 'documentation.wx.widgets.location', 0),
('documentationrehowtolocation', 'documentation.rehowto.location', 0)]}


class drPreferences:

    def __init__(self, platform_is_windows, programdirectory = ""):
        self.platform_is_windows = platform_is_windows
        self.programdirectory = programdirectory
        #General Settings
        self.rememberwindowsizeandposition = 1
        self.rememberdialogsizesandpositions = 1
        self.rememberpanelsizes = 1
        self.autodetectencoding = 1
        self.defaultencoding = 'latin-1'
        self.saveonrun = 1
        self.checksyntaxonsave = 1
        self.checksyntaxextensions = ''
        self.promptonsaveall = 1
        self.doubleclicktoclosetab = 0
        self.iconsize = 16
        self.recentfileslimit = 10
        self.checkindentation = 0
        self.vieweol = 1
        self.checkeol = 1
        self.pythonargs = ""
        self.defaultdirectory = programdirectory
        self.enablefeedback = 1
        wx.GetApp().debugmodus = self.debugmodus = 1
        self.alwayspromptonexit = 0
        self.backupfileonsave = 1
        self.save = 0

        #File Dialog
        self.usewxfiledialog = 0
        self.defaultextension = 1
        self.constantwildcard = '*.lnk'
        #self.windowsshortcutreplacetable = 'C:,/mnt/win_c#'
        #@ = replace with lowercase match & = replace with exact match
        self.windowsshortcutreplacetable = '[A-Z],/mnt/win_@#'
        if self.platform_is_windows:
            self.wildcard = "Python Source (*.pyw *.py)|*.pyw;*.py|C/C++ Source (*.c *.cc *.cpp *.cxx *.h *.hh *.hpp *.hxx)|*.c;*.cc;*.cpp;*.cxx;*.h;*.hh;*.hpp;*.hxx|HTML Files (*.htm *.html *.shtm *.shtml *.xml)|*.htm;*.html;*.shtm;*.shtml;*.xml|Backup Files (*.bak)|*.bak|Plain Text (*.txt *.dat *.log)|*.txt;*.dat;*.log|All Files (*)|*"
        else:
            self.wildcard = "Python Source (*.py *.pyw)|*.py;*.pyw|C/C++ Source (*.c *.cc *.cpp *.cxx *.h *.hh *.hpp *.hxx)|*.c;*.cc;*.cpp;*.cxx;*.h;*.hh;*.hpp;*.hxx|HTML Files (*.htm *.html *.shtm *.shtml *.xml)|*.htm;*.html;*.shtm;*.shtml;*.xml|Backup Files (*.bak)|*.bak|Plain Text (*.txt *.dat *.log)|*.txt;*.dat;*.log|All Files (*)|*"

        #Drag and Drop
        self.draganddropmode = 2
        self.draganddroptextmode = 0

        #File Types
        self.extensions = {0: 'py,pyw', 1: 'c,cc,cpp,cxx,h,hh,hpp,hxx', 2: 'htm,shtm,html,shtml,xml', 3: 'txt,dat,log'}
        self.docfolding = {0: 1, 1: 0, 2: 0, 3: 0}
        self.doctabwidth = {0: 4, 1: 4, 2: 4, 3: 4}
        self.docusetabs = {0: 0, 1: 0, 2: 0, 3: 0}
        self.docuseintellibackspace = {0: 1, 1: 1, 2: 1, 3: 1}
        self.docremovetrailingwhitespace = {0: 0, 1: 0, 2: 0, 3: 0}
        self.doceolmode = {0: 0, 1: 0, 2: 0, 3: 0}
        self.doccommentstring = {0: '#', 1: '//', 2: '', 3: '#'}
        self.docwordwrap = {0: 0, 1: 0, 2: 0, 3: 0}

        #Document Settings
        self.docshowlinenumbers = 1
        self.docautoindent = 2
        self.docautoreload = 1
        self.docupdateindentation = 0
        self.docparenthesismatching = 1
        self.docusefileindentation = 1
        self.docwhitespaceisvisible = 0
        self.dochighlightcurrentline = 1
        self.docignorectrlpageupdown = 0
        self.doccaretwidth = 1
        self.doccommentmode = 0
        self.docusestyles = 1
        self.docuseindentationguides = 1
        self.doclonglinecol = 0
        self.docscrollextrapage = 0
        self.docdefaultsyntaxhighlighting = 0
        self.doconlyusedefaultsyntaxhighlighting = 0

        self.PythonStyleDictionary = dict(map(_stringify, range(21)))
        self.CPPStyleDictionary = dict(map(_stringify, range(22)))
        self.HTMLStyleDictionary = dict(map(_stringify, range(23)))

        if self.platform_is_windows:
            defaultfont0="Courier" #monospaced
            defaultfont1="MS Sans Serif" #proportional
        else:
            defaultfont0="Courier 10 Pitch" #monospaced
            defaultfont1="Sans" #proportional
        
        #check if those fonts exists, else use system default
        FontList = wx.FontEnumerator().GetFacenames()
        defaultfont = wx.GetApp().GetTopWindow().GetFont().GetFaceName()
        if defaultfont0 not in FontList:
            defaultfont0=defaultfont
        if defaultfont1 not in FontList:
            defaultfont1=defaultfont
        
        self.PythonStyleDictionary[0] = "fore:#000000,back:#FFFFFF,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[1] = "fore:#000000,back:#82AEE3,size:10,face:%s" %defaultfont1
        self.PythonStyleDictionary[2] = "fore:#FF6400,back:#98D3FF,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[3] = "fore:#FF0000,back:#FFFF00,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[4] = "fore:#007f08,back:#ffffff,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[5] = "fore:#b200ac,back:#ffffff,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[6] = "fore:#7F7F7F,back:#FFFFFF,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[7] = "fore:#0B5400,back:#BAE8D5,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[8] = "fore:#e80300,back:#ffffff,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[9] = "fore:#FF0000,back:#ffffff,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[10] = "fore:#0027c4,back:#ffffff,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[11] = "fore:#FF0071,back:#ffffff,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[12] = "fore:#007f08,back:#ffffff,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[13] = "fore:#007f08,back:#ffffff,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[14] = "fore:#7B8184,back:#FFFFFF,size:10,face:%s" %defaultfont0
        self.PythonStyleDictionary[15] = "#000000"
        self.PythonStyleDictionary[16] = "fore:#000000,back:#FF7900"
        self.PythonStyleDictionary[17] = "fore:#000000,back:#82AEE3"
        self.PythonStyleDictionary[18] = "#82AEE3"
        self.PythonStyleDictionary[19] = "#98D3FF"
        self.PythonStyleDictionary[20] = "#AAAAAA"

        self.CPPStyleDictionary[0] = "fore:#000000,back:#FFFFFF,size:12,face:%s" %defaultfont0
        self.CPPStyleDictionary[1] = "fore:#000000,back:#82AEE3,size:12,face:%s" %defaultfont0
        self.CPPStyleDictionary[2] = "fore:#FF6400,back:#98D3FF,bold"
        self.CPPStyleDictionary[3] = "fore:#FF0000,back:#FFFF00,bold"
        self.CPPStyleDictionary[4] = "fore:#007f08,back:#ffffff"
        self.CPPStyleDictionary[5] = "fore:#228D63,back:#ffffff,bold"
        self.CPPStyleDictionary[6] = "fore:#2D3D9E,back:#DFDFEB,bold"
        self.CPPStyleDictionary[7] = "fore:#e80300,back:#ffffff"
        self.CPPStyleDictionary[8] = "fore:#000000,back:#ffffff,bold"
        self.CPPStyleDictionary[9] = "fore:#000000,back:#ffffff"
        self.CPPStyleDictionary[10] = "fore:#2050C6,back:#ffffff,"
        self.CPPStyleDictionary[11] = "fore:#003D22,back:#ffffff"
        self.CPPStyleDictionary[12] = "fore:#008500,back:#FFFFFF"
        self.CPPStyleDictionary[13] = "fore:#008500,back:#FFFFFF"
        self.CPPStyleDictionary[14] = "fore:#000000,back:#FFFFFF"
        self.CPPStyleDictionary[15] = "fore:#338144,back:#5FFFFF,bold"
        self.CPPStyleDictionary[16] = "fore:#330044,back:#5FFFFF"
        self.CPPStyleDictionary[17] = "#000000"
        self.CPPStyleDictionary[18] = "fore:#000000,back:#FF7900"
        self.CPPStyleDictionary[19] = "fore:#000000,back:#82AEE3"
        self.CPPStyleDictionary[20] = "#82AEE3"
        self.CPPStyleDictionary[21] = "#98D3FF"

        self.HTMLStyleDictionary[0] = "fore:#000000,back:#FFFFFF,size:12,face:%s" %defaultfont0
        self.HTMLStyleDictionary[1] = "fore:#000000,back:#82AEE3,size:12,face:%s" %defaultfont0
        self.HTMLStyleDictionary[2] = "fore:#FF6400,back:#98D3FF,bold"
        self.HTMLStyleDictionary[3] = "fore:#FF0000,back:#FFFF00,bold"
        self.HTMLStyleDictionary[4] = "fore:#000000,back:#ffffff,bold"
        self.HTMLStyleDictionary[5] = "fore:#0000FF,back:#FFFFFF,bold"
        self.HTMLStyleDictionary[6] = "fore:#2D3D9E,back:#DFDFEB,bold"
        self.HTMLStyleDictionary[7] = "fore:#FF0000,back:#ffff00,bold"
        self.HTMLStyleDictionary[8] = "fore:#0000FF,back:#ffffff"
        self.HTMLStyleDictionary[9] = "fore:#003100,back:#ffffff"
        self.HTMLStyleDictionary[10] = "fore:#204D71,back:#ffffff,bold"
        self.HTMLStyleDictionary[11] = "fore:#2D3D9E,back:#DFDFEB,bold"
        self.HTMLStyleDictionary[12] = "fore:#7B8184,back:#FFFFFF,bold"
        self.HTMLStyleDictionary[13] = "fore:#000000,back:#FFF7C2,bold"
        self.HTMLStyleDictionary[14] = "fore:#000081,back:#FFE48D,bold"
        self.HTMLStyleDictionary[15] = "fore:#006E00,back:#FFE48D,bold"
        self.HTMLStyleDictionary[16] = "fore:#00812A,back:#CEF0FF,bold"
        self.HTMLStyleDictionary[17] = "fore:#000000,back:#C2FFE8,bold"
        self.HTMLStyleDictionary[18] = "#000000"
        self.HTMLStyleDictionary[19] = "fore:#000000,back:#FF7900"
        self.HTMLStyleDictionary[20] = "fore:#000000,back:#82AEE3"
        self.HTMLStyleDictionary[21] = "#82AEE3"
        self.HTMLStyleDictionary[22] = "#98D3FF"

        self.txtDocumentStyleDictionary = self.PythonStyleDictionary

        #Prompt Settings
        self.promptisvisible = 0
        self.promptmarginwidth = 0
        self.prompttabwidth = 4
        self.promptsize = 50
        self.prompteolmode = 0
        self.promptusetabs = 1
        self.promptwordwrap = 1
        self.promptwhitespaceisvisible = 0
        self.promptcaretwidth = 1
        self.promptusestyles = 1
        self.promptscrollextrapage = 0
        self.promptstartupscript = 'import sys, os, wx'
        self.txtPromptStyleDictionary = dict(map(_stringify, range(17)))

        # lm - changing default prompt style for increased readability

        #normal
        self.txtPromptStyleDictionary[0] = "fore:#000000,back:#FFFFFF,size:8,face:%s" %defaultfont1
        # line number (margin)
        self.txtPromptStyleDictionary[1] = "fore:#000000,back:#82AEE3,size:8"
        # brace selected (match)
        self.txtPromptStyleDictionary[2] = "fore:#000000,back:#FFFFFF"
        # brace selected (no match)
        self.txtPromptStyleDictionary[3] = "fore:#000000,back:#FFFFFF"
        # character (single quoted string)
        self.txtPromptStyleDictionary[4] = "fore:#000000,back:#FFFFFF"
        #class name
        self.txtPromptStyleDictionary[5] = "fore:#000000,back:#FFFFFF"
        #comment
        self.txtPromptStyleDictionary[6] = "fore:#000000,back:#FFFFFF"
        #comment block
        self.txtPromptStyleDictionary[7] = "fore:#000000,back:#FFFFFF"
        #function name
        self.txtPromptStyleDictionary[8] = "fore:#000000,back:#FFFFFF"
        #keyword
        self.txtPromptStyleDictionary[9] = "fore:#000000,back:#FFFFFF"
        #number
        self.txtPromptStyleDictionary[10] = "fore:#000000,back:#FFFFFF"
        #operator
        self.txtPromptStyleDictionary[11] = "fore:#000000,back:#FFFFFF"
        #string
        self.txtPromptStyleDictionary[12] = "fore:#000000,back:#FFFFFF"
        #string eol
        self.txtPromptStyleDictionary[13] = "fore:#000000,back:#FFFFFF"
        #triple quoted string
        self.txtPromptStyleDictionary[14] = "fore:#000000,back:#FFFFFF"
        #caret foreground
        self.txtPromptStyleDictionary[15] = "#000000"
        #selection
        self.txtPromptStyleDictionary[16] = "fore:#000000,back:#FF7900"

        # /lm
        #Side Panel Settings
        self.sidepanelleftsize = 30
        self.sidepanelrightsize = 30
        self.sidepaneltopsize = 30

        #Find/Replace Settings
        self.findreplaceregularexpression = 0
        self.findreplacematchcase = 0
        self.findreplacefindbackwards = 0
        self.findreplacewholeword = 0
        self.findreplaceinselection = 0
        self.findreplacefromcursor = 1
        self.findreplacepromptonreplace = 1
        self.findreplaceautowrap = 0
        self.findreplaceundercursor = 1

        #Source Browser Settings
        self.sourcebrowserpanel = 0
        self.sourcebrowsersize = 25
        self.sourcebrowserisvisible = 1
        self.sourcebrowsercloseonactivate = 0
        self.sourcebrowserissorted = 0
        self.sourcebrowserautorefreshonsave = 1
        self.sourcebrowserautorefresh = 0
        self.sourcebrowseruseimages = 0
        self.sourcebrowserstyle = "fore:#FF0000,back:#FFFFFF,size:10,face:%s" %defaultfont1

        #Bookmarks Settings
        self.bookmarksstyle = "fore:#000000,back:#FFFFFF,size:12,face:%s,bold" %defaultfont1
        preferencesdirectory = wx.GetApp().GetTopWindow().preferencesdirectory
        
        #Plugins Settings
        self.pluginsdirectory = os.path.join(preferencesdirectory, 'drplugins').replace ('\\', "/")

        #DrScript Settings
        self.drscriptsdirectory = os.path.join(preferencesdirectory, 'drscripts').replace ('\\', "/")
        
        self.drscriptstyle = "fore:#000000,back:#FFFFFF,size:12,face:%s,bold" %defaultfont1
        self.drscriptloadexamples = 1

        #Printing Settings
        self.printdoclinenumbers = 1
        self.printpromptlinenumbers = 0
        self.printtabwidth = 4

        #Documentation Settings
        self.documentationbrowser = "mozilla"
        if self.platform_is_windows:
            self.documentationbrowser = "<os.startfile>"
        self.documentationpythonlocation = "http://www.python.org/doc/current/"
        self.documentationwxwidgetslocation = "http://www.wxwidgets.org/docs.htm"
        self.documentationrehowtolocation = "http://www.amk.ca/python/howto/regex/"

    def __getitem__(self, key):
        k = key.find('[')
        if k > -1:
            return self.__dict__[key[:k]][_getkey(key)]
        else:
            return self.__dict__[key]

    def __setitem__(self, key, value):
        k = key.find('[')
        if k > -1:
            self.__dict__[key[:k]][_getkey(key)] = value
        else:
            self.__dict__[key] = value

    def reset(self):
        self.__init__(self.platform_is_windows, self.programdirectory)

    def resetjust(self, target):
        defaults = drPreferences(self.platform_is_windows, self.programdirectory)

        prefsdictionary = GetPreferencesDictionary()
        if prefsdictionary.has_key(target):
            for Preference in prefsdictionary[target]:
                self[Preference[0]] = defaults[Preference[0]]
        wx.GetApp().debugmodus = self['debugmodus']

    def Copy(self, target):
        self.platform_is_windows = target.platform_is_windows
        self.programdirectory = target.programdirectory

        prefsdictionary = GetPreferencesDictionary()
        for Entry in prefsdictionary:
            for Preference in prefsdictionary[Entry]:
                self[Preference[0]] = target[Preference[0]]
        wx.GetApp().debugmodus = self['debugmodus']
                