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.util.ArrayList;
  import java.util.List;
  
  import javax.swing.JTable;
  
  /**
   * A builder for a JTable binding.
   * 
   */
  public class TableBindingBuilder {
  
      protected BindingBuilder helper;
      protected List columns;
  
      public TableBindingBuilder(BindingFactory factory, Object context) {
          this(new BindingBuilder(factory, context));
      }
  
      public TableBindingBuilder(BindingBuilder helper) {
          this.helper = helper;
      }
  
      /**
       * Creates a binding using preconfigured parameters.
       */
      public ObjectBinding bindToTable(JTable table, String listBinding) {
          int width = (columns != null) ? columns.size() : 0;
  
          String[] headers = new String[width];
          BindingExpression[] expressions = new BindingExpression[width];
          Class[] classes = new Class[width];
          boolean[] editableState = new boolean[width];
          Object[] sampleLongValues = new Object[width];
  
          for (int i = 0; i < width; i++) {
              ColumnDescriptor descriptor = (ColumnDescriptor) columns.get(i);
              headers[i] = descriptor.header;
              expressions[i] = descriptor.expression;
              classes[i] = descriptor.columnClass;
              editableState[i] = descriptor.editable;
              sampleLongValues[i] = descriptor.sampleLongValue;
          }
  
          ObjectBinding binding = helper.getFactory().bindToTable(
                  table,
                  listBinding,
                  headers,
                  expressions,
                  classes,
                  editableState,
                  sampleLongValues);
          return helper.initBinding(binding, helper.getDelegate());
      }
  
      /**
       * Adds a column to the table description.
       */
      public void addColumn(
              String header,
              String expression,
              Class columnClass,
              boolean editable) {
  
          this.addColumn(header, expression, columnClass, editable, null);
      }
  
      /**
       * Adds a column to the table description.
       * 
       * @param sampleLongValue if not null, this value rendered size is used to size the
       *            column.
       */
      public void addColumn(
              String header,
              String expression,
              Class columnClass,
              boolean editable,
              Object sampleLongValue) {
  
          if (columns == null) {
              columns = new ArrayList();
          }
  
          columns.add(new ColumnDescriptor(
                  header,
                  new BindingExpression(expression),
                  columnClass,
                  editable,
                  sampleLongValue));
      }
  
      final class ColumnDescriptor {
  
          String header;
          BindingExpression expression;
          boolean editable;
          Class columnClass;
          Object sampleLongValue;
  
          ColumnDescriptor(String header, BindingExpression expression, Class columnClass,
                  boolean editable, Object sampleLongValue) {
              this.header = header;
              this.expression = expression;
              this.editable = editable;
              this.columnClass = columnClass;
              this.sampleLongValue = sampleLongValue;
          }
      }
  }
  