CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_1/src/Fireworks/Core/src/FWCompactVerticalLayout.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     Core
00004 // Class  :     FWCompactVerticalLayout
00005 // 
00006 // Implementation:
00007 //     <Notes on implementation>
00008 //
00009 // Original Author:  Chris Jones
00010 //         Created:  Tue Mar 17 12:10:42 CDT 2009
00011 // $Id: FWCompactVerticalLayout.cc,v 1.3 2012/07/30 22:34:52 amraktad Exp $
00012 //
00013 
00014 // system include files
00015 #include <algorithm>
00016 #include <iostream>
00017 #include "TGFrame.h"
00018 
00019 // user include files
00020 #include "Fireworks/Core/src/FWCompactVerticalLayout.h"
00021 
00022 //
00023 // constants, enums and typedefs
00024 //
00025 
00026 //
00027 // static data member definitions
00028 //
00029 
00030 //
00031 // constructors and destructor
00032 //
00033 FWCompactVerticalLayout::FWCompactVerticalLayout(TGCompositeFrame* iMain):
00034 TGVerticalLayout(iMain)
00035 {
00036 }
00037 
00038 // FWCompactVerticalLayout::FWCompactVerticalLayout(const FWCompactVerticalLayout& rhs)
00039 // {
00040 //    // do actual copying here;
00041 // }
00042 
00043 FWCompactVerticalLayout::~FWCompactVerticalLayout()
00044 {
00045 }
00046 
00047 //
00048 // assignment operators
00049 //
00050 // const FWCompactVerticalLayout& FWCompactVerticalLayout::operator=(const FWCompactVerticalLayout& rhs)
00051 // {
00052 //   //An exception safe implementation is
00053 //   FWCompactVerticalLayout temp(rhs);
00054 //   swap(rhs);
00055 //
00056 //   return *this;
00057 // }
00058 
00059 //
00060 // member functions
00061 //
00062 //______________________________________________________________________________
00063 void FWCompactVerticalLayout::Layout()
00064 {
00065    // Make a vertical layout of all frames in the list.
00066    
00067    TGFrameElement *ptr;
00068    TGLayoutHints  *layout;
00069    Int_t    nb_expand = 0;
00070    Int_t    top, bottom;
00071    ULong_t  hints;
00072    UInt_t   extra_space = 0;
00073    Int_t    exp = 0;
00074    Int_t    exp_max = 0;
00075    Int_t    remain;
00076    Int_t    x = 0, y = 0;
00077    Int_t    bw = fMain->GetBorderWidth();
00078    TGDimension size(0,0), csize(0,0);
00079    TGDimension msize = fMain->GetSize();
00080    UInt_t pad_left, pad_top, pad_right, pad_bottom;
00081    Int_t size_expand=0, esize_expand=0, rem_expand=0, tmp_expand = 0;
00082    
00083    if (!fList) return;
00084    
00085    fModified = kFALSE;
00086    
00087    bottom = msize.fHeight - (top = bw);
00088    remain = msize.fHeight - (bw << 1);
00089    
00090    std::vector<int> expandSizes;
00091    expandSizes.reserve(fList->GetSize());
00092    TIter next(fList);
00093    while ((ptr = (TGFrameElement *) next())) {
00094       if (ptr->fState & kIsVisible) {
00095          layout = ptr->fLayout;
00096          size = ptr->fFrame->GetDefaultSize();
00097          size.fHeight += layout->GetPadTop() + layout->GetPadBottom();
00098          hints = layout->GetLayoutHints();
00099          if ((hints & kLHintsExpandY) || (hints & kLHintsCenterY)) {
00100             nb_expand++;
00101             exp += size.fHeight;
00102             if (hints & kLHintsExpandY) { 
00103                exp_max = 0;
00104                expandSizes.push_back(size.fHeight);
00105             }
00106             else exp_max = TMath::Max(exp_max, (Int_t)size.fHeight);
00107          } else {
00108             remain -= size.fHeight;
00109             if (remain < 0)
00110                remain = 0;
00111          }
00112       }
00113    }
00114    
00115    if (nb_expand) {
00116       size_expand = remain/nb_expand;
00117       
00118       if (size_expand < exp_max)
00119          esize_expand = (remain - exp)/nb_expand;
00120       rem_expand = remain % nb_expand;
00121    }
00122    
00123    std::sort(expandSizes.begin(), expandSizes.end(),std::less<int>());
00124    //Now see if expanded widgets exceed their max sizes
00125    for(std::vector<int>::iterator it = expandSizes.begin(), itEnd = expandSizes.end();
00126        it != itEnd;
00127        ++it) {
00128       if(*it > size_expand) {
00129          break;
00130       }
00131       remain -= *it;
00132       --nb_expand;
00133       if(remain<0) {remain=0;}
00134       if(nb_expand>0) {
00135          size_expand = remain/nb_expand;
00136       } else {
00137          size_expand=msize.fHeight - (bw << 1);
00138       }
00139    }
00140    
00141    next.Reset();
00142    while ((ptr = (TGFrameElement *) next())) {
00143       if (ptr->fState & kIsVisible) {
00144          hints = (layout = ptr->fLayout)->GetLayoutHints();
00145          csize      = ptr->fFrame->GetDefaultSize();
00146          pad_left   = layout->GetPadLeft();
00147          pad_top    = layout->GetPadTop();
00148          pad_right  = layout->GetPadRight();
00149          pad_bottom = layout->GetPadBottom();
00150          
00151          if (hints & kLHintsRight) {
00152             x = msize.fWidth - bw - csize.fWidth - pad_right;
00153          } else if (hints & kLHintsCenterX) {
00154             x = (msize.fWidth - (bw << 1) - csize.fWidth) >> 1;
00155          } else { // defaults to kLHintsLeft
00156             x = pad_left + bw;
00157          }
00158          
00159          if (hints & kLHintsExpandX) {
00160             size.fWidth = msize.fWidth - (bw << 1) - pad_left - pad_right;
00161             x = pad_left + bw;
00162          } else {
00163             size.fWidth = csize.fWidth;
00164          }
00165          
00166          if (hints & kLHintsExpandY) {
00167             if (size_expand >= exp_max)
00168                if(static_cast<int>(csize.fHeight) > size_expand) {
00169                   size.fHeight = size_expand - pad_top - pad_bottom;
00170                } else {
00171                   size.fHeight = csize.fHeight;
00172                }
00173             else
00174                size.fHeight = csize.fHeight + esize_expand;
00175             
00176             tmp_expand += rem_expand;
00177             if (tmp_expand >= nb_expand) {
00178                size.fHeight++;
00179                tmp_expand -= nb_expand;
00180             }
00181          } else {
00182             size.fHeight = csize.fHeight;
00183             if (hints & kLHintsCenterY) {
00184                if (size_expand >= exp_max) {
00185                   extra_space = (size_expand - pad_top - pad_bottom - size.fHeight) >> 1;
00186                } else {
00187                   extra_space = esize_expand >> 1;
00188                }
00189                top += extra_space;
00190             }
00191          }
00192          
00193          if (hints & kLHintsBottom) {
00194             y = bottom - size.fHeight - pad_bottom;
00195             bottom -= size.fHeight + pad_top + pad_bottom;
00196          } else { // kLHintsTop by default
00197             y = top + pad_top;
00198             top += size.fHeight + pad_top + pad_bottom;
00199          }
00200          
00201          if (hints & kLHintsCenterY)
00202             top += extra_space;
00203          
00204          if (size.fWidth > 32768)
00205             size.fWidth = 1;
00206          if (size.fHeight > 32768)
00207             size.fHeight = 1;
00208          ptr->fFrame->MoveResize(x, y, size.fWidth, size.fHeight);
00209          
00210          fModified = fModified || (ptr->fFrame->GetX() != x) || 
00211          (ptr->fFrame->GetY() != y) ||
00212          (ptr->fFrame->GetWidth() != size.fWidth) ||
00213          (ptr->fFrame->GetHeight() != size.fHeight);
00214       }
00215    }
00216 
00217 }
00218 
00219 //______________________________________________________________________________
00220 TGDimension FWCompactVerticalLayout::GetDefaultSize() const
00221 {
00222    // Return default dimension of the vertical layout.
00223    
00224    TGFrameElement *ptr;
00225    TGDimension     size(0,0), msize = fMain->GetSize(), csize;
00226    UInt_t options = fMain->GetOptions();
00227    
00228    if ((options & kFixedWidth) && (options & kFixedHeight))
00229       return msize;
00230    
00231    TIter next(fList);
00232    while ((ptr = (TGFrameElement *) next())) {
00233       if (ptr->fState & kIsVisible) {
00234          csize = ptr->fFrame->GetDefaultSize();
00235          size.fWidth = TMath::Max(size.fWidth, csize.fWidth + ptr->fLayout->GetPadLeft() +
00236                                   ptr->fLayout->GetPadRight());
00237          size.fHeight += csize.fHeight + ptr->fLayout->GetPadTop() +
00238          ptr->fLayout->GetPadBottom();
00239       }
00240    }
00241    
00242    size.fWidth  += fMain->GetBorderWidth() << 1;
00243    size.fHeight += fMain->GetBorderWidth() << 1;
00244    
00245    if (options & kFixedWidth)  size.fWidth  = msize.fWidth;
00246    if (options & kFixedHeight) size.fHeight = msize.fHeight;
00247    
00248    return size;
00249 }
00250 
00251 //
00252 // const member functions
00253 //
00254 
00255 //
00256 // static member functions
00257 //