]>
Commit | Line | Data |
---|---|---|
d14a1e28 RD |
1 | #---------------------------------------------------------------------- |
2 | # Name: wx.lib.stattext | |
3 | # Purpose: A generic wxGenStaticText class. Using this should | |
4 | # eliminate some of the platform differences in wxStaticText, | |
5 | # such as background colours and mouse sensitivity. | |
6 | # | |
7 | # Author: Robin Dunn | |
8 | # | |
9 | # Created: 8-July-2002 | |
10 | # RCS-ID: $Id$ | |
11 | # Copyright: (c) 2002 by Total Control Software | |
12 | # Licence: wxWindows license | |
13 | #---------------------------------------------------------------------- | |
b881fc78 RD |
14 | # 12/12/2003 - Jeff Grimmett (grimmtooth@softhome.net) |
15 | # | |
16 | # o 2.5 compatability update. | |
17 | # o Untested. | |
18 | # | |
d14a1e28 RD |
19 | |
20 | import wx | |
21 | ||
2e23d849 RD |
22 | BUFFERED = 0 # In unbuffered mode we can let the theme shine through, |
23 | # is there a way to do this when buffering? | |
24 | ||
d14a1e28 RD |
25 | #---------------------------------------------------------------------- |
26 | ||
27 | class GenStaticText(wx.PyControl): | |
28 | labelDelta = 1 | |
29 | ||
30 | def __init__(self, parent, ID, label, | |
31 | pos = wx.DefaultPosition, size = wx.DefaultSize, | |
32 | style = 0, | |
33 | name = "genstattext"): | |
34 | wx.PyControl.__init__(self, parent, ID, pos, size, style|wx.NO_BORDER, | |
35 | wx.DefaultValidator, name) | |
36 | ||
37 | wx.PyControl.SetLabel(self, label) # don't check wx.ST_NO_AUTORESIZE yet | |
969d9b6f | 38 | self.InheritAttributes() |
170acdc9 | 39 | self.SetInitialSize(size) |
d14a1e28 | 40 | |
2e23d849 RD |
41 | self.Bind(wx.EVT_PAINT, self.OnPaint) |
42 | if BUFFERED: | |
43 | self.defBackClr = self.GetBackgroundColour() | |
44 | self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) | |
45 | else: | |
46 | self.SetBackgroundStyle(wx.BG_STYLE_SYSTEM) | |
47 | ||
d14a1e28 RD |
48 | |
49 | ||
50 | def SetLabel(self, label): | |
51 | """ | |
52 | Sets the static text label and updates the control's size to exactly | |
53 | fit the label unless the control has wx.ST_NO_AUTORESIZE flag. | |
54 | """ | |
55 | wx.PyControl.SetLabel(self, label) | |
56 | style = self.GetWindowStyleFlag() | |
2e23d849 | 57 | self.InvalidateBestSize() |
d14a1e28 | 58 | if not style & wx.ST_NO_AUTORESIZE: |
cfce9d35 | 59 | self.SetSize(self.GetBestSize()) |
d14a1e28 RD |
60 | self.Refresh() |
61 | ||
62 | ||
63 | def SetFont(self, font): | |
64 | """ | |
65 | Sets the static text font and updates the control's size to exactly | |
66 | fit the label unless the control has wx.ST_NO_AUTORESIZE flag. | |
67 | """ | |
68 | wx.PyControl.SetFont(self, font) | |
69 | style = self.GetWindowStyleFlag() | |
2e23d849 | 70 | self.InvalidateBestSize() |
d14a1e28 | 71 | if not style & wx.ST_NO_AUTORESIZE: |
cfce9d35 | 72 | self.SetSize(self.GetBestSize()) |
d14a1e28 RD |
73 | self.Refresh() |
74 | ||
75 | ||
76 | def DoGetBestSize(self): | |
969d9b6f RD |
77 | """ |
78 | Overridden base class virtual. Determines the best size of | |
2e23d849 | 79 | the control based on the label size and the current font. |
969d9b6f | 80 | """ |
d14a1e28 | 81 | label = self.GetLabel() |
2e23d849 RD |
82 | font = self.GetFont() |
83 | if not font: | |
84 | font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) | |
85 | dc = wx.ClientDC(self) | |
86 | dc.SetFont(font) | |
87 | ||
d14a1e28 RD |
88 | maxWidth = totalHeight = 0 |
89 | for line in label.split('\n'): | |
90 | if line == '': | |
2e23d849 | 91 | w, h = dc.GetTextExtent('W') # empty lines have height too |
d14a1e28 | 92 | else: |
2e23d849 | 93 | w, h = dc.GetTextExtent(line) |
d14a1e28 RD |
94 | totalHeight += h |
95 | maxWidth = max(maxWidth, w) | |
2e23d849 RD |
96 | best = wx.Size(maxWidth, totalHeight) |
97 | self.CacheBestSize(best) | |
98 | return best | |
d14a1e28 RD |
99 | |
100 | ||
101 | def AcceptsFocus(self): | |
102 | """Overridden base class virtual.""" | |
103 | return False | |
104 | ||
105 | ||
969d9b6f RD |
106 | def GetDefaultAttributes(self): |
107 | """ | |
108 | Overridden base class virtual. By default we should use | |
109 | the same font/colour attributes as the native StaticText. | |
110 | """ | |
111 | return wx.StaticText.GetClassDefaultAttributes() | |
112 | ||
113 | ||
114 | def ShouldInheritColours(self): | |
115 | """ | |
116 | Overridden base class virtual. If the parent has non-default | |
117 | colours then we want this control to inherit them. | |
118 | """ | |
119 | return True | |
969d9b6f | 120 | |
2e23d849 | 121 | |
d14a1e28 | 122 | def OnPaint(self, event): |
2e23d849 RD |
123 | if BUFFERED: |
124 | dc = wx.BufferedPaintDC(self) | |
125 | else: | |
126 | dc = wx.PaintDC(self) | |
d14a1e28 RD |
127 | width, height = self.GetClientSize() |
128 | if not width or not height: | |
129 | return | |
130 | ||
2e23d849 RD |
131 | if BUFFERED: |
132 | clr = self.GetBackgroundColour() | |
133 | backBrush = wx.Brush(clr, wx.SOLID) | |
134 | if wx.Platform == "__WXMAC__" and clr == self.defBackClr: | |
135 | # if colour is still the default then use the striped background on Mac | |
136 | backBrush.MacSetTheme(1) # 1 == kThemeBrushDialogBackgroundActive | |
137 | dc.SetBackground(backBrush) | |
138 | dc.Clear() | |
d14a1e28 | 139 | |
edd13c9d | 140 | if self.IsEnabled(): |
7a0a389e RD |
141 | dc.SetTextForeground(self.GetForegroundColour()) |
142 | else: | |
143 | dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) | |
144 | ||
d14a1e28 RD |
145 | dc.SetFont(self.GetFont()) |
146 | label = self.GetLabel() | |
147 | style = self.GetWindowStyleFlag() | |
148 | x = y = 0 | |
149 | for line in label.split('\n'): | |
150 | if line == '': | |
151 | w, h = self.GetTextExtent('W') # empty lines have height too | |
152 | else: | |
153 | w, h = self.GetTextExtent(line) | |
154 | if style & wx.ALIGN_RIGHT: | |
155 | x = width - w | |
156 | if style & wx.ALIGN_CENTER: | |
157 | x = (width - w)/2 | |
d7403ad2 | 158 | dc.DrawText(line, x, y) |
d14a1e28 RD |
159 | y += h |
160 | ||
161 | ||
162 | def OnEraseBackground(self, event): | |
163 | pass | |
164 | ||
165 | ||
166 | ||
167 | ||
168 | #---------------------------------------------------------------------- | |
1fded56b | 169 | |
1fded56b | 170 |