#	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
	
#The Notebook, and Panels.

import operator, os.path
import wx
import wx.stc
from drText import DrText
import drEncoding

#*************************************************
#Used in the main panel.

class drSashWindow(wx.SashWindow):
	def __init__(self, parent, id, pos, size, style=0):
		wx.SashWindow.__init__(self, parent, id, pos, size, style)
		
		self.parent = parent.parent
		
		self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
										
	def OnKeyDown(self, event):
		self.parent.RunShortcuts(event)
		
	def SetNotebook(self, notebook):
		'''Can Only be called once'''
		
		self.notebook = notebook
		self.theSizer = wx.BoxSizer(wx.HORIZONTAL)
		self.theSizer.Add(self.notebook, 1, wx.EXPAND)
		
		self.SetAutoLayout(True)
		self.SetSizer(self.theSizer)

#*************************************************
#This is the main panel,
#Where all the sizing stuff happens.

class drMainPanel(wx.Panel):
	def __init__(self, parent, id):
		wx.Panel.__init__(self, parent, id)
		
		self.panelsizesfile = parent.userpreferencesdirectory + '/drpython.panel.sizes.dat'
		
		self.parent = parent
		
		width, height = self.GetSizeTuple()
		
		#Variables to Keep Track of what is being used.
			
		self.ID_DOCUMENT = 6001
		self.ID_PROMPT = 6002
		self.ID_LEFT = 6003
		self.ID_RIGHT = 6004
		self.ID_TOP = 6005
		
		self.PromptIsVisible = self.parent.prefs.promptisvisible
		self.LeftIsVisible = False
		self.RightIsVisible = False
		self.TopIsVisible = False
				
		self.documenttuple = (width, height)	
		self.prompttuple = (0, 0)
		self.lefttuple = (0, 0)
		self.righttuple = (0, 0)
		self.toptuple = (0, 0)

		self.promptsize = self.parent.prefs.promptsize

		self.prompt = drSashWindow(self, self.ID_PROMPT, wx.DefaultPosition, wx.DefaultSize, wx.SW_3D)

		self.prompt.SetSashVisible(wx.SASH_TOP, True)
		self.prompt.SetSashBorder(wx.SASH_TOP, True)

		self.document = drSashWindow(self, self.ID_DOCUMENT, wx.DefaultPosition, wx.DefaultSize, wx.SW_3D)

		self.document.SetSashVisible(wx.SASH_BOTTOM, True)
		self.document.SetSashBorder(wx.SASH_BOTTOM, True)

		self.leftsize = self.parent.prefs.sidepanelleftsize
		
		self.left = drSashWindow(self, self.ID_LEFT, wx.DefaultPosition, wx.DefaultSize, wx.SW_3D)
		
		self.rightsize = self.parent.prefs.sidepanelrightsize

		self.right = drSashWindow(self, self.ID_RIGHT, wx.DefaultPosition, wx.DefaultSize, wx.SW_3D)

		self.topsize = self.parent.prefs.sidepaneltopsize

		self.top = drSashWindow(self, self.ID_TOP, wx.DefaultPosition, wx.DefaultSize, wx.SW_3D)
		
		self.document.SetSashVisible(wx.SASH_LEFT, True)
		self.document.SetSashBorder(wx.SASH_LEFT, True)
		self.document.SetSashVisible(wx.SASH_RIGHT, True)
		self.document.SetSashBorder(wx.SASH_RIGHT, True)
		self.document.SetSashVisible(wx.SASH_TOP, True)
		self.document.SetSashBorder(wx.SASH_TOP, True)
		
		self.prompt.SetSashVisible(wx.SASH_LEFT, True)
		self.prompt.SetSashBorder(wx.SASH_LEFT, True)
		self.prompt.SetSashVisible(wx.SASH_RIGHT, True)
		self.prompt.SetSashBorder(wx.SASH_RIGHT, True)

		self.oldwidth, self.oldheight = 0, 0

		self.leftNotebook = drSidePanelNotebook(self.left, -1, 0)
		self.rightNotebook = drSidePanelNotebook(self.right, -1, 1)
		self.topNotebook = drSidePanelNotebook(self.top, -1, 1)

		self.left.SetNotebook(self.leftNotebook)
		self.right.SetNotebook(self.rightNotebook)
		self.top.SetNotebook(self.topNotebook)
		
		self.lidx = []
		self.ridx = []
		self.tidx = []

		self.OnSize(None)

		self.Bind(wx.EVT_SIZE, self.OnSize)
		self.Bind(wx.EVT_SASH_DRAGGED, self.OnSashDrag, id=self.ID_DOCUMENT)
		self.Bind(wx.EVT_SASH_DRAGGED, self.OnSashDrag, id=self.ID_PROMPT)

	def _getindex(self, Position, Index):
		#Left
		if Position == 0:
			if Index in self.lidx:
				Index = self.lidx.index(Index)
		#Right
		elif Position == 1:
			if Index in self.ridx:
				Index = self.ridx.index(Index)
		#Top
		else:
			if Index in self.tidx:
				Index = self.tidx.index(Index)
				
		return Index

	def ClosePanel(self, Position, Index):
		Index = self._getindex(Position, Index)
		
		#Left
		if Position == 0:
			self.leftNotebook.DeletePage(Index)
			self.lidx.pop(Index)
			if self.leftNotebook.GetPageCount() < 1:
				self.LeftIsVisible = False			
		#Right
		elif Position == 1:
			self.rightNotebook.DeletePage(Index)
			self.ridx.pop(Index)
			if self.rightNotebook.GetPageCount() < 1:
				self.RightIsVisible = False
		#Top
		else:
			self.topNotebook.DeletePage(Index)
			self.tidx.pop(Index)
			if self.topNotebook.GetPageCount() < 1:
				self.TopIsVisible = False
				
		wx.Yield()	
				
		self.OnSize(None)

	def GetTargetNotebookPage(self, Position=1, Title='  '):
		#Left
		if Position == 0:
			l = self.leftNotebook.GetPageCount()
			self.lidx.append(l)
			newpage = drSidePanel(self.leftNotebook, -1)
			self.leftNotebook.AddPage(newpage, Title, True)
			self.LeftIsVisible = True
		#Right
		elif Position == 1:
			l = self.rightNotebook.GetPageCount()
			self.ridx.append(l)
			newpage = drSidePanel(self.rightNotebook, -1)
			self.rightNotebook.AddPage(newpage, Title, True)
			self.RightIsVisible = True
		#Top
		else:
			l = self.topNotebook.GetPageCount()
			self.tidx.append(l)
			newpage = drSidePanel(self.topNotebook, -1)
			self.topNotebook.AddPage(newpage, Title, True)
			self.TopIsVisible = True
			
		return newpage, l			
	
	def IsVisible(self, Position=1, Index=0):
		Index = self._getindex(Position, Index)
	
		#Left
		if Position == 0:
			return (self.leftNotebook.GetSelection() == Index) and self.LeftIsVisible
		#Right
		elif Position == 1:
			return (self.rightNotebook.GetSelection() == Index) and self.RightIsVisible
		#Top
		else:
			return (self.topNotebook.GetSelection() == Index) and self.TopIsVisible
	
	def MemorizePanelSizes(self):
		if self.parent.prefs.rememberpanelsizes:
			try:
				f = file(self.panelsizesfile, 'wb')
				f.write(str(self.promptsize) + '\n' + str(self.leftsize) + '\n' + str(self.rightsize) + '\n' + str(self.topsize))
				f.close()			
			except:
				self.parent.ShowMessage('Error Memorizing Panel Sizes.')
						
	def OnSashDrag(self, event):
		evtheight = event.GetDragRect().height
		evtwidth = event.GetDragRect().width
		width, height = self.GetSizeTuple()
		if (evtwidth < 0):
			evtwidth = 0
		elif (evtwidth > width):
			evtwidth = width
		if event.GetDragStatus() == wx.SASH_STATUS_OUT_OF_RANGE:
			if (not self.PromptIsVisible) or (evtheight < height):
				evtheight = 0
			else:
				evtheight = height
		elif evtheight > height:
			evtheight = height

		oldsize = self.promptsize
		loldsize = self.leftsize
		roldsize = self.rightsize
		toldsize = self.topsize

		#Edge Drag
		e = event.GetId()
		edge = event.GetEdge()
		if edge == wx.SASH_LEFT:
			self.leftsize = ((width*100) - (evtwidth*100)) / width
		elif edge == wx.SASH_RIGHT:
			self.rightsize = ((width*100) - (evtwidth*100)) / width
		elif e == self.ID_DOCUMENT:
			if edge == wx.SASH_BOTTOM:
				self.promptsize = ((height*100) - (evtheight*100)) / height
				self.documenttuple = (self.documenttuple[0], evtheight)
				self.prompttuple = (self.prompttuple[0], height-evtheight)
			elif edge == wx.SASH_TOP:
				self.topsize = ((height*100) - (evtheight*100)) / height
		elif e == self.ID_PROMPT:
			self.promptsize = ((evtheight*100) / height)
					
		#Prompt Is Visible
		if self.promptsize == 0:
			self.promptsize = oldsize
			self.PromptIsVisible = False
		elif not self.PromptIsVisible and self.prompttuple[1] > 0:
			self.PromptIsVisible = True
					
		#Left Is Visible
		if self.leftsize == 0:
			self.leftsize = loldsize
			self.LeftIsVisible = False
		elif not self.LeftIsVisible and self.lefttuple[0] > 0:
			self.LeftIsVisible = True
					
		#Right Is Visible
		if self.rightsize == 0:
			self.rightsize = roldsize
			self.RightIsVisible = False
		elif not self.RightIsVisible and self.righttuple[0] > 0:
			self.RightIsVisible = True

		#Top Is Visible
		if self.topsize == 0:
			self.topsize = toldsize
			self.TopIsVisible = False
		elif not self.TopIsVisible and self.toptuple[1] > 0:
			self.TopIsVisible = True
			
		self.OnSize(None)

	def OnSize(self, event):
		width, height = self.GetSizeTuple()

		if (event is not None) and (width == self.oldwidth) and (height == self.oldheight):
			return
		self.oldwidth, self.oldheight = width, height
		
		#Height
		
		heightPrompt = 0
		heightTop = 0
		
		if self.TopIsVisible:
			heightTop = (height * self.topsize) / 100
		if self.PromptIsVisible:
			heightPrompt = (height * self.promptsize) / 100
			
		heightDocument = height - heightTop - heightPrompt
		
		if heightPrompt != 100:
			if heightDocument < 50:
				if heightTop > 0:
					heightTop = heightTop / 2
				if heightPrompt > 0:
					heightPrompt = heightPrompt / 2					
				heightDocument += heightTop + heightPrompt
			
			
		#Width
		widthLeft = 0
		widthRight = 0
		
		if self.LeftIsVisible:
			widthLeft = (width * self.leftsize) / 100
		if self.RightIsVisible:
			widthRight = (width * self.rightsize) / 100
			
		widthMain = width - widthLeft - widthRight
		
		if widthMain < 50:
			if widthLeft > 0:
				widthLeft = widthLeft / 2
			if widthRight > 0:
				widthRight = widthRight / 2
			widthMain += widthLeft + widthRight
		
		#Tuples
		self.documenttuple = (widthMain, heightDocument)
		self.prompttuple = (widthMain, heightPrompt)
		self.lefttuple = (widthLeft, height)
		self.righttuple = (widthRight, height)
		self.toptuple = (widthMain, heightTop)

		#Set Move, Then Set Size
		self.document.Move((widthLeft,heightTop))
		self.prompt.Move((widthLeft, heightDocument+heightTop))
		self.left.Move((0, 0))
		self.right.Move((widthLeft+widthMain, 0))
		self.top.Move((widthLeft, 0))
		
		self.document.SetSize(self.documenttuple)
		self.prompt.SetSize(self.prompttuple)
		self.left.SetSize(self.lefttuple)
		self.right.SetSize(self.righttuple)
		self.top.SetSize(self.toptuple)

	def RememberPanelSizes(self):
		if self.parent.prefs.rememberpanelsizes:
			if not os.path.exists(self.panelsizesfile):
				return
			try:
				f = file(self.panelsizesfile, 'rb')
				text = f.read()
				f.close()
				p, l, r, t = map(int, text.split('\n'))
				self.promptsize = p
				self.leftsize = l
				self.rightsize = r
				self.topsize = t
			except:
				self.parent.ShowMessage('Error Remembering Panel Sizes.\nThe File: "%s" may be corrupt.\nTry removing it, and restarting DrPython.' % self.panelsizesfile)

	def SetPanelSize(self, Position, size):
		if Position == 0:
			self.leftsize = size
		elif Position == 1:
			self.rightsize = size
		else:
			self.topsize = size

	def ShowPanel(self, Position, Index, Show=True):
		Index = self._getindex(Position, Index)

		#Left
		if Position == 0:
			self.LeftIsVisible = Show
			if self.LeftIsVisible:
				self.leftNotebook.SetSelection(Index)
				self.leftNotebook.GetPage(Index).OnSize(None)
		#Right
		elif Position == 1:
			self.RightIsVisible = Show
			if self.RightIsVisible:				
				self.rightNotebook.SetSelection(Index)
				self.rightNotebook.GetPage(Index).OnSize(None)
		#Top
		else:
			self.TopIsVisible = Show
			if self.TopIsVisible:				
				self.topNotebook.SetSelection(Index)
				self.topNotebook.GetPage(Index).OnSize(None)
		self.OnSize(None)
			
	def TogglePanel(self, Position=1, Index=0):
		Index = self._getindex(Position, Index)

		#Left
		if Position == 0:
			if not self.LeftIsVisible:
				self.LeftIsVisible = True
				self.leftNotebook.SetSelection(Index)
			else:
				self.LeftIsVisible = False
		#Right
		elif Position == 1:
			if not self.RightIsVisible:
				self.RightIsVisible = True
				self.rightNotebook.SetSelection(Index)
			else:
				self.RightIsVisible = False
		#Top
		else:
			if not self.TopIsVisible:
				self.TopIsVisible = True
				self.topNotebook.SetSelection(Index)
			else:
				self.TopIsVisible = False
		self.OnSize(None)

