1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.primefaces.extensions.component.codescanner;
23
24 import java.util.Collection;
25 import java.util.Map;
26
27 import javax.faces.application.ResourceDependency;
28 import javax.faces.component.UIComponentBase;
29 import javax.faces.component.behavior.ClientBehaviorHolder;
30 import javax.faces.context.FacesContext;
31 import javax.faces.event.AjaxBehaviorEvent;
32 import javax.faces.event.FacesEvent;
33
34 import org.primefaces.component.api.MixedClientBehaviorHolder;
35 import org.primefaces.component.api.Widget;
36 import org.primefaces.event.SelectEvent;
37 import org.primefaces.extensions.model.codescanner.Code;
38 import org.primefaces.extensions.model.codescanner.Code.Format;
39 import org.primefaces.util.Constants;
40 import org.primefaces.util.LangUtils;
41
42
43
44
45
46
47
48 @ResourceDependency(library = "primefaces", name = "components.css")
49 @ResourceDependency(library = "primefaces", name = "jquery/jquery.js")
50 @ResourceDependency(library = "primefaces", name = "jquery/jquery-plugins.js")
51 @ResourceDependency(library = "primefaces", name = "core.js")
52 @ResourceDependency(library = "primefaces-extensions", name = "codescanner/codescanner.js")
53 public class CodeScanner extends UIComponentBase implements Widget, ClientBehaviorHolder, MixedClientBehaviorHolder {
54
55 public static final String COMPONENT_TYPE = "org.primefaces.extensions.component.CodeScanner";
56 public static final String COMPONENT_FAMILY = "org.primefaces.extensions.component";
57 public static final String DEFAULT_RENDERER = "org.primefaces.extensions.component.CodeScannerRenderer";
58
59 public static final String STYLE_CLASS = "ui-codescanner ui-widget";
60 public static final String EVENT_CODE_SCANNED = "codeScanned";
61
62 private static final Collection<String> EVENT_NAMES = LangUtils.unmodifiableList(EVENT_CODE_SCANNED);
63
64
65 @SuppressWarnings("java:S115")
66 public enum PropertyKeys {
67 widgetVar,
68 type,
69 style,
70 styleClass,
71 width,
72 height,
73 autoStart,
74 onsuccess,
75 onerror,
76 video,
77 deviceId,
78 forVal("for");
79
80 private final String toString;
81 PropertyKeys(String toString) {
82 this.toString = toString;
83 }
84 PropertyKeys() {
85 toString = null;
86 }
87 @Override public String toString() {
88 return ((toString != null) ? toString : super.toString());
89 }
90 }
91
92 @SuppressWarnings("java:S115")
93 public enum ReaderType {
94 multi,
95 bar,
96 qr
97 }
98
99
100 public CodeScanner() {
101 setRendererType(DEFAULT_RENDERER);
102 }
103
104 @Override
105 public String getFamily() {
106 return COMPONENT_FAMILY;
107 }
108
109 @Override
110 public String getDefaultEventName() {
111 return EVENT_CODE_SCANNED;
112 }
113
114 public String getWidgetVar() {
115 return (String) getStateHelper().eval(PropertyKeys.widgetVar, null);
116 }
117
118 public void setWidgetVar(final String widgetVar) {
119 getStateHelper().put(PropertyKeys.widgetVar, widgetVar);
120 }
121
122 public String getType() {
123 return (String) getStateHelper().eval(PropertyKeys.type, ReaderType.multi.name());
124 }
125
126 public ReaderType getTypeEnum() {
127 return ReaderType.valueOf(getType());
128 }
129
130 public void setType(final String type) {
131 getStateHelper().put(PropertyKeys.type, type);
132 }
133
134 public String getStyle() {
135 return (String) getStateHelper().eval(PropertyKeys.style, null);
136 }
137
138 public void setStyle(String style) {
139 getStateHelper().put(PropertyKeys.style, style);
140 }
141
142 public String getStyleClass() {
143 return (String) getStateHelper().eval(PropertyKeys.styleClass, null);
144 }
145
146 public void setStyleClass(String styleClass) {
147 getStateHelper().put(PropertyKeys.styleClass, styleClass);
148 }
149
150 public Integer getWidth() {
151 return (Integer) getStateHelper().eval(PropertyKeys.width, null);
152 }
153
154 public void setWidth(Integer width) {
155 getStateHelper().put(PropertyKeys.width, width);
156 }
157
158 public Integer getHeight() {
159 return (Integer) getStateHelper().eval(PropertyKeys.height, null);
160 }
161
162 public void setHeight(Integer height) {
163 getStateHelper().put(PropertyKeys.height, height);
164 }
165
166 public boolean isAutoStart() {
167 return (Boolean) getStateHelper().eval(PropertyKeys.autoStart, true);
168 }
169
170 public void setAutoStart(boolean autoStart) {
171 getStateHelper().put(PropertyKeys.autoStart, autoStart);
172 }
173
174 public String getOnsuccess() {
175 return (String) getStateHelper().eval(PropertyKeys.onsuccess, null);
176 }
177
178 public void setOnsuccess(String onsuccess) {
179 getStateHelper().put(PropertyKeys.onsuccess, onsuccess);
180 }
181
182 public String getOnerror() {
183 return (String) getStateHelper().eval(PropertyKeys.onerror, null);
184 }
185
186 public void setOnerror(String onerror) {
187 getStateHelper().put(PropertyKeys.onerror, onerror);
188 }
189
190 public boolean isVideo() {
191 return (Boolean) getStateHelper().eval(PropertyKeys.video, true);
192 }
193
194 public void setVideo(boolean video) {
195 getStateHelper().put(PropertyKeys.video, video);
196 }
197
198 public String getDeviceId() {
199 return (String) getStateHelper().eval(PropertyKeys.deviceId, null);
200 }
201
202 public void setDeviceId(String deviceId) {
203 getStateHelper().put(PropertyKeys.deviceId, deviceId);
204 }
205
206 public String getFor() {
207 return (String) getStateHelper().eval(PropertyKeys.forVal, null);
208 }
209
210 public void setFor(String aFor) {
211 getStateHelper().put(PropertyKeys.forVal, aFor);
212 }
213
214 @Override
215 public Collection<String> getEventNames() {
216 return EVENT_NAMES;
217 }
218
219 @Override
220 public Collection<String> getUnobstrusiveEventNames() {
221 return getEventNames();
222 }
223
224 @Override
225 public void queueEvent(final FacesEvent event) {
226 final FacesContext context = getFacesContext();
227 final Map<String, String> params = context.getExternalContext().getRequestParameterMap();
228 final String eventName = params.get(Constants.RequestParams.PARTIAL_BEHAVIOR_EVENT_PARAM);
229
230 if (eventName != null && event instanceof AjaxBehaviorEvent) {
231 final AjaxBehaviorEvent ajaxBehaviorEvent = (AjaxBehaviorEvent) event;
232
233 if (EVENT_CODE_SCANNED.equals(eventName)) {
234 final Code code = getCode(getClientId(context), params);
235 final SelectEvent<Code> selectEvent = new SelectEvent<>(this, ajaxBehaviorEvent.getBehavior(), code);
236 selectEvent.setPhaseId(ajaxBehaviorEvent.getPhaseId());
237 super.queueEvent(selectEvent);
238 }
239 }
240 }
241
242 protected static Code getCode(final String clientId, final Map<String, String> params) {
243 return new Code(params.get(clientId + "_value"),
244 Format.values()[Integer.parseInt(params.get(clientId + "_format"))]);
245 }
246
247 }