X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/76c4b1491e547b8f922b3bd74933c82e95ee6f38..12bb29f5432174ecbd65549bda832d70d34a98ae:/src/msw/progdlg.cpp diff --git a/src/msw/progdlg.cpp b/src/msw/progdlg.cpp index 4bceee31c7..50c3f5b974 100644 --- a/src/msw/progdlg.cpp +++ b/src/msw/progdlg.cpp @@ -25,8 +25,16 @@ #if wxUSE_PROGRESSDLG && wxUSE_THREADS -#include "wx/msw/private/msgdlg.h" #include "wx/progdlg.h" + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/msgdlg.h" + #include "wx/stopwatch.h" + #include "wx/msw/private.h" +#endif + +#include "wx/msw/private/msgdlg.h" #include "wx/evtloop.h" using namespace wxMSWMessageDialog; @@ -73,10 +81,12 @@ public: m_progressBarMarquee = false; m_skipped = false; m_notifications = 0; + m_parent = NULL; } wxCriticalSection m_cs; + wxWindow *m_parent; // Parent window only used to center us over it. HWND m_hwnd; // Task dialog handler long m_style; // wxProgressDialog style int m_value; @@ -160,7 +170,7 @@ BOOL CALLBACK DisplayCloseButton(HWND hwnd, LPARAM lParam) { sharedData->m_labelCancel = _("Close"); SendMessage( hwnd, WM_SETTEXT, 0, - (LPARAM) sharedData->m_labelCancel.wx_str() ); + wxMSW_CONV_LPARAM(sharedData->m_labelCancel) ); return FALSE; } @@ -202,7 +212,7 @@ void PerformNotificationUpdates(HWND hwnd, } if ( sharedData->m_notifications & wxSPDD_TITLE_CHANGED ) - ::SetWindowText( hwnd, sharedData->m_title.wx_str() ); + ::SetWindowText( hwnd, sharedData->m_title.t_str() ); if ( sharedData->m_notifications & wxSPDD_MESSAGE_CHANGED ) { @@ -226,16 +236,21 @@ void PerformNotificationUpdates(HWND hwnd, body.assign(title, posNL + numNLs, wxString::npos); title.erase(posNL); } + else // A single line + { + // Don't use title without the body, this doesn't make sense. + title.swap(body); + } ::SendMessage( hwnd, TDM_SET_ELEMENT_TEXT, TDE_MAIN_INSTRUCTION, - (LPARAM) title.wx_str() ); + wxMSW_CONV_LPARAM(title) ); ::SendMessage( hwnd, TDM_SET_ELEMENT_TEXT, TDE_CONTENT, - (LPARAM) body.wx_str() ); + wxMSW_CONV_LPARAM(body) ); } if ( sharedData->m_notifications & wxSPDD_EXPINFO_CHANGED ) @@ -247,7 +262,7 @@ void PerformNotificationUpdates(HWND hwnd, ::SendMessage( hwnd, TDM_SET_ELEMENT_TEXT, TDE_EXPANDED_INFORMATION, - (LPARAM) expandedInformation.wx_str() ); + wxMSW_CONV_LPARAM(expandedInformation) ); } } @@ -292,7 +307,7 @@ wxProgressDialog::wxProgressDialog( const wxString& title, int maximum, wxWindow *parent, int style ) - : wxGenericProgressDialog(parent, style), + : wxGenericProgressDialog(), m_taskDialogRunner(NULL), m_sharedData(NULL), m_message(message), @@ -301,6 +316,8 @@ wxProgressDialog::wxProgressDialog( const wxString& title, #ifdef wxHAS_MSW_TASKDIALOG if ( HasNativeTaskDialog() ) { + SetTopParent(parent); + SetPDStyle(style); SetMaximum(maximum); Show(); @@ -508,6 +525,23 @@ void wxProgressDialog::Resume() #endif // wxHAS_MSW_TASKDIALOG } +WXWidget wxProgressDialog::GetHandle() const +{ +#ifdef wxHAS_MSW_TASKDIALOG + if ( HasNativeTaskDialog() ) + { + HWND hwnd; + { + wxCriticalSectionLocker locker(m_sharedData->m_cs); + m_sharedData->m_state = m_state; + hwnd = m_sharedData->m_hwnd; + } + return hwnd; + } +#endif + return wxGenericProgressDialog::GetHandle(); +} + int wxProgressDialog::GetValue() const { #ifdef wxHAS_MSW_TASKDIALOG @@ -632,6 +666,7 @@ bool wxProgressDialog::Show(bool show) m_sharedData->m_range = m_maximum; m_sharedData->m_state = Uncancelable; m_sharedData->m_style = GetPDStyle(); + m_sharedData->m_parent = GetTopParent(); if ( HasPDFlag(wxPD_CAN_ABORT) ) { @@ -750,6 +785,11 @@ void* wxProgressDialogTaskRunner::Entry() wxTdc.caption = m_sharedData.m_title.wx_str(); wxTdc.message = m_sharedData.m_message.wx_str(); + // MSWCommonTaskDialogInit() will add an IDCANCEL button but we need to + // give it the correct label. + wxTdc.btnOKLabel = m_sharedData.m_labelCancel; + wxTdc.useCustomLabels = true; + wxTdc.MSWCommonTaskDialogInit( tdc ); tdc.pfCallback = TaskDialogCallbackProc; tdc.lpCallbackData = (LONG_PTR) &m_sharedData; @@ -758,22 +798,15 @@ void* wxProgressDialogTaskRunner::Entry() tdc.dwFlags &= ~TDF_EXPAND_FOOTER_AREA; // Expand in content area. tdc.dwCommonButtons = 0; // Don't use common buttons. - wxTdc.useCustomLabels = true; - if ( m_sharedData.m_style & wxPD_CAN_SKIP ) wxTdc.AddTaskDialogButton( tdc, Id_SkipBtn, 0, _("Skip") ); - // Use a Cancel button when requested or use a Close button when - // the dialog does not automatically hide. - wxTdc.AddTaskDialogButton( tdc, IDCANCEL, 0, - m_sharedData.m_labelCancel ); - tdc.dwFlags |= TDF_CALLBACK_TIMER | TDF_SHOW_PROGRESS_BAR; if ( !m_sharedData.m_expandedInformation.empty() ) { tdc.pszExpandedInformation = - m_sharedData.m_expandedInformation.wx_str(); + m_sharedData.m_expandedInformation.t_str(); } } @@ -821,6 +854,27 @@ wxProgressDialogTaskRunner::TaskDialogCallbackProc 0, MAKELPARAM(0, sharedData->m_range) ); + // We always create this task dialog with NULL parent because our + // parent in wx sense is a window created from a different thread + // and so can't be used as our real parent. However we still center + // this window on the parent one as the task dialogs do with their + // real parent usually. + if ( sharedData->m_parent ) + { + wxRect rect(wxRectFromRECT(wxGetWindowRect(hwnd))); + rect = rect.CentreIn(sharedData->m_parent->GetRect()); + ::SetWindowPos(hwnd, + NULL, + rect.x, + rect.y, + -1, + -1, + SWP_NOACTIVATE | + SWP_NOOWNERZORDER | + SWP_NOSIZE | + SWP_NOZORDER); + } + // If we can't be aborted, the "Close" button will only be enabled // when the progress ends (and not even then with wxPD_AUTO_HIDE). if ( !(sharedData->m_style & wxPD_CAN_ABORT) )