// /// Overrides TFrameWindows virtual function. Sets the client window to the /// specified window. Users are responsible for destroying the old client window if /// they want to remove it. // /// Handle SetClientWindow() here to manage fixing up the layout metrics of /// all the children before & after the client is changed. // TWindow* TDecoratedFrame::SetClientWindow(TWindow* clientWnd) { TLayoutMetrics metrics; GetChildLayoutMetrics(*ClientWnd, metrics); if (!clientWnd) clientWnd = new TWindow(this, _T("\007")); // create dummy placeholder clientWnd->SetParent(this); SetChildLayoutMetrics(*clientWnd, metrics); TWindow* oldWnd = GetClientWindow(); // Make sure that all child metrics that were based on the old client window // get updated to the new client // TWindow* first = GetFirstChild(); if (first) { TWindow* child = first; do { if (GetChildLayoutMetrics(*child, metrics)) { if (metrics.X.RelWin == oldWnd) metrics.X.RelWin = clientWnd; if (metrics.Y.RelWin == oldWnd) metrics.Y.RelWin = clientWnd; if (metrics.Width.RelWin == oldWnd) metrics.Width.RelWin = clientWnd; if (metrics.Height.RelWin == oldWnd) metrics.Height.RelWin = clientWnd; SetChildLayoutMetrics(*child, metrics); } child = child->Next(); } while (child != first); } // Now let the TFrameWindow set the client. Then delete the old client if it // was our temporary place holder. Set a flag while the client is being set // so that RemoveChild() below knows that we are taking care of things. // SettingClient = true; oldWnd = TFrameWindow::SetClientWindow(clientWnd); SettingClient = false; if (oldWnd->GetCaption() && oldWnd->GetCaption()[0] == 007) { oldWnd->Destroy(); delete oldWnd; oldWnd = 0; } // Relayout the children to get the new client sized right // Layout(); return oldWnd; }
void TWindow::DoDestroy() { TListIterator<TWindow> iter(fChildren); TWindow* child; while ((child = iter.Next()) != NULL) child->Destroy(); if (IsCreated()) XDestroyWindow(sDisplay, fWindow); delete this; }