summaryrefslogtreecommitdiff
path: root/public/panorama/localization/ilocalize.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/panorama/localization/ilocalize.h')
-rw-r--r--public/panorama/localization/ilocalize.h406
1 files changed, 406 insertions, 0 deletions
diff --git a/public/panorama/localization/ilocalize.h b/public/panorama/localization/ilocalize.h
new file mode 100644
index 0000000..9de0d81
--- /dev/null
+++ b/public/panorama/localization/ilocalize.h
@@ -0,0 +1,406 @@
+//=========== Copyright Valve Corporation, All rights reserved. ===============//
+//
+// Purpose:
+//=============================================================================//
+
+#ifndef PANORAMA_ILOCALIZE_H
+#define PANORAMA_ILOCALIZE_H
+
+#include "language.h"
+#include "tier0/platform.h"
+#include "tier1/interface.h"
+#include "tier1/utlflags.h"
+#include "tier1/utlsymbol.h"
+#include "tier1/utlstring.h"
+#include "tier1/utlmap.h"
+#include "tier1/fileio.h"
+#include "tier1/utlpriorityqueue.h"
+#include "steam/steamtypes.h"
+#if defined( SOURCE2_PANORAMA )
+#include "currencyamount.h"
+#else
+#include "stime.h"
+#include "constants.h"
+#include "globals.h"
+#include "amount.h"
+#include "rtime.h"
+#endif
+#include "reliabletimer.h"
+#include "language.h"
+
+namespace panorama
+{
+
+//-----------------------------------------------------------------------------
+// Purpose: type of variable data we are supporting
+//-----------------------------------------------------------------------------
+enum EPanelKeyType
+{
+ k_ePanelVartype_None,
+ k_ePanelVartype_String,
+ k_ePanelVartype_Time,
+ k_ePanelVartype_Money,
+ k_ePanelVartype_Number,
+ k_ePanelVartype_Generic
+};
+
+// help function syntax for the generic key handler
+typedef const char *( *PFNLocalizeDialogVariableHandler )( const CUtlString &sStringValue, int nIntValue, const IUIPanel *pPanel, const char *pszKey, void *pUserData );
+
+enum EPanelKeyTimeModifiers
+{
+ k_ePanelKeyTimeModifiers_ShortDate = 1 << 0,
+ k_ePanelKeyTimeModifiers_LongDate = 1 << 1,
+ k_ePanelKeyTimeModifiers_ShortTime = 1 << 2,
+ k_ePanelKeyTimeModifiers_LongTime = 1 << 3,
+ k_ePanelKeyTimeModifiers_DateTime = 1 << 4,
+ k_ePanelKeyTimeModifiers_Relative = 1 << 5,
+ k_ePanelKeyTimeModifiers_Duration = 1 << 6,
+};
+
+enum EStringTruncationStyle
+{
+ k_eStringTruncationStyle_None,
+ k_eStringTruncationStyle_Rear, // prevent any chars being added above max length
+ k_eStringTruncationStyle_Front, // remove
+};
+
+enum EStringTransformStyle
+{
+ k_eStringTransformStyle_None,
+ k_eStringTransformStyle_Uppercase,
+ k_eStringTransformStyle_Lowercase,
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose: callback interface to help measuring strings
+//-----------------------------------------------------------------------------
+class ILocalizationStringSizeResolver
+{
+public:
+ virtual ~ILocalizationStringSizeResolver() {}
+ virtual int ResolveStringLengthInPixels( const char *pchString ) = 0;
+};
+
+
+const uint32 k_nLocalizeMaxChars = (uint32)~0;
+
+class CPanelKeyValue;
+class CLocalization;
+class CPanel2D;
+
+//-----------------------------------------------------------------------------
+// Purpose: interface to final string data to display to users
+//-----------------------------------------------------------------------------
+class ILocalizationString
+{
+public:
+ virtual ~ILocalizationString() {}
+
+ // Get the length of the string in characters
+ virtual int Length() const = 0;
+ virtual bool IsEmpty() const = 0;
+
+ virtual const char *String() const = 0;
+ virtual const char *StringNoTransform() const = 0;
+ virtual operator const char *() const = 0;
+
+ // add this string on the end
+ virtual bool AppendText( const char *pchText ) = 0;
+ // done with this string, delete it
+ virtual void Release() const = 0;
+
+ virtual EStringTransformStyle GetTransformStyle() const = 0;
+ virtual const IUIPanel *GetOwningPanel() const = 0;
+ virtual uint32 GetMaxChars() const = 0;
+ virtual EStringTruncationStyle GetTruncationStyle() const = 0;
+
+#ifdef DBGFLAG_VALIDATE
+ virtual void Validate( CValidator &validator, const tchar *pchName ) = 0;
+#endif
+protected:
+ // internal loc engine helpers, you won't call these
+ friend class CLocalization;
+ virtual void Recalculate( const CUtlString *pString ) = 0;
+ virtual bool BContainsDialogVariable( const CPanelKeyValue &key ) = 0;
+};
+
+class CLocStringSafePointer
+{
+public:
+ CLocStringSafePointer()
+ {
+ m_pString = NULL;
+ }
+
+ CLocStringSafePointer( const ILocalizationString *pLocString )
+ {
+ m_pString = pLocString;
+ }
+
+ CLocStringSafePointer &operator =( const ILocalizationString *pString )
+ {
+ if ( m_pString == pString )
+ return *this;
+
+ Clear();
+
+ m_pString = const_cast<ILocalizationString *>( pString );
+
+ return *this;
+ }
+
+ const ILocalizationString *operator ->( ) const
+ {
+ return Get();
+ }
+
+ const ILocalizationString *operator *( ) const
+ {
+ return Get();
+ }
+
+ operator const ILocalizationString*( ) const
+ {
+ return Get();
+ }
+
+ ~CLocStringSafePointer()
+ {
+ Clear();
+ }
+
+ void Clear()
+ {
+ if ( m_pString )
+ {
+ m_pString->Release();
+ m_pString = NULL;
+ }
+ }
+
+ bool IsValid() { return m_pString != nullptr; }
+
+ const ILocalizationString *Get() const
+ {
+ return m_pString;
+ }
+
+private:
+ const ILocalizationString *m_pString;
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose: interface to localize strings
+//-----------------------------------------------------------------------------
+class IUILocalization
+{
+public:
+ // change the language used by the loc system
+ virtual bool SetLanguage( const char *pchLanguage ) = 0;
+#if defined( SOURCE2_PANORAMA )
+ // add a loc file to the system, in the form of <prefix>_<language>.txt , i.e dota_french.txt, the files will be loaded from the panorama/localization folder of your mod
+ virtual bool BLoadLocalizationFile( const char *pchFilePrefix ) = 0;
+#else
+ virtual ELanguage CurrentLanguage() = 0;
+#endif
+
+ virtual void InstallCustomDialogVariableHandler( const char *pchCustomHandlerName, PFNLocalizeDialogVariableHandler pfnLocalizeFunc, void *pUserData = NULL ) = 0;
+ virtual void RemoveCustomDialogVariableHandler( const char *pchCustomHandlerName ) = 0;
+
+ // find the string corresponding to this localization token, or if we don't find it then just return back the string wrapped in a loc object
+ virtual const ILocalizationString *PchFindToken( const IUIPanel *pPanel, const char *pchToken, const uint32 ccMax , EStringTruncationStyle eTrunkStyle, EStringTransformStyle eTransformStyle, bool bAllowDialogVariable = false ) = 0;
+
+ // give me a localize string wrapper around this string, don't try and apply token localizing on it though, but do optionally allow it to have dialog variables that we parse in it
+ // be careful allowing dialog variable parsing, you want to sanitize any user input before allowing it
+ virtual const ILocalizationString *PchSetString( const IUIPanel *pPanel, const char *pchText, const uint32 ccMax, EStringTruncationStyle eTrunkStyle, EStringTransformStyle eTransformStyle, bool bAllowDialogVariable, bool bStringAlreadyFullyParsed ) = 0;
+
+ virtual const ILocalizationString *ChangeTransformStyleAndRelease( const ILocalizationString *pLocalizationString, EStringTransformStyle eTranformStyle ) = 0;
+
+ // copy an existing loc string without altering the ref count on the current
+ virtual ILocalizationString *CloneString( const IUIPanel *pPanel, const ILocalizationString *pLocToken ) = 0;
+
+ // return the raw, un-parsed, value for this loc token, returns NULL if we didn't have this token in a loc file from disk
+ virtual const char *PchFindRawString( const char *pchToken ) = 0;
+
+ virtual bool SetDialogVariable( const IUIPanel *pPanel, const char *pchKey, const char *pchValue ) = 0;
+#if defined( SOURCE2_PANORAMA )
+ virtual bool SetDialogVariable( const IUIPanel *pPanel, const char *pchKey, time_t timeVal ) = 0;
+ virtual bool SetDialogVariable( const IUIPanel *pPanel, const char *pchKey, CCurrencyAmount amount ) = 0;
+#else
+ virtual bool SetDialogVariable( const IUIPanel *pPanel, const char *pchKey, CRTime timeVal ) = 0;
+ virtual bool SetDialogVariable( const IUIPanel *pPanel, const char *pchKey, CAmount amount ) = 0;
+#endif
+
+ virtual bool SetDialogVariable( const IUIPanel *pPanel, const char *pchKey, int nVal ) = 0;
+
+ // copy all the dialog vars to a new panel
+ virtual void CloneDialogVariables( const IUIPanel *pPanelFrom, IUIPanel *pPanelTo ) = 0;
+
+ // force a re-evaluation of a specific dialog variable
+ virtual void DirtyDialogVariable( const IUIPanel *pPanel, const char *pchKey ) = 0;
+
+
+ // given this loc string find the longest string in any language that we could display here and update to use it
+ virtual void SetLongestStringForToken( const ILocalizationString *pLocalizationString, ILocalizationStringSizeResolver *pResolver ) = 0;
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Wrapper around ILocalizationString that will take care of making
+// a copy if it ends up needing to be mutable.
+//-----------------------------------------------------------------------------
+class CMutableLocalizationString
+{
+public:
+ CMutableLocalizationString()
+ : m_bMutable( false )
+ , m_pString( NULL )
+ {
+ }
+
+ CMutableLocalizationString( ILocalizationString *pString )
+ : m_bMutable( true )
+ , m_pString( pString )
+ {
+ }
+
+ CMutableLocalizationString( const ILocalizationString *pString )
+ : m_bMutable( false )
+ , m_pString( const_cast< ILocalizationString * >( pString ) )
+ {
+ }
+
+ CMutableLocalizationString( const CMutableLocalizationString &other )
+ {
+ m_bMutable = true;
+ if ( other.m_pString )
+ {
+ m_pString = UILocalize()->CloneString( other.m_pString->GetOwningPanel(), other.m_pString );
+ }
+ else
+ {
+ m_pString = NULL;
+ }
+ }
+
+ ~CMutableLocalizationString()
+ {
+ Clear();
+ }
+
+ const ILocalizationString *Get() const
+ {
+ return m_pString;
+ }
+
+ ILocalizationString *GetMutable()
+ {
+ if ( m_bMutable || !m_pString )
+ return m_pString;
+
+ ILocalizationString *pOldString = m_pString;
+
+ m_pString = UILocalize()->CloneString( pOldString->GetOwningPanel(), pOldString );
+ m_bMutable = true;
+
+ pOldString->Release();
+
+ return m_pString;
+ }
+
+ void Clear()
+ {
+ if ( m_pString )
+ {
+ m_pString->Release();
+ m_pString = NULL;
+ }
+ }
+
+ const ILocalizationString *Extract()
+ {
+ const ILocalizationString *pString = m_pString;
+ m_pString = NULL;
+ return pString;
+ }
+ ILocalizationString *ExtractMutable()
+ {
+ ILocalizationString *pString = GetMutable();
+ m_pString = NULL;
+ return pString;
+ }
+
+ // The -> operator is only overloaded to return a const string. If you need a mutable version, you must call GetMutable directly.
+ const ILocalizationString *operator ->() const
+ {
+ return Get();
+ }
+
+
+ explicit operator bool() const
+ {
+ return Get() != NULL;
+ }
+ bool operator ==( const CMutableLocalizationString &other ) const
+ {
+ return m_pString == other.m_pString;
+ }
+ bool operator !=( const CMutableLocalizationString &other ) const
+ {
+ return !( *this == other );
+ }
+
+ bool operator ==( const ILocalizationString *pString ) const
+ {
+ return m_pString == pString;
+ }
+ bool operator !=( const ILocalizationString *pString ) const
+ {
+ return !( *this == pString );
+ }
+
+ CMutableLocalizationString &operator =( const CMutableLocalizationString &other )
+ {
+ if ( other.m_pString == m_pString )
+ return *this;
+
+ Clear();
+
+ m_bMutable = true;
+ if ( other.m_pString )
+ {
+ m_pString = UILocalize()->CloneString( other.m_pString->GetOwningPanel(), other.m_pString );
+ }
+ else
+ {
+ m_pString = NULL;
+ }
+
+ return *this;
+ }
+
+ CMutableLocalizationString &operator =( const ILocalizationString *pString )
+ {
+ if ( m_pString == pString )
+ return *this;
+
+ Clear();
+
+ m_bMutable = false;
+ m_pString = const_cast< ILocalizationString * >( pString );
+
+ return *this;
+ }
+
+private:
+ bool m_bMutable;
+ ILocalizationString *m_pString;;
+};
+
+
+} // namespace panorama
+
+#endif // PANORAMA_ILOCALIZE_H