litesoft
@ 939
litesoft / trunk / GWT_Sandbox / FormEngine / src / com / temp / client / foundation / util / AbstractSameSize.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
package com.temp.client.foundation.util; import com.google.gwt.user.client.ui.*; import java.util.*; public abstract class AbstractSameSize extends com.google.gwt.user.client.Timer { private static final int MAX_INT = Integer.MAX_VALUE / 2; private List<Widget> mWidgets; private int mDelay = 50; private int mMaxX, mMaxY; private boolean mProcessX, mProcessY; private boolean mAllAttached = false; private boolean mSizingWorking; private boolean mAnyResizingNeeded; protected AbstractSameSize( boolean pProcessX, boolean pProcessY, Widget... pWidgets ) { mProcessX = pProcessX; mProcessY = pProcessY; if ( pWidgets != null ) { mWidgets = new ArrayList<Widget>( pWidgets.length ); for ( Widget zWidget : pWidgets ) { if ( zWidget != null ) { mWidgets.add( zWidget ); } } if ( mWidgets.size() > 1 ) { run(); } } } protected static Widget[] toArray( Collection<Widget> pWidgets ) { return (pWidgets != null) ? pWidgets.toArray( new Widget[pWidgets.size()] ) : null; } @Override public void run() { mAnyResizingNeeded = false; mSizingWorking = true; Widget zWidget; if ( !mAllAttached ) { for ( int i = 0; i < mWidgets.size(); i++ ) { if ( null == (zWidget = get( i )) ) { schedule( mDelay ); return; } } mAllAttached = true; } for ( int i = 0; i < mWidgets.size(); i++ ) { if ( null == (zWidget = get( i )) ) { return; // Lost Attachment } if ( mProcessX ) { mMaxX = checkSize( mMaxX, zWidget.getOffsetWidth() ); } if ( mProcessY ) { mMaxY = checkSize( mMaxY, zWidget.getOffsetHeight() ); } } if ( mSizingWorking ) { if ( !mAnyResizingNeeded ) { return; // Done! } for ( int i = 0; i < mWidgets.size(); i++ ) { if ( null != (zWidget = get( i )) ) { if ( mProcessX && (mMaxX > zWidget.getOffsetWidth()) ) { zWidget.setWidth( mMaxX + "px" ); } if ( mProcessY && (mMaxY > zWidget.getOffsetHeight()) ) { zWidget.setHeight( mMaxY + "px" ); } } } } if ( mDelay < MAX_INT ) { schedule( mDelay += mDelay ); // Double each time } } private int checkSize( int pMaxSize, int pOffsetSize ) { if ( pOffsetSize < 10 ) { mSizingWorking = false; return pMaxSize; } if ( pMaxSize == 0 ) { return pOffsetSize; } mAnyResizingNeeded |= (pOffsetSize != pMaxSize); return Math.max( pOffsetSize, pMaxSize ); } private Widget get( int pIndex ) { Widget zWidget = mWidgets.get( pIndex ); if ( zWidget.isAttached() ) { return zWidget; } System.out.println( "Not Attached: " + zWidget ); return null; } } |