X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..fef5c55604e20e2a90843a2278b1f5c8c817dcee:/src/common/paper.cpp diff --git a/src/common/paper.cpp b/src/common/paper.cpp index d8775f2c62..0a81aa5c0c 100644 --- a/src/common/paper.cpp +++ b/src/common/paper.cpp @@ -9,7 +9,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "paper.h" #endif @@ -33,12 +33,13 @@ #include "wx/paper.h" #include "wx/module.h" +#include "wx/hashmap.h" #include #include #ifdef __WXMSW__ -#include +#include "wx/msw/wrapwin.h" #include #ifndef __WIN32__ @@ -49,7 +50,7 @@ // End __WXMSW__ IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperType, wxObject) -IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperDatabase, wxList) +// IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperDatabase, wxList) /* * Paper size database for all platforms @@ -59,7 +60,7 @@ wxPrintPaperType::wxPrintPaperType() { m_paperId = wxPAPER_NONE; m_platformId = 0; - m_paperName = ""; + m_paperName = wxT(""); m_width = 0; m_height = 0; } @@ -83,11 +84,22 @@ wxSize wxPrintPaperType::GetSizeDeviceUnits() const * Print paper database for PostScript */ +WX_DECLARE_STRING_HASH_MAP(wxPrintPaperType*, wxStringToPrintPaperTypeHashMap); +WX_DECLARE_LIST(wxPrintPaperType, wxPrintPaperTypeList); +#include "wx/listimpl.cpp" +WX_DEFINE_LIST(wxPrintPaperTypeList); + wxPrintPaperDatabase* wxThePrintPaperDatabase = (wxPrintPaperDatabase*) NULL; -wxPrintPaperDatabase::wxPrintPaperDatabase():wxList(wxKEY_STRING) +wxPrintPaperDatabase::wxPrintPaperDatabase() +{ + m_map = new wxStringToPrintPaperTypeHashMap; + m_list = new wxPrintPaperTypeList; +} + +wxPrintPaperDatabase::~wxPrintPaperDatabase() { - DeleteContents(TRUE); + ClearDatabase(); } void wxPrintPaperDatabase::CreateDatabase() @@ -175,65 +187,75 @@ void wxPrintPaperDatabase::CreateDatabase() void wxPrintPaperDatabase::ClearDatabase() { - Clear(); + delete m_list; + WX_CLEAR_HASH_MAP(wxStringToPrintPaperTypeHashMap, *m_map); + delete m_map; } void wxPrintPaperDatabase::AddPaperType(wxPaperSize paperId, const wxString& name, int w, int h) { - Append(name, new wxPrintPaperType(paperId, 0, name, w, h)); + wxPrintPaperType* tmp = new wxPrintPaperType(paperId, 0, name, w, h); + (*m_map)[name] = tmp; + m_list->push_back(tmp); } void wxPrintPaperDatabase::AddPaperType(wxPaperSize paperId, int platformId, const wxString& name, int w, int h) { - Append(name, new wxPrintPaperType(paperId, platformId, name, w, h)); + wxPrintPaperType* tmp = new wxPrintPaperType(paperId, platformId, name, w, h); + (*m_map)[name] = tmp; + m_list->push_back(tmp); } wxPrintPaperType *wxPrintPaperDatabase::FindPaperType(const wxString& name) { - wxNode *node = Find(name); - if (node) - return (wxPrintPaperType *)node->Data(); + wxStringToPrintPaperTypeHashMap::iterator it = m_map->find(name); + if (it != m_map->end()) + return it->second; else - return (wxPrintPaperType *) NULL; + return NULL; } wxPrintPaperType *wxPrintPaperDatabase::FindPaperType(wxPaperSize id) { - wxNode *node = First(); - while (node) + typedef wxStringToPrintPaperTypeHashMap::iterator iterator; + + for (iterator it = m_map->begin(), en = m_map->end(); it != en; ++it) { - wxPrintPaperType* paperType = (wxPrintPaperType*) node->Data(); + wxPrintPaperType* paperType = it->second; if (paperType->GetId() == id) return paperType; - node = node->Next(); } - return (wxPrintPaperType *) NULL; + + return NULL; } wxPrintPaperType *wxPrintPaperDatabase::FindPaperTypeByPlatformId(int id) { - wxNode *node = First(); - while (node) + typedef wxStringToPrintPaperTypeHashMap::iterator iterator; + + for (iterator it = m_map->begin(), en = m_map->end(); it != en; ++it) { - wxPrintPaperType* paperType = (wxPrintPaperType*) node->Data(); + wxPrintPaperType* paperType = it->second; if (paperType->GetPlatformId() == id) return paperType; - node = node->Next(); } - return (wxPrintPaperType *) NULL; + + return NULL; } wxPrintPaperType *wxPrintPaperDatabase::FindPaperType(const wxSize& sz) { - wxNode *node = First(); - while (node) + typedef wxStringToPrintPaperTypeHashMap::iterator iterator; + + for (iterator it = m_map->begin(), en = m_map->end(); it != en; ++it) { - wxPrintPaperType* paperType = (wxPrintPaperType*) node->Data(); - if (paperType->GetSize() == sz) + wxPrintPaperType* paperType = it->second; + wxSize paperSize = paperType->GetSize() ; + if ( abs( paperSize.x - sz.x ) < 10 && abs( paperSize.y - sz.y ) < 10 ) return paperType; - node = node->Next(); } - return (wxPrintPaperType *) NULL; + + return NULL; } // Convert name to size id @@ -276,6 +298,17 @@ wxPaperSize wxPrintPaperDatabase::GetSize(const wxSize& size) return wxPAPER_NONE; } +// QUICK and DIRTY +size_t wxPrintPaperDatabase::GetCount() const +{ + return m_list->GetCount(); +} + +wxPrintPaperType* wxPrintPaperDatabase::Item(size_t index) const +{ + return m_list->Item(index)->GetData(); +} + // A module to allow initialization/cleanup of print paper // things without calling these functions from app.cpp.