diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /public/vgui_controls/HTML.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'public/vgui_controls/HTML.h')
| -rw-r--r-- | public/vgui_controls/HTML.h | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/public/vgui_controls/HTML.h b/public/vgui_controls/HTML.h new file mode 100644 index 0000000..ad786d2 --- /dev/null +++ b/public/vgui_controls/HTML.h @@ -0,0 +1,323 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Creates a HTML control +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef HTML_H +#define HTML_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui/IImage.h> +#include <vgui_controls/Panel.h> +#include <vgui_controls/PHandle.h> +#include <vgui_controls/FileOpenDialog.h> +#include <vgui_controls/TextEntry.h> +#include <tier1/utlmap.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 |