#	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
import os, os.path, locale
import wx
import drScrolledMessageDialog
from drProperty import *
import drPrefsFile
import drFileDialog
from drStyleDialog import drStyleDialog, drSimpleStyleDialog
from drPreferences import drPreferences

#Cause I want it to work MY way!
class drPrefsBook(wx.Panel):
	def __init__(self, parent, id, size):
		wx.Panel.__init__(self, parent, id, size=size)

		x, y = size

		self.pages = []
		self.labels = []

		self.ancestor = parent.parent

		self.listview = wx.ListView(self, id+1, pos=(0, 0), size=(150, y), style=wx.LC_SINGLE_SEL|wx.LC_LIST)

		self.Bind(wx.EVT_LIST_ITEM_FOCUSED, self.OnSelected, id=id+1)
		self.Bind(wx.EVT_SIZE, self.OnSize)

		self.oldpos = -1

	def AddPage(self, page, label):
		page.Show(False)
		self.pages.append(page)
		self.labels.append(label)

	def OnSelected(self, event):
		if self.oldpos > -1:
			self.pages[self.oldpos].Show(False)

		sel = self.listview.GetFocusedItem()

		self.ancestor.prefdialogposition = sel

		px, py = self.GetPositionTuple()
		sx, sy = self.GetSizeTuple()

		self.pages[sel].Move((px+150, 0))
		self.pages[sel].SetSize((sx-150, sy))

		self.pages[sel].Show(True)

		self.oldpos = sel

	def OnSize(self, event):
		sel = self.listview.GetFocusedItem()

		px, py = self.GetPositionTuple()
		sx, sy = self.GetSizeTuple()

		self.listview.SetSize((150, sy))

		self.pages[sel].Move((px+150, 0))
		self.pages[sel].SetSize((sx-150, sy))

	def SetSelection(self, selection):
		self.listview.Select(selection)
		self.listview.Focus(selection)

	def ShowPanel(self, selection=0):
		x = 0
		for label in self.labels:
			self.listview.InsertStringItem(x, label)
			x += 1
		self.listview.Select(selection)
		self.listview.Focus(selection)
		self.OnSelected(None)


#Cleaned up the sizing code, which was a tad ugly.
class PrefsPanel(wx.ScrolledWindow):
	def __init__(self, parent, id, name, NumberOfItems):
		wx.ScrolledWindow.__init__(self, parent, id)

		self.SetName(name)

		self.grandparent = parent.GetParent()

		self.drframe = self.grandparent.parent

		self.EnableScrolling(True, True)
		self.SetScrollbars(10, NumberOfItems+3, 35, 62)

		self.btnResetPanel = wx.Button(self, self.grandparent.ID_RESET_PANEL, " Reset Panel ")

		self.theSizer = wx.FlexGridSizer(NumberOfItems+2, 3, 5, 10)

		self.AddBuffer()
		self.Add(self.btnResetPanel, "Reset Just These Preferences:")

		self.Bind(wx.EVT_BUTTON,  self.grandparent.OnbtnResetPanel, id=self.grandparent.ID_RESET_PANEL)

		self.Show(False)

	def Add(self, wxitem, label=""):
		if len(label) > 0:
			self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)
			self.theSizer.Add(wx.StaticText(self, -1, label), 1, wx.EXPAND)
			self.theSizer.Add(wxitem,1,wx.SHAPED)
		else:
			self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)
			self.theSizer.Add(wxitem, 1, wx.SHAPED)
			self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)

	def AddBuffer(self):
		self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)
		self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)
		self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)

	def AddLabel(self, label):
		self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)
		self.theSizer.Add(wx.StaticText(self, -1, label), 1, wx.EXPAND)
		self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)

	def AddTwoItems(self, wxitem1, wxitem2):
		self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)
		self.theSizer.Add(wxitem1,1,wx.SHAPED)
		self.theSizer.Add(wxitem2,1,wx.SHAPED)

	def SetPanelSizer(self):
		self.SetAutoLayout(True)
		self.SetSizer(self.theSizer)


class BookmarksPanel(PrefsPanel):

	def __init__(self, parent, id, name):

		PrefsPanel.__init__(self, parent, id, name, 1)

		self.btnBStyle = wx.Button(self, self.grandparent.ID_BOOKMARKS_STYLE, " Edit Bookmarks Style ")

		self.Add(self.btnBStyle)

		self.SetPanelSizer()

		self.Bind(wx.EVT_BUTTON, self.OnbtnBStyle, id=self.grandparent.ID_BOOKMARKS_STYLE)

	def OnbtnBStyle(self, event):
		d = drSimpleStyleDialog(self, -1, ("Style: Bookmarks"), self.grandparent.prefs.bookmarksstyle, self.grandparent.prefs.bookmarksstyle)

		d.ShowModal()
		if (d.ClickedOk()):
			self.grandparent.prefs.bookmarksstyle = d.GetStyleString()
		d.Destroy()

class DocumentPanel(PrefsPanel):

	def __init__(self, parent, id, name):
		PrefsPanel.__init__(self, parent, id, name, 10)

		self.radusestyles = wx.RadioBox(self, -1, "Styles:", wx.DefaultPosition, wx.DefaultSize, ["Don't Use Styles", "Use Styles", "Only Use \"Normal\", \"Caret Foreground\""], 1, wx.RA_SPECIFY_COLS)
		self.boxdefaultsyntaxhighlighting = wx.Choice(self, -1, wx.Point(225, 135), wx.Size(-1, -1), ["Python", "C/C++", "HTML"])
		self.chkonlyusedefaultsyntaxhighlighting = wx.CheckBox(self, -1, "")
		self.btnStyle = wx.Button(self, self.grandparent.ID_FILE_STYLE, " Edit Text Styles ")
		self.btnApplyProperty = wx.Button(self, self.grandparent.ID_APPLY_PROPERTY, " Apply Text Property To All Styles ")
		self.raddocautoindent = wx.RadioBox(self, -1, "Auto Indent:", wx.DefaultPosition, wx.DefaultSize, ["None", "Normal", "Context Sensitive"], 1, wx.RA_SPECIFY_COLS)
		self.chkdocshowlinenumbers = wx.CheckBox(self, -1, "")
		self.chkdocremovetrailingwhitespace = wx.CheckBox(self, -1, "")
		self.chkdocautoreload = wx.CheckBox(self, -1, "")
		self.chkdocparenthesismatching = wx.CheckBox(self, -1, "")
		self.chkdocupdateindentation = wx.CheckBox(self, -1, "")
		self.chkdocusefileindentation = wx.CheckBox(self, -1, '')
		self.chkWhitespace = wx.CheckBox(self, -1, "")
		self.txtcaretwidth = wx.TextCtrl(self, self.grandparent.ID_DOC_CARET_WIDTH, str(self.grandparent.prefs.doccaretwidth), wx.Point(225, 215), wx.Size(35, -1))
		self.chkhighlightcurrentline = wx.CheckBox(self, -1, "")
		self.chkuseindentationguides = wx.CheckBox(self, -1, "")
		#Chris McDonough (I added txt prefix, update for local constants)
		self.txtdoclonglinecol = wx.TextCtrl(self, self.grandparent.ID_LONGLINE_COL, str(self.grandparent.prefs.doclonglinecol), wx.Point(225, 215), wx.Size(35, -1))
		#/Chris McDonough

		self.chkscrollextrapage = wx.CheckBox(self, -1, "")
		self.raddoccommentmode = wx.RadioBox(self, -1, "Comment Mode:", wx.DefaultPosition, wx.DefaultSize, ["Start of Line", "Start of Word"], 1, wx.RA_SPECIFY_COLS)

		self.Add(self.btnStyle)
		self.Add(self.btnApplyProperty)
		self.Add(self.radusestyles)
		self.Add(self.boxdefaultsyntaxhighlighting, "Default Syntax Highlighting:")
		self.Add(self.chkonlyusedefaultsyntaxhighlighting, "Only Use Default Syntax Highlighting:")
		self.Add(self.chkdocshowlinenumbers, "Show Line Numbers:")
		self.Add(self.chkdocremovetrailingwhitespace, "Remove Trailing Whitespace:")
		self.Add(self.raddocautoindent)
		self.Add(self.chkdocautoreload, "Auto Reload:")
		self.Add(self.chkdocparenthesismatching, "Parenthesis Matching:")
		self.Add(self.chkdocupdateindentation, "Update Indentation:")
		self.Add(self.chkdocusefileindentation, "Use File's Indentation:")
		self.Add(self.chkWhitespace, "Whitespace is visible on startup:")
		self.Add(self.chkuseindentationguides, "Use Indentation guides:")
		self.Add(self.txtdoclonglinecol, "Long Line Indicator Column:")
		self.Add(self.chkscrollextrapage, "Scroll Extra Page:")
		self.Add(self.txtcaretwidth, "Caret Width:")
		self.Add(self.chkhighlightcurrentline, "Highlight Current Line:")
		self.Add(self.raddoccommentmode)

		self.SetPanelSizer()

		self.reset()

		self.Bind(wx.EVT_BUTTON, self.OnbtnStyle, id=self.grandparent.ID_FILE_STYLE)
		self.Bind(wx.EVT_BUTTON, self.OnbtnApplyProperty, id=self.grandparent.ID_APPLY_PROPERTY)
		self.Bind(wx.EVT_TEXT, self.Ontxtcaretwidth, id=self.grandparent.ID_DOC_CARET_WIDTH)
		self.Bind(wx.EVT_TEXT, self.Ontxtdoclonglinecol, id=self.grandparent.ID_LONGLINE_COL)

	def reset(self):

		self.boxdefaultsyntaxhighlighting.SetSelection(self.grandparent.prefs.docdefaultsyntaxhighlighting)
		self.chkonlyusedefaultsyntaxhighlighting.SetValue(self.grandparent.prefs.doconlyusedefaultsyntaxhighlighting)
		self.radusestyles.SetSelection(self.grandparent.prefs.docusestyles)
		self.chkdocshowlinenumbers.SetValue(self.grandparent.prefs.docshowlinenumbers)
		self.chkdocremovetrailingwhitespace.SetValue(self.grandparent.prefs.docremovetrailingwhitespace)
		self.raddocautoindent.SetSelection(self.grandparent.prefs.docautoindent)
		self.chkdocautoreload.SetValue(self.grandparent.prefs.docautoreload)
		self.chkdocparenthesismatching.SetValue(self.grandparent.prefs.docparenthesismatching)
		self.chkdocupdateindentation.SetValue(self.grandparent.prefs.docupdateindentation)
		self.chkdocusefileindentation.SetValue(self.grandparent.prefs.docusefileindentation)
		self.chkWhitespace.SetValue(self.grandparent.prefs.docwhitespaceisvisible)
		self.chkuseindentationguides.SetValue(self.grandparent.prefs.docuseindentationguides)
		self.chkscrollextrapage.SetValue(self.grandparent.prefs.docscrollextrapage)
		self.txtcaretwidth.SetValue(str(self.grandparent.prefs.doccaretwidth))
		self.chkhighlightcurrentline.SetValue(self.grandparent.prefs.dochighlightcurrentline)
		self.raddoccommentmode.SetSelection(self.grandparent.prefs.doccommentmode)

	def Ontxtdoclonglinecol(self, event):
		#Chris McDonough (Edited to allow for negative numbers)
		x = self.txtdoclonglinecol.GetValue()
		if (len(x) < 1):
			return
		try:
			y = int(x)
		except ValueError:
			if not x == "-":
				drScrolledMessageDialog.ShowMessage(self, ("Whatever you are trying to do... Stop it.\nIt won't work.  Actual Numbers only please.\nDrPython will reset to the value last loaded."), "Value Error")
				self.txtdoclonglinecol.SetValue(str(self.grandparent.prefs.doclonglinecol))
				return
			y = 0
		except TypeError:
			drScrolledMessageDialog.ShowMessage(self, ("\"" + y + "\" is not an integer (a number, eg 2, 4, 568)\nDrPython will reset to the value last loaded."), "Type Error")
			self.txtdoclonglinecol.SetValue(str(self.grandparent.prefs.doclonglinecol))
			return
		if (y > 1024):
			drScrolledMessageDialog.ShowMessage(self, ("DrPython does not recommend going this high.  You can of course..."), "Hmmmm")

	def Ontxtcaretwidth(self, event):
		x = self.txtcaretwidth.GetValue()
		if (len(x) < 1):
			return
		try:
			y = int(x)
		except ValueError:
			drScrolledMessageDialog.ShowMessage(self, ("Whatever you are trying to do... Stop it.\nIt won't work.  Positive Numbers only please.\nDrPython will reset to the value last loaded."), "Value Error")
			self.txtcaretwidth.SetValue(str(self.grandparent.prefs.doccaretwidth))
			return
		except TypeError:
			drScrolledMessageDialog.ShowMessage(self, ("\"" + y + "\" is not an integer (a number, eg 2, 4, 568)\nDrPython will reset to the value last loaded."), "Type Error")
			self.txtcaretwidth.SetValue(str(self.grandparent.prefs.doccaretwidth))
			return
		if (y > 256):
			drScrolledMessageDialog.ShowMessage(self, ("DrPython does not recommend going this high.  You can of course..."), "Hmmmm")

	def OnbtnStyle(self, event):
		d = drStyleDialog(self, -1, ("Edit Styles"))
		d.ShowModal()
		if d.ClickedOk():
			self.grandparent.prefs.PythonStyleDictionary, self.grandparent.prefs.CPPStyleDictionary, self.grandparent.prefs.HTMLStyleDictionary = d.GetArrays()
		d.Destroy()

	def OnbtnApplyProperty(self, event):
		d = wx.SingleChoiceDialog(self, "Select the property you wish to apply to all styles:", "Apply Property To All Styles", ["Font", "Size", "Background", "Foreground"], wx.OK|wx.CANCEL)
		answer = d.ShowModal()
		s = d.GetStringSelection()
		d.Destroy()
		if (answer == wx.ID_OK):
			self.SetPropertyForStyleArray(self.grandparent.prefs.PythonStyleDictionary, s)
			self.SetPropertyForStyleArray(self.grandparent.prefs.CPPStyleDictionary, s)
			self.SetPropertyForStyleArray(self.grandparent.prefs.HTMLStyleDictionary, s)

	def SetPropertyForStyleArray(self, targetArray, s):
		#Ignore default text for all, and line number text for bg/fg (first two items)
		x = 2
		if (s == "Font"):
			prop = "face"
			dummy = ",face:terminal"
			x = 1
		elif (s == "Size"):
			prop = "size"
			dummy = ",size:10"
			x = 1
		elif (s == "Background"):
			prop = "back"
			dummy = ",back:#FFFFFF"
		elif (s == "Foreground"):
			prop = "fore"
			dummy = ",fore:#000000"
		newstring = getStyleProperty(prop, targetArray[0])

		#ignore caret foreground, selection, folding style, long line column, current line
		#(last five items).

		l = len(targetArray) - 5

		while (x < l):
			tstring = targetArray[x]
			try:
				tstring.index(prop)
			except:
				tstring = tstring + dummy

			targetArray[x] = setStyleProperty(prop, tstring, newstring)

			x = x + 1