#*************************************************

def _refresh(x):
	x.Refresh()

#*******************************************************************************************************
#Notebook base class

class drNotebook(wx.Notebook):
	def __init__(self, parent, id, images, closefunction):
		wx.Notebook.__init__(self, parent, id, wx.DefaultPosition, wx.Size(-1, -1), wx.CLIP_CHILDREN)
		
		self.parent = parent
		
		self.grandparent = parent.parent
		
		self.closefunction = closefunction
		
		if len(images) > 0:		
			imagesize = (16,16)
			
			self.imagelist = wx.ImageList(imagesize[0], imagesize[1])
			self.images = images
			
			map(self.imagelist.Add, self.images)
		
			self.AssignImageList(self.imagelist)
		
		#wxPython bug workaround, OldSelection doesn't work.
		self.oldselection = 0
	
	def OnLeftDoubleClick(self, event):
		if self.grandparent.prefs.doubleclicktoclosetab:
			self.closefunction(None)

#*************************************************
#Document Notebook

class drDocNotebook(drNotebook):
	def __init__(self, parent, id):
		grandparent = parent.parent
		images = [wx.BitmapFromImage(wx.Image(grandparent.bitmapdirectory + "/16/unmodified.png", wx.BITMAP_TYPE_PNG)),
		wx.BitmapFromImage(wx.Image(grandparent.bitmapdirectory + "/16/modified.png", wx.BITMAP_TYPE_PNG)),
		wx.BitmapFromImage(wx.Image(grandparent.bitmapdirectory + "/16/active unmodified.png", wx.BITMAP_TYPE_PNG)),
		wx.BitmapFromImage(wx.Image(grandparent.bitmapdirectory + "/16/active modified.png", wx.BITMAP_TYPE_PNG))]
				
		drNotebook.__init__(self, parent, id, images, grandparent.OnClose)
				
		self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
		self.Bind(wx.EVT_RIGHT_DOWN, self.OnPopUp)
		self.Bind(wx.EVT_LEFT_UP, self.OnSelectTab)
		self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDoubleClick)

	def OnPageChanged(self, event):
		if len(self.grandparent.txtDocumentArray) == 0:
			if event is not None:
				event.Skip()
			return
		if event is not None:
			i = event.GetSelection()
		else:
			i = self.GetSelection()
		l = self.GetPageCount()
		if (i < 0) or (i >= l):
			if event is not None:
				event.Skip()
			return
		if self.oldselection < l:
			self.grandparent.txtDocumentArray[self.oldselection].IsActive = False
			self.grandparent.txtDocumentArray[self.oldselection].OnModified(None)
		
		self.oldselection = i
		
		self.grandparent.txtDocumentArray[i].IsActive = True
		self.grandparent.txtDocumentArray[i].OnModified(None)
		
		if event is not None:
			event.Skip()
		
	def OnPopUp(self, event):
			
		tabmenu = wx.Menu()
		tabmenu.Append(self.grandparent.ID_CLOSE, "&Close")
		tabmenu.Append(self.grandparent.ID_CLOSE_ALL, "Close &All Tabs")
		tabmenu.Append(self.grandparent.ID_CLOSE_ALL_OTHER_DOCUMENTS, "Close All &Other Tabs")
		tabmenu.AppendSeparator()
		tabmenu.Append(self.grandparent.ID_NEXT_DOCUMENT, "Next Tab")
		tabmenu.Append(self.grandparent.ID_PREVIOUS_DOCUMENT, "Previous Tab")
		tabmenu.Append(self.grandparent.ID_FIRST_DOCUMENT, "First Tab")
		tabmenu.Append(self.grandparent.ID_LAST_DOCUMENT, "Last Tab")
		tabmenu.AppendSeparator()
		tabmenu.Append(self.grandparent.ID_RELOAD, "&Reload File")
		tabmenu.Append(self.grandparent.ID_RESTORE_FROM_BACKUP, "&Restore From Backup")
		tabmenu.AppendSeparator()
		tabmenu.Append(self.grandparent.ID_SAVE, "&Save")
		tabmenu.Append(self.grandparent.ID_SAVE_AS, "Save &As...")
		
		ht = self.HitTest(event.GetPosition())[0]
		if ht > -1:
			self.SetSelection(ht)
			self.SetTab()
		
		tabmenu.Enable(self.grandparent.ID_RELOAD, len(self.grandparent.txtDocument.filename) > 0)
		tabmenu.Enable(self.grandparent.ID_RESTORE_FROM_BACKUP, len(self.grandparent.txtDocument.filename) > 0)
		self.PopupMenu(tabmenu, event.GetPosition())
		tabmenu.Destroy()
			
	def OnSelectTab(self, event):
		selection = self.GetSelection()
		if selection is not self.grandparent.docPosition:
			self.SetTab()
		event.Skip()
	
	def SetTab(self):
		selection = self.GetSelection()
		if selection != -1:
			self.grandparent.setDocumentTo(selection)

