ActionFactory.groovy
001 /*
002  * Copyright 2008-2016 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 griffon.builder.javafx.factory
017 
018 import griffon.javafx.support.JavaFXAction
019 import groovyx.javafx.factory.AbstractFXBeanFactory
020 import javafx.beans.value.ChangeListener
021 import javafx.beans.value.ObservableValue
022 import javafx.scene.control.Tooltip
023 
024 import static griffon.javafx.support.JavaFXUtils.resolveIcon
025 
026 /**
027  *
028  @author Andres Almiray
029  */
030 class ActionFactory extends AbstractFXBeanFactory {
031     ActionFactory() {
032         super(JavaFXAction, false)
033     }
034 
035     @Override
036     boolean onHandleNodeAttributes(FactoryBuilderSupport builder, Object node, Map attributes) {
037         attributes.remove('id')
038         return super.onHandleNodeAttributes(builder, node, attributes)
039     }
040 
041     static Map extractActionParams(Map attributes) {
042         Map actionParams = [:]
043 
044         actionParams.skipOnAction = attributes.remove('skipOnAction')
045         actionParams.skipName = attributes.remove('skipName')
046         actionParams.skipDescription = attributes.remove('skipDescription')
047         actionParams.skipAccelerator = attributes.remove('skipAccelerator')
048         actionParams.skipIcon = attributes.remove('skipIcon')
049         actionParams.skipSelected = attributes.remove('skipSelected')
050         actionParams.skipEnabled = attributes.remove('skipEnabled')
051 
052         actionParams
053     }
054 
055     static void applyAction(control, JavaFXAction action, Map actionParams) {
056         MetaClass mc = control.metaClass
057 
058         if (!actionParams.skipOnAction && mc.respondsTo(control, "onActionProperty")) {
059             action.onActionProperty().addListener(new ChangeListener() {
060                 void changed(ObservableValue observableValue, Object oldValue, Object newValue) {
061                     control.onActionProperty().set(newValue)
062                 }
063             })
064             control.onActionProperty().set(action.onAction)
065         }
066         if (!actionParams.skipName && mc.respondsTo(control, "textProperty")) {
067             action.nameProperty().addListener(new ChangeListener() {
068                 void changed(ObservableValue observableValue, Object oldValue, Object newValue) {
069                     control.textProperty().set(newValue)
070                 }
071             })
072             control.textProperty().set(action.name)
073         }
074         if (!actionParams.skipDescription && mc.respondsTo(control, "tooltipProperty")) {
075             action.descriptionProperty().addListener(new ChangeListener() {
076                 void changed(ObservableValue observableValue, Object oldValue, Object newValue) {
077                     setTooltip(control, newValue)
078                 }
079             })
080             if (action.descriptionsetTooltip(control, action.description)
081         }
082         if (!actionParams.skipAccelerator && mc.respondsTo(control, "acceleratorProperty")) {
083             action.acceleratorProperty().addListener(new ChangeListener() {
084                 void changed(ObservableValue observableValue, Object oldValue, Object newValue) {
085                     control.acceleratorProperty().set(newValue)
086                 }
087             })
088             if (action.accelerator != nullcontrol.acceleratorProperty().set(action.accelerator)
089         }
090         if (mc.respondsTo(control, "graphicProperty")) {
091             if (!actionParams.skipIcon) {
092                 action.iconProperty().addListener(new ChangeListener() {
093                     void changed(ObservableValue observableValue, Object oldValue, Object newValue) {
094                         setIcon(control, newValue)
095                     }
096                 })
097                 if (action.iconsetIcon(control, action.icon)
098             }
099         }
100         if (!actionParams.skipSelected && mc.respondsTo(control, "selectedProperty")) {
101             action.selectedProperty().addListener(new ChangeListener() {
102                 void changed(ObservableValue observableValue, Object oldValue, Object newValue) {
103                     control.selectedProperty().set(newValue)
104                 }
105             })
106             control.selectedProperty().set(action.selected)
107         }
108         if (!actionParams.skipEnabled && mc.respondsTo(control, "disableProperty")) {
109             action.enabledProperty().addListener(new ChangeListener() {
110                 void changed(ObservableValue observableValue, Object oldValue, Object newValue) {
111                     control.disableProperty().set(!newValue)
112                 }
113             })
114             control.disableProperty().set(!action.enabled)
115         }
116     }
117 
118     static void setIcon(node, String iconUrl) {
119         node.graphicProperty().set(resolveIcon(iconUrl))
120     }
121 
122     static void setTooltip(node, String text) {
123         Tooltip tooltip = node.tooltipProperty().get()
124         if (!tooltip) {
125             tooltip = new Tooltip()
126             node.tooltipProperty().set(tooltip)
127         }
128         tooltip.text = text
129     }
130 }