|
@@ -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;'> </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( "<" ); |
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;'> </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( "<" ); |
|
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 |
+ |
} |