+#----------------------------------------------------------------------
+# Name: wx.lib.wrap
+# Purpose: Contains a function to aid in word-wrapping some text
+#
+# Author: Robin Dunn
+#
+# Created: 15-Oct-2006
+# RCS-ID: $Id$
+# Copyright: (c) 2006 by Total Control Software
+# Licence: wxWindows license
+#----------------------------------------------------------------------
+
+
+
+def wordwrap(text, width, dc, breakLongWords=True):
+ """
+ Returns a copy of text with newline characters inserted where long
+ lines should be broken such that they will fit within the given
+ width, on the given `wx.DC` using its current font settings. By
+ default words that are wider than width will be broken at the
+ nearest character boundary, but this can be disabled by passing
+ ``False`` for the ``breakLongWords`` parameter.
+ """
+
+ wrapped_lines = []
+ text = text.split('\n')
+ for line in text:
+ pte = dc.GetPartialTextExtents(line)
+ idx = 0
+ start = 0
+ startIdx = 0
+ spcIdx = -1
+ while idx < len(pte):
+ # remember the last seen space
+ if line[idx] == ' ':
+ spcIdx = idx
+
+ # have we reached the max width?
+ if pte[idx] - start > width and (spcIdx != -1 or breakLongWords):
+ if spcIdx != -1:
+ idx = spcIdx + 1
+ wrapped_lines.append( line[startIdx : idx] )
+ start = pte[idx]
+ startIdx = idx
+ spcIdx = -1
+
+ idx += 1
+
+ wrapped_lines.append( line[startIdx : idx] )
+
+ return '\n'.join(wrapped_lines)
+
+
+
+
+
+if __name__ == '__main__':
+ import wx
+ class TestPanel(wx.Panel):
+ def __init__(self, parent):
+ wx.Panel.__init__(self, parent)
+
+ self.tc = wx.TextCtrl(self, -1, "", (20,20), (150,150), wx.TE_MULTILINE)
+ self.Bind(wx.EVT_TEXT, self.OnDoUpdate, self.tc)
+
+ def OnDoUpdate(self, evt):
+ WIDTH = 200
+ bmp = wx.EmptyBitmap(WIDTH, WIDTH)
+ mdc = wx.MemoryDC(bmp)
+ mdc.SetBackground(wx.Brush("white"))
+ mdc.Clear()
+ mdc.SetPen(wx.Pen("black"))
+ mdc.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL))
+ mdc.DrawRectangle(0,0, WIDTH, WIDTH)
+
+ text = wordwrap(self.tc.GetValue(), WIDTH-2, mdc, False)
+ #print repr(text)
+ mdc.DrawLabel(text, (1,1, WIDTH-2, WIDTH-2))
+
+ del mdc
+ dc = wx.ClientDC(self)
+ dc.DrawBitmap(bmp, 200, 20)
+
+
+ app = wx.App(False)
+ frm = wx.Frame(None, title="Test wordWrap")
+ pnl = TestPanel(frm)
+ frm.Show()
+ app.MainLoop()
+
+