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.imageareaselect;
23  
24  import java.util.Arrays;
25  import java.util.Collection;
26  import java.util.Collections;
27  import java.util.Map;
28  
29  import javax.faces.application.ResourceDependency;
30  import javax.faces.component.UIComponentBase;
31  import javax.faces.component.behavior.ClientBehaviorHolder;
32  import javax.faces.context.FacesContext;
33  import javax.faces.event.BehaviorEvent;
34  import javax.faces.event.FacesEvent;
35  
36  import org.primefaces.component.api.Widget;
37  import org.primefaces.extensions.event.ImageAreaSelectEvent;
38  import org.primefaces.util.Constants;
39  
40  /**
41   * Component class for the <code>ImageAreaSelect</code> component.
42   *
43   * @author Thomas Andraschko / last modified by $Author$
44   * @version $Revision$
45   * @since 0.1
46   */
47  @ResourceDependency(library = "primefaces", name = "jquery/jquery.js")
48  @ResourceDependency(library = "primefaces", name = "jquery/jquery-plugins.js")
49  @ResourceDependency(library = "primefaces", name = "core.js")
50  @ResourceDependency(library = "primefaces-extensions", name = "primefaces-extensions.js")
51  @ResourceDependency(library = "primefaces-extensions", name = "imageareaselect/imageareaselect.css")
52  @ResourceDependency(library = "primefaces-extensions", name = "imageareaselect/imageareaselect.js")
53  public class ImageAreaSelect extends UIComponentBase implements Widget, ClientBehaviorHolder {
54  
55      public static final String COMPONENT_TYPE = "org.primefaces.extensions.component.ImageAreaSelect";
56      public static final String COMPONENT_FAMILY = "org.primefaces.extensions.component";
57      public static final String EVENT_SELECT_END = "selectEnd";
58      public static final String EVENT_SELECT_START = "selectStart";
59      public static final String EVENT_SELECT_CHANGE = "selectChange";
60      private static final String DEFAULT_RENDERER = "org.primefaces.extensions.component.ImageAreaSelectRenderer";
61  
62      private static final Collection<String> EVENT_NAMES = Collections
63                  .unmodifiableCollection(Arrays.asList(EVENT_SELECT_END, EVENT_SELECT_START, EVENT_SELECT_CHANGE));
64  
65      /**
66       * Properties that are tracked by state saving.
67       *
68       * @author Thomas Andraschko / last modified by $Author$
69       * @version $Revision$
70       */
71      @SuppressWarnings("java:S115")
72      protected enum PropertyKeys {
73  
74          //@formatter:off
75          widgetVar,
76          forValue("for"),
77          aspectRatio,
78          autoHide,
79          fadeSpeed,
80          handles,
81          hide,
82          imageHeight,
83          imageWidth,
84          movable,
85          persistent,
86          resizable,
87          show,
88          zIndex,
89          maxHeight,
90          maxWidth,
91          minHeight,
92          minWidth,
93          parentSelector,
94          keyboardSupport;
95          //@formatter:on
96  
97          private final String toString;
98  
99          PropertyKeys(String toString) {
100             this.toString = toString;
101         }
102 
103         PropertyKeys() {
104             toString = null;
105         }
106 
107         @Override
108         public String toString() {
109             return ((toString != null) ? toString : super.toString());
110         }
111     }
112 
113     public ImageAreaSelect() {
114         setRendererType(DEFAULT_RENDERER);
115     }
116 
117     @Override
118     public String getFamily() {
119         return COMPONENT_FAMILY;
120     }
121 
122     @Override
123     public Collection<String> getEventNames() {
124         return EVENT_NAMES;
125     }
126 
127     @Override
128     public String getDefaultEventName() {
129         return EVENT_SELECT_END;
130     }
131 
132     public String getAspectRatio() {
133         return (String) getStateHelper().eval(PropertyKeys.aspectRatio, null);
134     }
135 
136     public void setAspectRatio(final String aspectRatio) {
137         getStateHelper().put(PropertyKeys.aspectRatio, aspectRatio);
138     }
139 
140     public String getParentSelector() {
141         return (String) getStateHelper().eval(PropertyKeys.parentSelector, null);
142     }
143 
144     public void setParentSelector(final String parentSelector) {
145         getStateHelper().put(PropertyKeys.parentSelector, parentSelector);
146     }
147 
148     public Boolean isAutoHide() {
149         return (Boolean) getStateHelper().eval(PropertyKeys.autoHide, null);
150     }
151 
152     public void setAutoHide(final Boolean autoHide) {
153         getStateHelper().put(PropertyKeys.autoHide, autoHide);
154     }
155 
156     public Integer getFadeSpeed() {
157         return (Integer) getStateHelper().eval(PropertyKeys.fadeSpeed, null);
158     }
159 
160     public void setFadeSpeed(final Integer fadeSpeed) {
161         getStateHelper().put(PropertyKeys.fadeSpeed, fadeSpeed);
162     }
163 
164     public Boolean isHandles() {
165         return (Boolean) getStateHelper().eval(PropertyKeys.handles, null);
166     }
167 
168     public void setHandles(final Boolean handles) {
169         getStateHelper().put(PropertyKeys.handles, handles);
170     }
171 
172     public Boolean isHide() {
173         return (Boolean) getStateHelper().eval(PropertyKeys.hide, null);
174     }
175 
176     public void setHide(final Boolean hide) {
177         getStateHelper().put(PropertyKeys.hide, hide);
178     }
179 
180     public Integer getImageHeight() {
181         return (Integer) getStateHelper().eval(PropertyKeys.imageHeight, null);
182     }
183 
184     public void setImageHeight(final Integer imageHeight) {
185         getStateHelper().put(PropertyKeys.imageHeight, imageHeight);
186     }
187 
188     public Integer getImageWidth() {
189         return (Integer) getStateHelper().eval(PropertyKeys.imageWidth, null);
190     }
191 
192     public void setImageWidth(final Integer imageWidth) {
193         getStateHelper().put(PropertyKeys.imageWidth, imageWidth);
194     }
195 
196     public Boolean isMovable() {
197         return (Boolean) getStateHelper().eval(PropertyKeys.movable, null);
198     }
199 
200     public void setMovable(final Boolean movable) {
201         getStateHelper().put(PropertyKeys.movable, movable);
202     }
203 
204     public Boolean isKeyboardSupport() {
205         return (Boolean) getStateHelper().eval(PropertyKeys.keyboardSupport, null);
206     }
207 
208     public void setKeyboardSupport(final Boolean keyboardSupport) {
209         getStateHelper().put(PropertyKeys.keyboardSupport, keyboardSupport);
210     }
211 
212     public Boolean isPersistent() {
213         return (Boolean) getStateHelper().eval(PropertyKeys.persistent, null);
214     }
215 
216     public void setPersistent(final Boolean persistent) {
217         getStateHelper().put(PropertyKeys.persistent, persistent);
218     }
219 
220     public Boolean isResizable() {
221         return (Boolean) getStateHelper().eval(PropertyKeys.resizable, null);
222     }
223 
224     public void setResizable(final Boolean resizable) {
225         getStateHelper().put(PropertyKeys.resizable, resizable);
226     }
227 
228     public Boolean isShow() {
229         return (Boolean) getStateHelper().eval(PropertyKeys.show, null);
230     }
231 
232     public void setShow(final Boolean show) {
233         getStateHelper().put(PropertyKeys.show, show);
234     }
235 
236     public Integer getZIndex() {
237         return (Integer) getStateHelper().eval(PropertyKeys.zIndex, null);
238     }
239 
240     public void setZIndex(final Integer zIndex) {
241         getStateHelper().put(PropertyKeys.zIndex, zIndex);
242     }
243 
244     public Integer getMaxHeight() {
245         return (Integer) getStateHelper().eval(PropertyKeys.maxHeight, null);
246     }
247 
248     public void setMaxHeight(final Integer maxHeight) {
249         getStateHelper().put(PropertyKeys.maxHeight, maxHeight);
250     }
251 
252     public Integer getMaxWidth() {
253         return (Integer) getStateHelper().eval(PropertyKeys.maxWidth, null);
254     }
255 
256     public void setMaxWidth(final Integer maxWidth) {
257         getStateHelper().put(PropertyKeys.maxWidth, maxWidth);
258     }
259 
260     public Integer getMinHeight() {
261         return (Integer) getStateHelper().eval(PropertyKeys.minHeight, null);
262     }
263 
264     public void setMinHeight(final Integer minHeight) {
265         getStateHelper().put(PropertyKeys.minHeight, minHeight);
266     }
267 
268     public Integer getMinWidth() {
269         return (Integer) getStateHelper().eval(PropertyKeys.minWidth, null);
270     }
271 
272     public void setMinWidth(final Integer minWidth) {
273         getStateHelper().put(PropertyKeys.minWidth, minWidth);
274     }
275 
276     public String getWidgetVar() {
277         return (String) getStateHelper().eval(PropertyKeys.widgetVar, null);
278     }
279 
280     public void setWidgetVar(final String widgetVar) {
281         getStateHelper().put(PropertyKeys.widgetVar, widgetVar);
282     }
283 
284     public String getFor() {
285         return (String) getStateHelper().eval(PropertyKeys.forValue, null);
286     }
287 
288     public void setFor(final String forValue) {
289         getStateHelper().put(PropertyKeys.forValue, forValue);
290     }
291 
292     @Override
293     public void queueEvent(final FacesEvent event) {
294         final FacesContext context = FacesContext.getCurrentInstance();
295         final Map<String, String> params = context.getExternalContext().getRequestParameterMap();
296         final String clientId = getClientId(context);
297 
298         if (isRequestSource(clientId, params)) {
299             final String eventName = params.get(Constants.RequestParams.PARTIAL_BEHAVIOR_EVENT_PARAM);
300 
301             if (eventName.equals(EVENT_SELECT_END)
302                         || eventName.equals(EVENT_SELECT_CHANGE)
303                         || eventName.equals(EVENT_SELECT_START)) {
304 
305                 final BehaviorEvent behaviorEvent = (BehaviorEvent) event;
306 
307                 final int x1 = Integer.parseInt(params.get(clientId + "_x1"));
308                 final int x2 = Integer.parseInt(params.get(clientId + "_x2"));
309                 final int y1 = Integer.parseInt(params.get(clientId + "_y1"));
310                 final int y2 = Integer.parseInt(params.get(clientId + "_y2"));
311                 final int height = Integer.parseInt(params.get(clientId + "_height"));
312                 final int width = Integer.parseInt(params.get(clientId + "_width"));
313                 final int imgHeight = Integer.parseInt(params.get(clientId + "_imgHeight"));
314                 final int imgWidth = Integer.parseInt(params.get(clientId + "_imgWidth"));
315                 final String imgSrc = params.get(clientId + "_imgSrc");
316 
317                 final ImageAreaSelectEvent selectEvent = new ImageAreaSelectEvent(this, behaviorEvent.getBehavior(), height, width, x1, x2, y1, y2, imgHeight,
318                             imgWidth, imgSrc);
319 
320                 super.queueEvent(selectEvent);
321             }
322         }
323         else {
324             super.queueEvent(event);
325         }
326     }
327 
328     private static boolean isRequestSource(final String clientId, final Map<String, String> params) {
329         return clientId.equals(params.get(Constants.RequestParams.PARTIAL_SOURCE_PARAM));
330     }
331 }