#*************************************************
#Prompt Notebook
	
class drPromptNotebook(drNotebook):
	def __init__(self, parent, id):
		grandparent = parent.parent
		images = [wx.BitmapFromImage(wx.Image(grandparent.bitmapdirectory + "/16/not running.png", wx.BITMAP_TYPE_PNG)),
		wx.BitmapFromImage(wx.Image(grandparent.bitmapdirectory + "/16/running.png", wx.BITMAP_TYPE_PNG)),
		wx.BitmapFromImage(wx.Image(grandparent.bitmapdirectory + "/16/active not running.png", wx.BITMAP_TYPE_PNG)),
		wx.BitmapFromImage(wx.Image(grandparent.bitmapdirectory + "/16/active running.png", wx.BITMAP_TYPE_PNG))]
		
		drNotebook.__init__(self, parent, id, images, grandparent.OnClosePrompt)
				
		self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
		self.Bind(wx.EVT_LEFT_UP, self.OnSelectTab)
		self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDoubleClick)		
		self.Bind(wx.EVT_RIGHT_DOWN, self.OnPopUp)
		
	def OnPageChanged(self, event):
		if len(self.grandparent.txtPromptArray) == 0:
			if event is not None:
				event.Skip()
			return
		if event is not None:
			i = event.GetSelection()
		else:
			i = self.GetSelection()
		l = self.GetPageCount()
		if (i < 0) or (i >= l):
			if event is not None:
				event.Skip()
			return
		if self.oldselection < l:
			if self.grandparent.txtPromptArray[self.oldselection].pid > -1:
				self.SetPageImage(self.oldselection, 1)
			else:				
				self.SetPageImage(self.oldselection, 0)
		
		self.oldselection = i
		
		if self.grandparent.txtPromptArray[i].pid > -1:
			self.SetPageImage(i, 3)
		else:				
			self.SetPageImage(i, 2)
		
		if event is not None:
			event.Skip()
			
	def OnSelectTab(self, event):
		selection = self.GetSelection()
		if selection is not self.grandparent.promptPosition:
			self.SetTab()
		event.Skip()
	
	def SetTab(self):
		selection = self.GetSelection()
		if selection != -1:
			self.grandparent.setPromptTo(selection)
		
	def OnPopUp(self, event):
	
		tabmenu = wx.Menu()
		tabmenu.Append(self.grandparent.ID_CLOSE_PROMPT, "&Close Prompt")
		tabmenu.AppendSeparator()
		tabmenu.Append(self.grandparent.ID_PYTHON, "&Python")
		tabmenu.Append(self.grandparent.ID_RUN, "&Run Current Document")
		tabmenu.Append(self.grandparent.ID_END, "&End")
		
		ht = self.HitTest(event.GetPosition())[0]
		if ht > -1:
			self.SetSelection(ht)
			self.SetTab()
		
		tabmenu.Enable(self.grandparent.ID_RUN, (len(self.grandparent.txtDocument.filename) > 0))
		tabmenu.Enable(self.grandparent.ID_END, (self.grandparent.txtPrompt.pid > -1))
		self.PopupMenu(tabmenu, event.GetPosition())
		tabmenu.Destroy()

