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 = (String) evt.getNewValue();
096 if (isNotBlank(accelerator)) { toolkitAction.setAccelerator(accelerator); }
097 } else if (KEY_STYLECLASS.equals(evt.getPropertyName())) {
098 String styleClass = (String) evt.getNewValue();
099 if (isNotBlank(styleClass)) { toolkitAction.setStyleClass(styleClass); }
100 } else if (KEY_STYLE.equals(evt.getPropertyName())) {
101 String style = (String) evt.getNewValue();
102 if (isNotBlank(style)) { toolkitAction.setStyle(style); }
103 } else if (KEY_ICON.equals(evt.getPropertyName())) {
104 String icon = (String) evt.getNewValue();
105 if (isNotBlank(icon)) { toolkitAction.setIcon(icon); }
106 } else if (KEY_IMAGE.equals(evt.getPropertyName())) {
107 Image image = (Image) evt.getNewValue();
108 if (null != image) { toolkitAction.setImage(image); }
109 } else if (KEY_GRAPHIC.equals(evt.getPropertyName())) {
110 Node graphic = (Node) evt.getNewValue();
111 if (null != graphic) { toolkitAction.setGraphic(graphic); }
112 } else if (KEY_GRAPHICSTYLECLASS.equals(evt.getPropertyName())) {
113 String graphicStyleClass = (String) evt.getNewValue();
114 if (isNotBlank(graphicStyleClass)) { toolkitAction.setGraphicStyleClass(graphicStyleClass); }
115 } else if (KEY_GRAPHICSTYLE.equals(evt.getPropertyName())) {
116 String graphicStyle = (String) evt.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 (Image) editor.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 == 1 && args[0] instanceof ActionEvent) {
229 event = (ActionEvent) args[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 }
|