338 lines
12 KiB
C++
338 lines
12 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: Creates a HTML control
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#ifndef HTML_H
|
|
#define HTML_H
|
|
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include <tier1/utlmap.h>
|
|
#include <vgui/IImage.h>
|
|
#include <vgui/VGUI.h>
|
|
#include <vgui_controls/FileOpenDialog.h>
|
|
#include <vgui_controls/PHandle.h>
|
|
#include <vgui_controls/Panel.h>
|
|
#include <vgui_controls/TextEntry.h>
|
|
#ifndef VERSION_SAFE_STEAM_API_INTERFACES
|
|
#define VERSION_SAFE_STEAM_API_INTERFACES
|
|
#endif
|
|
#include "steam/steam_api.h"
|
|
|
|
namespace vgui {
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Control to display HTML content
|
|
// This control utilises a hidden IE window to render a HTML
|
|
//page for you. It can load any valid URL (i.e local files or web pages), you
|
|
//cannot dynamically change the content however (internally to the control that
|
|
//is).
|
|
//-----------------------------------------------------------------------------
|
|
class HTML : public Panel {
|
|
DECLARE_CLASS_SIMPLE(HTML, Panel);
|
|
// TODO::STYLE
|
|
// DECLARE_STYLE_BASE( "HTML" );
|
|
public:
|
|
HTML(Panel *parent, const char *name, bool allowJavaScript = false,
|
|
bool bPopupWindow = false);
|
|
~HTML();
|
|
|
|
// IHTML pass through functions
|
|
virtual void OpenURL(const char *URL, const char *pchPostData,
|
|
bool bForce = false);
|
|
virtual bool StopLoading();
|
|
virtual bool Refresh();
|
|
virtual void OnMove();
|
|
virtual void RunJavascript(const char *pchScript);
|
|
virtual void GoBack();
|
|
virtual void GoForward();
|
|
virtual bool BCanGoBack();
|
|
virtual bool BCanGoFoward();
|
|
|
|
// event functions you can override and specialize behavior of
|
|
virtual bool OnStartRequest(const char *url, const char *target,
|
|
const char *pchPostData, bool bIsRedirect);
|
|
virtual void OnFinishRequest(
|
|
const char *url, const char *pageTitle,
|
|
const CUtlMap<CUtlString, CUtlString> &headers) {}
|
|
virtual void OnSetHTMLTitle(const char *pchTitle) {}
|
|
virtual void OnLinkAtPosition(const char *pchURL) {}
|
|
virtual void OnURLChanged(const char *url, const char *pchPostData,
|
|
bool bIsRedirect) {}
|
|
|
|
virtual bool OnOpenNewTab(const char *pchURL, bool bForeground) {
|
|
return false;
|
|
}
|
|
|
|
// configuration
|
|
virtual void SetScrollbarsEnabled(bool state);
|
|
virtual void SetContextMenuEnabled(bool state);
|
|
virtual void SetViewSourceEnabled(bool state);
|
|
virtual void NewWindowsOnly(bool state);
|
|
|
|
bool IsScrolledToBottom();
|
|
bool IsScrollbarVisible();
|
|
|
|
// url handlers, lets you have web page links fire vgui events
|
|
// use to have custom web page links, eg. "steam://open/subscriptionpage"
|
|
// message contains "CustomURL", "url"
|
|
virtual void AddCustomURLHandler(const char *customProtocolName,
|
|
vgui::Panel *target);
|
|
|
|
// overridden to paint our special web browser texture
|
|
virtual void Paint();
|
|
|
|
// pass messages to the texture component to tell it about resizes
|
|
virtual void OnSizeChanged(int wide, int tall);
|
|
|
|
// pass mouse clicks through
|
|
virtual void OnMousePressed(MouseCode code);
|
|
virtual void OnMouseReleased(MouseCode code);
|
|
virtual void OnCursorMoved(int x, int y);
|
|
virtual void OnMouseDoublePressed(MouseCode code);
|
|
virtual void OnKeyTyped(wchar_t unichar);
|
|
virtual void OnKeyCodeTyped(KeyCode code);
|
|
virtual void OnKeyCodeReleased(KeyCode code);
|
|
virtual void PerformLayout();
|
|
virtual void OnMouseWheeled(int delta);
|
|
virtual void PostChildPaint();
|
|
|
|
/* message posting:
|
|
|
|
"HTMLSliderMoved" - indicates the scrollbar has moved
|
|
|
|
"OnURLChanged" - indicates a new URL is being loaded
|
|
"url"
|
|
"postdata"
|
|
|
|
"OnFinishRequest" - indicates all url loaded has completed
|
|
|
|
"HTMLBackRequested" - mouse4 has been pressed on the dialog
|
|
"HTMLForwardRequested" - mouse5 has been pressed on the dialog
|
|
|
|
"SecurityStatus" - indicates the SSL status of the page
|
|
(disabled,good,bad) "url" "secure" - true if an ssl page "certerror" -
|
|
true if there is a cert error loading the page "isevcert" - true if this
|
|
is an EV style cert "certname" - name of the entity this cert is issued
|
|
to
|
|
*/
|
|
|
|
MESSAGE_FUNC_INT(OnSetCursorVGUI, "SetCursor", cursor);
|
|
|
|
virtual void OnCommand(const char *pchCommand);
|
|
|
|
void AddHeader(const char *pchHeader, const char *pchValue);
|
|
void OnKillFocus();
|
|
void OnSetFocus();
|
|
|
|
void Find(const char *pchSubStr);
|
|
void StopFind();
|
|
void FindNext();
|
|
void FindPrevious();
|
|
void ShowFindDialog();
|
|
void HideFindDialog();
|
|
bool FindDialogVisible();
|
|
int HorizontalScrollMax() { return m_scrollHorizontal.m_nMax; }
|
|
int VerticalScrollMax() { return m_scrollVertical.m_nMax; }
|
|
|
|
void GetLinkAtPosition(int x, int y);
|
|
|
|
void HidePopup();
|
|
|
|
#ifdef DBGFLAG_VALIDATE
|
|
virtual void Validate(CValidator &validator, const char *pchName) {
|
|
ValidateObj(m_CustomURLHandlers);
|
|
BaseClass::Validate(validator, pchName);
|
|
}
|
|
#endif // DBGFLAG_VALIDATE
|
|
|
|
ISteamHTMLSurface *SteamHTMLSurface() {
|
|
return m_SteamAPIContext.SteamHTMLSurface();
|
|
}
|
|
|
|
void OnHTMLMouseMoved(int x, int y) {
|
|
if (m_SteamAPIContext.SteamHTMLSurface())
|
|
m_SteamAPIContext.SteamHTMLSurface()->MouseMove(m_unBrowserHandle,
|
|
x, y);
|
|
}
|
|
|
|
protected:
|
|
virtual void ApplySchemeSettings(IScheme *pScheme);
|
|
|
|
vgui::Menu *m_pContextMenu;
|
|
|
|
private:
|
|
STEAM_CALLBACK(HTML, BrowserNeedsPaint, HTML_NeedsPaint_t, m_NeedsPaint);
|
|
STEAM_CALLBACK(HTML, BrowserStartRequest, HTML_StartRequest_t,
|
|
m_StartRequest);
|
|
STEAM_CALLBACK(HTML, BrowserURLChanged, HTML_URLChanged_t, m_URLChanged);
|
|
STEAM_CALLBACK(HTML, BrowserFinishedRequest, HTML_FinishedRequest_t,
|
|
m_FinishedRequest);
|
|
STEAM_CALLBACK(HTML, BrowserOpenNewTab, HTML_OpenLinkInNewTab_t,
|
|
m_LinkInNewTab);
|
|
STEAM_CALLBACK(HTML, BrowserSetHTMLTitle, HTML_ChangedTitle_t,
|
|
m_ChangeTitle);
|
|
STEAM_CALLBACK(HTML, BrowserPopupHTMLWindow, HTML_NewWindow_t, m_NewWindow);
|
|
STEAM_CALLBACK(HTML, BrowserFileLoadDialog, HTML_FileOpenDialog_t,
|
|
m_FileLoadDialog);
|
|
STEAM_CALLBACK(HTML, BrowserSearchResults, HTML_SearchResults_t,
|
|
m_SearchResults);
|
|
STEAM_CALLBACK(HTML, BrowserClose, HTML_CloseBrowser_t, m_CloseBrowser);
|
|
STEAM_CALLBACK(HTML, BrowserHorizontalScrollBarSizeResponse,
|
|
HTML_HorizontalScroll_t, m_HorizScroll);
|
|
STEAM_CALLBACK(HTML, BrowserVerticalScrollBarSizeResponse,
|
|
HTML_VerticalScroll_t, m_VertScroll);
|
|
STEAM_CALLBACK(HTML, BrowserLinkAtPositionResponse, HTML_LinkAtPosition_t,
|
|
m_LinkAtPosResp);
|
|
STEAM_CALLBACK(HTML, BrowserJSAlert, HTML_JSAlert_t, m_JSAlert);
|
|
STEAM_CALLBACK(HTML, BrowserJSConfirm, HTML_JSConfirm_t, m_JSConfirm);
|
|
STEAM_CALLBACK(HTML, BrowserCanGoBackandForward, HTML_CanGoBackAndForward_t,
|
|
m_CanGoBackForward);
|
|
STEAM_CALLBACK(HTML, BrowserSetCursor, HTML_SetCursor_t, m_SetCursor);
|
|
STEAM_CALLBACK(HTML, BrowserStatusText, HTML_StatusText_t, m_StatusText);
|
|
STEAM_CALLBACK(HTML, BrowserShowToolTip, HTML_ShowToolTip_t, m_ShowTooltip);
|
|
STEAM_CALLBACK(HTML, BrowserUpdateToolTip, HTML_UpdateToolTip_t,
|
|
m_UpdateTooltip);
|
|
STEAM_CALLBACK(HTML, BrowserHideToolTip, HTML_HideToolTip_t, m_HideTooltip);
|
|
|
|
void OnBrowserReady(HTML_BrowserReady_t *pBrowserReady, bool bIOFailure);
|
|
|
|
void PostURL(const char *URL, const char *pchPostData, bool force);
|
|
virtual void BrowserResize();
|
|
void UpdateSizeAndScrollBars();
|
|
MESSAGE_FUNC(OnSliderMoved, "ScrollBarSliderMoved");
|
|
MESSAGE_FUNC_CHARPTR(OnFileSelected, "FileSelected", fullpath);
|
|
MESSAGE_FUNC(OnFileSelectionCancelled, "FileSelectionCancelled");
|
|
MESSAGE_FUNC_PTR(OnTextChanged, "TextChanged", panel);
|
|
MESSAGE_FUNC_PTR(OnEditNewLine, "TextNewLine", panel);
|
|
MESSAGE_FUNC_INT(DismissJSDialog, "DismissJSDialog", result);
|
|
|
|
vgui::Panel *m_pInteriorPanel;
|
|
vgui::ScrollBar *_hbar, *_vbar;
|
|
vgui::DHANDLE<vgui::FileOpenDialog> m_hFileOpenDialog;
|
|
class CHTMLFindBar : public vgui::EditablePanel {
|
|
DECLARE_CLASS_SIMPLE(CHTMLFindBar, EditablePanel);
|
|
|
|
public:
|
|
CHTMLFindBar(HTML *parent);
|
|
void SetText(const char *pchText) { m_pFindBar->SetText(pchText); }
|
|
void GetText(char *pText, int ccText) {
|
|
m_pFindBar->GetText(pText, ccText);
|
|
}
|
|
void OnCommand(const char *pchCmd);
|
|
void ShowCountLabel() { m_pFindCountLabel->SetVisible(true); }
|
|
void HideCountLabel() { m_pFindCountLabel->SetVisible(false); }
|
|
void SetHidden(bool bState) { m_bHidden = bState; }
|
|
bool BIsHidden() { return m_bHidden; }
|
|
|
|
private:
|
|
vgui::TextEntry *m_pFindBar;
|
|
vgui::HTML *m_pParent;
|
|
vgui::Label *m_pFindCountLabel;
|
|
bool m_bHidden;
|
|
};
|
|
|
|
CHTMLFindBar *m_pFindBar;
|
|
|
|
int m_iMouseX, m_iMouseY; // where the mouse is on the control
|
|
|
|
int m_iScrollBorderX, m_iScrollBorderY;
|
|
int m_iWideLastHTMLSize, m_iTalLastHTMLSize;
|
|
int m_iCopyLinkMenuItemID;
|
|
|
|
bool m_bScrollBarEnabled;
|
|
bool m_bContextMenuEnabled;
|
|
int m_iScrollbarSize;
|
|
bool m_bNewWindowsOnly;
|
|
int m_nViewSourceAllowedIndex;
|
|
CUtlString m_sDragURL;
|
|
int m_iDragStartX, m_iDragStartY;
|
|
|
|
struct CustomURLHandler_t {
|
|
PHandle hPanel;
|
|
char url[32];
|
|
};
|
|
CUtlVector<CustomURLHandler_t> m_CustomURLHandlers;
|
|
|
|
int m_iHTMLTextureID; // vgui texture id
|
|
// Track the texture width and height requested so we can tell
|
|
// when the size has changed and reallocate the texture.
|
|
int m_allocedTextureWidth;
|
|
int m_allocedTextureHeight;
|
|
bool m_bNeedsFullTextureUpload;
|
|
CUtlString m_sCurrentURL; // the url of our current page
|
|
// find in page state
|
|
bool m_bInFind;
|
|
CUtlString m_sLastSearchString;
|
|
|
|
bool m_bCanGoBack; // cache of forward and back state
|
|
bool m_bCanGoForward;
|
|
|
|
struct LinkAtPos_t {
|
|
LinkAtPos_t() { m_nX = m_nY = 0; }
|
|
uint32 m_nX;
|
|
uint32 m_nY;
|
|
CUtlString m_sURL;
|
|
};
|
|
LinkAtPos_t m_LinkAtPos; // cache for link at pos requests, because the
|
|
// request is async
|
|
bool m_bRequestingDragURL; // true if we need a response for a drag url loc
|
|
bool m_bRequestingCopyLink; // true if we wanted to copy the link under the
|
|
// cursor
|
|
|
|
struct ScrollData_t {
|
|
ScrollData_t() {
|
|
m_bVisible = false;
|
|
m_nMax = m_nScroll = 0;
|
|
}
|
|
|
|
bool operator==(ScrollData_t const &src) const {
|
|
return m_bVisible == src.m_bVisible && m_nMax == src.m_nMax &&
|
|
m_nScroll == src.m_nScroll;
|
|
}
|
|
|
|
bool operator!=(ScrollData_t const &src) const {
|
|
return !operator==(src);
|
|
}
|
|
|
|
bool m_bVisible; // is the scroll bar visible
|
|
int m_nMax; // most amount of pixels we can scroll
|
|
int m_nScroll; // currently scrolled amount of pixels
|
|
float m_flZoom; // zoom level this scroll bar is for
|
|
};
|
|
|
|
ScrollData_t m_scrollHorizontal; // details of horizontal scroll bar
|
|
ScrollData_t m_scrollVertical; // details of vertical scroll bar
|
|
float m_flZoom; // current page zoom level
|
|
|
|
CUtlString m_sPendingURLLoad; // cache of url to load if we get a PostURL
|
|
// before the cef object is mage
|
|
CUtlString m_sPendingPostData; // cache of the post data for above
|
|
|
|
struct CustomCursorCache_t {
|
|
CustomCursorCache_t() {}
|
|
CustomCursorCache_t(const void *pchData) { m_pchData = pchData; }
|
|
float m_CacheTime; // the time we cached the cursor
|
|
CursorCode m_Cursor; // the vgui handle to it
|
|
const void *m_pchData; // the pointer to the cursor char data so we can
|
|
// detect the same cursor being used
|
|
bool operator==(const CustomCursorCache_t &rhs) const {
|
|
return m_pchData == rhs.m_pchData;
|
|
}
|
|
};
|
|
CUtlVector<CustomCursorCache_t> m_vecHCursor;
|
|
|
|
CSteamAPIContext m_SteamAPIContext;
|
|
HHTMLBrowser m_unBrowserHandle;
|
|
CCallResult<HTML, HTML_BrowserReady_t> m_SteamCallResultBrowserReady;
|
|
};
|
|
|
|
} // namespace vgui
|
|
|
|
#endif // HTML_H
|