MTGListTree.cxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <iostream>
00028 #include <algorithm>
00029
00030 #include "TGToolTip.h"
00031 #include "Riostream.h"
00032 #include "MTGListTree.h"
00033
00034 ClassImp(MTGListTree)
00035
00036 void MTGListTree::init()
00037 {
00038 fControlPressed = false;
00039 AddInput(kKeyReleaseMask);
00040 }
00041
00042 MTGListTree::MTGListTree(TGWindow *p, UInt_t w, UInt_t h, UInt_t options, ULong_t back) : TGListTree(p,w,h,options,back)
00043 {
00044 init();
00045 };
00046
00047 MTGListTree::MTGListTree(TGCanvas *p,UInt_t options,ULong_t back) : TGListTree(p,options,back)
00048 {
00049 init();
00050 };
00051
00052
00053
00054
00055
00056
00057
00058 Int_t MTGListTree::MDeleteItem( TGListTreeItem *item )
00059 {
00060
00061
00062 if( item->GetFirstChild() )MPDeleteChildren( item->GetFirstChild() );
00063 TGListTreeItem *tmp = item->GetFirstChild();
00064 tmp = 0;
00065 RemoveReference( item );
00066 if( fSelected == item )fSelected = 0;
00067 delete item;
00068 return 1;
00069 }
00070
00071 void MTGListTree::MPDeleteChildren( TGListTreeItem *item )
00072 {
00073
00074
00075 TGListTreeItem *sibling;
00076 while (item)
00077 {
00078 if( item->GetFirstChild() )
00079 {
00080 MPDeleteChildren( item->GetFirstChild() );
00081 TGListTreeItem *tmp = item->GetFirstChild();
00082 tmp = 0;
00083 }
00084 sibling = item->GetNextSibling();
00085 if( fSelected == item )fSelected = 0;
00086 delete item;
00087 item = sibling;
00088 }
00089 }
00090
00091 Bool_t MTGListTree::HandleButton(Event_t *event)
00092 {
00093
00094
00095 TGListTreeItem *item;
00096
00097 if (fTip) fTip->Hide();
00098
00099 Int_t page = 0;
00100 if (event->fCode == kButton4 || event->fCode == kButton5) {
00101 if (!fCanvas) return kTRUE;
00102 if (fCanvas->GetContainer()->GetHeight())
00103 page = Int_t(Float_t(fCanvas->GetViewPort()->GetHeight() *
00104 fCanvas->GetViewPort()->GetHeight()) /
00105 fCanvas->GetContainer()->GetHeight());
00106 }
00107
00108 if (event->fCode == kButton4) {
00109
00110 Int_t newpos = fCanvas->GetVsbPosition() - page;
00111 if (newpos < 0) newpos = 0;
00112 fCanvas->SetVsbPosition(newpos);
00113 return kTRUE;
00114 }
00115 if (event->fCode == kButton5) {
00116
00117 Int_t newpos = fCanvas->GetVsbPosition() + page;
00118 fCanvas->SetVsbPosition(newpos);
00119 return kTRUE;
00120 }
00121
00122 if( event->fType == kButtonPress )
00123 {
00124 if( (item = FindItem(event->fY)) != 0 )
00125 {
00126
00127 if( !fControlPressed )
00128 {
00129 HighlightItem(fSelected, kFALSE, kTRUE);
00130 UnselectAll(kTRUE);
00131 }
00132
00133 fSelected = item;
00134
00135 HighlightItem(item, kTRUE, kTRUE);
00136 SendMessage(fMsgWindow, MK_MSG(kC_LISTTREE, kCT_ITEMCLICK),
00137 event->fCode, (event->fYRoot << 16) | event->fXRoot);
00138 Clicked(item, event->fCode);
00139 Clicked(item, event->fCode, event->fXRoot, event->fYRoot);
00140 }
00141 }
00142 if (event->fType == kButtonRelease) gVirtualX->SetInputFocus(fId);
00143 return kTRUE;
00144 }
00145
00146 void MTGListTree::GetSelectedItems( std::vector<TGListTreeItem*> &items )
00147 {
00148 items.clear();
00149 TGListTreeItem *item = fFirst;
00150 GetSelectedItemsRecursive( item, items );
00151 }
00152
00153 void MTGListTree::GetSelectedItemsRecursive( TGListTreeItem *item, std::vector<TGListTreeItem*> &items )
00154 {
00155 while( item )
00156 {
00157 TGListTreeItem *firstChild = item->GetFirstChild();
00158 if( firstChild )GetSelectedItemsRecursive( firstChild, items );
00159 if( item->IsActive() && find(items.begin(),items.end(),item)==items.end() )items.push_back( item );
00160 item = item->GetNextSibling();
00161 }
00162 }
00163
00164 Bool_t MTGListTree::HandleKey(Event_t *event)
00165 {
00166 char input[10];
00167 UInt_t keysym;
00168 if (event->fType == kGKeyPress) {
00169 gVirtualX->LookupString(event, input, sizeof(input), keysym);
00170 if (keysym==4129) {
00171 fControlPressed = true;
00172 }
00173 }
00174 if (event->fType == kKeyRelease) {
00175 gVirtualX->LookupString(event, input, sizeof(input), keysym);
00176 if (keysym==4129) {
00177 fControlPressed = false;
00178 }
00179 }
00180 return TGListTree::HandleKey(event);
00181 }