class DocumentationPanel(PrefsPanel):

	def __init__(self, parent, id, name):
		PrefsPanel.__init__(self, parent, id, name, 8)

		self.btnBrowse = wx.Button(self, self.grandparent.ID_DOCUMENTATION_BROWSE, " &Browse ")

		self.btnBrowseP = wx.Button(self, self.grandparent.ID_DOCUMENTATION_BROWSE_P, " &Browse ")
		self.btnBrowseW = wx.Button(self, self.grandparent.ID_DOCUMENTATION_BROWSE_W, " &Browse ")
		self.btnBrowseR = wx.Button(self, self.grandparent.ID_DOCUMENTATION_BROWSE_R, " &Browse ")

		self.txtbrowser = wx.TextCtrl(self, -1, "", wx.Point(225, 215), wx.Size(250, -1))
		self.txtpython = wx.TextCtrl(self, -1, "", wx.Point(225, 215), wx.Size(250, -1))
		self.txtwxwidgets = wx.TextCtrl(self, -1, "", wx.Point(225, 215), wx.Size(250, -1))
		self.txtrehowto = wx.TextCtrl(self, -1, "", wx.Point(225, 215), wx.Size(250, -1))

		self.AddLabel("Browser:")
		self.AddTwoItems(self.txtbrowser, self.btnBrowse)
		self.AddLabel("Python Docs:")
		self.AddTwoItems(self.txtpython,self.btnBrowseP)
		self.AddLabel("WxWidgets Docs:")
		self.AddTwoItems(self.txtwxwidgets,self.btnBrowseW)
		self.AddLabel("Regular Expression Howto:")
		self.AddTwoItems(self.txtrehowto,self.btnBrowseR)
		self.SetPanelSizer()

		self.reset()

		if self.grandparent.prefs.platform_is_windows:
			self.wildcard = "Program File (*.exe)|*.exe|All files (*)|*"
		else:
			self.wildcard = "All files (*)|*"

		self.Bind(wx.EVT_BUTTON,  self.OnbtnBrowse, id=self.grandparent.ID_DOCUMENTATION_BROWSE)
		self.Bind(wx.EVT_BUTTON,  self.OnbtnBrowseDoc, id=self.grandparent.ID_DOCUMENTATION_BROWSE_P)
		self.Bind(wx.EVT_BUTTON,  self.OnbtnBrowseDoc, id=self.grandparent.ID_DOCUMENTATION_BROWSE_W)
		self.Bind(wx.EVT_BUTTON,  self.OnbtnBrowseDoc, id=self.grandparent.ID_DOCUMENTATION_BROWSE_R)

	def reset(self):
		self.txtbrowser.SetValue(self.grandparent.prefs.documentationbrowser)
		self.txtpython.SetValue(self.grandparent.prefs.documentationpythonlocation)
		self.txtwxwidgets.SetValue(self.grandparent.prefs.documentationwxwidgetslocation)
		self.txtrehowto.SetValue(self.grandparent.prefs.documentationrehowtolocation)

	def OnbtnBrowse(self, event):
		dlg = drFileDialog.FileDialog(self.grandparent.parent, "Select A Browser", self.wildcard)
		if (dlg.ShowModal() == wx.ID_OK):
			self.txtbrowser.SetValue(dlg.GetPath())
		dlg.Destroy()

	def OnbtnBrowseDoc(self, event):
		eid = event.GetId()

		result = ""

		dlg = drFileDialog.FileDialog(self.grandparent.parent, "Location of Documentation", self.wildcard)
		if (dlg.ShowModal() == wx.ID_OK):
			result = dlg.GetPath()
		dlg.Destroy()

		if len(result) > 0:
			if eid == self.grandparent.ID_DOCUMENTATION_BROWSE_P:
				self.txtpython.SetValue(result)
			elif eid == self.grandparent.ID_DOCUMENTATION_BROWSE_W:
				self.txtwxwidgets.SetValue(result)
			elif eid == self.grandparent.ID_DOCUMENTATION_BROWSE_R:
				self.txtrehowto.SetValue(result)

class DragAndDropPanel(PrefsPanel):

	def __init__(self, parent, id, name):

		PrefsPanel.__init__(self, parent, id, name, 2)

		self.raddraganddropmode = wx.RadioBox(self, -1, "Drag and Drop Mode:", wx.DefaultPosition, wx.DefaultSize, ["Drag: Files Only, Drop: Files and Text", "Drag: Files and Text, Drop: Files and Text", "Drag and Drop Files Only"], 1, wx.RA_SPECIFY_COLS)
		self.raddraganddroptextmode = wx.RadioBox(self, -1, "Drag and Drop Text Mode:", wx.DefaultPosition, wx.DefaultSize, ["Copy by Default, Cut with Control", "Cut by Default, Copy with Control"], 1, wx.RA_SPECIFY_COLS)

		self.Add(self.raddraganddropmode)
		self.Add(self.raddraganddroptextmode)

		self.SetPanelSizer()

		self.reset()

	def reset(self):
		self.raddraganddropmode.SetSelection(self.grandparent.prefs.draganddropmode)
		self.raddraganddroptextmode.SetSelection(self.grandparent.prefs.draganddroptextmode)

