-#----------------------------------------------------------------------
-# 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()
-
-