|
|
//========= 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
|