#*************************************************
#Notebook to be used in the side panels.
			
class drSidePanelNotebook(drNotebook):
	def __init__(self, parent, id, Position):		
		self.parent = parent.parent
		
		self.PanelPosition = Position
				
		self.ID_CLOSE = 50
		
		drNotebook.__init__(self, parent, id, [], self.OnClose)
		
		self.grandparent = self.GetParent().GetParent()
		
		self.Bind(wx.EVT_MENU, self.OnClose, id=self.ID_CLOSE)
				
		self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
		self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDoubleClick)		
		self.Bind(wx.EVT_RIGHT_DOWN, self.OnPopUp)
		self.Bind(wx.EVT_SIZE, self.OnSize)
	
	def OnClose(self, event):
		if self.GetPageCount() > 0:
			self.grandparent.ClosePanel(self.PanelPosition, self.GetSelection())
			self.grandparent.OnSize(None)			
	
	def OnPageChanged(self, event):
		sel = self.GetSelection()
		
		if sel > -1:
			self.GetPage(sel).OnSize(None)
			
		event.Skip()

							
	def OnSize(self, event):
		if event is not None:
			if self.GetPageCount() > 0:
				self.GetPage(self.GetSelection()).SetSize(self.GetSize())
			event.Skip()
		
	def OnPopUp(self, event):
	
		tabmenu = wx.Menu()
		tabmenu.Append(self.ID_CLOSE, "&Close Panel")
		
		ht = self.HitTest(event.GetPosition())[0]
		if ht > -1:
			self.SetSelection(ht)
		
		self.PopupMenu(tabmenu, event.GetPosition())
		tabmenu.Destroy()
		
