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.monacoeditor;
23  
24  import java.util.Collection;
25  import java.util.Map;
26  
27  import javax.faces.application.FacesMessage;
28  import javax.faces.context.FacesContext;
29  import javax.faces.event.BehaviorEvent;
30  
31  import org.primefaces.util.MapBuilder;
32  import org.primefaces.util.MessageFactory;
33  
34  /**
35   * Base component for both the framed and inline monaco diff code editor widget.
36   *
37   * @since 10.0.0
38   */
39  @SuppressWarnings("java:S110")
40  public abstract class MonacoDiffEditorBase
41                                             extends MonacoEditorCommon<org.primefaces.extensions.model.monacoeditor.DiffEditorOptions> {
42      static final String DEFAULT_EVENT = "change";
43  
44      static final Map<String, Class<? extends BehaviorEvent>> BASE_BEHAVIOR_EVENT_MAPPING = MapBuilder.<String, Class<? extends BehaviorEvent>> builder() //
45                  .put(DEFAULT_EVENT, null) //
46                  .put("initialized", null) //
47                  .put("blur", null) //
48                  .put("focus", null) //
49                  .put("keydown", null) //
50                  .put("keyup", null) //
51                  .put("mousedown", null) //
52                  .put("mousemove", null) //
53                  .put("mouseup", null) //
54                  .put("paste", null) //
55                  .put("originalBlur", null) //
56                  .put("originalChange", null) //
57                  .put("originalFocus", null) //
58                  .put("originalKeydown", null) //
59                  .put("originalKeyup", null) //
60                  .put("originalMousedown", null) //
61                  .put("originalMousemove", null) //
62                  .put("originalMouseup", null) //
63                  .put("originalPaste", null) //
64                  .build();
65  
66      static final Collection<String> BASE_EVENT_NAMES = BASE_BEHAVIOR_EVENT_MAPPING.keySet();
67  
68      static final boolean DEFAULT_ORIGINAL_DISABLED = true;
69      static final boolean DEFAULT_ORIGINAL_READONLY = false;
70      static final boolean DEFAULT_ORIGINAL_REQUIRED = false;
71      static final String DEFAULT_ORIGINAL_BASENAME = "";
72      static final String DEFAULT_ORIGINAL_EXTENSION = "";
73      static final String DEFAULT_ORIGINAL_DIRECTORY = "";
74      static final String DEFAULT_ORIGINAL_SCHEME = "inmemory";
75      static final String DEFAULT_ORIGINAL_LANGUAGE = null;
76  
77      protected MonacoDiffEditorBase(final String rendererType) {
78          super(rendererType, org.primefaces.extensions.model.monacoeditor.DiffEditorOptions.class);
79      }
80  
81      public final boolean isOriginalDisabled() {
82          return (Boolean) getStateHelper().eval(DiffEditorPropertyKeys.originalDisabled, true);
83      }
84  
85      public final void setOriginalDisabled(final boolean originalEditable) {
86          getStateHelper().put(DiffEditorPropertyKeys.originalDisabled, originalEditable);
87      }
88  
89      public final boolean isOriginalReadonly() {
90          return (Boolean) getStateHelper().eval(DiffEditorPropertyKeys.originalReadonly, false);
91      }
92  
93      public final void setOriginalReadonly(final boolean originalReadonly) {
94          getStateHelper().put(DiffEditorPropertyKeys.originalReadonly, originalReadonly);
95      }
96  
97      public final boolean isOriginalRequired() {
98          return (Boolean) getStateHelper().eval(DiffEditorPropertyKeys.originalRequired, false);
99      }
100 
101     public final void setOriginalRequired(final boolean originalRequired) {
102         getStateHelper().put(DiffEditorPropertyKeys.originalRequired, originalRequired);
103     }
104 
105     @Override
106     public final String getDefaultEventName() {
107         return DEFAULT_EVENT;
108     }
109 
110     public String getLanguage() {
111         return (String) getStateHelper().eval(DiffEditorPropertyKeys.language, null);
112     }
113 
114     // We allow both a string and an instance of ELanguage
115     public void setLanguage(final Object language) {
116         getStateHelper().put(DiffEditorPropertyKeys.language, language != null ? language.toString() : null);
117     }
118 
119     public String getOriginalLanguage() {
120         return (String) getStateHelper().eval(DiffEditorPropertyKeys.originalLanguage, null);
121     }
122 
123     // We allow both a string and an instance of ELanguage
124     public void setOriginalLanguage(final Object originalLanguage) {
125         getStateHelper().put(DiffEditorPropertyKeys.originalLanguage,
126                     originalLanguage != null ? originalLanguage.toString() : null);
127     }
128 
129     public String getOnoriginalblur() {
130         return (String) getStateHelper().eval(DiffEditorPropertyKeys.onoriginalblur, null);
131     }
132 
133     public final void setOnoriginalblur(final String onoriginalblur) {
134         getStateHelper().put(DiffEditorPropertyKeys.onoriginalblur, onoriginalblur);
135     }
136 
137     public String getOnoriginalchange() {
138         return (String) getStateHelper().eval(DiffEditorPropertyKeys.onoriginalchange, null);
139     }
140 
141     public final void setOnoriginalchange(final String onoriginalchange) {
142         getStateHelper().put(DiffEditorPropertyKeys.onoriginalchange, onoriginalchange);
143     }
144 
145     public String getOnoriginalfocus() {
146         return (String) getStateHelper().eval(DiffEditorPropertyKeys.onoriginalfocus, null);
147     }
148 
149     public final void setOnoriginalfocus(final String onoriginalfocus) {
150         getStateHelper().put(DiffEditorPropertyKeys.onoriginalfocus, onoriginalfocus);
151     }
152 
153     public String getOnoriginalkeyup() {
154         return (String) getStateHelper().eval(DiffEditorPropertyKeys.onoriginalkeyup, null);
155     }
156 
157     public final void setOnoriginalkeyup(final String onoriginalkeyup) {
158         getStateHelper().put(DiffEditorPropertyKeys.onoriginalkeyup, onoriginalkeyup);
159     }
160 
161     public String getOnoriginalkeydown() {
162         return (String) getStateHelper().eval(DiffEditorPropertyKeys.onoriginalkeydown, null);
163     }
164 
165     public final void setOnoriginalkeydown(final String onoriginalkeydown) {
166         getStateHelper().put(DiffEditorPropertyKeys.onoriginalkeydown, onoriginalkeydown);
167     }
168 
169     public String getOnoriginalmouseup() {
170         return (String) getStateHelper().eval(DiffEditorPropertyKeys.onoriginalmouseup, null);
171     }
172 
173     public final void setOnoriginalmouseup(final String onoriginalmouseup) {
174         getStateHelper().put(DiffEditorPropertyKeys.onoriginalmouseup, onoriginalmouseup);
175     }
176 
177     public String getOnoriginalmousedown() {
178         return (String) getStateHelper().eval(DiffEditorPropertyKeys.onoriginalmousedown, null);
179     }
180 
181     public final void setOnoriginalmousedown(final String onoriginalmousedown) {
182         getStateHelper().put(DiffEditorPropertyKeys.onoriginalmousedown, onoriginalmousedown);
183     }
184 
185     public String getOnoriginalmousemove() {
186         return (String) getStateHelper().eval(DiffEditorPropertyKeys.onoriginalmousemove, null);
187     }
188 
189     public final void setOnoriginalmousemove(final String onoriginalmousemove) {
190         getStateHelper().put(DiffEditorPropertyKeys.onoriginalmousemove, onoriginalmousemove);
191     }
192 
193     public String getOnoriginalpaste() {
194         return (String) getStateHelper().eval(DiffEditorPropertyKeys.onoriginalpaste, null);
195     }
196 
197     public final void setOnoriginalpaste(final String onoriginalpaste) {
198         getStateHelper().put(DiffEditorPropertyKeys.onoriginalpaste, onoriginalpaste);
199     }
200 
201     public final String getOriginalDirectory() {
202         return (String) getStateHelper().eval(DiffEditorPropertyKeys.originalDirectory, DEFAULT_ORIGINAL_DIRECTORY);
203     }
204 
205     public final void setOriginalDirectory(final String originalDirectory) {
206         getStateHelper().put(DiffEditorPropertyKeys.originalDirectory, originalDirectory);
207     }
208 
209     public final String getOriginalExtension() {
210         return (String) getStateHelper().eval(DiffEditorPropertyKeys.originalExtension, DEFAULT_ORIGINAL_EXTENSION);
211     }
212 
213     public final void setOriginalExtension(final String originalExtension) {
214         getStateHelper().put(DiffEditorPropertyKeys.originalExtension, originalExtension);
215     }
216 
217     public final String getOriginalBasename() {
218         return (String) getStateHelper().eval(DiffEditorPropertyKeys.originalBasename, DEFAULT_ORIGINAL_BASENAME);
219     }
220 
221     public final void setOriginalBasename(final String basename) {
222         getStateHelper().put(DiffEditorPropertyKeys.originalBasename, basename);
223     }
224 
225     public final String getOriginalScheme() {
226         return (String) getStateHelper().eval(DiffEditorPropertyKeys.originalScheme, DEFAULT_ORIGINAL_SCHEME);
227     }
228 
229     public final void setOriginalScheme(final String originalScheme) {
230         getStateHelper().put(DiffEditorPropertyKeys.originalScheme, originalScheme);
231     }
232 
233     @Override
234     protected void validateValue(final FacesContext context, final Object newValue) {
235         final org.primefaces.extensions.model.monaco.MonacoDiffEditorModel model;
236         model = (org.primefaces.extensions.model.monaco.MonacoDiffEditorModel) newValue;
237         // If our value is valid, enforce the required property if present for the modified editor
238         if (isValid() && isRequired() && (model == null || isEmpty(model.getModifiedValue()))) {
239             final String requiredMessageStr = getRequiredMessage();
240             final FacesMessage message;
241             if (null != requiredMessageStr) {
242                 message = new FacesMessage(FacesMessage.SEVERITY_ERROR, requiredMessageStr, requiredMessageStr);
243             }
244             else {
245                 final Object label = org.primefaces.extensions.util.MessageFactory.getLabel(context, this);
246                 message = MessageFactory.getFacesMessage(REQUIRED_MESSAGE_ID, FacesMessage.SEVERITY_ERROR,
247                             label.toString());
248             }
249             context.addMessage(getClientId(context), message);
250             setValid(false);
251         }
252 
253         // If our value is valid, enforce the required property if present for the original edtor
254         if (isValid() && isOriginalRequired() && (model == null || isEmpty(model.getOriginalValue()))) {
255             final String requiredMessageStr = getRequiredMessage();
256             final FacesMessage message;
257             if (null != requiredMessageStr) {
258                 message = new FacesMessage(FacesMessage.SEVERITY_ERROR, requiredMessageStr, requiredMessageStr);
259             }
260             else {
261                 final Object label = org.primefaces.extensions.util.MessageFactory.getLabel(context, this);
262                 message = MessageFactory.getFacesMessage(REQUIRED_MESSAGE_ID, FacesMessage.SEVERITY_ERROR,
263                             label.toString());
264             }
265             context.addMessage(getClientId(context), message);
266             setValid(false);
267         }
268 
269         // Call super which calls the validators if our value is valid
270         super.validateValue(context, newValue);
271     }
272 }