#!/usr/bin/env python
from wxPython.lib.dialogs import wxScrolledMessageDialog
from wxPython import wx
import sys, os, string, glob, commands
from stat import *
from pyTree1 import *
from pyTree2 import *
from FileFrame import *
from MarkedFiles import *

GlobalObjList = []
project = ''

global MarkSubSetFiles, MarkSubSetItems, mf, item, obj

MarkSubSetFiles = []
MarkSubSetItems = []

mf = 0

#-------------------------------class Obj---------------------------------------
class Obj:
	def __init__(self, obj):
		self.obj = obj
		# Uncomment next line to eliminate crash.
		# GlobalObjList.append(self)

	def Name(self):
		head, tail = os.path.split(self.obj)
		if tail:
			return tail
		else:
			return head
   
	def HasChildren(self):
		return os.path.isdir(self.obj)
																										
	def Children(self):
		objList = os.listdir(self.obj)
		objList.sort()
		objList = map(lambda obj,parent=self.obj: os.path.join(parent,obj), objList)
		objectList = map(Obj, objList)
		return objectList
	
	def __str__(self):
		return self.obj
	
	def __repr__(self):
		return self.obj

#	def __del__(self):
#		print 'del', self.obj

	def SetOutput(self, output):
		self.output = output
	 

#------------------------------class MyFrame----------------------------------------

