#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"
// Lists to keep track of windows, so we can disable/enable them
// for modal dialogs
-wxList wxModalDialogs;
-wxList wxModelessWindows; // Frames and modeless dialogs
+wxWindowList wxModalDialogs;
+wxWindowList wxModelessWindows; // Frames and modeless dialogs
extern wxList WXDLLEXPORT wxPendingDelete;
#if !USE_SHARED_LIBRARY
END_EVENT_TABLE()
#endif
-bool wxDialog::MSWProcessMessage(WXMSG* pMsg)
-{
- return (::IsDialogMessage((HWND) GetHWND(), (MSG*)pMsg) != 0);
-}
-
-bool wxDialog::MSWOnClose(void)
-{
- return Close();
-}
-
-wxDialog::wxDialog(void)
+wxDialog::wxDialog()
{
m_isShown = FALSE;
m_modalShowing = FALSE;
long style,
const wxString& name)
{
+#if wxUSE_TOOLTIPS
+ m_hwndToolTip = 0;
+#endif
+
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
SetName(name);
-
+
if (!parent)
wxTopLevelWindows.Append(this);
if (height < 0)
height = 500;
+ // All dialogs should really have this style
+ m_windowStyle |= wxTAB_TRAVERSAL;
+
WXDWORD extendedStyle = MakeExtendedStyle(m_windowStyle);
if (m_windowStyle & wxSTAY_ON_TOP)
extendedStyle |= WS_EX_TOPMOST;
// 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
if ( !hwnd )
{
- wxLogError(_("Failed to created dialog."));
+ wxLogError(_("Failed to create dialog."));
return FALSE;
}
SubclassWin(GetHWND());
-
+
SetWindowText(hwnd, title);
SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
else
if ( m_windowStyle & wxDIALOG_MODAL )
m_windowStyle -= wxDIALOG_MODAL ;
-
+
wxModelessWindows.DeleteObject(this);
if (!flag)
wxModelessWindows.Append(this);
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))
{
{
if (event.m_keyCode == WXK_ESCAPE)
{
- // Behaviour changed in 2.0: we'll send a Cancel message
- // to the dialog instead of Close.
- wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
- cancelEvent.SetEventObject( this );
- GetEventHandler()->ProcessEvent(cancelEvent);
+ // Behaviour changed in 2.0: we'll send a Cancel message
+ // to the dialog instead of Close.
+ wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
+ cancelEvent.SetEventObject( this );
+ GetEventHandler()->ProcessEvent(cancelEvent);
- return;
+ return;
}
}
// We didn't process this event.
// wxWindow::OnPaint(event);
}
-void wxDialog::Fit(void)
+void wxDialog::Fit()
{
wxWindow::Fit();
}
// Windows dialog boxes can't be iconized
}
-bool wxDialog::IsIconized(void) const
+bool wxDialog::IsIconized() const
{
return FALSE;
}
-void wxDialog::SetClientSize(int width, int height)
+void wxDialog::DoSetClientSize(int width, int height)
{
HWND hWnd = (HWND) GetHWND();
RECT rect;
- GetClientRect(hWnd, &rect);
+ ::GetClientRect(hWnd, &rect);
RECT rect2;
GetWindowRect(hWnd, &rect2);
*y = rect.top;
}
-bool wxDialog::IsShown(void) const
+bool wxDialog::IsShown() const
{
return m_isShown;
}
+bool wxDialog::IsModal() const
+{
+ return wxModalDialogs.Find((wxDialog *)this) != 0; // const_cast
+}
+
bool wxDialog::Show(bool show)
{
m_isShown = show;
#if WXGARBAGE_COLLECTION_ON /* MATTHEW: GC */
if (!modal) {
if (show) {
- if (!wxModelessWindows.Member(this))
- wxModelessWindows.Append(this);
+ if (!wxModelessWindows.Find(this))
+ wxModelessWindows.Append(this);
} else
wxModelessWindows.DeleteObject(this);
}
if (show) {
- if (!wxTopLevelWindows.Member(this))
+ if (!wxTopLevelWindows.Find(this))
wxTopLevelWindows.Append(this);
} else
wxTopLevelWindows.DeleteObject(this);
{
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)
{
BringWindowToTop((HWND) GetHWND());
return TRUE;
}
-
+
m_modalShowing = TRUE;
wxNode *node = wxModalDialogs.First();
while (node)
EnableWindow((HWND) GetHWND(), TRUE);
BringWindowToTop((HWND) GetHWND());
- if (!wxModalDialogs.Member(this))
+ if ( !wxModalDialogs.Find(this) )
wxModalDialogs.Append(this);
MSG msg;
// Must test whether this dialog still exists: we may not process
// a message before the deletion.
- while (wxModalDialogs.Member(this) && m_modalShowing && GetMessage(&msg, NULL, 0, 0))
+ while (wxModalDialogs.Find(this) && m_modalShowing && GetMessage(&msg, NULL, 0, 0))
{
- if (m_acceleratorTable.Ok() &&
- ::TranslateAccelerator((HWND) GetHWND(), (HACCEL) m_acceleratorTable.GetHACCEL(), &msg))
+ if ( m_acceleratorTable.Ok() &&
+ ::TranslateAccelerator((HWND)GetHWND(),
+ (HACCEL)m_acceleratorTable.GetHACCEL(),
+ &msg) )
{
// Have processed the message
}
- else if (!IsDialogMessage((HWND) GetHWND(), &msg))
+ else if ( !wxTheApp->ProcessMessage((WXMSG *)&msg) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
node=disabledWindows.First();
while(node) {
wxWindow* win = (wxWindow*) node->Data();
- if (wxModalDialogs.Member(win) || wxModelessWindows.Member(win))
+ if (wxModalDialogs.Find(win) || wxModelessWindows.Find(win))
{
HWND hWnd = (HWND) win->GetHWND();
if (::IsWindow(hWnd))
// enable it, else we enable all modeless windows
if (last)
{
+ // VZ: I don't understand what this is supposed to do, so I'll leave
+ // it out for now and look for horrible consequences
wxDialog *box = (wxDialog *)last->Data();
HWND hwnd = (HWND) box->GetHWND();
- if (box->m_winEnabled)
+#if 0
+ if (box->IsUserEnabled())
+#endif // 0
EnableWindow(hwnd, TRUE);
BringWindowToTop(hwnd);
}
wxWindow *win = (wxWindow *)node->Data();
HWND hwnd = (HWND) win->GetHWND();
// Only enable again if not user-disabled.
+#if 0
if (win->IsUserEnabled())
+#endif // 0
EnableWindow(hwnd, TRUE);
node = node->Next();
}
void wxDialog::SetTitle(const wxString& title)
{
- SetWindowText((HWND) GetHWND(), (const char *)title);
+ SetWindowText((HWND) GetHWND(), title.c_str());
}
-wxString wxDialog::GetTitle(void) const
+wxString wxDialog::GetTitle() const
{
GetWindowText((HWND) GetHWND(), wxBuffer, 1000);
return wxString(wxBuffer);
}
// Replacement for Show(TRUE) for modal dialogs - returns return code
-int wxDialog::ShowModal(void)
+int wxDialog::ShowModal()
{
m_windowStyle |= wxDIALOG_MODAL;
Show(TRUE);
else
{
SetReturnCode(wxID_CANCEL);
- this->Show(FALSE);
+ this->Show(FALSE);
}
}
// The default OnCancel (above) simply ends a modal dialog, and hides a modeless dialog.
static wxList closing;
-
+
if ( closing.Member(this) )
return;
-
+
closing.Append(this);
-
+
wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
cancelEvent.SetEventObject( this );
GetEventHandler()->ProcessEvent(cancelEvent); // This may close the dialog
}
// Destroy the window (delayed, if a managed window)
-bool wxDialog::Destroy(void)
+bool wxDialog::Destroy()
{
if (!wxPendingDelete.Member(this))
wxPendingDelete.Append(this);
{
// if we're using constraints - do use them
#if wxUSE_CONSTRAINTS
- if ( GetAutoLayout() ) {
+ if ( GetAutoLayout() )
+ {
Layout();
}
#endif
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
Refresh();
#endif
-}
\ No newline at end of file
+}
+
+// ---------------------------------------------------------------------------
+// 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;
+}