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.gchart;
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.UIOutput;
31  import javax.faces.component.behavior.ClientBehaviorHolder;
32  import javax.faces.context.FacesContext;
33  import javax.faces.event.AjaxBehaviorEvent;
34  import javax.faces.event.FacesEvent;
35  
36  import org.primefaces.component.api.Widget;
37  import org.primefaces.event.SelectEvent;
38  import org.primefaces.extensions.util.json.GsonConverter;
39  import org.primefaces.util.Constants;
40  
41  @ResourceDependency(library = "primefaces", name = "jquery/jquery.js")
42  @ResourceDependency(library = "primefaces", name = "jquery/jquery-plugins.js")
43  @ResourceDependency(library = "primefaces", name = "core.js")
44  @ResourceDependency(library = "primefaces-extensions", name = "primefaces-extensions.js")
45  @ResourceDependency(library = "primefaces-extensions", name = "gchart/gchart.css")
46  @ResourceDependency(library = "primefaces-extensions", name = "gchart/gchart.js")
47  public class GChart extends UIOutput implements Widget, ClientBehaviorHolder {
48  
49      public static final String API_KEY = "primefaces.GOOGLE_MAPS_API_KEY";
50  
51      public static final String COMPONENT_TYPE = "org.primefaces.extensions.component.GChart";
52      public static final String COMPONENT_FAMILY = "org.primefaces.extensions.component";
53      private static final String DEFAULT_RENDERER = "org.primefaces.extensions.component.GChartRenderer";
54  
55      private static final String DEFAULT_EVENT = "select";
56      private static final Collection<String> EVENT_NAMES = Collections.unmodifiableCollection(Arrays.asList(DEFAULT_EVENT));
57  
58      @SuppressWarnings("java:S115")
59      protected enum PropertyKeys {
60          widgetVar, width, height, title, apiKey, language, extender
61      }
62  
63      public GChart() {
64          setRendererType(DEFAULT_RENDERER);
65      }
66  
67      @Override
68      public String getFamily() {
69          return COMPONENT_FAMILY;
70      }
71  
72      @Override
73      public Collection<String> getEventNames() {
74          return EVENT_NAMES;
75      }
76  
77      @Override
78      public String getDefaultEventName() {
79          return DEFAULT_EVENT;
80      }
81  
82      public String getWidgetVar() {
83          return (String) getStateHelper().eval(PropertyKeys.widgetVar, null);
84      }
85  
86      public void setWidgetVar(final String _widgetVar) {
87          getStateHelper().put(PropertyKeys.widgetVar, _widgetVar);
88      }
89  
90      public Integer getWidth() {
91          return (Integer) getStateHelper().eval(PropertyKeys.width, null);
92      }
93  
94      public void setWidth(final Integer width) {
95          getStateHelper().put(PropertyKeys.width, width);
96      }
97  
98      public Integer getHeight() {
99          return (Integer) getStateHelper().eval(PropertyKeys.height, null);
100     }
101 
102     public void setHeight(final Integer width) {
103         getStateHelper().put(PropertyKeys.height, width);
104     }
105 
106     public String getTitle() {
107         return (String) getStateHelper().eval(PropertyKeys.title, null);
108     }
109 
110     public void setTitle(final String title) {
111         getStateHelper().put(PropertyKeys.title, title);
112     }
113 
114     public String getApiKey() {
115         return (String) getStateHelper().eval(PropertyKeys.apiKey, null);
116     }
117 
118     public void setApiKey(final String apiKey) {
119         getStateHelper().put(PropertyKeys.apiKey, apiKey);
120     }
121 
122     public String getLanguage() {
123         return (String) getStateHelper().eval(PropertyKeys.language, "en");
124     }
125 
126     public void setLanguage(final String language) {
127         getStateHelper().put(PropertyKeys.language, language);
128     }
129 
130     public String getExtender() {
131         return (String) getStateHelper().eval(PropertyKeys.extender, null);
132     }
133 
134     public void setExtender(final String extender) {
135         getStateHelper().put(PropertyKeys.extender, extender);
136     }
137 
138     @Override
139     public void queueEvent(final FacesEvent event) {
140 
141         final FacesContext context = getFacesContext();
142         if (isRequestSource(context) && event instanceof AjaxBehaviorEvent) {
143             final Map<String, String> params = context.getExternalContext().getRequestParameterMap();
144             final String eventName = params.get(Constants.RequestParams.PARTIAL_BEHAVIOR_EVENT_PARAM);
145 
146             if (eventName.equals(DEFAULT_EVENT)) {
147                 final AjaxBehaviorEvent behaviorEvent = (AjaxBehaviorEvent) event;
148                 final String clientId = getClientId(context);
149 
150                 final Object value = GsonConverter.getGson().fromJson(params.get(clientId + "_hidden"),
151                             com.google.gson.JsonArray.class);
152 
153                 final SelectEvent selectEvent = new SelectEvent(this, behaviorEvent.getBehavior(), value);
154                 selectEvent.setPhaseId(behaviorEvent.getPhaseId());
155 
156                 super.queueEvent(selectEvent);
157             }
158         }
159         else {
160             super.queueEvent(event);
161         }
162     }
163 
164     public boolean isRequestSource(final FacesContext context) {
165         final String partialSource = context.getExternalContext().getRequestParameterMap()
166                     .get(Constants.RequestParams.PARTIAL_SOURCE_PARAM);
167 
168         return getClientId(context).equals(partialSource);
169     }
170 }