if __name__ == '__main__':

	class MyFrame(wx.wxFrame):
		def __init__(self):
			self.papa = self
			wx.wxFrame.__init__(self, wx.NULL, -1, 'Formating SubSet FS',
					wx.wxDefaultPosition, wx.wxSize(600,500))
			font = wx.wxFont(8, wx.wxSWISS, wx.wxNORMAL, wx.wxNORMAL)
			self.SetFont(font)

			#st = self.CreateStatusBar()
			list = [2, -1]
                        #st.SetFieldsCount(2)
			self.SetStatusWidths(list)
			self.SetStatusText("", 0)

			self.sizer = wx.wxBoxSizer(wx.wxVERTICAL)
			self.SetSizer(self.sizer)

			self.split = wx.wxSplitterWindow(self, -1)
			self.sizer.Add(self.split,1,wx.wxEXPAND,1)

			self.p1 = wx.wxPanel(self.split, -1)
			self.p2 = wx.wxPanel(self.split, -1)
			self.split.SplitVertically(self.p1, self.p2, 300)

                        self.p1Sizer = wx.wxBoxSizer(wx.wxVERTICAL)
                        self.p1.SetSizer(self.p1Sizer)

                        self.p2Sizer = wx.wxBoxSizer(wx.wxVERTICAL)
                        self.p2.SetSizer(self.p2Sizer)

			# Create menu bar.
			menuBar = wx.wxMenuBar()

			# 1st menu from left
			self.menu1 = wx.wxMenu()
			self.IdF1 = wx.wxNewId()
			self.menu1.Append(self.IdF1, "&New project", "New project")
			self.IdF2 = wx.wxNewId()
			self.menu1.Append(self.IdF2, "&Open project", "Open project")
			self.menu1.AppendSeparator()
			self.IdF3 = wx.wxNewId()
			self.menu1.Append(self.IdF3, "&Save", "Save project")
			self.menu1.Enable(self.IdF3, wx.FALSE)
			self.IdF4 = wx.wxNewId()
			self.menu1.Append(self.IdF4, "Save &As", "Save project as")
			self.menu1.Enable(self.IdF4, wx.FALSE)
			self.menu1.AppendSeparator()
			self.IdF5 = wx.wxNewId()
			self.menu1.Append(self.IdF5, "&*Page Setup", "Page Setup")
			self.menu1.Enable(self.IdF5, wx.FALSE)
			self.IdF6 = wx.wxNewId()
			self.menu1.Append(self.IdF6, "&*Print Preview", "Print Preview")
			self.menu1.Enable(self.IdF6, wx.FALSE)
			self.IdF7 = wx.wxNewId()
			self.menu1.Append(self.IdF7, "&*Printer Setup", "Printer Setup")
			self.menu1.Enable(self.IdF7, wx.FALSE)
			self.IdF8 = wx.wxNewId()
			self.menu1.Append(self.IdF8, "&*Print File", "Print File")
			self.menu1.Enable(self.IdF8, wx.FALSE)
			self.menu1.AppendSeparator()
			self.IdF9 = wx.wxNewId()
			self.menu1.Append(self.IdF9, "&Close", "Close this frame")
			# Add menu to the menu bar
			menuBar.Append(self.menu1, "&File")

			# 2nd menu from left
			self.menu2 = wx.wxMenu()
			self.IdE1 = wx.wxNewId()
			self.menu2.Append(self.IdE1, "&Mark", "Mark")
			self.menu2.Enable(self.IdE1, wx.FALSE)
			self.IdE2 = wx.wxNewId()
			self.menu2.Append(self.IdE2, "&UnMark", "UnMark")
			self.menu2.Enable(self.IdE2, wx.FALSE)
			self.IdE3 = wx.wxNewId()
			self.menu2.Append(self.IdE3, "UnMark &All", "UnMark All")
			self.menu2.Enable(self.IdE3, wx.FALSE)
			self.menu2.AppendSeparator()
			self.IdE4 = wx.wxNewId()
			self.menu2.Append(self.IdE4, "&View file", "View file")
			self.menu2.Enable(self.IdE4, wx.FALSE)
			self.IdE5 = wx.wxNewId()
			self.menu2.Append(self.IdE5, "View Marked &files", "View Marked files")
			self.menu2.Enable(self.IdE5, wx.FALSE)
			self.menu2.AppendSeparator()
			self.IdE6 = wx.wxNewId()
			self.menu2.Append(self.IdE6, "Copy", "Copy")
			self.menu2.Enable(self.IdE6, wx.FALSE)
			# Append 2nd menu
			menuBar.Append(self.menu2, "&Edit")

			# 3nd menu from left
			self.menu3 = wx.wxMenu()
			self.IdV1 = wx.wxNewId()
			self.menu3.Append(self.IdV1, "*View package", "View package" )
			self.menu3.Enable(self.IdV1, wx.FALSE)
			self.IdV2 = wx.wxNewId()
			self.menu3.Append(self.IdV2, "*View disk usage", "View disk usage")
			self.menu3.Enable(self.IdV2, wx.FALSE)
			self.IdV3 = wx.wxNewId()
			self.menu3.Append(self.IdV3, "*Test", "Test")
			self.menu3.Enable(self.IdV3, wx.FALSE)
			self.menu3.AppendSeparator()
			self.IdV4 = wx.wxNewId()
			self.menu3.Append(self.IdV4, "*Test", "Test")
			self.menu3.Enable(self.IdV4, wx.FALSE)
			self.IdV5 = wx.wxNewId()
			self.menu3.Append(self.IdV5, "*Test", "Test")
			self.menu3.Enable(self.IdV5, wx.FALSE)
			# Add menu to the menu bar
			menuBar.Append(self.menu3, "&View")

			# 4nd menu from left
			self.menu4 = wx.wxMenu()
			self.IdT1 = wx.wxNewId()
			self.menu4.Append(self.IdT1, "*Tool 1", "Tool 1")
			self.menu4.Enable(self.IdT1, wx.FALSE)
			self.IdT2 = wx.wxNewId()
			self.menu4.Append(self.IdT2, "*Tool 2", "Tool 2")
			self.menu4.Enable(self.IdT2, wx.FALSE)
			self.IdT3 = wx.wxNewId()
			self.menu4.Append(self.IdT3, "*Tool 3", "Tool 3")
			self.menu4.Enable(self.IdT3, wx.FALSE)
			# Add menu to the menu bar
			menuBar.Append(self.menu4, "&Tools")

			# 5nd menu from left
			self.menu5 = wx.wxMenu()
			self.IdH1 = wx.wxNewId()
			self.menu5.Append(self.IdH1, "*Help", "Help")
			self.menu5.Enable(self.IdH1, wx.FALSE)
			self.menu5.AppendSeparator()
			self.IdH2 = wx.wxNewId()
			self.menu5.Append(self.IdH2, "*About", "About")
			self.menu5.Enable(self.IdH2, wx.FALSE)
			# Add menu to the menu bar
			menuBar.Append(self.menu5, "&Help")
			self.SetMenuBar(menuBar)

			# Menu events
