]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/include/wx/applet/ifelsevar.h
Renderer should only be used for GTK+ 2
[wxWidgets.git] / contrib / include / wx / applet / ifelsevar.h
index 851cc82a53ed1ea76f82afa6c6304e0a3965d0ef..b857b2bfc674048550f47b793071ed504f3b9c37 100644 (file)
 #ifndef __WX_IFELSEVAR_H
 #define __WX_IFELSEVAR_H
 
+#include "wx/object.h"
+#include "wx/hash.h"
+
 /*--------------------------- Class Definitions ---------------------------*/
 
 /****************************************************************************
+RETURNS:
+The boolean value of the variable
+
 REMARKS:
-This class is used to create variables for the HTML preprocessor #if, #else,
-and #endif directives.
+To create new variables for the #if, #else and #endif HTML preprocessing
+blocks you need to derive classes from wxIfElseVariable and override the
+pure virtual GetValue function. However this should not be done directly
+but by using the BEGIN_IFELSE_VARIABLE and END_IFELSE_VARIABLE macros
 
 SEE ALSO:
-wxIfElsePrep
+wxIfElsePrep, BEGIN_IFELSE_VARIABLE, END_IFELSE_VARIABLE
+****************************************************************************/
+typedef bool (*wxIfElseVariableGetValueFn)();
+
+/****************************************************************************
+REMARKS:
+wxIfElseVariable class Definition
 ****************************************************************************/
 class wxIfElseVariable : public wxObject {
-private:
-    DECLARE_ABSTRACT_CLASS(wxIfElseVariable);
+protected:
+    const wxChar                *m_varName;
+    wxIfElseVariableGetValueFn  m_getValueFn;
+    static wxIfElseVariable     *sm_first;
+    wxIfElseVariable            *m_next;
+    static wxHashTable          *sm_varTable;
+    bool                        forced;
+    bool                        forceVal;
+
+    static inline wxIfElseVariable *wxIfElseVariable::FindVariable(const wxChar *varName);
 
 public:
-    wxIfElseVariable() : wxObject() {}
-    ~wxIfElseVariable() {}
+    // Constructor to create the echo variable and register the class
+    wxIfElseVariable(
+        const char *varName,
+        wxIfElseVariableGetValueFn getValueFn);
+
+    // Member variable access functions
+    const wxChar *GetClassName() const            { return m_varName; }
+    wxIfElseVariableGetValueFn GetValueFn() const { return m_getValueFn; }
+    static const wxIfElseVariable* GetFirst()     { return sm_first; }
+    const wxIfElseVariable* GetNext() const       { return m_next; }
        
-    /****************************************************************************
-    RETURNS:
-    The boolean value of the variable
+    // Static functions to retrieve any variable avaliable
+    static bool GetValue(const wxChar *varName);
+    static bool Exists(const wxChar *varName);
+    static void Force(const wxChar *varName, bool val);
 
-    REMARKS:
-    To create new variables for the #if, #else and #endif HTML preprocessing
-    blocks you need to derive classes from wxIfElseVariable and override the
-    pure virtual GetValue function. However this should not be done directly
-    but by using the BEGIN_IFELSE_VARIABLE and END_IFELSE_VARIABLE macros
+    // Initializes parent pointers and hash table for fast searching.
+    static void Initialize();
 
-    SEE ALSO:
-    wxIfElsePrep, BEGIN_IFELSE_VARIABLE, END_IFELSE_VARIABLE
-    ****************************************************************************/
-    virtual bool GetValue() const = 0;
+    // Cleans up hash table used for fast searching.
+    static void CleanUp();
+    };
+       
+/****************************************************************************
+PARAMETERS:
+class   - Name of class for echo variable to find
 
+RETURNS:
+Pointer to the echo variable class
 
-public:
-    // static function to retrieve any variable avaliable
-    static bool GetValue(const wxString &cls);
-};
+REMARKS:
+Inline helper function to find the echo variable from it's class name.
+****************************************************************************/
+inline wxIfElseVariable *wxIfElseVariable::FindVariable(
+    const wxChar *varName)
+{
+    if (sm_varTable)
+        return (wxIfElseVariable*)sm_varTable->Get(varName);
+    else {
+        wxIfElseVariable *info = sm_first;
+        while (info) {
+            if (info->m_varName && wxStrcmp(info->m_varName, varName) == 0)
+                return info;
+            info = info->m_next;
+            }
+        return NULL;
+        }
+}
 
 /*--------------------------------- MACROS --------------------------------*/
 
 #define BEGIN_IFELSE_VARIABLE(name)                                         \
-    class wxIfElseVariable##name : public wxIfElseVariable {                \
-    private:                                                                \
-        DECLARE_DYNAMIC_CLASS(wxIfElseVariable##name##);                    \
-    public:                                                                 \
-        wxIfElseVariable##name##() : wxIfElseVariable() {}                  \
-        virtual bool GetValue() const;                                      \
-        };                                                                  \
-    IMPLEMENT_DYNAMIC_CLASS(wxIfElseVariable##name##, wxIfElseVariable);    \
-    bool wxIfElseVariable##name :: GetValue() const {
-
-#define END_IFELSE_VARIABLE(name, returnval)                                \
+bool wxIfElseVariableFn##name();                                            \
+wxIfElseVariable wxIfElseVariable##name(#name,wxIfElseVariableFn##name);    \
+bool wxIfElseVariableFn##name() {                                           \
+
+#define END_IFELSE_VARIABLE(returnval)                                      \
     return returnval;                                                       \
     }
 
 #define IFELSE_VARIABLE(name, state)                                        \
     BEGIN_IFELSE_VARIABLE(##name##);                                        \
-    END_IFELSE_VARIABLE(##name##, bool (state))
-
+    END_IFELSE_VARIABLE(bool (state))
 
 #endif // __WX_IFELSEVAR_H