import wx
import os

#----------------------------------------------------------------------
class TestPanel(wx.Panel):
    def __init__(self, parent, log):
        self.log = log
        wx.Panel.__init__(self, parent)

        # Event Handlers
        self.Bind(wx.EVT_PAINT, self.OnPaint)


    def OnPaint(self, event):
        dc = wx.GCDC(wx.PaintDC(self))
        #dc = wx.PaintDC(self)
        render = wx.RendererNative.Get()

        # Setup Brushes
        dc.SetBrush(wx.BLACK_BRUSH)
        dc.SetTextForeground(wx.BLACK)
        dc.SetFont(wx.NORMAL_FONT)

        # The below code will use RendererNative to draw controls in
        # various states. The wx.CONTROL_* flags are used to tell the
        # Renderer which state to draw the control in.

        # Draw some checkboxes
        cb_lbl = "DrawCheckBoxes:"
        dc.DrawText(cb_lbl, 15, 15)
        render.DrawCheckBox(self, dc, (25, 35, 16, 16), wx.CONTROL_CHECKED)
        render.DrawCheckBox(self, dc, (45, 35, 16, 16), wx.CONTROL_CHECKABLE)
        render.DrawCheckBox(self, dc, (65, 35, 16, 16))
        render.DrawCheckBox(self, dc, (85, 35, 16, 16), wx.CONTROL_CHECKED | wx.CONTROL_DISABLED)

        lbl = "DrawRadioButton:"
        dc.DrawText(lbl, 375, 15)
        render.DrawRadioButton(self, dc, (385, 35, 16, 16), wx.CONTROL_CHECKED)
        render.DrawRadioButton(self, dc, (405, 35, 16, 16), wx.CONTROL_CHECKABLE)
        render.DrawRadioButton(self, dc, (425, 35, 16, 16))
        render.DrawRadioButton(self, dc, (445, 35, 16, 16), wx.CONTROL_CHECKED | wx.CONTROL_DISABLED)

        # Draw ComboBoxDropButton
        xpos = self.GetTextExtent(cb_lbl)[0] + 40
        cb_lbl = "DrawComboBoxDropButton:"
        dc.DrawText(cb_lbl, xpos, 15)
        render.DrawComboBoxDropButton(self, dc, (xpos + 4, 35, 24, 24), wx.CONTROL_CURRENT)
        render.DrawComboBoxDropButton(self, dc, (xpos + 44, 35, 24, 24), wx.CONTROL_PRESSED)
        render.DrawComboBoxDropButton(self, dc, (xpos + 84, 35, 24, 24), wx.CONTROL_CURRENT | wx.CONTROL_DISABLED)
        render.DrawComboBoxDropButton(self, dc, (xpos + 124, 35, 24, 24), wx.CONTROL_PRESSED | wx.CONTROL_DISABLED)

        # Draw DropArrow
        da_lbl = "DrawDropArrow:"
        dc.DrawText(da_lbl, 15, 80)
        render.DrawDropArrow(self, dc, (15, 100, 24, 24), wx.CONTROL_CURRENT)
        render.DrawDropArrow(self, dc, (35, 100, 24, 24), wx.CONTROL_PRESSED)
        render.DrawDropArrow(self, dc, (55, 100, 24, 24), wx.CONTROL_CURRENT | wx.CONTROL_DISABLED)

        # Draw HeaderButton
        dc.DrawText("DrawHeaderButton:", xpos, 80)
        # Set some extra options for drawing
        opts = wx.HeaderButtonParams()
        hb_lbl = "HeaderButton Selected"
        opts.m_labelText = hb_lbl
        render.DrawHeaderButton(self, dc, (xpos, 100, self.GetTextExtent(hb_lbl)[0] + 30, 16),
                                wx.CONTROL_SELECTED, wx.HDR_SORT_ICON_DOWN, opts)
        hb_lbl = "HeaderButton Normal"
        opts.m_labelText = hb_lbl
        render.DrawHeaderButton(self, dc, (xpos, 125, self.GetTextExtent(hb_lbl)[0] + 30, 16),
                                sortArrow=wx.HDR_SORT_ICON_UP, params=opts)

        hb_lbl = "HeaderButton Current"
        opts.m_labelText = hb_lbl
        render.DrawHeaderButton(self, dc, (xpos, 150, self.GetTextExtent(hb_lbl)[0] + 30, 16),
                                wx.CONTROL_CURRENT, params=opts)

        # Draw ItemSelectionRect
        isr_lbl = "DrawItemSelectionRect:"
        dc.DrawText(isr_lbl, 15, 185)
        render.DrawItemSelectionRect(self, dc, (15, 205, 40, 24), wx.CONTROL_SELECTED)
        render.DrawItemSelectionRect(self, dc, (65, 205, 40, 24), wx.CONTROL_CURRENT)
        render.DrawItemSelectionRect(self, dc, (115, 205, 40, 24), wx.CONTROL_FOCUSED)

        # DrawPushButton
        pb_lbl = "DrawPushButton:"
        dc.DrawText(pb_lbl, 15, 255)
        render.DrawPushButton(self, dc, (15, 275, 45, 24), wx.CONTROL_CURRENT)
        render.DrawPushButton(self, dc, (70, 275, 45, 24), wx.CONTROL_PRESSED | wx.CONTROL_SELECTED)
        render.DrawPushButton(self, dc, (125, 275, 45, 24), wx.CONTROL_ISDEFAULT)
        render.DrawPushButton(self, dc, (180, 275, 45, 24), wx.CONTROL_CURRENT | wx.CONTROL_DISABLED)

        # DrawTreeItemButton
        ti_lbl = "DrawTreeItemButton:"
        dc.DrawText(ti_lbl, 15, 330)
        render.DrawTreeItemButton(self, dc, (15, 350, 16, 16))
        render.DrawTreeItemButton(self, dc, (45, 350, 16, 16), wx.CONTROL_EXPANDED)

        dc.DrawText("DrawComboBox:", 270, 185)
        render.DrawComboBox(self, dc, (270, 205, 100, 21))
        render.DrawComboBox(self, dc, (270, 230, 100, 21), wx.CONTROL_DISABLED)
        render.DrawComboBox(self, dc, (270, 255, 100, 21), wx.CONTROL_CURRENT)
        render.DrawComboBox(self, dc, (270, 280, 100, 21), wx.CONTROL_PRESSED | wx.CONTROL_SELECTED)
        render.DrawComboBox(self, dc, (270, 305, 100, 21), wx.CONTROL_FOCUSED)

        dc.DrawText("DrawChoice:", 400, 185)
        render.DrawChoice(self, dc, (400, 205, 100, 21))
        render.DrawChoice(self, dc, (400, 230, 100, 21), wx.CONTROL_DISABLED)
        render.DrawChoice(self, dc, (400, 255, 100, 21), wx.CONTROL_CURRENT)
        render.DrawChoice(self, dc, (400, 280, 100, 21), wx.CONTROL_PRESSED | wx.CONTROL_SELECTED)
        render.DrawChoice(self, dc, (400, 305, 100, 21), wx.CONTROL_FOCUSED)

        dc.DrawText("DrawTextCtrl:", 270, 350)
        render.DrawTextCtrl(self, dc, (270, 375, 100, 21))
        render.DrawTextCtrl(self, dc, (380, 375, 100, 21), wx.CONTROL_FOCUSED)

#----------------------------------------------------------------------

def runTest(frame, nb, log):
    win = TestPanel(nb, log)
    return win

#----------------------------------------------------------------------

overview = """<html><body>
<h2><center>wx.RendererNative</center></h2>
<p>wx.RendererNative is a class which virtualizes drawing. It abstracts the 
operations of drawing controls and allows you to draw say, a button, without 
caring about exactly how it is done, in a native and platform independant way. 
</p>

<p>All drawing functions take some standard parameters:<p>
<ul>
<li><b>win</b>: is the window being drawn.</li>
<li><b>dc</b>: is the wxDC to draw on. Only this device context should be used 
               for drawing.</li>
<li><b>rect</b>: The bounding rectangle for the element to be drawn.</li>
<li><b>flags</b>: The optional flags (none by default) which can be a 
                  combination of the wx.CONTROL_XXX constants.</li>
</ul>

<p><b>Note</b>: Each drawing function restores the wxDC attributes if it 
changes them, so it is safe to assume that the same pen, brush and colours 
that were active before the call to this function are still in effect 
after it.</p>
</body></html>
"""

#----------------------------------------------------------------------

if __name__ == '__main__':
    import sys
    import run
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