#			wx.EVT_SIZE(self, self.OnSizeChange)

			wx.EVT_MENU_HIGHLIGHT_ALL(self, self.OnMenuHighlight)

			wx.EVT_MENU(self, self.IdF1, self.FileNew)
			wx.EVT_MENU(self, self.IdF2, self.FileOpen)
			wx.EVT_MENU(self, self.IdF3, self.FileSave)
			wx.EVT_MENU(self, self.IdF4, self.FileSaveAs)
			wx.EVT_MENU(self, self.IdF5, self.FilePageSetup)
			wx.EVT_MENU(self, self.IdF6, self.FilePrintPreview)
			wx.EVT_MENU(self, self.IdF7, self.FilePrinter)
			wx.EVT_MENU(self, self.IdF8, self.FilePrint)
			wx.EVT_MENU(self, self.IdF9, self.CloseWindow)

			wx.EVT_MENU(self, self.IdE1, self.mPOPMark)
			wx.EVT_MENU(self, self.IdE2, self.mPOPUnMark)
			wx.EVT_MENU(self, self.IdE3, self.mPOPUnMarkAll)
			wx.EVT_MENU(self, self.IdE4, self.mPOPViewMarkFile)
			wx.EVT_MENU(self, self.IdE5, self.POPViewMarkedFiles)
			wx.EVT_MENU(self, self.IdE6, self.mPOPCopy)
	
			wx.EVT_MENU(self, self.IdV1, self.Menu301)
			wx.EVT_MENU(self, self.IdV2, self.Menu302)
			wx.EVT_MENU(self, self.IdV3, self.Menu303)
			wx.EVT_MENU(self, self.IdV4, self.Menu304)
			wx.EVT_MENU(self, self.IdV5, self.Menu305)

			wx.EVT_MENU(self, self.IdT1, self.Menu401)
			wx.EVT_MENU(self, self.IdT2, self.Menu402)
			wx.EVT_MENU(self, self.IdT3, self.Menu403)
        	
			wx.EVT_MENU(self, self.IdH1, self.Menu501)
			wx.EVT_MENU(self, self.IdH2, self.Menu502)
			

#------------------------------OnMenuHighlight---------------------------------
		def OnMenuHighlight(self, event):
			# Show how to get menu item imfo from this event handler
			id = event.GetMenuId()
			item = self.GetMenuBar().FindItemById(id)
			text = item.GetText()
			help = item.GetHelp()
			#print text, help
			event.Skip() # but in this case just call Skip so the default is done


