/////////////////////////////////////////////////////////////////////////////
// Name: dialog.cpp
// Purpose: wxDialog class
-// Author: AUTHOR
+// Author: David Webster
// Modified by:
-// Created: ??/??/98
+// Created: 10/14/99
// RCS-ID: $Id$
-// Copyright: (c) AUTHOR
-// Licence: wxWindows licence
+// Copyright: (c) David Webster
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation "dialog.h"
-#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+#ifndef WX_PRECOMP
#include "wx/dialog.h"
#include "wx/utils.h"
#include "wx/frame.h"
#include "wx/app.h"
#include "wx/settings.h"
+#include "wx/intl.h"
+#include "wx/log.h"
+#endif
+
+#include "wx/os2/private.h"
+#include "wx/log.h"
+
+#define wxDIALOG_DEFAULT_X 300
+#define wxDIALOG_DEFAULT_Y 300
// Lists to keep track of windows, so we can disable/enable them
// for modal dialogs
-wxList wxModalDialogs;
-wxList wxModelessWindows; // Frames and modeless dialogs
-extern wxList wxPendingDelete;
-
-#if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel)
-
-BEGIN_EVENT_TABLE(wxDialog, wxPanel)
- EVT_BUTTON(wxID_OK, wxDialog::OnOK)
- EVT_BUTTON(wxID_APPLY, wxDialog::OnApply)
- EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel)
- EVT_CHAR_HOOK(wxDialog::OnCharHook)
- EVT_SYS_COLOUR_CHANGED(wxDialog::OnSysColourChanged)
- EVT_CLOSE(wxDialog::OnCloseWindow)
-END_EVENT_TABLE()
-
-#endif
+wxWindowList wxModalDialogs;
+wxWindowList wxModelessWindows; // Frames and modeless dialogs
+extern wxList WXDLLEXPORT wxPendingDelete;
+
+ IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel)
+
+ BEGIN_EVENT_TABLE(wxDialog, wxPanel)
+ EVT_SIZE(wxDialog::OnSize)
+ EVT_BUTTON(wxID_OK, wxDialog::OnOK)
+ EVT_BUTTON(wxID_APPLY, wxDialog::OnApply)
+ EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel)
+ EVT_CHAR_HOOK(wxDialog::OnCharHook)
+ EVT_SYS_COLOUR_CHANGED(wxDialog::OnSysColourChanged)
+ EVT_CLOSE(wxDialog::OnCloseWindow)
+ END_EVENT_TABLE()
wxDialog::wxDialog()
{
+ m_isShown = FALSE;
+ m_modalShowing = FALSE;
+
SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
}
long style,
const wxString& name)
{
- m_windowStyle = style;
-
- SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
- SetName(name);
-
- if (!parent)
- wxTopLevelWindows.Append(this);
+#if wxUSE_TOOLTIPS
+ m_hwndToolTip = 0;
+#endif
- if (parent) parent->AddChild(this);
+ SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
+ SetName(name);
- if ( id == -1 )
- m_windowId = (int)NewControlId();
- else
- m_windowId = id;
+ if (!parent)
+ wxTopLevelWindows.Append(this);
- // TODO: create dialog
+ if (parent) parent->AddChild(this);
- return FALSE;
+ if ( id == -1 )
+ m_windowId = (int)NewControlId();
+ else
+ m_windowId = id;
+
+ int x = pos.x;
+ int y = pos.y;
+ int width = size.x;
+ int height = size.y;
+
+ if (x < 0) x = wxDIALOG_DEFAULT_X;
+ if (y < 0) y = wxDIALOG_DEFAULT_Y;
+
+ m_windowStyle = style;
+
+ m_isShown = FALSE;
+ m_modalShowing = FALSE;
+
+ if (width < 0)
+ width = 500;
+ if (height < 0)
+ height = 500;
+
+ // TODO: convert below to OS/2 PM code
+
+ // 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 wxChar *dlg;
+// if ( style & wxRESIZE_BORDER )
+// dlg = wxT("wxResizeableDialog");
+// else if ( style & wxCAPTION )
+// dlg = wxT("wxCaptionDialog");
+// else
+// dlg = wxT("wxNoCaptionDialog");
+// MSWCreate(m_windowId, parent, NULL, this, NULL,
+// x, y, width, height,
+// 0, // style is not used if we have dlg template
+// dlg,
+// extendedStyle);
+//
+// HWND hwnd = (HWND)GetHWND();
+//
+// if ( !hwnd )
+// {
+// wxLogError(wxT("Failed to create dialog."));
+//
+// return FALSE;
+// }
+//
+// SubclassWin(GetHWND());
+//
+// SetWindowText(hwnd, title);
+// SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
+//
+ return TRUE;
}
void wxDialog::SetModal(bool flag)
{
- if ( flag )
- m_windowStyle |= wxDIALOG_MODAL ;
- else
- if ( m_windowStyle & wxDIALOG_MODAL )
- m_windowStyle -= wxDIALOG_MODAL ;
-
- wxModelessWindows.DeleteObject(this);
- if (!flag)
- wxModelessWindows.Append(this);
+ if ( flag )
+ m_windowStyle |= wxDIALOG_MODAL ;
+ else if ( m_windowStyle & wxDIALOG_MODAL )
+ m_windowStyle -= wxDIALOG_MODAL ;
+
+ wxModelessWindows.DeleteObject(this);
+ if (!flag)
+ wxModelessWindows.Append(this);
}
wxDialog::~wxDialog()
{
- // TODO
+ m_isBeingDeleted = TRUE;
+
wxTopLevelWindows.DeleteObject(this);
+ Show(FALSE);
+
+ if (m_modalShowing)
+ {
+ if (GetParent() && GetParent()->GetHWND())
+ // TODO: bring the parent to the top
+ return;
+ }
+
+ m_modalShowing = FALSE;
if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL )
- wxModelessWindows.DeleteObject(this);
+ wxModelessWindows.DeleteObject(this);
+
// If this is the last top-level window, exit.
if (wxTheApp && (wxTopLevelWindows.Number() == 0))
// By default, pressing escape cancels the dialog
void wxDialog::OnCharHook(wxKeyEvent& event)
{
- 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);
+ if (GetHWND())
+ {
+ 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);
- return;
- }
- // We didn't process this event.
- event.Skip();
+ return;
+ }
+ }
+ // We didn't process this event.
+ event.Skip();
+}
+
+void wxDialog::OnPaint(wxPaintEvent& event)
+{
+ // No: if you call the default procedure, it makes
+ // the following painting code not work.
+// wxWindow::OnPaint(event);
+}
+
+void wxDialog::Fit()
+{
+ wxWindow::Fit();
}
void wxDialog::Iconize(bool WXUNUSED(iconize))
{
- // TODO
+ // Windows dialog boxes can't be iconized
}
bool wxDialog::IsIconized() const
{
- // TODO
return FALSE;
}
-void wxDialog::SetClientSize(int width, int height)
+void wxDialog::DoSetClientSize(int width, int height)
{
- // TODO
+ // TODO: Convert the below to OS/2 PM code
+
+// HWND hWnd = (HWND) GetHWND();
+// RECT rect;
+// ::GetClientRect(hWnd, &rect);
+//
+// RECT rect2;
+// GetWindowRect(hWnd, &rect2);
+//
+ // Find the difference between the entire window (title bar and all)
+ // and the client area; add this to the new client size to move the
+ // window
+// int actual_width = rect2.right - rect2.left - rect.right + width;
+// int actual_height = rect2.bottom - rect2.top - rect.bottom + height;
+
+// MoveWindow(hWnd, rect2.left, rect2.top, actual_width, actual_height, TRUE);
+//
+// wxSizeEvent event(wxSize(actual_width, actual_height), m_windowId);
+// event.SetEventObject( this );
+// GetEventHandler()->ProcessEvent(event);
}
-
void wxDialog::GetPosition(int *x, int *y) const
{
- // TODO
+ // TODO: Convert
+// HWND hWnd = (HWND) GetHWND();
+// RECT rect;
+// GetWindowRect(hWnd, &rect);
+
+// *x = rect.left;
+// *y = rect.top;
+}
+
+bool wxDialog::IsShown() const
+{
+ return m_isShown;
+}
+
+bool wxDialog::IsModal() const
+{
+ return wxModalDialogs.Find((wxDialog *)this) != 0; // const_cast
}
bool wxDialog::Show(bool show)
{
- // TODO
+ // TODO: This is involved code, look at msw port for details
return FALSE;
}
void wxDialog::SetTitle(const wxString& title)
{
- // TODO
+ ::WinSetWindowText((HWND) GetHWND(), title.c_str());
}
wxString wxDialog::GetTitle() const
{
- // TODO
- return wxString("");
+ ::WinQueryWindowText((HWND) GetHWND(), 1000, wxBuffer);
+ return wxString(wxBuffer);
}
void wxDialog::Centre(int direction)
int wxDialog::ShowModal()
{
m_windowStyle |= wxDIALOG_MODAL;
- // TODO: modal showing
- Show(TRUE);
- return GetReturnCode();
+ Show(TRUE);
+ return GetReturnCode();
}
void wxDialog::EndModal(int retCode)
{
- SetReturnCode(retCode);
+ SetReturnCode(retCode);
// TODO modal un-showing
- Show(FALSE);
+ Show(FALSE);
}
+// Define for each class of dialog and control
+WXHBRUSH wxDialog::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
+ WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+{
+ return 0;
+}
// Standard buttons
void wxDialog::OnOK(wxCommandEvent& event)
{
- if ( Validate() && TransferDataFromWindow() )
- {
+ if ( Validate() && TransferDataFromWindow() )
+ {
if ( IsModal() )
EndModal(wxID_OK);
else
{
- SetReturnCode(wxID_OK);
- this->Show(FALSE);
+ SetReturnCode(wxID_OK);
+ this->Show(FALSE);
}
- }
+ }
}
void wxDialog::OnApply(wxCommandEvent& event)
{
- if (Validate())
- TransferDataFromWindow();
- // TODO probably need to disable the Apply button until things change again
+ if (Validate())
+ TransferDataFromWindow();
+ // TODO probably need to disable the Apply button until things change again
}
void wxDialog::OnCancel(wxCommandEvent& event)
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()
{
- if (!wxPendingDelete.Member(this))
- wxPendingDelete.Append(this);
- return TRUE;
+ if (!wxPendingDelete.Member(this))
+ wxPendingDelete.Append(this);
+ return TRUE;
+}
+
+void wxDialog::OnSize(wxSizeEvent& WXUNUSED(event))
+{
+ // if we're using constraints - do use them
+ #if wxUSE_CONSTRAINTS
+ if ( GetAutoLayout() )
+ {
+ Layout();
+ }
+ #endif
}
void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& event)
Refresh();
}
-void wxDialog::Fit()
+MRESULT wxDialog::OS2WindowProc(HWND hwnd, WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
{
+ MRESULT 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::OS2WindowProc(hwnd, message, wParam, lParam);
+
+ return rc;
}
+