]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/prntbase.cpp
Ensure that message boxes with only "OK" can be closed with Escape in wxMSW.
[wxWidgets.git] / src / common / prntbase.cpp
index 2f08e2d5c3fba604aee7738e7ff0ce6e3d800ce5..c9e587b700ff91fd410bcd5701169b621e6ee896 100644 (file)
@@ -999,38 +999,90 @@ void wxPreviewCanvas::OnMouseWheel(wxMouseEvent& event)
 
 #endif // wxUSE_MOUSEWHEEL
 
 
 #endif // wxUSE_MOUSEWHEEL
 
+namespace
+{
+
+// This is by the controls in the print preview as the maximal (and hence
+// longest) page number we may have to display.
+enum { MAX_PAGE_NUMBER = 99999 };
+
+} // anonymous namespace
+
+// ----------------------------------------------------------------------------
+// wxPrintPageMaxCtrl
+// ----------------------------------------------------------------------------
+
+// A simple static control showing the maximal number of pages.
+class wxPrintPageMaxCtrl : public wxStaticText
+{
+public:
+    wxPrintPageMaxCtrl(wxWindow *parent)
+        : wxStaticText(
+                        parent,
+                        wxID_ANY,
+                        wxString(),
+                        wxDefaultPosition,
+                        wxSize
+                        (
+                         parent->GetTextExtent(MaxAsString(MAX_PAGE_NUMBER)).x,
+                         wxDefaultCoord
+                        ),
+                        wxST_NO_AUTORESIZE | wxALIGN_CENTRE
+                      )
+    {
+    }
+
+    // Set the maximal page to display once we really know what it is.
+    void SetMaxPage(int maxPage)
+    {
+        SetLabel(MaxAsString(maxPage));
+    }
+
+private:
+    static wxString MaxAsString(int maxPage)
+    {
+        return wxString::Format("/ %d", maxPage);
+    }
+
+    wxDECLARE_NO_COPY_CLASS(wxPrintPageMaxCtrl);
+};
+
 // ----------------------------------------------------------------------------
 // wxPrintPageTextCtrl
 // ----------------------------------------------------------------------------
 
 // ----------------------------------------------------------------------------
 // wxPrintPageTextCtrl
 // ----------------------------------------------------------------------------
 
-// This text control contains the page number in the interval specified during
-// its construction. Invalid pages are not accepted and the control contents is
-// validated when it loses focus. Conversely, if the user changes the page to
-// another valid one or presses Enter, OnGotoPage() method of the preview object
-// will be called.
+// This text control contains the page number in the specified interval.
+//
+// Invalid pages are not accepted and the control contents is validated when it
+// loses focus. Conversely, if the user changes the page to another valid one
+// or presses Enter, OnGotoPage() method of the preview object will be called.
 class wxPrintPageTextCtrl : public wxTextCtrl
 {
 public:
 class wxPrintPageTextCtrl : public wxTextCtrl
 {
 public:
-    wxPrintPageTextCtrl(wxPreviewControlBar *preview, int minPage, int maxPage)
+    wxPrintPageTextCtrl(wxPreviewControlBar *preview)
         : wxTextCtrl(preview,
                      wxID_PREVIEW_GOTO,
         : wxTextCtrl(preview,
                      wxID_PREVIEW_GOTO,
-                     PageAsString(minPage),
+                     wxString(),
                      wxDefaultPosition,
                      wxDefaultPosition,
-                     // We use hardcoded 99999 for the width instead of fitting
-                     // it to the values we can show because the control looks
-                     // uncomfortably narrow if the real page number is just
-                     // one or two digits.
-                     wxSize(preview->GetTextExtent("99999").x, wxDefaultCoord),
+                     // We use hardcoded maximal page number for the width
+                     // instead of fitting it to the values we can show because
+                     // the control looks uncomfortably narrow if the real page
+                     // number is just one or two digits.
+                     wxSize
+                     (
+                      preview->GetTextExtent(PageAsString(MAX_PAGE_NUMBER)).x,
+                      wxDefaultCoord
+                     ),
                      wxTE_PROCESS_ENTER
 #if wxUSE_VALIDATORS
                      , wxTextValidator(wxFILTER_DIGITS)
 #endif // wxUSE_VALIDATORS
                     ),
                      wxTE_PROCESS_ENTER
 #if wxUSE_VALIDATORS
                      , wxTextValidator(wxFILTER_DIGITS)
 #endif // wxUSE_VALIDATORS
                     ),
-          m_preview(preview),
-          m_minPage(minPage),
-          m_maxPage(maxPage)
+          m_preview(preview)
     {
     {
-        m_page = minPage;
+        m_minPage =
+        m_maxPage =
+        m_page = 1;
 
         Connect(wxEVT_KILL_FOCUS,
                 wxFocusEventHandler(wxPrintPageTextCtrl::OnKillFocus));
 
         Connect(wxEVT_KILL_FOCUS,
                 wxFocusEventHandler(wxPrintPageTextCtrl::OnKillFocus));
@@ -1038,6 +1090,17 @@ public:
                 wxCommandEventHandler(wxPrintPageTextCtrl::OnTextEnter));
     }
 
                 wxCommandEventHandler(wxPrintPageTextCtrl::OnTextEnter));
     }
 
