]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/dialoged/src/symbtabl.cpp
don't crash when invalid colour is set as fg/bg colour
[wxWidgets.git] / utils / dialoged / src / symbtabl.cpp
index a2f42f5a93834745a2be45845571d5d8af8c7cc0..bed48b411d4a72200c0f08287ea4e16a40a348eb 100644 (file)
@@ -32,7 +32,7 @@
 #include "symbtabl.h"
 
 wxResourceSymbolTable::wxResourceSymbolTable():
-  m_hashTable(wxKEY_STRING)
+m_hashTable(wxKEY_STRING)
 {
 }
 
@@ -46,66 +46,72 @@ wxResourceSymbolTable::~wxResourceSymbolTable()
 bool wxResourceSymbolTable::ReadIncludeFile(const wxString& filename)
 {
     wxFile file;
+    if (!wxFileExists(filename))
+        return FALSE;
+    
     if (!file.Open(filename, wxFile::read))
         return FALSE;
-
+    
     off_t len = file.Length();
     if (len == -1)
         return FALSE;
-
+    
+    Clear();
+    AddStandardSymbols();
+    
     wxString str;
     char* p = str.GetWriteBuf(len + 1);
-
-    if (file.Read(p, len) == ofsInvalid)
+    
+    if (file.Read(p, len) == wxFile::fd_invalid)
     {
         str.UngetWriteBuf();
         return FALSE;
     }
     str.UngetWriteBuf();
-
+    
     // Look for #define occurrences
-    size_t pos = str.Find("#define");
+    int pos = str.Find("#define");
     while (pos != -1)
     {
         size_t len = str.Length();
-
+        
         size_t i = pos + 8;
-
+        
         // Eat whitespace until symbol
         while ((str[i] == ' ' || str[i] == '\t') && (i < len))
             i ++;
-
+        
         size_t start = i;
-
+        
         // Eat symbol
         while (str[i] != ' ' && str[i] != '\t' && (i < len))
             i ++;
         size_t end = i-1;
-
+        
         wxString symbol(str.Mid(start, (end - start + 1)));
-
+        
         // Eat whitespace until number
         while ((str[i] == ' ' || str[i] == '\t') && (i < len))
             i ++;
-
+        
         size_t startNum = i;
-
+        
         // Eat number
         while (str[i] != ' ' && str[i] != '\t' && str[i] != '\n' && (i < len))
             i ++;
-
+        
         size_t endNum = i-1;
-
+        
         wxString numStr(str.Mid(startNum, (endNum - startNum + 1)));
-
-        long id = atol(numStr);
-
+        
+        int id = atol(numStr);
+        
         AddSymbol(symbol, id);
-
+        
         str = str.Right(len - i);
         pos = str.Find("#define");
     }
-
+    
     return TRUE;
 }
 
@@ -114,20 +120,30 @@ bool wxResourceSymbolTable::WriteIncludeFile(const wxString& filename)
     wxFile file;
     if (!file.Open(filename, wxFile::write))
         return FALSE;
-
+    
+    wxString fileOnly(wxFileNameFromPath(filename));
+    wxString line;
+    line.Printf("/*\n * %s\n * Window identifiers file written by Dialog Editor\n */\n\n",
+        (const char*) fileOnly);
+    
+    file.Write(line, line.Length());
+    
     m_hashTable.BeginFind();
-
+    
     wxNode* node = m_hashTable.Next();
     while (node)
     {
-        char* str = node->key.string;
-        long id = (long) node->Data() ;
-
-        wxString line;
-        line.Printf("#define %s %ld\n", str, id);
-
-        file.Write(line, line.Length());
-
+        const char* str = node->GetKeyString();
+        int id = (int) node->Data() ;
+        
+        if (!IsStandardSymbol(str))
+        {
+            wxString line;
+            line.Printf("#define %s %ld\n", str, id);
+            
+            file.Write(line, line.Length());
+        }
+        
         node = m_hashTable.Next();
     }
     return TRUE;
@@ -138,32 +154,45 @@ void wxResourceSymbolTable::Clear()
     m_hashTable.Clear();
 }
 
-bool wxResourceSymbolTable::AddSymbol(const wxString& symbol, long id)
+bool wxResourceSymbolTable::AddSymbol(const wxString& symbol, int id)
 {
     m_hashTable.Put(symbol, (wxObject*) id);
     return TRUE;
 }
 
+bool wxResourceSymbolTable::RemoveSymbol(const wxString& symbol)
+{
+    m_hashTable.Delete(symbol);
+    return TRUE;
+}
+
+bool wxResourceSymbolTable::RemoveSymbol(int id)
+{
+    wxString symbol(GetSymbolForId(id));
+    m_hashTable.Delete(symbol);
+    return TRUE;
+}
+
 // Accessors
-wxString wxResourceSymbolTable::GetSymbolForId(long id)
+wxString wxResourceSymbolTable::GetSymbolForId(int id)
 {
     m_hashTable.BeginFind();
-
+    
     wxNode* node = m_hashTable.Next();
     while (node)
     {
-        char* str = node->key.string;
-        if (str && ( ((long) node->Data()) == id) )
+        const char* str = node->GetKeyString();
+        if (str && ( ((int) node->Data()) == id) )
             return wxString(str);
-
+        
         node = m_hashTable.Next();
     }
     return wxString("");
 }
 
