blob: b3f60c91adb0c6c4067623bff12ff98fb7d69fe7 (
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
|
/*
@VaadinApache2LicenseForJavaFiles@
*/
package com.vaadin.terminal.gwt.client.ui;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Button;
import com.vaadin.terminal.gwt.client.ApplicationConnection;
import com.vaadin.terminal.gwt.client.BrowserInfo;
import com.vaadin.terminal.gwt.client.MouseEventDetails;
import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder;
import com.vaadin.terminal.gwt.client.Util;
import com.vaadin.terminal.gwt.client.VTooltip;
import com.vaadin.terminal.gwt.client.ui.ButtonConnector.ButtonServerRpc;
public class VNativeButton extends Button implements ClickHandler {
public static final String CLASSNAME = "v-nativebutton";
protected String width = null;
protected String paintableId;
protected ApplicationConnection client;
ButtonServerRpc buttonRpcProxy;
protected Element errorIndicatorElement;
protected final Element captionElement = DOM.createSpan();
protected Icon icon;
/**
* Helper flag to handle special-case where the button is moved from under
* mouse while clicking it. In this case mouse leaves the button without
* moving.
*/
private boolean clickPending;
protected boolean disableOnClick = false;
public VNativeButton() {
setStyleName(CLASSNAME);
getElement().appendChild(captionElement);
captionElement.setClassName(getStyleName() + "-caption");
addClickHandler(this);
sinkEvents(VTooltip.TOOLTIP_EVENTS);
sinkEvents(Event.ONMOUSEDOWN);
sinkEvents(Event.ONMOUSEUP);
}
@Override
public void setText(String text) {
captionElement.setInnerText(text);
}
@Override
public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
if (DOM.eventGetType(event) == Event.ONLOAD) {
Util.notifyParentOfSizeChange(this, true);
} else if (DOM.eventGetType(event) == Event.ONMOUSEDOWN
&& event.getButton() == Event.BUTTON_LEFT) {
clickPending = true;
} else if (DOM.eventGetType(event) == Event.ONMOUSEMOVE) {
clickPending = false;
} else if (DOM.eventGetType(event) == Event.ONMOUSEOUT) {
if (clickPending) {
click();
}
clickPending = false;
}
if (client != null) {
client.handleTooltipEvent(event, this);
}
}
@Override
public void setWidth(String width) {
this.width = width;
super.setWidth(width);
}
/*
* (non-Javadoc)
*
* @see
* com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event
* .dom.client.ClickEvent)
*/
public void onClick(ClickEvent event) {
if (paintableId == null || client == null) {
return;
}
if (BrowserInfo.get().isSafari()) {
VNativeButton.this.setFocus(true);
}
if (disableOnClick) {
setEnabled(false);
buttonRpcProxy.disableOnClick();
}
// Add mouse details
MouseEventDetails details = MouseEventDetailsBuilder
.buildMouseEventDetails(event.getNativeEvent(), getElement());
buttonRpcProxy.click(details);
clickPending = false;
}
@Override
public void setEnabled(boolean enabled) {
if (isEnabled() != enabled) {
super.setEnabled(enabled);
setStyleName(ApplicationConnection.DISABLED_CLASSNAME, !enabled);
}
}
}
|