1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/generic/hyperlink.h
3 // Purpose:     Hyperlink control
4 // Author:      David Norris <danorris@gmail.com>, Otto Wyss
5 // Modified by: Ryan Norton, Francesco Montorsi
6 // Created:     04/02/2005
7 // Copyright:   (c) 2005 David Norris
8 // Licence:     wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10 
11 #ifndef _WX_GENERICHYPERLINKCTRL_H_
12 #define _WX_GENERICHYPERLINKCTRL_H_
13 
14 // ----------------------------------------------------------------------------
15 // wxGenericHyperlinkCtrl
16 // ----------------------------------------------------------------------------
17 
18 class WXDLLIMPEXP_ADV wxGenericHyperlinkCtrl : public wxHyperlinkCtrlBase
19 {
20 public:
21     // Default constructor (for two-step construction).
wxGenericHyperlinkCtrl()22     wxGenericHyperlinkCtrl() { Init(); }
23 
24     // Constructor.
25     wxGenericHyperlinkCtrl(wxWindow *parent,
26                             wxWindowID id,
27                             const wxString& label, const wxString& url,
28                             const wxPoint& pos = wxDefaultPosition,
29                             const wxSize& size = wxDefaultSize,
30                             long style = wxHL_DEFAULT_STYLE,
31                             const wxString& name = wxHyperlinkCtrlNameStr)
32     {
33         Init();
34         (void) Create(parent, id, label, url, pos, size, style, name);
35     }
36 
37     // Creation function (for two-step construction).
38     bool Create(wxWindow *parent,
39                 wxWindowID id,
40                 const wxString& label, const wxString& url,
41                 const wxPoint& pos = wxDefaultPosition,
42                 const wxSize& size = wxDefaultSize,
43                 long style = wxHL_DEFAULT_STYLE,
44                 const wxString& name = wxHyperlinkCtrlNameStr);
45 
46 
47     // get/set
GetHoverColour()48     wxColour GetHoverColour() const { return m_hoverColour; }
SetHoverColour(const wxColour & colour)49     void SetHoverColour(const wxColour &colour) { m_hoverColour = colour; }
50 
GetNormalColour()51     wxColour GetNormalColour() const { return m_normalColour; }
52     void SetNormalColour(const wxColour &colour);
53 
GetVisitedColour()54     wxColour GetVisitedColour() const { return m_visitedColour; }
55     void SetVisitedColour(const wxColour &colour);
56 
GetURL()57     wxString GetURL() const { return m_url; }
SetURL(const wxString & url)58     void SetURL (const wxString &url) { m_url=url; }
59 
60     void SetVisited(bool visited = true) { m_visited=visited; }
GetVisited()61     bool GetVisited() const { return m_visited; }
62 
63     // NOTE: also wxWindow::Set/GetLabel, wxWindow::Set/GetBackgroundColour,
64     //       wxWindow::Get/SetFont, wxWindow::Get/SetCursor are important !
65 
66 
67 protected:
68     // Helper used by this class itself and native MSW implementation that
69     // connects OnRightUp() and OnPopUpCopy() handlers.
70     void ConnectMenuHandlers();
71 
72     // event handlers
73 
74     // Renders the hyperlink.
75     void OnPaint(wxPaintEvent& event);
76 
77     // Handle set/kill focus events (invalidate for painting focus rect)
78     void OnFocus(wxFocusEvent& event);
79 
80     // Fire a HyperlinkEvent on space
81     void OnChar(wxKeyEvent& event);
82 
83     // Returns the wxRect of the label of this hyperlink.
84     // This is different from the clientsize's rectangle when
85     // clientsize != bestsize and this rectangle is influenced
86     // by the alignment of the label (wxHL_ALIGN_*).
87     wxRect GetLabelRect() const;
88 
89     // If the click originates inside the bounding box of the label,
90     // a flag is set so that an event will be fired when the left
91     // button is released.
92     void OnLeftDown(wxMouseEvent& event);
93 
94     // If the click both originated and finished inside the bounding box
95     // of the label, a HyperlinkEvent is fired.
96     void OnLeftUp(wxMouseEvent& event);
97     void OnRightUp(wxMouseEvent& event);
98 
99     // Changes the cursor to a hand, if the mouse is inside the label's
100     // bounding box.
101     void OnMotion(wxMouseEvent& event);
102 
103     // Changes the cursor back to the default, if necessary.
104     void OnLeaveWindow(wxMouseEvent& event);
105 
106     // handles "Copy URL" menuitem
107     void OnPopUpCopy(wxCommandEvent& event);
108 
109     // overridden base class virtuals
110 
111     // Returns the best size for the window, which is the size needed
112     // to display the text label.
113     virtual wxSize DoGetBestClientSize() const;
114 
115     // creates a context menu with "Copy URL" menuitem
116     virtual void DoContextMenu(const wxPoint &);
117 
118 private:
119     // Common part of all ctors.
120     void Init();
121 
122     // URL associated with the link. This is transmitted inside
123     // the HyperlinkEvent fired when the user clicks on the label.
124     wxString m_url;
125 
126     // Foreground colours for various link types.
127     // NOTE: wxWindow::m_backgroundColour is used for background,
128     //       wxWindow::m_foregroundColour is used to render non-visited links
129     wxColour m_hoverColour;
130     wxColour m_normalColour;
131     wxColour m_visitedColour;
132 
133     // True if the mouse cursor is inside the label's bounding box.
134     bool m_rollover;
135 
136     // True if the link has been clicked before.
137     bool m_visited;
138 
139     // True if a click is in progress (left button down) and the click
140     // originated inside the label's bounding box.
141     bool m_clicking;
142 };
143 
144 #endif // _WX_GENERICHYPERLINKCTRL_H_
145