#	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

#Shortcuts

import re
import wx.stc
import wx

wxKeyDictionary = {wx.WXK_F1:'F1',
wx.WXK_F2:'F2',
wx.WXK_F3:'F3',
wx.WXK_F4:'F4',
wx.WXK_F5:'F5',
wx.WXK_F6:'F6',
wx.WXK_F7:'F7',
wx.WXK_F8:'F8',
wx.WXK_F9:'F9',
wx.WXK_F10:'F10',
wx.WXK_F11:'F11',
wx.WXK_F12:'F12',
wx.WXK_MENU:'Menu',
wx.WXK_PAUSE:'Pause',
wx.WXK_CAPITAL:'CAPS',
wx.WXK_PRIOR:'Page Up',
wx.WXK_NEXT:'Page Down',
wx.WXK_END:'End',
wx.WXK_HOME:'Home',
wx.WXK_LEFT:'Left',
wx.WXK_UP:'Up',
wx.WXK_RIGHT:'Right',
wx.WXK_DOWN:'Down',
wx.WXK_INSERT:'Insert',
wx.WXK_PRINT:'Print',
wx.WXK_BACK:'Backspace',
wx.WXK_TAB:'Tab',
wx.WXK_RETURN:'Enter',
wx.WXK_ESCAPE:'Esc',
wx.WXK_SPACE:'Space',
wx.WXK_DELETE:'Delete',
wx.WXK_ADD:'+',
wx.WXK_SUBTRACT:'-',
wx.WXK_SEPARATOR:'_',
wx.WXK_MULTIPLY:'*',
wx.WXK_DIVIDE:'/',
wx.WXK_ADD:'+',
wx.WXK_NUMPAD_SPACE:'Space',
wx.WXK_NUMPAD_TAB:'Tab',
wx.WXK_NUMPAD_ENTER:'Enter',
wx.WXK_NUMPAD_F1:'F1',
wx.WXK_NUMPAD_F2:'F2',
wx.WXK_NUMPAD_F3:'F3',
wx.WXK_NUMPAD_F4:'F4',
wx.WXK_NUMPAD_HOME:'Home',
wx.WXK_NUMPAD_LEFT:'Left',
wx.WXK_NUMPAD_UP:'Up',
wx.WXK_NUMPAD_RIGHT:'Right',
wx.WXK_NUMPAD_DOWN:'Down',
wx.WXK_NUMPAD_PRIOR:'Page Up',
wx.WXK_NUMPAD_PAGEUP:'Page Up',
wx.WXK_NUMPAD_NEXT:'Page Down',
wx.WXK_NUMPAD_PAGEDOWN:'Page Down',
wx.WXK_NUMPAD_END:'End',
wx.WXK_NUMPAD_BEGIN:'Begin',
wx.WXK_NUMPAD_INSERT:'Insert',
wx.WXK_NUMPAD_DELETE:'Delete',
wx.WXK_NUMPAD_EQUAL:'=',
wx.WXK_NUMPAD_MULTIPLY:'*',
wx.WXK_NUMPAD_ADD:'+',
wx.WXK_NUMPAD_SEPARATOR:'_',
wx.WXK_NUMPAD_SUBTRACT:'-',
wx.WXK_NUMPAD_DECIMAL:'.',
wx.WXK_NUMPAD_DIVIDE:'/'}

recontrol = re.compile('Control')
reshift = re.compile('Shift')
realt = re.compile('Alt')
remeta = re.compile('Meta')
rekeycode = re.compile('\d+')

def MatchControl(shortcut):
	return recontrol.search(shortcut) is not None

def MatchShift(shortcut):
	return reshift.search(shortcut) is not None

def MatchAlt(shortcut):
	return realt.search(shortcut) is not None

def MatchMeta(shortcut):
	return remeta.search(shortcut) is not None

def BuildShortcutString(keycode, control, shift, alt, meta):
	keystr = ""

	if control:
		keystr = "Control"
	if shift:
		keystr = keystr + "Shift"
	if alt:
		keystr = keystr + "Alt"
	if meta:
		keystr = keystr + "Meta"
	keystr = keystr + str(keycode)

	return keystr

