1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Paper size classes 
   4 // Author:      Julian Smart  
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  13 #pragma implementation "paper.h" 
  16 // For compilers that support precompilation, includes "wx.h". 
  17 #include "wx/wxprec.h" 
  25 #if wxUSE_PRINTING_ARCHITECTURE 
  30 #include "wx/settings.h" 
  35 #include "wx/module.h" 
  36 #include "wx/hashmap.h" 
  42 #include "wx/msw/wrapwin.h" 
  52 IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperType
, wxObject
) 
  53 // IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperDatabase, wxList) 
  56  * Paper size database for all platforms 
  59 wxPrintPaperType::wxPrintPaperType() 
  61     m_paperId 
= wxPAPER_NONE
; 
  63     m_paperName 
= wxT(""); 
  68 wxPrintPaperType::wxPrintPaperType(wxPaperSize paperId
, int platformId
, const wxString
& name
, int w
, int h
) 
  71     m_platformId 
= platformId
; 
  77 // Get width and height in points (1/72th of an inch) 
  78 wxSize 
wxPrintPaperType::GetSizeDeviceUnits() const 
  80     return wxSize( (int) ((m_width 
/ 10.0) / (25.4 / 72.0)), (int) ((m_height 
/ 10.0) / (25.4 / 72.0)) ); 
  84  * Print paper database for PostScript 
  87 WX_DECLARE_STRING_HASH_MAP(wxPrintPaperType
*, wxStringToPrintPaperTypeHashMap
); 
  88 WX_DECLARE_LIST(wxPrintPaperType
, wxPrintPaperTypeList
); 
  89 #include "wx/listimpl.cpp" 
  90 WX_DEFINE_LIST(wxPrintPaperTypeList
); 
  92 wxPrintPaperDatabase
* wxThePrintPaperDatabase 
= (wxPrintPaperDatabase
*) NULL
; 
  94 wxPrintPaperDatabase::wxPrintPaperDatabase() 
  96     m_map 
= new wxStringToPrintPaperTypeHashMap
; 
  97     m_list 
