#! /usr/bin/python

import wx
import wx.richtext as rt
import os

print os.getpid()
WORD_HEIGHT = 22
DOWN_KEY = 315
UP_KEY = 317

class HighlightCtrl(wx.TextCtrl):
	def __init__(self, text="", parent=None, style=0):
		style=style|wx.TE_MULTILINE|wx.TE_RICH2|wx.TE_NO_VSCROLL
		wx.TextCtrl.__init__(self, parent, -1, style=style)
		self.SetValue(text)
		self.points = self.GetFont().GetPointSize()
		self.SetFont(wx.Font(self.points, wx.FONTFAMILY_TELETYPE, 0, 0, False))
		
	def Fit (self):
		size=wx.Size(8*len(self.GetValue())+5, 22)
		self.SetMinSize(size)
		self.SetSize(size)

class FlyingField (wx.Frame):
	def __init__(self):
		STYLE = wx.FRAME_SHAPED | wx.SIMPLE_BORDER | wx.STAY_ON_TOP# | wx.FRAME_NO_TASKBAR
		wx.Frame.__init__(self, None, -1, "Shaped Window", style = STYLE)
		
		self.max_y=full_height-WORD_HEIGHT
	
		self.panel = wx.Panel(self, -1)
		self.option_entry = HighlightCtrl(parent=self.panel, text="blahblahblah")
		
		self.option_entry.SetMinSize((full_width, WORD_HEIGHT))
		
		self.sizer = wx.BoxSizer(wx.HORIZONTAL)
		self.sizer.Add(self.option_entry, 0, wx.EXPAND)
		
		self.option_index = 0
		self.options = []
		self.arguments_entries = []
		self.max_x=None
		
		self.panel.SetSizer(self.sizer)
		self.panel.Layout()
		self.Layout()
		self.SetSize((full_width, WORD_HEIGHT))		
		
		self.SetPosition((0, self.max_y))
		self.Show(True)
		self.option_entry.SetFocus()
	
		self.option_entry.Bind(wx.EVT_KEY_DOWN, self.OnKey)
		
		
		#####IF CALLED THIS WAY, EVERYTHING'S OK######
		self.AppendArgument()
		self.RemoveArgument()
		#####IF CALLED THIS WAY, EVERYTHING'S OK######
		
	def OnKey (self, event=None):
		key = event.GetKeyCode()

		if key == wx.WXK_ESCAPE:
			focus = self.FindFocus()
			if focus in self.arguments_entries:
				self.RemoveArgument()
			else:
				self.Destroy()
		elif key == wx.WXK_TAB:
			self.AppendArgument()
		if event != None:
			event.Skip()
		
	def AppendArgument (self, event=None):
		if self.FindFocus() == self.option_entry:
			self.option_entry.Fit()
			self.max_x = self.option_entry.GetSize()[0]
		else:
			self.arguments_entries[-1].Fit()
			self.max_x += self.arguments_entries[-1].GetSize()[0]

		text='string'
		new_argument_entry = HighlightCtrl(parent=self.panel, text=text, style=wx.TE_PROCESS_ENTER)
		new_argument_entry.SetMinSize((full_width-self.max_x, WORD_HEIGHT))
		new_argument_entry.SetPosition((self.max_x, self.max_y))		
		new_argument_entry.SetFocus()
		new_argument_entry.SelectAll()
		
		self.arguments_entries.append(new_argument_entry)
		
		self.sizer.Add(new_argument_entry, 0, wx.EXPAND)
		
		new_argument_entry.Bind(wx.EVT_KEY_DOWN, self.OnKey)

		self.panel.Layout()
		if event != None:
			event.Skip()
			
	def RemoveArgument (self, event=None):
		argument = self.arguments_entries[-1]
		self.max_x -= argument.GetPosition()[0]
		argument.Unbind(wx.EVT_KEY_DOWN)
		self.sizer.Remove(argument)
		
		#####HERE BE PROBLEM######
		argument.Destroy()
		#####HERE BE PROBLEM######
		
		self.arguments_entries.remove(argument)
		
		if len(self.arguments_entries) > 0:
			previous_entry = self.arguments_entries[-1]
			previous_entry.SetFocus()
			previous_entry.SelectAll()
		else:
			self.option_entry.SetFocus()
			self.option_entry.SelectAll()
			
		focus = self.FindFocus()
		focus.SetMinSize((full_width-self.max_x, -1))
		
		self.sizer.Layout()
		self.panel.Layout()		
		if event != None:
			event.Skip()
		


	
if __name__ == "__main__":
	try:
		app = wx.App()    
		full_width, full_height = wx.DisplaySize()
		FlyingField()    
		app.MainLoop()
	finally :
		del app