View Javadoc
1   /*
2    * Copyright (c) 2011-2024 PrimeFaces Extensions
3    *
4    *  Permission is hereby granted, free of charge, to any person obtaining a copy
5    *  of this software and associated documentation files (the "Software"), to deal
6    *  in the Software without restriction, including without limitation the rights
7    *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    *  copies of the Software, and to permit persons to whom the Software is
9    *  furnished to do so, subject to the following conditions:
10   *
11   *  The above copyright notice and this permission notice shall be included in
12   *  all copies or substantial portions of the Software.
13   *
14   *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20   *  THE SOFTWARE.
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   * <code>CodeScanner</code> component.
44   *
45   * @author Jasper de Vries &lt;jepsar@gmail.com&gt;
46   * @since 10.0
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      // @formatter:off
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      // @formatter:on
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 }