+    // Update the pages range, must be called after OnPreparePrinting() as
+    // these values are not known before.
+    void SetPageInfo(int minPage, int maxPage)
+    {
+        m_minPage = minPage;
+        m_maxPage = maxPage;
+
+        // Show the first page by default.
+        SetPageNumber(minPage);
+    }
+
     // Helpers to conveniently set or get the current page number. Return value
     // is 0 if the current controls contents is invalid.
     void SetPageNumber(int page)
     // Helpers to conveniently set or get the current page number. Return value
     // is 0 if the current controls contents is invalid.
     void SetPageNumber(int page)
@@ -1108,8 +1171,8 @@ private:
 
     wxPreviewControlBar * const m_preview;
 
 
     wxPreviewControlBar * const m_preview;
 
-    const int m_minPage,
-              m_maxPage;
+    int m_minPage,
+        m_maxPage;
 
     // This is the last valid page value that we had, we revert to it if an
     // invalid page is entered.
 
     // This is the last valid page value that we had, we revert to it if an
     // invalid page is entered.
@@ -1155,6 +1218,7 @@ wxPanel(parent, wxID_ANY, pos, size, style, name)
     m_closeButton = NULL;
     m_zoomControl = NULL;
     m_currentPageText = NULL;
     m_closeButton = NULL;
     m_zoomControl = NULL;
     m_currentPageText = NULL;
+    m_maxPageText = NULL;
     m_buttonFlags = buttons;
 }
 
     m_buttonFlags = buttons;
 }
 
@@ -1436,18 +1500,11 @@ void wxPreviewControlBar::CreateButtons()
 
     if (m_buttonFlags & wxPREVIEW_GOTO)
     {
 
     if (m_buttonFlags & wxPREVIEW_GOTO)
     {
-        int minPage, maxPage, pageFrom, pageTo;
-        m_printPreview->GetPrintout()->GetPageInfo(&minPage, &maxPage,
-                                                   &pageFrom, &pageTo);
-
-        m_currentPageText = new wxPrintPageTextCtrl(this, minPage, maxPage);
+        m_currentPageText = new wxPrintPageTextCtrl(this);
         sizer.Add(m_currentPageText);
 
         sizer.Add(m_currentPageText);
 
-        wxStaticText *
-            maxPageText = new wxStaticText(this, wxID_ANY,
-                                           wxString::Format("/ %d", maxPage));
-
-        sizer.Add(maxPageText);
+        m_maxPageText = new wxPrintPageMaxCtrl(this);
+        sizer.Add(m_maxPageText);
     }
 
     if (m_buttonFlags & wxPREVIEW_NEXT)
     }
 
     if (m_buttonFlags & wxPREVIEW_NEXT)
@@ -1489,6 +1546,15 @@ void wxPreviewControlBar::CreateButtons()
     sizer.AddAtEnd(m_closeButton);
 }
 
     sizer.AddAtEnd(m_closeButton);
 }
 
