52 ClassImp(TGMdiMainFrame);
53 ClassImp(TGMdiContainer);
54 ClassImp(TGMdiGeometry);
55 ClassImp(TGMdiFrameList);
60 TGMdiMainFrame::TGMdiMainFrame(
const TGWindow *p, TGMdiMenuBar *menuBar,
61 Int_t w, Int_t h, UInt_t options,
63 TGCanvas(p, w, h, options | kDoubleBorder | kSunkenFrame | kMdiMainFrame, back)
65 fContainer =
new TGMdiContainer(
this, 10, 10, kOwnBackground,
66 fClient->GetShadow(GetDefaultFrameBackground()));
67 TGCanvas::SetContainer(fContainer);
75 const TGResourcePool *res = GetResourcePool();
76 fBackCurrent = res->GetSelectedBgndColor();
77 fForeCurrent = res->GetSelectedFgndColor();
78 fForeNotCurrent = res->GetFrameBgndColor();
79 fBackNotCurrent = res->GetFrameShadowColor();
80 fFontCurrent = (TGFont *)res->GetMenuFont();
81 fFontNotCurrent = fFontCurrent;
83 fBoxGC =
new TGGC(*gClient->GetResourcePool()->GetFrameGC());
84 fBoxGC->SetForeground(fForeNotCurrent);
85 fBoxGC->SetBackground(fBackNotCurrent);
86 fBoxGC->SetFunction(kGXxor);
87 fBoxGC->SetLineWidth(TGMdiDecorFrame::kMdiBorderWidth-3);
88 fBoxGC->SetSubwindowMode(kIncludeInferiors);
89 fBoxGC->SetStipple(fClient->GetResourcePool()->GetCheckeredBitmap());
90 fBoxGC->SetFillStyle(kFillOpaqueStippled);
92 fCurrentX = fCurrentY = 0;
93 fResizeMode = kMdiDefaultResizeMode;
95 fWinListMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
97 const TGMainFrame *main = (TGMainFrame *) GetMainFrame();
99 Int_t keycode = gVirtualX->KeysymToKeycode(kKey_Tab);
100 main->BindKey(
this, keycode, kKeyControlMask);
101 main->BindKey(
this, keycode, kKeyControlMask | kKeyShiftMask);
102 keycode = gVirtualX->KeysymToKeycode(kKey_F4);
103 main->BindKey(
this, keycode, kKeyControlMask);
104 ((TGFrame *)main)->Connect(
"ProcessedConfigure(Event_t*)",
105 "TGMdiMainFrame",
this,
"UpdateMdiButtons()");
117 TGMdiMainFrame::~TGMdiMainFrame()
119 TGMdiFrameList *tmp, *travel = fChildren;
122 tmp = travel->GetNext();
127 if (fFontCurrent) fClient->FreeFont((TGFont *)fFontCurrent);
128 if (fFontNotCurrent != fFontCurrent) fClient->FreeFont((TGFont *)fFontNotCurrent);
132 if (!MustCleanup()) {
134 const TGMainFrame *main = (TGMainFrame *) GetMainFrame();
136 if (main && main->InheritsFrom(
"TGMainFrame")) {
137 Int_t keycode = gVirtualX->KeysymToKeycode(kKey_Tab);
138 main->RemoveBind(
this, keycode, kKeyControlMask);
139 main->RemoveBind(
this, keycode, kKeyControlMask | kKeyShiftMask);
140 keycode = gVirtualX->KeysymToKeycode(kKey_F4);
141 main->RemoveBind(
this, keycode, kKeyControlMask);
149 void TGMdiMainFrame::SetResizeMode(Int_t mode)
151 TGMdiFrameList *travel;
154 for (travel = fChildren; travel; travel = travel->GetNext()) {
155 travel->GetDecorFrame()->SetResizeMode(mode);
162 Bool_t TGMdiMainFrame::HandleKey(Event_t *event)
167 if (event->fType == kGKeyPress) {
168 gVirtualX->LookupString(event, input,
sizeof(input), keysym);
169 if ((EKeySym)keysym == kKey_Tab) {
170 if (event->fState & kKeyControlMask) {
171 if (event->fState & kKeyShiftMask) {
178 }
else if ((EKeySym)keysym == kKey_F4) {
179 if (event->fState & kKeyControlMask) {
191 void TGMdiMainFrame::AddMdiFrame(TGMdiFrame *frame)
193 TGMdiFrameList *travel;
195 frame->UnmapWindow();
197 travel =
new TGMdiFrameList;
198 travel->SetCyclePrev(travel);
199 travel->SetCycleNext(travel);
201 if (fChildren) fChildren->SetPrev(travel);
202 travel->SetNext(fChildren);
205 travel->SetDecorFrame(
new TGMdiDecorFrame(
this, frame, frame->GetWidth(),
206 frame->GetHeight(), fBoxGC));
208 travel->SetFrameId(frame->GetId());
209 travel->GetDecorFrame()->SetResizeMode(fResizeMode);
211 if (fCurrentX + travel->GetDecorFrame()->GetWidth() > fWidth) fCurrentX = 0;
212 if (fCurrentY + travel->GetDecorFrame()->GetHeight() > fHeight) fCurrentY = 0;
213 travel->GetDecorFrame()->Move(fCurrentX, fCurrentY);
215 fCurrentX += travel->GetDecorFrame()->GetTitleBar()->GetHeight() + fBorderWidth * 2;
216 fCurrentY += travel->GetDecorFrame()->GetTitleBar()->GetHeight() + fBorderWidth * 2;
217 travel->GetDecorFrame()->SetMdiButtons(travel->GetDecorFrame()->GetMdiButtons());
225 SendMessage(fParent, MK_MSG(kC_MDI, kMDI_CREATE), travel->GetDecorFrame()->GetId(), 0);
226 FrameCreated(travel->GetDecorFrame()->GetId());
232 Bool_t TGMdiMainFrame::RemoveMdiFrame(TGMdiFrame *frame)
234 TGMdiFrameList *travel = fChildren;
236 if (!frame)
return kFALSE;
238 if (frame->IsEditable()) frame->SetEditable(kFALSE);
240 while (travel && (travel->GetFrameId() != frame->GetId()))
241 travel = travel->GetNext();
242 if (!travel)
return kFALSE;
244 if (travel == fCurrent) fCurrent = 0;
247 travel->GetCyclePrev()->SetCycleNext(travel->GetCycleNext());
248 travel->GetCycleNext()->SetCyclePrev(travel->GetCyclePrev());
251 if (travel->GetNext()) {
252 travel->GetNext()->SetPrev(travel->GetPrev());
254 if (travel->GetPrev()) {
255 travel->GetPrev()->SetNext(travel->GetNext());
257 fChildren = travel->GetNext();
261 if (fChildren) SetCurrent(travel->GetCyclePrev());
264 travel->GetDecorFrame()->RemoveFrame(frame);
266 UInt_t old_id = frame->GetId();
268 delete travel->fDecor;
275 SendMessage(fParent, MK_MSG(kC_MDI, kMDI_CLOSE), old_id, 0);
284 Bool_t TGMdiMainFrame::SetCurrent(UInt_t
id)
286 if (fCurrent && (fCurrent->GetDecorFrame()->GetId() == id)) {
287 fCurrent->GetDecorFrame()->RaiseWindow();
288 if (fCurrent->GetDecorFrame()->IsMaximized() && fMenuBar)
289 fMenuBar->ShowFrames(fCurrent->GetDecorFrame()->GetTitleBar()->GetWinIcon(),
290 fCurrent->GetDecorFrame()->GetTitleBar()->GetButtons());
292 Emit(
"SetCurrent(TGMdiFrame*)", (
long)fCurrent->GetDecorFrame()->GetMdiFrame());
296 TGMdiFrameList *travel = fChildren;
297 while (travel && (travel->GetDecorFrame()->GetId() != id)) travel = travel->GetNext();
298 if (!travel)
return kFALSE;
300 return SetCurrent(travel);
306 Bool_t TGMdiMainFrame::SetCurrent(TGMdiFrame *f)
308 if (fCurrent && (fCurrent->GetDecorFrame()->GetMdiFrame() == f)) {
309 fCurrent->GetDecorFrame()->RaiseWindow();
310 if (fCurrent->GetDecorFrame()->IsMaximized() && fMenuBar)
311 fMenuBar->ShowFrames(fCurrent->GetDecorFrame()->GetTitleBar()->GetWinIcon(),
312 fCurrent->GetDecorFrame()->GetTitleBar()->GetButtons());
313 Emit(
"SetCurrent(TGMdiFrame*)", (
long)fCurrent->GetDecorFrame()->GetMdiFrame());
317 TGMdiFrameList *travel = fChildren;
318 while (travel && (travel->GetDecorFrame()->GetMdiFrame() != f)) travel = travel->GetNext();
319 if (!travel)
return kFALSE;
321 return SetCurrent(travel);
327 Bool_t TGMdiMainFrame::SetCurrent(TGMdiFrameList *newcurrent)
329 if (fCurrent && (fCurrent == newcurrent)) {
330 fCurrent->GetDecorFrame()->RaiseWindow();
331 if (fCurrent->GetDecorFrame()->IsMaximized() && fMenuBar)
332 fMenuBar->ShowFrames(fCurrent->GetDecorFrame()->GetTitleBar()->GetWinIcon(),
333 fCurrent->GetDecorFrame()->GetTitleBar()->GetButtons());
334 Emit(
"SetCurrent(TGMdiFrame*)", (
long)fCurrent->GetDecorFrame()->GetMdiFrame());
339 if (!fCurrent->GetDecorFrame()->IsMaximized())
340 fCurrent->GetDecorFrame()->GetTitleBar()->SetTitleBarColors(fForeNotCurrent,
348 newcurrent->GetCyclePrev()->SetCycleNext(newcurrent->GetCycleNext());
349 newcurrent->GetCycleNext()->SetCyclePrev(newcurrent->GetCyclePrev());
351 newcurrent->SetCyclePrev(fCurrent);
352 newcurrent->SetCycleNext(fCurrent->GetCycleNext());
353 fCurrent->SetCycleNext(newcurrent);
354 newcurrent->GetCycleNext()->SetCyclePrev(newcurrent);
357 if (fChildren && newcurrent != fChildren) {
359 newcurrent->GetCyclePrev()->SetCycleNext(newcurrent->GetCycleNext());
360 newcurrent->GetCycleNext()->SetCyclePrev(newcurrent->GetCyclePrev());
362 newcurrent->SetCyclePrev(fChildren);
363 newcurrent->SetCycleNext(fChildren->GetCycleNext());
364 fChildren->SetCycleNext(newcurrent);
365 newcurrent->GetCycleNext()->SetCyclePrev(newcurrent);
370 fCurrent = newcurrent;
372 if (!fCurrent)
return kFALSE;
374 if (!fCurrent->GetDecorFrame()->IsMaximized())
375 fCurrent->GetDecorFrame()->GetTitleBar()->SetTitleBarColors(fForeCurrent,
379 fCurrent->GetDecorFrame()->RaiseWindow();
380 Emit(
"SetCurrent(TGMdiFrame*)", (
long)fCurrent->GetDecorFrame()->GetMdiFrame());
382 fWinListMenu->RCheckEntry(fCurrent->GetDecorFrame()->GetId(), 0, kMaxInt);
384 if (fCurrent->GetDecorFrame()->IsMaximized() && fMenuBar)
385 fMenuBar->ShowFrames(fCurrent->GetDecorFrame()->GetTitleBar()->GetWinIcon(),
386 fCurrent->GetDecorFrame()->GetTitleBar()->GetButtons());
394 void TGMdiMainFrame::CirculateUp()
397 fCurrent->GetDecorFrame()->GetTitleBar()->SetTitleBarColors(fForeNotCurrent,
401 fCurrent = fCurrent->GetCycleNext();
403 fCurrent->GetDecorFrame()->RaiseWindow();
404 fCurrent->GetDecorFrame()->GetTitleBar()->SetTitleBarColors(fForeCurrent,
407 if (fCurrent->GetDecorFrame()->IsMaximized() && fMenuBar)
408 fMenuBar->ShowFrames(fCurrent->GetDecorFrame()->GetTitleBar()->GetWinIcon(),
409 fCurrent->GetDecorFrame()->GetTitleBar()->GetButtons());
411 }
else if (fChildren) {
412 SetCurrent(fChildren);
419 void TGMdiMainFrame::CirculateDown()
422 fCurrent->GetDecorFrame()->LowerWindow();
423 fCurrent->GetDecorFrame()->GetTitleBar()->SetTitleBarColors(fForeNotCurrent,
427 fCurrent = fCurrent->GetCyclePrev();
429 fCurrent->GetDecorFrame()->RaiseWindow();
430 fCurrent->GetDecorFrame()->GetTitleBar()->SetTitleBarColors(fForeCurrent,
433 if (fCurrent->GetDecorFrame()->IsMaximized() && fMenuBar)
434 fMenuBar->ShowFrames(fCurrent->GetDecorFrame()->GetTitleBar()->GetWinIcon(),
435 fCurrent->GetDecorFrame()->GetTitleBar()->GetButtons());
436 }
else if (fChildren) {
437 SetCurrent(fChildren);
444 TGMdiDecorFrame *TGMdiMainFrame::GetDecorFrame(TGMdiFrame *frame)
const
446 TGMdiFrameList *travel = fChildren;
447 while (travel && (travel->GetDecorFrame()->GetMdiFrame() != frame))
448 travel = travel->GetNext();
449 if (!travel)
return 0;
450 return travel->GetDecorFrame();
456 TGMdiDecorFrame *TGMdiMainFrame::GetDecorFrame(UInt_t
id)
const
458 TGMdiFrameList *travel = fChildren;
459 while (travel && (travel->GetDecorFrame()->GetId() != id)) travel = travel->GetNext();
460 if (!travel)
return 0;
461 return travel->GetDecorFrame();
467 TGMdiFrame *TGMdiMainFrame::GetMdiFrame(UInt_t
id)
const
469 TGMdiDecorFrame *frame = GetDecorFrame(
id);
470 if (!frame)
return 0;
471 return frame->GetMdiFrame();
477 TGRectangle TGMdiMainFrame::GetBBox()
const
479 if (fCurrent && fCurrent->GetDecorFrame()->IsMaximized()) {
480 return TGRectangle(0, 0, fWidth - 2 * fBorderWidth, fHeight - 2 * fBorderWidth);
483 TGMdiFrameList *travel;
485 for (travel = fChildren; travel; travel = travel->GetNext()) {
486 Int_t x = travel->GetDecorFrame()->GetX();
487 Int_t y = travel->GetDecorFrame()->GetY();
488 UInt_t w = travel->GetDecorFrame()->GetWidth();
489 UInt_t h = travel->GetDecorFrame()->GetHeight();
490 TGRectangle wrect(x, y, w, h);
500 TGRectangle TGMdiMainFrame::GetMinimizedBBox()
const
503 TGMdiFrameList *travel;
506 for (travel = fChildren; travel; travel = travel->GetNext()) {
507 if (travel->GetDecorFrame()->IsMinimized()) {
508 TGRectangle wrect(travel->GetDecorFrame()->GetX(), travel->GetDecorFrame()->GetY(),
509 travel->GetDecorFrame()->GetWidth(), travel->GetDecorFrame()->GetHeight());
510 if (first) rect = wrect;
511 else rect.Merge(wrect);
521 void TGMdiMainFrame::UpdateWinListMenu()
525 TGMdiFrameList *travel;
526 const TGPicture *pic;
529 TIter fNext(fWinListMenu->GetListOfEntries());
530 while ((e = (TGMenuEntry*)fNext())) {
531 fWinListMenu->DeleteEntry(e);
536 fWinListMenu->AddEntry(
new TGHotString(
"(None)"), 1000);
537 fWinListMenu->DisableEntry(1000);
541 for (travel = fChildren; travel; travel = travel->GetNext()) {
543 if (scut == (
'9' + 1)) scut =
'A';
544 buf = TString::Format(
"&%c. %s", scut, travel->GetDecorFrame()->GetWindowName());
545 if (travel->GetDecorFrame()->GetMdiButtons() & kMdiMenu)
546 pic = travel->GetDecorFrame()->GetWindowIcon();
549 fWinListMenu->AddEntry(
new TGHotString(buf.Data()), travel->GetDecorFrame()->GetId(), 0, pic);
553 fWinListMenu->RCheckEntry(fCurrent->GetDecorFrame()->GetId(), 0, kMaxInt);
559 void TGMdiMainFrame::Layout()
562 if (fCurrent && fCurrent->GetDecorFrame()->IsMaximized())
563 fCurrent->GetDecorFrame()->MoveResize(0, 0, fWidth - 2 *fBorderWidth, fHeight -
570 void TGMdiMainFrame::UpdateMdiButtons()
572 static Bool_t done = kFALSE;
573 TGMdiFrameList *travel;
575 for (travel = fChildren; travel; travel = travel->GetNext()) {
576 if (!travel->GetDecorFrame()->IsMaximized() &&
577 !travel->GetDecorFrame()->IsMinimized()) {
578 travel->GetDecorFrame()->SetMdiButtons(travel->GetDecorFrame()->GetMdiButtons());
588 void TGMdiMainFrame::ArrangeFrames(Int_t mode)
592 Int_t num_mapped = 0;
595 Int_t w = fWidth - 2 * fBorderWidth;
596 Int_t h = fHeight - 2 * fBorderWidth;
598 fArrangementMode = mode;
600 TGMdiFrameList *tmp, *travel;
602 for (travel = fChildren; travel; travel = travel->GetNext()) {
603 if (travel->GetDecorFrame()->IsMaximized())
604 Restore(travel->GetDecorFrame()->GetMdiFrame());
605 if (!travel->GetDecorFrame()->IsMinimized())
610 GetViewPort()->SetHPos(0);
611 GetViewPort()->SetVPos(0);
617 if (num_mapped == 0)
return;
619 TGRectangle irect = GetMinimizedBBox();
623 case kMdiTileHorizontal:
624 factor_y = h / num_mapped;
625 for (travel = fChildren; travel; travel = travel->GetNext()) {
626 if (!travel->GetDecorFrame()->IsMinimized()) {
627 travel->GetDecorFrame()->MoveResize(x, y, w, factor_y);
633 case kMdiTileVertical:
634 factor_x = w / num_mapped;
635 for (travel = fChildren; travel; travel = travel->GetNext()) {
636 if (!travel->GetDecorFrame()->IsMinimized()) {
637 travel->GetDecorFrame()->MoveResize(x, y, factor_x, h);
644 y = travel->GetDecorFrame()->GetTitleBar()->GetX() +
645 travel->GetDecorFrame()->GetTitleBar()->GetHeight();
647 factor_y = (h * 2) / 3;
648 factor_x = (w * 2) / 3;
651 if (!travel) travel = fChildren;
655 travel = travel->GetCycleNext();
656 if (!travel->GetDecorFrame()->IsMinimized()) {
657 travel->GetDecorFrame()->MoveResize(x - y, x - y, factor_x, factor_y);
660 }
while (travel != tmp);
665 FramesArranged(mode);
673 void TGMdiMainFrame::ArrangeMinimized()
675 TGMdiFrameList *travel, *closest;
678 Bool_t arranged = kTRUE;
680 for (travel = fChildren; travel && arranged; travel = travel->GetNext())
681 if (travel->GetDecorFrame()->IsMinimized()) arranged = kFALSE;
685 if (arranged || !fChildren)
return;
687 h = fChildren->GetDecorFrame()->GetTitleBar()->GetDefaultHeight() +
688 fChildren->GetDecorFrame()->GetBorderWidth();
689 w = kMinimizedWidth * h + fChildren->GetDecorFrame()->GetBorderWidth();
692 y = GetViewPort()->GetHeight() - h;
696 for (travel = fChildren; travel; travel = travel->GetNext())
697 travel->GetDecorFrame()->SetMinUserPlacement();
702 for (travel = fChildren; travel; travel = travel->GetNext()) {
703 if (travel->GetDecorFrame()->IsMinimized()) {
704 if (travel->GetDecorFrame()->GetMinUserPlacement()) {
705 Int_t dx = travel->GetDecorFrame()->GetX() - x;
706 Int_t dy = y - travel->GetDecorFrame()->GetY();
707 Int_t dist = dx * dx + dy * dy;
708 if (!closest || (dist < cdist)) {
717 closest->GetDecorFrame()->SetMinimizedX(x);
718 closest->GetDecorFrame()->SetMinimizedY(y);
719 closest->GetDecorFrame()->MoveResize(x, y, w, h);
720 closest->GetDecorFrame()->SetMinUserPlacement(kFALSE);
723 if (x + w > (Int_t)GetViewPort()->GetWidth()) {
733 for (travel = fChildren; travel; travel = travel->GetNext())
734 travel->GetDecorFrame()->SetMinUserPlacement(kFALSE);
740 Bool_t TGMdiMainFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
742 switch (GET_MSG(msg)) {
745 switch (GET_SUBMSG(msg)) {
748 Minimize(GetCurrent());
752 Maximize(GetCurrent());
756 Restore(GetCurrent());
764 FreeMove(GetCurrent());
768 FreeSize(GetCurrent());
772 ContextHelp(GetCurrent());
778 return TGCanvas::ProcessMessage(msg, parm1, parm2);
787 void TGMdiMainFrame::Maximize(TGMdiFrame *mdiframe)
789 TGMdiDecorFrame *frame = GetDecorFrame(mdiframe);
793 if (frame->IsMaximized())
return;
795 if (frame->IsMinimized()) Restore(mdiframe);
797 frame->SetDecorBorderWidth(0);
798 frame->SetPreResizeX(frame->GetX());
799 frame->SetPreResizeY(frame->GetY());
800 frame->SetPreResizeWidth(frame->GetWidth());
801 frame->SetPreResizeHeight(frame->GetHeight());
802 frame->GetUpperHR()->UnmapWindow();
803 frame->GetLowerHR()->UnmapWindow();
804 frame->GetLeftVR()->UnmapWindow();
805 frame->GetRightVR()->UnmapWindow();
806 frame->GetUpperLeftCR()->UnmapWindow();
807 frame->GetUpperRightCR()->UnmapWindow();
808 frame->GetLowerLeftCR()->UnmapWindow();
809 frame->GetLowerRightCR()->UnmapWindow();
811 frame->MoveResize(fBorderWidth, fBorderWidth, fWidth - 2 *fBorderWidth,
812 fHeight - 2 * fBorderWidth);
814 frame->GetTitleBar()->LayoutButtons(frame->GetMdiButtons(), frame->IsMinimized(),
815 frame->IsMaximized());
816 frame->GetTitleBar()->RemoveFrames(frame->GetTitleBar()->GetWinIcon(),
817 frame->GetTitleBar()->GetButtons());
818 frame->HideFrame(frame->GetTitleBar());
821 frame->GetTitleBar()->GetWinIcon()->SetBackgroundColor(GetDefaultFrameBackground());
822 frame->GetTitleBar()->GetButtons()->SetBackgroundColor(GetDefaultFrameBackground());
823 fMenuBar->AddFrames(frame->GetTitleBar()->GetWinIcon(),
824 frame->GetTitleBar()->GetButtons());
828 SendMessage(fParent, MK_MSG(kC_MDI, kMDI_MAXIMIZE), frame->GetId(), 0);
829 FrameMaximized(frame->GetId());
837 void TGMdiMainFrame::Restore(TGMdiFrame *mdiframe)
839 TGMdiDecorFrame *frame = GetDecorFrame(mdiframe);
843 if (frame->IsMinimized() == kFALSE && frame->IsMaximized() == kFALSE)
return;
845 if (frame->IsMinimized()) {
846 frame->SetMinimizedX(frame->GetX());
847 frame->SetMinimizedY(frame->GetY());
848 frame->Minimize(kFALSE);
849 frame->GetTitleBar()->SetTitleBarColors(fForeCurrent,
852 }
else if (frame->IsMaximized()) {
853 frame->SetDecorBorderWidth(TGMdiDecorFrame::kMdiBorderWidth);
854 frame->MapSubwindows();
857 fMenuBar->RemoveFrames(frame->GetTitleBar()->GetWinIcon(),
858 frame->GetTitleBar()->GetButtons());
862 frame->GetTitleBar()->AddFrames(frame->GetTitleBar()->GetWinIcon(),
863 frame->GetTitleBar()->GetButtons());
864 frame->GetTitleBar()->SetTitleBarColors(fForeCurrent, fBackCurrent,
866 frame->ShowFrame(frame->GetTitleBar());
868 frame->Minimize(kFALSE);
869 frame->Maximize(kFALSE);
870 frame->GetTitleBar()->LayoutButtons(frame->GetMdiButtons(), kFALSE, kFALSE);
871 frame->MoveResize(frame->GetPreResizeX(), frame->GetPreResizeY(),
872 frame->GetPreResizeWidth(), frame->GetPreResizeHeight());
873 SetCurrent(mdiframe);
874 SendMessage(fParent, MK_MSG(kC_MDI, kMDI_RESTORE), frame->GetId(), 0);
875 FrameRestored(frame->GetId());
883 void TGMdiMainFrame::Minimize(TGMdiFrame *mdiframe)
886 TGMdiDecorFrame *frame = GetDecorFrame(mdiframe);
890 if (frame->IsMinimized())
return;
892 if (frame->IsMaximized()) Restore(mdiframe);
894 frame->SetPreResizeX(frame->GetX());
895 frame->SetPreResizeY(frame->GetY());
896 frame->SetPreResizeWidth(frame->GetWidth());
897 frame->SetPreResizeHeight(frame->GetHeight());
899 h = frame->GetTitleBar()->GetDefaultHeight() + frame->GetBorderWidth();
900 w = kMinimizedWidth * h + frame->GetBorderWidth();
902 if (!frame->GetMinUserPlacement()) {
905 y = GetViewPort()->GetHeight() - h;
908 TGMdiFrameList *travel;
909 Bool_t taken = kFALSE;
912 for (travel = fChildren; travel; travel = travel->GetNext()) {
913 if (travel->GetDecorFrame()->IsMinimized()) {
914 TGPosition p(travel->GetDecorFrame()->GetX(),
915 travel->GetDecorFrame()->GetY());
916 TGDimension s(travel->GetDecorFrame()->GetWidth(),
917 travel->GetDecorFrame()->GetHeight());
918 if ((x <= p.fX + (Int_t) s.fWidth - 1) && (x + w - 1 >= p.fX) &&
919 (y <= p.fY + (Int_t) s.fHeight - 1) && (y + h - 1 >= p.fY)) {
928 if (x + w > (Int_t)GetViewPort()->GetWidth()) {
934 frame->SetMinimizedX(x);
935 frame->SetMinimizedY(y);
940 frame->MoveResize(frame->GetMinimizedX(), frame->GetMinimizedY(), w, h);
941 frame->LowerWindow();
942 frame->GetTitleBar()->LayoutButtons(frame->GetMdiButtons(),
943 frame->IsMinimized(),
944 frame->IsMaximized());
947 SendMessage(fParent, MK_MSG(kC_MDI, kMDI_MINIMIZE), frame->GetId(), 0);
948 FrameMinimized(frame->GetId());
956 Int_t TGMdiMainFrame::Close(TGMdiFrame *mdiframe)
958 if (!mdiframe)
return kFALSE;
960 TGMdiDecorFrame *frame = GetDecorFrame(mdiframe);
962 mdiframe->Emit(
"CloseWindow()");
963 if (frame && mdiframe->TestBit(kNotDeleted) && !mdiframe->TestBit(TGMdiFrame::kDontCallClose))
964 return frame->CloseWindow();
971 void TGMdiMainFrame::FreeMove(TGMdiFrame *mdiframe)
973 TGMdiDecorFrame *frame = GetDecorFrame(mdiframe);
976 Int_t x = frame->GetTitleBar()->GetWidth() / 2;
977 Int_t y = frame->GetTitleBar()->GetHeight() - 1;
979 gVirtualX->Warp(x, y, frame->GetTitleBar()->GetId());
981 frame->GetTitleBar()->SetLeftButPressed();
982 frame->GetTitleBar()->SetX0(x);
983 frame->GetTitleBar()->SetY0(y);
984 Cursor_t cursor = gVirtualX->CreateCursor(kMove);
985 gVirtualX->SetCursor(frame->GetTitleBar()->GetId(), cursor);
987 gVirtualX->GrabPointer(frame->GetTitleBar()->GetId(),
988 kButtonReleaseMask | kPointerMotionMask,
989 kNone, cursor, kTRUE, kFALSE);
995 void TGMdiMainFrame::FreeSize(TGMdiFrame *mdiframe)
997 TGMdiDecorFrame *frame = GetDecorFrame(mdiframe);
1000 Int_t x = frame->GetLowerRightCR()->GetWidth() - 5;
1001 Int_t y = frame->GetLowerRightCR()->GetHeight() - 5;
1006 gVirtualX->TranslateCoordinates(frame->GetLowerRightCR()->GetId(),
1007 fClient->GetDefaultRoot()->GetId(), x, y, xroot, yroot, win);
1009 gVirtualX->Warp(x, y, frame->GetLowerRightCR()->GetId());
1013 event.fType = kButtonPress;
1014 event.fWindow = frame->GetLowerRightCR()->GetId();
1015 event.fCode = kButton1;
1018 event.fXRoot = xroot;
1019 event.fYRoot = yroot;
1021 Cursor_t cursor = gVirtualX->CreateCursor(kBottomRight);
1022 gVirtualX->SetCursor(frame->GetLowerRightCR()->GetId(), cursor);
1024 gVirtualX->GrabPointer(frame->GetLowerRightCR()->GetId(),
1025 kButtonReleaseMask | kPointerMotionMask,
1026 kNone, cursor, kTRUE, kFALSE);
1028 frame->GetLowerRightCR()->HandleButton(&event);
1034 Int_t TGMdiMainFrame::ContextHelp(TGMdiFrame *mdiframe)
1037 return mdiframe->Help();
1045 TGMdiFrame *TGMdiMainFrame::GetCurrent()
const
1048 return fCurrent->GetDecorFrame()->GetMdiFrame();
1056 TGMdiGeometry TGMdiMainFrame::GetWindowGeometry(TGMdiFrame *f)
const
1060 geom.fValueMask = 0;
1062 const TGMdiDecorFrame *frame = GetDecorFrame(f);
1064 Int_t th = frame->GetTitleBar()->GetDefaultHeight();
1065 Int_t bw = frame->GetBorderWidth();
1067 if (frame->IsMinimized() || frame->IsMaximized()) {
1068 geom.fDecoration = TGRectangle(frame->GetPreResizeX(),
1069 frame->GetPreResizeY(),
1070 (unsigned) frame->GetPreResizeWidth(),
1071 (unsigned) frame->GetPreResizeHeight());
1073 geom.fDecoration = TGRectangle(frame->GetX(),
1075 (unsigned) frame->GetWidth(),
1076 (unsigned) frame->GetHeight());
1078 geom.fValueMask |= kMdiDecorGeometry;
1080 geom.fClient = TGRectangle(geom.fDecoration.fX + bw,
1081 geom.fDecoration.fY + bw + th,
1082 (
unsigned) (geom.fDecoration.fW - 2 * bw),
1083 (
unsigned) (geom.fDecoration.fH - 2 * bw - th));
1084 geom.fValueMask |= kMdiClientGeometry;
1086 if (frame->GetMinUserPlacement()) {
1087 Int_t mh = th + 2 * bw;
1088 Int_t mw = kMinimizedWidth * mh;
1090 geom.fIcon = TGRectangle(frame->GetMinimizedX(),
1091 frame->GetMinimizedY(),
1094 geom.fValueMask |= kMdiIconGeometry;
1105 void TGMdiMainFrame::ConfigureWindow(TGMdiFrame *f, TGMdiGeometry &geom)
1107 TGMdiDecorFrame *frame = GetDecorFrame(f);
1109 if (geom.fValueMask & kMdiDecorGeometry) {
1110 if (frame->IsMinimized() || frame->IsMaximized()) {
1111 frame->SetPreResizeX(geom.fDecoration.fX);
1112 frame->SetPreResizeY(geom.fDecoration.fY);
1113 frame->SetPreResizeWidth(geom.fDecoration.fW);
1114 frame->SetPreResizeHeight(geom.fDecoration.fH);
1116 frame->MoveResize(geom.fDecoration.fX, geom.fDecoration.fY,
1117 geom.fDecoration.fW, geom.fDecoration.fH);
1119 }
else if (geom.fValueMask & kMdiClientGeometry) {
1122 if (geom.fValueMask & kMdiIconGeometry) {
1123 frame->SetMinimizedX(geom.fIcon.fX);
1124 frame->SetMinimizedY(geom.fIcon.fY);
1125 frame->SetMinUserPlacement();
1126 if (frame->IsMinimized())
1127 frame->Move(frame->GetMinimizedX(), frame->GetMinimizedY());
1136 void TGMdiMainFrame::CloseAll()
1138 TGMdiFrameList *tmp, *travel = fChildren;
1141 tmp = travel->GetNext();
1143 Close(GetCurrent());
1151 Bool_t TGMdiMainFrame::IsMaximized(TGMdiFrame *f)
1153 TGMdiDecorFrame *frame = GetDecorFrame(f);
1154 if (frame)
return frame->IsMaximized();
1161 Bool_t TGMdiMainFrame::IsMinimized(TGMdiFrame *f)
1163 TGMdiDecorFrame *frame = GetDecorFrame(f);
1164 if (frame)
return frame->IsMinimized();
1171 TGMdiContainer::TGMdiContainer(
const TGMdiMainFrame *p, Int_t w, Int_t h,
1172 UInt_t options, ULong_t back) :
1173 TGFrame(p->GetViewPort(), w, h, options, back)
1176 AddInput(kStructureNotifyMask);
1182 TGDimension TGMdiContainer::GetDefaultSize()
const
1184 TGRectangle rect = fMain->GetBBox();
1186 Int_t xpos = -fMain->GetViewPort()->GetHPos() - rect.LeftTop().fX;
1187 Int_t ypos = -fMain->GetViewPort()->GetVPos() - rect.LeftTop().fY;
1189 return TGDimension(TMath::Max(Int_t(xpos + fWidth), rect.RightBottom().fX + 1),
1190 TMath::Max(Int_t(ypos + fHeight), rect.RightBottom().fY + 1));
1196 Bool_t TGMdiContainer::HandleConfigureNotify(Event_t *event)
1198 if (event->fWindow != fId) {
1199 TGRectangle rect = fMain->GetBBox();
1201 Int_t vw = fMain->GetViewPort()->GetWidth();
1202 Int_t vh = fMain->GetViewPort()->GetHeight();
1204 Int_t w = TMath::Max(vw, rect.RightBottom().fX + 1);
1205 Int_t h = TMath::Max(vh, rect.RightBottom().fY + 1);
1207 if ((w != (Int_t)fWidth) || (h != (Int_t)fHeight)) {
1208 ((TGMdiMainFrame*)fMain)->Layout();
1218 void TGMdiMainFrame::SavePrimitive(std::ostream &out, Option_t *option )
1220 if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);
1222 out << std::endl <<
" // MDI main frame" << std::endl;
1223 out <<
" TGMdiMainFrame *";
1224 out << GetName() <<
" = new TGMdiMainFrame(" << fParent->GetName()
1225 <<
"," << GetMenu()->GetName() <<
"," << GetWidth() <<
"," << GetHeight();
1227 if (fBackground == GetDefaultFrameBackground()) {
1228 if (!GetOptions()) {
1229 out <<
");" << std::endl;
1231 out <<
"," << GetOptionString() <<
");" << std::endl;
1234 out <<
"," << GetOptionString() <<
",ucolor);" << std::endl;
1236 if (option && strstr(option,
"keep_names"))
1237 out <<
" " << GetName() <<
"->SetName(\"" << GetName() <<
"\");" << std::endl;
1239 TGMdiFrameList *travel=fChildren;
1240 travel->SetCycleNext(travel);
1241 for (travel = fChildren; travel; travel = travel->GetNext()) {
1242 TGMdiFrame *mf = travel->GetDecorFrame()->GetMdiFrame();
1243 if (mf) mf->SavePrimitive(out, option);
1245 if (fArrangementMode) {
1246 out <<
" " << GetName() <<
"->ArrangeFrames(";
1247 switch (fArrangementMode) {
1249 case kMdiTileHorizontal:
1250 out <<
"kMdiTileHorizontal);" << std::endl;
1253 case kMdiTileVertical:
1254 out <<
"kMdiTileVertical);" << std::endl;
1258 out <<
"kMdiCascade);" << std::endl;
1262 if (fResizeMode != kMdiOpaque)
1263 out <<
" " << GetName() <<
"->SetResizeMode(kMdiNonOpaque);" << std::endl;
1266 out <<
" " << GetName() <<
"->SetCurrent(" << GetCurrent()->GetName()
1267 <<
");" << std::endl;