#pragma region CPL License
/*
Nuclex Native Framework
Copyright (C) 2002-2023 Nuclex Development Labs
This library is free software; you can redistribute it and/or
modify it under the terms of the IBM Common Public License as
published by the IBM Corporation; either version 1.0 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
IBM Common Public License for more details.
You should have received a copy of the IBM Common Public
License along with this library
*/
#pragma endregion // CPL License
// If the library is compiled as a DLL, this ensures symbols are exported
#define NUCLEX_PLATFORM_SOURCE 1
#include "Nuclex/Platform/Interaction/GuiMessageService.h"
#if defined(NUCLEX_PLATFORM_WINDOWS)
#include "Nuclex/Platform/Interaction/ActiveWindowTracker.h"
#include "../Platform/WindowsMessageBoxApi.h"
namespace {
// ------------------------------------------------------------------------------------------- //
/// Retrieves the handle of the currently active top-level window
///
/// Window tracker that (may be null) that knows the current top-level window
///
/// The window handle of the current top-level window or NULL
::HWND getActiveTopLevelWindow(
const std::shared_ptr &activeWindowTracker
) {
if(static_cast(activeWindowTracker)) {
std::any windowHandleAsAny = activeWindowTracker->GetActiveWindow();
if(windowHandleAsAny.has_value()) {
return std::any_cast<::HWND>(windowHandleAsAny);
}
}
return static_cast<::HWND>(nullptr);
}
// ------------------------------------------------------------------------------------------- //
} // anonymous namespace
namespace Nuclex { namespace Platform { namespace Interaction {
// ------------------------------------------------------------------------------------------- //
struct GuiMessageService::PrivateImplementationData {};
// ------------------------------------------------------------------------------------------- //
}}} // namespace Nuclex::Platform::Interaction
namespace Nuclex { namespace Platform { namespace Interaction {
// ------------------------------------------------------------------------------------------- //
GuiMessageService::GuiMessageService(
const std::shared_ptr &activeWindowTracker /* = (
std::shared_ptr()
) */
) :
activeWindowTracker(activeWindowTracker) {}
// ------------------------------------------------------------------------------------------- //
GuiMessageService::~GuiMessageService() {}
// ------------------------------------------------------------------------------------------- //
void GuiMessageService::Inform(
const std::string &topic, const std::string &, const std::string &message
) {
::HWND activeWindowHandle = getActiveTopLevelWindow(this->activeWindowTracker);
Platform::WindowsMessageBoxApi::ShowMessageBox(
activeWindowHandle,
topic,
message,
(
(activeWindowHandle == static_cast<::HWND>(nullptr)) ?
(MB_ICONINFORMATION | MB_OK | MB_TASKMODAL) :
(MB_ICONINFORMATION | MB_OK | MB_APPLMODAL)
)
);
}
// ------------------------------------------------------------------------------------------- //
void GuiMessageService::Warn(
const std::string &topic, const std::string &, const std::string &message
) {
::HWND activeWindowHandle = getActiveTopLevelWindow(this->activeWindowTracker);
Platform::WindowsMessageBoxApi::ShowMessageBox(
activeWindowHandle,
topic,
message,
(
(activeWindowHandle == static_cast<::HWND>(nullptr)) ?
(MB_ICONWARNING | MB_OK | MB_TASKMODAL) :
(MB_ICONWARNING | MB_OK | MB_APPLMODAL)
)
);
}
// ------------------------------------------------------------------------------------------- //
void GuiMessageService::Complain(
const std::string &topic, const std::string &, const std::string &message
) {
::HWND activeWindowHandle = getActiveTopLevelWindow(this->activeWindowTracker);
Platform::WindowsMessageBoxApi::ShowMessageBox(
activeWindowHandle,
topic,
message,
(
(activeWindowHandle == static_cast<::HWND>(nullptr)) ?
(MB_ICONERROR | MB_OK | MB_TASKMODAL) :
(MB_ICONERROR | MB_OK | MB_APPLMODAL)
)
);
}
// ------------------------------------------------------------------------------------------- //
bool GuiMessageService::AskYesNo(
const std::string &topic, const std::string &, const std::string &message
) {
::HWND activeWindowHandle = getActiveTopLevelWindow(this->activeWindowTracker);
int choice = Platform::WindowsMessageBoxApi::ShowMessageBox(
activeWindowHandle,
topic,
message,
(
(activeWindowHandle == static_cast<::HWND>(nullptr)) ?
(MB_ICONQUESTION | MB_YESNO | MB_TASKMODAL) :
(MB_ICONQUESTION | MB_YESNO | MB_APPLMODAL)
)
);
if((choice == IDNO) || (choice == IDCANCEL) || (choice == IDABORT)) {
return false;
} else {
return true;
}
}
// ------------------------------------------------------------------------------------------- //
bool GuiMessageService::AskOkCancel(
const std::string &topic, const std::string &, const std::string &message
) {
::HWND activeWindowHandle = getActiveTopLevelWindow(this->activeWindowTracker);
int choice = Platform::WindowsMessageBoxApi::ShowMessageBox(
activeWindowHandle,
topic,
message,
(
(activeWindowHandle == static_cast<::HWND>(nullptr)) ?
(MB_ICONQUESTION | MB_OKCANCEL | MB_TASKMODAL) :
(MB_ICONQUESTION | MB_OKCANCEL | MB_APPLMODAL)
)
);
if((choice == IDNO) || (choice == IDCANCEL) || (choice == IDABORT)) {
return false;
} else {
return true;
}
}
// ------------------------------------------------------------------------------------------- //
std::optional GuiMessageService::AskYesNoCancel(
const std::string &topic, const std::string &, const std::string &message
) {
::HWND activeWindowHandle = getActiveTopLevelWindow(this->activeWindowTracker);
int choice = Platform::WindowsMessageBoxApi::ShowMessageBox(
activeWindowHandle,
topic,
message,
(
(activeWindowHandle == static_cast<::HWND>(nullptr)) ?
(MB_ICONQUESTION | MB_YESNOCANCEL | MB_TASKMODAL) :
(MB_ICONQUESTION | MB_YESNOCANCEL | MB_APPLMODAL)
)
);
if(choice == IDNO) {
return false;
} else if((choice == IDCANCEL) || (choice == IDABORT)) {
return std::optional();
} else {
return true;
}
}
// ------------------------------------------------------------------------------------------- //
}}} // namespace Nuclex::Platform::Interaction
#endif // defined(NUCLEX_PLATFORM_WINDOWS)