#	Programmer:	Daniel Pozmanter
#	E-mail:		drpython@bluebottle.com
#	Note:		You must reply to the verification e-mail to get through.
#
#	Copyright 2003-2005 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

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),
('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),
('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),
('docremovetrailingwhitespace', 'doc.remove.trailing.whitespace', 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),
('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),
('sourcebrowserstyle', 'sourcebrowser.style', 0)],
'Bookmarks': [('bookmarksstyle', 'bookmarks.style', 0)],
'Plugins': [('pluginsdefaultdirectory', 'plugins.default.directory', 2)],
'DrScript': [('drscriptdefaultdirectory', 'drscript.default.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 = 0
		self.rememberdialogsizesandpositions = 0
		self.rememberpanelsizes = 0
		self.autodetectencoding = 1
		self.defaultencoding = ''
		self.saveonrun = 0
		self.checksyntaxonsave = 0
		self.checksyntaxextensions = ''
		self.promptonsaveall = 1
		self.doubleclicktoclosetab = 0
		self.iconsize = 24
		self.recentfileslimit = 10
		self.checkindentation = 0
		self.vieweol = 1
		self.checkeol = 1
		self.pythonargs = ""
		self.defaultdirectory = os.path.expanduser("~")
		self.enablefeedback = 1
		self.alwayspromptonexit = 0
		self.backupfileonsave = 1

		#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 = 0
		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: 0, 1: 0, 2: 0, 3: 0}
		self.doctabwidth = {0: 4, 1: 4, 2: 4, 3: 4}
		self.docusetabs = {0: 1, 1: 1, 2: 1, 3: 1}
		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.docremovetrailingwhitespace = 0
		self.docautoreload = 1
		self.docupdateindentation = 0
		self.docparenthesismatching = 1
		self.docusefileindentation = 1
		self.docwhitespaceisvisible = 0
		self.dochighlightcurrentline = 1
		self.doccaretwidth = 1
		self.doccommentmode = 0
		self.docusestyles = 1
		self.docuseindentationguides = 0
		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)))

		self.PythonStyleDictionary[0] = "fore:#000000,back:#FFFFFF,size:12,face:lucida"
		self.PythonStyleDictionary[1] = "fore:#000000,back:#82AEE3,size:12,face:lucida"
		if (self.platform_is_windows):
			self.PythonStyleDictionary[0] = "fore:#000000,back:#FFFFFF,size:8,face:Courier New"
			self.PythonStyleDictionary[1] = "fore:#000000,back:#82AEE3,size:8,face:Courier New"
		self.PythonStyleDictionary[2] = "fore:#FF6400,back:#98D3FF,bold"
		self.PythonStyleDictionary[3] = "fore:#FF0000,back:#FFFF00,bold"
		self.PythonStyleDictionary[4] = "fore:#007f08,back:#ffffff"
		self.PythonStyleDictionary[5] = "fore:#b200ac,back:#ffffff"
		self.PythonStyleDictionary[6] = "fore:#2D3D9E,back:#DFDFEB,bold"
		self.PythonStyleDictionary[7] = "fore:#0B5400,back:#BAE8D5,bold"
		self.PythonStyleDictionary[8] = "fore:#e80300,back:#ffffff"
		self.PythonStyleDictionary[9] = "fore:#000000,back:#ffffff,bold"
		self.PythonStyleDictionary[10] = "fore:#0027c4,back:#ffffff"
		self.PythonStyleDictionary[11] = "fore:#204D71,back:#ffffff,bold"
		self.PythonStyleDictionary[12] = "fore:#007f08,back:#ffffff"
		self.PythonStyleDictionary[13] = "fore:#007f08,back:#ffffff"
		self.PythonStyleDictionary[14] = "fore:#7B8184,back:#FFFFFF,bold"
		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:lucida"
		self.CPPStyleDictionary[1] = "fore:#000000,back:#82AEE3,size:12,face:lucida"
		if (self.platform_is_windows):
			self.CPPStyleDictionary[0] = "fore:#000000,back:#FFFFFF,size:8,face:Courier New"
			self.CPPStyleDictionary[1] = "fore:#000000,back:#82AEE3,size:8,face:Courier New"
		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:lucida"
		self.HTMLStyleDictionary[1] = "fore:#000000,back:#82AEE3,size:12,face:lucida"
		if (self.platform_is_windows):
			self.HTMLStyleDictionary[0] = "fore:#000000,back:#FFFFFF,size:8,face:Courier New"
			self.HTMLStyleDictionary[1] = "fore:#000000,back:#82AEE3,size:8,face:Courier New"
		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'
		self.txtPromptStyleDictionary = dict(map(_stringify, range(17)))
		self.txtPromptStyleDictionary[0] = "fore:#FFFFFF,back:#000000,size:12,face:fixed"
		if (self.platform_is_windows):
			self.txtPromptStyleDictionary[0] = "fore:#FFFFFF,back:#000000,size:8,face:Courier New"
		self.txtPromptStyleDictionary[1] = "fore:#FFFFFF,back:#710000"
		self.txtPromptStyleDictionary[2] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[3] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[4] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[5] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[6] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[7] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[8] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[9] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[10] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[11] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[12] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[13] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[14] = "fore:#FFFFFF,back:#000000"
		self.txtPromptStyleDictionary[15] = "#FFFFFF"
		self.txtPromptStyleDictionary[16] = "fore:#000000,back:#FF7900"

		#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 = 0
		self.sourcebrowsercloseonactivate = 0
		self.sourcebrowserissorted = 0
		self.sourcebrowserautorefreshonsave = 1
		self.sourcebrowserautorefresh = 0
		self.sourcebrowserstyle = "fore:#000000,back:#FFFFFF,size:12,face:fixed,bold"
		if (self.platform_is_windows):
			self.sourcebrowserstyle = "fore:#000000,back:#FFFFFF,size:8,face:Arial,bold"

		#Bookmarks Settings
		self.bookmarksstyle = "fore:#000000,back:#FFFFFF,size:12,face:fixed,bold"
		if (self.platform_is_windows):
			self.bookmarksstyle = "fore:#000000,back:#FFFFFF,size:8,face:Arial,bold"

		#Plugins Settings
		self.pluginsdefaultdirectory = os.path.expanduser("~")

		#DrScript Settings
		self.drscriptdefaultdirectory = os.path.expanduser("~")
		self.drscriptstyle = "fore:#000000,back:#FFFFFF,size:12,face:fixed,bold"
		if (self.platform_is_windows):
			self.drscriptstyle = "fore:#000000,back:#FFFFFF,size:8,face:Arial,bold"
		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]]

	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]]

syntax highlighted by Code2HTML, v. 0.9.1