2025-04-27 07:49:33 -04:00

194 lines
5.4 KiB
C++

#include "stdafx.h"
#include "Ctrl.h"
#include "SmHyperLink.h"
#if ENABLE_MSGTABLE_API
// TODO: Need to make cross-platform
#ifndef IDC_HAND
#define IDC_HAND MAKEINTRESOURCE(32649)
#endif
#define ENABLE_RAISEACTIVE 0 // Raise hyperlink when active
/***************************************************************************\
*****************************************************************************
*
* class SmHyperLink
*
*****************************************************************************
\***************************************************************************/
HCURSOR SmHyperLink::s_hcurHand = NULL;
HCURSOR SmHyperLink::s_hcurOld = NULL;
static const GUID guidEventClicked = { 0x307a94bc, 0x6c9e, 0x4f21, { 0xa8, 0x74, 0x72, 0x29, 0xde, 0x82, 0x2a, 0xba } }; // {307A94BC-6C9E-4f21-A874-7229DE822ABA}
//------------------------------------------------------------------------------
HRESULT
SmHyperLink::ApiOnEvent(EventMsg * pmsg)
{
if (GET_EVENT_DEST(pmsg) == GMF_DIRECT) {
switch (pmsg->nMsg)
{
case GM_CHANGESTATE:
{
GMSG_CHANGESTATE * pmsgC = (GMSG_CHANGESTATE *) pmsg;
if (pmsgC->nCode == GSTATE_MOUSEFOCUS) {
switch (pmsgC->nCmd)
{
case GSC_SET:
m_fClicked = TRUE;
m_hfnt = m_hfntActive;
m_crText = m_crActive;
s_hcurOld = SetCursor(s_hcurHand);
#if ENABLE_RAISEACTIVE
{
RECT rcThis;
CallGetRect(SGR_PARENT, &rcThis);
CallSetRect(SGR_MOVE | SGR_PARENT, m_hgad, rcThis.left - 1, rcThis.top - 1, 0, 0);
}
#endif
GetStub()->Invalidate();
break;
case GSC_LOST:
m_fClicked = FALSE;
m_hfnt = m_hfntNormal;
m_crText = m_crNormal;
SetCursor(s_hcurOld);
#if ENABLE_RAISEACTIVE
{
RECT rcThis;
GetGadgetRect(SGR_PARENT, &rcThis);
SetGadgetRect(SGR_MOVE | SGR_PARENT, rcThis.left + 1, rcThis.top + 1, 0, 0);
}
#endif
GetStub()->Invalidate();
break;
}
return DU_S_PARTIAL;
} // GINPUT_MOUSE
}
break; // GM_INPUT
case GM_QUERY:
{
GMSG_QUERY * pmsgQ = (GMSG_QUERY *) pmsg;
switch (pmsgQ->nCode)
{
case GQUERY_DESCRIPTION:
{
GMSG_QUERYDESC * pmsgQD = (GMSG_QUERYDESC *) pmsg;
CopyString(pmsgQD->szName, m_pszText, _countof(pmsgQD->szName));
CopyString(pmsgQD->szType, L"SmHyperLink", _countof(pmsgQD->szType));
return DU_S_COMPLETE;
}
}
}
break;
}
}
return SmText::ApiOnEvent(pmsg);
}
//------------------------------------------------------------------------------
HRESULT
SmHyperLink::ApiGetActiveFont(HyperLinkGadget::GetActiveFontMsg * pmsg)
{
pmsg->hfnt = m_hfntActive;
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmHyperLink::ApiSetActiveFont(HyperLinkGadget::SetActiveFontMsg * pmsg)
{
m_hfntActive = pmsg->hfnt;
if (m_fClicked) {
GetStub()->SetFont(pmsg->hfnt);
}
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmHyperLink::ApiGetNormalFont(HyperLinkGadget::GetNormalFontMsg * pmsg)
{
pmsg->hfnt = m_hfntNormal;
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmHyperLink::ApiSetNormalFont(HyperLinkGadget::SetNormalFontMsg * pmsg)
{
m_hfntNormal = pmsg->hfnt;
if (!m_fClicked) {
GetStub()->SetFont(pmsg->hfnt);
}
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmHyperLink::ApiGetActiveColor(HyperLinkGadget::GetActiveColorMsg * pmsg)
{
pmsg->crText = m_crActive;
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmHyperLink::ApiSetActiveColor(HyperLinkGadget::SetActiveColorMsg * pmsg)
{
m_crActive = pmsg->crText;
if (m_fClicked) {
m_crText = pmsg->crText;
}
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmHyperLink::ApiGetNormalColor(HyperLinkGadget::GetNormalColorMsg * pmsg)
{
pmsg->crText = m_crNormal;
return S_OK;
}
//------------------------------------------------------------------------------
HRESULT
SmHyperLink::ApiSetNormalColor(HyperLinkGadget::SetNormalColorMsg * pmsg)
{
m_crNormal = pmsg->crText;
if (!m_fClicked) {
m_crText = pmsg->crText;
}
return S_OK;
}
#endif // ENABLE_MSGTABLE_API