def GetKeycodeStringFromShortcut(shortcut):
	kstr = rekeycode.search(shortcut)
	if kstr is not None:
		return kstr.group()
	return ''

def GetKeycodeFromShortcut(shortcut):
	kstr = rekeycode.search(shortcut)
	if kstr is not None:
		try:
			k = int(kstr.group())
		except:
			return 0
		return k
	return 0

def GetShortcutLabel(shortcut):
	label = ''

	if MatchControl(shortcut):
		label += 'Ctrl+'
	if MatchShift(shortcut):
		label += 'Shift+'
	if MatchAlt(shortcut):
		label += 'Alt+'
	if MatchMeta(shortcut):
		label += 'Meta+'

	try:
		kc = GetKeycodeFromShortcut(shortcut)
	except:
		return ''

	if wxKeyDictionary.has_key(kc):
		label += wxKeyDictionary[kc]
		return label

	if kc < 128:
		label += chr(kc)
		return label

	return ''

def GetDefaultSTCShortcut(stcindex):
	shortcut = [["Back Tab", wx.WXK_TAB, "Shift"], ["Cancel", wx.WXK_ESCAPE, ""],
	["Char Left", wx.WXK_LEFT, ""], ["Char Left Extend", wx.WXK_LEFT, "Shift"], ["Char Left Rect Extend", wx.WXK_LEFT, "Shift, Alt"],
	["Char Right", wx.WXK_RIGHT, ""], ["Char Right Extend", wx.WXK_RIGHT, "Shift"], ["Char Right Rect Extend", wx.WXK_RIGHT, "Shift, Alt"],
	["Copy", ord('C'), "Control"], ["Cut", ord('X'), "Control"],
	["Delete", wx.WXK_DELETE, ""],
	["Delete Back", wx.WXK_BACK, ""], ["Delete Back Not Line", wx.WXK_BACK, "Shift"],
	["Delete Line Left", -1, ""], ["Delete Line Right", wx.WXK_DELETE, "Control, Shift"],
	["Delete Word Left", -1, ""], ["Delete Word Right", wx.WXK_DELETE, "Control"],
	["Document End", wx.WXK_END, "Control"], ["Document End Extend", wx.WXK_END, "Control, Shift"],
	["Document Start", wx.WXK_HOME, "Control"], ["Document Start Extend", wx.WXK_HOME, "Control, Shift"],
	["Form Feed", -1, ""], ["Home", wx.WXK_HOME, ""],
	["Home Display", wx.WXK_HOME, "Alt"], ["Home Display Extend", -1, ""],
	["Home Extend", wx.WXK_HOME, "Shift"], ["Home Rect Extend", wx.WXK_HOME, "Shift, Alt"], ["Line Cut", -1, ""], ["Line Delete", -1, ""],
	["Line Down", wx.WXK_DOWN, ""], ["Line Down Extend", wx.WXK_DOWN, "Shift"], ["Line Down Rect Extend", wx.WXK_DOWN, "Shift, Alt"],
	["Line Duplicate", -1, ""], ["Line End", wx.WXK_END, ""],
	["Line End Display", wx.WXK_END, "Alt"], ["Line End Display Extend", -1, ""],
	["Line End Extend", wx.WXK_END, "Shift"], ["Line End Rect Extend", wx.WXK_END, "Shift, Alt"], ["Line Scroll Down", wx.WXK_DOWN, "Control"],
	["Line Scroll Up", wx.WXK_UP, "Control"], ["Line Transpose", -1, ""], ["Line Up", wx.WXK_UP, ""],
	["Line Up Extend", wx.WXK_UP, "Shift"], ["Line Up Rect Extend", wx.WXK_UP, "Shift, Alt"], ["Lowercase", ord('U'), "Control"], ["New Line", wx.WXK_RETURN, ""],
	["Page Down", wx.WXK_NEXT, ""], ["Page Down Extend", wx.WXK_NEXT, "Shift"],["Page Down Rect Extend", wx.WXK_NEXT, "Shift, Alt"],  ["Page Up", wx.WXK_PRIOR, ""],
	["Page Up Extend", wx.WXK_PRIOR, "Shift"], ["Page Up Rect Extend", wx.WXK_PRIOR, "Shift, Alt"], ["Paste", ord('V'), "Control"],
	["Redo", ord('Y'), "Control"],
	["Select All", ord('A'), "Control"],
	["Tab", wx.WXK_TAB, ""], ["Toggle Overtype", wx.WXK_INSERT, ""], ["Undo", ord('Z'), "Control"],
	["Uppercase", ord('U'), "Control, Shift"],
	["Visible Character Home", -1, ""], ["Visible Character Home Extend", -1, ""],
	["World Left", wx.WXK_LEFT, "Control"],
	["Word Left Extend", wx.WXK_LEFT, "Control, Shift"], ["Word Part Left", wx.WXK_LEFT, "Alt"],
	["Word Part Left Extend", -1, ""],
	["Word Part Right", wx.WXK_RIGHT, "Alt"], ["Word Part Right Extend", -1, ""],
	["Word Right", wx.WXK_RIGHT, "Control"], ["Word Right Extend", wx.WXK_RIGHT, "Control, Shift"],
	["Zoom In", 392, "Control"], ["Zoom Out", 394, "Control"]][stcindex]

	return (shortcut[2] + str(shortcut[1]))