class DrScriptPanel(PrefsPanel):

	def __init__(self, parent, id, name):

		PrefsPanel.__init__(self, parent, id, name, 2)

		self.txtdefaultdirectory = wx.TextCtrl(self, -1, self.grandparent.prefs.drscriptdefaultdirectory,  wx.Point(15, 325), wx.Size(250, -1))
		self.DrScriptbtnBrowse = wx.Button(self, self.grandparent.ID_DRSCRIPT_BROWSE, " &Browse ")
		self.btnDStyle = wx.Button(self, self.grandparent.ID_DRSCRIPT_STYLE, " Edit DrScript Style ")
		self.chkloadexamples = wx.CheckBox(self, -1, "")

		self.Add(self.btnDStyle)
		self.AddLabel("Default Directory:")
		self.AddTwoItems(self.txtdefaultdirectory, self.DrScriptbtnBrowse)
		self.Add(self.chkloadexamples, "Load Example Scripts:")

		self.SetPanelSizer()

		self.reset()

		self.Bind(wx.EVT_BUTTON,  self.OnbtnDBrowse, id=self.grandparent.ID_DRSCRIPT_BROWSE)
		self.Bind(wx.EVT_BUTTON,  self.OnbtnDStyle, id=self.grandparent.ID_DRSCRIPT_STYLE)

	def reset(self):
		self.txtdefaultdirectory.SetValue(self.grandparent.prefs.drscriptdefaultdirectory)
		self.chkloadexamples.SetValue(self.grandparent.prefs.drscriptloadexamples)

	def OnbtnDBrowse(self, event):
		d = wx.DirDialog(self, "Select Default Directory For DrScript:", style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON|wx.MAXIMIZE_BOX|wx.THICK_FRAME)
		if d.ShowModal() == wx.ID_OK:
			self.txtdefaultdirectory.SetValue(d.GetPath())
		d.Destroy()

	def OnbtnDStyle(self, event):
		d = drSimpleStyleDialog(self, -1, ("Style: DrScript"), self.grandparent.prefs.drscriptstyle, self.grandparent.prefs.drscriptstyle)

		d.ShowModal()
		if (d.ClickedOk()):
			self.grandparent.prefs.drscriptstyle = d.GetStyleString()
		d.Destroy()

class FileDialogPanel(PrefsPanel):

	def __init__(self, parent, id, name):

		PrefsPanel.__init__(self, parent, id, name, 2)

		self.chkusewxfiledialog = wx.CheckBox(self, -1, "")
		self.chkdefaultextension = wx.CheckBox(self, -1, "")
		self.btnwildcard = wx.Button(self, self.grandparent.ID_BTN_WILDCARD, ' Edit Wildcard ')
		self.btnlnkreplacetable = wx.Button(self, self.grandparent.ID_BTN_LNK_REPLACE_TABLE, ' Windows Shortcut Replace Table ')

		self.Add(self.chkdefaultextension, 'Default Extension (".py"):')
		self.Add(self.chkusewxfiledialog, "Use wx.FileDialog:")
		self.Add(self.btnwildcard)
		self.Add(self.btnlnkreplacetable)

		self.SetPanelSizer()

		self.reset()

		self.Bind(wx.EVT_BUTTON, self.OnEditWildcard, id=self.grandparent.ID_BTN_WILDCARD)
		self.Bind(wx.EVT_BUTTON, self.OnReplaceTable, id=self.grandparent.ID_BTN_LNK_REPLACE_TABLE)

	def reset(self):
		self.chkusewxfiledialog.SetValue(self.grandparent.prefs.usewxfiledialog)
		self.chkdefaultextension.SetValue(self.grandparent.prefs.defaultextension)

	def OnEditWildcard(self, event):
		import drFileDialogPrefs
		d = drFileDialogPrefs.drFilePrefsDialog(self)
		answer = d.ShowModal()
		newwc = d.GetWildcard()
		cwc = d.GetConstantWildcard()
		d.Destroy()

		if answer == wx.ID_OK:
			self.grandparent.prefs.wildcard = newwc
			self.grandparent.prefs.constantwildcard = cwc

	def OnReplaceTable(self, event):
		import drFileDialogPrefs
		d = drFileDialogPrefs.drReplaceTableDialog(self)
		answer = d.ShowModal()
		newrt = d.GetReplaceTable()
		d.Destroy()

		if answer == wx.ID_OK:
			self.grandparent.prefs.windowsshortcutreplacetable = newrt

class FileTypesPanel(PrefsPanel):

	def __init__(self, parent, id, name):

		PrefsPanel.__init__(self, parent, id, name, 7)

		self.ID_FILETYPE = 701
		self.ID_EXTENSIONS = 702
		self.ID_USETABS = 703
		self.ID_TABWIDTH = 704
		self.ID_FOLDING = 705
		self.ID_EOLMODE = 706
		self.ID_COMMENTSTRING = 707
		self.ID_WORDWRAP = 708

		self.cboFileType = wx.ComboBox(self, self.ID_FILETYPE, choices=['Python', 'C/C++', 'HTML', 'Text'])

		self.filetype = self.drframe.txtDocument.filetype

		self.txtExtensions = wx.TextCtrl(self, self.ID_EXTENSIONS, '', wx.Point(225, 215), wx.Size(225, -1))

		self.chkdocusetabs = wx.CheckBox(self, self.ID_USETABS, "")
		self.chkdocwordwrap = wx.CheckBox(self, self.ID_WORDWRAP, "")
		self.chkfolding = wx.CheckBox(self, self.ID_FOLDING, "")
		self.txtdoccommentstring = wx.TextCtrl(self, self.ID_COMMENTSTRING, '', wx.Point(225, 215), wx.Size(35, -1))
		self.txttabwidth = wx.TextCtrl(self, self.ID_TABWIDTH, '', wx.Point(225, 215), wx.Size(35, -1))
		self.radFormat = wx.Choice(self, self.ID_EOLMODE, wx.Point(15, 80), wx.DefaultSize, [" Unix ('\\n')  "," DOS/Windows ('\\r\\n')  "," Mac ('\\r')  "])

		self.Add(self.cboFileType, "File Type:")
		self.Add(self.txtExtensions, "Extensions:")
		self.Add(self.txtdoccommentstring, "Comment String:")
		self.Add(self.txttabwidth, "Tab Width:")
		self.Add(self.chkdocusetabs, "Use Tabs:")
		self.Add(self.chkfolding, "Folding:")
		self.Add(self.chkdocwordwrap, "Word Wrap:")
		self.Add(self.radFormat, "Line Ending Format:")

		self.SetPanelSizer()

		self.Bind(wx.EVT_COMBOBOX, self.OnFileType, id=self.ID_FILETYPE)
		self.Bind(wx.EVT_TEXT, self.Ontxttabwidth, id=self.ID_TABWIDTH)
		self.Bind(wx.EVT_TEXT, self.OnExtensions, id=self.ID_EXTENSIONS)
		self.Bind(wx.EVT_TEXT, self.OnCommentString, id=self.ID_COMMENTSTRING)
		self.Bind(wx.EVT_CHECKBOX, self.OnUseTabs, id=self.ID_USETABS)
		self.Bind(wx.EVT_CHECKBOX, self.OnFolding, id=self.ID_FOLDING)
		self.Bind(wx.EVT_CHECKBOX, self.OnWordWrap, id=self.ID_WORDWRAP)
		self.Bind(wx.EVT_CHOICE, self.OnEolMode, id=self.ID_EOLMODE)

		self.cboFileType.SetSelection(self.filetype)

		self.reset()

	def reset(self):
		self.extensions = self.grandparent.prefs.extensions.copy()
		self.docusetabs = self.grandparent.prefs.docusetabs.copy()
		self.doctabwidth = self.grandparent.prefs.doctabwidth.copy()
		self.doceolmode = self.grandparent.prefs.doceolmode.copy()
		self.docfolding = self.grandparent.prefs.docfolding.copy()
		self.doccommentstring = self.grandparent.prefs.doccommentstring.copy()
		self.docwordwrap = self.grandparent.prefs.docwordwrap.copy()

		self.OnFileType(None)

	def OnCommentString(self, event):
		self.doccommentstring[self.filetype] = self.txtdoccommentstring.GetValue()

	def OnEolMode(self, event):
		self.doceolmode[self.filetype] = self.radFormat.GetSelection()

	def OnExtensions(self, event):
		self.extensions[self.filetype] = self.txtExtensions.GetValue()

	def OnFileType(self, event):
		self.filetype = self.cboFileType.GetSelection()

		self.txtExtensions.SetValue(self.extensions[self.filetype])
		self.chkdocusetabs.SetValue(self.docusetabs[self.filetype])
		self.txttabwidth.SetValue(str(self.doctabwidth[self.filetype]))
		self.radFormat.SetSelection(self.doceolmode[self.filetype])
		self.chkfolding.SetValue(self.docfolding[self.filetype])
		self.txtdoccommentstring.SetValue(self.doccommentstring[self.filetype])
		self.chkdocwordwrap.SetValue(self.docwordwrap[self.filetype])

	def OnFolding(self, event):
		self.docfolding[self.filetype] = int(self.chkfolding.GetValue())

	def Ontxttabwidth(self, event):
		x = self.txttabwidth.GetValue()
		if (len(x) < 1):
			return
		try:
			y = int(x)
		except ValueError:
			drScrolledMessageDialog.ShowMessage(self, ("Whatever you are trying to do... Stop it.\nIt won't work.  Positive Numbers only please.\nDrPython will reset to the value last loaded."), "Value Error")
			self.txttabwidth.SetValue(str(self.grandparent.prefs.doctabwidth[self.filetype]))
			return
		except TypeError:
			drScrolledMessageDialog.ShowMessage(self, ("\"" + y + "\" is not an integer (a number, eg 2, 4, 568)\nDrPython will reset to the value last loaded."), "Type Error")
			self.txttabwidth.SetValue(str(self.grandparent.prefs.doctabwidth[self.filetype]))
			return
		if (y > 1024):
			drScrolledMessageDialog.ShowMessage(self, ("DrPython does not recommend going this high.  You can of course..."), "Hmmmm")
			return
		self.doctabwidth[self.filetype] = y

	def OnWordWrap(self, event):
		self.docwordwrap[self.filetype] = int(self.chkdocwordwrap.GetValue())

	def OnUseTabs(self, event):
		self.docusetabs[self.filetype] = int(self.chkdocusetabs.GetValue())


