JavaFXGriffonControllerAction.java
001 /*
002  * Copyright 2008-2015 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.threading.UIThreadManager;
021 import griffon.javafx.support.JavaFXAction;
022 import javafx.event.ActionEvent;
023 import javafx.event.EventHandler;
024 import org.codehaus.griffon.runtime.core.controller.AbstractAction;
025 
026 import javax.annotation.Nonnull;
027 import javax.annotation.Nullable;
028 import java.beans.PropertyChangeEvent;
029 import java.beans.PropertyChangeListener;
030 
031 import static griffon.util.GriffonNameUtils.isBlank;
032 import static griffon.util.TypeUtils.castToBoolean;
033 import static java.util.Objects.requireNonNull;
034 
035 /**
036  @author Andres Almiray
037  */
038 public class JavaFXGriffonControllerAction extends AbstractAction {
039     public static final String KEY_DESCRIPTION = "description";
040     public static final String KEY_ICON = "icon";
041     public static final String KEY_SELECTED = "selected";
042     public static final String KEY_ACCELERATOR = "accelerator";
043     private final JavaFXAction toolkitAction;
044     private String description;
045     private String icon;
046     private String accelerator;
047     private boolean selected;
048 
049     public JavaFXGriffonControllerAction(final @Nonnull UIThreadManager uiThreadManager, @Nonnull final ActionManager actionManager, @Nonnull final GriffonController controller, @Nonnull final String actionName) {
050         super(actionManager, controller, actionName);
051         requireNonNull(uiThreadManager, "Argument 'uiThreadManager' must not be null");
052 
053         toolkitAction = new JavaFXAction();
054         toolkitAction.setOnAction(new EventHandler<ActionEvent>() {
055             public void handle(ActionEvent actionEvent) {
056                 actionManager.invokeAction(controller, actionName, actionEvent);
057             }
058         });
059         addPropertyChangeListener(new PropertyChangeListener() {
060             public void propertyChange(final PropertyChangeEvent evt) {
061                 uiThreadManager.runInsideUIAsync(new Runnable() {
062                     public void run() {
063                         if (KEY_NAME.equals(evt.getPropertyName())) {
064                             toolkitAction.setName(String.valueOf(evt.getNewValue()));
065                         else if (KEY_DESCRIPTION.equals(evt.getPropertyName())) {
066                             toolkitAction.setDescription(String.valueOf(evt.getNewValue()));
067                         else if (KEY_ENABLED.equals(evt.getPropertyName())) {
068                             toolkitAction.setEnabled(castToBoolean(evt.getNewValue()));
069                         else if (KEY_SELECTED.equals(evt.getPropertyName())) {
070                             toolkitAction.setSelected(castToBoolean(evt.getNewValue()));
071                         else if (KEY_ACCELERATOR.equals(evt.getPropertyName())) {
072                             String accelerator = (Stringevt.getNewValue();
073                             if (!isBlank(accelerator))
074                                 toolkitAction.setAccelerator(accelerator);
075                         else if (KEY_ICON.equals(evt.getPropertyName())) {
076                             final String icon = (Stringevt.getNewValue();
077                             if (!isBlank(icon)) toolkitAction.setIcon(icon);
078                         }
079                     }
080                 });
081             }
082         });
083     }
084 
085     @Nullable
086     public String getAccelerator() {
087         return accelerator;
088     }
089 
090     public void setAccelerator(@Nullable String accelerator) {
091         firePropertyChange(KEY_ACCELERATOR, this.accelerator, this.accelerator = accelerator);
092     }
093 
094     public boolean isSelected() {
095         return selected;
096     }
097 
098     public void setSelected(boolean selected) {
099         firePropertyChange(KEY_SELECTED, this.selected, this.selected = selected);
100     }
101 
102     @Nullable
103     public String getDescription() {
104         return description;
105     }
106 
107     public void setDescription(@Nullable String description) {
108         firePropertyChange(KEY_DESCRIPTION, this.description, this.description = description);
109     }
110 
111     @Nullable
112     public String getIcon() {
113         return icon;
114     }
115 
116     public void setIcon(@Nullable String icon) {
117         firePropertyChange(KEY_ICON, this.icon, this.icon = icon);
118     }
119 
120     @Nonnull
121     public Object getToolkitAction() {
122         return toolkitAction;
123     }
124 
125     protected void doExecute(Object... args) {
126         ActionEvent event = null;
127         if (args != null && args.length == && args[0instanceof ActionEvent) {
128             event = (ActionEventargs[0];
129         }
130         toolkitAction.onActionProperty().get().handle(event);
131     }
132 
133     @Override
134     protected void doInitialize() {
135         toolkitAction.setName(getName());
136         toolkitAction.setDescription(getDescription());
137         toolkitAction.setEnabled(isEnabled());
138         toolkitAction.setSelected(isSelected());
139         String accelerator = getAccelerator();
140         if (!isBlank(accelerator)) toolkitAction.setAccelerator(accelerator);
141         String icon = getIcon();
142         if (!isBlank(icon)) toolkitAction.setIcon(icon);
143     }
144 }