def GetKeycodeText(keycode):
	wxkeycodes = [wx.WXK_BACK, wx.WXK_TAB, wx.WXK_RETURN, wx.WXK_ESCAPE, wx.WXK_SPACE, wx.WXK_DELETE, wx.WXK_START, wx.WXK_LBUTTON, wx.WXK_RBUTTON, wx.WXK_CANCEL, wx.WXK_MBUTTON, wx.WXK_CLEAR, wx.WXK_SHIFT, wx.WXK_CONTROL, wx.WXK_MENU, wx.WXK_PAUSE, wx.WXK_CAPITAL, wx.WXK_PRIOR, wx.WXK_NEXT, wx.WXK_END, wx.WXK_HOME, wx.WXK_LEFT, wx.WXK_UP, wx.WXK_RIGHT, wx.WXK_DOWN, wx.WXK_SELECT, wx.WXK_PRINT, wx.WXK_EXECUTE, wx.WXK_SNAPSHOT, wx.WXK_INSERT, wx.WXK_HELP, wx.WXK_NUMPAD0, wx.WXK_NUMPAD1, wx.WXK_NUMPAD2, wx.WXK_NUMPAD3, wx.WXK_NUMPAD4, wx.WXK_NUMPAD5, wx.WXK_NUMPAD6, wx.WXK_NUMPAD7, wx.WXK_NUMPAD8, wx.WXK_NUMPAD9, wx.WXK_MULTIPLY, wx.WXK_ADD, wx.WXK_SEPARATOR, wx.WXK_SUBTRACT, wx.WXK_DECIMAL, wx.WXK_DIVIDE, wx.WXK_F1, wx.WXK_F2, wx.WXK_F3, wx.WXK_F4, wx.WXK_F5, wx.WXK_F6, wx.WXK_F7, wx.WXK_F8, wx.WXK_F9, wx.WXK_F10, wx.WXK_F11, wx.WXK_F12, wx.WXK_F13, wx.WXK_F14, wx.WXK_F15, wx.WXK_F16, wx.WXK_F17, wx.WXK_F18, wx.WXK_F19, wx.WXK_F20, wx.WXK_F21, wx.WXK_F22, wx.WXK_F23, wx.WXK_F24, wx.WXK_NUMLOCK, wx.WXK_SCROLL]
	wxkeynames = ["BACK", "TAB", "RETURN", "ESCAPE", "SPACE", "DELETE", "START", "LBUTTON", "RBUTTON", "CANCEL", "MBUTTON", "CLEAR", "SHIFT", "CONTROL", "MENU", "PAUSE", "CAPITAL", "PRIOR", "NEXT", "END", "HOME", "LEFT", "UP", "RIGHT", "DOWN", "SELECT", "PRINT", "EXECUTE", "SNAPSHOT", "INSERT", "HELP", "NUMPAD0", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD4", "NUMPAD5", "NUMPAD6", "NUMPAD7", "NUMPAD8", "NUMPAD9", "MULTIPLY", "ADD", "SEPARATOR", "SUBTRACT", "DECIMAL", "DIVIDE", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24", "NUMLOCK", "SCROLL"]

	try:
		i = wxkeycodes.index(keycode)
		return True, wxkeynames[i]
	except:
		pass

	return False, ""