class FindReplacePanel(PrefsPanel):

	def __init__(self, parent, id, name):
		PrefsPanel.__init__(self, parent, id, name, 8)

		self.chkregularexpression = wx.CheckBox(self, -1, "")
		self.chkmatchcase = wx.CheckBox(self, -1, "")
		self.chkfindbackwards = wx.CheckBox(self, -1, "")
		self.chkwholeword = wx.CheckBox(self, -1, "")
		self.chkinselection = wx.CheckBox(self, -1, "")
		self.chkfromcursor = wx.CheckBox(self, -1, "")
		self.chkpromptonreplace = wx.CheckBox(self, -1, "")
		self.chkfindreplaceautowrap = wx.CheckBox(self, -1, "")
		self.chkundercursor = wx.CheckBox(self, -1, "")

		self.Add(self.chkregularexpression, "Regular Expression:")
		self.Add(self.chkmatchcase, "Match Case:")
		self.Add(self.chkfindbackwards, "Find Backwards:")
		self.Add(self.chkwholeword, "Whole Word:")
		self.Add(self.chkinselection, "In Selection:")
		self.Add(self.chkfromcursor, "From Cursor:")
		self.Add(self.chkpromptonreplace, "Prompt On Replace:")
		self.Add(self.chkfindreplaceautowrap, "Auto Wrap:")
		self.Add(self.chkundercursor, "Under Cursor:")

		self.SetPanelSizer()

		self.reset()

	def reset(self):

		self.chkregularexpression.SetValue(self.grandparent.prefs.findreplaceregularexpression)
		self.chkmatchcase.SetValue(self.grandparent.prefs.findreplacematchcase)
		self.chkfindbackwards.SetValue(self.grandparent.prefs.findreplacefindbackwards)
		self.chkwholeword.SetValue(self.grandparent.prefs.findreplacewholeword)
		self.chkinselection.SetValue(self.grandparent.prefs.findreplaceinselection)
		self.chkfromcursor.SetValue(self.grandparent.prefs.findreplacefromcursor)
		self.chkpromptonreplace.SetValue(self.grandparent.prefs.findreplacepromptonreplace)
		self.chkfindreplaceautowrap.SetValue(self.grandparent.prefs.findreplaceautowrap)
		self.chkundercursor.SetValue(self.grandparent.prefs.findreplaceundercursor)

class GeneralPanel(PrefsPanel):

	def __init__(self, parent, id, name):
		PrefsPanel.__init__(self, parent, id, name, 8)

		try:
			defaultlocale = locale.getdefaultlocale()[1]
		except:
			defaultlocale = None
		if defaultlocale is not None:
			self.encodings = ['', defaultlocale, 'ascii', 'latin-1', 'utf-8', 'utf-16']
		else:
			self.encodings = ['', 'ascii', 'latin-1', 'utf-8', 'utf-16']

		self.chkrememberwindowsizeandposition = wx.CheckBox(self, -1, "")
		self.chkrememberdialogsizesandpositions = wx.CheckBox(self, -1, "")
		self.chkrememberpanelsizes = wx.CheckBox(self, -1, "")
		self.chkautodetectencoding = wx.CheckBox(self, -1, "")
		self.cboEncoding = wx.ComboBox(self, -1, choices=self.encodings)
		self.chksaveonrun = wx.CheckBox(self, -1, "")
		self.chkchecksyntaxonsave = wx.CheckBox(self, -1, "")
		self.txtchecksyntaxextensions = wx.TextCtrl(self, -1, self.grandparent.prefs.checksyntaxextensions, size=wx.Size(55, -1))
		self.chkpromptonsaveall = wx.CheckBox(self, -1, "")
		self.chkdoubleclicktoclosetab = wx.CheckBox(self, -1, "")
		self.boxiconsize = wx.Choice(self, self.grandparent.ID_ICON_SIZE, wx.Point(225, 135), wx.Size(-1, -1), ["0", "16", "24"])
		self.txtRecentFiles = wx.TextCtrl(self, self.grandparent.ID_TXT_RECENT_FILES, str(self.grandparent.prefs.recentfileslimit), wx.Point(225, 175), wx.Size(35, -1))
		self.chkcheckindentation = wx.CheckBox(self, -1, "")
		self.txtpythonargs = wx.TextCtrl(self, -1, self.grandparent.prefs.pythonargs, wx.Point(225, 255), wx.Size(55, -1))
		self.chkenablefeedback = wx.CheckBox(self, -1, "")
		self.chkalwayspromptonexit = wx.CheckBox(self, -1, "")
		self.chkbackupfileonsave = wx.CheckBox(self, -1, "")
		self.chkCheckFormat = wx.CheckBox(self, -1, "")
		self.chkvieweol = wx.CheckBox(self, -1, "")


		self.txtdefaultdirectory = wx.TextCtrl(self, -1, self.grandparent.prefs.defaultdirectory,  wx.Point(15, 325), wx.Size(250, -1))
		self.btnBrowse = wx.Button(self, self.grandparent.ID_FILE_BROWSE, " &Browse ")

		self.btnSetup = wx.Button(self, self.grandparent.ID_SETUP_PREFS, " Setup Preferences ")

		self.Add(self.chkrememberwindowsizeandposition, "Remember Window Size And Position:")
		self.Add(self.chkrememberdialogsizesandpositions, "Remember Dialog Sizes and Positions:")
		self.Add(self.chkrememberpanelsizes, "Remember Panel Sizes:")
		self.Add(self.chkautodetectencoding, "Auto Detect Encoding:")
		self.Add(self.cboEncoding, "Default Encoding")
		self.Add(self.chksaveonrun, "Save On Run:")
		self.Add(self.chkchecksyntaxonsave, "Check Syntax On Save:")
		self.Add(self.txtchecksyntaxextensions, "Check Syntax:  Only On Extensions:")
		self.Add(self.chkpromptonsaveall, "Prompt On Save All:")
		self.Add(self.chkdoubleclicktoclosetab, "Double Click To Close Tab:")
		self.Add(self.txtRecentFiles, "Max number of recent files:")
		self.Add(self.chkvieweol, "View Line Endings With Whitespace:")
		self.Add(self.chkCheckFormat, "Check Line Ending Format on Open:")
		self.Add(self.chkcheckindentation, "Check Indentation Type on Open:")
		self.Add(self.txtpythonargs, "Python arguments (eg \"-i\"):")
		self.Add(self.boxiconsize, "Toolbar Icon Size:")
		self.AddBuffer()
		self.AddLabel("Default Directory:")
		self.AddTwoItems(self.txtdefaultdirectory, self.btnBrowse)
		self.AddBuffer()
		self.Add(self.chkenablefeedback, "Enable Feedback Messages:")
		self.Add(self.chkalwayspromptonexit, "Always Prompt On Exit:")
		self.Add(self.chkbackupfileonsave, "Backup File On Save:")
		self.Add(self.btnSetup)

		self.SetPanelSizer()

		self.reset()

		self.Bind(wx.EVT_BUTTON,  self.OnbtnBrowse, id=self.grandparent.ID_FILE_BROWSE)
		self.Bind(wx.EVT_TEXT,  self.OntxtRecentFiles, id=self.grandparent.ID_TXT_RECENT_FILES)
		self.Bind(wx.EVT_BUTTON,  self.OnbtnSetupPrefs, id=self.grandparent.ID_SETUP_PREFS)

	def reset(self):
		self.txtdefaultdirectory.SetValue(self.grandparent.prefs.defaultdirectory)
		self.chkrememberwindowsizeandposition.SetValue(self.grandparent.prefs.rememberwindowsizeandposition)
		self.chkrememberdialogsizesandpositions.SetValue(self.grandparent.prefs.rememberdialogsizesandpositions)
		self.chkrememberpanelsizes.SetValue(self.grandparent.prefs.rememberpanelsizes)
		self.chkautodetectencoding.SetValue(self.grandparent.prefs.autodetectencoding)
		self.chksaveonrun.SetValue(self.grandparent.prefs.saveonrun)
		self.chkchecksyntaxonsave.SetValue(self.grandparent.prefs.checksyntaxonsave)
		self.txtchecksyntaxextensions.SetValue(self.grandparent.prefs.checksyntaxextensions)
		self.chkpromptonsaveall.SetValue(self.grandparent.prefs.promptonsaveall)
		self.chkdoubleclicktoclosetab.SetValue(self.grandparent.prefs.doubleclicktoclosetab)
		self.txtRecentFiles.SetValue(str(self.grandparent.prefs.recentfileslimit))

		if self.grandparent.prefs.defaultencoding not in self.encodings:
			self.encodings.append(self.grandparent.prefs.defaultencoding)
			self.cboEncoding.Append(self.grandparent.prefs.defaultencoding)
		self.cboEncoding.SetSelection(self.encodings.index(self.grandparent.prefs.defaultencoding))

		self.chkcheckindentation.SetValue(self.grandparent.prefs.checkindentation)

		if (self.grandparent.prefs.iconsize == 24):
			self.boxiconsize.SetSelection(2)
		elif (self.grandparent.prefs.iconsize == 16):
			self.boxiconsize.SetSelection(1)
		else:
			self.boxiconsize.SetSelection(0)

		self.txtpythonargs.SetValue(self.grandparent.prefs.pythonargs)
		self.chkenablefeedback.SetValue(self.grandparent.prefs.enablefeedback)
		self.chkalwayspromptonexit.SetValue(self.grandparent.prefs.alwayspromptonexit)
		self.chkbackupfileonsave.SetValue(self.grandparent.prefs.backupfileonsave)

		self.chkvieweol.SetValue(self.grandparent.prefs.vieweol)

		self.chkCheckFormat.SetValue(self.grandparent.prefs.checkeol)

	def OnbtnBrowse(self, event):
		d = wx.DirDialog(self, "Select Default Directory:", style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON|wx.MAXIMIZE_BOX|wx.THICK_FRAME)
		if d.ShowModal() == wx.ID_OK:
			self.txtdefaultdirectory.SetValue(d.GetPath())
		d.Destroy()

	def OnbtnSetupPrefs(self, event):
		from drSetupPreferences import drSetupPreferencesDialog
		d = drSetupPreferencesDialog(self)
		d.ShowModal()
		d.Destroy()

	def OntxtRecentFiles(self, event):
		x = self.txtRecentFiles.GetValue()
		if (len(x) < 1):
			return
		try:
			y = int(x)
		except ValueError:
			drScrolledMessageDialog.ShowMessage(self, ("Whatever you are trying to do... Stop it.\nIt won't work.  Positive Numbers only please.\nDrPython will reset to the value last loaded."), "Value Error")
			self.txtRecentFiles.SetValue(str(self.grandparent.prefs.recentfileslimit))
			return
		except TypeError:
			drScrolledMessageDialog.ShowMessage(self, ("\"" + y + "\" is not an integer (a number, eg 2, 4, 568)\nDrPython will reset to the value last loaded."), "Type Error")
			self.txtRecentFiles.SetValue(str(self.grandparent.prefs.recentfileslimit))
			return
		if (y > 25):
			drScrolledMessageDialog.ShowMessage(self, ("DrPython does not recommend going this high.  You can of course..."), "Hmmmm")

