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