-long wxResourceSymbolTable::GetIdForSymbol(const wxString& symbol)
+int wxResourceSymbolTable::GetIdForSymbol(const wxString& symbol)
 {
-    return (long) m_hashTable.Get(symbol);
+    return (int) m_hashTable.Get(symbol);
 }
 
 bool wxResourceSymbolTable::SymbolExists(const wxString& symbol) const
@@ -171,3 +200,134 @@ bool wxResourceSymbolTable::SymbolExists(const wxString& symbol) const
     return (m_hashTable.Get(symbol) != NULL);
 }
 
+bool wxResourceSymbolTable::IdExists(int id)
+{
+    m_hashTable.BeginFind();
+    
+    wxNode* node = m_hashTable.Next();
+    while (node)
+    {
+        if ( (((int) node->Data()) == id) )
+            return TRUE;
+        
+        node = m_hashTable.Next();
+    }
+    return FALSE;
+}
+
+int wxResourceSymbolTable::FindHighestId()
+{
+    int highest = 0;
+    
+    m_hashTable.BeginFind();
+    
+    wxNode* node = m_hashTable.Next();
+    while (node)
+    {
+        int id = ((int) node->Data());
+        if (id > highest)
+            highest = id;
+        
+        node = m_hashTable.Next();
+    }
+    
+    // Make sure we don't clash with future standard wxWindows ids
+    if (highest <= wxID_HIGHEST)
+        highest = wxID_HIGHEST + 1;
+    return highest;
+}
+
+/*
+* A table of the standard identifiers
+*/
+
+struct wxStandardSymbolStruct
+{
+    char*       m_name;
+    int         m_id;
+};
+
+static wxStandardSymbolStruct sg_StandardSymbols[] =
+{
+    { "wxID_OK",            wxID_OK },
+    { "wxID_CANCEL",        wxID_CANCEL },
+    { "wxID_APPLY",         wxID_APPLY },
+    { "wxID_HELP",          wxID_HELP },
+    { "wxID_STATIC",        wxID_STATIC },
+    { "wxID_YES",           wxID_YES },
+    { "wxID_NO",            wxID_NO },
+    
+    { "wxID_OPEN",          wxID_OPEN },
+    { "wxID_CLOSE",          wxID_CLOSE },
+    { "wxID_NEW",           wxID_NEW },
+    { "wxID_SAVE",          wxID_SAVE },
+    { "wxID_SAVEAS",        wxID_SAVEAS },
+    { "wxID_REVERT",        wxID_REVERT },
+    { "wxID_EXIT",          wxID_EXIT },
+    { "wxID_UNDO",          wxID_UNDO },
+    { "wxID_REDO",          wxID_REDO },
+    { "wxID_PRINT",         wxID_PRINT },
+    { "wxID_PRINT_SETUP",   wxID_PRINT_SETUP },
+    { "wxID_PREVIEW",       wxID_PREVIEW },
+    { "wxID_ABOUT",         wxID_ABOUT },
+    { "wxID_HELP_CONTENTS", wxID_HELP_CONTENTS },
+    { "wxID_HELP_COMMANDS", wxID_HELP_COMMANDS },
+    { "wxID_HELP_PROCEDURES", wxID_HELP_PROCEDURES },
+    { "wxID_HELP_CONTEXT",  wxID_HELP_CONTEXT },
+    
+    { "wxID_CUT",           wxID_CUT },
+    { "wxID_COPY",          wxID_COPY },
+    { "wxID_PASTE",         wxID_PASTE },
+    { "wxID_CLEAR",         wxID_CLEAR },
+    { "wxID_FIND",          wxID_FIND },
+    { "wxID_DUPLICATE",     wxID_DUPLICATE },
+    
+    { "wxID_FILE1",         wxID_FILE1 },
+    { "wxID_FILE2",         wxID_FILE2 },
+    { "wxID_FILE3",         wxID_FILE3 },
+    { "wxID_FILE4",         wxID_FILE4 },
+    { "wxID_FILE5",         wxID_FILE5 },
+    { "wxID_FILE6",         wxID_FILE6 },
+    { "wxID_FILE7",         wxID_FILE7 },
+    { "wxID_FILE8",         wxID_FILE8 },
+    { "wxID_FILE9",         wxID_FILE9 }
+    
+};
+
+static int sg_StandardSymbolSize = (sizeof(sg_StandardSymbols)/sizeof(wxStandardSymbolStruct));
+
+void wxResourceSymbolTable::AddStandardSymbols()
+{
+    int i;
+    for (i = 0; i < sg_StandardSymbolSize; i++)
+    {
+        AddSymbol(sg_StandardSymbols[i].m_name, sg_StandardSymbols[i].m_id);
+    }
+}
+
+bool wxResourceSymbolTable::IsStandardSymbol(const wxString& symbol) const
+{
+    int i;
+    for (i = 0; i < sg_StandardSymbolSize; i++)
+    {
+        if (symbol == sg_StandardSymbols[i].m_name)
+            return TRUE;
+    }
+    return FALSE;
+}
+
+bool wxResourceSymbolTable::FillComboBox(wxComboBox* comboBox)
+{
+    m_hashTable.BeginFind();
+    
+    wxNode* node = m_hashTable.Next();
+    while (node)
+    {
+        const char* str = node->GetKeyString();
+        
+        comboBox->Append(str);
+        node = m_hashTable.Next();
+    }
+    return TRUE;
+}
+