]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wx.lib.hyperlink from Andrea Gavana. It is a control like
authorRobin Dunn <robin@alldunn.com>
Fri, 13 May 2005 00:27:02 +0000 (00:27 +0000)
committerRobin Dunn <robin@alldunn.com>
Fri, 13 May 2005 00:27:02 +0000 (00:27 +0000)
static text that acts like a hyper-link, launching the system's
default browser in response to the clicks.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34035 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

wxPython/demo/HyperLinkCtrl.py [new file with mode: 0644]
wxPython/demo/Main.py
wxPython/demo/templateold.py [deleted file]
wxPython/docs/CHANGES.txt
wxPython/wx/lib/hyperlink.py [new file with mode: 0644]

diff --git a/wxPython/demo/HyperLinkCtrl.py b/wxPython/demo/HyperLinkCtrl.py
new file mode 100644 (file)
index 0000000..31bc6ef
--- /dev/null
@@ -0,0 +1,132 @@
+
+import wx
+import wx.lib.hyperlink as hl
+
+#----------------------------------------------------------------------
+
+class TestPanel(wx.Panel):
+    def __init__(self, parent, log):
+        self.log = log
+        wx.Panel.__init__(self, parent, -1)
+        self.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL, False))
+
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        self.SetSizer(sizer)        
+        
+        # Creator credits
+        text1 = wx.StaticText(self, -1, "HyperLinkCtrl Example By Andrea Gavana")
+        text1.SetFont(wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD, False, 'Verdana'))
+        
+        sizer.Add((0,10))
+        sizer.Add(text1, 0, wx.LEFT | wx.TOP | wx.BOTTOM, 10)
+        
+        text2 = wx.StaticText(self, -1, "Latest Revision: 11 May 2005")
+        text2.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL, False, 'Verdana'))
+        sizer.Add(text2, 0, wx.LEFT, 10)
+       
+        sizer.Add((0,25))
+
+        # Default Web links:
+        self._hyper1 = hl.HyperLinkCtrl(self, wx.ID_ANY, "wxPython Main Page",
+                                        URL="http://www.wxpython.org/")
+        sizer.Add(self._hyper1, 0, wx.ALL, 10)
+        
+        
+        # Web link with underline rollovers, opens in window
+        self._hyper2 = hl.HyperLinkCtrl(self, wx.ID_ANY, "My Home Page",
+                                        URL="http://xoomer.virgilio.it/infinity77/")
+        sizer.Add(self._hyper2, 0, wx.ALL, 10)
+        self._hyper2.Bind(hl.EVT_HYPERLINK_MIDDLE, self.OnMiddleLink)
+        self._hyper2.AutoBrowse(False)
+        self._hyper2.SetColours("BLUE", "BLUE", "BLUE")
+        self._hyper2.EnableRollover(True)
+        self._hyper2.SetUnderlines(False, False, True)
+        self._hyper2.SetBold(True)
+        self._hyper2.OpenInSameWindow(True) # middle click to open in window
+        self._hyper2.SetToolTip(wx.ToolTip("Middle-click to open in browser window"))
+        self._hyper2.UpdateLink()
+
+
+        # Intense link examples..
+        self._hyper3 = hl.HyperLinkCtrl(self, wx.ID_ANY, "wxPython Mail Archive",
+                                        URL="http://lists.wxwidgets.org/")
+        sizer.Add(self._hyper3, 0, wx.ALL, 10)
+        self._hyper3.Bind(hl.EVT_HYPERLINK_RIGHT, self.OnRightLink)
+        
+        self._hyper3.SetLinkCursor(wx.CURSOR_QUESTION_ARROW)
+        self._hyper3.SetColours("GREEN", "RED", "YELLOW")
+        self._hyper3.SetUnderlines(False, False, False)
+        self._hyper3.EnableRollover(True)
+        self._hyper3.SetBold(True)
+        self._hyper3.DoPopup(False)
+        self._hyper3.UpdateLink()
+
+
+        self._hyper4 = hl.HyperLinkCtrl(self, wx.ID_ANY,
+                                        "Open Google In Current Browser Window?",
+                                        URL="http://www.google.com")
+        sizer.Add(self._hyper4, 0, wx.ALL, 10)
+        self._hyper4.Bind(hl.EVT_HYPERLINK_LEFT, self.OnLink)
+        self._hyper4.SetToolTip(wx.ToolTip("Click link for yes, no, cancel dialog"))
+        self._hyper4.AutoBrowse(False)
+
+
+        
+
+
+    def OnLink(self, event):
+        # Goto URL, demonstrates attempt to open link in current window:
+        strs = "Open Google In Current Browser Window "
+        strs = strs + "(NO Opens Google In Another Browser Window)?"
+        nResult = wx.MessageBox(strs, "HyperLinkCtrl", wx.YES_NO |
+                                wx.CANCEL | wx.ICON_QUESTION, self)
+
+        if nResult == wx.YES:
+            self._hyper4.GotoURL("http://www.google.com", True, True)
+        elif nResult == wx.NO:
+            self._hyper4.GotoURL("http://www.google.com", True, False)
+
+        
+        
+    def OnRightLink(self, event):
+        pos = event.GetPosition()
+        menuPopUp = wx.Menu("Having a nice day?")
+        ID_MENU_YES = wx.NewId()
+        ID_MENU_NO  = wx.NewId()
+        menuPopUp.Append(ID_MENU_YES, "Yes, absolutely!")
+        menuPopUp.Append(ID_MENU_NO,  "I've had better")
+        self.PopupMenu(menuPopUp, self._hyper3.GetPosition())
+        menuPopUp.Destroy()
+        
+
+
+    def OnMiddleLink(self, event):
+        self._hyper2.GotoURL("http://xoomer.virgilio.it/infinity77/",
+                             True, True)
+
+
+
+#----------------------------------------------------------------------
+
+def runTest(frame, nb, log):
+    win = TestPanel(nb, log)
+    return win
+
+#----------------------------------------------------------------------
+
+
+
+overview = """<html><body>
+<h2><center>Say something nice here</center></h2>
+
+</body></html>
+"""
+
+
+
+if __name__ == '__main__':
+    import sys,os
+    import run
+    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
+
+
index 25cd0792779d7badc9d2797fef7544a7dc225347..560bd0951f1ff873aadcabca9da3d15bb7efd187 100644 (file)
@@ -49,6 +49,7 @@ _treeList = [
     ('Recent Additions/Updates', [
         'FoldPanelBar',
         'GIFAnimationCtrl',
+        'HyperLinkCtrl',
         ]),
 
     # managed windows == things with a (optional) caption you can close
@@ -156,6 +157,7 @@ _treeList = [
         'FoldPanelBar',
         'GIFAnimationCtrl',
         'HtmlWindow',
+        'HyperLinkCtrl',
         'IntCtrl',
         'MediaCtrl',
         'MVCTree',   
diff --git a/wxPython/demo/templateold.py b/wxPython/demo/templateold.py
deleted file mode 100644 (file)
index b02918a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-
-from wxPython.wx import *
-
-#----------------------------------------------------------------------
-
-class TestPanel(wxPanel):
-    def __init__(self, parent, log):
-        self.log = log
-        wxPanel.__init__(self, parent, -1)
-
-#----------------------------------------------------------------------
-
-def runTest(frame, nb, log):
-    win = TestPanel(nb, log)
-    return win
-
-#----------------------------------------------------------------------
-
-
-
-overview = """<html><body>
-<h2><center>Say something nice here</center></h2>
-
-</body></html>
-"""
-
-
-
-if __name__ == '__main__':
-    import sys,os
-    import run
-    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
-
index a550ce3a81b5fc5b1a0813faf0cb71c43633467c..38f58ff84785b75770b411167b28ba659ec548de 100644 (file)
@@ -48,6 +48,14 @@ locking or unlocking in wxPyBeginBlockThreads and wxPyEndBlockThreads
 as these can be triggered after Python has been finalized in embedding
 situations.
 
+Added alternate constructors for wx.Font: wx.FontFromPixelSize,
+wx.FFont, wx.FFontFromPixelSize.  See the docstrings or new api docs
+for details.
+
+Added wx.lib.hyperlink from Andrea Gavana.  It is a control like
+static text that acts like a hyper-link, launching the system's
+default browser in response to the clicks.
+
 
 
 
diff --git a/wxPython/wx/lib/hyperlink.py b/wxPython/wx/lib/hyperlink.py
new file mode 100644 (file)
index 0000000..adc7463
--- /dev/null
@@ -0,0 +1,429 @@
+# --------------------------------------------------------------------------- #
+# HYPERLINKSCTRL wxPython IMPLEMENTATION
+# Ported From Angelo Mandato C++ Code By:
+#
+# Andrea Gavana, @ 27 Mar 2005
+# Latest Revision: 27 Apr 2005, 22.30 CET
+#
+#
+# Original Web Site (For The C++ Code):
+#
+# http://www.spaceblue.com/codedetail.php?CodeID=7
+#
+#
+# For all kind of problems, requests of enhancements and bug reports, please
+# write to me at:
+#
+# andrea.gavana@agip.it
+# andrea_gavan@tin.it
+#
+# Or, obviously, to the wxPython mailing list!!!
+#
+#
+# End Of Comments
+# --------------------------------------------------------------------------- #
+
+"""
+`HyperLinkCtrl` is a control for wxPython that acts like a hyper link
+in a typical browser. Latest features include the ability to capture
+your own Left, Middle, and Right click events to perform your own
+custom event handling and ability to open link in a new or current
+browser window.
+
+Special thanks to Robin Dunn for the event binder for the 3 mouse buttons.
+
+
+Latest Revision: Andrea Gavana @ 11 May 2005, 21.00 CET
+
+"""
+
+import wx
+from wx.lib.stattext import GenStaticText as StaticText
+
+# Import the useful webbrowser module for platform-independent results
+import webbrowser
+
+# Set no delay time to open the web page
+webbrowser.PROCESS_CREATION_DELAY = 0
+
+# To show a popup that copies the hyperlinks on the clipboard
+wxHYPERLINKS_POPUP_COPY = 1000
+
+
+#-----------------------------------#
+#        HyperLinksEvents
+#-----------------------------------#
+
+# wxEVT_HYPERLINK_LEFT: Respond To A Left Mouse Button Event
+# wxEVT_HYPERLINK_MIDDLE: Respond To A Middle Mouse Button Event
+# wxEVT_HYPERLINK_RIGHT: Respond To A Right Mouse Button Event
+
+wxEVT_HYPERLINK_LEFT = wx.NewEventType()
+wxEVT_HYPERLINK_MIDDLE = wx.NewEventType()
+wxEVT_HYPERLINK_RIGHT = wx.NewEventType()
+
+EVT_HYPERLINK_LEFT = wx.PyEventBinder(wxEVT_HYPERLINK_LEFT, 1)
+EVT_HYPERLINK_MIDDLE = wx.PyEventBinder(wxEVT_HYPERLINK_MIDDLE, 1)
+EVT_HYPERLINK_RIGHT = wx.PyEventBinder(wxEVT_HYPERLINK_RIGHT, 1)
+
+
+# ------------------------------------------------------------
+# This class implements the event listener for the hyperlinks
+# ------------------------------------------------------------
+
+class HyperLinkEvent(wx.PyCommandEvent):
+    """
+    Event object sent in response to clicking on a `HyperLinkCtrl`.
+    """
+
+    def __init__(self, eventType, id):
+        """ Default Class Constructor. """        
+        wx.PyCommandEvent.__init__(self, eventType, id)
+        self._eventType = eventType
+
+
+    def SetPosition(self, pos):
+        """ Sets Event Position """        
+        self._pos = pos
+
+
+    def GetPosition(self):
+        """ Returns Event Position """        
+        return self._pos
+
+
+# -------------------------------------------------
+# This is the main HyperLinkCtrl implementation
+# it user the StatiText from wx.lib.stattext
+# because of its "quasi-dynamic" behavior
+# -------------------------------------------------
+
+class HyperLinkCtrl(StaticText):
+    """
+    `HyperLinkCtrl` is a control for wxPython that acts like a hyper
+    link in a typical browser. Latest features include the ability to
+    capture your own Left, Middle, and Right click events to perform
+    your own custom event handling and ability to open link in a new
+    or current browser window.
+
+    Events
+    ------
+        ====================  =======================================
+        EVT_HYPERLINK_LEFT    Sent when the left mouse button is
+                              clicked, but only if `AutoBrowse` is set
+                              to ``False``.
+        EVT_HYPERLINK_MIDDLE  Sent when the middle mouse button is
+                              clicked.
+        EVT_HYPERLINK_RIGHT   Sent when the right mouse button is
+                              clicked, but only if `DoPopup` is set
+                              to ``False``.
+        ====================  =======================================
+    """
+    
+    def __init__(self, parent, id=-1, label="", pos=wx.DefaultPosition,
+                 size=wx.DefaultSize, style=0, name="staticText", URL=""):
+        """
+        Default class constructor.
+                       
+        Pass URL == "" to use the label as the url link to navigate to
+        """
+        
+        StaticText.__init__(self, parent, id, label, pos, size,
+                            style, name)
+
+        if URL.strip() == "":
+            self._URL = label
+        else:
+            self._URL = URL
+
+        # Set Tooltip
+        self.SetToolTip(wx.ToolTip(self._URL))
+
+        # Set default properties
+        # default: True
+        self.ReportErrors()
+
+        # default: True, True, True
+        self.SetUnderlines()
+
+        # default: blue, violet, blue        
+        self.SetColours()
+
+        # default: False
+        self.SetVisited()
+
+        # default: False 
+        self.EnableRollover()
+
+        # default: False        
+        self.SetBold()
+
+        # default: wx.CURSOR_HAND        
+        self.SetLinkCursor() 
+
+        # default True
+        self.AutoBrowse()
+
+        # default True        
+        self.DoPopup() 
+
+        # default False
+        self.OpenInSameWindow()
+
+        # Set control properties and refresh
+        self.UpdateLink(True)
+
+        self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouseEvent)
+        self.Bind(wx.EVT_MOTION, self.OnMouseEvent)        
+    
+    
+    def GotoURL(self, URL, ReportErrors=True, NotSameWinIfPossible=False):
+        """
+        Goto The Specified URL.
+
+        :param ReportErrors: Use True to display error dialog if an
+            error occurrs navigating to the URL.
+
+        :param NotSameWinIfPossible: Use True to attempt to open the
+            URL in new browser window.
+
+        """
+    
+        logOff = wx.LogNull()
+
+        try:            
+            webbrowser.open(URL, new=NotSameWinIfPossible)
+            self.SetVisited(True)
+            self.UpdateLink(True)
+
+            return True
+        
+        except:            
+            self.DisplayError("Unable To Launch Browser.", ReportErrors)
+            return False
+
+
+    def OnMouseEvent(self, event):
+        """ Captures mouse events for cursor, link colors and underlines. """
+
+        if event.Moving():
+            # Mouse Is Moving On The StaticText
+            # Set The Hand Cursor On The Link
+            self.SetCursor(self._CursorHand)
+
+            if self._EnableRollover:
+                self.SetForegroundColour(self._LinkRolloverColor)
+                fontTemp = self.GetFont()
+                fontTemp.SetUnderlined(self._RolloverUnderline)
+                if self._Bold:
+                    fontTemp.SetWeight(wx.BOLD)
+
+                self.SetFont(fontTemp)
+                self.Refresh()
+
+        else:            
+            # Restore The Original Cursor            
+            self.SetCursor(wx.NullCursor)
+            if self._EnableRollover:
+                self.UpdateLink(True)
+            
+            if event.LeftUp():
+                # Left Button Was Pressed
+                if self._AutoBrowse:                    
+                    self.GotoURL(self._URL, self._ReportErrors,
+                                 self._NotSameWinIfPossible)
+
+                else:
+                    eventOut = HyperLinkEvent(wxEVT_HYPERLINK_LEFT, self.GetId())
+                    eventOut.SetEventObject(self)
+                    eventOut.SetPosition(event.GetPosition())
+                    self.GetEventHandler().ProcessEvent(eventOut)
+
+                self.SetVisited(True)
+
+            elif event.RightUp():
+                # Right Button Was Pressed
+                if self._DoPopup:
+                    # Popups A Menu With The "Copy HyperLynks" Feature
+                    menuPopUp = wx.Menu("", wx.MENU_TEAROFF)
+                    menuPopUp.Append(wxHYPERLINKS_POPUP_COPY, "Copy HyperLink")
+                    self.Bind(wx.EVT_MENU, self.OnPopUpCopy, id=wxHYPERLINKS_POPUP_COPY)
+                    self.PopupMenu(menuPopUp, wx.Point(event.m_x, event.m_y))
+                    menuPopUp.Destroy()
+                    self.Unbind(wx.EVT_MENU, id=wxHYPERLINKS_POPUP_COPY)
+                    
+                else:                    
+                    eventOut = HyperLinkEvent(wxEVT_HYPERLINK_RIGHT, self.GetId())
+                    eventOut.SetEventObject(self)
+                    eventOut.SetPosition(event.GetPosition())
+                    self.GetEventHandler().ProcessEvent(eventOut)
+
+            elif event.MiddleUp():
+                # Middle Button Was Pressed
+                eventOut = HyperLinkEvent(wxEVT_HYPERLINK_MIDDLE, self.GetId())
+                eventOut.SetEventObject(self)
+                eventOut.SetPosition(event.GetPosition())
+                self.GetEventHandler().ProcessEvent(eventOut)
+
+        event.Skip()
+
+
+    def OnPopUpCopy(self, event):
+        """ Copy data from the HyperLink to the clipboard. """
+
+        wx.TheClipboard.UsePrimarySelection(False)
+        if not wx.TheClipboard.Open():
+            return
+        data = wx.TextDataObject(self._URL)
+        wx.TheClipboard.SetData(data)
+        wx.TheClipboard.Close()
+
+
+    def UpdateLink(self, OnRefresh=True):
+        """
+        Updates the link.
+
+        Changing text properties if:
+            - User Specific Setting
+            - Link Visited
+            - New Link
+        
+        """
+
+        fontTemp = self.GetFont()
+
+        if self._Visited:
+            self.SetForegroundColour(self._VisitedColour)
+            fontTemp.SetUnderlined(self._VisitedUnderline)
+        
+        else:
+
+            self.SetForegroundColour(self._LinkColour)
+            fontTemp.SetUnderlined(self._LinkUnderline)
+
+
+        if self._Bold:
+            fontTemp.SetWeight(wx.BOLD)
+
+        self.SetFont(fontTemp)
+        self.Refresh(OnRefresh)
+
+
+    def DisplayError(self, ErrorMessage, ReportErrors=True):
+        """
+        Displays an error message (according to ReportErrors variable)
+        in a MessageBox.
+        """
+        if ReportErrors:
+            wx.MessageBox(ErrorMessage, "HyperLinks Error", wx.OK | wx.CENTRE | wx.ICON_ERROR)
+
+
+    def SetColours(self,
+                   link=wx.Colour(0, 0, 255),
+                   visited=wx.Colour(79, 47, 79),
+                   rollover=wx.Colour(0, 0, 255)):
+        """ Sets the colours for the link, the visited link and the mouse rollover.
+
+        Defaults Are:
+            - New Link: RED
+            - Visited Link: VIOLET
+            - Rollover: BLUE
+
+        """        
+        self._LinkColour = link
+        self._VisitedColour = visited
+        self._LinkRolloverColor = rollover
+
+    
+    def GetColours(self):
+        """
+        Gets the colours for the link, the visited link and the mouse
+        rollover.
+        """        
+        return self._LinkColour, self._VisitedColour, self._LinkRolloverColor
+
+    
+    def SetUnderlines(self, link=True, visited=True, rollover=True):
+        """ Underlines Properties. """        
+        self._LinkUnderline = link
+        self._RolloverUnderline = rollover
+        self._VisitedUnderline = visited
+
+
+    def GetUnderlines(self):
+        """
+        Returns if link is underlined, if the mouse rollover is
+        underlined and if the visited link is underlined.
+        """
+        return self._LinkUnderline, self._RolloverUnderline, self._VisitedUnderline
+    
+
+    def SetLinkCursor(self, cur=wx.CURSOR_HAND):
+        """ Sets link cursor properties. """        
+        self._CursorHand = wx.StockCursor(cur)
+
+
+    def GetLinkCursor(self):
+        """ Gets the link cursor. """        
+        return self._CursorHand
+
+
+    def SetVisited(self, Visited=False):
+        """ Sets a link as visited. """
+        
+        self._Visited = Visited
+
+        
+    def GetVisited(self):
+        """ Returns whether a link has been visited or not. """        
+        return self._Visited
+
+
+    def SetBold(self, Bold=False):
+        """ Sets the HyperLink in bold text. """        
+        self._Bold = Bold
+
+        
+    def GetBold(self):
+        """ Returns whether the HyperLink has text in bold or not. """
+        return self._Bold
+
+
+    def SetURL(self, URL):
+        """ Sets the HyperLink text to the specified URL. """        
+        self._URL = URL
+
+        
+    def GetURL(self):
+        """ Retrieve the URL associated to the HyperLink. """        
+        return self._URL
+
+
+    def OpenInSameWindow(self, NotSameWinIfPossible=False):
+        """ Open multiple URL in the same window (if possible). """        
+        self._NotSameWinIfPossible = NotSameWinIfPossible
+
+
+    def EnableRollover(self, EnableRollover=False):
+        """ Enable/disable rollover. """        
+        self._EnableRollover = EnableRollover
+
+    
+    def ReportErrors(self, ReportErrors=True):
+        """ Set whether to report browser errors or not. """        
+        self._ReportErrors = ReportErrors
+
+
+    def AutoBrowse(self, AutoBrowse=True):
+        """
+        Automatically browse to URL when clicked. set to False to
+        receive EVT_HYPERLINK_LEFT event.
+        """        
+        self._AutoBrowse = AutoBrowse
+
+
+    def DoPopup(self, DoPopup=True):
+        """ Sets whether to show popup menu on right click or not. """        
+        self._DoPopup = DoPopup
+
+