Provide native wxHyperlinkCtrl implementation for wxMSW.
Use the "syslink" native control to implement wxHyperlinkCtrl under (recent enough, i.e. XP or later) versions of Windows. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65334 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
172
src/msw/hyperlink.cpp
Normal file
172
src/msw/hyperlink.cpp
Normal file
@@ -0,0 +1,172 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: src/msw/hyperlink.cpp
|
||||
// Purpose: Hyperlink control
|
||||
// Author: Rickard Westerlund
|
||||
// Created: 2010-08-03
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2010 wxWidgets team
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#if wxUSE_HYPERLINKCTRL
|
||||
|
||||
#include "wx/hyperlink.h"
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/stattext.h"
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Definitions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#ifndef LM_GETIDEALSIZE
|
||||
#define LM_GETIDEALSIZE (WM_USER + 0x301)
|
||||
#endif
|
||||
|
||||
#ifndef LWS_RIGHT
|
||||
#define LWS_RIGHT 0x0020
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Helper functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
namespace
|
||||
{
|
||||
bool HasNativeHyperlinkCtrl()
|
||||
{
|
||||
return wxGetWinVersion() >= wxWinVersion_XP;
|
||||
}
|
||||
|
||||
wxString GetLabelForSysLink(const wxString& text, const wxString& url)
|
||||
{
|
||||
return wxString("<A HREF=\"") + wxStaticText::RemoveMarkup(url) + "\">"
|
||||
+ wxStaticText::RemoveMarkup(text) + "</A>";
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxHyperlinkCtrl
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxHyperlinkCtrl::Create(wxWindow *parent,
|
||||
wxWindowID id,
|
||||
const wxString& label, const wxString& url,
|
||||
const wxPoint& pos,
|
||||
const wxSize& size,
|
||||
long style,
|
||||
const wxString& name)
|
||||
{
|
||||
if ( !HasNativeHyperlinkCtrl() )
|
||||
{
|
||||
return wxGenericHyperlinkCtrl::Create( parent, id, label, url, pos,
|
||||
size, style, name );
|
||||
}
|
||||
|
||||
if ( !CreateControl(parent, id, pos, size, style,
|
||||
wxDefaultValidator, name) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SetURL( url );
|
||||
SetVisited( false );
|
||||
|
||||
WXDWORD exstyle;
|
||||
WXDWORD msStyle = MSWGetStyle(style, &exstyle);
|
||||
|
||||
if ( !MSWCreateControl(WC_LINK, msStyle, pos, size,
|
||||
GetLabelForSysLink( label, url ), exstyle) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Make sure both the label and URL are non-empty strings.
|
||||
SetURL(url.empty() ? label : url);
|
||||
SetLabel(label.empty() ? url : label);
|
||||
|
||||
ConnectMenuHandlers();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
WXDWORD wxHyperlinkCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
|
||||
{
|
||||
WXDWORD msStyle = wxControl::MSWGetStyle( style, exstyle );
|
||||
|
||||
if ( style & wxHL_ALIGN_RIGHT )
|
||||
msStyle |= LWS_RIGHT;
|
||||
|
||||
return msStyle;
|
||||
}
|
||||
|
||||
void wxHyperlinkCtrl::SetURL(const wxString &url)
|
||||
{
|
||||
if ( !HasNativeHyperlinkCtrl() )
|
||||
{
|
||||
wxGenericHyperlinkCtrl::SetURL( url );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( GetURL() != url )
|
||||
SetVisited( false );
|
||||
wxGenericHyperlinkCtrl::SetURL( url );
|
||||
wxWindow::SetLabel( GetLabelForSysLink(m_labelOrig, url) );
|
||||
}
|
||||
|
||||
void wxHyperlinkCtrl::SetLabel(const wxString &label)
|
||||
{
|
||||
if ( !HasNativeHyperlinkCtrl() )
|
||||
{
|
||||
wxGenericHyperlinkCtrl::SetLabel( label );
|
||||
return;
|
||||
}
|
||||
|
||||
m_labelOrig = label;
|
||||
wxWindow::SetLabel( GetLabelForSysLink(label, GetURL()) );
|
||||
InvalidateBestSize();
|
||||
}
|
||||
|
||||
wxSize wxHyperlinkCtrl::DoGetBestClientSize() const
|
||||
{
|
||||
// LM_GETIDEALSIZE only exists under Vista so use the generic version even
|
||||
// when using the native control under XP
|
||||
if ( wxGetWinVersion() < wxWinVersion_6 )
|
||||
return wxGenericHyperlinkCtrl::DoGetBestClientSize();
|
||||
|
||||
SIZE idealSize;
|
||||
::SendMessage(m_hWnd, LM_GETIDEALSIZE, 0, (LPARAM)&idealSize);
|
||||
|
||||
return wxSize(idealSize.cx, idealSize.cy);
|
||||
}
|
||||
|
||||
bool wxHyperlinkCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
||||
{
|
||||
if ( HasNativeHyperlinkCtrl() )
|
||||
{
|
||||
switch ( ((LPNMHDR) lParam)->code )
|
||||
{
|
||||
case NM_CLICK:
|
||||
case NM_RETURN:
|
||||
SetVisited();
|
||||
SendEvent();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return wxGenericHyperlinkCtrl::MSWOnNotify(idCtrl, lParam, result);
|
||||
}
|
||||
|
||||
#endif // wxUSE_HYPERLINKCTRL
|
||||
Reference in New Issue
Block a user