+
+import wx
+import wx.combo
+
+#----------------------------------------------------------------------
+# This ComboBox class graphically displays the various pen styles that
+# are available, making it easy for the user to choose the style they
+# want.
+
+class PenStyleComboBox(wx.combo.OwnerDrawnComboBox):
+
+ # Overridden from OwnerDrawnComboBox, called to draw each
+ # item in the list
+ def OnDrawItem(self, dc, rect, item, flags):
+ if item == wx.NOT_FOUND:
+ # painting the control, but there is no valid item selected yet
+ return
+
+ r = wx.Rect(*rect) # make a copy
+ r.Deflate(3, 5)
+
+ penStyle = wx.SOLID
+ if item == 1:
+ penStyle = wx.TRANSPARENT
+ elif item == 2:
+ penStyle = wx.DOT
+ elif item == 3:
+ penStyle = wx.LONG_DASH
+ elif item == 4:
+ penStyle = wx.SHORT_DASH
+ elif item == 5:
+ penStyle = wx.DOT_DASH
+ elif item == 6:
+ penStyle = wx.BDIAGONAL_HATCH
+ elif item == 7:
+ penStyle = wx.CROSSDIAG_HATCH
+ elif item == 8:
+ penStyle = wx.FDIAGONAL_HATCH
+ elif item == 9:
+ penStyle = wx.CROSS_HATCH
+ elif item == 10:
+ penStyle = wx.HORIZONTAL_HATCH
+ elif item == 11:
+ penStyle = wx.VERTICAL_HATCH
+
+ pen = wx.Pen(dc.GetTextForeground(), 3, penStyle)
+ dc.SetPen(pen)
+
+ if flags & wx.combo.ODCB_PAINTING_CONTROL:
+ # for painting the control itself
+ dc.DrawLine( r.x+5, r.y+r.height/2, r.x+r.width - 5, r.y+r.height/2 )
+
+ else:
+ # for painting the items in the popup
+ dc.DrawText(self.GetString( item ),
+ r.x + 3,
+ (r.y + 0) + ( (r.height/2) - dc.GetCharHeight() )/2
+ )
+ dc.DrawLine( r.x+5, r.y+((r.height/4)*3)+1, r.x+r.width - 5, r.y+((r.height/4)*3)+1 )
+
+
+ # Overridden from OwnerDrawnComboBox, called for drawing the
+ # background area of each item.
+ def OnDrawBackground(self, dc, rect, item, flags):
+ # If the item is selected, or its item # iseven, or we are painting the
+ # combo control itself, then use the default rendering.
+ if (item & 1 == 0 or flags & (wx.combo.ODCB_PAINTING_CONTROL |
+ wx.combo.ODCB_PAINTING_SELECTED)):
+ wx.combo.OwnerDrawnComboBox.OnDrawBackground(self, dc, rect, item, flags)
+ return
+
+ # Otherwise, draw every other background with different colour.
+ bgCol = wx.Colour(240,240,250)
+ dc.SetBrush(wx.Brush(bgCol))
+ dc.SetPen(wx.Pen(bgCol))
+ dc.DrawRectangleRect(rect);
+
+
+
+ # Overridden from OwnerDrawnComboBox, should return the height
+ # needed to display an item in the popup, or -1 for default
+ def OnMeasureItem(self, item):
+ # Simply demonstrate the ability to have variable-height items
+ if item & 1:
+ return 36
+ else:
+ return 24
+
+ # Overridden from OwnerDrawnComboBox. Callback for item width, or
+ # -1 for default/undetermined
+ def OnMeasureItemWidth(self, item):
+ return -1; # default - will be measured from text width
+
+
+
+
+#----------------------------------------------------------------------
+
+class TestPanel(wx.Panel):
+ def __init__(self, parent, log):
+ self.log = log
+ wx.Panel.__init__(self, parent, -1)
+
+ penStyles = [
+ "Solid",
+ "Transparent",
+ "Dot",
+ "Long Dash",
+ "Short Dash",
+ "Dot Dash",
+ "Backward Diagonal Hatch",
+ "Cross-diagonal Hatch",
+ "Forward Diagonal Hatch",
+ "Cross Hatch",
+ "Horizontal Hatch",
+ "Vertical Hatch",
+ ]
+
+ wx.StaticText(self, -1, "Pen Styles:", (20, 20))
+ pscb = PenStyleComboBox(self, choices=penStyles, style=wx.CB_READONLY,
+ pos=(20,40), size=(250, -1))
+
+ self.pscb = pscb
+
+#----------------------------------------------------------------------
+
+def runTest(frame, nb, log):
+ win = TestPanel(nb, log)
+ return win
+
+#----------------------------------------------------------------------
+
+
+
+overview = """<html><body>
+<h2><center>wx.combo.OwnerDrawnComboBox</center></h2>
+
+wx.combo.OwnerDrawnComboBox is a combobox with owner-drawn list
+items. In essence, it is a wx.combo.ComboCtrl with wx.VListBox popup and
+wx.ControlWithItems interface.
+
+</body></html>
+"""
+
+
+
+if __name__ == '__main__':
+ import sys,os
+ import run
+ run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
+