71 #include "RConfigure.h"
75 TGGC *TGContainer::fgLineGC = 0;
77 const Int_t kAutoScrollFudge = 10;
78 const Int_t kAcceleration[kAutoScrollFudge+1] = {1,1,1,2,3,4,6,7,8,16,32};
79 const Int_t kKeyboardTime = 700;
83 ClassImp(TGContainer);
88 class TGContainerKeyboardTimer :
public TTimer {
90 TGContainer *fContainer;
92 TGContainerKeyboardTimer(TGContainer *t) : TTimer(kKeyboardTime) { fContainer = t; }
99 Bool_t TGContainerKeyboardTimer::Notify()
101 fContainer->SearchPattern();
103 if (gSystem) gSystem->RemoveTimer(
this);
109 class TGContainerScrollTimer :
public TTimer {
111 TGContainer *fContainer;
113 TGContainerScrollTimer(TGContainer *t) : TTimer(50) { fContainer = t; }
120 Bool_t TGContainerScrollTimer::Notify()
122 fContainer->OnAutoScroll();
131 TGViewPort::TGViewPort(
const TGWindow *p, UInt_t w, UInt_t h,
132 UInt_t options, ULong_t back) :
133 TGCompositeFrame(p, w, h, options, back)
138 AddInput(kStructureNotifyMask);
140 fEditDisabled = kEditDisable | kEditDisableGrab;
148 void TGViewPort::SetContainer(TGFrame *f)
151 RemoveFrame(fContainer);
159 fContainer->SetEditDisabled(fContainer->GetEditDisabled() | kEditDisableGrab);
161 if (fContainer->InheritsFrom(TGContainer::Class())) {
162 ((TGContainer*)fContainer)->fViewPort =
this;
163 if (fParent->InheritsFrom(TGCanvas::Class())) {
164 ((TGContainer*)fContainer)->fCanvas = (TGCanvas*)fParent;
173 void TGViewPort::SetHPos(Int_t xpos)
177 if (!fContainer)
return;
179 if (!fContainer->InheritsFrom(TGContainer::Class())) {
180 fContainer->Move(fX0 = xpos, fY0);
183 if (((TGContainer*)fContainer)->fMapSubwindows) {
184 fContainer->Move(fX0 = xpos, fY0);
189 if (-xpos < 0)
return;
190 else diff = xpos - fX0;
196 #if defined(R__HAS_COCOA)
199 ((TGContainer*)fContainer)->DrawRegion(0, 0, fWidth, fHeight);
201 UInt_t adiff = TMath::Abs(diff);
203 if (adiff < fWidth) {
205 gVirtualX->CopyArea(fContainer->GetId(), fContainer->GetId(), GetWhiteGC()(),
206 adiff, 0, fWidth - adiff, fHeight, 0, 0);
208 ((TGContainer*)fContainer)->DrawRegion(fWidth - adiff, 0, adiff, fHeight);
210 gVirtualX->CopyArea(fContainer->GetId(), fContainer->GetId(), GetWhiteGC()(),
211 0, 0, fWidth - adiff, fHeight, adiff, 0);
213 ((TGContainer*)fContainer)->DrawRegion(0, 0, adiff, fHeight);
216 ((TGContainer*)fContainer)->DrawRegion(0, 0, fWidth, fHeight);
224 void TGViewPort::SetVPos(Int_t ypos)
228 if (!fContainer)
return;
231 if (!fContainer->InheritsFrom(TGContainer::Class())) {
232 fContainer->Move(fX0, fY0 = ypos);
235 if (((TGContainer*)fContainer)->fMapSubwindows) {
236 fContainer->Move(fX0, fY0 = ypos);
241 if (-ypos < 0)
return;
242 else diff = ypos - fY0;
248 #if defined(R__HAS_COCOA)
251 ((TGContainer*)fContainer)->DrawRegion(0, 0, fWidth, fHeight);
253 UInt_t adiff = TMath::Abs(diff);
255 if (adiff < fHeight) {
257 gVirtualX->CopyArea(fContainer->GetId(), fContainer->GetId(), GetWhiteGC()(),
258 0, adiff, fWidth, fHeight - adiff, 0, 0);
260 ((TGContainer*)fContainer)->DrawRegion(0, fHeight - adiff, fWidth, adiff);
262 gVirtualX->CopyArea(fContainer->GetId(), fContainer->GetId(), GetWhiteGC()(),
263 0, 0, fWidth, fHeight - adiff, 0, adiff);
265 ((TGContainer*)fContainer)->DrawRegion(0, 0, fWidth, adiff);
268 ((TGContainer*)fContainer)->DrawRegion(0, 0, fWidth, fHeight);
276 void TGViewPort::SetPos(Int_t xpos, Int_t ypos)
278 if (!fContainer)
return;
287 Bool_t TGViewPort::HandleConfigureNotify(Event_t *event)
289 if (!fContainer->InheritsFrom(TGContainer::Class())) {
290 TGFrame::HandleConfigureNotify(event);
294 TGContainer *cont = (TGContainer*)fContainer;
297 if ((event->fWidth > 32768) || (
event->fHeight > 32768)) {
301 cont->DrawRegion(event->fX, event->fY, event->fWidth, event->fHeight);
311 TGContainer::TGContainer(
const TGWindow *p, UInt_t w, UInt_t h,
312 UInt_t options, ULong_t back) :
313 TGCompositeFrame(p, w, h, options, back)
315 fXp = fYp = fX0 = fY0 = fXf = fYf = fXDND = fYDND = 0;
320 fTotal = fSelected = 0;
321 fMapSubwindows = kFALSE;
322 fOnMouseOver = kFALSE;
326 fLastSubstring = kFALSE;
328 fKeyTimer =
new TGContainerKeyboardTimer(
this);
329 fScrollTimer =
new TGContainerScrollTimer(
this);
330 fKeyTimerActive = kFALSE;
333 fExposedRegion.Empty();
335 gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
336 kButtonPressMask | kButtonReleaseMask |
337 kPointerMotionMask, kNone, kNone);
339 AddInput(kKeyPressMask | kPointerMotionMask);
342 SetWindowAttributes_t wattr;
343 wattr.fMask = kWAWinGravity | kWABitGravity;
344 wattr.fBitGravity = 1;
345 wattr.fWinGravity = 1;
346 gVirtualX->ChangeWindowAttributes(fId, &wattr);
348 fEditDisabled = kEditDisableGrab | kEditDisableBtnEnable;
356 TGContainer::TGContainer(TGCanvas *p, UInt_t options, ULong_t back) :
357 TGCompositeFrame(p->GetViewPort(), p->GetWidth(), p->GetHeight(), options, back)
359 fXp = fYp = fX0 = fY0 = fXf = fYf = fXDND = fYDND = 0;
362 fMsgWindow = p->GetViewPort();
364 fCanvas->GetViewPort()->SetContainer(
this);
365 p->GetViewPort()->SetBackgroundColor(back);
368 fTotal = fSelected = 0;
369 fMapSubwindows = kFALSE;
370 fOnMouseOver = kFALSE;
374 fLastSubstring = kFALSE;
376 fKeyTimer =
new TGContainerKeyboardTimer(
this);
377 fScrollTimer =
new TGContainerScrollTimer(
this);
378 fKeyTimerActive = kFALSE;
380 fExposedRegion.Empty();
382 gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
383 kButtonPressMask | kButtonReleaseMask |
384 kPointerMotionMask, kNone, kNone);
386 AddInput(kKeyPressMask | kPointerMotionMask);
389 SetWindowAttributes_t wattr;
390 wattr.fMask = kWAWinGravity | kWABitGravity;
391 wattr.fBitGravity = 1;
392 wattr.fWinGravity = 1;
393 gVirtualX->ChangeWindowAttributes(fId, &wattr);
395 fEditDisabled = kEditDisableGrab | kEditDisableBtnEnable;
401 TGContainer::~TGContainer()
403 if (TGSearchDialog::SearchDialog()) {
404 TQObject::Disconnect(TGSearchDialog::SearchDialog(), 0,
this);
417 void TGContainer::Layout()
419 TGCompositeFrame::Layout();
420 TGLayoutManager *lm = GetLayoutManager();
423 if (lm && lm->IsModified()) ClearViewPort();
429 void TGContainer::CurrentChanged(Int_t x, Int_t y)
436 Emit(
"CurrentChanged(Int_t,Int_t)",args);
442 void TGContainer::CurrentChanged(TGFrame* f)
444 Emit(
"CurrentChanged(TGFrame*)", (Long_t)f);
465 void TGContainer::KeyPressed(TGFrame *frame, UInt_t keysym, UInt_t mask)
468 args[0] = (Long_t)frame;
469 args[1] = (Long_t)keysym;
470 args[2] = (Long_t)mask;
471 Emit(
"KeyPressed(TGFrame*,UInt_t,UInt_t)", args);
472 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_KEY), keysym, mask);
479 void TGContainer::ReturnPressed(TGFrame* f)
481 Emit(
"ReturnPressed(TGFrame*)", (Long_t)f);
488 void TGContainer::SpacePressed(TGFrame* f)
490 Emit(
"SpacePressed(TGFrame*)", (Long_t)f);
496 void TGContainer::OnMouseOver(TGFrame* f)
498 if (!fOnMouseOver) Emit(
"OnMouseOver(TGFrame*)", (Long_t)f);
499 fOnMouseOver = kTRUE;
505 void TGContainer::Clicked(TGFrame *entry, Int_t btn)
509 args[0] = (Long_t)entry;
512 Emit(
"Clicked(TGFrame*,Int_t)", args);
518 void TGContainer::Clicked(TGFrame *entry, Int_t btn, Int_t x, Int_t y)
522 args[0] = (Long_t)entry;
527 Emit(
"Clicked(TGFrame*,Int_t,Int_t,Int_t)", args);
533 void TGContainer::DoubleClicked(TGFrame *entry, Int_t btn)
537 args[0] = (Long_t)entry;
540 Emit(
"DoubleClicked(TGFrame*,Int_t)", args);
546 void TGContainer::DoubleClicked(TGFrame *entry, Int_t btn, Int_t x, Int_t y)
550 args[0] = (Long_t)entry;
555 Emit(
"DoubleClicked(TGFrame*,Int_t,Int_t,Int_t)", args);
562 void TGContainer::SelectAll()
568 while ((el = (TGFrameElement *) next())) {
570 if (!fr->IsActive()) {
575 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_SELCHANGED),
584 void TGContainer::UnSelectAll()
590 while ((el = (TGFrameElement *) next())) {
592 if (fr->IsActive()) {
599 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_SELCHANGED),
602 Emit(
"UnSelectAll()");
609 void TGContainer::InvertSelection()
616 while ((el = (TGFrameElement *) next())) {
617 if (!el->fFrame->IsActive()) {
625 fSelected = selected;
627 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_SELCHANGED),
630 Emit(
"InvertSelection()");
636 void TGContainer::RemoveAll()
641 while ((el = (TGFrameElement *) next())) {
642 el->fFrame->DestroyWindow();
648 fSelected = fTotal = 0;
655 void TGContainer::RemoveItem(TGFrame *item)
659 while ((el = (TGFrameElement *) next())) {
660 if (item == el->fFrame) {
661 if (fLastActiveEl && item == fLastActiveEl->fFrame) fLastActiveEl = 0;
662 item->DestroyWindow();
676 const TGFrame *TGContainer::GetNextSelected(
void **current)
679 TObjLink *lnk = (TObjLink *) *current;
681 lnk = (lnk == 0) ? fList->FirstLink() : lnk->Next();
683 f = (TGFrame *) ((TGFrameElement *) lnk->GetObject())->fFrame;
685 *current = (
void *) lnk;
696 void TGContainer::ActivateItem(TGFrameElement *el)
698 TGFrame *fr = el->fFrame;
701 if (fLastActiveEl != el) {
703 CurrentChanged(fLastActiveEl->fFrame->GetX(), fLastActiveEl->fFrame->GetY());
704 CurrentChanged(fLastActiveEl->fFrame);
708 if (!fSelected) fSelected = 1;
710 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_SELCHANGED), fTotal, fSelected);
712 TGPosition pos = GetPagePosition();
713 DrawRegion(fr->GetX() - pos.fX, fr->GetY() - pos.fY, fr->GetWidth(), fr->GetHeight());
719 void TGContainer::DeActivateItem(TGFrameElement *el)
721 TGFrame *fr = el->fFrame;
722 fr->Activate(kFALSE);
723 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_SELCHANGED), fTotal, fSelected);
725 TGPosition pos = GetPagePosition();
726 DrawRegion(fr->GetX() - pos.fX, fr->GetY() - pos.fY, fr->GetWidth(), fr->GetHeight());
732 TGPosition TGContainer::GetPagePosition()
const
735 if (!fViewPort)
return ret;
737 ret.fX = -fViewPort->GetHPos();
738 ret.fY = -fViewPort->GetVPos();
746 TGDimension TGContainer::GetPageDimension()
const
749 if (!fViewPort)
return ret;
751 ret.fWidth = fViewPort->GetWidth();
752 ret.fHeight = fViewPort->GetHeight();
759 void TGContainer::SetPagePosition(
const TGPosition& pos)
761 if (!fViewPort)
return;
762 fViewPort->SetPos(pos.fX, pos.fY);
768 void TGContainer::SetPagePosition(Int_t x, Int_t y)
770 if (!fViewPort)
return;
771 fViewPort->SetPos(x, y);
777 void TGContainer::SetPageDimension(
const TGDimension& dim)
779 if (!fViewPort)
return;
780 fViewPort->Resize(dim);
786 void TGContainer::SetPageDimension(UInt_t w, UInt_t h)
788 if (!fViewPort)
return;
789 fViewPort->Resize(w, h);
795 void TGContainer::DoRedraw()
798 DrawRegion(0, 0, GetWidth(), GetHeight());
800 if (!fExposedRegion.IsEmpty()) {
801 DrawRegion(fExposedRegion.fX, fExposedRegion.fY,
802 fExposedRegion.fW, fExposedRegion.fH);
804 fExposedRegion.Empty();
814 void TGContainer::DrawRegion(Int_t x, Int_t y, UInt_t w, UInt_t h)
816 static GContext_t gcBg = 0;
819 if (!fViewPort)
return;
821 if ((x > (Int_t)fViewPort->GetWidth()) || (y > (Int_t)fViewPort->GetHeight())) {
827 w = x + w > fViewPort->GetWidth() ? fViewPort->GetWidth() - x : w;
828 h = y + h > fViewPort->GetHeight() ? fViewPort->GetHeight() - y : h;
830 if (((Int_t)w < 1) || ((Int_t)h < 1)) {
834 if (!fMapSubwindows) {
835 pixmap = gVirtualX->CreatePixmap(fId, w, h);
839 gcValues.fForeground = fBackground;
840 gcValues.fBackground = fBackground;
841 gcValues.fGraphicsExposures = kTRUE;
842 gcValues.fMask = kGCForeground | kGCBackground | kGCGraphicsExposures;
843 gcBg = gVirtualX->CreateGC(fId, &gcValues);
846 gVirtualX->SetForeground(gcBg, fBackground);
847 gVirtualX->FillRectangle(pixmap, gcBg, 0, 0, w, h);
850 TGPosition pos = GetPagePosition();
853 Int_t xx = pos.fX + x;
854 Int_t yy = pos.fY + y;
859 while ((el = (TGFrameElement *) next())) {
860 if ((Int_t(el->fFrame->GetY()) > yy - (Int_t)el->fFrame->GetHeight()) &&
861 (Int_t(el->fFrame->GetX()) > xx - (Int_t)el->fFrame->GetWidth()) &&
862 (Int_t(el->fFrame->GetY()) < yy + Int_t(h + el->fFrame->GetHeight())) &&
863 (Int_t(el->fFrame->GetX()) < xx + Int_t(w + el->fFrame->GetWidth()))) {
866 if (!fMapSubwindows) {
867 Int_t fx = el->fFrame->GetX() - xx;
868 Int_t fy = el->fFrame->GetY() - yy;
869 el->fFrame->DrawCopy(pixmap, fx, fy);
871 fClient->NeedRedraw(el->fFrame);
876 if (fMapSubwindows)
return;
878 gVirtualX->CopyArea(pixmap, fId, gcBg, 0, 0, w, h, x, y);
879 gVirtualX->DeletePixmap(pixmap);
880 gVirtualX->Update(kFALSE);
886 void TGContainer::ClearViewPort()
888 if (!fViewPort)
return;
889 fExposedRegion.fW = fViewPort->GetWidth();
890 fExposedRegion.fH = fViewPort->GetHeight();
891 fExposedRegion.fX = fExposedRegion.fY = 0;
892 fClient->NeedRedraw(
this);
898 Bool_t TGContainer::HandleExpose(Event_t *event)
900 if (fMapSubwindows)
return TGCompositeFrame::HandleExpose(event);
902 if (event->fWindow == GetId()) {
903 TGPosition pos(event->fX, event->fY);
904 TGDimension dim(event->fWidth, event->fHeight);
905 TGRectangle rect(pos, dim);
907 if (fExposedRegion.IsEmpty()) {
908 fExposedRegion = rect;
910 fExposedRegion.Merge(rect);
913 fClient->NeedRedraw(
this);
915 TGCompositeFrame::HandleExpose(event);
924 Bool_t TGContainer::HandleButton(Event_t *event)
926 Int_t total, selected, page = 0;
928 TGPosition pos = GetPagePosition();
929 TGDimension dim = GetPageDimension();
931 page = dim.fHeight/4;
933 if (event->fCode == kButton4) {
935 newpos = pos.fY - page;
936 if (newpos < 0) newpos = 0;
937 fCanvas->SetVsbPosition(newpos);
940 if (event->fCode == kButton5) {
942 newpos = fCanvas->GetVsbPosition() + page;
943 fCanvas->SetVsbPosition(newpos);
947 Int_t xx = pos.fX +
event->fX;
948 Int_t yy = pos.fY +
event->fY;
950 if (event->fType == kButtonPress) {
951 gVirtualX->SetInputFocus(fId);
953 fXp = pos.fX +
event->fX;
954 fYp = pos.fY +
event->fY;
961 total = selected = 0;
965 Bool_t select_frame = kFALSE;
967 while ((el = (TGFrameElement *) next())) {
968 select_frame = kFALSE;
970 if (!fMapSubwindows) {
971 if ((Int_t(el->fFrame->GetY()) + (Int_t)el->fFrame->GetHeight() > yy ) &&
972 (Int_t(el->fFrame->GetX()) + (Int_t)el->fFrame->GetWidth() > xx ) &&
973 (Int_t(el->fFrame->GetY()) < yy) &&
974 (Int_t(el->fFrame->GetX()) < xx)) {
975 select_frame = kTRUE;
978 if (el->fFrame->GetId() == (Window_t)event->fUser[0]) {
979 select_frame = kTRUE;
986 Clicked(el->fFrame, event->fCode);
987 Clicked(el->fFrame, event->fCode, event->fXRoot, event->fYRoot);
992 if (fTotal != total || fSelected != selected) {
994 fSelected = selected;
995 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_SELCHANGED),
999 if ( selected == 0 ) {
1003 gVirtualX->DrawRectangle(fId, GetLineGC()(), fX0-pos.fX, fY0-pos.fY,
1008 if (event->fType == kButtonRelease) {
1009 gVirtualX->SetInputFocus(fId);
1014 fScrolling = kFALSE;
1016 if (gSystem) gSystem->RemoveTimer(fScrollTimer);
1017 gVirtualX->DrawRectangle(fId, GetLineGC()(), fX0-pos.fX, fY0-pos.fY,
1022 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_ITEMCLICK),
1023 event->fCode, (event->fYRoot << 16) | event->fXRoot);
1034 const TGPicture *TGContainer::GetObjPicture(TGFrame *f)
1038 const TGPicture *pic=0;
1039 const char *iconname = 0;
1041 if (f->InheritsFrom(
"TGLVEntry")) {
1042 obj = (TObject *)((TGLVEntry *)f)->GetUserData();
1044 if (obj->IsA() == TKey::Class()) {
1045 cl = TClass::GetClass(((TKey *)obj)->GetClassName());
1046 }
else if (obj->IsA() == TKeyMapFile::Class()) {
1047 cl = TClass::GetClass(((TKeyMapFile *)obj)->GetTitle());
1051 const char *name = obj->GetIconName();
1052 if (((name == 0) || (!name[0])) && (cl != 0))
1053 name = cl->GetName();
1054 iconname = ((name != 0) && (strlen(name) > 0)) ? name : obj->GetName();
1056 if (obj->IsA()->InheritsFrom(
"TGeoVolume")) {
1057 iconname = obj->GetIconName() ? obj->GetIconName() : obj->IsA()->GetName();
1059 pic = fClient->GetMimeTypeList()->GetIcon(iconname, kFALSE);
1063 if (obj && obj->IsFolder()) {
1064 pic = fClient->GetPicture(
"folder_s.xpm");
1066 pic = fClient->GetPicture(
"doc_s.xpm");
1075 void TGContainer::SetDragPixmap(
const TGPicture *p)
1078 TGPicture *selpic =
new TGSelectedPicture(gClient, p);
1079 pic = selpic->GetPicture();
1080 mask = selpic->GetMask();
1083 gDNDManager->SetDragPixmap(pic, mask, p->GetWidth()/2, 2+p->GetHeight()/2);
1085 gVirtualX->DeletePixmap(pic);
1086 gVirtualX->DeletePixmap(mask);
1093 Bool_t TGContainer::HandleDoubleClick(Event_t *event)
1098 TGPosition pos = GetPagePosition();
1100 Int_t xx = pos.fX +
event->fX;
1101 Int_t yy = pos.fY +
event->fY;
1103 Bool_t select_frame = kFALSE;
1105 while ((el = (TGFrameElement *) next())) {
1106 select_frame = kFALSE;
1108 if (!fMapSubwindows) {
1109 if ((Int_t(el->fFrame->GetY()) + (Int_t)el->fFrame->GetHeight() > yy) &&
1110 (Int_t(el->fFrame->GetX()) + (Int_t)el->fFrame->GetWidth() > xx) &&
1111 (Int_t(el->fFrame->GetY()) < yy) &&
1112 (Int_t(el->fFrame->GetX()) < xx)) {
1113 select_frame = kTRUE;
1116 if (el->fFrame->GetId() == (Window_t)event->fUser[0]) {
1117 select_frame = kTRUE;
1122 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_ITEMDBLCLICK),
1123 event->fCode, (event->fYRoot << 16) | event->fXRoot);
1125 DoubleClicked(el->fFrame, event->fCode);
1126 DoubleClicked(el->fFrame, event->fCode, event->fXRoot, event->fYRoot);
1136 Bool_t TGContainer::HandleMotion(Event_t *event)
1138 int xf0, yf0, xff, yff, total, selected;
1140 TGPosition pos = GetPagePosition();
1141 TGDimension dim = GetPageDimension();
1142 Int_t x = pos.fX +
event->fX;
1143 Int_t y = pos.fY +
event->fY;
1144 TGFrameElement *el = 0;
1146 fOnMouseOver = kFALSE;
1148 Bool_t wasScrolling = fScrolling;
1150 if (gDNDManager->IsDragging()) {
1151 gDNDManager->Drag(event->fXRoot, event->fYRoot,
1152 TGDNDManager::GetDNDActionCopy(), event->fTime);
1154 else if (fDragging) {
1156 gVirtualX->DrawRectangle(fId, GetLineGC()(), fX0-pos.fX, fY0-pos.fY,
1158 fX0 = TMath::Min(fXp,x);
1159 fY0 = TMath::Min(fYp,y);
1160 fXf = TMath::Max(fXp,x);
1161 fYf = TMath::Max(fYp,y);
1163 total = selected = 0;
1165 if (event->fX > Int_t(dim.fWidth) - kAutoScrollFudge) {
1168 }
else if (event->fX < kAutoScrollFudge) {
1171 }
else if (event->fY > Int_t(dim.fHeight) - kAutoScrollFudge) {
1174 }
else if (event->fY < kAutoScrollFudge) {
1179 fScrolling = kFALSE;
1184 while ((el = (TGFrameElement *) next())) {
1187 xf0 = f->GetX() + (f->GetWidth() >> 3);
1188 yf0 = f->GetY() + (f->GetHeight() >> 3);
1189 xff = xf0 + f->GetWidth() - (f->GetWidth() >> 2);
1190 yff = yf0 + f->GetHeight() - (f->GetHeight() >> 2);
1192 if (((xf0 > fX0 && xf0 < fXf) ||
1193 (xff > fX0 && xff < fXf)) &&
1194 ((yf0 > fY0 && yf0 < fYf) ||
1195 (yff > fY0 && yff < fYf))) {
1196 if (!el->fFrame->IsActive())
1198 gVirtualX->SetCursor(fId, gVirtualX->CreateCursor(kHand));
1202 if (el->fFrame->IsActive())
1207 if (fTotal != total || fSelected != selected) {
1209 fSelected = selected;
1210 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_SELCHANGED),
1213 gVirtualX->DrawRectangle(fId, GetLineGC()(), fX0-pos.fX, fY0-pos.fY,
1217 TGFrame *over_frame = 0;
1221 while ((el = (TGFrameElement *) next())) {
1222 if (!fMapSubwindows) {
1223 if ((Int_t(el->fFrame->GetY()) + (Int_t)el->fFrame->GetHeight() > y) &&
1224 (Int_t(el->fFrame->GetX()) + (Int_t)el->fFrame->GetWidth() > x) &&
1225 (Int_t(el->fFrame->GetY()) < y) &&
1226 (Int_t(el->fFrame->GetX()) < x)) {
1227 over_frame = el->fFrame;
1231 if (el->fFrame->GetId() == (Window_t)event->fUser[0]) {
1232 over_frame = el->fFrame;
1238 if (!gDNDManager->IsDragging()) {
1239 if (fBdown && ((abs(event->fX - fXDND) > 2) || (abs(event->fY - fYDND) > 2))) {
1240 if (gDNDManager && over_frame->IsDNDSource()) {
1241 const TGPicture *drag_pic = GetObjPicture(over_frame);
1242 if (drag_pic) SetDragPixmap(drag_pic);
1243 gDNDManager->StartDrag(over_frame, event->fXRoot, event->fYRoot);
1247 if (gDNDManager->IsDragging()) {
1248 gDNDManager->Drag(event->fXRoot, event->fYRoot,
1249 TGDNDManager::GetDNDActionCopy(), event->fTime);
1251 OnMouseOver(over_frame);
1252 gVirtualX->SetCursor(fId, gVirtualX->CreateCursor(kHand));
1255 gVirtualX->SetCursor(fId, gVirtualX->CreateCursor(kPointer));
1259 if (!wasScrolling && fScrolling) {
1261 fScrollTimer->Reset();
1262 gSystem->AddTimer(fScrollTimer);
1273 Bool_t TGContainer::HandleKey(Event_t *event)
1279 if (event->fType == kGKeyPress) {
1280 gVirtualX->LookupString(event, input,
sizeof(input), keysym);
1283 KeyPressed(fLastActiveEl?fLastActiveEl->fFrame:0, keysym, event->fState);
1285 switch ((EKeySym)keysym) {
1289 SendMessage(GetMessageWindow(), MK_MSG(kC_CONTAINER, kCT_ITEMDBLCLICK),
1290 kButton1, (event->fYRoot << 16) | event->fXRoot);
1291 if (fLastActiveEl) ReturnPressed(fLastActiveEl->fFrame);
1299 case kKey_ScrollLock:
1302 if (fLastActiveEl) {
1303 fLastActiveEl->fFrame->Activate(!fLastActiveEl->fFrame->IsActive());
1304 SpacePressed(fLastActiveEl->fFrame);
1311 if (event->fState & kKeyControlMask) {
1312 switch((EKeySym)keysym & ~0x20) {
1350 if (n && keysym >= 32 && keysym < 127 &&
1351 !(event->fState & kKeyControlMask) &&
1352 (EKeySym)keysym != kKey_Delete &&
1353 (EKeySym)keysym != kKey_Backspace) {
1355 if (fKeyTimerActive) {
1359 fKeyTimerActive = kTRUE;
1361 if (gSystem) gSystem->AddTimer(fKeyTimer);
1365 switch ((EKeySym)keysym) {
1376 LineLeft(event->fState & kKeyShiftMask);
1379 LineRight(event->fState & kKeyShiftMask);
1382 LineUp(event->fState & kKeyShiftMask);
1385 LineDown(event->fState & kKeyShiftMask);
1388 PageUp(event->fState & kKeyShiftMask);
1391 PageDown(event->fState & kKeyShiftMask);
1394 Home(event->fState & kKeyShiftMask);
1397 End(event->fState & kKeyShiftMask);
1411 TGFrame *TGContainer::FindFrameByName(
const char *name)
1413 if (!IsMapped())
return 0;
1415 Bool_t direction = kTRUE;
1416 Bool_t caseSensitive = kFALSE;
1417 Bool_t subString = kFALSE;
1419 if (gTQSender && (gTQSender == TGSearchDialog::SearchDialog())) {
1420 caseSensitive = TGSearchDialog::SearchDialog()->GetType()->fCaseSensitive;
1421 direction = TGSearchDialog::SearchDialog()->GetType()->fDirection;
1423 TString sname(name);
1424 if (sname.Contains(
"*")) {
1426 sname.ReplaceAll(
"*",
"");
1429 TGFrameElement *fe = (TGFrameElement*)FindItem(sname.Data(), direction,
1430 caseSensitive, subString);
1432 if (fLastActiveEl) DeActivateItem(fLastActiveEl);
1434 fe = (TGFrameElement*)FindItem(fLastName, fLastDir, fLastCase, fLastSubstring);
1437 if (gTQSender && (gTQSender == TGSearchDialog::SearchDialog())) {
1438 TString msg =
"Couldn't find \"" + fLastName +
'\"';
1439 gVirtualX->Bell(20);
1440 new TGMsgBox(fClient->GetDefaultRoot(), fCanvas,
"Container", msg.Data(),
1441 kMBIconExclamation, kMBOk, 0);
1445 if (fLastActiveEl) DeActivateItem(fLastActiveEl);
1451 if (fLastActiveEl) DeActivateItem(fLastActiveEl);
1462 void TGContainer::Search(Bool_t close)
1464 static TGSearchType *srch = 0;
1467 if (!srch) srch =
new TGSearchType;
1468 srch->fClose = close;
1472 if (!TGSearchDialog::SearchDialog()) {
1473 TGSearchDialog::SearchDialog() =
new TGSearchDialog(fClient->GetDefaultRoot(),
1474 fCanvas, 400, 150, srch, &ret);
1476 TGSearchDialog::SearchDialog()->Connect(
"TextEntered(char *)",
"TGContainer",
this,
1477 "FindFrameByName(char *)");
1478 TGSearchDialog::SearchDialog()->MapRaised();
1480 new TGSearchDialog(fClient->GetDefaultRoot(), fCanvas, 400, 150, srch, &ret);
1482 FindFrameByName(srch->fBuffer);
1490 void TGContainer::OnAutoScroll()
1492 TGFrameElement *el = 0;
1494 int xf0, yf0, xff, yff, total, selected;
1496 TGDimension dim = GetPageDimension();
1497 TGPosition pos = GetPagePosition();
1499 Window_t dum1, dum2;
1501 ev.fType = kButtonPress;
1509 gVirtualX->QueryPointer(fId,dum1,dum2,ev.fXRoot,ev.fYRoot,x,y,ev.fState);
1512 if (x < kAutoScrollFudge)
1513 dx = kAutoScrollFudge - x;
1514 else if ((Int_t)dim.fWidth-kAutoScrollFudge <= x)
1515 dx = dim.fWidth - kAutoScrollFudge - x;
1518 if (y < kAutoScrollFudge)
1519 dy = kAutoScrollFudge - y;
1520 else if ((Int_t)dim.fHeight - kAutoScrollFudge <= y)
1521 dy = dim.fHeight - kAutoScrollFudge - y;
1526 Int_t adx = TMath::Abs(dx);
1527 Int_t ady = TMath::Abs(dy);
1528 if (adx > kAutoScrollFudge) adx = kAutoScrollFudge;
1529 if (ady > kAutoScrollFudge) ady = kAutoScrollFudge;
1531 dx *= kAcceleration[adx];
1532 dy *= kAcceleration[ady];
1534 Int_t nx = pos.fX-dx;
1535 Int_t ny = pos.fY-dy;
1537 fCanvas->SetHsbPosition(nx);
1538 fCanvas->SetVsbPosition(ny);
1544 fX0 = TMath::Min(fXp, x);
1545 fY0 = TMath::Min(fYp, y);
1546 fXf = TMath::Max(fXp, x);
1547 fYf = TMath::Max(fYp ,y);
1549 total = selected = 0;
1553 while ((el = (TGFrameElement *) next())) {
1556 xf0 = f->GetX() + (f->GetWidth() >> 3);
1557 yf0 = f->GetY() + (f->GetHeight() >> 3);
1558 xff = xf0 + f->GetWidth() - (f->GetWidth() >> 2);
1559 yff = yf0 + f->GetHeight() - (f->GetHeight() >> 2);
1561 if (((xf0 > fX0 && xf0 < fXf) ||
1562 (xff > fX0 && xff < fXf)) &&
1563 ((yf0 > fY0 && yf0 < fYf) ||
1564 (yff > fY0 && yff < fYf))) {
1565 if (!el->fFrame->IsActive())
1569 if (el->fFrame->IsActive())
1573 gVirtualX->DrawRectangle(fId, GetLineGC()(), fX0-pos.fX, fY0-pos.fY,
1576 if (fTotal != total || fSelected != selected) {
1578 fSelected = selected;
1579 SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_SELCHANGED),
1584 gVirtualX->DrawRectangle(fId, GetLineGC()(), fX0-pos.fX, fY0-pos.fY,
1592 void TGContainer::SearchPattern()
1594 TGFrameElement *fe = 0;
1598 while ((fe=( TGFrameElement*)next())) {
1599 str = fe->fFrame->GetTitle();
1601 if (str.BeginsWith(fKeyInput,TString::kIgnoreCase)) {
1602 if (fLastActiveEl && (fLastActiveEl!=fe) ) {
1603 fLastActiveEl->fFrame->Activate(kFALSE);
1612 fKeyTimerActive = kFALSE;
1618 void TGContainer::RepeatSearch()
1620 TGFrameElement *fe = 0;
1622 if (fLastName ==
"")
1625 fe = (TGFrameElement*)FindItem(fLastName, fLastDir, fLastCase, fLastSubstring);
1628 if (fLastActiveEl) DeActivateItem(fLastActiveEl);
1630 fe = (TGFrameElement*)FindItem(fLastName, fLastDir, fLastCase, fLastSubstring);
1633 TString msg =
"Couldn't find \"" + fLastName +
'\"';
1634 gVirtualX->Bell(50);
1635 new TGMsgBox(fClient->GetDefaultRoot(), fCanvas,
"Container", msg.Data(),
1636 kMBIconExclamation, kMBOk, 0);
1638 if (fLastActiveEl) DeActivateItem(fLastActiveEl);
1643 if (fLastActiveEl) DeActivateItem(fLastActiveEl);
1652 TGFrameElement *TGContainer::FindFrame(Int_t x, Int_t y, Bool_t exclude)
1656 TGFrameElement *ret = 0;
1662 el = (TGFrameElement *) next();
1665 dx = TMath::Abs(el->fFrame->GetX()-x);
1666 dy = TMath::Abs(el->fFrame->GetY()-y);
1669 while ((el = (TGFrameElement *) next())) {
1670 if (exclude && (el==fLastActiveEl) )
continue;
1671 dx = TMath::Abs(el->fFrame->GetX()-x);
1672 dy = TMath::Abs(el->fFrame->GetY()-y);
1685 void *TGContainer::FindItem(
const TString& name, Bool_t direction,
1686 Bool_t caseSensitive, Bool_t subString)
1691 if (name.IsNull())
return 0;
1694 TGFrameElement *el = 0;
1696 TString::ECaseCompare cmp = caseSensitive ? TString::kExact : TString::kIgnoreCase;
1698 fLastDir = direction;
1699 fLastCase = caseSensitive;
1701 fLastSubstring = subString;
1703 if (fLastActiveEl) {
1707 el = (TGFrameElement *)fList->After(el);
1709 el = (TGFrameElement *)fList->Before(el);
1712 if (direction) el = (TGFrameElement *)fList->First();
1713 else el = (TGFrameElement *)fList->Last();
1717 str = el->fFrame->GetTitle();
1718 idx = str.Index(name, 0, cmp);
1724 if (str.Length() == name.Length())
return el;
1729 el = (TGFrameElement *)fList->After(el);
1731 el = (TGFrameElement *)fList->Before(el);
1740 TGHScrollBar *TGContainer::GetHScrollbar()
const
1742 return fCanvas ? fCanvas->GetHScrollbar() : 0;
1748 TGVScrollBar *TGContainer::GetVScrollbar()
const
1750 return fCanvas ? fCanvas->GetVScrollbar() : 0;
1756 void TGContainer::SetVsbPosition(Int_t newPos)
1758 if (!fViewPort)
return;
1759 TGVScrollBar *vb = GetVScrollbar();
1761 if (vb && vb->IsMapped()) {
1762 vb->SetRange((Int_t)GetHeight(), (Int_t)fViewPort->GetHeight());
1763 vb->SetPosition(newPos);
1765 fViewPort->SetVPos(0);
1772 void TGContainer::SetHsbPosition(Int_t newPos)
1774 if (!fViewPort)
return;
1775 TGHScrollBar *hb = GetHScrollbar();
1777 if (hb && hb->IsMapped()) {
1778 hb->SetRange((Int_t)GetWidth(), (Int_t)fViewPort->GetWidth());
1779 hb->SetPosition(newPos);
1781 fViewPort->SetHPos(0);
1788 void TGContainer::AdjustPosition()
1790 if (!fViewPort)
return;
1791 if (!fLastActiveEl)
return;
1792 TGFrame *f = fLastActiveEl->fFrame;
1797 TGHScrollBar *hb = GetHScrollbar();
1798 TGVScrollBar *vb = GetVScrollbar();
1799 Int_t pos = GetPagePosition().fY;
1803 if (vb && vb->IsMapped()) {
1804 pg = (vb->GetPageSize()*GetHeight())/fViewPort->GetHeight();
1805 vh = pos + (Int_t)fViewPort->GetHeight();
1807 if (f->GetY() < pos) {
1808 v = TMath::Max(0, f->GetY() - (Int_t)fViewPort->GetHeight()/2);
1809 v = (v*pg)/GetHeight();
1812 }
else if (f->GetY() + (Int_t)f->GetHeight() > vh) {
1813 v = TMath::Min((Int_t)GetHeight() - (Int_t)fViewPort->GetHeight(),
1814 f->GetY() + (Int_t)f->GetHeight() - (Int_t)fViewPort->GetHeight()/2);
1815 v = (v*pg)/GetHeight();
1823 if (hb && hb->IsMapped() && (!vb || (vb && !vb->IsMapped()))) {
1824 pg = (hb->GetPageSize()*GetWidth())/fViewPort->GetWidth();
1825 pos =GetPagePosition().fX;
1826 hw = pos + (Int_t)fViewPort->GetWidth();
1828 if (f->GetX() < pos) {
1829 h = TMath::Max(0, f->GetX() - (Int_t)fViewPort->GetWidth()/2);
1830 h = (h*pg)/GetWidth();
1833 }
else if (f->GetX() + (Int_t)f->GetWidth() > hw) {
1834 h = TMath::Min((Int_t)GetWidth() - (Int_t)fViewPort->GetWidth(),
1835 f->GetX() + (Int_t)f->GetWidth() - (Int_t)fViewPort->GetWidth()/2);
1836 h = (h*pg)/GetWidth();
1846 void TGContainer::LineLeft(Bool_t select)
1848 TGPosition pos = GetPagePosition();
1849 TGDimension dim = GetPageDimension();
1851 TGFrameElement *fe = (TGFrameElement*)fList->First();
1854 TGFrameElement *old = fLastActiveEl;
1856 if (old) DeActivateItem(old);
1857 else fLastActiveEl = fe;
1859 TGFrameElement *la = fLastActiveEl;
1860 Int_t dx = la->fLayout->GetPadLeft() + la->fLayout->GetPadRight();
1861 Int_t dy = la->fLayout->GetPadTop() + la->fLayout->GetPadBottom();
1862 Int_t y = la->fFrame->GetY();
1863 Int_t x = la->fFrame->GetX() - dx;
1865 Int_t hw = pos.fX + dim.fWidth;
1867 TGHScrollBar *hb = GetHScrollbar();
1868 if (x<=0 && (hb && !hb->IsMapped())) {
1870 y = y - la->fFrame->GetDefaultHeight() - dy;
1873 fe = FindFrame(x, y);
1874 if (!fe) fe = (TGFrameElement*)fList->First();
1876 if (!select) fSelected=1;
1885 void TGContainer::LineRight(Bool_t select)
1887 TGPosition pos = GetPagePosition();
1888 TGDimension dim = GetPageDimension();
1890 TGFrameElement *fe = (TGFrameElement*)fList->Last();
1893 TGFrameElement *old = fLastActiveEl;
1895 if (old) DeActivateItem(old);
1896 else fLastActiveEl = (TGFrameElement*)fList->First();
1898 Int_t dx = fLastActiveEl->fLayout->GetPadLeft() + fLastActiveEl->fLayout->GetPadRight();
1899 Int_t dy = fLastActiveEl->fLayout->GetPadTop() + fLastActiveEl->fLayout->GetPadBottom();
1900 Int_t y = fLastActiveEl->fFrame->GetY();
1901 Int_t x = fLastActiveEl->fFrame->GetX() + fLastActiveEl->fFrame->GetDefaultWidth() + dx;
1903 Int_t hw = pos.fX + dim.fWidth - dx;
1905 TGHScrollBar *hb = GetHScrollbar();
1906 if (x >= hw && (hb && !hb->IsMapped())) {
1908 y = y + fLastActiveEl->fFrame->GetDefaultHeight() + dy;
1911 fe = FindFrame(x, y);
1912 if (!fe) fe = (TGFrameElement*)fList->Last();
1913 if (!select) fSelected = 1;
1922 void TGContainer::LineUp(Bool_t select)
1924 TGFrameElement *fe = (TGFrameElement*)fList->First();
1927 TGFrameElement *old = fLastActiveEl;
1930 DeActivateItem(old);
1932 fLastActiveEl = (TGFrameElement*)fList->First();
1935 Int_t dy = fLastActiveEl->fLayout->GetPadTop() + fLastActiveEl->fLayout->GetPadBottom();
1936 Int_t y = fLastActiveEl->fFrame->GetY() - dy;
1937 Int_t x = fLastActiveEl->fFrame->GetX();
1939 fe = FindFrame(x, y);
1940 if (!fe) fe = (TGFrameElement*)fList->First();
1941 if (fe->fFrame->GetY() > fLastActiveEl->fFrame->GetY()) fe = fLastActiveEl;
1942 if (!select) fSelected = 1;
1951 void TGContainer::LineDown(Bool_t select)
1953 TGFrameElement *fe = (TGFrameElement*)fList->Last();
1956 TGFrameElement* old = fLastActiveEl;
1958 if (old) DeActivateItem(old);
1959 else fLastActiveEl = (TGFrameElement*)fList->First();
1961 Int_t dy = fLastActiveEl->fLayout->GetPadTop() + fLastActiveEl->fLayout->GetPadBottom();
1962 Int_t y = fLastActiveEl->fFrame->GetY() +
1963 fLastActiveEl->fFrame->GetHeight() + dy;
1964 Int_t x = fLastActiveEl->fFrame->GetX();
1966 fe = FindFrame(x, y);
1967 if (!fe) fe = (TGFrameElement*)fList->Last();
1968 if (fe->fFrame->GetY() < fLastActiveEl->fFrame->GetY()) fe = fLastActiveEl;
1969 if (!select) fSelected = 1;
1978 void TGContainer::PageUp(Bool_t select)
1980 TGDimension dim = GetPageDimension();
1982 TGFrameElement *fe = (TGFrameElement*)fList->First();
1985 TGFrameElement* old = fLastActiveEl;
1987 if (old) DeActivateItem(old);
1988 else fLastActiveEl = (TGFrameElement*)fList->First();
1990 Int_t y = fLastActiveEl->fFrame->GetY();
1991 Int_t x = fLastActiveEl->fFrame->GetX();
1993 TGVScrollBar *vb = GetVScrollbar();
1994 TGHScrollBar *hb = GetHScrollbar();
1996 if (vb && vb->IsMapped()) {
1999 if (hb && hb->IsMapped()) {
2007 fe = FindFrame(x, y);
2009 if (!fe || fe->fFrame->GetY()>fLastActiveEl->fFrame->GetY()) {
2010 fe = (TGFrameElement*)fList->First();
2013 if (!select) fSelected = 1;
2022 void TGContainer::PageDown(Bool_t select)
2024 TGDimension dim = GetPageDimension();
2026 TList *li = GetList();
2027 TGFrameElement *fe = (TGFrameElement*)fList->Last();
2030 TGFrameElement *old = fLastActiveEl;
2032 if (old) DeActivateItem(old);
2033 else fLastActiveEl = (TGFrameElement*)fList->First();
2035 Int_t y = fLastActiveEl->fFrame->GetY();
2036 Int_t x = fLastActiveEl->fFrame->GetX();
2038 TGVScrollBar *vb = GetVScrollbar();
2039 TGHScrollBar *hb = GetHScrollbar();
2041 if (vb && vb->IsMapped()) {
2044 if (hb && hb->IsMapped()) {
2052 fe = FindFrame(x, y);
2053 if (!fe || fe->fFrame->GetY()<fLastActiveEl->fFrame->GetY() ) {
2054 fe = (TGFrameElement*)li->Last();
2057 if (!select) fSelected = 1;
2066 void TGContainer::Home(Bool_t select)
2068 TGFrameElement *fe = (TGFrameElement*)fList->First();
2071 TGFrameElement *old = fLastActiveEl;
2072 if (old) DeActivateItem(old);
2074 if (!select) fSelected = 1;
2083 void TGContainer::End(Bool_t select)
2085 TGFrameElement *fe = (TGFrameElement*)fList->Last();
2088 TGFrameElement *old = fLastActiveEl;
2089 if (old) DeActivateItem(old);
2091 if (!select) fSelected = 1;
2100 const TGGC &TGContainer::GetLineGC()
2104 gval.fMask = kGCForeground | kGCBackground | kGCFunction | kGCFillStyle |
2105 kGCLineWidth | kGCLineStyle | kGCSubwindowMode |
2106 kGCGraphicsExposures;
2107 gval.fForeground = fgWhitePixel ^ fgBlackPixel;
2108 gval.fBackground = fgWhitePixel;
2109 gval.fFunction = kGXxor;
2110 gval.fLineWidth = 0;
2111 gval.fLineStyle = kLineOnOffDash;
2112 gval.fFillStyle = kFillSolid;
2113 gval.fSubwindowMode = kIncludeInferiors;
2114 gval.fGraphicsExposures = kFALSE;
2115 fgLineGC = gClient->GetGC(&gval, kTRUE);
2116 fgLineGC->SetDashOffset(0);
2117 fgLineGC->SetDashList(
"\x1\x1", 2);
2125 TGCanvas::TGCanvas(
const TGWindow *p, UInt_t w, UInt_t h,
2126 UInt_t options, ULong_t back) :
2127 TGFrame(p, w, h, options, back)
2129 fVport =
new TGViewPort(
this, w-4, h-4, kChildFrame | kOwnBackground,
2131 fHScrollbar =
new TGHScrollBar(
this, w-4, kDefaultScrollBarWidth);
2132 fVScrollbar =
new TGVScrollBar(
this, kDefaultScrollBarWidth, h-4);
2134 fScrolling = kCanvasScrollBoth;
2136 fHScrollbar->Associate(
this);
2137 fVScrollbar->Associate(
this);
2139 fVport->Move(fBorderWidth, fBorderWidth);
2143 fVScrollbar->SetEditDisabled(kEditDisable | kEditDisableGrab | kEditDisableBtnEnable);
2144 fHScrollbar->SetEditDisabled(kEditDisable | kEditDisableGrab | kEditDisableBtnEnable);
2150 TGCanvas::~TGCanvas()
2160 void TGCanvas::MapSubwindows()
2162 if (fHScrollbar) fHScrollbar->MapSubwindows();
2163 if (fVScrollbar) fVScrollbar->MapSubwindows();
2166 TGFrame *container = fVport->GetContainer();
2168 Error(
"MapSubwindows",
"no canvas container set yet");
2171 container->MapSubwindows();
2172 fVport->MapSubwindows();
2173 fVport->MapWindow();
2183 void TGCanvas::AddFrame(TGFrame *f, TGLayoutHints *l)
2185 TGFrame *container = fVport->GetContainer();
2187 Error(
"AddFrame",
"no canvas container set yet");
2190 if (container->InheritsFrom(TGCompositeFrame::Class()))
2191 ((TGCompositeFrame*)container)->AddFrame(f, l);
2193 Error(
"AddFrame",
"canvas container must inherit from TGCompositeFrame");
2199 void TGCanvas::DrawBorder()
2201 switch (fOptions & (kSunkenFrame | kRaisedFrame | kDoubleBorder)) {
2202 case kSunkenFrame | kDoubleBorder:
2203 gVirtualX->DrawLine(fId, GetShadowGC()(), 0, 0, fWidth-2, 0);
2204 gVirtualX->DrawLine(fId, GetShadowGC()(), 0, 0, 0, fHeight-2);
2205 gVirtualX->DrawLine(fId, GetBlackGC()(), 1, 1, fWidth-3, 1);
2206 gVirtualX->DrawLine(fId, GetBlackGC()(), 1, 1, 1, fHeight-3);
2207 if (gClient->GetStyle() > 1)
break;
2208 gVirtualX->DrawLine(fId, GetHilightGC()(), 0, fHeight-1, fWidth-1, fHeight-1);
2209 gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth-1, fHeight-1, fWidth-1, 0);
2210 gVirtualX->DrawLine(fId, GetBckgndGC()(), 1, fHeight-2, fWidth-2, fHeight-2);
2211 gVirtualX->DrawLine(fId, GetBckgndGC()(), fWidth-2, 1, fWidth-2, fHeight-2);
2215 TGFrame::DrawBorder();
2224 void TGCanvas::Layout()
2226 Bool_t need_vsb, need_hsb;
2227 UInt_t cw, ch, tcw, tch;
2229 need_vsb = need_hsb = kFALSE;
2231 TGFrame *container = fVport->GetContainer();
2233 Error(
"Layout",
"no canvas container set yet");
2237 Bool_t fixedw = container->IsLayoutBroken() || (container->GetOptions() & kFixedWidth) ?
2239 Bool_t fixedh = container->IsLayoutBroken() || (container->GetOptions() & kFixedHeight) ?
2243 cw = fWidth - UInt_t(fBorderWidth << 1);
2244 ch = fHeight - UInt_t(fBorderWidth << 1);
2246 if (!fixedw) container->SetWidth(cw);
2247 if (!fixedh) container->SetHeight(ch);
2249 if (container->GetDefaultWidth() > cw) {
2250 if ((fScrolling & kCanvasScrollHorizontal) && fHScrollbar) {
2252 ch -= fHScrollbar->GetDefaultHeight();
2253 if ((Int_t) ch < 0) {
2257 if (!fixedh) container->SetHeight(ch);
2261 if (container->GetDefaultHeight() > ch) {
2262 if ((fScrolling & kCanvasScrollVertical) && fVScrollbar) {
2264 cw -= fVScrollbar->GetDefaultWidth();
2265 if ((Int_t) cw < 0) {
2269 if (!fixedw) container->SetWidth(cw);
2275 if (container->GetDefaultWidth() > cw) {
2277 if ((fScrolling & kCanvasScrollHorizontal) && fHScrollbar) {
2279 ch -= fHScrollbar->GetDefaultHeight();
2280 if ((Int_t) ch < 0) {
2284 if (!fixedh) container->SetHeight(ch);
2289 fVport->MoveResize(fBorderWidth, fBorderWidth, cw, ch);
2291 tcw = TMath::Max(container->GetDefaultWidth(), cw);
2292 tch = TMath::Max(container->GetDefaultHeight(), ch);
2293 UInt_t curw = container->GetDefaultWidth();
2295 container->SetWidth(0);
2297 if (fixedw && fixedh) {
2298 container->Resize(curw, container->GetDefaultHeight());
2299 }
else if (fixedw) {
2300 container->Resize(curw, tch);
2301 }
else if (fixedh) {
2302 container->Resize(tcw, container->GetDefaultHeight());
2304 container->Resize(tcw, tch);
2309 fHScrollbar->MoveResize(fBorderWidth, ch+fBorderWidth, cw, fHScrollbar->GetDefaultHeight());
2310 fHScrollbar->SetRange((Int_t)container->GetWidth(), (Int_t)fVport->GetWidth());
2311 fHScrollbar->MapWindow();
2313 fHScrollbar->UnmapWindow();
2314 fHScrollbar->SetPosition(0);
2315 if (container->IsLayoutBroken()) {
2316 container->Resize(fVport->GetWidth(), container->GetHeight());
2323 fVScrollbar->MoveResize(cw+fBorderWidth, fBorderWidth, fVScrollbar->GetDefaultWidth(), ch);
2324 fVScrollbar->SetRange((Int_t)container->GetHeight(), (Int_t)fVport->GetHeight());
2325 fVScrollbar->MapWindow();
2327 fVScrollbar->UnmapWindow();
2328 fVScrollbar->SetPosition(0);
2329 if (container->IsLayoutBroken()) {
2330 container->Resize(container->GetWidth(), fVport->GetHeight());
2339 Bool_t TGCanvas::ProcessMessage(Long_t msg, Long_t parm1, Long_t)
2341 switch (GET_MSG(msg)) {
2343 switch (GET_SUBMSG(msg)) {
2344 case kSB_SLIDERTRACK:
2346 fVport->SetHPos((Int_t)-parm1);
2352 switch (GET_SUBMSG(msg)) {
2353 case kSB_SLIDERTRACK:
2355 fVport->SetVPos((Int_t)-parm1);
2369 Int_t TGCanvas::GetHsbPosition()
const
2371 if (fHScrollbar && fHScrollbar->IsMapped())
2372 return fHScrollbar->GetPosition();
2379 Int_t TGCanvas::GetVsbPosition()
const
2381 if (fVScrollbar && fVScrollbar->IsMapped())
2382 return fVScrollbar->GetPosition();
2389 void TGCanvas::SetHsbPosition(Int_t newPos)
2391 if (fHScrollbar && fHScrollbar->IsMapped()) {
2392 TGFrame *container = fVport->GetContainer();
2393 fHScrollbar->SetRange((Int_t)container->GetWidth(), (Int_t)fVport->GetWidth());
2394 fHScrollbar->SetPosition(newPos);
2403 void TGCanvas::SetVsbPosition(Int_t newPos)
2405 if (fVScrollbar && fVScrollbar->IsMapped()) {
2406 TGFrame *container = fVport->GetContainer();
2407 fVScrollbar->SetRange((Int_t)container->GetHeight(), (Int_t)fVport->GetHeight());
2408 fVScrollbar->SetPosition(newPos);
2418 void TGCanvas::SetScrolling(Int_t scrolling)
2420 if (scrolling != fScrolling) {
2421 fScrolling = scrolling;
2429 void TGCanvas::ClearViewPort()
2431 TGFrame *cont = GetContainer();
2434 gVirtualX->ClearArea(cont->GetId(), 0, 0, fVport->GetWidth(), fVport->GetHeight());
2435 fClient->NeedRedraw(cont);
2441 void TGCanvas::SavePrimitive(std::ostream &out, Option_t *option )
2443 if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);
2445 out << std::endl <<
" // canvas widget" << std::endl;
2447 out <<
" TGCanvas *";
2448 out << GetName() <<
" = new TGCanvas("<< fParent->GetName()
2449 <<
"," << GetWidth() <<
"," << GetHeight();
2451 if (fBackground == GetDefaultFrameBackground()) {
2452 if (GetOptions() == (kSunkenFrame | kDoubleBorder)) {
2453 out <<
");" << std::endl;
2455 out <<
"," << GetOptionString() <<
");" << std::endl;
2458 out <<
"," << GetOptionString() <<
",ucolor);" << std::endl;
2460 if (option && strstr(option,
"keep_names"))
2461 out <<
" " << GetName() <<
"->SetName(\"" << GetName() <<
"\");" << std::endl;
2463 TGViewPort *vp = GetViewPort();
2464 out << std::endl <<
" // canvas viewport" << std::endl;
2465 out <<
" TGViewPort *" << vp->GetName() <<
" = " << GetName()
2466 <<
"->GetViewPort();" << std::endl;
2468 TGContainer *cont = (TGContainer*)GetContainer();
2469 cont->SavePrimitive(out, option);
2471 out <<
" " << vp->GetName() <<
"->AddFrame(" << cont->GetName()
2472 <<
");" << std::endl;
2474 out <<
" " << cont->GetName() <<
"->SetLayoutManager(";
2475 cont->GetLayoutManager()->SavePrimitive(out, option);
2476 out <<
");"<< std::endl;
2478 out <<
" " << cont->GetName() <<
"->MapSubwindows();" << std::endl;
2480 out <<
" " << GetName() <<
"->SetContainer(" << cont->GetName()
2481 <<
");" << std::endl;
2483 out <<
" " << GetName() <<
"->MapSubwindows();" << std::endl;
2485 if (fHScrollbar && fHScrollbar->IsMapped())
2486 out <<
" " << GetName() <<
"->SetHsbPosition(" << GetHsbPosition()
2487 <<
");" << std::endl;
2490 if (fVScrollbar && fVScrollbar->IsMapped())
2491 out <<
" " << GetName() <<
"->SetVsbPosition(" << GetVsbPosition()
2492 <<
");" << std::endl;
2499 void TGContainer::SavePrimitive(std::ostream &out, Option_t *option )
2501 if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);
2503 out << std::endl <<
" // canvas container" << std::endl;
2505 if ((fParent->GetParent())->InheritsFrom(TGCanvas::Class())) {
2506 out << GetName() <<
" = new TGContainer(" << GetCanvas()->GetName();
2508 out << GetName() <<
" = new TGContainer(" << fParent->GetName();
2509 out <<
"," << GetWidth() <<
"," << GetHeight();
2512 if (fBackground == GetDefaultFrameBackground()) {
2513 if (GetOptions() == (kSunkenFrame | kDoubleBorder)) {
2514 out <<
");" << std::endl;
2516 out <<
"," << GetOptionString() <<
");" << std::endl;
2519 out <<
"," << GetOptionString() <<
",ucolor);" << std::endl;
2521 if (option && strstr(option,
"keep_names"))
2522 out <<
" " << GetName() <<
"->SetName(\"" << GetName() <<
"\");" << std::endl;