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