--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/controls/CustomToolTip.py Thu May 23 18:47:44 2013 +0200
@@ -0,0 +1,200 @@
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor +#based on the plcopen standard. +#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD +#See COPYING file for copyrights details. +#This library is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public +#License as published by the Free Software Foundation; either +#version 2.1 of the License, or (at your option) any later version. +#This library is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +#General Public License for more details. +#You should have received a copy of the GNU General Public +#License along with this library; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +from controls.CustomStyledTextCtrl import faces +TOOLTIP_MAX_CHARACTERS = 30 # Maximum number of characters by line in ToolTip +TOOLTIP_MAX_LINE = 5 # Maximum number of line in ToolTip +TOOLTIP_WAIT_PERIOD = 0.5 # Wait period before displaying tooltip in second +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +Class that implements a custom tool tip +class CustomToolTip(wx.PopupWindow): + def __init__(self, parent, tip, restricted=True): + @param parent: Parent window + @param tip: Tip text (may be multiline) + @param restricted: Tool tip must follow size restriction in line and + characters number defined (default True) + wx.PopupWindow.__init__(self, parent) + self.CurrentPosition = wx.Point(0, 0) + self.Restricted = restricted + self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) + # Initialize text font style + faceName = faces["mono"]) + self.Bind(wx.EVT_PAINT, self.OnPaint) + def SetFont(self, font): + Set tool tip text font style + @param font: wx.Font object containing font style + @param tip: Tool tip text + # Compute tip text line return + for line in tip.splitlines(): + if len(new_line + " " + word) <= \ + TOOLTIP_MAX_CHARACTERS: + self.Tip.append(new_line) + self.Tip.append(new_line) + # Restrict number of lines + if len(self.Tip) > TOOLTIP_MAX_LINE: + self.Tip = self.Tip[:TOOLTIP_MAX_LINE] + # Add ... to the end of last line to indicate that tool tip + if len(self.Tip[-1]) < TOOLTIP_MAX_CHARACTERS - 3: + self.Tip[-1] = self.Tip[-1]\ + [:TOOLTIP_MAX_CHARACTERS - 3] + "..." + self.Tip = tip.splitlines() + # Prevent to call wx method in non-wx threads + wx.CallAfter(self.RefreshTip) + def MoveToolTip(self, pos): + @param pos: New tool tip position + # Get screen size to prevent tool tip to go out of the screen + screen_width, screen_height = wx.GetDisplaySize() + # Calculate position of tool tip to stay in screen limits + tip_width, tip_height = self.GetToolTipSize() + self.CurrentPosition = wx.Point( + max(0, min(pos.x, screen_width - tip_width)), + max(0, min(pos.y, screen_height - tip_height))) + def GetToolTipSize(self): + Get tool tip size according to tip text and restriction + @return: wx.Size(tool_tip_width, tool_tip_height) + max_width = max_height = 0 + # Create a memory DC for calculating text extent + # Compute max tip text size + w, h = dc.GetTextExtent(line) + max_width = max(max_width, w) + return wx.Size(max_width + 4, max_height + 4) + # Prevent to call this function if tool tip destroyed + # Refresh tool tip size and position + self.SetSize(self.GetToolTipSize()) + self.SetPosition(self.CurrentPosition) + def OnPaint(self, event): + Callback for Paint Event + @param event: Paint event + # Get buffered paint DC for tool tip + dc = wx.AutoBufferedPaintDC(self) + pen.SetJoin(wx.JOIN_MITER) + pen.SetCap(wx.CAP_PROJECTING) + dc.SetBrush(wx.Brush(wx.Colour(255, 238, 170))) + tip_width, tip_height = self.GetToolTipSize() + # Draw background rectangle + dc.DrawRectangle(0, 0, tip_width, tip_height) + dc.DrawText(line, 2, line_offset + 2) + line_width, line_height = dc.GetTextExtent(line) + line_offset += line_height --- a/controls/LogViewer.py Fri May 17 20:58:34 2013 +0200
+++ b/controls/LogViewer.py Thu May 23 18:47:44 2013 +0200
@@ -28,7 +28,8 @@
-from graphics import DebugViewer, REFRESH_PERIOD, ToolTip, TOOLTIP_WAIT_PERIOD
+from controls.CustomToolTip import CustomToolTip, TOOLTIP_WAIT_PERIOD +from graphics import DebugViewer, REFRESH_PERIOD from targets.typemapping import LogLevelsCount, LogLevels
from util.BitmapLibrary import GetBitmap
@@ -699,7 +700,7 @@
tooltip_pos = self.MessagePanel.ClientToScreen(self.LastMousePos)
- self.MessageToolTip = ToolTip(self.MessagePanel, message.GetFullText(), False)
+ self.MessageToolTip = CustomToolTip(self.MessagePanel, message.GetFullText(), False) self.MessageToolTip.SetFont(self.Font)
self.MessageToolTip.MoveToolTip(tooltip_pos)
self.MessageToolTip.Show()
--- a/graphics/GraphicCommons.py Fri May 17 20:58:34 2013 +0200
+++ b/graphics/GraphicCommons.py Thu May 23 18:47:44 2013 +0200
@@ -29,6 +29,8 @@
from threading import Lock,Timer
+from controls.CustomToolTip import CustomToolTip, TOOLTIP_WAIT_PERIOD #-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
@@ -102,9 +104,6 @@
# Define highlight refresh inhibition period in second
REFRESH_HIGHLIGHT_PERIOD = 0.1
-# Define tooltip wait for displaying period in second
-TOOLTIP_WAIT_PERIOD = 0.5
@@ -555,119 +554,6 @@
dc.SetUserScale(scalex, scaley)
#-------------------------------------------------------------------------------
-#-------------------------------------------------------------------------------
-Class that implements a custom tool tip
-if wx.Platform == '__WXMSW__':
- faces = { 'times': 'Times New Roman',
- 'mono' : 'Courier New',
- 'other': 'Comic Sans MS',
- faces = { 'times': 'Times',
- 'other': 'new century schoolbook',
-TOOLTIP_MAX_CHARACTERS = 30
-class ToolTip(wx.PopupWindow):
- def __init__(self, parent, tip, restricted=True):
- wx.PopupWindow.__init__(self, parent)
- self.CurrentPosition = wx.Point(0, 0)
- self.Restricted = restricted
- self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
- self.Font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
- self.Bind(wx.EVT_PAINT, self.OnPaint)
- def SetFont(self, font):
- for line in tip.splitlines():
- if self.Restricted and line != "":
- if len(new_line + " " + word) <= TOOLTIP_MAX_CHARACTERS:
- if self.Restricted and len(lines) > TOOLTIP_MAX_LINE:
- self.Tip = lines[:TOOLTIP_MAX_LINE]
- if len(self.Tip[-1]) < TOOLTIP_MAX_CHARACTERS - 3:
- self.Tip[-1] = self.Tip[-1][:TOOLTIP_MAX_CHARACTERS - 3] + "..."
- wx.CallAfter(self.RefreshTip)
- def MoveToolTip(self, pos):
- screen_size = wx.GetDisplaySize()
- w, h = self.GetTipExtent()
- self.CurrentPosition = wx.Point(
- max(0, min(pos.x, screen_size[0] - w - 4)),
- max(0, min(pos.y, screen_size[1] - h - 4)))
- def GetTipExtent(self):
- w, h = dc.GetTextExtent(line)
- max_width = max(max_width, w)
- return max_width, max_height
- w, h = self.GetTipExtent()
- self.SetSize(wx.Size(w + 4, h + 4))
- self.SetPosition(self.CurrentPosition)
- def OnPaint(self, event):
- dc = wx.AutoBufferedPaintDC(self)
- dc.SetPen(MiterPen(wx.BLACK))
- dc.SetBrush(wx.Brush(wx.Colour(255, 238, 170)))
- w, h = self.GetTipExtent()
- dc.DrawRectangle(0, 0, w + 4, h + 4)
- dc.DrawText(line, 2, offset + 2)
- w, h = dc.GetTextExtent(line)
-#-------------------------------------------------------------------------------
# Helpers for highlighting text
#-------------------------------------------------------------------------------
@@ -1107,7 +993,7 @@
def OnToolTipTimer(self, event):
value = self.GetToolTipValue()
if value is not None and self.ToolTipPos is not None:
- self.ToolTip = ToolTip(self.Parent, value)
+ self.ToolTip = CustomToolTip(self.Parent, value) self.ToolTip.MoveToolTip(self.ToolTipPos)