#include "wx/frame.h"
#include "wx/app.h"
#include "wx/settings.h"
+#include "wx/intl.h"
+#include "wx/log.h"
#endif
#include "wx/msw/private.h"
wxWindowList wxModelessWindows; // Frames and modeless dialogs
extern wxList WXDLLEXPORT wxPendingDelete;
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel)
BEGIN_EVENT_TABLE(wxDialog, wxPanel)
EVT_SYS_COLOUR_CHANGED(wxDialog::OnSysColourChanged)
EVT_CLOSE(wxDialog::OnCloseWindow)
END_EVENT_TABLE()
-#endif
wxDialog::wxDialog()
{
// Allows creation of dialogs with & without captions under MSWindows,
// resizeable or not (but a resizeable dialog always has caption -
// otherwise it would look too strange)
- const char *dlg;
- if ( style & wxTHICK_FRAME )
- dlg = "wxResizeableDialog";
+ const wxChar *dlg;
+ if ( style & wxRESIZE_BORDER )
+ dlg = wxT("wxResizeableDialog");
else if ( style & wxCAPTION )
- dlg = "wxCaptionDialog";
+ dlg = wxT("wxCaptionDialog");
else
- dlg = "wxNoCaptionDialog";
+ dlg = wxT("wxNoCaptionDialog");
MSWCreate(m_windowId, parent, NULL, this, NULL,
x, y, width, height,
0, // style is not used if we have dlg template
wxTopLevelWindows.DeleteObject(this);
+ Show(FALSE);
+
if (m_modalShowing)
{
- Show(FALSE);
// For some reason, wxWindows can activate another task altogether
// when a frame is destroyed after a modal dialog has been invoked.
// Try to bring the parent to the top.
}
m_modalShowing = FALSE;
- if ( GetHWND() )
- ShowWindow((HWND) GetHWND(), SW_HIDE);
if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL )
wxModelessWindows.DeleteObject(this);
- UnsubclassWin();
-
// If this is the last top-level window, exit.
if (wxTheApp && (wxTopLevelWindows.Number() == 0))
{
cancelEvent.SetEventObject( this );
GetEventHandler()->ProcessEvent(cancelEvent);
+ // ensure that there is another message for this window so the
+ // ShowModal loop will exit and won't get stuck in GetMessage().
+ ::PostMessage(GetHwnd(), WM_NULL, 0, 0);
return;
}
}
return m_isShown;
}
+bool wxDialog::IsModal() const
+{
+ return wxModalDialogs.Find((wxDialog *)this) != 0; // const_cast
+}
+
bool wxDialog::Show(bool show)
{
m_isShown = show;
{
if (show)
{
- m_hwndOldFocus = (WXHWND)::GetFocus();
+ // find the top level window which had focus before - we will restore
+ // focus to it later
+ m_hwndOldFocus = 0;
+ for ( HWND hwnd = ::GetFocus(); hwnd; hwnd = ::GetParent(hwnd) )
+ {
+ m_hwndOldFocus = (WXHWND)hwnd;
+ }
if (m_modalShowing)
{
if (hWndParent)
::BringWindowToTop(hWndParent);
}
- ShowWindow((HWND) GetHWND(), SW_HIDE);
+
+ if ( m_hWnd )
+ ShowWindow((HWND) GetHWND(), SW_HIDE);
}
}
return TRUE;
void wxDialog::SetTitle(const wxString& title)
{
- SetWindowText((HWND) GetHWND(), (const char *)title);
+ SetWindowText((HWND) GetHWND(), title.c_str());
}
wxString wxDialog::GetTitle() const
Refresh();
#endif
}
+
+// ---------------------------------------------------------------------------
+// dialog window proc
+// ---------------------------------------------------------------------------
+
+long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+{
+ long rc = 0;
+ bool processed = FALSE;
+
+ switch ( message )
+ {
+ case WM_CLOSE:
+ // if we can't close, tell the system that we processed the
+ // message - otherwise it would close us
+ processed = !Close();
+ break;
+ }
+
+ if ( !processed )
+ rc = wxWindow::MSWWindowProc(message, wParam, lParam);
+
+ return rc;
+}