]> git.saurik.com Git - wxWidgets.git/blob - samples/html/printing/printing.cpp
Don't enter an infinite loop if a spacer with min size of -1 is used.
[wxWidgets.git] / samples / html / printing / printing.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: printing.cpp
3 // Purpose: wxHtml sample: wxHtmlEasyPrinting test
4 // Author: Vaclav Slavik
5 // RCS-ID: $Id$
6 // Copyright: (c) 1998-2009 wxWidgets team
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9
10
11 // For compilers that support precompilation, includes "wx/wx.h".
12 #include "wx/wxprec.h"
13
14 #ifdef __BORLANDC__
15 #pragma hdrstop
16 #endif
17
18 // for all others, include the necessary headers (this file is usually all you
19 // need because it includes almost all "standard" wxWidgets headers
20 #ifndef WX_PRECOMP
21 #include "wx/wx.h"
22 #endif
23
24 #include "wx/image.h"
25 #include "wx/html/htmlwin.h"
26 #include "wx/html/htmprint.h"
27
28 #ifndef __WXMSW__
29 #include "../../sample.xpm"
30 #endif
31
32
33 // ----------------------------------------------------------------------------
34 // private classes
35 // ----------------------------------------------------------------------------
36
37 // Define a new application type, each program should derive a class from wxApp
38 class MyApp : public wxApp
39 {
40 public:
41 // override base class virtuals
42 // ----------------------------
43
44 // this one is called on application startup and is a good place for the app
45 // initialization (doing it here and not in the ctor allows to have an error
46 // return: if OnInit() returns false, the application terminates)
47
48 virtual bool OnInit();
49 };
50
51 // Define a new frame type: this is going to be our main frame
52 class MyFrame : public wxFrame
53 {
54 public:
55 // ctor and dtor
56
57 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
58 virtual ~MyFrame();
59
60 // event handlers (these functions should _not_ be virtual)
61 void OnQuit(wxCommandEvent& event);
62 void OnAbout(wxCommandEvent& event);
63
64 void OnPageSetup(wxCommandEvent& event);
65 void OnPrint(wxCommandEvent& event);
66 void OnPreview(wxCommandEvent& event);
67 void OnOpen(wxCommandEvent& event);
68
69 void OnPrintSmall(wxCommandEvent& event);
70 void OnPrintNormal(wxCommandEvent& event);
71 void OnPrintHuge(wxCommandEvent& event);
72
73
74 private:
75 wxHtmlWindow *m_Html;
76 wxHtmlEasyPrinting *m_Prn;
77 wxString m_Name;
78
79 // any class wishing to process wxWidgets events must use this macro
80 DECLARE_EVENT_TABLE()
81 };
82
83 // ----------------------------------------------------------------------------
84 // constants
85 // ----------------------------------------------------------------------------
86
87 // IDs for the controls and the menu commands
88 enum
89 {
90 // menu items
91 Minimal_Quit = 1,
92 Minimal_Print,
93 Minimal_Preview,
94 Minimal_PageSetup,
95 Minimal_Open,
96 Minimal_PrintSmall,
97 Minimal_PrintNormal,
98 Minimal_PrintHuge
99
100 };
101
102 // ----------------------------------------------------------------------------
103 // event tables and other macros for wxWidgets
104 // ----------------------------------------------------------------------------
105
106 // the event tables connect the wxWidgets events with the functions (event
107 // handlers) which process them. It can be also done at run-time, but for the
108 // simple menu events like this the static method is much simpler.
109 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
110 EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
111 EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
112 EVT_MENU(Minimal_Print, MyFrame::OnPrint)
113 EVT_MENU(Minimal_Preview, MyFrame::OnPreview)
114 EVT_MENU(Minimal_PageSetup, MyFrame::OnPageSetup)
115 EVT_MENU(Minimal_Open, MyFrame::OnOpen)
116 EVT_MENU(Minimal_PrintSmall, MyFrame::OnPrintSmall)
117 EVT_MENU(Minimal_PrintNormal, MyFrame::OnPrintNormal)
118 EVT_MENU(Minimal_PrintHuge, MyFrame::OnPrintHuge)
119 END_EVENT_TABLE()
120
121 // Create a new application object: this macro will allow wxWidgets to create
122 // the application object during program execution (it's better than using a
123 // static object for many reasons) and also declares the accessor function
124 // wxGetApp() which will return the reference of the right type (i.e. MyApp and
125 // not wxApp)
126 IMPLEMENT_APP(MyApp)
127
128 // ============================================================================
129 // implementation
130 // ============================================================================
131
132 // ----------------------------------------------------------------------------
133 // the application class
134 // ----------------------------------------------------------------------------
135 // `Main program' equivalent: the program execution "starts" here
136
137 bool MyApp::OnInit()
138 {
139 if ( !wxApp::OnInit() )
140 return false;
141
142 #if wxUSE_LIBPNG
143 wxImage::AddHandler(new wxPNGHandler);
144 #endif
145 #if wxUSE_LIBJPEG
146 wxImage::AddHandler(new wxJPEGHandler);
147 #endif
148 #if wxUSE_GIF
149 wxImage::AddHandler(new wxGIFHandler);
150 #endif
151
152 MyFrame *frame = new MyFrame(_("Printing test"),
153 wxDefaultPosition, wxSize(640, 480));
154
155 // Show it and tell the application that it's our main window
156 // @@@ what does it do exactly, in fact? is it necessary here?
157 frame->Show(true);
158 SetTopWindow(frame);
159
160
161 // success: wxApp::OnRun() will be called which will enter the main message
162 // loop and the application will run. If we returned false here, the
163 // application would exit immediately.
164 return true;
165 }
166
167 // ----------------------------------------------------------------------------
168 // main frame
169 // ----------------------------------------------------------------------------
170
171
172 // frame constructor
173 MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
174 : wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size)
175 {
176 SetIcon(wxICON(sample));
177
178 // create a menu bar
179 wxMenu *menuFile = new wxMenu;
180 menuFile->Append(Minimal_Open, _("Open...\tCtrl-O"));
181 menuFile->AppendSeparator();
182 menuFile->Append(Minimal_PageSetup, _("Page &Setup"));
183 menuFile->Append(Minimal_Preview, _("Print pre&view..."));
184 menuFile->Append(Minimal_Print, _("Print...\tCtrl-P"));
185 menuFile->AppendSeparator();
186 menuFile->Append(wxID_ABOUT, _("&About"));
187 menuFile->AppendSeparator();
188 menuFile->Append(Minimal_Quit, _("&Exit"));
189
190 wxMenu *menuFonts = new wxMenu;
191 menuFonts->AppendRadioItem(Minimal_PrintSmall, _("&Small Printer Fonts"));
192 menuFonts->AppendRadioItem(Minimal_PrintNormal, _("&Normal Printer Fonts"));
193 menuFonts->AppendRadioItem(Minimal_PrintHuge, _("&Huge Printer Fonts"));
194
195 // now append the freshly created menu to the menu bar...
196 wxMenuBar *menuBar = new wxMenuBar;
197 menuBar->Append(menuFile, _("&File"));
198 menuBar->Append(menuFonts, _("F&onts"));
199
200 // ... and attach this menu bar to the frame
201 SetMenuBar(menuBar);
202
203 #if wxUSE_STATUSBAR
204 CreateStatusBar(1);
205 #endif // wxUSE_STATUSBAR
206
207 m_Html = new wxHtmlWindow(this);
208 m_Html -> SetRelatedFrame(this, _("HTML : %s"));
209 #if wxUSE_STATUSBAR
210 m_Html -> SetRelatedStatusBar(0);
211 #endif // wxUSE_STATUSBAR
212 m_Name = wxT("test.htm");
213 m_Html -> LoadPage(m_Name);
214
215 m_Prn = new wxHtmlEasyPrinting(_("Easy Printing Demo"), this);
216 m_Prn -> SetHeader(m_Name + wxT("(@PAGENUM@/@PAGESCNT@)<hr>"), wxPAGE_ALL);
217
218 // To specify where the AFM files are kept on Unix,
219 // you may wish to do something like this
220 // m_Prn->GetPrintData()->SetFontMetricPath(wxT("/home/julians/afm"));
221 }
222
223 // frame destructor
224 MyFrame::~MyFrame()
225 {
226 delete m_Prn;
227 m_Prn = (wxHtmlEasyPrinting *) NULL;
228 }
229
230
231 // event handlers
232
233 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
234 {
235 // true is to force the frame to close
236 Close(true);
237 }
238
239
240 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
241 {
242 wxMessageBox(_("HTML printing sample\n\n(c) Vaclav Slavik, 1999"));
243 }
244
245
246 void MyFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event))
247 {
248 m_Prn -> PageSetup();
249 }
250
251
252 void MyFrame::OnPrint(wxCommandEvent& WXUNUSED(event))
253 {
254 m_Prn -> PrintFile(m_Name);
255 }
256
257
258 void MyFrame::OnPreview(wxCommandEvent& WXUNUSED(event))
259 {
260 m_Prn -> PreviewFile(m_Name);
261 }
262
263
264 void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
265 {
266 wxFileDialog dialog(this, _("Open HTML page"), wxT(""), wxT(""), wxT("*.htm"), 0);
267
268 if (dialog.ShowModal() == wxID_OK)
269 {
270 m_Name = dialog.GetPath();
271 m_Html -> LoadPage(m_Name);
272 m_Prn -> SetHeader(m_Name + wxT("(@PAGENUM@/@PAGESCNT@)<hr>"), wxPAGE_ALL);
273 }
274 }
275
276
277 void MyFrame::OnPrintSmall(wxCommandEvent& WXUNUSED(event))
278 {
279 m_Prn->SetStandardFonts(8);
280 }
281
282 void MyFrame::OnPrintNormal(wxCommandEvent& WXUNUSED(event))
283 {
284 m_Prn->SetStandardFonts(12);
285 }
286
287 void MyFrame::OnPrintHuge(wxCommandEvent& WXUNUSED(event))
288 {
289 m_Prn->SetStandardFonts(28);
290 }