#*************************************************
#Panel class for panels with a single stc.

class drPanel(wx.Panel):
	def __init__(self, parent, id):
		wx.Panel.__init__(self, parent, id)
		
		self.grandparent = parent.GetGrandParent()
		
		self.stc = None

		self.Bind(wx.EVT_SIZE, self.OnSize)
		self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

	def OnKeyDown(self, event):
		self.grandparent.RunShortcuts(event)
		
	def OnSize(self, event):
		if self.stc is not None:
			self.stc.SetSize(self.GetSize())
		if event is not None:
			event.Skip()
		
	def SetSTC(self, stc):
		self.stc = stc

#*************************************************
#Panel class for side panels.

class drSidePanel(wx.Panel):
	def __init__(self, parent, id):
		wx.Panel.__init__(self, parent, id)
		
		self.panel = None
		
		self.parent = parent
				
		self.grandparent = parent.GetGrandParent()
		
		self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
		self.Bind(wx.EVT_SIZE, self.OnSize)
							
	def OnSize(self, event):
		if self.panel is not None:
			self.panel.SetSize(self.GetSize())
		if event is not None:
			event.Skip()
						
	def OnKeyDown(self, event):
		self.grandparent.RunShortcuts(event)
		
	def SetPanel(self, panel):
		self.panel = panel

