Subversion Repository Public Repository

litesoft

Diff Revisions 949 vs 950 for /trunk/Java/GWT/Client/src/org/litesoft/GWT/forms/client/components/impls/input/FormTextarea.java

Diff revisions: vs.
  @@ -1,434 +1,434 @@
1 - // This Source Code is in the Public Domain per: http://unlicense.org
2 - package org.litesoft.GWT.forms.client.components.impls.input;
3 -
4 - import org.litesoft.GWT.client.widgets.*;
5 - import org.litesoft.GWT.client.widgets.nonpublic.*;
6 - import org.litesoft.GWT.forms.client.components.nonpublic.*;
7 - import org.litesoft.commonfoundation.charstreams.*;
8 - import org.litesoft.commonfoundation.html.*;
9 - import org.litesoft.uispecification.*;
10 -
11 - import com.google.gwt.core.client.*;
12 - import com.google.gwt.user.client.*;
13 - import com.google.gwt.user.client.ui.*;
14 -
15 - public class FormTextarea extends AbstractTextElement {
16 - private DeckPanel mDeck;
17 - private DisabledTextArea mDisabledTextArea;
18 -
19 - public FormTextarea( String pFieldLabel, UiFont pLabelFont, String pTooltip, boolean pNoWrapContents, //
20 - Integer pInitialWidth, boolean pWidthNotStretchable, //
21 - Integer pInitialLines, boolean pHeightNotStretchable ) {
22 - super( new TextAreaChangeListenable( pInitialWidth, pInitialLines, pNoWrapContents ), pTooltip, "frmTxtArea" );
23 - mWidthHelper = pWidthNotStretchable ? NullWidthHelper.INSTANCE : new StretchableWidthHelper( this );
24 - mHeightHelper = pHeightNotStretchable ? NullHeightHelper.INSTANCE : new StretchableHeightHelper( this );
25 -
26 - mDisabledTextArea = new DisabledTextArea( pNoWrapContents );
27 -
28 - mDeck = new MyDeckPanel( new SizingWrapper( mInputWidget, mInputWidget ), //
29 - new SizingWrapper( mDisabledTextArea, mDisabledTextArea.getSizeablePanel() ) );
30 -
31 - initialize( pFieldLabel, pLabelFont, pTooltip );
32 - }
33 -
34 - @Override
35 - protected String buildInputRow( String pTrId, String pInputId, int pUniqueID ) {
36 - return "<tr>" + //
37 - "<td id='" + pInputId + "' class='litesoft-FormComponentInputRow'></td>" + //
38 - "<td valign='top'>" + //
39 - "<table cellpadding='0' cellspacing='0'>" + "<tr><td style='font-size:1px;'>&nbsp;</td></tr><tr id='" + pTrId +
40 - "' class='litesoft-FormComponentInputRow'></tr>" + //
41 - "</table>" + //
42 - "</td>" +//
43 - "</tr>";
44 - }
45 -
46 - @Override
47 - protected Widget getInjectedInputWidget() {
48 - return mDeck;
49 - }
50 -
51 - @Override
52 - public void setEnabled( boolean pEnabled ) {
53 - super.setEnabled( pEnabled );
54 - if ( pEnabled ) {
55 - enableTextArea();
56 - } else {
57 - disableTextArea();
58 - }
59 - }
60 -
61 - public void disableTextArea() {
62 - copyValueToDisabledTextArea();
63 - mDeck.showWidget( 1 );
64 - }
65 -
66 - public void enableTextArea() {
67 - mDeck.showWidget( 0 );
68 - }
69 -
70 - public String getValue() {
71 - return ((TextArea) mInputWidget).getText();
72 - }
73 -
74 - @Override
75 - public void setCurrentText( String pNewText ) {
76 - super.setCurrentText( pNewText );
77 - if ( !isEnabled() ) {
78 - copyValueToDisabledTextArea();
79 - }
80 - }
81 -
82 - // Support...
83 -
84 - private void copyValueToDisabledTextArea() {
85 - String value = getValue();
86 - mDisabledTextArea.setText( convertDisplayText( value ) );
87 - }
88 -
89 - private String convertDisplayText( String pInput ) {
90 - StringBuilder sb = new StringBuilder();
91 -
92 - CharSource zCS = new CharSourceFromSequence( pInput );
93 - while ( zCS.anyRemaining() ) {
94 - int c = zCS.get();
95 - if ( c == '\r' ) {
96 - if ( '\n' == zCS.peek() ) {
97 - continue;
98 - }
99 - sb.append( "<br>" );
100 - } else if ( (c == ' ') && (' ' == zCS.peek()) ) {
101 - sb.append( HTMLConstants.NBSP );
102 - } else if ( c == '\n' ) {
103 - sb.append( "<br>" );
104 - } else if ( c == '<' ) {
105 - sb.append( "&lt;" );
106 - } else {
107 - sb.append( (char) c );
108 - }
109 - }
110 -
111 - sb.append( HTMLConstants.NBSP );
112 - return sb.toString();
113 - }
114 -
115 - private static class StretchableHeightHelper extends AbstractHeightHelper {
116 - private FormTextarea mOurWidget;
117 - private Integer mInputDecorationSize = null;
118 -
119 - public StretchableHeightHelper( FormTextarea pOurWidget ) {
120 - super( true );
121 - mOurWidget = pOurWidget;
122 - }
123 -
124 - @Override
125 - public void setDimension( int pDimension ) {
126 - setDimension( mOurWidget, pDimension );
127 - }
128 -
129 - @Override
130 - public int getDimension() {
131 - return getDimension( mOurWidget );
132 - }
133 -
134 - @Override
135 - public int getDimensionMaxShrinkability() {
136 - return getDimension( mOurWidget.getInjectedInputWidget() ) - 6;
137 - }
138 -
139 - @Override
140 - public int getDecorationSize() {
141 - return getDimension() - getDimension( mOurWidget.mDeck );
142 - }
143 -
144 - @Override
145 - public void deligateSetDimensionFromWidget( int pDimension ) {
146 - Label label = mOurWidget.mLabel;
147 - if ( label != null ) {
148 - pDimension -= getDimension( label );
149 - }
150 - pDimension -= getInputDecorationSize();
151 - pDimension -= getOuterSandwichDecorationSize();
152 - if ( pDimension > 6 ) {
153 - setDimension( mOurWidget.getInjectedInputWidget(), pDimension );
154 - }
155 - }
156 -
157 - private int getInputDecorationSize() {
158 - if ( mInputDecorationSize == null ) {
159 - if ( !mOurWidget.isAttached() ) {
160 - return 9999;
161 - }
162 - mInputDecorationSize = getDimension( getGrandParent( mOurWidget.getInjectedInputWidget() ) ) - //
163 - getDimension( mOurWidget.getInjectedInputWidget() );
164 - }
165 - return mInputDecorationSize;
166 - }
167 -
168 - private Integer mOuterSandwichDecorationSize = null;
169 -
170 - private int getOuterSandwichDecorationSize() {
171 - if ( mOuterSandwichDecorationSize == null ) {
172 - if ( !mOurWidget.isAttached() ) {
173 - return 9999;
174 - }
175 - Element zDivOrFS = mOurWidget.mInnerHTMLpanel.getElement();
176 - int children = DOM.getChildCount( zDivOrFS );
177 - Element zInnerBread = DOM.getChild( zDivOrFS, children - 1 );
178 - mOuterSandwichDecorationSize = getDimension( mOurWidget ) - getDimension( zInnerBread );
179 - }
180 - return mOuterSandwichDecorationSize;
181 - }
182 -
183 - private Element getGrandParent( Widget pWidget ) {
184 - return getGrandParent( pWidget.getElement() );
185 - }
186 -
187 - private Element getGrandParent( Element pElement ) {
188 - return getParent( getParent( pElement ) );
189 - }
190 -
191 - private Element getParent( Element pElement ) {
192 - return DOM.getParent( pElement );
193 - }
194 - }
195 -
196 - private static class MyDeckPanel extends DeckPanel {
197 - private SizingWrapper mWidget0, mWidget1;
198 -
199 - public MyDeckPanel( SizingWrapper pWidget0, SizingWrapper pWidget1 ) {
200 - add( mWidget0 = pWidget0 );
201 - add( mWidget1 = pWidget1 );
202 - showWidget( 0 );
203 - }
204 -
205 - @Override
206 - public void showWidget( int index ) {
207 - super.showWidget( index );
208 - mWidget0.shown( 0 == index );
209 - mWidget1.shown( 1 == index );
210 - }
211 -
212 - @Override
213 - public void setWidth( String width ) {
214 - mWidget0.setWidth( width );
215 - mWidget1.setWidth( width );
216 - }
217 -
218 - @Override
219 - public void setHeight( String height ) {
220 - mWidget0.setHeight( height );
221 - mWidget1.setHeight( height );
222 - }
223 -
224 - // matg: commented out for GWT 1.5. Have to call super or DeckPanel breaks
225 - // public void add( Widget w )
226 - // {
227 - // add( w, getElement() );
228 - // w.setVisible( false );
229 - // }
230 -
231 - @Override
232 - public void insert( Widget w, int beforeIndex ) {
233 - throw new IllegalStateException( "Only use add( w )" );
234 - }
235 - }
236 -
237 - private static class SizingWrapper extends HorizontalPanel {
238 - private SizeHelper mHeightHelper, mWidthHelper;
239 -
240 - public SizingWrapper( Widget pChild, Widget pSizingWidget ) {
241 - add( pChild );
242 - mHeightHelper = new HeightHelper( this, pSizingWidget );
243 - mWidthHelper = new WidthHelper( this, pSizingWidget );
244 - }
245 -
246 - public void shown( boolean pShown ) {
247 - mHeightHelper.shown( pShown );
248 - mWidthHelper.shown( pShown );
249 - }
250 -
251 - @Override
252 - public void setWidth( String width ) {
253 - mWidthHelper.setSize( width );
254 - }
255 -
256 - @Override
257 - public void setHeight( String height ) {
258 - mHeightHelper.setSize( height );
259 - }
260 -
261 - private static abstract class SizeHelper implements Command {
262 - private SizingWrapper mWrapper;
263 - private Widget mSizingWidget;
264 - private Integer mPendingSize = null;
265 - private Integer mOverheadSize = null;
266 -
267 - protected SizeHelper( SizingWrapper pWrapper, Widget pSizingWidget ) {
268 - mWrapper = pWrapper;
269 - mSizingWidget = pSizingWidget;
270 - }
271 -
272 - abstract protected int getSize( Widget pWidget );
273 -
274 - abstract protected void setSize( Widget pWidget, int pSize );
275 -
276 - public void setSize( String pSize ) {
277 - try {
278 - mPendingSize = AbstractSizeableWidget.parse( pSize );
279 - }
280 - catch ( NumberFormatException e ) {
281 - return;
282 - }
283 - applySize();
284 - }
285 -
286 - public void shown( boolean pShown ) {
287 - if ( pShown ) {
288 - applySize();
289 - }
290 - }
291 -
292 - private boolean mDeferred = false;
293 -
294 - private void applySize() {
295 - if ( mOverheadSize == null ) {
296 - if ( shouldDefer() ) {
297 - if ( !mDeferred ) {
298 - mDeferred = true;
299 - Scheduler.get().scheduleDeferred( this );
300 - }
301 - return;
302 - }
303 - int zWrapperSize = getSize( mWrapper );
304 - int zSizingSize = getSize( mSizingWidget );
305 - // System.out.println( this + ".applySize: " + zWrapperSize + "|" + zSizingSize );
306 - mOverheadSize = zWrapperSize - zSizingSize;
307 - }
308 - if ( mPendingSize != null ) {
309 - setSize( mSizingWidget, mPendingSize - mOverheadSize );
310 - }
311 - }
312 -
313 - private boolean shouldDefer() {
314 - boolean zAttached = mWrapper.isAttached();
315 - boolean zVisible = mWrapper.isVisible();
316 - int zSize = getSize( mWrapper );
317 - return !zAttached || !zVisible || (zSize < 20);
318 - }
319 -
320 - @Override
321 - public void execute() {
322 - mDeferred = false;
323 - applySize();
324 - }
325 - }
326 -
327 - private static class HeightHelper extends SizeHelper {
328 - public HeightHelper( SizingWrapper pWrapper, Widget pSizingWidget ) {
329 - super( pWrapper, pSizingWidget );
330 - }
331 -
332 - @Override
333 - protected int getSize( Widget pWidget ) {
334 - return pWidget.getOffsetHeight();
335 - }
336 -
337 - @Override
338 - protected void setSize( Widget pWidget, int pSize ) {
339 - pWidget.setHeight( "" + pSize );
340 - }
341 - }
342 -
343 - private static class WidthHelper extends SizeHelper {
344 - public WidthHelper( SizingWrapper pWrapper, Widget pSizingWidget ) {
345 - super( pWrapper, pSizingWidget );
346 - }
347 -
348 - @Override
349 - protected int getSize( Widget pWidget ) {
350 - return pWidget.getOffsetWidth();
351 - }
352 -
353 - @Override
354 - protected void setSize( Widget pWidget, int pSize ) {
355 - pWidget.setWidth( "" + pSize );
356 - }
357 - }
358 - }
359 -
360 - private static class DisabledTextArea extends SimplePanel {
361 - private InnerText mInnerTextAsHtml;
362 - private Widget mSizeablePanel;
363 -
364 - public DisabledTextArea( boolean pNoWrapContents ) {
365 - //noinspection GWTStyleCheck
366 - addStyleName( "litesoft-OuterDisabledTextArea" );
367 -
368 - SimplePanel innerPanel = new SimplePanel();
369 - //noinspection GWTStyleCheck
370 - innerPanel.addStyleName( "litesoft-InnerDisabledTextArea" );
371 - add( innerPanel );
372 -
373 - mInnerTextAsHtml = new InnerText();
374 -
375 - if ( pNoWrapContents ) {
376 - SimplePanel zSimplePanel = new SimplePanel();
377 - CommonElementHelper.setOverflowAuto( zSimplePanel.getElement() );
378 - CommonElementHelper.setWhiteSpaceWrap( mInnerTextAsHtml.getElement(), false );
379 - zSimplePanel.add( mInnerTextAsHtml );
380 -
381 - mSizeablePanel = zSimplePanel;
382 - } else {
383 - CommonElementHelper.setOverflowAuto( mInnerTextAsHtml.getElement() );
384 -
385 - mSizeablePanel = mInnerTextAsHtml;
386 - }
387 - innerPanel.add( mSizeablePanel );
388 - mSizeablePanel.setSize( "50", "50" );
389 - }
390 -
391 - public Widget getSizeablePanel() {
392 - return mSizeablePanel;
393 - }
394 -
395 - public void setText( String pText ) {
396 - if ( pText != null ) {
397 - mInnerTextAsHtml.setText( pText );
398 - }
399 - }
400 -
401 - public void setInnerHtml( String pText ) {
402 - if ( pText != null ) {
403 - DOM.setInnerHTML( mInnerTextAsHtml.getElement(), pText );
404 - }
405 - }
406 -
407 - @Override
408 - public void setWidth( String pWidth ) {
409 - mSizeablePanel.setWidth( pWidth );
410 - }
411 -
412 - @Override
413 - public void setHeight( String pHeight ) {
414 - mSizeablePanel.setHeight( pHeight );
415 - }
416 - }
417 -
418 - private static class InnerText extends Widget {
419 - public InnerText() {
420 - setElement( DOM.createDiv() );
421 - //noinspection GWTStyleCheck
422 - setStyleName( "litesoft-DisabledTextareaInnerText" );
423 - }
424 -
425 - public InnerText( String pText ) {
426 - this();
427 - setText( pText );
428 - }
429 -
430 - public void setText( String pText ) {
431 - DOM.setInnerHTML( getElement(), pText );
432 - }
433 - }
434 - }
1 + // This Source Code is in the Public Domain per: http://unlicense.org
2 + package org.litesoft.GWT.forms.client.components.impls.input;
3 +
4 + import org.litesoft.GWT.client.widgets.*;
5 + import org.litesoft.GWT.client.widgets.nonpublic.*;
6 + import org.litesoft.GWT.forms.client.components.nonpublic.*;
7 + import org.litesoft.commonfoundation.charstreams.*;
8 + import org.litesoft.commonfoundation.html.*;
9 + import org.litesoft.uispecification.*;
10 +
11 + import com.google.gwt.core.client.*;
12 + import com.google.gwt.user.client.*;
13 + import com.google.gwt.user.client.ui.*;
14 +
15 + public class FormTextarea extends AbstractTextElement {
16 + private DeckPanel mDeck;
17 + private DisabledTextArea mDisabledTextArea;
18 +
19 + public FormTextarea( String pFieldLabel, UiFont pLabelFont, String pTooltip, boolean pNoWrapContents, //
20 + Integer pInitialWidth, boolean pWidthNotStretchable, //
21 + Integer pInitialLines, boolean pHeightNotStretchable ) {
22 + super( new TextAreaChangeListenable( pInitialWidth, pInitialLines, pNoWrapContents ), pTooltip, "frmTxtArea" );
23 + mWidthHelper = pWidthNotStretchable ? NullWidthHelper.INSTANCE : new StretchableWidthHelper( this );
24 + mHeightHelper = pHeightNotStretchable ? NullHeightHelper.INSTANCE : new StretchableHeightHelper( this );
25 +
26 + mDisabledTextArea = new DisabledTextArea( pNoWrapContents );
27 +
28 + mDeck = new MyDeckPanel( new SizingWrapper( mInputWidget, mInputWidget ), //
29 + new SizingWrapper( mDisabledTextArea, mDisabledTextArea.getSizeablePanel() ) );
30 +
31 + initialize( pFieldLabel, pLabelFont, pTooltip );
32 + }
33 +
34 + @Override
35 + protected String buildInputRow( String pTrId, String pInputId, int pUniqueID ) {
36 + return "<tr>" + //
37 + "<td id='" + pInputId + "' class='litesoft-FormComponentInputRow'></td>" + //
38 + "<td valign='top'>" + //
39 + "<table cellpadding='0' cellspacing='0'>" + "<tr><td style='font-size:1px;'>&nbsp;</td></tr><tr id='" + pTrId +
40 + "' class='litesoft-FormComponentInputRow'></tr>" + //
41 + "</table>" + //
42 + "</td>" +//
43 + "</tr>";
44 + }
45 +
46 + @Override
47 + protected Widget getInjectedInputWidget() {
48 + return mDeck;
49 + }
50 +
51 + @Override
52 + public void setEnabled( boolean pEnabled ) {
53 + super.setEnabled( pEnabled );
54 + if ( pEnabled ) {
55 + enableTextArea();
56 + } else {
57 + disableTextArea();
58 + }
59 + }
60 +
61 + public void disableTextArea() {
62 + copyValueToDisabledTextArea();
63 + mDeck.showWidget( 1 );
64 + }
65 +
66 + public void enableTextArea() {
67 + mDeck.showWidget( 0 );
68 + }
69 +
70 + public String getValue() {
71 + return ((TextArea) mInputWidget).getText();
72 + }
73 +
74 + @Override
75 + public void setCurrentText( String pNewText ) {
76 + super.setCurrentText( pNewText );
77 + if ( !isEnabled() ) {
78 + copyValueToDisabledTextArea();
79 + }
80 + }
81 +
82 + // Support...
83 +
84 + private void copyValueToDisabledTextArea() {
85 + String value = getValue();
86 + mDisabledTextArea.setText( convertDisplayText( value ) );
87 + }
88 +
89 + private String convertDisplayText( String pInput ) {
90 + StringBuilder sb = new StringBuilder();
91 +
92 + CharSource zCS = new CharSourceFromSequence( pInput );
93 + while ( zCS.anyRemaining() ) {
94 + int c = zCS.get();
95 + if ( c == '\r' ) {
96 + if ( '\n' == zCS.peek() ) {
97 + continue;
98 + }
99 + sb.append( "<br>" );
100 + } else if ( (c == ' ') && (' ' == zCS.peek()) ) {
101 + sb.append( HtmlEntity.NBSP );
102 + } else if ( c == '\n' ) {
103 + sb.append( "<br>" );
104 + } else if ( c == '<' ) {
105 + sb.append( "&lt;" );
106 + } else {
107 + sb.append( (char) c );
108 + }
109 + }
110 +
111 + sb.append( HtmlEntity.NBSP );
112 + return sb.toString();
113 + }
114 +
115 + private static class StretchableHeightHelper extends AbstractHeightHelper {
116 + private FormTextarea mOurWidget;
117 + private Integer mInputDecorationSize = null;
118 +
119 + public StretchableHeightHelper( FormTextarea pOurWidget ) {
120 + super( true );
121 + mOurWidget = pOurWidget;
122 + }
123 +
124 + @Override
125 + public void setDimension( int pDimension ) {
126 + setDimension( mOurWidget, pDimension );
127 + }
128 +
129 + @Override
130 + public int getDimension() {
131 + return getDimension( mOurWidget );
132 + }
133 +
134 + @Override
135 + public int getDimensionMaxShrinkability() {
136 + return getDimension( mOurWidget.getInjectedInputWidget() ) - 6;
137 + }
138 +
139 + @Override
140 + public int getDecorationSize() {
141 + return getDimension() - getDimension( mOurWidget.mDeck );
142 + }
143 +
144 + @Override
145 + public void deligateSetDimensionFromWidget( int pDimension ) {
146 + Label label = mOurWidget.mLabel;
147 + if ( label != null ) {
148 + pDimension -= getDimension( label );
149 + }
150 + pDimension -= getInputDecorationSize();
151 + pDimension -= getOuterSandwichDecorationSize();
152 + if ( pDimension > 6 ) {
153 + setDimension( mOurWidget.getInjectedInputWidget(), pDimension );
154 + }
155 + }
156 +
157 + private int getInputDecorationSize() {
158 + if ( mInputDecorationSize == null ) {
159 + if ( !mOurWidget.isAttached() ) {
160 + return 9999;
161 + }
162 + mInputDecorationSize = getDimension( getGrandParent( mOurWidget.getInjectedInputWidget() ) ) - //
163 + getDimension( mOurWidget.getInjectedInputWidget() );
164 + }
165 + return mInputDecorationSize;
166 + }
167 +
168 + private Integer mOuterSandwichDecorationSize = null;
169 +
170 + private int getOuterSandwichDecorationSize() {
171 + if ( mOuterSandwichDecorationSize == null ) {
172 + if ( !mOurWidget.isAttached() ) {
173 + return 9999;
174 + }
175 + Element zDivOrFS = mOurWidget.mInnerHTMLpanel.getElement();
176 + int children = DOM.getChildCount( zDivOrFS );
177 + Element zInnerBread = DOM.getChild( zDivOrFS, children - 1 );
178 + mOuterSandwichDecorationSize = getDimension( mOurWidget ) - getDimension( zInnerBread );
179 + }
180 + return mOuterSandwichDecorationSize;
181 + }
182 +
183 + private Element getGrandParent( Widget pWidget ) {
184 + return getGrandParent( pWidget.getElement() );
185 + }
186 +
187 + private Element getGrandParent( Element pElement ) {
188 + return getParent( getParent( pElement ) );
189 + }
190 +
191 + private Element getParent( Element pElement ) {
192 + return DOM.getParent( pElement );
193 + }
194 + }
195 +
196 + private static class MyDeckPanel extends DeckPanel {
197 + private SizingWrapper mWidget0, mWidget1;
198 +
199 + public MyDeckPanel( SizingWrapper pWidget0, SizingWrapper pWidget1 ) {
200 + add( mWidget0 = pWidget0 );
201 + add( mWidget1 = pWidget1 );
202 + showWidget( 0 );
203 + }
204 +
205 + @Override
206 + public void showWidget( int index ) {
207 + super.showWidget( index );
208 + mWidget0.shown( 0 == index );
209 + mWidget1.shown( 1 == index );
210 + }
211 +
212 + @Override
213 + public void setWidth( String width ) {
214 + mWidget0.setWidth( width );
215 + mWidget1.setWidth( width );
216 + }
217 +
218 + @Override
219 + public void setHeight( String height ) {
220 + mWidget0.setHeight( height );
221 + mWidget1.setHeight( height );
222 + }
223 +
224 + // matg: commented out for GWT 1.5. Have to call super or DeckPanel breaks
225 + // public void add( Widget w )
226 + // {
227 + // add( w, getElement() );
228 + // w.setVisible( false );
229 + // }
230 +
231 + @Override
232 + public void insert( Widget w, int beforeIndex ) {
233 + throw new IllegalStateException( "Only use add( w )" );
234 + }
235 + }
236 +
237 + private static class SizingWrapper extends HorizontalPanel {
238 + private SizeHelper mHeightHelper, mWidthHelper;
239 +
240 + public SizingWrapper( Widget pChild, Widget pSizingWidget ) {
241 + add( pChild );
242 + mHeightHelper = new HeightHelper( this, pSizingWidget );
243 + mWidthHelper = new WidthHelper( this, pSizingWidget );
244 + }
245 +
246 + public void shown( boolean pShown ) {
247 + mHeightHelper.shown( pShown );
248 + mWidthHelper.shown( pShown );
249 + }
250 +
251 + @Override
252 + public void setWidth( String width ) {
253 + mWidthHelper.setSize( width );
254 + }
255 +
256 + @Override
257 + public void setHeight( String height ) {
258 + mHeightHelper.setSize( height );
259 + }
260 +
261 + private static abstract class SizeHelper implements Command {
262 + private SizingWrapper mWrapper;
263 + private Widget mSizingWidget;
264 + private Integer mPendingSize = null;
265 + private Integer mOverheadSize = null;
266 +
267 + protected SizeHelper( SizingWrapper pWrapper, Widget pSizingWidget ) {
268 + mWrapper = pWrapper;
269 + mSizingWidget = pSizingWidget;
270 + }
271 +
272 + abstract protected int getSize( Widget pWidget );
273 +
274 + abstract protected void setSize( Widget pWidget, int pSize );
275 +
276 + public void setSize( String pSize ) {
277 + try {
278 + mPendingSize = AbstractSizeableWidget.parse( pSize );
279 + }
280 + catch ( NumberFormatException e ) {
281 + return;
282 + }
283 + applySize();
284 + }
285 +
286 + public void shown( boolean pShown ) {
287 + if ( pShown ) {
288 + applySize();
289 + }
290 + }
291 +
292 + private boolean mDeferred = false;
293 +
294 + private void applySize() {
295 + if ( mOverheadSize == null ) {
296 + if ( shouldDefer() ) {
297 + if ( !mDeferred ) {
298 + mDeferred = true;
299 + Scheduler.get().scheduleDeferred( this );
300 + }
301 + return;
302 + }
303 + int zWrapperSize = getSize( mWrapper );
304 + int zSizingSize = getSize( mSizingWidget );
305 + // System.out.println( this + ".applySize: " + zWrapperSize + "|" + zSizingSize );
306 + mOverheadSize = zWrapperSize - zSizingSize;
307 + }
308 + if ( mPendingSize != null ) {
309 + setSize( mSizingWidget, mPendingSize - mOverheadSize );
310 + }
311 + }
312 +
313 + private boolean shouldDefer() {
314 + boolean zAttached = mWrapper.isAttached();
315 + boolean zVisible = mWrapper.isVisible();
316 + int zSize = getSize( mWrapper );
317 + return !zAttached || !zVisible || (zSize < 20);
318 + }
319 +
320 + @Override
321 + public void execute() {
322 + mDeferred = false;
323 + applySize();
324 + }
325 + }
326 +
327 + private static class HeightHelper extends SizeHelper {
328 + public HeightHelper( SizingWrapper pWrapper, Widget pSizingWidget ) {
329 + super( pWrapper, pSizingWidget );
330 + }
331 +
332 + @Override
333 + protected int getSize( Widget pWidget ) {
334 + return pWidget.getOffsetHeight();
335 + }
336 +
337 + @Override
338 + protected void setSize( Widget pWidget, int pSize ) {
339 + pWidget.setHeight( "" + pSize );
340 + }
341 + }
342 +
343 + private static class WidthHelper extends SizeHelper {
344 + public WidthHelper( SizingWrapper pWrapper, Widget pSizingWidget ) {
345 + super( pWrapper, pSizingWidget );
346 + }
347 +
348 + @Override
349 + protected int getSize( Widget pWidget ) {
350 + return pWidget.getOffsetWidth();
351 + }
352 +
353 + @Override
354 + protected void setSize( Widget pWidget, int pSize ) {
355 + pWidget.setWidth( "" + pSize );
356 + }
357 + }
358 + }
359 +
360 + private static class DisabledTextArea extends SimplePanel {
361 + private InnerText mInnerTextAsHtml;
362 + private Widget mSizeablePanel;
363 +
364 + public DisabledTextArea( boolean pNoWrapContents ) {
365 + //noinspection GWTStyleCheck
366 + addStyleName( "litesoft-OuterDisabledTextArea" );
367 +
368 + SimplePanel innerPanel = new SimplePanel();
369 + //noinspection GWTStyleCheck
370 + innerPanel.addStyleName( "litesoft-InnerDisabledTextArea" );
371 + add( innerPanel );
372 +
373 + mInnerTextAsHtml = new InnerText();
374 +
375 + if ( pNoWrapContents ) {
376 + SimplePanel zSimplePanel = new SimplePanel();
377 + CommonElementHelper.setOverflowAuto( zSimplePanel.getElement() );
378 + CommonElementHelper.setWhiteSpaceWrap( mInnerTextAsHtml.getElement(), false );
379 + zSimplePanel.add( mInnerTextAsHtml );
380 +
381 + mSizeablePanel = zSimplePanel;
382 + } else {
383 + CommonElementHelper.setOverflowAuto( mInnerTextAsHtml.getElement() );
384 +
385 + mSizeablePanel = mInnerTextAsHtml;
386 + }
387 + innerPanel.add( mSizeablePanel );
388 + mSizeablePanel.setSize( "50", "50" );
389 + }
390 +
391 + public Widget getSizeablePanel() {
392 + return mSizeablePanel;
393 + }
394 +
395 + public void setText( String pText ) {
396 + if ( pText != null ) {
397 + mInnerTextAsHtml.setText( pText );
398 + }
399 + }
400 +
401 + public void setInnerHtml( String pText ) {
402 + if ( pText != null ) {
403 + DOM.setInnerHTML( mInnerTextAsHtml.getElement(), pText );
404 + }
405 + }
406 +
407 + @Override
408 + public void setWidth( String pWidth ) {
409 + mSizeablePanel.setWidth( pWidth );
410 + }
411 +
412 + @Override
413 + public void setHeight( String pHeight ) {
414 + mSizeablePanel.setHeight( pHeight );
415 + }
416 + }
417 +
418 + private static class InnerText extends Widget {
419 + public InnerText() {
420 + setElement( DOM.createDiv() );
421 + //noinspection GWTStyleCheck
422 + setStyleName( "litesoft-DisabledTextareaInnerText" );
423 + }
424 +
425 + public InnerText( String pText ) {
426 + this();
427 + setText( pText );
428 + }
429 +
430 + public void setText( String pText ) {
431 + DOM.setInnerHTML( getElement(), pText );
432 + }
433 + }
434 + }