class PluginsPanel(PrefsPanel):

	def __init__(self, parent, id, name):
		PrefsPanel.__init__(self, parent, id, name, 1)

		self.txtdefaultdirectory = wx.TextCtrl(self, -1, self.grandparent.prefs.pluginsdefaultdirectory,  wx.Point(15, 325), wx.Size(250, -1))
		self.PluginsbtnBrowse = wx.Button(self, self.grandparent.ID_PLUGINS_BROWSE, " &Browse ")

		self.AddLabel("Default Directory:")
		self.AddTwoItems(self.txtdefaultdirectory, self.PluginsbtnBrowse)

		self.SetPanelSizer()

		self.reset()

		self.Bind(wx.EVT_BUTTON,  self.OnbtnPBrowse, id=self.grandparent.ID_PLUGINS_BROWSE)

	def reset(self):
		self.txtdefaultdirectory.SetValue(self.grandparent.prefs.pluginsdefaultdirectory)

	def OnbtnPBrowse(self, event):
		d = wx.DirDialog(self, "Select Default Directory For Plugins:", style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON|wx.MAXIMIZE_BOX|wx.THICK_FRAME)
		if d.ShowModal() == wx.ID_OK:
			self.txtdefaultdirectory.SetValue(d.GetPath())
		d.Destroy()

class PrintPanel(PrefsPanel):

	def __init__(self, parent, id, name):
		PrefsPanel.__init__(self, parent, id, name, 3)

		self.chkdoclinenumbers = wx.CheckBox(self, -1, "")
		self.chkpromptlinenumbers = wx.CheckBox(self, -1, "")
		self.txttabwidth = wx.TextCtrl(self, self.grandparent.ID_PRINT_TAB_WIDTH, str(self.grandparent.prefs.printtabwidth), wx.Point(225, 215), wx.Size(35, -1))

		self.Add(self.chkdoclinenumbers, "Document Line Numbers:")
		self.Add(self.chkpromptlinenumbers, "Prompt Line Numbers:")
		self.Add(self.txttabwidth, "Tab Width:")

		self.SetPanelSizer()

		self.reset()

		self.Bind(wx.EVT_TEXT,  self.Ontxttabwidth, id=self.grandparent.ID_PRINT_TAB_WIDTH)

	def reset(self):
		self.chkdoclinenumbers.SetValue(self.grandparent.prefs.printdoclinenumbers)
		self.chkpromptlinenumbers.SetValue(self.grandparent.prefs.printpromptlinenumbers)
		self.txttabwidth.SetValue(str(self.grandparent.prefs.printtabwidth))

	def Ontxttabwidth(self, event):
		x = self.txttabwidth.GetValue()
		if (len(x) < 1):
			return
		try:
			y = int(x)
		except ValueError:
			drScrolledMessageDialog.ShowMessage(self, ("Whatever you are trying to do... Stop it.\nIt won't work.  Positive Numbers only please.\nDrPython will reset to the value last loaded."), "Value Error")
			self.txttabwidth.SetValue(str(self.grandparent.prefs.printtabwidth))
			return
		except TypeError:
			drScrolledMessageDialog.ShowMessage(self, ("\"" + y + "\" is not an integer (a number, eg 2, 4, 568)\nDrPython will reset to the value last loaded."), "Type Error")
			self.txttabwidth.SetValue(str(self.grandparent.prefs.printtabwidth))
			return
		if (y > 32):
			drScrolledMessageDialog.ShowMessage(self, ("DrPython does not recommend going this high.  You can of course..."), "Hmmmm")

class PromptPanel(PrefsPanel):

	def __init__(self, parent, id, name):
		PrefsPanel.__init__(self, parent, id, name, 8)

		self.ID_TABWIDTH = 750

		self.radusestyles = wx.RadioBox(self, -1, "Styles:", wx.DefaultPosition, wx.DefaultSize, ["Don't Use Styles", "Use Styles", "Only Use \"Normal\", \"Caret Foreground\""], 1, wx.RA_SPECIFY_COLS)
		self.btnStyle = wx.Button(self, self.grandparent.ID_PROMPT_STYLE, " Edit Text Styles ")
		self.btnApplyProperty = wx.Button(self, self.grandparent.ID_PROMPT_APPLY_PROPERTY, " Apply Text Property To All Styles ")
		self.txtmarginwidth = wx.TextCtrl(self, self.grandparent.ID_PROMPT_MARGIN_WIDTH, str(self.grandparent.prefs.promptmarginwidth), wx.Point(225, 215), wx.Size(35, -1))
		self.chkVisible = wx.CheckBox(self, -1, "")
		self.chkpromptusetabs = wx.CheckBox(self, -1, "")
		self.chkwordwrap = wx.CheckBox(self, -1, "")
		self.txtcaretwidth = wx.TextCtrl(self, self.grandparent.ID_PROMPT_CARET_WIDTH, str(self.grandparent.prefs.promptcaretwidth), wx.Point(225, 215), wx.Size(35, -1))
		self.chkWhitespace = wx.CheckBox(self, -1, "")
		self.chkscrollextrapage = wx.CheckBox(self, -1, "")
		self.sldrSize =  wx.Slider(self, -1, self.grandparent.prefs.promptsize, 25, 100, wx.Point(150, 55), wx.Size(75, -1), wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS )
		self.sldrSize.SetTickFreq(25, 1)
		self.txttabwidth = wx.TextCtrl(self, self.ID_TABWIDTH, '', wx.Point(225, 215), wx.Size(35, -1))
		self.radFormat = wx.Choice(self, -1, wx.Point(15, 80), wx.DefaultSize, [" Unix ('\\n')  "," DOS/Windows ('\\r\\n')  "," Mac ('\\r')  "])
		self.txtStartupScript = wx.TextCtrl(self, -1, self.grandparent.prefs.promptstartupscript, wx.Point(225, 215), wx.Size(250, 150), wx.TE_MULTILINE)

		self.Add(self.btnStyle)
		self.Add(self.btnApplyProperty)
		self.Add(self.radusestyles)
		self.Add(self.txtmarginwidth, "Line Number Margin Width:")
		self.Add(self.chkVisible, "Visible By Default:")
		self.Add(self.txttabwidth, "Tab Width:")
		self.Add(self.chkpromptusetabs, "Use Tabs:")
		self.Add(self.radFormat, "Line Ending Format:")
		self.Add(self.chkwordwrap, "Word Wrap:")
		self.Add(self.txtcaretwidth, "Caret Width:")
		self.Add(self.chkWhitespace, "Whitespace is Visible on Startup:")
		self.Add(self.chkscrollextrapage, "Scroll Extra Page:")
		self.Add(self.sldrSize, "Vertical Size:")
		self.AddLabel("Startup Script:")
		self.Add(self.txtStartupScript)

		self.SetPanelSizer()

		self.reset()

		self.Bind(wx.EVT_BUTTON, self.OnbtnStyle, id=self.grandparent.ID_PROMPT_STYLE)
		self.Bind(wx.EVT_BUTTON, self.OnbtnApplyProperty, id=self.grandparent.ID_PROMPT_APPLY_PROPERTY)
		self.Bind(wx.EVT_TEXT,  self.Ontxtmarginwidth, id=self.grandparent.ID_PROMPT_MARGIN_WIDTH)
		self.Bind(wx.EVT_TEXT, self.Ontxtcaretwidth, id=self.grandparent.ID_PROMPT_CARET_WIDTH)

		self.Bind(wx.EVT_TEXT, self.Ontxttabwidth, id=self.ID_TABWIDTH)

	def reset(self):

		self.txttabwidth.SetValue(str(self.grandparent.prefs.prompttabwidth))
		self.radFormat.SetSelection(self.grandparent.prefs.prompteolmode)
		self.radusestyles.SetSelection(self.grandparent.prefs.promptusestyles)
		self.txtmarginwidth.SetValue(str(self.grandparent.prefs.promptmarginwidth))
		self.chkVisible.SetValue(self.grandparent.prefs.promptisvisible)
		self.chkpromptusetabs.SetValue(self.grandparent.prefs.promptusetabs)
		self.chkwordwrap.SetValue(self.grandparent.prefs.promptwordwrap)
		self.txtcaretwidth.SetValue(str(self.grandparent.prefs.promptcaretwidth))
		self.chkWhitespace.SetValue(self.grandparent.prefs.promptwhitespaceisvisible)
		self.sldrSize.SetValue(self.grandparent.prefs.promptsize)
		self.chkscrollextrapage.SetValue(self.grandparent.prefs.promptscrollextrapage)
		self.txtStartupScript.SetValue(self.grandparent.prefs.promptstartupscript)

	def OnbtnStyle(self, event):
		d = drStyleDialog(self, -1, ("Edit Prompt Styles"), True)
		d.ShowModal()
		if d.ClickedOk():
			self.grandparent.prefs.txtPromptStyleDictionary = d.GetArrays()
		d.Destroy()

	def OnbtnApplyProperty(self, event):
		d = wx.SingleChoiceDialog(self, "Select the property you wish to apply to all styles:", "Apply Property To All Styles", ["Font", "Size", "Background", "Foreground"], wx.OK|wx.CANCEL)
		answer = d.ShowModal()
		s = d.GetStringSelection()
		d.Destroy()
		if (answer == wx.ID_OK):
			if (s == "Font"):
				prop = "face"
				dummy = ",face:terminal"
			elif (s == "Size"):
				prop = "size"
				dummy = ",size:10"
			elif (s == "Background"):
				prop = "back"
				dummy = ",back:#000000"
			elif (s == "Foreground"):
				prop = "fore"
				dummy = ",fore:#FFFFFF"
			l = len(self.grandparent.prefs.txtPromptStyleDictionary) - 3
			#ignore caret foreground, selections
			x = 2
			#Ignore default text, and line number text (0, and 1)
			bstring = getStyleProperty(prop, self.grandparent.prefs.txtPromptStyleDictionary[0])
			while (x < l):
				tstring = self.grandparent.prefs.txtPromptStyleDictionary[x]
				#self.grandparent.prefs.txtPromptStyleDictionary.pop(x)
				try:
					tstring.index(prop)
				except:
					tstring = tstring + dummy
				self.grandparent.prefs.txtPromptStyleDictionary[x] = setStyleProperty(prop, tstring, bstring)
				x = x + 1

	def Ontxtcaretwidth(self, event):
		x = self.txtcaretwidth.GetValue()
		if (len(x) < 1):
			return
		try:
			y = int(x)
		except ValueError:
			drScrolledMessageDialog.ShowMessage(self, ("Whatever you are trying to do... Stop it.\nIt won't work.  Positive Numbers only please.\nDrPython will reset to the value last loaded."), "Value Error")
			self.txtcaretwidth.SetValue(str(self.grandparent.prefs.promptcaretwidth))
			return
		except TypeError:
			drScrolledMessageDialog.ShowMessage(self, ("\"" + y + "\" is not an integer (a number, eg 2, 4, 568)\nDrPython will reset to the value last loaded."), "Type Error")
			self.txtcaretwidth.SetValue(str(self.grandparent.prefs.promptcaretwidth))
			return
		if (y > 256):
			drScrolledMessageDialog.ShowMessage(self, ("DrPython does not recommend going this high.  You can of course..."), "Hmmmm")

	def Ontxtmarginwidth(self, event):
		x = self.txtmarginwidth.GetValue()
		if (len(x) < 1):
			return
		try:
			y = int(x)
		except ValueError:
			drScrolledMessageDialog.ShowMessage(self, ("Whatever you are trying to do... Stop it.\nIt won't work.  Positive Numbers only please.\nDrPython will reset to the value last loaded."), "Value Error")
			self.txtmarginwidth.SetValue(str(self.grandparent.prefs.promptmarginwidth))
			return
		except TypeError:
			drScrolledMessageDialog.ShowMessage(self, ("\"" + y + "\" is not an integer (a number, eg 2, 4, 568)\nDrPython will reset to the value last loaded."), "Type Error")
			self.txtmarginwidth.SetValue(str(self.grandparent.prefs.promptmarginwidth))
			return
		if (y > 1024):
			drScrolledMessageDialog.ShowMessage(self, ("DrPython does not recommend going this high.  You can of course..."), "Hmmmm")

	def Ontxttabwidth(self, event):
		x = self.txttabwidth.GetValue()
		if (len(x) < 1):
			return
		try:
			y = int(x)
		except ValueError:
			drScrolledMessageDialog.ShowMessage(self, ("Whatever you are trying to do... Stop it.\nIt won't work.  Positive Numbers only please.\nDrPython will reset to the value last loaded."), "Value Error")
			self.txttabwidth.SetValue(str(self.grandparent.prefs.prompttabwidth))
			return
		except TypeError:
			drScrolledMessageDialog.ShowMessage(self, ("\"" + y + "\" is not an integer (a number, eg 2, 4, 568)\nDrPython will reset to the value last loaded."), "Type Error")
			self.txttabwidth.SetValue(str(self.grandparent.prefs.prompttabwidth))
			return
		if (y > 1024):
			drScrolledMessageDialog.ShowMessage(self, ("DrPython does not recommend going this high.  You can of course..."), "Hmmmm")