#*************************************************
#View In Panel

class drSplitTextPanel(wx.Panel):
	def __init__(self, parent, grandparent, targetstc, position, index):
		docid = grandparent.txtDocument.GetId()
		wx.Panel.__init__(self, parent, docid)
		
		ID_CLOSE = grandparent.GetNewId()
		
		self.position = position
		self.index = index
		
		self.parent = parent
				
		self.grandparent = grandparent
		
		if docid == targetstc.GetId():
			sv = -1
		else:
			sv = 1
		
		self.txtDoc = DrText(self, docid, grandparent, SplitView=sv)
		self.txtDoc.SetupPrefsDocument()
		self.txtDoc.SetDocPointer(targetstc.GetDocPointer())
		self.txtDoc.GotoPos(targetstc.GetCurrentPos())
		self.txtDoc.ScrollToLine(targetstc.GetCurrentLine())
		
		self.label = wx.TextCtrl(self, -1, " Viewing: " + targetstc.GetFilenameTitle(), size=(150, -1), style=wx.TE_READONLY)
		
		self.btnClose = wx.Button(self, ID_CLOSE, "Close")
		
		self.topSizer = wx.BoxSizer(wx.HORIZONTAL)
		self.theSizer = wx.BoxSizer(wx.VERTICAL)
		
		self.topSizer.Add(self.label, 1, wx.EXPAND)
		self.topSizer.Add(self.btnClose, 0, wx.SHAPED | wx.ALIGN_RIGHT)
		
		self.theSizer.Add(self.topSizer, 0, wx.EXPAND)
		self.theSizer.Add(self.txtDoc, 1, wx.EXPAND)
		
		self.SetAutoLayout(True)
		self.SetSizer(self.theSizer)		
		
		text = self.txtDoc.GetText()
		
		#Scrolling
		bufferstring = drEncoding.EncodeText(self.grandparent, '000', self.txtDoc.GetEncoding())
		lines = text.split(self.txtDoc.GetEndOfLineCharacter())
		spaces = "\t".expandtabs(self.grandparent.prefs.doctabwidth[self.txtDoc.filetype])
		line = ""
		length = 0
		for l in lines:
			if len(l) > length:
				length = len(l)
				line = l
		line = line.replace('\t', spaces)
		self.txtDoc.SetScrollWidth(self.txtDoc.TextWidth(wx.stc.STC_STYLE_DEFAULT, line + bufferstring))
								
		self.txtDoc.SetXOffset(0)
		#/End Scrolling
				
		self.Bind(wx.EVT_BUTTON, self.OnbtnClose, id=ID_CLOSE)		
		self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

	def OnbtnClose(self, event):
		self.grandparent.mainpanel.ClosePanel(self.position, self.index)
										
	def OnKeyDown(self, event):
		self.grandparent.RunShortcuts(event)

syntax highlighted by Code2HTML, v. 0.9.1