#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler)
+#endif
BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler)
-EVT_CHAR(wxWindow::OnChar)
-EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground)
-EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
-EVT_INIT_DIALOG(wxWindow::OnInitDialog)
-EVT_IDLE(wxWindow::OnIdle)
+ EVT_CHAR(wxWindow::OnChar)
+ EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground)
+ EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
+ EVT_INIT_DIALOG(wxWindow::OnInitDialog)
+ EVT_IDLE(wxWindow::OnIdle)
END_EVENT_TABLE()
-#endif
-
// Find an item given the MS Windows id
wxWindow *wxWindow::FindItem(int id) const
{
- if (!GetChildren())
- return NULL;
- wxNode *current = GetChildren()->First();
+// if (!GetChildren())
+// return NULL;
+ wxNode *current = GetChildren().First();
while (current)
{
wxWindow *childWin = (wxWindow *)current->Data();
// Find an item given the MS Windows handle
wxWindow *wxWindow::FindItemByHWND(WXHWND hWnd, bool controlOnly) const
{
- if (!GetChildren())
- return NULL;
- wxNode *current = GetChildren()->First();
+// if (!GetChildren())
+// return NULL;
+ wxNode *current = GetChildren().First();
while (current)
{
wxObject *obj = (wxObject *)current->Data() ;
return FALSE;
}
-bool wxWindow::MSWNotify(WXWPARAM WXUNUSED(wParam), WXLPARAM WXUNUSED(lParam))
+bool wxWindow::MSWNotify(WXWPARAM WXUNUSED(wParam),
+ WXLPARAM WXUNUSED(lParam),
+ WXLPARAM* WXUNUSED(result))
{
return FALSE;
}
m_hWnd = hWnd;
}
-// Constructor
-wxWindow::wxWindow(void)
+// ----------------------------------------------------------------------------
+// constructors and such
+// ----------------------------------------------------------------------------
+
+void wxWindow::Init()
{
// Generic
m_windowId = 0;
m_windowStyle = 0;
m_windowParent = NULL;
m_windowEventHandler = this;
- m_windowName = "";
m_windowCursor = *wxSTANDARD_CURSOR;
m_children = new wxList;
m_doubleClickAllowed = 0 ;
// MSW-specific
m_hWnd = 0;
m_winEnabled = TRUE;
- m_caretWidth = 0; m_caretHeight = 0;
- m_caretEnabled = FALSE;
+ m_caretWidth = m_caretHeight = 0;
+ m_caretEnabled =
m_caretShown = FALSE;
m_inOnSize = FALSE;
- m_minSizeX = -1;
- m_minSizeY = -1;
- m_maxSizeX = -1;
+ m_minSizeX =
+ m_minSizeY =
+ m_maxSizeX =
m_maxSizeY = -1;
- // m_paintHDC = 0;
- // m_tempHDC = 0;
+
m_isBeingDeleted = FALSE;
m_oldWndProc = 0;
#ifndef __WIN32__
m_globalHandle = 0;
#endif
m_useCtl3D = FALSE;
+ m_mouseInWindow = FALSE;
+ m_windowParent = NULL;
m_defaultItem = NULL;
wxSystemSettings settings;
m_backgroundColour = settings.GetSystemColour(wxSYS_COLOUR_3DFACE) ;
- // m_backgroundColour = settings.GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
m_foregroundColour = *wxBLACK;
- /*
- wxColour(GetRValue(GetSysColor(COLOR_WINDOW)),
- GetGValue(GetSysColor(COLOR_BTNFACE)), GetBValue(GetSysColor(COLOR_BTNFACE)));
- */
-
// wxWnd
m_lastMsg = 0;
m_lastWParam = 0;
m_lastLParam = 0;
- // m_acceleratorTable = 0;
m_hMenu = 0;
m_xThumbSize = 0;
#endif
}
+wxWindow::wxWindow()
+{
+ Init();
+}
+
// Destructor
-wxWindow::~wxWindow(void)
+wxWindow::~wxWindow()
{
m_isBeingDeleted = TRUE;
}
// Destroy the window (delayed, if a managed window)
-bool wxWindow::Destroy(void)
+bool wxWindow::Destroy()
{
delete this;
return TRUE;
extern char wxCanvasClassName[];
-// Constructor
+// real construction (Init() must have been called before!)
bool wxWindow::Create(wxWindow *parent, wxWindowID id,
const wxPoint& pos,
const wxSize& size,
long style,
const wxString& name)
{
- // Generic
- m_isBeingDeleted = FALSE;
- m_windowId = 0;
- m_isShown = TRUE;
- m_windowStyle = 0;
- m_windowParent = NULL;
- m_windowEventHandler = this;
- m_windowName = "";
- m_windowCursor = *wxSTANDARD_CURSOR;
- m_doubleClickAllowed = 0 ;
- m_winCaptured = FALSE;
- m_constraints = NULL;
- m_constraintsInvolvedIn = NULL;
- m_windowSizer = NULL;
- m_sizerParent = NULL;
- m_autoLayout = FALSE;
- m_windowValidator = NULL;
-#if wxUSE_DRAG_AND_DROP
- m_pDropTarget = NULL;
-#endif
+ wxCHECK_MSG( parent, FALSE, "can't create wxWindow without parent" );
- // MSW-specific
- m_hWnd = 0;
- m_winEnabled = TRUE;
- m_caretWidth = 0; m_caretHeight = 0;
- m_caretEnabled = FALSE;
- m_caretShown = FALSE;
- m_inOnSize = FALSE;
- m_minSizeX = -1;
- m_minSizeY = -1;
- m_maxSizeX = -1;
- m_maxSizeY = -1;
- m_oldWndProc = 0;
-#ifndef __WIN32__
- m_globalHandle = 0;
-#endif
- m_useCtl3D = FALSE;
- m_defaultItem = NULL;
- m_windowParent = NULL;
- m_mouseInWindow = FALSE;
- if (!parent)
- return FALSE;
-
- if (parent) parent->AddChild(this);
-
- // wxWnd
- m_lastMsg = 0;
- m_lastWParam = 0;
- m_lastLParam = 0;
- m_hMenu = 0;
-
- m_xThumbSize = 0;
- m_yThumbSize = 0;
- m_backgroundTransparent = FALSE;
-
- m_lastXPos = (float)-1.0;
- m_lastYPos = (float)-1.0;
- m_lastEvent = -1;
- m_returnCode = 0;
+ parent->AddChild(this);
SetName(name);
wxSystemSettings settings;
- m_backgroundColour = settings.GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
- // m_backgroundColour = settings.GetSystemColour(wxSYS_COLOUR_3DFACE) ;
- m_foregroundColour = *wxBLACK;
-
m_windowStyle = style;
DWORD msflags = 0;
(m_windowStyle & wxSUNKEN_BORDER) || (m_windowStyle & wxDOUBLE_BORDER))
msflags |= WS_BORDER;
- m_mouseInWindow = FALSE ;
-
MSWCreate(m_windowId, parent, wxCanvasClassName, this, NULL,
- x, y, width, height, msflags, NULL, exStyle);
+ x, y, width, height, msflags, NULL, exStyle);
return TRUE;
}
-void wxWindow::SetFocus(void)
+void wxWindow::SetFocus()
{
HWND hWnd = (HWND) GetHWND();
if (hWnd)
::EnableWindow(hWnd, (BOOL)enable);
}
-void wxWindow::CaptureMouse(void)
+void wxWindow::CaptureMouse()
{
HWND hWnd = (HWND) GetHWND();
if (hWnd && !m_winCaptured)
}
}
-void wxWindow::ReleaseMouse(void)
+void wxWindow::ReleaseMouse()
{
if (m_winCaptured)
{
{
int currentX, currentY;
GetPosition(¤tX, ¤tY);
+ int currentW,currentH;
+ GetSize(¤tW, ¤tH);
+
+ if (x == currentX && y == currentY && width == currentW && height == currentH)
+ return;
+
int actualWidth = width;
int actualHeight = height;
int actualX = x;
AdjustForParentClientOrigin(actualX, actualY, sizeFlags);
- int currentW,currentH;
- GetSize(¤tW, ¤tH);
if (width == -1)
actualWidth = currentW ;
if (height == -1)
HFONT was = 0;
if (fontToUse && fontToUse->Ok())
{
- if ((fnt=(HFONT) fontToUse->GetResourceHandle()))
+ fnt = (HFONT)fontToUse->GetResourceHandle();
+ if ( fnt )
was = (HFONT) SelectObject(dc,fnt) ;
}
// fontToUse->ReleaseResource();
}
-void wxWindow::Refresh(bool eraseBack, const wxRectangle *rect)
+void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
{
HWND hWnd = (HWND) GetHWND();
if (hWnd)
}
case WM_QUERYDRAGICON:
{
- HICON hIcon = 0;
- if ((hIcon = (HICON) MSWOnQueryDragIcon()))
+ HICON hIcon = (HICON)MSWOnQueryDragIcon();
+ if ( hIcon )
return (long)hIcon;
- else return MSWDefWindowProc(message, wParam, lParam );
+ else
+ return MSWDefWindowProc(message, wParam, lParam );
break;
}
#if defined(__WIN95__)
case WM_NOTIFY:
{
- if (!MSWOnNotify(wParam, lParam))
- return MSWDefWindowProc(message, wParam, lParam );
- break;
+ // for some messages (TVN_ITEMEXPANDING for example), the return
+ // value of WM_NOTIFY handler is important, so don't just return 0
+ // if we processed the message
+ return MSWOnNotify(wParam, lParam);
}
#endif
case WM_MENUSELECT:
// Default destroyer - override if you destroy it in some other way
// (e.g. with MDI child windows)
-void wxWindow::MSWDestroyWindow(void)
+void wxWindow::MSWDestroyWindow()
{
}
m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
(DLGPROC)wxDlgProc);
#else
+ // N.B.: if we _don't_ use this form,
+ // then with VC++ 1.5, it crashes horribly.
+#if 1
+ m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
+ (DLGPROC)wxDlgProc);
+#else
+ // Crashes when we use this.
DLGPROC dlgproc = (DLGPROC)MakeProcInstance((DLGPROC)wxWndProc, wxGetInstance());
m_hWnd = (WXHWND) ::CreateDialog(wxGetInstance(), dialog_template, hParent,
(DLGPROC)dlgproc);
+#endif
#endif
if (m_hWnd == 0)
{
}
-bool wxWindow::MSWOnClose(void)
+bool wxWindow::MSWOnClose()
{
return FALSE;
}
return TRUE;
}
-bool wxWindow::MSWOnDestroy(void)
+bool wxWindow::MSWOnDestroy()
{
// delete our drop target if we've got one
#if wxUSE_DRAG_AND_DROP
// Deal with child commands from buttons etc.
-bool wxWindow::MSWOnNotify(WXWPARAM wParam, WXLPARAM lParam)
+long wxWindow::MSWOnNotify(WXWPARAM wParam, WXLPARAM lParam)
{
#if defined(__WIN95__)
// Find a child window to send the notification to, e.g. a toolbar.
HWND hWnd = (HWND)hdr->hwndFrom;
wxWindow *win = wxFindWinFromHandle((WXHWND) hWnd);
+ WXLPARAM result = 0;
+
if ( win )
- return win->MSWNotify(wParam, lParam);
+ {
+ if ( win->MSWNotify(wParam, lParam, &result) )
+ return result;
+ }
else
{
// Rely on MSWNotify to check whether the message
// belongs to the window or not
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while (node)
{
wxWindow *child = (wxWindow *)node->Data();
- if ( child->MSWNotify(wParam, lParam) )
- return TRUE;
+ if ( child->MSWNotify(wParam, lParam, &result) )
+ return result;
node = node->Next();
}
- }
- return FALSE;
+ // finally try this window too (catches toolbar case)
+ if ( MSWNotify(wParam, lParam, &result) )
+ return result;
+ }
+#endif // Win95
-#endif
+ // not processed
return FALSE;
}
// Responds to colour changes: passes event on to children.
void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event)
{
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while ( node )
{
// Only propagate to non-top-level windows
lDlgCode = ::SendMessage(msg->hwnd, WM_GETDLGCODE, 0, 0);
}
- bool bForward;
+ bool bForward = TRUE;
if ( bProcess ) {
switch ( msg->wParam ) {
- case VK_TAB:
- if ( lDlgCode & DLGC_WANTTAB ) // this is FALSE for Ctrl-Tab
- bProcess = FALSE;
- else
- bForward = !(::GetKeyState(VK_SHIFT) & 0x100);
- break;
+ case VK_TAB:
+ if ( lDlgCode & DLGC_WANTTAB ) // FALSE for Ctrl-Tab
+ bProcess = FALSE;
+ else
+ bForward = !(::GetKeyState(VK_SHIFT) & 0x100);
+ break;
- case VK_UP:
- case VK_LEFT:
- if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown )
- bProcess = FALSE;
- else
- bForward = FALSE;
- break;
+ case VK_UP:
+ case VK_LEFT:
+ if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown )
+ bProcess = FALSE;
+ else
+ bForward = FALSE;
+ break;
- case VK_DOWN:
- case VK_RIGHT:
- if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown )
- bProcess = FALSE;
- else
- bForward = TRUE;
- break;
+ case VK_DOWN:
+ case VK_RIGHT:
+ if ( (lDlgCode & DLGC_WANTARROWS) || bCtrlDown )
+ bProcess = FALSE;
+ break;
- default:
- bProcess = FALSE;
+ default:
+ bProcess = FALSE;
}
}
return 1;
}
-void wxWindow::MSWDetachWindowMenu(void)
+void wxWindow::MSWDetachWindowMenu()
{
if (m_hMenu)
{
}
}
-bool wxWindow::MSWOnPaint(void)
+bool wxWindow::MSWOnPaint()
{
#ifdef __WIN32__
HRGN hRegion = ::CreateRectRgn(0, 0, 0, 0); // Dummy call to get a handle
event.SetTimestamp(wxApp::sm_lastMessageTime);
event.m_eventObject = this;
- m_lastXPos = event.m_x; m_lastYPos = event.m_y; m_lastEvent = wxEVENT_TYPE_LEFT_DOWN;
+ m_lastXPos = event.m_x; m_lastYPos = event.m_y; m_lastEvent = wxEVT_LEFT_DOWN;
if (!GetEventHandler()->ProcessEvent(event))
Default();
return TRUE;
}
-void wxWindow::InitDialog(void)
+void wxWindow::InitDialog()
{
wxInitDialogEvent event(GetId());
event.SetEventObject( this );
{
// the_font->UseResource();
// the_font->RealizeResource();
- if ((fnt=(HFONT) the_font->GetResourceHandle()))
+ fnt = (HFONT)the_font->GetResourceHandle();
+ if ( fnt )
was = (HFONT) SelectObject(dc,fnt) ;
}
GetTextMetrics(dc, &tm);
}
}
-void wxWindow::DestroyCaret(void)
+void wxWindow::DestroyCaret()
{
m_caretEnabled = FALSE;
}
*y = point.y;
}
-wxWindow *wxGetActiveWindow(void)
+wxWindow *wxGetActiveWindow()
{
HWND hWnd = GetActiveWindow();
if (hWnd != 0)
}
/* TODO (maybe)
-void wxWindow::OnPaint(void)
+void wxWindow::OnPaint()
{
PaintSelectionHandles();
}
#if defined(__WIN95__)
// Try to adjust the range to cope with page size > 1
// - a Windows API quirk
- int pageSize = GetScrollPage(orient);
+ int pageSize = GetScrollThumb(orient);
if ( pageSize > 1 )
{
maxPos -= (pageSize - 1);
}
}
-void wxWindow::ScrollWindow(int dx, int dy, const wxRectangle *rect)
+void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
{
RECT rect2;
if ( rect )
SetWindowLong((HWND) hWnd, GWL_WNDPROC, (LONG) wxWndProc);
}
-void wxWindow::UnsubclassWin(void)
+void wxWindow::UnsubclassWin()
{
wxRemoveHandleAssociation(this);
// Transfer values to controls. If returns FALSE,
// it's an application error (pops up a dialog)
-bool wxWindow::TransferDataToWindow(void)
+bool wxWindow::TransferDataToWindow()
{
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while ( node )
{
wxWindow *child = (wxWindow *)node->Data();
// Transfer values from controls. If returns FALSE,
// validation failed: don't quit
-bool wxWindow::TransferDataFromWindow(void)
+bool wxWindow::TransferDataFromWindow()
{
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while ( node )
{
wxWindow *child = (wxWindow *)node->Data();
return TRUE;
}
-bool wxWindow::Validate(void)
+bool wxWindow::Validate()
{
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while ( node )
{
wxWindow *child = (wxWindow *)node->Data();
}
// Get the window with the focus
-wxWindow *wxWindow::FindFocus(void)
+wxWindow *wxWindow::FindFocus()
{
HWND hWnd = ::GetFocus();
if ( hWnd )
void wxWindow::AddChild(wxWindow *child)
{
- GetChildren()->Append(child);
+ GetChildren().Append(child);
child->m_windowParent = this;
}
void wxWindow::RemoveChild(wxWindow *child)
{
- if (GetChildren())
- GetChildren()->DeleteObject(child);
+// if (GetChildren())
+ GetChildren().DeleteObject(child);
child->m_windowParent = NULL;
}
-void wxWindow::DestroyChildren(void)
+void wxWindow::DestroyChildren()
{
- if (GetChildren()) {
wxNode *node;
- while ((node = GetChildren()->First()) != (wxNode *)NULL) {
+ while ((node = GetChildren().First()) != (wxNode *)NULL) {
wxWindow *child;
if ((child = (wxWindow *)node->Data()) != (wxWindow *)NULL) {
delete child;
- if ( GetChildren()->Member(child) )
+ if ( GetChildren().Member(child) )
delete node;
}
} /* while */
- }
}
void wxWindow::MakeModal(bool modal)
}
// Reset any constraints that mention this window
-void wxWindow::DeleteRelatedConstraints(void)
+void wxWindow::DeleteRelatedConstraints()
{
if (m_constraintsInvolvedIn)
{
* New version
*/
-bool wxWindow::Layout(void)
+bool wxWindow::Layout()
{
if (GetConstraints())
{
{
noChanges = 0;
noFailures = 0;
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while (node)
{
wxWindow *child = (wxWindow *)node->Data();
return TRUE;
}
-void wxWindow::ResetConstraints(void)
+void wxWindow::ResetConstraints()
{
wxLayoutConstraints *constr = GetConstraints();
if (constr)
constr->centreX.SetDone(FALSE);
constr->centreY.SetDone(FALSE);
}
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while (node)
{
wxWindow *win = (wxWindow *)node->Data();
if (recurse)
{
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while (node)
{
wxWindow *win = (wxWindow *)node->Data();
wxObject* wxWindow::GetChild(int number) const
{
// Return a pointer to the Nth object in the Panel
- if (!GetChildren())
- return(NULL) ;
- wxNode *node = GetChildren()->First();
+// if (!GetChildren())
+// return(NULL) ;
+ wxNode *node = GetChildren().First();
int n = number;
while (node && n--)
node = node->Next() ;
*/
}
-void wxWindow::Clear(void)
+void wxWindow::Clear()
{
wxClientDC dc(this);
wxBrush brush(GetBackgroundColour(), wxSOLID);
}
// Fits the panel around the items
-void wxWindow::Fit(void)
+void wxWindow::Fit()
{
int maxX = 0;
int maxY = 0;
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while ( node )
{
wxWindow *win = (wxWindow *)node->Data();
if ( GetId() == id)
return this;
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while ( node )
{
wxWindow *child = (wxWindow *)node->Data();
if ( GetName() == name)
return this;
- wxNode *node = GetChildren()->First();
+ wxNode *node = GetChildren().First();
while ( node )
{
wxWindow *child = (wxWindow *)node->Data();
*/
// Setup background and foreground colours correctly
-void wxWindow::SetupColours(void)
+void wxWindow::SetupColours()
{
if (GetParent())
SetBackgroundColour(GetParent()->GetBackgroundColour());
}
// Raise the window to the top of the Z order
-void wxWindow::Raise(void)
+void wxWindow::Raise()
{
::BringWindowToTop((HWND) GetHWND());
}
// Lower the window to the bottom of the Z order
-void wxWindow::Lower(void)
+void wxWindow::Lower()
{
::SetWindowPos((HWND) GetHWND(), HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
}
return (m_updateRegion.Contains(rect) != wxOutRegion);
}
+// Set this window to be the child of 'parent'.
+bool wxWindow::Reparent(wxWindow *parent)
+{
+ if (parent == GetParent())
+ return TRUE;
+
+ // Unlink this window from the existing parent.
+ if (GetParent())
+ {
+ GetParent()->RemoveChild(this);
+ }
+ else
+ wxTopLevelWindows.DeleteObject(this);
+
+ HWND hWndParent = 0;
+ HWND hWndChild = (HWND) GetHWND();
+ if (parent != (wxWindow*) NULL)
+ {
+ parent->AddChild(this);
+ hWndParent = (HWND) parent->GetHWND();
+ }
+ else
+ wxTopLevelWindows.Append(this);
+
+ ::SetParent(hWndChild, hWndParent);
+
+ return TRUE;
+}
+
#ifdef __WXDEBUG__
const char *wxGetMessageName(int message)
{