#-------------------------------FileNew---------------------------------------
		def FileNew(self, event):
			wildcard = "Project file (*.afp)|*.afp|" \
						"All files (*.*)|*.*"

			dlg = wx.wxFileDialog(self, "Choose a new project", os.getcwd(), "", wildcard,
						wx.wxSAVE | wx.wxCHANGE_DIR)

			if dlg.ShowModal() == wx.wxID_OK:
				paths = dlg.GetPaths()
				if os.path.isfile(paths[0]):
					mes = wx.wxMessageDialog(self, 'File ' + paths[0] + ' exist!',
								'A Message Box', wx.wxOK )
					mes.ShowModal()
					mes.Destroy()
				else:
					if (paths[0][-4:] == '.afp'):
						fw=open(paths[0], 'wb')
						fw.write(paths[0] + '\n')
						self.project = paths[0]
						dlgSFS = wx.wxDirDialog(self, "Choose a SuperSet NFS directory:", os.getcwd(),
								style=wx.wxDD_DEFAULT_STYLE|wx.wxDD_NEW_DIR_BUTTON)
						if dlgSFS.ShowModal() == wx.wxID_OK:
							self.dirSFS = dlgSFS.GetPath()
							fw.write(self.dirSFS + '\n')
							dlgSFS.Destroy()
							dlgFS = wx.wxDirDialog(self, "Choose a SubSet NFS directory:", os.getcwd(),
									style=wx.wxDD_DEFAULT_STYLE|wx.wxDD_NEW_DIR_BUTTON)
							if dlgFS.ShowModal() == wx.wxID_OK:
								self.dirFS = dlgFS.GetPath()
								fw.write(self.dirFS + '\n')
								fw.close()
								dlgFS.Destroy()

							mf = 0
							# file system formating
							self.MarkSubSetFiles = []
							self.MarkSubSetItems = []
			                                self.sizer = wx.wxBoxSizer(wx.wxVERTICAL)
							self.treeSFS = pyTree1(self.p1, self.papa, -1, Obj(self.dirSFS))
                                                        self.p1Sizer.Add(self.treeSFS, 1, wx.wxEXPAND, 0)
                                                        self.p1Sizer.Layout()
							self.treeFS  = pyTree2(self.p2, self.papa, -1, Obj(self.dirFS))
                                                        self.p2Sizer.Add(self.treeFS, 1, wx.wxEXPAND, 0)
                                                        self.p2Sizer.Layout()

							#w1,h1 = self.p1.GetClientSizeTuple()
							#self.treeSFS.SetDimensions(0, 0, w1, h1)
							#w2,h2 = self.p2.GetClientSizeTuple()
							#self.treeFS.SetDimensions(0, 0, w2, h2)


#							self.menu1.Enable(self.IdF3, wx.TRUE)
#							self.menu1.Enable(self.IdF4, wx.TRUE)
							self.menu2.Enable(self.IdE1, wx.TRUE)
							self.menu2.Enable(self.IdE2, wx.FALSE)
							self.menu2.Enable(self.IdE3, wx.FALSE)
							self.menu2.Enable(self.IdE4, wx.TRUE)
							self.menu2.Enable(self.IdE5, wx.FALSE)
							self.menu2.Enable(self.IdE6, wx.FALSE)
									
						# file system formating

					else:
						mess = wx.wxMessageDialog(self, 'File ' + paths[0] + ' donot have .afp!',
								'A Message Box', wx.wxOK )
						mess.ShowModal()
						mess.Destroy()

			dlg.Destroy()


#---------------------------------------------FileOpen---------------------------------------
		def FileOpen(self, event):
			wildcard = "Project file (*.afp)|*.afp|" \
						"All files (*.*)|*.*"
	
			dlg = wx.wxFileDialog(self, "Choose a saved project", os.getcwd(), "", wildcard,
						wx.wxOPEN | wx.wxMULTIPLE | wx.wxCHANGE_DIR)
			if dlg.ShowModal() == wx.wxID_OK:
				paths = dlg.GetPaths()
				if os.path.isfile(paths[0]):
					fr = open(paths[0])
					self.project = fr.readline()[:-1]
					self.dirSFS  = fr.readline()[:-1]
					self.dirFS   = fr.readline()[:-1]
					fr.close()

					mf = 0
					# file system formating
					self.MarkSubSetFiles = []
					self.MarkSubSetItems = []
					self.treeSFS = pyTree1(self.p1, self.papa, -1, Obj(self.dirSFS))
                                        self.p1Sizer.Add(self.treeSFS, 1, wx.wxEXPAND, 0)
                                        self.p1Sizer.Layout()
					self.treeFS  = pyTree2(self.p2, self.papa, -1, Obj(self.dirFS))
                                        self.p2Sizer.Add(self.treeFS, 1, wx.wxEXPAND, 0)
                                        self.p2Sizer.Layout()

					#w1,h1 = self.p1.GetClientSizeTuple()
					#self.treeSFS.SetDimensions(0, 0, w1, h1)
					#w2,h2 = self.p2.GetClientSizeTuple()
					#self.treeFS.SetDimensions(0, 0, w2, h2)

