// Purpose: wxProgressDialog
// Author: Rickard Westerlund
// Created: 2010-07-22
-// RCS-ID: $Id$
// Copyright: (c) 2010 wxWidgets team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#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;
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;
{
sharedData->m_labelCancel = _("Close");
SendMessage( hwnd, WM_SETTEXT, 0,
- (LPARAM) sharedData->m_labelCancel.wx_str() );
+ wxMSW_CONV_LPARAM(sharedData->m_labelCancel) );
return FALSE;
}
}
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 )
{
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 )
::SendMessage( hwnd,
TDM_SET_ELEMENT_TEXT,
TDE_EXPANDED_INFORMATION,
- (LPARAM) expandedInformation.wx_str() );
+ wxMSW_CONV_LPARAM(expandedInformation) );
}
}
int maximum,
wxWindow *parent,
int style )
- : wxGenericProgressDialog(parent, style),
+ : wxGenericProgressDialog(),
m_taskDialogRunner(NULL),
m_sharedData(NULL),
m_message(message),
#ifdef wxHAS_MSW_TASKDIALOG
if ( HasNativeTaskDialog() )
{
+ SetTopParent(parent);
+ SetPDStyle(style);
SetMaximum(maximum);
Show();
#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
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) )
{
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;
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();
}
}
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) )