def GetSTCCommandList():
	return [wx.stc.STC_CMD_BACKTAB, wx.stc.STC_CMD_CANCEL,
	wx.stc.STC_CMD_CHARLEFT, wx.stc.STC_CMD_CHARLEFTEXTEND, wx.stc.STC_CMD_CHARLEFTRECTEXTEND,
	wx.stc.STC_CMD_CHARRIGHT, wx.stc.STC_CMD_CHARRIGHTEXTEND, wx.stc.STC_CMD_CHARRIGHTRECTEXTEND,
	wx.stc.STC_CMD_COPY, wx.stc.STC_CMD_CUT,
	wx.stc.STC_CMD_CLEAR,
	wx.stc.STC_CMD_DELETEBACK, wx.stc.STC_CMD_DELETEBACKNOTLINE,
	wx.stc.STC_CMD_DELLINELEFT, wx.stc.STC_CMD_DELLINERIGHT,
	wx.stc.STC_CMD_DELWORDLEFT, wx.stc.STC_CMD_DELWORDRIGHT,
	wx.stc.STC_CMD_DOCUMENTEND, wx.stc.STC_CMD_DOCUMENTENDEXTEND,
	wx.stc.STC_CMD_DOCUMENTSTART, wx.stc.STC_CMD_DOCUMENTSTARTEXTEND,
	wx.stc.STC_CMD_FORMFEED, wx.stc.STC_CMD_HOME,
	wx.stc.STC_CMD_HOMEDISPLAY, wx.stc.STC_CMD_HOMEDISPLAYEXTEND,
	wx.stc.STC_CMD_HOMEEXTEND, wx.stc.STC_CMD_VCHOMERECTEXTEND, wx.stc.STC_CMD_LINECUT, wx.stc.STC_CMD_LINEDELETE,
	wx.stc.STC_CMD_LINEDOWN, wx.stc.STC_CMD_LINEDOWNEXTEND, wx.stc.STC_CMD_LINEDOWNRECTEXTEND,
	wx.stc.STC_CMD_LINEDUPLICATE, wx.stc.STC_CMD_LINEEND,
	wx.stc.STC_CMD_LINEENDDISPLAY, wx.stc.STC_CMD_LINEENDDISPLAYEXTEND,
	wx.stc.STC_CMD_LINEENDEXTEND, wx.stc.STC_CMD_LINEENDRECTEXTEND, wx.stc.STC_CMD_LINESCROLLDOWN,
	wx.stc.STC_CMD_LINESCROLLUP, wx.stc.STC_CMD_LINETRANSPOSE, wx.stc.STC_CMD_LINEUP,
	wx.stc.STC_CMD_LINEUPEXTEND, wx.stc.STC_CMD_LINEUPRECTEXTEND, wx.stc.STC_CMD_LOWERCASE, wx.stc.STC_CMD_NEWLINE,
	wx.stc.STC_CMD_PAGEDOWN, wx.stc.STC_CMD_PAGEDOWNEXTEND, wx.stc.STC_CMD_PAGEDOWNRECTEXTEND, wx.stc.STC_CMD_PAGEUP,
	wx.stc.STC_CMD_PAGEUPEXTEND, wx.stc.STC_CMD_PAGEUPRECTEXTEND, wx.stc.STC_CMD_PASTE,
	wx.stc.STC_CMD_REDO,
	wx.stc.STC_CMD_SELECTALL,
	wx.stc.STC_CMD_TAB, wx.stc.STC_CMD_EDITTOGGLEOVERTYPE, wx.stc.STC_CMD_UNDO,
	wx.stc.STC_CMD_UPPERCASE,
	wx.stc.STC_CMD_VCHOME, wx.stc.STC_CMD_VCHOMEEXTEND,
	wx.stc.STC_CMD_WORDLEFT,
	wx.stc.STC_CMD_WORDLEFTEXTEND, wx.stc.STC_CMD_WORDPARTLEFT,
	wx.stc.STC_CMD_WORDPARTLEFTEXTEND,
	wx.stc.STC_CMD_WORDPARTRIGHT, wx.stc.STC_CMD_WORDPARTRIGHTEXTEND,
	wx.stc.STC_CMD_WORDRIGHT, wx.stc.STC_CMD_WORDRIGHTEXTEND,
	wx.stc.STC_CMD_ZOOMIN, wx.stc.STC_CMD_ZOOMOUT]