#					self.menu1.Enable(self.IdF3, wx.TRUE)
#					self.menu1.Enable(self.IdF4, wx.TRUE)
					self.menu2.Enable(self.IdE1, wx.TRUE)
					self.menu2.Enable(self.IdE2, wx.FALSE)
					self.menu2.Enable(self.IdE3, wx.FALSE)
					self.menu2.Enable(self.IdE4, wx.TRUE)
					self.menu2.Enable(self.IdE5, wx.FALSE)
					self.menu2.Enable(self.IdE6, wx.FALSE)

				else:
					mes = wx.wxMessageDialog(self, 'Project File ' + project + ' NOT exist!',
							'A Message Box', wx.wxOK )
					mes.ShowModal()
					mes.Destroy()

			dlg.Destroy()

#-----------------------------------OnSizeChange-------------------------------------
		def OnSizeChange(self, event):
			if self.p1.GetChildren():
				self.treeSFS = pyTree1(self.p1, self.papa, -1, Obj(self.dirSFS))
				w1,h1 = self.p1.GetClientSizeTuple()
				self.treeSFS.SetDimensions(0, 0, w1, h1)

				self.treeFS  = pyTree2(self.p2, self.papa, -1, Obj(self.dirFS))
				w2,h2 = self.p2.GetClientSizeTuple()
				self.treeFS.SetDimensions(0, 0, w2, h2)


#-----------------------------------SFSdir-------------------------------------------
		def FSubDir(self):
			return self.dirFS


#-----------------------------------TreeFS-------------------------------------------
		def TreeFS(self):
			return self.treeFS


#-----------------------------------MenuItemEnable-----------------------------------
		def MenuAfterMark(self):
			self.menu2.Enable(self.IdE2, wx.TRUE)
			self.menu2.Enable(self.IdE3, wx.TRUE)
			self.menu2.Enable(self.IdE5, wx.TRUE)
			self.menu2.Enable(self.IdE6, wx.TRUE)
			
#-----------------------------------FileSave-----------------------------------------
		def FileSave(self, event):
			print 'MenuFileSaveProject: ' + project
			if not os.path.isfile(project):	
				mes = wx.wxMessageDialog(self, 'Project File ' + project + ' NOT exist!',
							'A Message Box', wx.wxOK )
				mes.ShowModal()
				mes.Destroy()

				self.MenuFileSaveAs(104)

#-----------------------------------FileSaveAs----------------------------------------
		def FileSaveAs(self, event):
			print 'MenuFileSaveAsProject: ' + project
			self.MenuFileNew(103)


#-----------------------------------FilePageSetup-------------------------------------
		def FilePageSetup(self, event):
			data = wx.wxPrintDialogData()
			data.EnableSelection(True)
			data.EnablePrintToFile(True)
			data.EnablePageNumbers(True)
			data.EnableHelp(True)
#			data.SetSetupDialog(True)
			data.SetNoCopies(1)
			data.SetFromPage(1)
			data.SetToPage(1)
			data.SetAllPages(True)
			dlg = wx.wxPrintDialog(self, data)
			if dlg.ShowModal() == wx.wxID_OK:
				data = dlg.GetPrintDialogData()
				
			dlg.Destroy()
			return data

#----------------------------------FilePrintPreview----------------------------------
		def FilePrintPreview(self, event):
			print 'Welcome to File/Print\n'


#----------------------------------FilePrinter----------------------------------------
		def FilePrinter(self, event):
			printer = wx.wxPrinter()
			prDC = printer.PrintDialog(self)
			print prDC
			if prDC == 'NULL':
				mes = wx.wxMessageDialog(self, 'Print Device *NOT* define', 
						'A Message Box', wx.wxOK )
				mes.ShowModal()
				mes.Destroy()


#--------------------------------------FilePrint---------------------------------------
		def FilePrint(self, event):
			print 'Welcome to File/Print\n'


#-------------------------------------CloseWindow--------------------------------------
		def CloseWindow(self, event):
			self.Close()


#--------------------------------------mPOPMark----------------------------------------
		def mPOPMark(self, event):
			self.obj, self.item = self.treeSFS.GetObj()
			self.MarkSubSetFiles, self.MarkSubSetItems = self.treeSFS.GetSubSet()
			self.treeSFS.SetItemColour(self.item)
			self.menu2.Enable(self.IdE2, wx.TRUE)
			self.menu2.Enable(self.IdE3, wx.TRUE)
			self.menu2.Enable(self.IdE5, wx.TRUE)
			self.menu2.Enable(self.IdE6, wx.TRUE)
