X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c105dda0810d927d8531e4949ada0b407a1cbebd..c44db939d6fb7975ee95747cdfb158001675e0e1:/src/generic/hyperlinkg.cpp diff --git a/src/generic/hyperlinkg.cpp b/src/generic/hyperlinkg.cpp index 573c18d178..257e6ef67f 100644 --- a/src/generic/hyperlinkg.cpp +++ b/src/generic/hyperlinkg.cpp @@ -41,13 +41,12 @@ #endif #include "wx/clipbrd.h" +#include "wx/renderer.h" // ============================================================================ // implementation // ============================================================================ -IMPLEMENT_DYNAMIC_CLASS(wxGenericHyperlinkCtrl, wxControl) - // reserved for internal use only #define wxHYPERLINK_POPUP_COPY_ID 16384 @@ -62,6 +61,9 @@ bool wxGenericHyperlinkCtrl::Create(wxWindow *parent, wxWindowID id, // do validation checks: CheckParams(label, url, style); + if ((style & wxHL_ALIGN_LEFT) == 0) + style |= wxFULL_REPAINT_ON_RESIZE; + if (!wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name)) return false; @@ -69,13 +71,7 @@ bool wxGenericHyperlinkCtrl::Create(wxWindow *parent, wxWindowID id, SetURL(url.empty() ? label : url); SetLabel(label.empty() ? url : label); - m_rollover = false; - m_clicking = false; - m_visited = false; - - // colours - m_normalColour = *wxBLUE; - m_hoverColour = *wxRED; + Init(); SetForegroundColour(m_normalColour); // by default the font of an hyperlink control is underlined @@ -94,31 +90,44 @@ bool wxGenericHyperlinkCtrl::Create(wxWindow *parent, wxWindowID id, // with GTK+'s native handling): Connect( wxEVT_PAINT, wxPaintEventHandler(wxGenericHyperlinkCtrl::OnPaint) ); - Connect( wxEVT_SIZE, wxSizeEventHandler(wxGenericHyperlinkCtrl::OnSize) ); + Connect( wxEVT_SET_FOCUS, wxFocusEventHandler(wxGenericHyperlinkCtrl::OnFocus) ); + Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler(wxGenericHyperlinkCtrl::OnFocus) ); + Connect( wxEVT_CHAR, wxKeyEventHandler(wxGenericHyperlinkCtrl::OnChar) ); Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler(wxGenericHyperlinkCtrl::OnLeaveWindow) ); Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler(wxGenericHyperlinkCtrl::OnLeftDown) ); Connect( wxEVT_LEFT_UP, wxMouseEventHandler(wxGenericHyperlinkCtrl::OnLeftUp) ); - Connect( wxEVT_RIGHT_UP, wxMouseEventHandler(wxGenericHyperlinkCtrl::OnRightUp) ); Connect( wxEVT_MOTION, wxMouseEventHandler(wxGenericHyperlinkCtrl::OnMotion) ); - Connect( wxHYPERLINK_POPUP_COPY_ID, wxEVT_COMMAND_MENU_SELECTED, - wxCommandEventHandler(wxGenericHyperlinkCtrl::OnPopUpCopy) ); + ConnectMenuHandlers(); return true; } -wxSize wxGenericHyperlinkCtrl::DoGetBestSize() const +void wxGenericHyperlinkCtrl::Init() { - int w, h; + m_rollover = false; + m_clicking = false; + m_visited = false; - wxClientDC dc((wxWindow *)this); - dc.SetFont(GetFont()); - dc.GetTextExtent(GetLabel(), &w, &h); + // colours + m_normalColour = *wxBLUE; + m_hoverColour = *wxRED; + m_visitedColour = wxColour("#551a8b"); +} - wxSize best(w, h); - CacheBestSize(best); - return best; +void wxGenericHyperlinkCtrl::ConnectMenuHandlers() +{ + // Connect the event handlers for the context menu. + Connect( wxEVT_RIGHT_UP, wxMouseEventHandler(wxGenericHyperlinkCtrl::OnRightUp) ); + Connect( wxHYPERLINK_POPUP_COPY_ID, wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(wxGenericHyperlinkCtrl::OnPopUpCopy) ); +} + +wxSize wxGenericHyperlinkCtrl::DoGetBestClientSize() const +{ + wxClientDC dc((wxWindow *)this); + return dc.GetTextExtent(GetLabel()); } @@ -145,7 +154,7 @@ void wxGenericHyperlinkCtrl::SetVisitedColour(const wxColour &colour) void wxGenericHyperlinkCtrl::DoContextMenu(const wxPoint &pos) { wxMenu *menuPopUp = new wxMenu(wxEmptyString, wxMENU_TEAROFF); - menuPopUp->Append(wxHYPERLINK_POPUP_COPY_ID, wxT("Copy URL")); + menuPopUp->Append(wxHYPERLINK_POPUP_COPY_ID, _("&Copy URL")); PopupMenu( menuPopUp, pos ); delete menuPopUp; } @@ -182,6 +191,32 @@ void wxGenericHyperlinkCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) dc.SetTextBackground(GetBackgroundColour()); dc.DrawText(GetLabel(), GetLabelRect().GetTopLeft()); + if (HasFocus()) + { + wxRendererNative::Get().DrawFocusRect(this, dc, GetClientRect(), wxCONTROL_SELECTED); + } +} + +void wxGenericHyperlinkCtrl::OnFocus(wxFocusEvent& event) +{ + Refresh(); + event.Skip(); +} + +void wxGenericHyperlinkCtrl::OnChar(wxKeyEvent& event) +{ + switch (event.m_keyCode) + { + default: + event.Skip(); + break; + case WXK_SPACE: + case WXK_NUMPAD_SPACE: + SetForegroundColour(m_visitedColour); + m_visited = true; + SendEvent(); + break; + } } void wxGenericHyperlinkCtrl::OnLeftDown(wxMouseEvent& event) @@ -193,7 +228,7 @@ void wxGenericHyperlinkCtrl::OnLeftDown(wxMouseEvent& event) void wxGenericHyperlinkCtrl::OnLeftUp(wxMouseEvent& event) { // the click must be started and ended in the hyperlink rect - if (!m_clicking || !GetLabelRect().Contains(event.GetPosition())) + if (!m_clicking || !GetLabelRect().Contains(event.GetPosition())) return; SetForegroundColour(m_visitedColour); @@ -259,11 +294,4 @@ void wxGenericHyperlinkCtrl::OnPopUpCopy( wxCommandEvent& WXUNUSED(event) ) #endif // wxUSE_CLIPBOARD } -void wxGenericHyperlinkCtrl::OnSize(wxSizeEvent& WXUNUSED(event)) -{ - // update the position of the label in the screen respecting - // the selected align flag - Refresh(); -} - #endif // wxUSE_HYPERLINKCTRL