def SetSTCShortcuts(stc, Shortcuts, useDefault = 0):
	#KeycodeArray = []
	wxDefArray = [wx.WXK_DOWN, wx.WXK_UP, wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_HOME, wx.WXK_END, wx.WXK_PRIOR,
	wx.WXK_NEXT, wx.WXK_DELETE, wx.WXK_INSERT, wx.WXK_ESCAPE, wx.WXK_BACK, wx.WXK_TAB, wx.WXK_RETURN,
	wx.WXK_ADD, wx.WXK_SUBTRACT, wx.WXK_DIVIDE]
	PreDefArray = [wx.stc.STC_KEY_DOWN, wx.stc.STC_KEY_UP, wx.stc.STC_KEY_LEFT, wx.stc.STC_KEY_RIGHT, wx.stc.STC_KEY_HOME,
	wx.stc.STC_KEY_END, wx.stc.STC_KEY_PRIOR, wx.stc.STC_KEY_NEXT, wx.stc.STC_KEY_DELETE, wx.stc.STC_KEY_INSERT,
	wx.stc.STC_KEY_ESCAPE, wx.stc.STC_KEY_BACK, wx.stc.STC_KEY_TAB, wx.stc.STC_KEY_RETURN, wx.stc.STC_KEY_ADD,
	wx.stc.STC_KEY_SUBTRACT, wx.stc.STC_KEY_DIVIDE]

	#Note:	If stc.CmdKeyAssign is used, then DrPython will never process
	#		that combindation in the keybinding code.

	cmdlist = GetSTCCommandList()

	stc.CmdKeyClearAll()

	x = 0
	l = len(Shortcuts)
	while x < l:
		modifiers = 0

		if useDefault:
			Shortcuts[x] = GetDefaultSTCShortcut(x)

		ikeycode = GetKeycodeFromShortcut(Shortcuts[x])

		if MatchControl(Shortcuts[x]):
			modifiers = modifiers | wx.stc.STC_SCMOD_CTRL
		if MatchShift(Shortcuts[x]):
			modifiers = modifiers | wx.stc.STC_SCMOD_SHIFT
		if MatchAlt(Shortcuts[x]):
			modifiers = modifiers | wx.stc.STC_SCMOD_ALT

		if (ikeycode >= ord('A')) and (ikeycode <= ord('Z')):
			stc.CmdKeyAssign(ikeycode, modifiers, cmdlist[x])
		elif ikeycode in wxDefArray:
			i = wxDefArray.index(ikeycode)
			stc.CmdKeyAssign(PreDefArray[i], modifiers, cmdlist[x])
		x = x + 1

	return Shortcuts