= new wxPrintPaperTypeList
; 
 100 wxPrintPaperDatabase::~wxPrintPaperDatabase() 
 105 void wxPrintPaperDatabase::CreateDatabase() 
 108   AddPaperType(wxTRANSLATE("A4 210 x 297 mm"), 210, 297); 
 109   AddPaperType(wxTRANSLATE("A3 297 x 420 mm"), 297, 420); 
 110   AddPaperType(wxTRANSLATE("Letter 8 1/2 x 11 in"), 216, 279); 
 111   AddPaperType(wxTRANSLATE("Legal 8 1/2 x 14 in"), 216, 356); 
 114     WXADDPAPER(wxPAPER_LETTER
,             DMPAPER_LETTER
,             wxTRANSLATE("Letter, 8 1/2 x 11 in"), 2159, 2794); 
 115     WXADDPAPER(wxPAPER_LEGAL
,              DMPAPER_LEGAL
,              wxTRANSLATE("Legal, 8 1/2 x 14 in"), 2159, 3556); 
 116     WXADDPAPER(wxPAPER_A4
,                 DMPAPER_A4
,                 wxTRANSLATE("A4 sheet, 210 x 297 mm"), 2100, 2970); 
 117     WXADDPAPER(wxPAPER_CSHEET
,             DMPAPER_CSHEET
,             wxTRANSLATE("C sheet, 17 x 22 in"), 4318, 5588); 
 118     WXADDPAPER(wxPAPER_DSHEET
,             DMPAPER_DSHEET
,             wxTRANSLATE("D sheet, 22 x 34 in"), 5588, 8636); 
 119     WXADDPAPER(wxPAPER_ESHEET
,             DMPAPER_ESHEET
,             wxTRANSLATE("E sheet, 34 x 44 in"), 8636, 11176); 
 120     WXADDPAPER(wxPAPER_LETTERSMALL
,        DMPAPER_LETTERSMALL
,        wxTRANSLATE("Letter Small, 8 1/2 x 11 in"), 2159, 2794); 
 121     WXADDPAPER(wxPAPER_TABLOID
,            DMPAPER_TABLOID
,            wxTRANSLATE("Tabloid, 11 x 17 in"), 2794, 4318); 
 122     WXADDPAPER(wxPAPER_LEDGER
,             DMPAPER_LEDGER
,             wxTRANSLATE("Ledger, 17 x 11 in"), 4318, 2794); 
 123     WXADDPAPER(wxPAPER_STATEMENT
,          DMPAPER_STATEMENT
,          wxTRANSLATE("Statement, 5 1/2 x 8 1/2 in"), 1397, 2159); 
 124     WXADDPAPER(wxPAPER_EXECUTIVE
,          DMPAPER_EXECUTIVE
,          wxTRANSLATE("Executive, 7 1/4 x 10 1/2 in"), 1842, 2667); 
 125     WXADDPAPER(wxPAPER_A3
,                 DMPAPER_A3
,                 wxTRANSLATE("A3 sheet, 297 x 420 mm"), 2970, 4200); 
 126     WXADDPAPER(wxPAPER_A4SMALL
,            DMPAPER_A4SMALL
,            wxTRANSLATE("A4 small sheet, 210 x 297 mm"), 2100, 2970); 
 127     WXADDPAPER(wxPAPER_A5
,                 DMPAPER_A5
,                 wxTRANSLATE("A5 sheet, 148 x 210 mm"), 1480, 2100); 
 128     WXADDPAPER(wxPAPER_B4
,                 DMPAPER_B4
,                 wxTRANSLATE("B4 sheet, 250 x 354 mm"), 2500, 3540); 
 129     WXADDPAPER(wxPAPER_B5
,                 DMPAPER_B5
,                 wxTRANSLATE("B5 sheet, 182 x 257 millimeter"), 1820, 2570); 
 130     WXADDPAPER(wxPAPER_FOLIO
,              DMPAPER_FOLIO
,              wxTRANSLATE("Folio, 8 1/2 x 13 in"), 2159, 3302); 
 131     WXADDPAPER(wxPAPER_QUARTO
,             DMPAPER_QUARTO
,             wxTRANSLATE("Quarto, 215 x 275 mm"), 2150, 2750); 
 132     WXADDPAPER(wxPAPER_10X14
,              DMPAPER_10X14
,              wxTRANSLATE("10 x 14 in"), 2540, 3556); 
 133     WXADDPAPER(wxPAPER_11X17
,              DMPAPER_11X17
,              wxTRANSLATE("11 x 17 in"), 2794, 4318); 
 134     WXADDPAPER(wxPAPER_NOTE
,               DMPAPER_NOTE
,               wxTRANSLATE("Note, 8 1/2 x 11 in"), 2159, 2794); 
 135     WXADDPAPER(wxPAPER_ENV_9
,              DMPAPER_ENV_9
,              wxTRANSLATE("#9 Envelope, 3 7/8 x 8 7/8 in"), 984, 2254); 
 136     WXADDPAPER(wxPAPER_ENV_10
,             DMPAPER_ENV_10
,             wxTRANSLATE("#10 Envelope, 4 1/8 x 9 1/2 in"), 1048, 2413); 
 137     WXADDPAPER(wxPAPER_ENV_11
,             DMPAPER_ENV_11
,             wxTRANSLATE("#11 Envelope, 4 1/2 x 10 3/8 in"), 1143, 2635); 
 138     WXADDPAPER(wxPAPER_ENV_12
,             DMPAPER_ENV_12
,             wxTRANSLATE("#12 Envelope, 4 3/4 x 11 in"), 1206, 2794); 
 139     WXADDPAPER(wxPAPER_ENV_14
,             DMPAPER_ENV_14
,             wxTRANSLATE("#14 Envelope, 5 x 11 1/2 in"), 1270, 2921); 
 140     WXADDPAPER(wxPAPER_ENV_DL
,             DMPAPER_ENV_DL
,             wxTRANSLATE("DL Envelope, 110 x 220 mm"), 1100, 2200); 
 141     WXADDPAPER(wxPAPER_ENV_C5
,             DMPAPER_ENV_C5
,             wxTRANSLATE("C5 Envelope, 162 x 229 mm"), 1620, 2290); 
 142     WXADDPAPER(wxPAPER_ENV_C3
,             DMPAPER_ENV_C3
,             wxTRANSLATE("C3 Envelope, 324 x 458 mm"), 3240, 4580); 
 143     WXADDPAPER(wxPAPER_ENV_C4
,             DMPAPER_ENV_C4
,             wxTRANSLATE("C4 Envelope, 229 x 324 mm"), 2290, 3240); 
 144     WXADDPAPER(wxPAPER_ENV_C6
,             DMPAPER_ENV_C6
,             wxTRANSLATE("C6 Envelope, 114 x 162 mm"), 1140, 1620); 
 145     WXADDPAPER(wxPAPER_ENV_C65
,            DMPAPER_ENV_C65
,            wxTRANSLATE("C65 Envelope, 114 x 229 mm"), 1140, 2290); 
 146     WXADDPAPER(wxPAPER_ENV_B4
,             DMPAPER_ENV_B4
,             wxTRANSLATE("B4 Envelope, 250 x 353 mm"), 2500, 3530); 
 147     WXADDPAPER(wxPAPER_ENV_B5
,             DMPAPER_ENV_B5
,             wxTRANSLATE("B5 Envelope, 176 x 250 mm"), 1760, 2500); 
 148     WXADDPAPER(wxPAPER_ENV_B6
,             DMPAPER_ENV_B6
,             wxTRANSLATE("B6 Envelope, 176 x 125 mm"), 1760, 1250); 
 149     WXADDPAPER(wxPAPER_ENV_ITALY
,          DMPAPER_ENV_ITALY
,          wxTRANSLATE("Italy Envelope, 110 x 230 mm"), 1100, 2300); 
 150     WXADDPAPER(wxPAPER_ENV_MONARCH
,        DMPAPER_ENV_MONARCH
,        wxTRANSLATE("Monarch Envelope, 3 7/8 x 7 1/2 in"), 984, 1905); 
 151     WXADDPAPER(wxPAPER_ENV_PERSONAL
,       DMPAPER_ENV_PERSONAL
,       wxTRANSLATE("6 3/4 Envelope, 3 5/8 x 6 1/2 in"), 921, 1651); 
 152     WXADDPAPER(wxPAPER_FANFOLD_US
,         DMPAPER_FANFOLD_US
,         wxTRANSLATE("US Std Fanfold, 14 7/8 x 11 in"), 3778, 2794); 
 153     WXADDPAPER(wxPAPER_FANFOLD_STD_GERMAN
, DMPAPER_FANFOLD_STD_GERMAN
, wxTRANSLATE("German Std Fanfold, 8 1/2 x 12 in"), 2159, 3048); 
 154     WXADDPAPER(wxPAPER_FANFOLD_LGL_GERMAN
, DMPAPER_FANFOLD_LGL_GERMAN
, wxTRANSLATE("German Legal Fanfold, 8 1/2 x 13 in"), 2159, 3302); 
 158     WXADDPAPER(wxPAPER_ISO_B4,             DMPAPER_ISO_B4,             "B4 (ISO) 250 x 353 mm", 
 159     WXADDPAPER(wxPAPER_JAPANESE_POSTCARD,  DMPAPER_JAPANESE_POSTCARD,  "Japanese Postcard 100 x 148 mm", 
 160     WXADDPAPER(wxPAPER_9X11,               DMPAPER_9X11,               "9 x 11 in", 
 161     WXADDPAPER(wxPAPER_10X11,              DMPAPER_10X11,              "10 x 11 in", 
 162     WXADDPAPER(wxPAPER_15X11,              DMPAPER_15X11,              "15 x 11 in", 
 163     WXADDPAPER(wxPAPER_ENV_INVITE,         DMPAPER_ENV_INVITE,         "Envelope Invite 220 x 220 mm", 
 164     // What does \275 mean? 
 165 //    WXADDPAPER(wxPAPER_LETTER_EXTRA,       DMPAPER_LETTER_EXTRA,       "Letter Extra 9 \275 x 12 in", 
 166 //    WXADDPAPER(wxPAPER_LEGAL_EXTRA,        DMPAPER_LEGAL_EXTRA,        "Legal Extra 9 \275 x 15 in", 
 167     WXADDPAPER(wxPAPER_TABLOID_EXTRA,      DMPAPER_TABLOID_EXTRA,      "Tabloid Extra 11.69 x 18 in", 
 168     WXADDPAPER(wxPAPER_A4_EXTRA,           DMPAPER_A4_EXTRA,           "A4 Extra 9.27 x 12.69 in", 
 169 //    WXADDPAPER(wxPAPER_LETTER_TRANSVERSE,  DMPAPER_LETTER_TRANSVERSE,  "Letter Transverse 8 \275 x 11 in", 
 170     WXADDPAPER(wxPAPER_A4_TRANSVERSE,      DMPAPER_A4_TRANSVERSE,      "A4 Transverse 210 x 297 mm", 
 171 //    WXADDPAPER(wxPAPER_LETTER_EXTRA_TRANSVERSE, DMPAPER_LETTER_EXTRA_TRANSVERSE, "Letter Extra Transverse 9\275 x 12 in", 
 172     WXADDPAPER(wxPAPER_A_PLUS,             DMPAPER_A_PLUS,             "SuperA/SuperA/A4 227 x 356 mm", 
 173     WXADDPAPER(wxPAPER_B_PLUS,             DMPAPER_B_PLUS,             "SuperB/SuperB/A3 305 x 487 mm", 
 174     WXADDPAPER(wxPAPER_LETTER_PLUS,        DMPAPER_LETTER_PLUS,        "Letter Plus 8.5 x 12.69 in", 
 175     WXADDPAPER(wxPAPER_A4_PLUS,            DMPAPER_A4_PLUS,            "A4 Plus 210 x 330 mm", 
 176     WXADDPAPER(wxPAPER_A5_TRANSVERSE,      DMPAPER_A5_TRANSVERSE,      "A5 Transverse 148 x 210 mm", 
 177     WXADDPAPER(wxPAPER_B5_TRANSVERSE,      DMPAPER_B5_TRANSVERSE,      "B5 (JIS) Transverse 182 x 257 mm", 
 178     WXADDPAPER(wxPAPER_A3_EXTRA,           DMPAPER_A3_EXTRA,           "A3 Extra 322 x 445 mm", 
 179     WXADDPAPER(wxPAPER_A5_EXTRA,           DMPAPER_A5_EXTRA,           "A5 Extra 174 x 235 mm", 
 180     WXADDPAPER(wxPAPER_B5_EXTRA,           DMPAPER_B5_EXTRA,           "B5 (ISO) Extra 201 x 276 mm", 
 181     WXADDPAPER(wxPAPER_A2,                 DMPAPER_A2,                 "A2 420 x 594 mm", 
 182     WXADDPAPER(wxPAPER_A3_TRANSVERSE,      DMPAPER_A3_TRANSVERSE,      "A3 Transverse 297 x 420 mm", 
 183     WXADDPAPER(wxPAPER_A3_EXTRA_TRANSVERSE DMPAPER_A3_EXTRA_TRANSVERSE "A3 Extra Transverse 322 x 445 mm", 
 188 void wxPrintPaperDatabase::ClearDatabase() 
 191     WX_CLEAR_HASH_MAP(wxStringToPrintPaperTypeHashMap
, *m_map
); 
 195 void wxPrintPaperDatabase::AddPaperType(wxPaperSize paperId
, const wxString
& name
, int w
, int h
) 
 197     wxPrintPaperType
* tmp 
= new wxPrintPaperType(paperId
, 0, name
, w
, h
); 
 198     (*m_map
)[name
] = tmp
; 
 199     m_list
->push_back(tmp
); 
 202 void wxPrintPaperDatabase::AddPaperType(wxPaperSize paperId
, int platformId
, const wxString
& name
, int w
, int h
) 
 204     wxPrintPaperType
* tmp 
= new wxPrintPaperType(paperId
, platformId
, name
, w
, h
); 
 205     (*m_map
)[name
] = tmp
; 
 206     m_list
->push_back(tmp
); 
 209 wxPrintPaperType 
*wxPrintPaperDatabase::FindPaperType(const wxString
& name
) 
 211     wxStringToPrintPaperTypeHashMap::iterator it 
= m_map
->find(name
); 
 212     if (it 
!= m_map
->end()) 
 218 wxPrintPaperType 
*wxPrintPaperDatabase::FindPaperType(wxPaperSize id
) 
 220     typedef wxStringToPrintPaperTypeHashMap::iterator iterator
; 
 222     for (iterator it 
= m_map
->begin(), en 
= m_map
->end(); it 
!= en
; ++it
) 
 224         wxPrintPaperType
* paperType 
= it
->second
; 
 225         if (paperType
->GetId() == id
) 
 232 wxPrintPaperType 
*wxPrintPaperDatabase::FindPaperTypeByPlatformId(int id
) 
 234     typedef wxStringToPrintPaperTypeHashMap::iterator iterator
; 
 236     for (iterator it 
= m_map
->begin(), en 
= m_map
->end(); it 
!= en
; ++it
) 
 238         wxPrintPaperType
* paperType 
= it
->second
; 
 239         if (paperType
->GetPlatformId() == id
) 
 246 wxPrintPaperType 
*wxPrintPaperDatabase::FindPaperType(const wxSize
& sz
) 
 248     typedef wxStringToPrintPaperTypeHashMap::iterator iterator
; 
 250     for (iterator it 
= m_map
->begin(), en 
= m_map
->end(); it 
!= en
; ++it
) 
 252         wxPrintPaperType
* paperType 
= it
->second
; 
 253         wxSize paperSize 
= paperType
->GetSize() ; 
 254         if ( abs( paperSize
.x 
- sz
.x 
) < 10 && abs( paperSize
.y 
- sz
.y 
) < 10 ) 
 261 // Convert name to size id 
 262 wxPaperSize 
wxPrintPaperDatabase::ConvertNameToId(const wxString
& name
) 
 264     wxPrintPaperType
* type 
= FindPaperType(name
); 
 266         return type
->GetId(); 
 271 // Convert size id to name 
 272 wxString 
wxPrintPaperDatabase::ConvertIdToName(wxPaperSize paperId
) 
 274     wxPrintPaperType
* type 
= FindPaperType(paperId
); 
 276         return type
->GetName(); 
 278         return wxEmptyString
; 
 281 // Get the paper size 
 282 wxSize 
wxPrintPaperDatabase::GetSize(wxPaperSize paperId
) 
 284     wxPrintPaperType
* type 
= FindPaperType(paperId
); 
 286         return type
->GetSize(); 
 291 // Get the paper size 
 292 wxPaperSize 
wxPrintPaperDatabase::GetSize(const wxSize
& size
) 
 294     wxPrintPaperType
* type 
= FindPaperType(size
); 
 296         return type
->GetId(); 
 302 size_t wxPrintPaperDatabase::GetCount() const 
 304     return m_list
->GetCount(); 
 307 wxPrintPaperType
* wxPrintPaperDatabase::Item(size_t index
) const 
 309     return m_list
->Item(index
)->GetData(); 
 312 // A module to allow initialization/cleanup of print paper 
 313 // things without calling these functions from app.cpp. 
 315 class WXDLLEXPORT wxPrintPaperModule
: public wxModule
 
 317 DECLARE_DYNAMIC_CLASS(wxPrintPaperModule
) 
 319     wxPrintPaperModule() {} 
 324 IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperModule
, wxModule
) 
 327  * Initialization/cleanup module 
 330 bool wxPrintPaperModule::OnInit() 
 332     wxThePrintPaperDatabase 
= new wxPrintPaperDatabase
; 
 333     wxThePrintPaperDatabase
->CreateDatabase(); 
 338 void wxPrintPaperModule::OnExit() 
 340     delete wxThePrintPaperDatabase
; 
 341     wxThePrintPaperDatabase 
= NULL
; 
 344 #endif // wxUSE_PRINTING_ARCHITECTURE