# Module 'textwin'

# Text windows, a subclass of gwin

import stdwin
import gwin
from stdwinevents import *


def fixsize(w):
	docwidth, docheight = w.text.getrect()[1]
	winheight = w.getwinsize()[1]
	if winheight > docheight: docheight = winheight
	w.setdocsize(0, docheight)
	fixeditmenu(w)

def cut(w, m, id):
	s = w.text.getfocustext()
	if s:
		stdwin.setcutbuffer(0, s)
		w.text.replace('')
		fixsize(w)

def copy(w, m, id):
	s = w.text.getfocustext()
	if s:
		stdwin.setcutbuffer(0, s)
		fixeditmenu(w)

def paste(w, m, id):
	w.text.replace(stdwin.getcutbuffer(0))
	fixsize(w)

def addeditmenu(w):
	m = w.editmenu = w.menucreate('Edit')
	m.action = []
	m.additem('Cut', 'X')
	m.action.append(cut)
	m.additem('Copy', 'C')
	m.action.append(copy)
	m.additem('Paste', 'V')
	m.action.append(paste)

def fixeditmenu(w):
	m = w.editmenu
	f = w.text.getfocus()
	can_copy = (f[0] < f[1])
	m.enable(1, can_copy)
	if not w.readonly:
		m.enable(0, can_copy)
		m.enable(2, (stdwin.getcutbuffer(0) <> ''))

def draw(w, area):			# Draw method
	w.text.draw(area)

def size(w, newsize):			# Size method
	w.text.move((0, 0), newsize)
	fixsize(w)

def close(w):				# Close method
	del w.text  # Break circular ref
	gwin.close(w)

def char(w, c):				# Char method
	w.text.replace(c)
	fixsize(w)

def backspace(w):			# Backspace method
	void = w.text.event(WE_COMMAND, w, WC_BACKSPACE)
	fixsize(w)

def arrow(w, detail):			# Arrow method
	w.text.arrow(detail)
	fixeditmenu(w)

def mdown(w, detail):			# Mouse down method
	void = w.text.event(WE_MOUSE_DOWN, w, detail)
	fixeditmenu(w)

def mmove(w, detail):			# Mouse move method
	void = w.text.event(WE_MOUSE_MOVE, w, detail)

def mup(w, detail):			# Mouse up method
	void = w.text.event(WE_MOUSE_UP, w, detail)
	fixeditmenu(w)

def activate(w):			# Activate method
	fixeditmenu(w)

def open(title, str):			# Display a string in a window
	w = gwin.open(title)
	w.readonly = 0
	w.text = w.textcreate((0, 0), w.getwinsize())
	w.text.replace(str)
	w.text.setfocus(0, 0)
	addeditmenu(w)
	fixsize(w)
	w.draw = draw
	w.size = size
	w.close = close
	w.mdown = mdown
	w.mmove = mmove
	w.mup = mup
	w.char = char
	w.backspace = backspace
	w.arrow = arrow
	w.activate = activate
	return w

def open_readonly(title, str):		# Same with char input disabled
	w = open(title, str)
	w.readonly = 1
	w.char = w.backspace = gwin.nop
	# Disable Cut and Paste menu item; leave Copy alone
	w.editmenu.enable(0, 0)
	w.editmenu.enable(2, 0)
	return w