class SidePanelPanel(PrefsPanel):

	def __init__(self, parent, id, name):
		PrefsPanel.__init__(self, parent, id, name, 4)

		self.sldrSizeLeft =  wx.Slider(self, -1, self.grandparent.prefs.sidepanelleftsize, 15, 100, wx.Point(150, 55), wx.Size(75, -1), wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS )
		self.sldrSizeLeft.SetTickFreq(25, 1)

		self.sldrSizeRight =  wx.Slider(self, -1, self.grandparent.prefs.sidepanelrightsize, 15, 100, wx.Point(150, 55), wx.Size(75, -1), wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS )
		self.sldrSizeRight.SetTickFreq(25, 1)

		self.sldrSizeTop =  wx.Slider(self, -1, self.grandparent.prefs.sidepaneltopsize, 15, 100, wx.Point(150, 55), wx.Size(75, -1), wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS )
		self.sldrSizeTop.SetTickFreq(25, 1)

		self.Add(self.sldrSizeLeft, "Left Panel Size:")
		self.Add(self.sldrSizeRight, "Right Panel Size:")
		self.Add(self.sldrSizeTop, "Top Panel Size:")

		self.SetPanelSizer()

		self.reset()

	def reset(self):

		self.sldrSizeLeft.SetValue(self.grandparent.prefs.sidepanelleftsize)
		self.sldrSizeRight.SetValue(self.grandparent.prefs.sidepanelrightsize)
		self.sldrSizeTop.SetValue(self.grandparent.prefs.sidepaneltopsize)

class SourceBrowserPanel(PrefsPanel):

	def __init__(self, parent, id, name):
		PrefsPanel.__init__(self, parent, id, name, 4)

		self.btnCStyle = wx.Button(self, self.grandparent.ID_CLASS_BROWSER_STYLE, " Edit Source Browser Style ")
		self.positionchooser = wx.RadioBox(self, -1, "", wx.DefaultPosition, wx.DefaultSize, ['Left', 'Right', 'Top'], 3, wx.RA_SPECIFY_COLS | wx.NO_BORDER)
		self.sldrSize =  wx.Slider(self, -1, self.grandparent.prefs.sourcebrowsersize, 25, 100, wx.Point(150, 55), wx.Size(75, -1), wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS )
		self.sldrSize.SetTickFreq(25, 1)
		self.chkIsVisible = wx.CheckBox(self, -1, "")
		self.chkcloseonactivate = wx.CheckBox(self, -1, "")
		self.chkissorted = wx.CheckBox(self, -1, "")
		self.chkautorefreshonsave = wx.CheckBox(self, -1, "")
		self.chkautorefresh = wx.CheckBox(self, -1, "")

		self.Add(self.btnCStyle)
		self.AddLabel("")
		self.AddLabel("Panel Position:")
		self.Add(self.positionchooser)
		self.Add(self.sldrSize, "Panel Size:")
		self.Add(self.chkIsVisible, "Visible By Default:")
		self.Add(self.chkcloseonactivate, "Close On Activate:")
		self.Add(self.chkissorted, "Sorted (Alphabetical):")
		self.Add(self.chkautorefreshonsave, "Auto Refresh On Save:")
		self.Add(self.chkautorefresh, "Auto Refresh:")

		self.SetPanelSizer()

		self.reset()

		self.Bind(wx.EVT_BUTTON, self.OnbtnCStyle, id=self.grandparent.ID_CLASS_BROWSER_STYLE)

	def reset(self):
		self.positionchooser.SetSelection(self.grandparent.prefs.sourcebrowserpanel)
		self.sldrSize.SetValue(self.grandparent.prefs.sourcebrowsersize)
		self.chkIsVisible.SetValue(self.grandparent.prefs.sourcebrowserisvisible)
		self.chkcloseonactivate.SetValue(self.grandparent.prefs.sourcebrowsercloseonactivate)
		self.chkissorted.SetValue(self.grandparent.prefs.sourcebrowserissorted)
		self.chkautorefreshonsave.SetValue(self.grandparent.prefs.sourcebrowserautorefreshonsave)
		self.chkautorefresh.SetValue(self.grandparent.prefs.sourcebrowserautorefresh)

	def OnbtnCStyle(self, event):
		d = drSimpleStyleDialog(self, -1, ("Style: Source Browser"), self.grandparent.prefs.sourcebrowserstyle, self.grandparent.prefs.sourcebrowserstyle)

		d.ShowModal()
		if (d.ClickedOk()):
			self.grandparent.prefs.sourcebrowserstyle = d.GetStyleString()

		d.Destroy()