#			self.treeSFS.OnSubSetNotEmpty()

#--------------------------------------mPOPMark----------------------------------------------
		def mPOPUnMark(self, event):
			print '---mPOPUnMark---'
			self.obj, self.item = self.treeSFS.GetObj()
			self.MarkSubSetFiles, self.MarkSubSetItems = self.treeSFS.GetSubSet()

			mf = len(self.MarkSubSetFiles)
			if mf <> 0:
				self.treeSFS.SetItemUnColour(self.item)
				self.menu2.Enable(self.IdE2, wx.TRUE)
				self.menu2.Enable(self.IdE3, wx.TRUE)
				self.menu2.Enable(self.IdE5, wx.TRUE)
				self.menu2.Enable(self.IdE6, wx.TRUE)
			else:
				self.menu2.Enable(self.IdE2, wx.FALSE)
				self.menu2.Enable(self.IdE3, wx.FALSE)
				self.menu2.Enable(self.IdE5, wx.FALSE)
				self.menu2.Enable(self.IdE6, wx.FALSE)


#--------------------------------------mPOPUnMarkAll---------------------------
		def mPOPUnMarkAll(self, event):
			print '---mPOPUnMarkAll---'
			self.MarkSubSetFiles, self.MarkSubSetItems = self.treeSFS.GetSubSet()
			mf = len(self.MarkSubSetFiles)
			if mf <> 0:
				msg = wx.wxMessageDialog(self, 'You will UnMark All Marked Files?',
						'A Message Box', wx.wxOK|wx.wxCANCEL)
				if msg.ShowModal() == 5100:
					i = 0
					while wx.TRUE:
						self.treeSFS.SetItemUnColour(self.MarkSubSetItems[0])
						self.MarkSubSetFiles, self.MarkSubSetItems = self.treeSFS.GetSubSet()
						if len(self.MarkSubSetFiles) == 0:
							msg.Destroy()
							break

#			self.treeSFS.OnSubSetEmpty()


#--------------------------------------mPOPViewMarkFile-------------------------
		def mPOPViewMarkFile(self, event):
			print '---mPOPViewMark---'
			self.obj, self.item = self.treeSFS.GetObj()
			FileFrame(self.obj)

#--------------------------------------POPViewMarkedFiles-----------------------
		def POPViewMarkedFiles(self,event):
			print '---mPOPViewMarkedFiles---'
			self.MarkSubSetFiles, self.MarkSubSetItems = self.treeSFS.GetSubSet()
			MarkedFiles(self.MarkSubSetFiles)


#--------------------------------------FrameSetStatus---------------------------
		def FrameSetStatus(self, text, num):
			self.SetStatusText(text, num)


#--------------------------------------mPOPCopy---------------------------------
		def mPOPCopy(self, event):
			print '---mPOPCopy---'
			self.MarkSubSetFiles, self.MarkSubSetItems = self.treeSFS.GetSubSet()
			self.treeSFS.POPCopy(self.MarkSubSetFiles)


#-------------------------------------------------------------------------------
		def Menu301(self, event):
			print 'View number 1\n'

		def Menu302(self, event):
			print 'View number 2\n'

		def Menu303(self, event):
			print 'Viw number 31\n'

		def Menu304(self, event):
			print 'View number 4\n'

		def Menu305(self, event):
			print 'View number 5\n'


		def Menu401(self, event):
			print 'Tool number 1\n'

		def Menu402(self, event):
			print 'Tool number 2\n'

		def Menu403(self, event):
			print 'Tool number 3\n'


		def Menu501(self, event):
			print 'Help\n'

		def Menu502(self, event):
			print 'About\n'



	class MyApp(wx.wxApp):
      
		def OnInit(self):
			frame = MyFrame()

			frame.Show(wx.TRUE)
			self.SetTopWindow(frame)
	
			return wx.TRUE

app = MyApp(0)
app.MainLoop()
