blob: 70a0a18e575348d09336c3b0f6bef3edab109ac7 (
plain)
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
133
134
135
136
137
138
139
140
|
/*
@ITMillApache2LicenseForJavaFiles@
*/
package com.itmill.toolkit.terminal.gwt.client.ui;
import java.util.Set;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.Util;
public class ICustomComponent extends SimplePanel implements Container {
private static final String CLASSNAME = "i-customcomponent";
private String height;
private ApplicationConnection client;
private boolean rendering;
private String width;
private RenderSpace renderSpace = new RenderSpace();
public ICustomComponent() {
super();
setStyleName(CLASSNAME);
}
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
rendering = true;
if (client.updateComponent(this, uidl, true)) {
rendering = false;
return;
}
this.client = client;
final UIDL child = uidl.getChildUIDL(0);
if (child != null) {
final Paintable p = client.getPaintable(child);
if (p != getWidget()) {
if (getWidget() != null) {
client.unregisterPaintable((Paintable) getWidget());
clear();
}
setWidget((Widget) p);
}
p.updateFromUIDL(child, client);
}
renderSpace.setWidth(getElement().getOffsetWidth());
renderSpace.setHeight(getElement().getOffsetHeight());
updateDynamicSize();
rendering = false;
}
private boolean updateDynamicSize() {
boolean updated = false;
if (isDynamicWidth()) {
int childWidth = Util.getRequiredWidth(getWidget());
getElement().getStyle().setPropertyPx("width", childWidth);
updated = true;
}
if (isDynamicHeight()) {
int childHeight = Util.getRequiredHeight(getWidget());
getElement().getStyle().setPropertyPx("height", childHeight);
updated = true;
}
return updated;
}
private boolean isDynamicWidth() {
return width == null || width.equals("");
}
private boolean isDynamicHeight() {
return height == null || height.equals("");
}
public boolean hasChildComponent(Widget component) {
if (getWidget() == component) {
return true;
} else {
return false;
}
}
public void replaceChildComponent(Widget oldComponent, Widget newComponent) {
if (hasChildComponent(oldComponent)) {
clear();
setWidget(newComponent);
} else {
throw new IllegalStateException();
}
}
public void updateCaption(Paintable component, UIDL uidl) {
// NOP, custom component dont render composition roots caption
}
public boolean requestLayout(Set<Paintable> child) {
return !updateDynamicSize();
}
public RenderSpace getAllocatedSpace(Widget child) {
return renderSpace;
}
@Override
public void setHeight(String height) {
super.setHeight(height);
renderSpace.setHeight(getElement().getOffsetHeight());
if (!height.equals(this.height)) {
this.height = height;
if (!rendering) {
client.runDescendentsLayout(this);
}
}
}
@Override
public void setWidth(String width) {
super.setWidth(width);
renderSpace.setWidth(getElement().getOffsetWidth());
if (!width.equals(this.width)) {
this.width = width;
if (!rendering) {
client.runDescendentsLayout(this);
}
}
}
}
|