+void wxPreviewControlBar::SetPageInfo(int minPage, int maxPage)
+{
+    if ( m_currentPageText )
+        m_currentPageText->SetPageInfo(minPage, maxPage);
+
+    if ( m_maxPageText )
+        m_maxPageText->SetMaxPage(maxPage);
+}
+
 void wxPreviewControlBar::SetZoomControl(int zoom)
 {
     if (m_zoomControl)
 void wxPreviewControlBar::SetZoomControl(int zoom)
 {
     if (m_zoomControl)
@@ -1553,6 +1619,7 @@ wxFrame(parent, wxID_ANY, title, pos, size, style, name)
     m_controlBar = NULL;
     m_previewCanvas = NULL;
     m_windowDisabler = NULL;
     m_controlBar = NULL;
     m_previewCanvas = NULL;
     m_windowDisabler = NULL;
+    m_modalityKind = wxPreviewFrame_NonModal;
 
     // Give the application icon
 #ifdef __WXMSW__
 
     // Give the application icon
 #ifdef __WXMSW__
@@ -1564,14 +1631,6 @@ wxFrame(parent, wxID_ANY, title, pos, size, style, name)
 
 wxPreviewFrame::~wxPreviewFrame()
 {
 
 wxPreviewFrame::~wxPreviewFrame()
 {
-}
-
-void wxPreviewFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
-{
-    if (m_windowDisabler)
-        delete m_windowDisabler;
-
-    // Need to delete the printout and the print preview
     wxPrintout *printout = m_printPreview->GetPrintout();
     if (printout)
     {
     wxPrintout *printout = m_printPreview->GetPrintout();
     if (printout)
     {
@@ -1582,12 +1641,33 @@ void wxPreviewFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
     }
 
     m_previewCanvas->SetPreview(NULL);
     }
 
     m_previewCanvas->SetPreview(NULL);
-    wxDELETE(m_printPreview);
+    delete m_printPreview;
+}
+
+void wxPreviewFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
+{
+    // Reenable any windows we disabled by undoing whatever we did in our
+    // Initialize().
+    switch ( m_modalityKind )
+    {
+        case wxPreviewFrame_AppModal:
+            delete m_windowDisabler;
+            m_windowDisabler = NULL;
+            break;
+
+        case wxPreviewFrame_WindowModal:
+            if ( GetParent() )
+                GetParent()->Enable();
+            break;
+
+        case wxPreviewFrame_NonModal:
+            break;
+    }
 
     Destroy();
 }
 
 
     Destroy();
 }
 
-void wxPreviewFrame::Initialize()
+void wxPreviewFrame::Initialize(wxPreviewFrameModalityKind kind)
 {
 #if wxUSE_STATUSBAR
     CreateStatusBar();
 {
 #if wxUSE_STATUSBAR
     CreateStatusBar();
@@ -1606,7 +1686,25 @@ void wxPreviewFrame::Initialize()
     SetAutoLayout( true );
     SetSizer( item0 );
 
     SetAutoLayout( true );
     SetSizer( item0 );
 
-    m_windowDisabler = new wxWindowDisabler(this);
+    m_modalityKind = kind;
+    switch ( m_modalityKind )
+    {
+        case wxPreviewFrame_AppModal:
+            // Disable everything.
+            m_windowDisabler = new wxWindowDisabler( this );
+            break;
+
+        case wxPreviewFrame_WindowModal:
+            // Disable our parent if we have one.
+            if ( GetParent() )
+                GetParent()->Disable();
+            break;
+
+        case wxPreviewFrame_NonModal:
+            // Nothing to do, we don't need to disable any windows.
+            break;
+    }
+
 
     Layout();
 
 
     Layout();
 
@@ -1829,13 +1927,23 @@ bool wxPrintPreviewBase::RenderPageIntoDC(wxDC& dc, int pageNum)
     m_previewPrintout->SetPageSizePixels(m_pageWidth, m_pageHeight);
 
     // Need to delay OnPreparePrinting() until here, so we have enough
     m_previewPrintout->SetPageSizePixels(m_pageWidth, m_pageHeight);
 
     // Need to delay OnPreparePrinting() until here, so we have enough
-    // information.
+    // information and a wxDC.
     if (!m_printingPrepared)
     {
     if (!m_printingPrepared)
     {
+        m_printingPrepared = true;
+
         m_previewPrintout->OnPreparePrinting();
         int selFrom, selTo;
         m_previewPrintout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo);
         m_previewPrintout->OnPreparePrinting();
         int selFrom, selTo;
         m_previewPrintout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo);
-        m_printingPrepared = true;
+
+        // Update the wxPreviewControlBar page range display.
+        if ( m_previewFrame )
+        {
+            wxPreviewControlBar * const
+                controlBar = ((wxPreviewFrame*)m_previewFrame)->GetControlBar();
+            if ( controlBar )
+                controlBar->SetPageInfo(m_minPage, m_maxPage);
+        }
     }
 
     m_previewPrintout->OnBeginPrinting();
     }
 
     m_previewPrintout->OnBeginPrinting();