Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <algorithm>
00016 #include <iostream>
00017 #include "TGFrame.h"
00018
00019
00020 #include "Fireworks/Core/src/FWCompactVerticalLayout.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 FWCompactVerticalLayout::FWCompactVerticalLayout(TGCompositeFrame* iMain):
00034 TGVerticalLayout(iMain)
00035 {
00036 }
00037
00038
00039
00040
00041
00042
00043 FWCompactVerticalLayout::~FWCompactVerticalLayout()
00044 {
00045 }
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 void FWCompactVerticalLayout::Layout()
00064 {
00065
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
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 {
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 y += extra_space;
00190 top += extra_space;
00191 }
00192 }
00193
00194 if (hints & kLHintsBottom) {
00195 y = bottom - size.fHeight - pad_bottom;
00196 bottom -= size.fHeight + pad_top + pad_bottom;
00197 } else {
00198 y = top + pad_top;
00199 top += size.fHeight + pad_top + pad_bottom;
00200 }
00201
00202 if (hints & kLHintsCenterY)
00203 top += extra_space;
00204
00205 if (size.fWidth > 32768)
00206 size.fWidth = 1;
00207 if (size.fHeight > 32768)
00208 size.fHeight = 1;
00209 ptr->fFrame->MoveResize(x, y, size.fWidth, size.fHeight);
00210
00211 fModified = fModified || (ptr->fFrame->GetX() != x) ||
00212 (ptr->fFrame->GetY() != y) ||
00213 (ptr->fFrame->GetWidth() != size.fWidth) ||
00214 (ptr->fFrame->GetHeight() != size.fHeight);
00215 }
00216 }
00217
00218 }
00219
00220
00221 TGDimension FWCompactVerticalLayout::GetDefaultSize() const
00222 {
00223
00224
00225 TGFrameElement *ptr;
00226 TGDimension size(0,0), msize = fMain->GetSize(), csize;
00227 UInt_t options = fMain->GetOptions();
00228
00229 if ((options & kFixedWidth) && (options & kFixedHeight))
00230 return msize;
00231
00232 TIter next(fList);
00233 while ((ptr = (TGFrameElement *) next())) {
00234 if (ptr->fState & kIsVisible) {
00235 csize = ptr->fFrame->GetDefaultSize();
00236 size.fWidth = TMath::Max(size.fWidth, csize.fWidth + ptr->fLayout->GetPadLeft() +
00237 ptr->fLayout->GetPadRight());
00238 size.fHeight += csize.fHeight + ptr->fLayout->GetPadTop() +
00239 ptr->fLayout->GetPadBottom();
00240 }
00241 }
00242
00243 size.fWidth += fMain->GetBorderWidth() << 1;
00244 size.fHeight += fMain->GetBorderWidth() << 1;
00245
00246 if (options & kFixedWidth) size.fWidth = msize.fWidth;
00247 if (options & kFixedHeight) size.fHeight = msize.fHeight;
00248
00249 return size;
00250 }
00251
00252
00253
00254
00255
00256
00257
00258