Printing improvements: GetPageInfo() gets called after the DC has

been set and after OnPreparePrinting() has been called so it can
report the number of pages accurately; doesn't try to set
number of pages in print dialog, in common with other Windows apps;
wxHTML easy printing's preview shows number of pages
correctly; preview scrollbars are set correctly; keyboard navigation
improved


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22263 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2003-07-23 20:30:19 +00:00
parent 3d16b99ece
commit d2b354f9c9
12 changed files with 205 additions and 155 deletions

View File

@@ -70,6 +70,7 @@ END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxPreviewCanvas, wxScrolledWindow)
EVT_PAINT(wxPreviewCanvas::OnPaint)
EVT_CHAR(wxPreviewCanvas::OnChar)
EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged)
END_EVENT_TABLE()
@@ -197,7 +198,7 @@ wxScrolledWindow(parent, -1, pos, size, style, name)
#endif
SetBackgroundColour(wxSystemSettings::GetColour(colourIndex));
SetScrollbars(15, 18, 100, 100);
SetScrollbars(10, 10, 100, 100);
}
wxPreviewCanvas::~wxPreviewCanvas()
@@ -239,6 +240,38 @@ void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event)
wxWindow::OnSysColourChanged(event);
}
void wxPreviewCanvas::OnChar(wxKeyEvent &event)
{
if (event.GetKeyCode() == WXK_ESCAPE)
{
((wxPreviewFrame*) GetParent())->Close(TRUE);
return;
}
if (!event.ControlDown())
{
event.Skip();
return;
}
wxPreviewControlBar* controlBar = ((wxPreviewFrame*) GetParent())->GetControlBar();
switch(event.GetKeyCode())
{
case WXK_NEXT:
controlBar->OnNext(); break;
case WXK_PRIOR:
controlBar->OnPrevious(); break;
case WXK_HOME:
controlBar->OnFirst(); break;
case WXK_END:
controlBar->OnLast(); break;
case WXK_TAB:
controlBar->OnGoto(); break;
default:
event.Skip();
}
}
/*
* Preview control bar
*/
@@ -251,7 +284,6 @@ BEGIN_EVENT_TABLE(wxPreviewControlBar, wxPanel)
EVT_BUTTON(wxID_PREVIEW_FIRST, wxPreviewControlBar::OnFirstButton)
EVT_BUTTON(wxID_PREVIEW_LAST, wxPreviewControlBar::OnLastButton)
EVT_BUTTON(wxID_PREVIEW_GOTO, wxPreviewControlBar::OnGotoButton)
EVT_CHAR(wxPreviewControlBar::OnChar)
EVT_CHOICE(wxID_PREVIEW_ZOOM, wxPreviewControlBar::OnZoom)
EVT_PAINT(wxPreviewControlBar::OnPaint)
END_EVENT_TABLE()
@@ -297,25 +329,6 @@ void wxPreviewControlBar::OnPrint(wxCommandEvent& WXUNUSED(event))
preview->Print(TRUE);
}
void wxPreviewControlBar::OnChar(wxKeyEvent &event)
{
switch(event.GetKeyCode())
{
case WXK_NEXT:
OnNext(); break;
case WXK_PRIOR:
OnPrevious(); break;
case WXK_HOME:
OnFirst(); break;
case WXK_END:
OnLast(); break;
case WXK_TAB:
OnGoto(); break;
default:
event.Skip();
}
}
void wxPreviewControlBar::OnNext(void)
{
wxPrintPreviewBase *preview = GetPrintPreview();
@@ -384,12 +397,12 @@ void wxPreviewControlBar::OnGoto(void)
wxString strPrompt;
wxString strPage;
strPrompt.Printf( wxT("%d...%d"),
strPrompt.Printf( _("Enter a page number between %d and %d:"),
preview->GetMinPage(), preview->GetMaxPage());
strPage.Printf( wxT("%d"), preview->GetCurrentPage() );
strPage =
wxGetTextFromUser( strPrompt, _("Goto Page"), strPage);
wxGetTextFromUser( strPrompt, _("Goto Page"), strPage, GetParent());
if ( strPage.ToLong( &currentPage ) )
if (preview->GetPrintout()->HasPage(currentPage))
@@ -571,6 +584,10 @@ void wxPreviewFrame::Initialize()
#endif
Layout();
m_printPreview->AdjustScrollbars(m_previewCanvas);
m_previewCanvas->SetFocus();
m_controlBar->SetFocus();
}
void wxPreviewFrame::CreateCanvas()
@@ -632,13 +649,8 @@ void wxPrintPreviewBase::Init(wxPrintout *printout,
m_pageWidth = 0;
m_pageHeight = 0;
m_printingPrepared = FALSE;
// Too soon! Moved to RenderPage.
// printout->OnPreparePrinting();
// Get some parameters from the printout, if defined
int selFrom, selTo;
printout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo);
m_minPage = 1;
m_maxPage = 1;
}
wxPrintPreviewBase::~wxPrintPreviewBase()
@@ -662,17 +674,20 @@ bool wxPrintPreviewBase::SetCurrentPage(int pageNum)
delete m_previewBitmap;
m_previewBitmap = NULL;
}
if (m_previewCanvas)
{
AdjustScrollbars(m_previewCanvas);
if (!RenderPage(pageNum))
return FALSE;
m_previewCanvas->Refresh();
m_previewCanvas->SetFocus();
}
return TRUE;
}
bool wxPrintPreviewBase::PaintPage(wxWindow *canvas, wxDC& dc)
bool wxPrintPreviewBase::PaintPage(wxPreviewCanvas *canvas, wxDC& dc)
{
DrawBlankPage(canvas, dc);
@@ -708,6 +723,29 @@ bool wxPrintPreviewBase::PaintPage(wxWindow *canvas, wxDC& dc)
return TRUE;
}
// Adjusts the scrollbars for the current scale
void wxPrintPreviewBase::AdjustScrollbars(wxPreviewCanvas *canvas)
{
if (!canvas)
return ;
int canvasWidth, canvasHeight;
canvas->GetSize(&canvasWidth, &canvasHeight);
double zoomScale = ((float)m_currentZoom/(float)100);
double actualWidth = (zoomScale*m_pageWidth*m_previewScale);
double actualHeight = (zoomScale*m_pageHeight*m_previewScale);
// Set the scrollbars appropriately
int totalWidth = actualWidth + 2*m_leftMargin;
int totalHeight = actualHeight + 2*m_topMargin;
int scrollUnitsX = totalWidth/10;
int scrollUnitsY = totalHeight/10;
wxSize virtualSize = canvas->GetVirtualSize();
if (virtualSize.GetWidth() != totalWidth || virtualSize.GetHeight() != totalHeight)
canvas->SetScrollbars(10, 10, scrollUnitsX, scrollUnitsY, 0, 0, TRUE);
}
bool wxPrintPreviewBase::RenderPage(int pageNum)
{
wxBusyCursor busy;
@@ -758,6 +796,8 @@ bool wxPrintPreviewBase::RenderPage(int pageNum)
if (!m_printingPrepared)
{
m_previewPrintout->OnPreparePrinting();
int selFrom, selTo;
m_previewPrintout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo);
m_printingPrepared = TRUE;
}
@@ -797,7 +837,7 @@ bool wxPrintPreviewBase::RenderPage(int pageNum)
}
bool wxPrintPreviewBase::DrawBlankPage(wxWindow *canvas, wxDC& dc)
bool wxPrintPreviewBase::DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc)
{
int canvasWidth, canvasHeight;
canvas->GetSize(&canvasWidth, &canvasHeight);
@@ -851,10 +891,12 @@ void wxPrintPreviewBase::SetZoom(int percent)
if (m_previewCanvas)
{
AdjustScrollbars(m_previewCanvas);
RenderPage(m_currentPage);
((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0);
m_previewCanvas->Clear();
m_previewCanvas->Refresh();
m_previewCanvas->SetFocus();
}
}