mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-03-12 22:56:52 +01:00
185 lines
5.2 KiB
C++
185 lines
5.2 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/msw/hyperlink.cpp
|
|
// Purpose: Hyperlink control
|
|
// Author: Rickard Westerlund
|
|
// Created: 2010-08-03
|
|
// 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 && wxUSE_UNICODE
|
|
|
|
#include "wx/hyperlink.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/app.h"
|
|
#include "wx/msw/wrapcctl.h" // include <commctrl.h> "properly"
|
|
#include "wx/msw/private.h"
|
|
#include "wx/msw/missing.h"
|
|
#endif
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Definitions
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#ifndef LM_GETIDEALSIZE
|
|
#define LM_GETIDEALSIZE (WM_USER + 0x301)
|
|
#endif
|
|
|
|
#ifndef LWS_RIGHT
|
|
#define LWS_RIGHT 0x0020
|
|
#endif
|
|
|
|
#ifndef WC_LINK
|
|
#define WC_LINK L"SysLink"
|
|
#endif
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Helper functions
|
|
// ----------------------------------------------------------------------------
|
|
|
|
namespace
|
|
{
|
|
bool HasNativeHyperlinkCtrl()
|
|
{
|
|
// Notice that we really must test comctl32.dll version and not the OS
|
|
// version here as even under Vista/7 we could be not using the v6 e.g.
|
|
// if the program doesn't have the correct manifest for some reason.
|
|
return wxApp::GetComCtl32Version() >= 600;
|
|
}
|
|
|
|
wxString GetLabelForSysLink(const wxString& text, const wxString& url)
|
|
{
|
|
// Any "&"s in the text should appear on the screen and not be (mis)
|
|
// interpreted as mnemonics.
|
|
return wxString::Format("<A HREF=\"%s\">%s</A>",
|
|
url,
|
|
wxControl::EscapeMnemonics(text));
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// 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 ( !HasNativeHyperlinkCtrl() || (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 && wxUSE_UNICODE
|