Subversion Repository Public Repository

litesoft

Diff Revisions 949 vs 950 for /trunk/Java/GWT/Client/src/org/litesoft/GWT/client/widgets/nonpublic/AbstractSizeableHelper.java

Diff revisions: vs.
  @@ -1,754 +1,754 @@
1 - // This Source Code is in the Public Domain per: http://unlicense.org
2 - package org.litesoft.GWT.client.widgets.nonpublic;
3 -
4 - import org.litesoft.commonfoundation.typeutils.*;
5 -
6 - import com.google.gwt.core.client.*;
7 - import com.google.gwt.user.client.*;
8 - import com.google.gwt.user.client.ui.*;
9 - import com.google.gwt.user.client.ui.impl.*;
10 -
11 - import java.util.*;
12 -
13 - /**
14 - * To be used in conjunction with AbstractSizeableWidget
15 - */
16 - public class AbstractSizeableHelper extends CommonElementHelper {
17 - private static final OuterSandwichHelper OUTER_SANDWICH_FACTORY = (OuterSandwichHelper) GWT.create( OuterSandwichHelper.class );
18 - private static final FocusImpl FOCUS_PANEL_FACTORY = FocusImpl.getFocusImplForPanel();
19 -
20 - private AbstractSizeableWidget mOurUIObject;
21 - private boolean mHidden;
22 - private Element mOuterElement;
23 - private Element mStyleElement;
24 - private Element mInnerElement;
25 - private Element mFieldSetLegend = null;
26 - private Size_1DHelper mWidthHelper = new WidthHelper();
27 - private Size_1DHelper mHeightHelper = new HeightHelper();
28 - private static final String INNER_CONSTRAINER = "LayoutMinSizeConstrainer";
29 - private static final String OUTER_CONSTRAINER = "LayoutDivConstrainer";
30 -
31 - public AbstractSizeableHelper( AbstractSizeableWidget pOurUIObject ) {
32 - // ***** may NOT do anything with the UiObject here, as it is not fully initialized yet!!!!!
33 - mOurUIObject = pOurUIObject;
34 - }
35 -
36 - public boolean isOverflowHidden() {
37 - return mHidden;
38 - }
39 -
40 - public Element getOuterElement() {
41 - return mOuterElement;
42 - }
43 -
44 - public Element getStyleElement() {
45 - return mStyleElement;
46 - }
47 -
48 - public Element getInnerElement() {
49 - return mInnerElement;
50 - }
51 -
52 - public void setInnerElement( Element pInnerElement ) {
53 - mInnerElement = pInnerElement;
54 - }
55 -
56 - public Element getFieldSetLegend() {
57 - return mFieldSetLegend;
58 - }
59 -
60 - public void setUpSpecialPart1( Element pDivSizeTable, Element pDiv, Element pInnerElement ) {
61 - mOuterElement = pDivSizeTable;
62 - mStyleElement = pDiv;
63 - mInnerElement = pInnerElement;
64 - }
65 -
66 - /**
67 - * @param pHidden true == Hidden / false == auto
68 - */
69 - public String setUpSpecialPart2( boolean pHidden ) {
70 - return determineOverflowClass( mHidden = pHidden );
71 - }
72 -
73 - /**
74 - * @param pHidden true == Hidden / false == auto
75 - *
76 - * @return pInnerElement
77 - */
78 - public Element create_OeTable_SeDiv_IeGraph( boolean pHidden, Element pGraphRoot, Element pInnerElement ) {
79 - mStyleElement = appendChild( createDiv( pHidden ), pGraphRoot );
80 - mOuterElement = createTableDivConstrainer( mStyleElement );
81 - return mInnerElement = pInnerElement;
82 - }
83 -
84 - /**
85 - * @param pHidden true == Hidden / false == auto
86 - *
87 - * @return Div
88 - */
89 - public Element create_OeTable_SeDiv( boolean pHidden ) {
90 - mStyleElement = createDiv( pHidden );
91 - mOuterElement = createTableDivConstrainer( mStyleElement );
92 - return mStyleElement;
93 - }
94 -
95 - /**
96 - * @return Div
97 - */
98 - public Element create_OeSeIeOverflowHiddenSingleDivSandwich() {
99 - return mOuterElement = mStyleElement = mInnerElement = createDiv( true );
100 - }
101 -
102 - /**
103 - * @return TBody
104 - */
105 - public Element create_OeSeIeOverflowHiddenCommonDiv_TableToTBody() {
106 - Element rv = DOM.createTBody();
107 - appendChild( create_OeSeIeOverflowHiddenSingleDivSandwich(), //
108 - createMinSizeConstrainingTableToTBody( rv ) );
109 - return rv;
110 - }
111 -
112 - /**
113 - * @return TBody
114 - */
115 - public Element create_OeTable_SeIeTBody() {
116 - mHidden = true;
117 - Element rv = mStyleElement = mInnerElement = DOM.createTBody();
118 - mOuterElement = createMinSizeConstrainingTableToTBody( rv );
119 - return rv;
120 - }
121 -
122 - /**
123 - * @param pHidden true == Hidden / false == auto
124 - *
125 - * @return Div
126 - */
127 - public Element create_OeTable_SeDiv_IeDiv( boolean pHidden ) {
128 - return create_OeTable_SeStyle_IeDiv( createDiv( pHidden ) );
129 - }
130 -
131 - /**
132 - * @param pHidden true == Hidden / false == auto
133 - *
134 - * @return Div
135 - */
136 - public Element create_OeTable_SeDiv_IeFocusDiv( boolean pHidden ) {
137 - return create_OeWidget_SeStyle_IeInner( createDiv( pHidden ), FOCUS_PANEL_FACTORY.createFocusable() );
138 - }
139 -
140 - /**
141 - * @param pHidden true == Hidden / false == auto
142 - *
143 - * @return Div
144 - */
145 - public Element create_OeTable_SeFieldSet_IeDiv( boolean pHidden, String pTitle ) {
146 - return create_OeTable_SeStyle_IeDiv( createFieldSet( pHidden, pTitle ) );
147 - }
148 -
149 - /**
150 - * @param pHidden true == Hidden / false == auto
151 - *
152 - * @return TR
153 - */
154 - public Element create_OeWidget_SeDiv_IeTableToTR( boolean pHidden ) {
155 - return create_OeWidget_SeStyle_IeTableToTR( createDiv( pHidden ) );
156 - }
157 -
158 - /**
159 - * @param pHidden true == Hidden / false == auto
160 - *
161 - * @return TR
162 - */
163 - public Element create_OeWidget_SeFieldSet_IeTableToTR( boolean pHidden, String pTitle ) {
164 - return create_OeWidget_SeStyle_IeTableToTR( createFieldSet( pHidden, pTitle ) );
165 - }
166 -
167 - /**
168 - * @return TR
169 - */
170 - private Element create_OeWidget_SeStyle_IeTableToTR( Element pStyleElement ) {
171 - Element rv = DOM.createTR();
172 - create_OeWidget_SeStyle_IeInner( pStyleElement, createMinSizeConstrainingTableToTR( rv ) );
173 - return rv;
174 - }
175 -
176 - /**
177 - * @param pHidden true == Hidden / false == auto
178 - *
179 - * @return TBody
180 - */
181 - public Element create_OeWidget_SeDiv_IeTableToTBody( boolean pHidden ) {
182 - return create_OeWidget_SeStyle_IeTableToTBody( createDiv( pHidden ) );
183 - }
184 -
185 - /**
186 - * @param pHidden true == Hidden / false == auto
187 - *
188 - * @return TBody
189 - */
190 - public Element create_OeWidget_SeFieldSet_IeTableToTBody( boolean pHidden, String pTitle ) {
191 - return create_OeWidget_SeStyle_IeTableToTBody( createFieldSet( pHidden, pTitle ) );
192 - }
193 -
194 - /**
195 - * @return TBody
196 - */
197 - private Element create_OeWidget_SeStyle_IeTableToTBody( Element pStyleElement ) {
198 - Element rv = DOM.createTBody();
199 - create_OeWidget_SeStyle_IeInner( pStyleElement, createMinSizeConstrainingTableToTBody( rv ) );
200 - return rv;
201 - }
202 -
203 - private Element create_OeWidget_SeStyle_IeInner( Element pStyleElement, Element pInnerElement ) {
204 - mInnerElement = pInnerElement;
205 - mStyleElement = appendChild( pStyleElement, mInnerElement );
206 - mOuterElement = createOuterConstrainer( mStyleElement );
207 - return mInnerElement;
208 - }
209 -
210 - /**
211 - * @return Outer Widget
212 - */
213 - private Element createOuterConstrainer( Element pStyleElement ) {
214 - Element[] zElements = OUTER_SANDWICH_FACTORY.create( OUTER_CONSTRAINER );
215 - appendChild( zElements[1], pStyleElement );
216 - return zElements[0];
217 - }
218 -
219 - /**
220 - * @return Div
221 - */
222 - private Element create_OeTable_SeStyle_IeDiv( Element pStyleElement ) {
223 - mInnerElement = DOM.createDiv();
224 - mStyleElement = pStyleElement;
225 - mOuterElement = createTableDivConstrainer( appendChild( mStyleElement, mInnerElement ) );
226 - return mInnerElement;
227 - }
228 -
229 - /**
230 - * @return Table
231 - */
232 - private Element createMinSizeConstrainingTableToTR( Element pTR ) {
233 - return createMinSizeConstrainingTableToTBody( appendChild( DOM.createTBody(), pTR ) );
234 - }
235 -
236 - /**
237 - * @return Table
238 - */
239 - private Element createMinSizeConstrainingTableToTBody( Element pTBody ) {
240 - return appendChild( createMinSizeConstrainingTable(), pTBody );
241 - }
242 -
243 - /**
244 - * @return Table
245 - */
246 - public static Element createMinSizeConstrainingTable() {
247 - return createTable( INNER_CONSTRAINER );
248 - }
249 -
250 - /**
251 - * @return Table
252 - */
253 - public static Element createLayoutDivConstrainingTable() {
254 - return createTable( OUTER_CONSTRAINER );
255 - }
256 -
257 - /**
258 - * @return Div
259 - */
260 - public static Element createLayoutDivConstrainingDiv() {
261 - return createDiv( OUTER_CONSTRAINER );
262 - }
263 -
264 - /**
265 - * @return Table
266 - */
267 - private Element createTableDivConstrainer( Element pDiv ) {
268 - Element zTable = createLayoutDivConstrainingTable();
269 - appendChild( finishTableNgetTD( zTable ), pDiv );
270 - return zTable;
271 - }
272 -
273 - /**
274 - * @param pHidden true == Hidden / false == auto
275 - *
276 - * @return Div
277 - */
278 - private Element createDiv( boolean pHidden ) {
279 - return setOverflowClass( DOM.createDiv(), mHidden = pHidden );
280 - }
281 -
282 - /**
283 - * @param pHidden true == Hidden / false == auto
284 - *
285 - * @return FieldSet
286 - */
287 - private Element createFieldSet( boolean pHidden, String pLegend ) {
288 - Element zFieldSet = setOverflowClass( DOM.createFieldSet(), mHidden = pHidden );
289 - if ( null != (pLegend = Strings.noEmpty( pLegend )) ) {
290 - mFieldSetLegend = DOM.createLegend();
291 - DOM.appendChild( zFieldSet, mFieldSetLegend );
292 - DOM.setInnerText( mFieldSetLegend, pLegend );
293 - }
294 - return zFieldSet;
295 - }
296 -
297 - public ISizeableDimensionHelper getWidthHelper() {
298 - return mWidthHelper;
299 - }
300 -
301 - public ISizeableDimensionHelper getHeightHelper() {
302 - return mHeightHelper;
303 - }
304 -
305 - public int distributeDimensionOnChildren( IndexedPanel pIndexedPanel, ISizeableDimensionHelper pDimensionHelper ) {
306 - ChildCollector collector = new ChildCollector();
307 - boolean anyToProcess = collector.process( pIndexedPanel, pDimensionHelper );
308 - int newSize = collector.getNewSize();
309 - if ( anyToProcess ) {
310 - List<ISizeableDimensionHelper> adjustables = new ArrayList<ISizeableDimensionHelper>();
311 - List<ChildStructure> zChildStructures = collector.getChildStructures();
312 - for ( ChildStructure zChildStructure : zChildStructures ) {
313 - ISizeableDimensionHelper zChildHelper = zChildStructure.getHelper();
314 - int zChildCurSize = zChildStructure.getCurSize();
315 - if ( zChildHelper.isStretchable() ) {
316 - //noinspection unchecked
317 - adjustables.add( zChildHelper );
318 - } else {
319 - zChildHelper.setDimension( zChildCurSize ); // Propagate Sizing...
320 - }
321 - }
322 - while ( !adjustables.isEmpty() ) {
323 - int delta = deltaPerAdjustable( adjustables.size(), newSize );
324 - ISizeableDimensionHelper zChildHelper = adjustables.remove( 0 );
325 - int curSize = zChildHelper.getDimension();
326 - zChildHelper.setDimension( curSize + delta );
327 - int adjustedNewSize = zChildHelper.getDimension();
328 - newSize -= adjustedNewSize - curSize;
329 - }
330 - }
331 - return newSize;
332 - }
333 -
334 - public int distributeDimensionToChild( IndexedPanel pIndexedPanel, ISizeableDimensionHelper pDimensionHelper, Widget pWidgetToAdjust ) {
335 - ChildCollector collector = new ChildCollector();
336 - boolean anyToProcess = collector.process( pIndexedPanel, pDimensionHelper );
337 - int newSize = collector.getNewSize();
338 - if ( anyToProcess ) {
339 - ISizeableDimensionHelper zChildHelperToBeAdjusted = null;
340 - List<ChildStructure> zChildStructures = collector.getChildStructures();
341 - for ( ChildStructure zChildStructure : zChildStructures ) {
342 - ISizeableDimensionHelper zChildHelper = zChildStructure.getHelper();
343 - int zChildCurSize = zChildStructure.getCurSize();
344 - if ( zChildStructure.getWidget() == pWidgetToAdjust ) {
345 - zChildHelperToBeAdjusted = zChildHelper;
346 - } else {
347 - zChildHelper.setDimension( zChildCurSize ); // Propagate Sizing...
348 - }
349 - }
350 - if ( zChildHelperToBeAdjusted != null ) {
351 - int delta = deltaPerAdjustable( 1, newSize );
352 - int curSize = zChildHelperToBeAdjusted.getDimension();
353 - zChildHelperToBeAdjusted.setDimension( curSize + delta );
354 - int adjustedNewSize = zChildHelperToBeAdjusted.getDimension();
355 - newSize -= adjustedNewSize - curSize;
356 - }
357 - if ( newSize != 0 ) {
358 - newSize = distributeDimensionOnChildren( pIndexedPanel, pDimensionHelper );
359 - }
360 - }
361 - return newSize;
362 - }
363 -
364 - public int applyChangedDimensionToChild( Widget pChildWidget, ISizeableDimensionHelper pDimensionHelper ) {
365 - Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
366 - int newSize = zDimHelper.getOurInnerSizeWithAllowanceForScrollBars();
367 - if ( zDimHelper.isAdjustmentsDetermined() ) {
368 - ISizeableWidget zSizeableWidget = getVisableSizeableWidget( pChildWidget );
369 - if ( zSizeableWidget != null ) {
370 - ISizeableDimensionHelper zChildHelper = zDimHelper.getAppropriateManager( zSizeableWidget );
371 - if ( zChildHelper.isStretchable() ) {
372 - zChildHelper.setDimension( pChildWidget, newSize );
373 - }
374 - }
375 - }
376 - return newSize;
377 - }
378 -
379 - public void applyChangedDimensionToChildren( IndexedPanel pIndexedPanel, ISizeableDimensionHelper pDimensionHelper ) {
380 - Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
381 - int newSize = zDimHelper.getOurInnerSizeWithAllowanceForScrollBars(); // todo: Resizing from Inner when it hasn't changed!
382 - setDimensionOnChildren( pIndexedPanel, zDimHelper, newSize );
383 - }
384 -
385 - public void forceAdjustDimensionOnChild( Widget pWidget, ISizeableDimensionHelper pDimensionHelper ) {
386 - Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
387 - int newSize = zDimHelper.getOurInnerSizeWithAllowanceForScrollBars();
388 - zDimHelper.setDimension( pWidget, newSize );
389 - }
390 -
391 - public void forceAdjustDimensionOnChild( Element pElement, ISizeableDimensionHelper pDimensionHelper ) {
392 - Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
393 - int newSize = zDimHelper.getOurInnerSizeWithAllowanceForScrollBars();
394 - zDimHelper.setStyleDimension( pElement, newSize );
395 - }
396 -
397 - public void setDimensionOnChildren( IndexedPanel pIndexedPanel, ISizeableDimensionHelper pDimensionHelper, int pNewSize ) {
398 - Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
399 - setDimensionOnChildren( pIndexedPanel, zDimHelper, pNewSize );
400 - }
401 -
402 - private void setDimensionOnChildren( IndexedPanel pIndexedPanel, Size_1DHelper pDimHelper, int pNewSize ) {
403 - int wc = pIndexedPanel.getWidgetCount();
404 - if ( (pNewSize > 0) && (wc != 0) ) {
405 - for ( int i = 0; i < wc; i++ ) {
406 - Widget zChildWidget = pIndexedPanel.getWidget( i );
407 - ISizeableWidget zSizeableWidget = getVisableSizeableWidget( zChildWidget );
408 - if ( zSizeableWidget != null ) {
409 - ISizeableDimensionHelper zChildHelper = pDimHelper.getAppropriateManager( zSizeableWidget );
410 - if ( zChildHelper.isStretchable() ) {
411 - zChildHelper.setDimension( zChildWidget, pNewSize );
412 - }
413 - }
414 - }
415 - }
416 - }
417 -
418 - private static ISizeableWidget getVisableSizeableWidget( Widget pWidget ) {
419 - return (pWidget instanceof ISizeableWidget) && pWidget.isVisible() ? // Order does Null Check
420 - (ISizeableWidget) pWidget : null;
421 - }
422 -
423 - private static int deltaPerAdjustable( int pAdjustables, int pDelta ) {
424 - if ( (pAdjustables == 0) || (pDelta == 0) ) {
425 - return 0;
426 - }
427 - if ( pAdjustables == 1 ) {
428 - return pDelta;
429 - }
430 - return ((pDelta < 0) ? pDelta - (pAdjustables - 1) : pDelta + (pAdjustables - 1)) / pAdjustables;
431 - }
432 -
433 - private class WidthHelper extends Size_1DHelper {
434 - public WidthHelper() {
435 - super( WidthDimensionHelper.INSTANCE );
436 - }
437 -
438 - @Override
439 - protected ISizeableDimensionHelper getAppropriateManager( ISizeableWidget pSizeableWidget ) {
440 - return pSizeableWidget.getWidthHelper();
441 - }
442 -
443 - @Override
444 - public boolean setPrefferredDimension() {
445 - return mOurUIObject.setPrefferredWidth();
446 - }
447 -
448 - @Override
449 - public boolean adjustSizeBy( int pDelta ) {
450 - return mOurUIObject.adjustWidthBy( pDelta );
451 - }
452 -
453 - @Override
454 - public void distributeToChildrenChangedDimension() {
455 - mOurUIObject.distributeToChildrenChangedWidth();
456 - }
457 - }
458 -
459 - private class HeightHelper extends Size_1DHelper {
460 - public HeightHelper() {
461 - super( HeightDimensionHelper.INSTANCE );
462 - }
463 -
464 - @Override
465 - protected ISizeableDimensionHelper getAppropriateManager( ISizeableWidget pSizeableWidget ) {
466 - return pSizeableWidget.getHeightHelper();
467 - }
468 -
469 - @Override
470 - public boolean setPrefferredDimension() {
471 - return mOurUIObject.setPrefferredHeight();
472 - }
473 -
474 - @Override
475 - public boolean adjustSizeBy( int pDelta ) {
476 - return mOurUIObject.adjustHeightBy( pDelta );
477 - }
478 -
479 - @Override
480 - public void distributeToChildrenChangedDimension() {
481 - mOurUIObject.distributeToChildrenChangedHeight();
482 - }
483 - }
484 -
485 - private abstract class Size_1DHelper implements ISizeableDimensionHelper {
486 - protected boolean mStretchable = false;
487 - private IDimensionHelper mDimensionHelper;
488 -
489 - protected Size_1DHelper( IDimensionHelper pDimensionHelper ) {
490 - mDimensionHelper = pDimensionHelper;
491 - }
492 -
493 - @Override
494 - public boolean isStretchable() {
495 - return mStretchable;
496 - }
497 -
498 - @Override
499 - public void setStretchable( boolean pNewValue ) {
500 - mStretchable = pNewValue;
501 - }
502 -
503 - @Override
504 - public int getDimension() {
505 - return getDimension( mOurUIObject );
506 - }
507 -
508 - @Override
509 - public int getDimensionMaxShrinkability() {
510 - return getOurInnerSize();
511 - }
512 -
513 - @Override
514 - public int getDecorationSize() {
515 - return mDecorationSize;
516 - }
517 -
518 - @Override
519 - public void deligateSetDimensionFromWidget( int pDimension ) {
520 - if ( setSizeableOuterIntDimension( pDimension ) ) {
521 - mOurUIObject.resized();
522 - distributeToChildrenChangedDimension(); // todo: Not Resizing
523 - }
524 - }
525 -
526 - @Override
527 - public void contentChangedResizeToParent() {
528 - if ( isStretchable() ) {
529 - ISizeableWidget zParentWidget = getVisableSizeableWidget( mOurUIObject.getParent() );
530 - if ( zParentWidget != null ) {
531 - ISizeableDimensionHelper zParentHelper = getAppropriateManager( zParentWidget );
532 - int newSize = zParentHelper.getDimension() - zParentHelper.getDecorationSize();
533 - setDimension( newSize );
534 - }
535 - }
536 - }
537 -
538 - @Override
539 - public String getWhat() {
540 - return mDimensionHelper.getWhat();
541 - }
542 -
543 - @Override
544 - public boolean isAdjustable() {
545 - return mDimensionHelper.isAdjustable();
546 - }
547 -
548 - @Override
549 - public int getPosition( Widget pWidget ) {
550 - return mDimensionHelper.getPosition( pWidget );
551 - }
552 -
553 - @Override
554 - public int getPosition( Element pElement ) {
555 - return mDimensionHelper.getPosition( pElement );
556 - }
557 -
558 - @Override
559 - public void setStyleDimension( Element pElement, int pDimension ) {
560 - mDimensionHelper.setStyleDimension( pElement, pDimension );
561 - }
562 -
563 - @Override
564 - public int getDimension( Element pElement ) {
565 - return mDimensionHelper.getDimension( pElement );
566 - }
567 -
568 - @Override
569 - public void setDimension( Widget pWidget, int pDimension ) {
570 - mDimensionHelper.setDimension( pWidget, pDimension );
571 - }
572 -
573 - @Override
574 - public int getDimension( Widget pWidget ) {
575 - return mDimensionHelper.getDimension( pWidget );
576 - }
577 -
578 - ////////////////////////////////////////////////////////////////////////////////////////////////////////////
579 -
580 - @Override
581 - abstract public void distributeToChildrenChangedDimension();
582 -
583 - abstract protected ISizeableDimensionHelper getAppropriateManager( ISizeableWidget pSizeableWidget );
584 -
585 - ////////////////////////////////////////////////////////////////////////////////////////////////////////////
586 -
587 - public boolean isAdjustmentsDetermined() {
588 - return mAdjustmentsDetermined;
589 - }
590 -
591 - private int getOurInnerSize() {
592 - int size = getDimension( mOuterElement );
593 - size -= mDecorationSize;
594 - return size;
595 - }
596 -
597 - private boolean setSizeableOuterIntDimension( int pDimension ) {
598 - //System.out.println( GWT.getTypeName( mOurUIObject ) + "{" + mOurUIObject.hashCode() + "} " +
599 - // getWhat() + " to " + pDimension );
600 - if ( (pDimension > 0) && determineAdjustments() ) {
601 - int size = pDimension + mAdjustDimensionBy;
602 - if ( 0 <= size ) {
603 - setStyleDimension( mStyleElement, size );
604 - return true;
605 - }
606 - }
607 - return false;
608 - }
609 -
610 - private int getOurInnerSizeWithAllowanceForScrollBars() {
611 - int size = getOurInnerSize();
612 - return mHidden ? size : size - 20;
613 - }
614 -
615 - @Override
616 - public void setDimension( int pDimension ) {
617 - setDimension( mOurUIObject, pDimension );
618 - }
619 -
620 - private boolean mAdjustmentsDetermined = false;
621 - private int mAdjustDimensionBy = 0;
622 - private int mDecorationSize = 0;
623 -
624 - private boolean determineAdjustments() {
625 - if ( mAdjustmentsDetermined ) {
626 - return true;
627 - }
628 - if ( !mOurUIObject.isVisible() ) {
629 - return false;
630 - }
631 - int dimOuter = getDimension( mOuterElement );
632 - int dimInner = getDimension( mInnerElement );
633 - mDecorationSize = dimOuter - dimInner;
634 - if ( mDecorationSize != 0 ) {
635 - // Now determine if the Decoration is inside or outside of the set"Dimension" on the Style Element
636 - Element element = mStyleElement;
637 - setStyleDimension( element, dimOuter );
638 - int postSet_dimension = getDimension( mOuterElement );
639 - if ( dimOuter == postSet_dimension ) // IE - growth (margins/borders/padding) is inside
640 - { // . . . . . . . . . . . . . . . . . . . . . . . . . . or there is NO Growth
641 - mAdjustDimensionBy = 0;
642 - } else // Firefox - growth (margins/borders/padding) is outside
643 - {
644 - mAdjustDimensionBy = dimOuter - postSet_dimension;
645 - setStyleDimension( element, dimOuter + mAdjustDimensionBy ); // put it back
646 - if ( dimOuter != getDimension( mOuterElement ) ) {
647 - System.err.println( "Adjustment by " + mAdjustDimensionBy + " did NOT restore the " + getWhat() );
648 - }
649 - }
650 - // String msg = "Set" + getWhat() + "( " + pDimension + " ) adjustments on:" + //
651 - // " " + GWT.getTypeName( mOurUIObject ) + ":" + //
652 - // " " + mInnerAdjustDimension + " <inner | outer> " + mOuterAdjustDimension;
653 - // System.out.println( msg );
654 - }
655 - return mAdjustmentsDetermined = true;
656 - }
657 - }
658 -
659 - /**
660 - * @noinspection UnusedDeclaration
661 - */
662 - private void sout( String pPrefix, Element pElement ) {
663 - String s = pElement.toString();
664 - String toFind = "class=";
665 - int at = s.indexOf( toFind );
666 - if ( at != -1 ) {
667 - String t = s.substring( at + toFind.length() );
668 - if ( t.startsWith( toFind = "\"" ) ) {
669 - t = t.substring( 1 );
670 - } else {
671 - toFind = " ";
672 - }
673 - if ( -1 != (at = t.indexOf( toFind )) ) {
674 - s = t.substring( 0, at );
675 - }
676 - }
677 - System.out.println( pPrefix + ": " + s );
678 - }
679 -
680 - /**
681 - * @noinspection UnusedDeclaration
682 - */
683 - private void sout( String pPrefix, Widget pWidget ) {
684 - String s = pWidget.toString();
685 - String toFind = "\n";
686 - int at = s.indexOf( toFind );
687 - if ( at != -1 ) {
688 - s = s.substring( 0, at ).trim();
689 - }
690 - System.out.println( pPrefix + ": " + s );
691 - }
692 -
693 - private static class ChildCollector {
694 - private int mNewSize = 0;
695 - private List<ChildStructure> mChildStructures = Collections.emptyList();
696 -
697 - public boolean process( IndexedPanel pIndexedPanel, ISizeableDimensionHelper pDimensionHelper ) {
698 - Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
699 - mNewSize = zDimHelper.getOurInnerSizeWithAllowanceForScrollBars();
700 - int wc = pIndexedPanel.getWidgetCount();
701 - if ( (mNewSize == 0) || (wc == 0) ) {
702 - return false;
703 - }
704 - for ( int i = 0; i < wc; i++ ) {
705 - Widget zChildWidget = pIndexedPanel.getWidget( i );
706 - int zChildCurSize = zDimHelper.getDimension( zChildWidget );
707 - //noinspection UnnecessaryLocalVariable
708 - int zChildStyledSize = zDimHelper.getDimension( DOM.getParent( zChildWidget.getElement() ) );
709 - mNewSize -= zChildStyledSize;
710 - ISizeableWidget zSizeableWidget = getVisableSizeableWidget( zChildWidget );
711 - if ( zSizeableWidget != null ) {
712 - if ( mChildStructures.isEmpty() ) {
713 - mChildStructures = new ArrayList<ChildStructure>();
714 - }
715 - ISizeableDimensionHelper zChildHelper = zDimHelper.getAppropriateManager( zSizeableWidget );
716 - mChildStructures.add( new ChildStructure( zChildWidget, zChildCurSize, zChildHelper ) );
717 - }
718 - }
719 - return !mChildStructures.isEmpty();
720 - }
721 -
722 - public int getNewSize() {
723 - return mNewSize;
724 - }
725 -
726 - public List<ChildStructure> getChildStructures() {
727 - return mChildStructures;
728 - }
729 - }
730 -
731 - private static class ChildStructure {
732 - private Widget mWidget;
733 - private int mCurSize;
734 - private ISizeableDimensionHelper mHelper;
735 -
736 - public ChildStructure( Widget pWidget, int pCurSize, ISizeableDimensionHelper pHelper ) {
737 - mWidget = pWidget;
738 - mCurSize = pCurSize;
739 - mHelper = pHelper;
740 - }
741 -
742 - public Widget getWidget() {
743 - return mWidget;
744 - }
745 -
746 - public int getCurSize() {
747 - return mCurSize;
748 - }
749 -
750 - public ISizeableDimensionHelper getHelper() {
751 - return mHelper;
752 - }
753 - }
754 - }
1 + // This Source Code is in the Public Domain per: http://unlicense.org
2 + package org.litesoft.GWT.client.widgets.nonpublic;
3 +
4 + import org.litesoft.commonfoundation.base.*;
5 +
6 + import com.google.gwt.core.client.*;
7 + import com.google.gwt.user.client.*;
8 + import com.google.gwt.user.client.ui.*;
9 + import com.google.gwt.user.client.ui.impl.*;
10 +
11 + import java.util.*;
12 +
13 + /**
14 + * To be used in conjunction with AbstractSizeableWidget
15 + */
16 + public class AbstractSizeableHelper extends CommonElementHelper {
17 + private static final OuterSandwichHelper OUTER_SANDWICH_FACTORY = (OuterSandwichHelper) GWT.create( OuterSandwichHelper.class );
18 + private static final FocusImpl FOCUS_PANEL_FACTORY = FocusImpl.getFocusImplForPanel();
19 +
20 + private AbstractSizeableWidget mOurUIObject;
21 + private boolean mHidden;
22 + private Element mOuterElement;
23 + private Element mStyleElement;
24 + private Element mInnerElement;
25 + private Element mFieldSetLegend = null;
26 + private Size_1DHelper mWidthHelper = new WidthHelper();
27 + private Size_1DHelper mHeightHelper = new HeightHelper();
28 + private static final String INNER_CONSTRAINER = "LayoutMinSizeConstrainer";
29 + private static final String OUTER_CONSTRAINER = "LayoutDivConstrainer";
30 +
31 + public AbstractSizeableHelper( AbstractSizeableWidget pOurUIObject ) {
32 + // ***** may NOT do anything with the UiObject here, as it is not fully initialized yet!!!!!
33 + mOurUIObject = pOurUIObject;
34 + }
35 +
36 + public boolean isOverflowHidden() {
37 + return mHidden;
38 + }
39 +
40 + public Element getOuterElement() {
41 + return mOuterElement;
42 + }
43 +
44 + public Element getStyleElement() {
45 + return mStyleElement;
46 + }
47 +
48 + public Element getInnerElement() {
49 + return mInnerElement;
50 + }
51 +
52 + public void setInnerElement( Element pInnerElement ) {
53 + mInnerElement = pInnerElement;
54 + }
55 +
56 + public Element getFieldSetLegend() {
57 + return mFieldSetLegend;
58 + }
59 +
60 + public void setUpSpecialPart1( Element pDivSizeTable, Element pDiv, Element pInnerElement ) {
61 + mOuterElement = pDivSizeTable;
62 + mStyleElement = pDiv;
63 + mInnerElement = pInnerElement;
64 + }
65 +
66 + /**
67 + * @param pHidden true == Hidden / false == auto
68 + */
69 + public String setUpSpecialPart2( boolean pHidden ) {
70 + return determineOverflowClass( mHidden = pHidden );
71 + }
72 +
73 + /**
74 + * @param pHidden true == Hidden / false == auto
75 + *
76 + * @return pInnerElement
77 + */
78 + public Element create_OeTable_SeDiv_IeGraph( boolean pHidden, Element pGraphRoot, Element pInnerElement ) {
79 + mStyleElement = appendChild( createDiv( pHidden ), pGraphRoot );
80 + mOuterElement = createTableDivConstrainer( mStyleElement );
81 + return mInnerElement = pInnerElement;
82 + }
83 +
84 + /**
85 + * @param pHidden true == Hidden / false == auto
86 + *
87 + * @return Div
88 + */
89 + public Element create_OeTable_SeDiv( boolean pHidden ) {
90 + mStyleElement = createDiv( pHidden );
91 + mOuterElement = createTableDivConstrainer( mStyleElement );
92 + return mStyleElement;
93 + }
94 +
95 + /**
96 + * @return Div
97 + */
98 + public Element create_OeSeIeOverflowHiddenSingleDivSandwich() {
99 + return mOuterElement = mStyleElement = mInnerElement = createDiv( true );
100 + }
101 +
102 + /**
103 + * @return TBody
104 + */
105 + public Element create_OeSeIeOverflowHiddenCommonDiv_TableToTBody() {
106 + Element rv = DOM.createTBody();
107 + appendChild( create_OeSeIeOverflowHiddenSingleDivSandwich(), //
108 + createMinSizeConstrainingTableToTBody( rv ) );
109 + return rv;
110 + }
111 +
112 + /**
113 + * @return TBody
114 + */
115 + public Element create_OeTable_SeIeTBody() {
116 + mHidden = true;
117 + Element rv = mStyleElement = mInnerElement = DOM.createTBody();
118 + mOuterElement = createMinSizeConstrainingTableToTBody( rv );
119 + return rv;
120 + }
121 +
122 + /**
123 + * @param pHidden true == Hidden / false == auto
124 + *
125 + * @return Div
126 + */
127 + public Element create_OeTable_SeDiv_IeDiv( boolean pHidden ) {
128 + return create_OeTable_SeStyle_IeDiv( createDiv( pHidden ) );
129 + }
130 +
131 + /**
132 + * @param pHidden true == Hidden / false == auto
133 + *
134 + * @return Div
135 + */
136 + public Element create_OeTable_SeDiv_IeFocusDiv( boolean pHidden ) {
137 + return create_OeWidget_SeStyle_IeInner( createDiv( pHidden ), FOCUS_PANEL_FACTORY.createFocusable() );
138 + }
139 +
140 + /**
141 + * @param pHidden true == Hidden / false == auto
142 + *
143 + * @return Div
144 + */
145 + public Element create_OeTable_SeFieldSet_IeDiv( boolean pHidden, String pTitle ) {
146 + return create_OeTable_SeStyle_IeDiv( createFieldSet( pHidden, pTitle ) );
147 + }
148 +
149 + /**
150 + * @param pHidden true == Hidden / false == auto
151 + *
152 + * @return TR
153 + */
154 + public Element create_OeWidget_SeDiv_IeTableToTR( boolean pHidden ) {
155 + return create_OeWidget_SeStyle_IeTableToTR( createDiv( pHidden ) );
156 + }
157 +
158 + /**
159 + * @param pHidden true == Hidden / false == auto
160 + *
161 + * @return TR
162 + */
163 + public Element create_OeWidget_SeFieldSet_IeTableToTR( boolean pHidden, String pTitle ) {
164 + return create_OeWidget_SeStyle_IeTableToTR( createFieldSet( pHidden, pTitle ) );
165 + }
166 +
167 + /**
168 + * @return TR
169 + */
170 + private Element create_OeWidget_SeStyle_IeTableToTR( Element pStyleElement ) {
171 + Element rv = DOM.createTR();
172 + create_OeWidget_SeStyle_IeInner( pStyleElement, createMinSizeConstrainingTableToTR( rv ) );
173 + return rv;
174 + }
175 +
176 + /**
177 + * @param pHidden true == Hidden / false == auto
178 + *
179 + * @return TBody
180 + */
181 + public Element create_OeWidget_SeDiv_IeTableToTBody( boolean pHidden ) {
182 + return create_OeWidget_SeStyle_IeTableToTBody( createDiv( pHidden ) );
183 + }
184 +
185 + /**
186 + * @param pHidden true == Hidden / false == auto
187 + *
188 + * @return TBody
189 + */
190 + public Element create_OeWidget_SeFieldSet_IeTableToTBody( boolean pHidden, String pTitle ) {
191 + return create_OeWidget_SeStyle_IeTableToTBody( createFieldSet( pHidden, pTitle ) );
192 + }
193 +
194 + /**
195 + * @return TBody
196 + */
197 + private Element create_OeWidget_SeStyle_IeTableToTBody( Element pStyleElement ) {
198 + Element rv = DOM.createTBody();
199 + create_OeWidget_SeStyle_IeInner( pStyleElement, createMinSizeConstrainingTableToTBody( rv ) );
200 + return rv;
201 + }
202 +
203 + private Element create_OeWidget_SeStyle_IeInner( Element pStyleElement, Element pInnerElement ) {
204 + mInnerElement = pInnerElement;
205 + mStyleElement = appendChild( pStyleElement, mInnerElement );
206 + mOuterElement = createOuterConstrainer( mStyleElement );
207 + return mInnerElement;
208 + }
209 +
210 + /**
211 + * @return Outer Widget
212 + */
213 + private Element createOuterConstrainer( Element pStyleElement ) {
214 + Element[] zElements = OUTER_SANDWICH_FACTORY.create( OUTER_CONSTRAINER );
215 + appendChild( zElements[1], pStyleElement );
216 + return zElements[0];
217 + }
218 +
219 + /**
220 + * @return Div
221 + */
222 + private Element create_OeTable_SeStyle_IeDiv( Element pStyleElement ) {
223 + mInnerElement = DOM.createDiv();
224 + mStyleElement = pStyleElement;
225 + mOuterElement = createTableDivConstrainer( appendChild( mStyleElement, mInnerElement ) );
226 + return mInnerElement;
227 + }
228 +
229 + /**
230 + * @return Table
231 + */
232 + private Element createMinSizeConstrainingTableToTR( Element pTR ) {
233 + return createMinSizeConstrainingTableToTBody( appendChild( DOM.createTBody(), pTR ) );
234 + }
235 +
236 + /**
237 + * @return Table
238 + */
239 + private Element createMinSizeConstrainingTableToTBody( Element pTBody ) {
240 + return appendChild( createMinSizeConstrainingTable(), pTBody );
241 + }
242 +
243 + /**
244 + * @return Table
245 + */
246 + public static Element createMinSizeConstrainingTable() {
247 + return createTable( INNER_CONSTRAINER );
248 + }
249 +
250 + /**
251 + * @return Table
252 + */
253 + public static Element createLayoutDivConstrainingTable() {
254 + return createTable( OUTER_CONSTRAINER );
255 + }
256 +
257 + /**
258 + * @return Div
259 + */
260 + public static Element createLayoutDivConstrainingDiv() {
261 + return createDiv( OUTER_CONSTRAINER );
262 + }
263 +
264 + /**
265 + * @return Table
266 + */
267 + private Element createTableDivConstrainer( Element pDiv ) {
268 + Element zTable = createLayoutDivConstrainingTable();
269 + appendChild( finishTableNgetTD( zTable ), pDiv );
270 + return zTable;
271 + }
272 +
273 + /**
274 + * @param pHidden true == Hidden / false == auto
275 + *
276 + * @return Div
277 + */
278 + private Element createDiv( boolean pHidden ) {
279 + return setOverflowClass( DOM.createDiv(), mHidden = pHidden );
280 + }
281 +
282 + /**
283 + * @param pHidden true == Hidden / false == auto
284 + *
285 + * @return FieldSet
286 + */
287 + private Element createFieldSet( boolean pHidden, String pLegend ) {
288 + Element zFieldSet = setOverflowClass( DOM.createFieldSet(), mHidden = pHidden );
289 + if ( null != (pLegend = ConstrainTo.significantOrNull( pLegend )) ) {
290 + mFieldSetLegend = DOM.createLegend();
291 + DOM.appendChild( zFieldSet, mFieldSetLegend );
292 + DOM.setInnerText( mFieldSetLegend, pLegend );
293 + }
294 + return zFieldSet;
295 + }
296 +
297 + public ISizeableDimensionHelper getWidthHelper() {
298 + return mWidthHelper;
299 + }
300 +
301 + public ISizeableDimensionHelper getHeightHelper() {
302 + return mHeightHelper;
303 + }
304 +
305 + public int distributeDimensionOnChildren( IndexedPanel pIndexedPanel, ISizeableDimensionHelper pDimensionHelper ) {
306 + ChildCollector collector = new ChildCollector();
307 + boolean anyToProcess = collector.process( pIndexedPanel, pDimensionHelper );
308 + int newSize = collector.getNewSize();
309 + if ( anyToProcess ) {
310 + List<ISizeableDimensionHelper> adjustables = new ArrayList<ISizeableDimensionHelper>();
311 + List<ChildStructure> zChildStructures = collector.getChildStructures();
312 + for ( ChildStructure zChildStructure : zChildStructures ) {
313 + ISizeableDimensionHelper zChildHelper = zChildStructure.getHelper();
314 + int zChildCurSize = zChildStructure.getCurSize();
315 + if ( zChildHelper.isStretchable() ) {
316 + //noinspection unchecked
317 + adjustables.add( zChildHelper );
318 + } else {
319 + zChildHelper.setDimension( zChildCurSize ); // Propagate Sizing...
320 + }
321 + }
322 + while ( !adjustables.isEmpty() ) {
323 + int delta = deltaPerAdjustable( adjustables.size(), newSize );
324 + ISizeableDimensionHelper zChildHelper = adjustables.remove( 0 );
325 + int curSize = zChildHelper.getDimension();
326 + zChildHelper.setDimension( curSize + delta );
327 + int adjustedNewSize = zChildHelper.getDimension();
328 + newSize -= adjustedNewSize - curSize;
329 + }
330 + }
331 + return newSize;
332 + }
333 +
334 + public int distributeDimensionToChild( IndexedPanel pIndexedPanel, ISizeableDimensionHelper pDimensionHelper, Widget pWidgetToAdjust ) {
335 + ChildCollector collector = new ChildCollector();
336 + boolean anyToProcess = collector.process( pIndexedPanel, pDimensionHelper );
337 + int newSize = collector.getNewSize();
338 + if ( anyToProcess ) {
339 + ISizeableDimensionHelper zChildHelperToBeAdjusted = null;
340 + List<ChildStructure> zChildStructures = collector.getChildStructures();
341 + for ( ChildStructure zChildStructure : zChildStructures ) {
342 + ISizeableDimensionHelper zChildHelper = zChildStructure.getHelper();
343 + int zChildCurSize = zChildStructure.getCurSize();
344 + if ( zChildStructure.getWidget() == pWidgetToAdjust ) {
345 + zChildHelperToBeAdjusted = zChildHelper;
346 + } else {
347 + zChildHelper.setDimension( zChildCurSize ); // Propagate Sizing...
348 + }
349 + }
350 + if ( zChildHelperToBeAdjusted != null ) {
351 + int delta = deltaPerAdjustable( 1, newSize );
352 + int curSize = zChildHelperToBeAdjusted.getDimension();
353 + zChildHelperToBeAdjusted.setDimension( curSize + delta );
354 + int adjustedNewSize = zChildHelperToBeAdjusted.getDimension();
355 + newSize -= adjustedNewSize - curSize;
356 + }
357 + if ( newSize != 0 ) {
358 + newSize = distributeDimensionOnChildren( pIndexedPanel, pDimensionHelper );
359 + }
360 + }
361 + return newSize;
362 + }
363 +
364 + public int applyChangedDimensionToChild( Widget pChildWidget, ISizeableDimensionHelper pDimensionHelper ) {
365 + Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
366 + int newSize = zDimHelper.getOurInnerSizeWithAllowanceForScrollBars();
367 + if ( zDimHelper.isAdjustmentsDetermined() ) {
368 + ISizeableWidget zSizeableWidget = getVisableSizeableWidget( pChildWidget );
369 + if ( zSizeableWidget != null ) {
370 + ISizeableDimensionHelper zChildHelper = zDimHelper.getAppropriateManager( zSizeableWidget );
371 + if ( zChildHelper.isStretchable() ) {
372 + zChildHelper.setDimension( pChildWidget, newSize );
373 + }
374 + }
375 + }
376 + return newSize;
377 + }
378 +
379 + public void applyChangedDimensionToChildren( IndexedPanel pIndexedPanel, ISizeableDimensionHelper pDimensionHelper ) {
380 + Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
381 + int newSize = zDimHelper.getOurInnerSizeWithAllowanceForScrollBars(); // todo: Resizing from Inner when it hasn't changed!
382 + setDimensionOnChildren( pIndexedPanel, zDimHelper, newSize );
383 + }
384 +
385 + public void forceAdjustDimensionOnChild( Widget pWidget, ISizeableDimensionHelper pDimensionHelper ) {
386 + Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
387 + int newSize = zDimHelper.getOurInnerSizeWithAllowanceForScrollBars();
388 + zDimHelper.setDimension( pWidget, newSize );
389 + }
390 +
391 + public void forceAdjustDimensionOnChild( Element pElement, ISizeableDimensionHelper pDimensionHelper ) {
392 + Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
393 + int newSize = zDimHelper.getOurInnerSizeWithAllowanceForScrollBars();
394 + zDimHelper.setStyleDimension( pElement, newSize );
395 + }
396 +
397 + public void setDimensionOnChildren( IndexedPanel pIndexedPanel, ISizeableDimensionHelper pDimensionHelper, int pNewSize ) {
398 + Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
399 + setDimensionOnChildren( pIndexedPanel, zDimHelper, pNewSize );
400 + }
401 +
402 + private void setDimensionOnChildren( IndexedPanel pIndexedPanel, Size_1DHelper pDimHelper, int pNewSize ) {
403 + int wc = pIndexedPanel.getWidgetCount();
404 + if ( (pNewSize > 0) && (wc != 0) ) {
405 + for ( int i = 0; i < wc; i++ ) {
406 + Widget zChildWidget = pIndexedPanel.getWidget( i );
407 + ISizeableWidget zSizeableWidget = getVisableSizeableWidget( zChildWidget );
408 + if ( zSizeableWidget != null ) {
409 + ISizeableDimensionHelper zChildHelper = pDimHelper.getAppropriateManager( zSizeableWidget );
410 + if ( zChildHelper.isStretchable() ) {
411 + zChildHelper.setDimension( zChildWidget, pNewSize );
412 + }
413 + }
414 + }
415 + }
416 + }
417 +
418 + private static ISizeableWidget getVisableSizeableWidget( Widget pWidget ) {
419 + return (pWidget instanceof ISizeableWidget) && pWidget.isVisible() ? // Order does Null Check
420 + (ISizeableWidget) pWidget : null;
421 + }
422 +
423 + private static int deltaPerAdjustable( int pAdjustables, int pDelta ) {
424 + if ( (pAdjustables == 0) || (pDelta == 0) ) {
425 + return 0;
426 + }
427 + if ( pAdjustables == 1 ) {
428 + return pDelta;
429 + }
430 + return ((pDelta < 0) ? pDelta - (pAdjustables - 1) : pDelta + (pAdjustables - 1)) / pAdjustables;
431 + }
432 +
433 + private class WidthHelper extends Size_1DHelper {
434 + public WidthHelper() {
435 + super( WidthDimensionHelper.INSTANCE );
436 + }
437 +
438 + @Override
439 + protected ISizeableDimensionHelper getAppropriateManager( ISizeableWidget pSizeableWidget ) {
440 + return pSizeableWidget.getWidthHelper();
441 + }
442 +
443 + @Override
444 + public boolean setPrefferredDimension() {
445 + return mOurUIObject.setPrefferredWidth();
446 + }
447 +
448 + @Override
449 + public boolean adjustSizeBy( int pDelta ) {
450 + return mOurUIObject.adjustWidthBy( pDelta );
451 + }
452 +
453 + @Override
454 + public void distributeToChildrenChangedDimension() {
455 + mOurUIObject.distributeToChildrenChangedWidth();
456 + }
457 + }
458 +
459 + private class HeightHelper extends Size_1DHelper {
460 + public HeightHelper() {
461 + super( HeightDimensionHelper.INSTANCE );
462 + }
463 +
464 + @Override
465 + protected ISizeableDimensionHelper getAppropriateManager( ISizeableWidget pSizeableWidget ) {
466 + return pSizeableWidget.getHeightHelper();
467 + }
468 +
469 + @Override
470 + public boolean setPrefferredDimension() {
471 + return mOurUIObject.setPrefferredHeight();
472 + }
473 +
474 + @Override
475 + public boolean adjustSizeBy( int pDelta ) {
476 + return mOurUIObject.adjustHeightBy( pDelta );
477 + }
478 +
479 + @Override
480 + public void distributeToChildrenChangedDimension() {
481 + mOurUIObject.distributeToChildrenChangedHeight();
482 + }
483 + }
484 +
485 + private abstract class Size_1DHelper implements ISizeableDimensionHelper {
486 + protected boolean mStretchable = false;
487 + private IDimensionHelper mDimensionHelper;
488 +
489 + protected Size_1DHelper( IDimensionHelper pDimensionHelper ) {
490 + mDimensionHelper = pDimensionHelper;
491 + }
492 +
493 + @Override
494 + public boolean isStretchable() {
495 + return mStretchable;
496 + }
497 +
498 + @Override
499 + public void setStretchable( boolean pNewValue ) {
500 + mStretchable = pNewValue;
501 + }
502 +
503 + @Override
504 + public int getDimension() {
505 + return getDimension( mOurUIObject );
506 + }
507 +
508 + @Override
509 + public int getDimensionMaxShrinkability() {
510 + return getOurInnerSize();
511 + }
512 +
513 + @Override
514 + public int getDecorationSize() {
515 + return mDecorationSize;
516 + }
517 +
518 + @Override
519 + public void deligateSetDimensionFromWidget( int pDimension ) {
520 + if ( setSizeableOuterIntDimension( pDimension ) ) {
521 + mOurUIObject.resized();
522 + distributeToChildrenChangedDimension(); // todo: Not Resizing
523 + }
524 + }
525 +
526 + @Override
527 + public void contentChangedResizeToParent() {
528 + if ( isStretchable() ) {
529 + ISizeableWidget zParentWidget = getVisableSizeableWidget( mOurUIObject.getParent() );
530 + if ( zParentWidget != null ) {
531 + ISizeableDimensionHelper zParentHelper = getAppropriateManager( zParentWidget );
532 + int newSize = zParentHelper.getDimension() - zParentHelper.getDecorationSize();
533 + setDimension( newSize );
534 + }
535 + }
536 + }
537 +
538 + @Override
539 + public String getWhat() {
540 + return mDimensionHelper.getWhat();
541 + }
542 +
543 + @Override
544 + public boolean isAdjustable() {
545 + return mDimensionHelper.isAdjustable();
546 + }
547 +
548 + @Override
549 + public int getPosition( Widget pWidget ) {
550 + return mDimensionHelper.getPosition( pWidget );
551 + }
552 +
553 + @Override
554 + public int getPosition( Element pElement ) {
555 + return mDimensionHelper.getPosition( pElement );
556 + }
557 +
558 + @Override
559 + public void setStyleDimension( Element pElement, int pDimension ) {
560 + mDimensionHelper.setStyleDimension( pElement, pDimension );
561 + }
562 +
563 + @Override
564 + public int getDimension( Element pElement ) {
565 + return mDimensionHelper.getDimension( pElement );
566 + }
567 +
568 + @Override
569 + public void setDimension( Widget pWidget, int pDimension ) {
570 + mDimensionHelper.setDimension( pWidget, pDimension );
571 + }
572 +
573 + @Override
574 + public int getDimension( Widget pWidget ) {
575 + return mDimensionHelper.getDimension( pWidget );
576 + }
577 +
578 + ////////////////////////////////////////////////////////////////////////////////////////////////////////////
579 +
580 + @Override
581 + abstract public void distributeToChildrenChangedDimension();
582 +
583 + abstract protected ISizeableDimensionHelper getAppropriateManager( ISizeableWidget pSizeableWidget );
584 +
585 + ////////////////////////////////////////////////////////////////////////////////////////////////////////////
586 +
587 + public boolean isAdjustmentsDetermined() {
588 + return mAdjustmentsDetermined;
589 + }
590 +
591 + private int getOurInnerSize() {
592 + int size = getDimension( mOuterElement );
593 + size -= mDecorationSize;
594 + return size;
595 + }
596 +
597 + private boolean setSizeableOuterIntDimension( int pDimension ) {
598 + //System.out.println( GWT.getTypeName( mOurUIObject ) + "{" + mOurUIObject.hashCode() + "} " +
599 + // getWhat() + " to " + pDimension );
600 + if ( (pDimension > 0) && determineAdjustments() ) {
601 + int size = pDimension + mAdjustDimensionBy;
602 + if ( 0 <= size ) {
603 + setStyleDimension( mStyleElement, size );
604 + return true;
605 + }
606 + }
607 + return false;
608 + }
609 +
610 + private int getOurInnerSizeWithAllowanceForScrollBars() {
611 + int size = getOurInnerSize();
612 + return mHidden ? size : size - 20;
613 + }
614 +
615 + @Override
616 + public void setDimension( int pDimension ) {
617 + setDimension( mOurUIObject, pDimension );
618 + }
619 +
620 + private boolean mAdjustmentsDetermined = false;
621 + private int mAdjustDimensionBy = 0;
622 + private int mDecorationSize = 0;
623 +
624 + private boolean determineAdjustments() {
625 + if ( mAdjustmentsDetermined ) {
626 + return true;
627 + }
628 + if ( !mOurUIObject.isVisible() ) {
629 + return false;
630 + }
631 + int dimOuter = getDimension( mOuterElement );
632 + int dimInner = getDimension( mInnerElement );
633 + mDecorationSize = dimOuter - dimInner;
634 + if ( mDecorationSize != 0 ) {
635 + // Now determine if the Decoration is inside or outside of the set"Dimension" on the Style Element
636 + Element element = mStyleElement;
637 + setStyleDimension( element, dimOuter );
638 + int postSet_dimension = getDimension( mOuterElement );
639 + if ( dimOuter == postSet_dimension ) // IE - growth (margins/borders/padding) is inside
640 + { // . . . . . . . . . . . . . . . . . . . . . . . . . . or there is NO Growth
641 + mAdjustDimensionBy = 0;
642 + } else // Firefox - growth (margins/borders/padding) is outside
643 + {
644 + mAdjustDimensionBy = dimOuter - postSet_dimension;
645 + setStyleDimension( element, dimOuter + mAdjustDimensionBy ); // put it back
646 + if ( dimOuter != getDimension( mOuterElement ) ) {
647 + System.err.println( "Adjustment by " + mAdjustDimensionBy + " did NOT restore the " + getWhat() );
648 + }
649 + }
650 + // String msg = "Set" + getWhat() + "( " + pDimension + " ) adjustments on:" + //
651 + // " " + GWT.getTypeName( mOurUIObject ) + ":" + //
652 + // " " + mInnerAdjustDimension + " <inner | outer> " + mOuterAdjustDimension;
653 + // System.out.println( msg );
654 + }
655 + return mAdjustmentsDetermined = true;
656 + }
657 + }
658 +
659 + /**
660 + * @noinspection UnusedDeclaration
661 + */
662 + private void sout( String pPrefix, Element pElement ) {
663 + String s = pElement.toString();
664 + String toFind = "class=";
665 + int at = s.indexOf( toFind );
666 + if ( at != -1 ) {
667 + String t = s.substring( at + toFind.length() );
668 + if ( t.startsWith( toFind = "\"" ) ) {
669 + t = t.substring( 1 );
670 + } else {
671 + toFind = " ";
672 + }
673 + if ( -1 != (at = t.indexOf( toFind )) ) {
674 + s = t.substring( 0, at );
675 + }
676 + }
677 + System.out.println( pPrefix + ": " + s );
678 + }
679 +
680 + /**
681 + * @noinspection UnusedDeclaration
682 + */
683 + private void sout( String pPrefix, Widget pWidget ) {
684 + String s = pWidget.toString();
685 + String toFind = "\n";
686 + int at = s.indexOf( toFind );
687 + if ( at != -1 ) {
688 + s = s.substring( 0, at ).trim();
689 + }
690 + System.out.println( pPrefix + ": " + s );
691 + }
692 +
693 + private static class ChildCollector {
694 + private int mNewSize = 0;
695 + private List<ChildStructure> mChildStructures = Collections.emptyList();
696 +
697 + public boolean process( IndexedPanel pIndexedPanel, ISizeableDimensionHelper pDimensionHelper ) {
698 + Size_1DHelper zDimHelper = (Size_1DHelper) pDimensionHelper;
699 + mNewSize = zDimHelper.getOurInnerSizeWithAllowanceForScrollBars();
700 + int wc = pIndexedPanel.getWidgetCount();
701 + if ( (mNewSize == 0) || (wc == 0) ) {
702 + return false;
703 + }
704 + for ( int i = 0; i < wc; i++ ) {
705 + Widget zChildWidget = pIndexedPanel.getWidget( i );
706 + int zChildCurSize = zDimHelper.getDimension( zChildWidget );
707 + //noinspection UnnecessaryLocalVariable
708 + int zChildStyledSize = zDimHelper.getDimension( DOM.getParent( zChildWidget.getElement() ) );
709 + mNewSize -= zChildStyledSize;
710 + ISizeableWidget zSizeableWidget = getVisableSizeableWidget( zChildWidget );
711 + if ( zSizeableWidget != null ) {
712 + if ( mChildStructures.isEmpty() ) {
713 + mChildStructures = new ArrayList<ChildStructure>();
714 + }
715 + ISizeableDimensionHelper zChildHelper = zDimHelper.getAppropriateManager( zSizeableWidget );
716 + mChildStructures.add( new ChildStructure( zChildWidget, zChildCurSize, zChildHelper ) );
717 + }
718 + }
719 + return !mChildStructures.isEmpty();
720 + }
721 +
722 + public int getNewSize() {
723 + return mNewSize;
724 + }
725 +
726 + public List<ChildStructure> getChildStructures() {
727 + return mChildStructures;
728 + }
729 + }
730 +
731 + private static class ChildStructure {
732 + private Widget mWidget;
733 + private int mCurSize;
734 + private ISizeableDimensionHelper mHelper;
735 +
736 + public ChildStructure( Widget pWidget, int pCurSize, ISizeableDimensionHelper pHelper ) {
737 + mWidget = pWidget;
738 + mCurSize = pCurSize;
739 + mHelper = pHelper;
740 + }
741 +
742 + public Widget getWidget() {
743 + return mWidget;
744 + }
745 +
746 + public int getCurSize() {
747 + return mCurSize;
748 + }
749 +
750 + public ISizeableDimensionHelper getHelper() {
751 + return mHelper;
752 + }
753 + }
754 + }