font. This is how the native static text widgets behave. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44212 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			171 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #----------------------------------------------------------------------
 | |
| # Name:        wx.lib.stattext
 | |
| # Purpose:     A generic wxGenStaticText class.  Using this should
 | |
| #              eliminate some of the platform differences in wxStaticText,
 | |
| #              such as background colours and mouse sensitivity.
 | |
| #
 | |
| # Author:      Robin Dunn
 | |
| #
 | |
| # Created:     8-July-2002
 | |
| # RCS-ID:      $Id$
 | |
| # Copyright:   (c) 2002 by Total Control Software
 | |
| # Licence:     wxWindows license
 | |
| #----------------------------------------------------------------------
 | |
| # 12/12/2003 - Jeff Grimmett (grimmtooth@softhome.net)
 | |
| #
 | |
| # o 2.5 compatability update.
 | |
| # o Untested.
 | |
| #
 | |
| 
 | |
| import wx
 | |
| 
 | |
| BUFFERED = 0   # In unbuffered mode we can let the theme shine through,
 | |
|                # is there a way to do this when buffering?
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| class GenStaticText(wx.PyControl):
 | |
|     labelDelta = 1
 | |
| 
 | |
|     def __init__(self, parent, ID, label,
 | |
|                  pos = wx.DefaultPosition, size = wx.DefaultSize,
 | |
|                  style = 0,
 | |
|                  name = "genstattext"):
 | |
|         wx.PyControl.__init__(self, parent, ID, pos, size, style|wx.NO_BORDER,
 | |
|                              wx.DefaultValidator, name)
 | |
| 
 | |
|         wx.PyControl.SetLabel(self, label) # don't check wx.ST_NO_AUTORESIZE yet
 | |
|         self.InheritAttributes()
 | |
|         self.SetInitialSize(size)
 | |
| 
 | |
|         self.Bind(wx.EVT_PAINT, self.OnPaint)
 | |
|         if BUFFERED:
 | |
|             self.defBackClr = self.GetBackgroundColour()
 | |
|             self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
 | |
|         else:
 | |
|             self.SetBackgroundStyle(wx.BG_STYLE_SYSTEM)
 | |
|             
 | |
| 
 | |
| 
 | |
|     def SetLabel(self, label):
 | |
|         """
 | |
|         Sets the static text label and updates the control's size to exactly
 | |
|         fit the label unless the control has wx.ST_NO_AUTORESIZE flag.
 | |
|         """
 | |
|         wx.PyControl.SetLabel(self, label)
 | |
|         style = self.GetWindowStyleFlag()
 | |
|         self.InvalidateBestSize()
 | |
|         if not style & wx.ST_NO_AUTORESIZE:
 | |
|             self.SetSize(self.GetBestSize())
 | |
|         self.Refresh()
 | |
| 
 | |
| 
 | |
|     def SetFont(self, font):
 | |
|         """
 | |
|         Sets the static text font and updates the control's size to exactly
 | |
|         fit the label unless the control has wx.ST_NO_AUTORESIZE flag.
 | |
|         """
 | |
|         wx.PyControl.SetFont(self, font)
 | |
|         style = self.GetWindowStyleFlag()
 | |
|         self.InvalidateBestSize()
 | |
|         if not style & wx.ST_NO_AUTORESIZE:
 | |
|             self.SetSize(self.GetBestSize())
 | |
|         self.Refresh()
 | |
| 
 | |
| 
 | |
|     def DoGetBestSize(self):
 | |
|         """
 | |
|         Overridden base class virtual.  Determines the best size of
 | |
|         the control based on the label size and the current font.
 | |
|         """
 | |
|         label = self.GetLabel()
 | |
|         font = self.GetFont()
 | |
|         if not font:
 | |
|             font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
 | |
|         dc = wx.ClientDC(self)
 | |
|         dc.SetFont(font)
 | |
|         
 | |
|         maxWidth = totalHeight = 0
 | |
|         for line in label.split('\n'):
 | |
|             if line == '':
 | |
|                 w, h = dc.GetTextExtent('W')  # empty lines have height too
 | |
|             else:
 | |
|                 w, h = dc.GetTextExtent(line)
 | |
|             totalHeight += h
 | |
|             maxWidth = max(maxWidth, w)
 | |
|         best = wx.Size(maxWidth, totalHeight)
 | |
|         self.CacheBestSize(best)
 | |
|         return best
 | |
| 
 | |
| 
 | |
|     def AcceptsFocus(self):
 | |
|         """Overridden base class virtual."""
 | |
|         return False
 | |
| 
 | |
| 
 | |
|     def GetDefaultAttributes(self):
 | |
|         """
 | |
|         Overridden base class virtual.  By default we should use
 | |
|         the same font/colour attributes as the native StaticText.
 | |
|         """
 | |
|         return wx.StaticText.GetClassDefaultAttributes()
 | |
| 
 | |
| 
 | |
|     def ShouldInheritColours(self):
 | |
|         """
 | |
|         Overridden base class virtual.  If the parent has non-default
 | |
|         colours then we want this control to inherit them.
 | |
|         """
 | |
|         return True
 | |
| 
 | |
|     
 | |
|     def OnPaint(self, event):
 | |
|         if BUFFERED:
 | |
|             dc = wx.BufferedPaintDC(self)
 | |
|         else:
 | |
|             dc = wx.PaintDC(self)
 | |
|         width, height = self.GetClientSize()
 | |
|         if not width or not height:
 | |
|             return
 | |
| 
 | |
|         if BUFFERED:
 | |
|             clr = self.GetBackgroundColour()
 | |
|             backBrush = wx.Brush(clr, wx.SOLID)
 | |
|             if wx.Platform == "__WXMAC__" and clr == self.defBackClr:
 | |
|                 # if colour is still the default then use the striped background on Mac
 | |
|                 backBrush.MacSetTheme(1) # 1 == kThemeBrushDialogBackgroundActive
 | |
|             dc.SetBackground(backBrush)
 | |
|             dc.Clear()
 | |
| 
 | |
|         if self.IsEnabled():
 | |
|             dc.SetTextForeground(self.GetForegroundColour())
 | |
|         else:
 | |
|             dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT))
 | |
|             
 | |
|         dc.SetFont(self.GetFont())
 | |
|         label = self.GetLabel()
 | |
|         style = self.GetWindowStyleFlag()
 | |
|         x = y = 0
 | |
|         for line in label.split('\n'):
 | |
|             if line == '':
 | |
|                 w, h = self.GetTextExtent('W')  # empty lines have height too
 | |
|             else:
 | |
|                 w, h = self.GetTextExtent(line)
 | |
|             if style & wx.ALIGN_RIGHT:
 | |
|                 x = width - w
 | |
|             if style & wx.ALIGN_CENTER:
 | |
|                 x = (width - w)/2
 | |
|             dc.DrawText(line, x, y)
 | |
|             y += h
 | |
| 
 | |
| 
 | |
|     def OnEraseBackground(self, event):
 | |
|         pass
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| 
 |