def SetShortcuts(frame, Shortcuts, ShortcutNames, useDefault=0):

	shortcutsActionArray = []
	shortcutsArgumentsArray = []

	l = len(Shortcuts)
	x = 0
	while (x < l):
		#File
		if(ShortcutNames[x] == "New"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('N'))
			shortcutsActionArray.append(frame.OnNew)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Open"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('O'))
			shortcutsActionArray.append(frame.OnOpen)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Open Imported Module"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('M'))
			shortcutsActionArray.append(frame.OnOpenImportedModule)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Save"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('S'))
			shortcutsActionArray.append(frame.OnSave)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Save As"):
			shortcutsActionArray.append(frame.OnSaveAs)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Save All Documents"):
			shortcutsActionArray.append(frame.OnSaveAll)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Save Prompt Output To File"):
			shortcutsActionArray.append(frame.OnSavePrompt)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Reload File"):
			shortcutsActionArray.append(frame.OnReload)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Restore From Backup"):
			shortcutsActionArray.append(frame.OnRestoreFromBackup)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Close"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('W'))
			shortcutsActionArray.append(frame.OnClose)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Close All Documents"):
			shortcutsActionArray.append(frame.OnCloseAllDocuments)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Close All Other Documents"):
			shortcutsActionArray.append(frame.OnCloseAllOtherDocuments)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Print Setup"):
			shortcutsActionArray.append(frame.OnPrintSetup)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Print File"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('P'))
			shortcutsActionArray.append(frame.OnPrint)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Print Prompt"):
			if useDefault:
				Shortcuts[x] = 'ControlShift' + str(ord('P'))
			shortcutsActionArray.append(frame.OnPrintPrompt)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Exit"):
			shortcutsActionArray.append(frame.OnExit)
			shortcutsArgumentsArray.append("frame, event")

		#Tabs
		elif(ShortcutNames[x] == "Next Document"):
			if useDefault:
				Shortcuts[x] = str(wx.WXK_F10)
			shortcutsActionArray.append(frame.OnSelectDocumentNext)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Previous Document"):
			if useDefault:
				Shortcuts[x] = str(wx.WXK_F9)
			shortcutsActionArray.append(frame.OnSelectDocumentPrevious)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "First Document"):
			shortcutsActionArray.append(frame.OnSelectDocumentFirst)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Last Document"):
			shortcutsActionArray.append(frame.OnSelectDocumentLast)
			shortcutsArgumentsArray.append("frame, event")

		#Edit
		elif(ShortcutNames[x] == "Find"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('F'))
			shortcutsActionArray.append(frame.OnMenuFind)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Find Next"):
			if useDefault:
				Shortcuts[x] = str(wx.WXK_F3)
			shortcutsActionArray.append(frame.OnMenuFindNext)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Find Previous"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(wx.WXK_F3)
			shortcutsActionArray.append(frame.OnMenuFindPrevious)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Replace"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('R'))
			shortcutsActionArray.append(frame.OnMenuReplace)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Find In Files"):
			shortcutsActionArray.append(frame.OnMenuFindInFiles)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Replace In Files"):
			shortcutsActionArray.append(frame.OnMenuReplaceInFiles)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Insert Regular Expression"):
			shortcutsActionArray.append(frame.OnInsertRegEx)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Insert Separator"):
			shortcutsActionArray.append(frame.OnInsertSeparator)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Comment"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('['))
			shortcutsActionArray.append(frame.OnCommentRegion)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "UnComment"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord(']'))
			shortcutsActionArray.append(frame.OnUnCommentRegion)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Indent"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('I'))
			shortcutsActionArray.append(frame.OnIndentRegion)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Dedent"):
			if useDefault:
				Shortcuts[x] = 'ControlShift' + str(ord('I'))
			shortcutsActionArray.append(frame.OnDedentRegion)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Find And Complete"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(wx.WXK_RETURN)
			shortcutsActionArray.append(frame.OnFindAndComplete)
			shortcutsArgumentsArray.append("frame, event")

		#View
		elif(ShortcutNames[x] == "Go To"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('G'))
			shortcutsActionArray.append(frame.OnGoTo)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Go To Block Start"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('B'))
			shortcutsActionArray.append(frame.OnGoToBlockStart)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Go To Block End"):
			if useDefault:
				Shortcuts[x] = 'ControlShift' + str(ord('B'))
			shortcutsActionArray.append(frame.OnGoToBlockEnd)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Go To Class Start"):
			shortcutsActionArray.append(frame.OnGoToClassStart)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Go To Class End"):
			shortcutsActionArray.append(frame.OnGoToClassEnd)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Go To Def Start"):
			shortcutsActionArray.append(frame.OnGoToDefStart)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Go To Def End"):
			shortcutsActionArray.append(frame.OnGoToDefEnd)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Toggle Fold"):
			shortcutsActionArray.append(frame.OnToggleFold)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Fold All"):
			shortcutsActionArray.append(frame.OnFoldAll)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Expand All"):
			shortcutsActionArray.append(frame.OnExpandAll)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Source Browser Go To"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(wx.WXK_F8)
			shortcutsActionArray.append(frame.OnSourceBrowserGoTo)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Toggle Source Browser"):
			if useDefault:
				Shortcuts[x] = str(wx.WXK_F8)
			shortcutsActionArray.append(frame.OnToggleSourceBrowser)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Toggle View Whitespace"):
			if useDefault:
				Shortcuts[x] = 'ControlShift' + str(ord('W'))
			shortcutsActionArray.append(frame.OnToggleViewWhiteSpace)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Toggle Prompt"):
			if useDefault:
				Shortcuts[x] = str(wx.WXK_F6)
			shortcutsActionArray.append(frame.OnTogglePrompt)
			shortcutsArgumentsArray.append("frame, event")

		elif(ShortcutNames[x] == "View In Left Panel"):
			shortcutsActionArray.append(frame.OnViewInLeftPanel)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "View In Right Panel"):
			shortcutsActionArray.append(frame.OnViewInRightPanel)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "View In Top Panel"):
			shortcutsActionArray.append(frame.OnViewInTopPanel)
			shortcutsArgumentsArray.append("frame, event")

		#Program
		elif(ShortcutNames[x] == "Check Syntax"):
			shortcutsActionArray.append(frame.OnCheckSyntax)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Run"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('E'))
			shortcutsActionArray.append(frame.OnRun)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Set Arguments"):
			shortcutsActionArray.append(frame.OnSetArgs)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Python"):
			if useDefault:
				Shortcuts[x] = str(wx.WXK_F7)
			shortcutsActionArray.append(frame.OnPython)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "End"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(ord('D'))
			shortcutsActionArray.append(frame.OnEnd)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Close Prompt"):
			shortcutsActionArray.append(frame.OnClosePrompt)
			shortcutsArgumentsArray.append("frame, event")

		#DrScript
		elif(ShortcutNames[x] == "Dynamic DrScript"):
			shortcutsActionArray.append(frame.dynamicdrscript)
			shortcutsArgumentsArray.append("frame, event")

		#Prefs
		elif(ShortcutNames[x] == "Preferences"):
			shortcutsActionArray.append(frame.OnPrefs)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Customize Shortcuts"):
			shortcutsActionArray.append(frame.OnCustomizeShortcuts)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Customize Pop Up Menu"):
			shortcutsActionArray.append(frame.OnCustomizePopUpMenu)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "Customize ToolBar"):
			shortcutsActionArray.append(frame.OnCustomizeToolBar)
			shortcutsArgumentsArray.append("frame, event")

		#Docs
		elif(ShortcutNames[x] == "Help"):
			shortcutsActionArray.append(frame.OnViewHelp)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "View Python Docs"):
			shortcutsActionArray.append(frame.OnViewPythonDocs)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "View WxWidgets Docs"):
			shortcutsActionArray.append(frame.OnViewWxWidgetsDocs)
			shortcutsArgumentsArray.append("frame, event")
		elif(ShortcutNames[x] == "View Regular Expression Howto"):
			shortcutsActionArray.append(frame.OnViewREHowtoDocs)
			shortcutsArgumentsArray.append("frame, event")

		#General
		elif(ShortcutNames[x] == "Toggle Maximize"):
			if useDefault:
				Shortcuts[x] = 'Control' + str(wx.WXK_F5)
			shortcutsActionArray.append(frame.Maximize)
			shortcutsArgumentsArray.append("maximize")

		x = x + 1

	return Shortcuts, shortcutsActionArray, shortcutsArgumentsArray

