#	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
	
#Bookmarks Dialog

import wx
import drScrolledMessageDialog
import drFileDialog
from drProperty import *
from drTreeDialog import *

def BuildTreeFromString(dialog, branch, thestring):
	line = " "
	roots = [branch]
	rootindex = 0
	lastCount = 1
	i = 0
	lastI = 0
	#Skip the First Line
	i = thestring.find('\n')
	if (i > -1):
		line = thestring[0:(i + 1)]
		lastI = i + 1
	thestring = thestring[lastI:]
	#Get On With It!
	while (len(line) > 0):
		i = thestring.find('\n')
		if (i > -1):
			line = thestring[0:(i + 1)]
			lastI = i + 1
			thestring = thestring[lastI:]
			c = line.count('\t')
			line = line[c:].rstrip()
			while (lastCount > c):
				roots.pop()
				rootindex = rootindex - 1
				lastCount = lastCount - 1
			currentItem = dialog.datatree.AppendItem(roots[rootindex], line)
			if (line[0] == '>'):
				dialog.datatree.SetItemImage(currentItem, 0, wx.TreeItemIcon_Normal)
				dialog.datatree.SetItemImage(currentItem, 1, wx.TreeItemIcon_Expanded)
				roots.append(currentItem)
				rootindex = rootindex + 1
				lastCount = c + 1
			else:
				dialog.datatree.SetItemImage(currentItem, 2, wx.TreeItemIcon_Normal)
				dialog.datatree.SetItemImage(currentItem, 2, wx.TreeItemIcon_Selected)			
		else:
			line = ""

def WriteBranch(tree, branch, filehandle, tablevel):
	t = tree.GetItemText(branch)
	isfolder = (t[0] == '>')
	x = 0
	y = ""
	while (x < tablevel):
		y = y + '\t'
		x = x + 1
	y = y + t + "\n"
	filehandle.write(y)
	if isfolder:
		ccount = tree.GetChildrenCount(branch, 0)
		if (ccount > 0):
			if (wx.MAJOR_VERSION >= 2) and (wx.MINOR_VERSION >= 5):
				b, cookie = tree.GetFirstChild(branch)
			else:
				b, cookie = tree.GetFirstChild(branch, 1)
			WriteBranch(tree, b, filehandle, (tablevel + 1))
			x = 1
			while (x < ccount):
				b, cookie = tree.GetNextChild(branch, cookie)
				WriteBranch(tree, b, filehandle, (tablevel + 1))
				x = x + 1

class drBookmarksDialog(drTreeDialog):

	def __init__(self, parent, bookmarksfile):
		
		drTreeDialog.__init__(self, parent, 'Edit Bookmarks', 'Bookmarks', bookmarksfile, parent.prefs.bookmarksstyle, \
		'bookmarksdialog.sizeandposition.dat', parent.bitmapdirectory + '/16/bookmark.png', BuildTreeFromString, WriteBranch)
		
		self.ID_ADD = 1001
		
		self.btnAdd = wx.Button(self, self.ID_ADD, "&Add")
		
		self.cmdSizer.Prepend(self.btnAdd, 0, wx.SHAPED)
		
		self.SetupSizer()
		
		self.Bind(wx.EVT_BUTTON,  self.OnbtnAdd, id=self.ID_ADD)	
				
	def OnbtnAdd(self, event):
		sel = self.datatree.GetSelection()
		if (not sel.IsOk()):
			if self.datatree.GetCount() < 2:
				sel = self.datatree.GetRootItem()
			else:
				return				
		if (self.datatree.GetItemText(sel)[0] == '>'):
			d = wx.SingleChoiceDialog(self, "Add Bookmark:", "Add Bookmark", ["Select Directory", "Select File", "Type It In"], wx.OK|wx.CANCEL)
			d.SetSize(wx.Size(250, 200))
			answer = d.ShowModal()
			d.Destroy()
			if (answer == wx.ID_OK):
				s = d.GetStringSelection()
				currentItem = None
				if (s == "Type It In"):
					d = wx.TextEntryDialog(self, 'Enter Bookmark:', 'Add Bookmark', '')
					if (d.ShowModal() == wx.ID_OK):
						v = d.GetValue()
						currentItem = self.datatree.AppendItem(sel, v.replace('\\', '/'))
					d.Destroy()
				elif (s == "Select Directory"):
					d = wx.DirDialog(self, "Select Directory:", style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON|wx.MAXIMIZE_BOX|wx.THICK_FRAME)
					if (len(self.parent.ddirectory) > 0):
						try:
							d.SetPath(self.parent.ddirectory)			
						except:
							de = drScrolledMessageDialog.ScrolledMessageDialog(self.parent, ("Error Setting Default Directory To: " + self.parent.ddirectory), "DrPython Error")
							de.ShowModal()
							de.Destroy()
					if d.ShowModal() == wx.ID_OK:
						currentItem = self.datatree.AppendItem(sel, d.GetPath().replace('\\', '/'))
					d.Destroy()
				else:
					dlg = drFileDialog.FileDialog(self.parent, "Select File", self.wildcard)
					if (len(self.parent.ddirectory) > 0):
						try:
							dlg.SetDirectory(self.parent.ddirectory)			
						except:
							drScrolledMessageDialog.ShowMessage(self.parent, ("Error Setting Default Directory To: " + self.parent.ddirectory), "DrPython Error")
					if (dlg.ShowModal() == wx.ID_OK):
						currentItem = self.datatree.AppendItem(sel, dlg.GetPath().replace("\\", "/"))
					dlg.Destroy()
					
				if currentItem is not None:
					self.datatree.SetItemImage(currentItem, 2, wx.TreeItemIcon_Normal)
					self.datatree.SetItemImage(currentItem, 2, wx.TreeItemIcon_Selected)
				self.datatree.SetModified()
		else:
			drScrolledMessageDialog.ShowMessage(self, "You can only add a bookmark to a folder.\nSelect either \"Bookmarks\", or a folder.", "Bad Bookmark Folder")

syntax highlighted by Code2HTML, v. 0.9.1