content: /*****************************************************************
   *   Licensed to the Apache Software Foundation (ASF) under one
   *  or more contributor license agreements.  See the NOTICE file
   *  distributed with this work for additional information
   *  regarding copyright ownership.  The ASF licenses this file
   *  to you 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
   *
   *    https://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 org.apache.cayenne.swing;
  
  import java.awt.Component;
  
  import javax.swing.*;
  
  /**
   * A factory for a number of common bindings.
   * 
   */
  public class BindingFactory {
  
      protected boolean usingNullForEmptyStrings;
      protected boolean checkingForValueChange;
  
      public BindingFactory() {
          // init defaults...
          usingNullForEmptyStrings = true;
          checkingForValueChange = true;
      }
  
      public ObjectBinding bindToTable(
              JTable table,
              String listBinding,
              String[] headers,
              BindingExpression[] columns,
              Class[] columnClass,
              boolean[] editableState,
              Object[] sampleLongValues) {
  
          TableBinding binding = new TableBinding(
                  table,
                  listBinding,
                  headers,
                  columns,
                  columnClass,
                  editableState,
                  sampleLongValues);
          return prepareBinding(binding);
      }
  
      public ObjectBinding bindToProperty(
              BoundComponent component,
              String property,
              String boundProperty) {
          PropertyBinding binding = new PropertyBinding(component, property, boundProperty);
          return prepareBinding(binding);
      }
  
      /**
       * Binds to AbstractButton item state change events. Most common AbstractButton
       * subclasses are JButton, JCheckBox, JRadioButton.
       */
      public ObjectBinding bindToStateChange(AbstractButton button, String property) {
          ItemEventBinding binding = new ItemEventBinding(button, property);
          return prepareBinding(binding);
      }
  
      /**
       * Binds to AbstractButton action events. Most common AbstractButton subclasses are
       * JButton, JCheckBox, JRadioButton.
       */
      public ObjectBinding bindToAction(AbstractButton button, String action) {
          ActionBinding binding = new ActionBinding(button, action);
          return prepareBinding(binding);
      }
  
      /**
       * Binds to a generic component. Action events support is discovered via
       * introspection. If component class does not define action events, an exception is
       * thrown.
       */
      public ObjectBinding bindToAction(Component component, String action) {
          BeanActionBinding binding = new BeanActionBinding(component, action);
          return prepareBinding(binding);
      }
  
      public ObjectBinding bindToAction(
              BoundComponent component,
              String action,
              String boundExpression) {
          ActionBinding binding = new ActionBinding(component, action, boundExpression);
          return prepareBinding(binding);
      }
  
      public ObjectBinding bindToComboSelection(
              JComboBox component,
              String property,
              String noSelectionValue) {
          ComboSelectionBinding binding = new ComboSelectionBinding(
                  component,
                  property,
                  noSelectionValue);
          return prepareBinding(binding);
      }
  
      public ObjectBinding bindToTextArea(JTextArea component, String property) {
          TextBinding binding = new TextBinding(component, property);
          return prepareBinding(binding);
      }
  
      /**
       * Creates a binding that updates a property on text field text changes.
       */
      public ObjectBinding bindToTextField(JTextField component, String property) {
          TextBinding binding = new TextBinding(component, property);
          return prepareBinding(binding);
      }
  
      public ObjectBinding bindToCheckBox(JCheckBox component, String property) {
          CheckBoxBinding binding = new CheckBoxBinding(component, property);
          return prepareBinding(binding);
      }
  
      /**
       * Configures binding with factory default settings.
       */
      protected ObjectBinding prepareBinding(BindingBase binding) {
          binding.setUsingNullForEmptyStrings(isUsingNullForEmptyStrings());
          binding.setCheckingForValueChange(isCheckingForValueChange());
          return binding;
      }
  
      public boolean isCheckingForValueChange() {
          return checkingForValueChange;
      }
  
      public void setCheckingForValueChange(boolean callingSetForEqual) {
          this.checkingForValueChange = callingSetForEqual;
      }
  
      public boolean isUsingNullForEmptyStrings() {
          return usingNullForEmptyStrings;
      }
  
      public void setUsingNullForEmptyStrings(boolean usingNullForEmptyStrings) {
          this.usingNullForEmptyStrings = usingNullForEmptyStrings;
      }
  }
  