def RunShortcuts(frame, event, stc, SplitView):
	keycode = event.GetKeyCode()

	#Treat Numpad Enter as Enter.
	if keycode == wx.WXK_NUMPAD_ENTER:
		keycode = wx.WXK_RETURN

	allowControl = not (frame.ShortcutsIgnoreString.find("Control") > -1)
	allowShift = not (frame.ShortcutsIgnoreString.find("Shift") > -1)
	allowAlt = not (frame.ShortcutsIgnoreString.find("Alt") > -1)
	allowMeta = not (frame.ShortcutsIgnoreString.find("Meta") > -1)

	control = (event.ControlDown() and allowControl)
	shift = (event.ShiftDown() and allowShift)
	alt = (event.AltDown() and allowAlt)
	meta = (event.MetaDown() and allowMeta)

	strkeycode = BuildShortcutString(keycode, control, shift, alt, meta)

	#Get the active stc:
	if stc is None:
		if (frame.txtPrompt.GetSTCFocus()):
			stc = frame.txtPrompt
		else:
			stc = frame.txtDocument

	allowControl = not (frame.ShortcutsIgnoreString.find("Control") > -1)
	allowShift = not (frame.ShortcutsIgnoreString.find("Shift") > -1)
	allowMeta = not (frame.ShortcutsIgnoreString.find("Meta") > -1)
	allowAlt = not (frame.ShortcutsIgnoreString.find("Alt") > -1)

	drstc = -1
	drpy = -1
	drscript = -1
	plugin = -1

	if strkeycode in frame.PluginShortcuts:
		plugin = frame.PluginShortcuts.index(strkeycode)
	if strkeycode in frame.STCShortcuts:
		drstc = frame.STCShortcuts.index(strkeycode)
	elif strkeycode in frame.Shortcuts:
		drpy = frame.Shortcuts.index(strkeycode)
	elif strkeycode in frame.DrScriptShortcuts:
		drscript = frame.DrScriptShortcuts.index(strkeycode)

	if plugin > -1:
		r = frame.PluginAction[plugin](event)
		if r is None or (r == 1):
			return -1

	if stc.IsAPrompt:
		if (frame.STCCOMMANDLIST[drstc] == wx.stc.STC_CMD_NEWLINE) or \
		(frame.STCCOMMANDLIST[drstc] == wx.stc.STC_CMD_CHARLEFT) or \
		(frame.STCCOMMANDLIST[drstc] == wx.stc.STC_CMD_CHARRIGHT) or \
		(frame.STCCOMMANDLIST[drstc] == wx.stc.STC_CMD_LINEUP) or \
		(frame.STCCOMMANDLIST[drstc] == wx.stc.STC_CMD_LINEDOWN) or \
		(frame.STCCOMMANDLIST[drstc] == wx.stc.STC_CMD_DELETEBACK) or \
		(frame.STCCOMMANDLIST[drstc] == wx.stc.STC_CMD_HOME):
			return frame.STCCOMMANDLIST[drstc]
		
	elif frame.STCCOMMANDLIST[drstc] == wx.stc.STC_CMD_DELETEBACK:
		return wx.stc.STC_CMD_DELETEBACK
	
	if drstc > -1 and (not drpy > -1) and (not drscript > -1):
		try:
			if frame.STCCOMMANDLIST[drstc] == wx.stc.STC_CMD_PASTE:
				stc.Paste()
			else:
				stc.CmdKeyExecute(frame.STCCOMMANDLIST[drstc])
		except:
			return -1
		return frame.STCCOMMANDLIST[drstc]
	if SplitView:
		return -1
	if drpy > -1 and (not drscript > -1) and (not drstc > -1):
		if (frame.ShortcutsArgumentsArray[drpy] == "frame, event"):
			frame.ShortcutsActionArray[drpy](event)
		elif (frame.ShortcutsArgumentsArray[drpy] == "maximize"):
			#Work Around Bug in wx.Python 2.5.1
			try:
				frame.ShortcutsActionArray[drpy](not frame.IsMaximized())
			except:
				pass
		return -1
	if drscript > -1 and (not drpy > -1) and (not drstc > -1):
		event.SetId(frame.ID_SCRIPT_BASE + drscript)
		frame.DrScriptShortcutsAction(event)
		return -1

	event.Skip()
	
	return -1

syntax highlighted by Code2HTML, v. 0.9.1