/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package standardDsls

def bindableMethods = {
    method name: "addPropertyChangeListener",
           type: "void",
           params: [propertyName: "java.lang.String",
           listener: "java.beans.PropertyChangeListener"],
           doc: """
           Add a PropertyChangeListener to the listener list. The listener is registered for all properties.
           The same listener object may be added more than once, and will be called as many times as it is added.
           If listener is null, no exception is thrown and no action is taken.
           @param listener The PropertyChangeListener to be added 
           """

    method name: "addPropertyChangeListener",
           type: "void",
           params: [listener: "java.beans.PropertyChangeListener"],
           doc: """
           Add a PropertyChangeListener for a specific property. The listener will be invoked only when a call on
           firePropertyChange names that specific property. The same listener object may be added more than once.
           For each property, the listener will be invoked the number of times it was added for that property.
           If propertyName or listener is null, no exception is thrown and no action is taken.
           @param propertyName The name of the property to listen on.
           @param listener The PropertyChangeListener to be added 
           """

    method name: "removePropertyChangeListener",
           type: "void",
           params: [propertyName: "java.lang.String",
           listener: "java.beans.PropertyChangeListener"],
           doc: """
           Remove a PropertyChangeListener for a specific property. If listener was added more than once to the same
           event source for the specified property, it will be notified one less time after being removed. If
           propertyName is null, no exception is thrown and no action is taken. If listener is null, or was never
           added for the specified property, no exception is thrown and no action is taken.
           @param propertyName The name of the property that was listened on.
           @param listener The PropertyChangeListener to be removed 
           """

    method name: "removePropertyChangeListener",
           type: "void",
           params: [listener: "java.beans.PropertyChangeListener"],
           doc: """
           Remove a PropertyChangeListener from the listener list. This removes a PropertyChangeListener that was
           registered for all properties. If listener was added more than once to the same event source, it will
           be notified one less time after being removed. If listener is null, or was never added, no exception is
           thrown and no action is taken.
           @param listener The PropertyChangeListener to be removed 
           """

    method name: "firePropertyChange",
           type: "void",
           params: [propertyName: "java.lang.String", oldValue: "java.lang.Object", newValue: "java.lang.Object"],
           doc: """
           Report a bound property update to any registered listeners.
           This is merely a convenience wrapper around the more general firePropertyChange method that takes PropertyChangeEvent value.
           @param propertyName The programmatic name of the property that was changed.
           @param oldValue The old value of the property.
           @param newValue The new value of the property.
           """

    method name: "getPropertyChangeListeners",
           type: "java.beans.PropertyChangeListener[]",
           doc: """
           Returns an array of all the listeners that were added to the PropertyChangeSupport object with addPropertyChangeListener().
           @return all of the PropertyChangeListeners added or an empty array if no listeners have been added
           """

    method name: "getPropertyChangeListeners",
           type: "java.beans.PropertyChangeListener[]",
           params: [propertyName: "java.lang.String"],
           doc: """
           Returns an array of all the listeners which have been associated with the named property.
           @param propertyName The name of the property being listened to 
           @return all of the PropertyChangeListeners associated with the named property. If no such 
           listeners have been added, or if propertyName is null, an empty array is returned.
           """
}

contributor(ctype:hasField(hasAnnotation("groovy.beans.Bindable"))) {
  if (psiClass?.fields?.find {it.hasAnnotation("groovy.beans.Bindable")}) {
    bindableMethods.delegate = delegate
    bindableMethods.resolveStrategy = Closure.DELEGATE_FIRST
    bindableMethods()
  }
}