Added activate/deactivate.
minsize --> getminsize.
Added 'boxed' option.
Added lost of code to realize (?)
diff --git a/Lib/lib-stdwin/TextEdit.py b/Lib/lib-stdwin/TextEdit.py
index f70fba1..5473f2b 100644
--- a/Lib/lib-stdwin/TextEdit.py
+++ b/Lib/lib-stdwin/TextEdit.py
@@ -1,5 +1,8 @@
 # Text editing widget
 
+# NB: this always assumes fixed bounds.
+# For auto-growing TextEdit windows, different code would be needed.
+
 from stdwinevents import *
 
 class TextEdit():
@@ -11,7 +14,14 @@
 		self.rows = rows
 		self.text = ''
 		# Creation of the editor is done in realize()
-		self.editor = 0
+		self.editor = None
+		self.dh = self.dv = 0
+		return self
+	#
+	def createboxed(self, (parent, (cols, rows), (dh, dv))):
+		self = self.create(parent, (cols, rows))
+		self.dh = max(0, dh)
+		self.dv = max(0, dv)
 		return self
 	#
 	def settext(self, text):
@@ -24,26 +34,69 @@
 		del self.editor
 		del self.window
 	#
-	def minsize(self, m):
-		return self.cols*m.textwidth('in')/2, self.rows*m.lineheight()
+	def getminsize(self, (m, (width, height))):
+		width = max(0, width - 2*self.dh)
+		height = max(0, height - 2*self.dv)
+		if width > 0 and self.editor:
+			(left, top), (right, bottom) = self.editor.getrect()
+			act_width, act_height = right - left, bottom - top
+			if width >= act_width:
+				width = width + 2*self.dh
+				height = max(height, act_height) + 2*self.dv
+				return width, height
+		width = max(width, self.cols*m.textwidth('in')/2) + 2*self.dh
+		height = max(height, self.rows*m.lineheight()) + 2*self.dv
+		return width, height
+	#
 	def setbounds(self, bounds):
 		self.bounds = bounds
 		if self.editor:
-			self.editor.move(bounds)
-	def getbounds(self, bounds):
-		if self.editor:
-			return self.editor.getrect()
-		else:
-			return self.bounds
+			(left, top), (right, bottom) = bounds
+			left = left + self.dh
+			top = top + self.dv
+			right = right - self.dh
+			bottom = bottom - self.dv
+			self.editor.move((left, top), (right, bottom))
+			if self.dh and self.dv:
+				(left, top), (right, bottom) = bounds
+				left = left + 1
+				top = top + 1
+				right = right - 1
+				bottom = bottom - 1
+				bounds = (left, top), (right, bottom)
+			self.editor.setview(bounds)
+	#
+	def getbounds(self):
+		return self.bounds
+	#
 	def realize(self):
 		self.window = self.parent.getwindow()
-		self.editor = self.window.textcreate(self.bounds)
+		(left, top), (right, bottom) = self.bounds
+		left = left + self.dh
+		top = top + self.dv
+		right = right - self.dh
+		bottom = bottom - self.dv
+		self.editor = \
+			self.window.textcreate((left, top), (right, bottom))
+		self.editor.setactive(0)
+		bounds = self.bounds
+		if self.dh and self.dv:
+			(left, top), (right, bottom) = bounds
+			left = left + 1
+			top = top + 1
+			right = right - 1
+			bottom = bottom - 1
+			bounds = (left, top), (right, bottom)
+		self.editor.setview(bounds)
 		self.editor.settext(self.text)
 		self.parent.need_mouse(self)
 		self.parent.need_keybd(self)
 		self.parent.need_altdraw(self)
+	#
 	def draw(self, (d, area)):
-		pass
+		if self.dh and self.dv:
+			d.box(self.bounds)
+	#
 	def altdraw(self, area):
 		self.editor.draw(area)
 	#
@@ -51,11 +104,20 @@
 	#
 	def mouse_down(self, detail):
 		x = self.editor.event(WE_MOUSE_DOWN, self.window, detail)
+	#
 	def mouse_move(self, detail):
 		x = self.editor.event(WE_MOUSE_MOVE, self.window, detail)
+	#
 	def mouse_up(self, detail):
 		x = self.editor.event(WE_MOUSE_UP, self.window, detail)
 	#
 	def keybd(self, (type, detail)):
 		x = self.editor.event(type, self.window, detail)
 	#
+	def activate(self):
+		self.editor.setfocus(0, 30000)
+		self.editor.setactive(1)
+	#
+	def deactivate(self):
+		self.editor.setactive(0)
+	#