JavaFXGriffonControllerAction.java
001 /*
002  * SPDX-License-Identifier: Apache-2.0
003  *
004  * Copyright 2008-2017 the original author or authors.
005  *
006  * Licensed under the Apache License, Version 2.0 (the "License");
007  * you may not use this file except in compliance with the License.
008  * You may obtain a copy of the License at
009  *
010  *     http://www.apache.org/licenses/LICENSE-2.0
011  *
012  * Unless required by applicable law or agreed to in writing, software
013  * distributed under the License is distributed on an "AS IS" BASIS,
014  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015  * See the License for the specific language governing permissions and
016  * limitations under the License.
017  */
018 package org.codehaus.griffon.runtime.javafx.controller;
019 
020 import griffon.core.artifact.GriffonController;
021 import griffon.core.controller.ActionManager;
022 import griffon.core.controller.ActionMetadata;
023 import griffon.core.threading.UIThreadManager;
024 import griffon.javafx.support.JavaFXAction;
025 import javafx.event.ActionEvent;
026 import javafx.scene.Node;
027 import javafx.scene.image.Image;
028 import org.codehaus.griffon.runtime.core.controller.AbstractAction;
029 
030 import javax.annotation.Nonnull;
031 import javax.annotation.Nullable;
032 import java.beans.PropertyChangeEvent;
033 import java.beans.PropertyEditor;
034 
035 import static griffon.core.editors.PropertyEditorResolver.findEditor;
036 import static griffon.util.GriffonNameUtils.isNotBlank;
037 import static griffon.util.TypeUtils.castToBoolean;
038 import static java.util.Objects.requireNonNull;
039 
040 /**
041  @author Andres Almiray
042  */
043 public class JavaFXGriffonControllerAction extends AbstractAction {
044     public static final String KEY_DESCRIPTION = "description";
045     public static final String KEY_ICON = "icon";
046     public static final String KEY_IMAGE = "image";
047     public static final String KEY_GRAPHIC = "graphic";
048     public static final String KEY_SELECTED = "selected";
049     public static final String KEY_VISIBLE = "visible";
050     public static final String KEY_ACCELERATOR = "accelerator";
051     public static final String KEY_STYLECLASS = "styleClass";
052     public static final String KEY_STYLE = "style";
053     public static final String KEY_GRAPHICSTYLECLASS = "graphicStyleClass";
054     public static final String KEY_GRAPHICSTYLE = "graphicStyle";
055 
056     private final JavaFXAction toolkitAction;
057     private String description;
058     private String icon;
059     private String image;
060     private Node graphic;
061     private String accelerator;
062     private String styleClass;
063     private String style;
064     private String graphicStyleClass;
065     private String graphicStyle;
066     private boolean selected;
067     private boolean visible = true;
068 
069     public JavaFXGriffonControllerAction(@Nonnull final UIThreadManager uiThreadManager, @Nonnull final ActionManager actionManager, @Nonnull final GriffonController controller, @Nonnull final ActionMetadata actionMetadata) {
070         super(actionManager, controller, actionMetadata);
071         requireNonNull(uiThreadManager, "Argument 'uiThreadManager' must not be null");
072 
073         toolkitAction = createAction(actionManager, controller, actionMetadata.getActionName());
074         toolkitAction.setOnAction(actionEvent -> actionManager.invokeAction(controller, actionMetadata.getActionName(), actionEvent));
075 
076         addPropertyChangeListener(evt -> uiThreadManager.runInsideUIAsync(() -> handlePropertyChange(evt)));
077     }
078 
079     protected JavaFXAction createAction(@Nonnull final ActionManager actionManager, @Nonnull final GriffonController controller, @Nonnull final String actionName) {
080         return new JavaFXAction();
081     }
082 
083     protected void handlePropertyChange(@Nonnull PropertyChangeEvent evt) {
084         if (KEY_NAME.equals(evt.getPropertyName())) {
085             toolkitAction.setName(String.valueOf(evt.getNewValue()));
086         else if (KEY_DESCRIPTION.equals(evt.getPropertyName())) {
087             toolkitAction.setDescription(String.valueOf(evt.getNewValue()));
088         else if (KEY_ENABLED.equals(evt.getPropertyName())) {
089             toolkitAction.setEnabled(castToBoolean(evt.getNewValue()));
090         else if (KEY_SELECTED.equals(evt.getPropertyName())) {
091             toolkitAction.setSelected(castToBoolean(evt.getNewValue()));
092         else if (KEY_VISIBLE.equals(evt.getPropertyName())) {
093             toolkitAction.setVisible(castToBoolean(evt.getNewValue()));
094         else if (KEY_ACCELERATOR.equals(evt.getPropertyName())) {
095             String accelerator = (Stringevt.getNewValue();
096             if (isNotBlank(accelerator)) { toolkitAction.setAccelerator(accelerator)}
097         else if (KEY_STYLECLASS.equals(evt.getPropertyName())) {
098             String styleClass = (Stringevt.getNewValue();
099             if (isNotBlank(styleClass)) { toolkitAction.setStyleClass(styleClass)}
100         else if (KEY_STYLE.equals(evt.getPropertyName())) {
101             String style = (Stringevt.getNewValue();
102             if (isNotBlank(style)) { toolkitAction.setStyle(style)}
103         else if (KEY_ICON.equals(evt.getPropertyName())) {
104             String icon = (Stringevt.getNewValue();
105             if (isNotBlank(icon)) { toolkitAction.setIcon(icon)}
106         else if (KEY_IMAGE.equals(evt.getPropertyName())) {
107             Image image = (Imageevt.getNewValue();
108             if (null != image) { toolkitAction.setImage(image)}
109         else if (KEY_GRAPHIC.equals(evt.getPropertyName())) {
110             Node graphic = (Nodeevt.getNewValue();
111             if (null != graphic) { toolkitAction.setGraphic(graphic)}
112         else if (KEY_GRAPHICSTYLECLASS.equals(evt.getPropertyName())) {
113             String graphicStyleClass = (Stringevt.getNewValue();
114             if (isNotBlank(graphicStyleClass)) { toolkitAction.setGraphicStyleClass(graphicStyleClass)}
115         else if (KEY_GRAPHICSTYLE.equals(evt.getPropertyName())) {
116             String graphicStyle = (Stringevt.getNewValue();
117             if (isNotBlank(graphicStyle)) { toolkitAction.setGraphicStyle(graphicStyle)}
118         }
119     }
120 
121     @Nullable
122     public String getStyleClass() {
123         return styleClass;
124     }
125 
126     public void setStyleClass(@Nullable String styleClass) {
127         firePropertyChange(KEY_STYLECLASS, this.styleClass, this.styleClass = styleClass);
128     }
129 
130     @Nullable
131     public String getStyle() {
132         return style;
133     }
134 
135     public void setStyle(@Nullable String style) {
136         firePropertyChange(KEY_STYLE, this.style, this.style = style);
137     }
138 
139     @Nullable
140     public String getGraphicStyleClass() {
141         return graphicStyleClass;
142     }
143 
144     public void setGraphicStyleClass(@Nullable String graphicStyleClass) {
145         firePropertyChange(KEY_GRAPHICSTYLECLASS, this.graphicStyleClass, this.graphicStyleClass = graphicStyleClass);
146     }
147 
148     @Nullable
149     public String getGraphicStyle() {
150         return graphicStyle;
151     }
152 
153     public void setGraphicStyle(@Nullable String graphicStyle) {
154         firePropertyChange(KEY_GRAPHICSTYLE, this.graphicStyle, this.graphicStyle = graphicStyle);
155     }
156 
157     @Nullable
158     public String getAccelerator() {
159         return accelerator;
160     }
161 
162     public void setAccelerator(@Nullable String accelerator) {
163         firePropertyChange(KEY_ACCELERATOR, this.accelerator, this.accelerator = accelerator);
164     }
165 
166     public boolean isSelected() {
167         return selected;
168     }
169 
170     public void setSelected(boolean selected) {
171         firePropertyChange(KEY_SELECTED, this.selected, this.selected = selected);
172     }
173 
174     public boolean isVisible() {
175         return visible;
176     }
177 
178     public void setVisible(boolean visible) {
179         firePropertyChange(KEY_SELECTED, this.visible, this.visible = visible);
180     }
181 
182     @Nullable
183     public String getDescription() {
184         return description;
185     }
186 
187     public void setDescription(@Nullable String description) {
188         firePropertyChange(KEY_DESCRIPTION, this.description, this.description = description);
189     }
190 
191     @Nullable
192     public String getIcon() {
193         return icon;
194     }
195 
196     public void setIcon(@Nullable String icon) {
197         firePropertyChange(KEY_ICON, this.icon, this.icon = icon);
198     }
199 
200     @Nullable
201     public Image getImage() {
202         PropertyEditor editor = findEditor(Image.class);
203         editor.setValue(image);
204         return (Imageeditor.getValue();
205     }
206 
207     public void setImage(@Nullable String image) {
208         firePropertyChange(KEY_IMAGE, this.image, this.image = image);
209     }
210 
211     @Nullable
212     public Node getGraphic() {
213         return graphic;
214     }
215 
216     public void setGraphic(@Nullable Node graphic) {
217         firePropertyChange(KEY_ICON, this.graphic, this.graphic = graphic);
218     }
219 
220     @Nonnull
221     public Object getToolkitAction() {
222         return toolkitAction;
223     }
224 
225     @Override
226     protected void doExecute(Object... args) {
227         ActionEvent event = null;
228         if (args != null && args.length == && args[0instanceof ActionEvent) {
229             event = (ActionEventargs[0];
230         }
231         toolkitAction.onActionProperty().get().handle(event);
232     }
233 
234     @Override
235     protected void doInitialize() {
236         toolkitAction.setName(getName());
237         toolkitAction.setDescription(getDescription());
238         toolkitAction.setEnabled(isEnabled());
239         toolkitAction.setSelected(isSelected());
240         toolkitAction.setVisible(isVisible());
241         String accelerator = getAccelerator();
242         if (isNotBlank(accelerator)) { toolkitAction.setAccelerator(accelerator)}
243         if (isNotBlank(style)) { toolkitAction.setStyle(style)}
244         if (isNotBlank(styleClass)) { toolkitAction.setStyleClass(styleClass)}
245         String icon = getIcon();
246         if (isNotBlank(icon)) { toolkitAction.setIcon(icon)}
247         if (null != getImage()) { toolkitAction.setImage(getImage())}
248         if (null != getGraphic()) { toolkitAction.setGraphic(getGraphic())}
249         if (isNotBlank(graphicStyle)) { toolkitAction.setGraphicStyle(graphicStyle)}
250         if (isNotBlank(graphicStyleClass)) { toolkitAction.setGraphicStyleClass(graphicStyleClass)}
251     }
252 }