#include "wx/msw/private/button.h"
#include "wx/msw/private/metrics.h"
#include "wx/msw/private/msgdlg.h"
+#include "wx/modalhook.h"
#if wxUSE_MSGBOX_HOOK
#include "wx/fontutil.h"
#include "wx/msw/wince/missing.h"
#endif
+// Interestingly, this symbol currently seems to be absent from Platform SDK
+// headers but it is documented at MSDN.
+#ifndef TDF_SIZE_TO_CONTENT
+ #define TDF_SIZE_TO_CONTENT 0x1000000
+#endif
+
using namespace wxMSWMessageDialog;
IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
HWND hwndEdit = ::CreateWindow
(
wxT("EDIT"),
- wxTextBuffer::Translate(text).wx_str(),
+ wxTextBuffer::Translate(text).t_str(),
WS_CHILD | WS_VSCROLL | WS_VISIBLE |
ES_MULTILINE | ES_READONLY | ES_AUTOVSCROLL,
rc.left, rc.top,
if ( widthNeeded > wBtnNew )
wBtnNew = widthNeeded;
- ::SetWindowText(hwndBtn, label.wx_str());
+ ::SetWindowText(hwndBtn, label.t_str());
}
if ( wBtnNew <= wBtnOld )
#if wxUSE_INTL
// native message box always uses the current user locale but the program
// may be using a different one and in this case we need to manually
- // translate the button labels to avoid mismatch between the language of
- // the message box text and its buttons
+ // translate the default button labels (if they're non default we have no
+ // way to translate them and so we must assume they were already
+ // translated) to avoid mismatch between the language of the message box
+ // text and its buttons
wxLocale * const loc = wxGetLocale();
if ( loc && loc->GetLanguage() != wxLocale::GetSystemLanguage() )
{
- if ( m_dialogStyle & wxYES_NO )
+ if ( m_dialogStyle & wxYES_NO &&
+ (GetCustomYesLabel().empty() && GetCustomNoLabel().empty()) )
+
{
// use the strings with mnemonics here as the native message box
// does
// native message box (which probably doesn't use them because
// Enter/Esc keys can be already used to dismiss the message box
// using keyboard)
- SetOKCancelLabels(_("OK"), _("Cancel"));
+ if ( GetCustomOKLabel().empty() && GetCustomCancelLabel().empty() )
+ SetOKCancelLabels(_("OK"), _("Cancel"));
}
#endif // wxUSE_INTL
#endif // wxUSE_MSGBOX_HOOK
// do show the dialog
- int msAns = MessageBox(hWnd, message.wx_str(), m_caption.wx_str(), msStyle);
+ int msAns = MessageBox(hWnd, message.t_str(), m_caption.t_str(), msStyle);
return MSWTranslateReturnCode(msAns);
}
int wxMessageDialog::ShowModal()
{
+ WX_HOOK_MODAL_DIALOG();
+
#ifdef wxHAS_MSW_TASKDIALOG
if ( HasNativeTaskDialog() )
{
return ShowMessageBox();
}
+long wxMessageDialog::GetEffectiveIcon() const
+{
+ // only use the auth needed icon if available, otherwise fallback to the default logic
+ if ( (m_dialogStyle & wxICON_AUTH_NEEDED) &&
+ wxMSWMessageDialog::HasNativeTaskDialog() )
+ {
+ return wxICON_AUTH_NEEDED;
+ }
+
+ return wxMessageDialogBase::GetEffectiveIcon();
+}
+
void wxMessageDialog::DoCentre(int dir)
{
#ifdef wxHAS_MSW_TASKDIALOG
void wxMSWTaskDialogConfig::MSWCommonTaskDialogInit(TASKDIALOGCONFIG &tdc)
{
- tdc.dwFlags = TDF_EXPAND_FOOTER_AREA | TDF_POSITION_RELATIVE_TO_WINDOW;
+ // Use TDF_SIZE_TO_CONTENT to try to prevent Windows from truncating or
+ // ellipsizing the message text. This doesn't always work as Windows will
+ // still do it if the message contains too long "words" (i.e. runs of the
+ // text without spaces) but at least it ensures that the message text is
+ // fully shown for reasonably-sized words whereas without it using almost
+ // any file system path in a message box would result in truncation.
+ tdc.dwFlags = TDF_EXPAND_FOOTER_AREA |
+ TDF_POSITION_RELATIVE_TO_WINDOW |
+ TDF_SIZE_TO_CONTENT;
tdc.hInstance = wxGetInstance();
- tdc.pszWindowTitle = caption.wx_str();
+ tdc.pszWindowTitle = caption.t_str();
// use the top level window as parent if none specified
tdc.hwndParent = parent ? GetHwndOf(parent) : NULL;
// message in our ctor, see comment there.
if ( !extendedMessage.empty() )
{
- tdc.pszMainInstruction = message.wx_str();
- tdc.pszContent = extendedMessage.wx_str();
+ tdc.pszMainInstruction = message.t_str();
+ tdc.pszContent = extendedMessage.t_str();
}
else
{
- tdc.pszContent = message.wx_str();
+ tdc.pszContent = message.t_str();
}
// set an icon to be used, if possible
case wxICON_INFORMATION:
tdc.pszMainIcon = TD_INFORMATION_ICON;
break;
+
+ case wxICON_AUTH_NEEDED:
+ tdc.pszMainIcon = TD_SHIELD_ICON;
+ break;
}
// custom label button array that can hold all buttons in use
TASKDIALOG_BUTTON &tdBtn = buttons[tdc.cButtons];
tdBtn.nButtonID = btnCustomId;
- tdBtn.pszButtonText = customLabel.wx_str();
+ tdBtn.pszButtonText = customLabel.t_str();
tdc.cButtons++;
// We should never have more than 4 buttons currently as this is the