class drPrefsDialog(wx.Dialog):

	def __init__(self, parent, id, title):

		wx.Dialog.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(640, 480), wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.THICK_FRAME | wx.RESIZE_BORDER)

		self.parent = parent

		self.ID_PAGES = 100
		self.ID_CLOSE = 101
		self.ID_RESET = 102
		self.ID_UPDATE = 103
		self.ID_SAVE = 104
		self.ID_HELP = 105
		self.ID_FILE_BROWSE = 109
		self.ID_TEXT_TYPE = 110
		self.ID_FILE_STYLE = 111
		self.ID_APPLY_PROPERTY = 112
		self.ID_DOC_MARGIN_WIDTH = 113
		self.ID_DOC_CARET_WIDTH = 1235
		self.ID_PROMPT_CARET_WIDTH = 1237
		self.ID_LONGLINE_COL = 116
		self.ID_ICON_SIZE = 350
		self.ID_PROMPT_STYLE = 1140
		self.ID_PROMPT_MARGIN_WIDTH = 115
		self.ID_PROMPT_TEXT_TYPE = 117
		self.ID_PROMPT_APPLY_PROPERTY = 118
		self.ID_CLASS_BROWSER_STYLE = 201
		self.ID_BOOKMARKS_STYLE = 202
		self.ID_DRSCRIPT_STYLE = 203
		self.ID_DRSCRIPT_BROWSE = 211
		self.ID_PLUGINS_BROWSE = 212
		self.ID_PRINT_TAB_WIDTH = 251
		self.ID_DOCUMENTATION_BROWSE = 231
		self.ID_DOCUMENTATION_BROWSE_P = 232
		self.ID_DOCUMENTATION_BROWSE_W = 233
		self.ID_DOCUMENTATION_BROWSE_R = 234
		self.ID_TXT_RECENT_FILES = 301
		self.ID_TXT_TAB_WIDTH = 302
		self.ID_USE_TABS = 303
		self.ID_RESET_PANEL = 405
		self.ID_LB_PREFS = 505

		self.ID_SETUP_PREFS = 501

		self.ID_BTN_WILDCARD = 510
		self.ID_BTN_LNK_REPLACE_TABLE = 511

		self.userpreferencesdirectory = parent.userpreferencesdirectory

		self.prefs = drPreferences(parent.prefs.platform_is_windows, parent.programdirectory)
		self.prefs.Copy(parent.prefs)
		self.oldprefs = drPreferences(parent.prefs.platform_is_windows, parent.programdirectory)
		self.oldprefs.Copy(parent.prefs)

		self.lbPrefs = drPrefsBook(self, self.ID_LB_PREFS, (600, 400))

		self.pnlBookmarks = BookmarksPanel(self.lbPrefs, -1, "Bookmarks")
		self.pnlDocument = DocumentPanel(self.lbPrefs, -1, "Document")
		self.pnlDocumentation = DocumentationPanel(self.lbPrefs, -1, "Documentation")
		self.pnlDragAndDrop = DragAndDropPanel(self.lbPrefs, -1, "Drag and Drop")
		self.pnlDrScript = DrScriptPanel(self.lbPrefs, -1, "DrScript")
		self.pnlFileDialog = FileDialogPanel(self.lbPrefs, -1, "File Dialog")
		self.pnlFileTypes = FileTypesPanel(self.lbPrefs, -1, "File Types")
		self.pnlFindReplace = FindReplacePanel(self.lbPrefs, -1, "Find/Replace")
		self.pnlGeneral = GeneralPanel(self.lbPrefs, -1, "General")
		self.pnlPlugins = PluginsPanel(self.lbPrefs, -1, "Plugins")
		self.pnlPrint = PrintPanel(self.lbPrefs, -1, "Printing")
		self.pnlPrompt = PromptPanel(self.lbPrefs, -1, "Prompt")
		self.pnlSidePanels = SidePanelPanel(self.lbPrefs, -1, "Side Panels")
		self.pnlSourceBrowser = SourceBrowserPanel(self.lbPrefs, -1, "Source Browser")

		self.lbPrefs.AddPage(self.pnlBookmarks, "Bookmarks")
		self.lbPrefs.AddPage(self.pnlDocument, "Document")
		self.lbPrefs.AddPage(self.pnlDocumentation, "Documentation")
		self.lbPrefs.AddPage(self.pnlDragAndDrop, "Drag And Drop")
		self.lbPrefs.AddPage(self.pnlDrScript, "DrScript")
		self.lbPrefs.AddPage(self.pnlFileDialog, "File Dialog")
		self.lbPrefs.AddPage(self.pnlFileTypes, "File Types")
		self.lbPrefs.AddPage(self.pnlFindReplace, "Find/Replace")
		self.lbPrefs.AddPage(self.pnlGeneral, "General")
		self.lbPrefs.AddPage(self.pnlPlugins, "Plugins")
		self.lbPrefs.AddPage(self.pnlPrint, "Printing")
		self.lbPrefs.AddPage(self.pnlPrompt, "Prompt")
		self.lbPrefs.AddPage(self.pnlSidePanels, "Side Panels")
		self.lbPrefs.AddPage(self.pnlSourceBrowser, "Source Browser")

		self.lbPrefs.ShowPanel(self.parent.prefdialogposition)

		self.theSizer = wx.BoxSizer(wx.VERTICAL)

		self.buttonSizer = wx.BoxSizer(wx.HORIZONTAL)

		self.btnClose = wx.Button(self, self.ID_CLOSE, "   &Close   ")

		self.btnClose.SetDefault()

		self.btnHelp = wx.Button(self, self.ID_HELP, "   &Help   ")

		self.btnReset = wx.Button(self, self.ID_RESET, "   &Reset All   ")

		self.btnUpdate = wx.Button(self, self.ID_UPDATE, "   &Update   ")

		self.btnSave = wx.Button(self, self.ID_SAVE, "   &Save   ")

		self.buttonSizer.Add(self.btnClose, 0, wx.SHAPED)
		self.buttonSizer.Add(self.btnHelp, 0, wx.SHAPED)
		self.buttonSizer.Add(self.btnReset, 0, wx.SHAPED)
		self.buttonSizer.Add(self.btnUpdate, 0, wx.SHAPED)
		self.buttonSizer.Add(self.btnSave, 0, wx.SHAPED)

		self.theSizer.Add(self.lbPrefs, 1, wx.EXPAND)
		self.theSizer.Add(wx.StaticText(self, -1, "   "), 0, wx.SHAPED | wx.ALIGN_CENTER)
		self.theSizer.Add(self.buttonSizer, 0, wx.SHAPED | wx.ALIGN_CENTER)

		self.SetAutoLayout(True)
		self.SetSizer(self.theSizer)
		self.Bind(wx.EVT_BUTTON,  self.OnbtnClose, id=self.ID_CLOSE)
		self.Bind(wx.EVT_BUTTON,  self.OnbtnHelp, id=self.ID_HELP)
		self.Bind(wx.EVT_BUTTON,  self.OnbtnReset, id=self.ID_RESET)
		self.Bind(wx.EVT_BUTTON,  self.OnbtnUpdate, id=self.ID_UPDATE)
		self.Bind(wx.EVT_BUTTON,  self.OnbtnSave, id=self.ID_SAVE)

		self.parent.LoadDialogSizeAndPosition(self, 'preferencesdialog.sizeandposition.dat')

	def OnCloseW(self, event):
		self.parent.SaveDialogSizeAndPosition(self, 'preferencesdialog.sizeandposition.dat')
		if event is not None:
			event.Skip()

	def OnbtnClose(self, event):
		self.OnCloseW(None)
		self.EndModal(0)

	def OnbtnHelp(self, event):
		self.parent.ViewURLInBrowser(self.parent.programdirectory + '/documentation/preferences.html')

	def OnbtnReset(self, event):
		d = wx.MessageDialog(self, "This will reset all preferences to the program default.\n(You still need to click update and/or save)\nAre you sure you want to do this?", "Reset Preferences", wx.YES_NO | wx.ICON_QUESTION)
		answer = d.ShowModal()
		d.Destroy()
		if (answer == wx.ID_YES):

			self.prefs.reset()

			self.pnlSourceBrowser.reset()
			self.pnlDocument.reset()
			self.pnlDocumentation.reset()
			self.pnlDrScript.reset()
			self.pnlFindReplace.reset()
			self.pnlFileTypes.reset()
			self.pnlGeneral.reset()
			self.pnlPlugins.reset()
			self.pnlPrint.reset()
			self.pnlPrompt.reset()
			self.pnlSidePanels.reset()

	def OnbtnResetPanel(self, event):
		d = wx.MessageDialog(self, "This will reset all of this panel's preferences to the program default.\n(You still need to click update and/or save)\nAre you sure you want to do this?", "Reset Panel Preferences", wx.YES_NO | wx.ICON_QUESTION)
		answer = d.ShowModal()
		d.Destroy()
		if (answer == wx.ID_YES):
			panel = event.GetEventObject().GetParent()
			self.prefs.resetjust(panel.GetName())
			panel.reset()

	def OnbtnUpdate(self, event):
		self.GetParent().prefs = self.GetPreferences()
		self.GetParent().updatePrefs(self.oldprefs)
		self.oldprefs.Copy(self.prefs)
		if self.GetParent().prefs.enablefeedback:
			drScrolledMessageDialog.ShowMessage(self, ("Succesfully updated the current instance of DrPython.\nClick Save to make it permanent."), "Updated Preferences")

	def OnbtnSave(self, event):
		if (not os.path.exists(self.userpreferencesdirectory)):
			drScrolledMessageDialog.ShowMessage(self, ("Dude, you've got some problems...\nYour userpreferencesdirectory (" + self.userpreferencesdirectory + ") does not exist!\nLet's not bother speculating about how or why.\nRead the help file for this truly screwed up situation.\nDrPython will now politely ignore your request to save.\nTry again when you have fixed this problem."), "Huge Error")
			return
		preffile = self.userpreferencesdirectory + "/preferences.dat"
		try:
			drPrefsFile.WritePreferences(self.GetPreferences(), preffile)
		except IOError:
			drScrolledMessageDialog.ShowMessage(self, ("There were some problems writing to:\n"  + preffile + "\nEither the file is having metaphysical issues, or you do not have permission to write.\nFor metaphysical issues, consult the documentation.\nFor permission issues, change the permissions on the directory to allow yourself write access.\nDrPython will now politely ignore your request to save.\nTry again when you have fixed the problem."), "Write Error")
			return
		self.GetParent().prefs = self.GetPreferences()
		self.GetParent().updatePrefs(self.oldprefs)
		self.oldprefs.Copy(self.prefs)
		if self.GetParent().prefs.enablefeedback:
			drScrolledMessageDialog.ShowMessage(self, ("Succesfully wrote to:\n"  + preffile + "\nand updated the current instance of DrPython."), "Saved Preferences")

	def GetPreferences(self):
		#General
		self.prefs.rememberwindowsizeandposition = int(self.pnlGeneral.chkrememberwindowsizeandposition.GetValue())
		self.prefs.rememberdialogsizesandpositions = int(self.pnlGeneral.chkrememberdialogsizesandpositions.GetValue())
		self.prefs.rememberpanelsizes = int(self.pnlGeneral.chkrememberpanelsizes.GetValue())
		self.prefs.autodetectencoding = int(self.pnlGeneral.chkautodetectencoding.GetValue())
		self.prefs.defaultencoding = self.pnlGeneral.cboEncoding.GetValue()
		self.prefs.saveonrun = int(self.pnlGeneral.chksaveonrun.GetValue())
		self.prefs.checksyntaxonsave = int(self.pnlGeneral.chkchecksyntaxonsave.GetValue())
		self.prefs.checksyntaxextensions = self.pnlGeneral.txtchecksyntaxextensions.GetValue()
		self.prefs.promptonsaveall = int(self.pnlGeneral.chkpromptonsaveall.GetValue())
		self.prefs.doubleclicktoclosetab = int(self.pnlGeneral.chkdoubleclicktoclosetab.GetValue())

		self.prefs.recentfileslimit = self.pnlGeneral.txtRecentFiles.GetValue()
		if (len(self.prefs.recentfileslimit) < 1):
			self.prefs.recentfileslimit = self.oldprefs.recentfileslimit
		self.prefs.recentfileslimit = int(self.prefs.recentfileslimit)
		self.prefs.iconsize = int(self.pnlGeneral.boxiconsize.GetStringSelection())
		self.prefs.pythonargs = self.pnlGeneral.txtpythonargs.GetValue()
		self.prefs.defaultdirectory = self.pnlGeneral.txtdefaultdirectory.GetValue().replace('\\', '/')
		self.prefs.enablefeedback = int(self.pnlGeneral.chkenablefeedback.GetValue())
		self.prefs.alwayspromptonexit = int(self.pnlGeneral.chkalwayspromptonexit.GetValue())
		self.prefs.backupfileonsave = int(self.pnlGeneral.chkbackupfileonsave.GetValue())
		self.prefs.checkindentation = int(self.pnlGeneral.chkcheckindentation.GetValue())
		self.prefs.checkeol = int(self.pnlGeneral.chkCheckFormat.GetValue())
		self.prefs.vieweol = int(self.pnlGeneral.chkvieweol.GetValue())

		#Drag and Drop
		self.prefs.draganddropmode = self.pnlDragAndDrop.raddraganddropmode.GetSelection()
		self.prefs.draganddroptextmode = self.pnlDragAndDrop.raddraganddroptextmode.GetSelection()

		#File Types:
		self.prefs.extensions = self.pnlFileTypes.extensions.copy()
		self.prefs.docusetabs = self.pnlFileTypes.docusetabs.copy()
		self.prefs.doctabwidth = self.pnlFileTypes.doctabwidth.copy()
		self.prefs.doceolmode = self.pnlFileTypes.doceolmode.copy()
		self.prefs.docfolding = self.pnlFileTypes.docfolding.copy()
		self.prefs.doccommentstring = self.pnlFileTypes.doccommentstring.copy()
		self.prefs.docwordwrap = self.pnlFileTypes.docwordwrap.copy()

		#File Dialog
		self.prefs.usewxfiledialog = int(self.pnlFileDialog.chkusewxfiledialog.GetValue())
		self.prefs.defaultextension = int(self.pnlFileDialog.chkdefaultextension.GetValue())

		#Document
		self.prefs.docshowlinenumbers = int(self.pnlDocument.chkdocshowlinenumbers.GetValue())
		self.prefs.docparenthesismatching = int(self.pnlDocument.chkdocparenthesismatching.GetValue())
		self.prefs.docupdateindentation = int(self.pnlDocument.chkdocupdateindentation.GetValue())
		self.prefs.docautoindent = self.pnlDocument.raddocautoindent.GetSelection()
		self.prefs.docremovetrailingwhitespace = int(self.pnlDocument.chkdocremovetrailingwhitespace.GetValue())
		self.prefs.docautoreload = int(self.pnlDocument.chkdocautoreload.GetValue())
		self.prefs.docusefileindentation = int(self.pnlDocument.chkdocusefileindentation.GetValue())
		self.prefs.docwhitespaceisvisible = int(self.pnlDocument.chkWhitespace.GetValue())
		self.prefs.docusestyles = self.pnlDocument.radusestyles.GetSelection()
		self.prefs.docuseindentationguides = int(self.pnlDocument.chkuseindentationguides.GetValue())
		self.prefs.doccommentmode = self.pnlDocument.raddoccommentmode.GetSelection()
		
		self.prefs.doccaretwidth = self.pnlDocument.txtcaretwidth.GetValue()
		if (len(self.prefs.doccaretwidth) < 1):
			self.prefs.doccaretwidth = self.oldprefs.doccaretwidth
		self.prefs.doccaretwidth = int(self.prefs.doccaretwidth)

		self.prefs.dochighlightcurrentline = int(self.pnlDocument.chkhighlightcurrentline.GetValue())
		#Chris McDonough (I added the txt prefix)
		self.prefs.doclonglinecol = self.pnlDocument.txtdoclonglinecol.GetValue()
		if len(self.prefs.doclonglinecol) < 1:
			self.prefs.doclonglinecol = self.oldprefs.doclonglinecol
		self.prefs.doclonglinecol = int(self.prefs.doclonglinecol)
		#/Chris McDonough
		self.prefs.docscrollextrapage = int(self.pnlDocument.chkscrollextrapage.GetValue())
		self.prefs.docdefaultsyntaxhighlighting = self.pnlDocument.boxdefaultsyntaxhighlighting.GetSelection()
		self.prefs.doconlyusedefaultsyntaxhighlighting = self.pnlDocument.chkonlyusedefaultsyntaxhighlighting.GetValue()

		#Prompt

		self.prefs.prompttabwidth = self.pnlPrompt.txttabwidth.GetValue()
		if len(self.prefs.prompttabwidth) < 1:
			self.prefs.prompttabwidth = self.oldprefs.prompttabwidth
		self.prefs.prompttabwidth = int(self.prefs.prompttabwidth)
		self.prefs.prompteolmode = self.pnlPrompt.radFormat.GetSelection()

		self.prefs.promptmarginwidth = self.pnlPrompt.txtmarginwidth.GetValue()
		if (len(self.prefs.promptmarginwidth) < 1):
			self.prefs.promptmarginwidth = self.oldprefs.promptmarginwidth
		self.prefs.promptmarginwidth = int(self.prefs.promptmarginwidth)
		self.prefs.promptusetabs = int(self.pnlPrompt.chkpromptusetabs.GetValue())
		self.prefs.promptisvisible = int(self.pnlPrompt.chkVisible.GetValue())
		self.prefs.promptsize = int(self.pnlPrompt.sldrSize.GetValue())
		self.prefs.promptwordwrap = int(self.pnlPrompt.chkwordwrap.GetValue())

		self.prefs.promptcaretwidth = self.pnlPrompt.txtcaretwidth.GetValue()
		if (len(self.prefs.promptcaretwidth) < 1):
			self.prefs.promptcaretwidth = self.oldprefs.promptcaretwidth
		self.prefs.promptcaretwidth = int(self.prefs.promptcaretwidth)

		self.prefs.promptwhitespaceisvisible = int(self.pnlPrompt.chkWhitespace.GetValue())
		self.prefs.promptusestyles = self.pnlPrompt.radusestyles.GetSelection()
		self.prefs.promptscrollextrapage = int(self.pnlPrompt.chkscrollextrapage.GetValue())

		self.prefs.promptstartupscript = self.pnlPrompt.txtStartupScript.GetValue()

		#Find/Replace
		self.prefs.findreplaceregularexpression = int(self.pnlFindReplace.chkregularexpression.GetValue())
		self.prefs.findreplacematchcase = int(self.pnlFindReplace.chkmatchcase.GetValue())
		self.prefs.findreplacefindbackwards = int(self.pnlFindReplace.chkfindbackwards.GetValue())
		self.prefs.findreplacewholeword = int(self.pnlFindReplace.chkwholeword.GetValue())
		self.prefs.findreplaceinselection = int(self.pnlFindReplace.chkinselection.GetValue())
		self.prefs.findreplacefromcursor = int(self.pnlFindReplace.chkfromcursor.GetValue())
		self.prefs.findreplacepromptonreplace = int(self.pnlFindReplace.chkpromptonreplace.GetValue())
		self.prefs.findreplaceautowrap = int(self.pnlFindReplace.chkfindreplaceautowrap.GetValue())
		self.prefs.findreplaceundercursor = int(self.pnlFindReplace.chkundercursor.GetValue())

		#Side Panels
		self.prefs.sidepanelleftsize = int(self.pnlSidePanels.sldrSizeLeft.GetValue())
		self.prefs.sidepanelrightsize = int(self.pnlSidePanels.sldrSizeRight.GetValue())
		self.prefs.sidepaneltopsize = int(self.pnlSidePanels.sldrSizeTop.GetValue())

		#Source Browser
		self.prefs.sourcebrowserpanel = self.pnlSourceBrowser.positionchooser.GetSelection()
		self.prefs.sourcebrowsersize = self.pnlSourceBrowser.sldrSize.GetValue()
		self.prefs.sourcebrowserisvisible = int(self.pnlSourceBrowser.chkIsVisible.GetValue())
		self.prefs.sourcebrowsercloseonactivate = int(self.pnlSourceBrowser.chkcloseonactivate.GetValue())
		self.prefs.sourcebrowserissorted = int(self.pnlSourceBrowser.chkissorted.GetValue())
		self.prefs.sourcebrowserautorefreshonsave = int(self.pnlSourceBrowser.chkautorefreshonsave.GetValue())
		self.prefs.sourcebrowserautorefresh = int(self.pnlSourceBrowser.chkautorefresh.GetValue())

		#Plugins
		self.prefs.pluginsdefaultdirectory = self.pnlPlugins.txtdefaultdirectory.GetValue()

		#DrScript
		self.prefs.drscriptdefaultdirectory = self.pnlDrScript.txtdefaultdirectory.GetValue()
		self.prefs.drscriptloadexamples = int(self.pnlDrScript.chkloadexamples.GetValue())

		#Printing
		self.prefs.printdoclinenumbers = int(self.pnlPrint.chkdoclinenumbers.GetValue())
		self.prefs.printpromptlinenumbers = int(self.pnlPrint.chkpromptlinenumbers.GetValue())
		self.prefs.printtabwidth = self.pnlPrint.txttabwidth.GetValue()
		if (len(self.prefs.printtabwidth) < 1):
			self.prefs.printtabwidth = self.oldprefs.printtabwidth
		self.prefs.printtabwidth = int(self.prefs.printtabwidth)

		#Documentation
		self.prefs.documentationbrowser = self.pnlDocumentation.txtbrowser.GetValue()
		self.prefs.documentationpythonlocation = self.pnlDocumentation.txtpython.GetValue()
		self.prefs.documentationwxwidgetslocation = self.pnlDocumentation.txtwxwidgets.GetValue()
		self.prefs.documentationrehowtolocation = self.pnlDocumentation.txtrehowto.GetValue()

		return self.prefs

syntax highlighted by Code2HTML, v. 0.9.1