Package gov.nasa.arc.mct.table.view

Source Code of gov.nasa.arc.mct.table.view.TableControlPanelController

/*******************************************************************************
* Mission Control Technologies, Copyright (c) 2009-2012, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* The MCT platform is 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.
*
* MCT includes source code licensed under additional open source licenses. See
* the MCT Open Source Licenses file included with this distribution or the About
* MCT Licenses dialog available at runtime from the MCT Help menu for additional
* information.
*******************************************************************************/
/**
*
*/
package gov.nasa.arc.mct.table.view;

import gov.nasa.arc.mct.abbreviation.AbbreviationService;
import gov.nasa.arc.mct.abbreviation.Abbreviations;
import gov.nasa.arc.mct.components.AbstractComponent;
import gov.nasa.arc.mct.components.FeedProvider;
import gov.nasa.arc.mct.components.FeedProvider.FeedType;
import gov.nasa.arc.mct.evaluator.api.Evaluator;
import gov.nasa.arc.mct.table.access.ServiceAccess;
import gov.nasa.arc.mct.table.gui.LabeledTable;
import gov.nasa.arc.mct.table.model.ComponentTableModel;
import gov.nasa.arc.mct.table.model.LabeledTableModel;
import gov.nasa.arc.mct.table.model.TableColumnModelAdapter;
import gov.nasa.arc.mct.table.model.TableOrientation;
import gov.nasa.arc.mct.table.model.TableType;
import gov.nasa.arc.mct.table.view.BorderState.BorderEdge;
import gov.nasa.arc.mct.table.view.TableFormattingConstants.JVMFontFamily;
import gov.nasa.arc.mct.table.view.TimeFormat.DateFormatItem;

import java.awt.Color;
import java.awt.Font;
import java.util.HashSet;
import java.util.Iterator;
import java.util.ResourceBundle;
import java.util.Set;

import javax.swing.ButtonModel;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableColumn;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Implements a controller that mediates between a labeled table and
* a control panel for that table.
*/
public class TableControlPanelController extends TableSettingsController {
 
  private static final Logger logger = LoggerFactory.getLogger(TableControlPanelController.class);
 
  /** The resource bundle we should use for getting strings. */
  private static final ResourceBundle bundle = ResourceBundle.getBundle("TableSettingsControlPanel"); //NOI18N

  private LabeledTable table;
  private LabeledTableModel model;

  private TableViewManifestation manifestation;

  /**
   * Creates a new controller for a view, table, and table model.
   *
   * @param manifestation the table view manifestation
   * @param table the table
   * @param model the table model
   */
  public TableControlPanelController(TableViewManifestation manifestation, LabeledTable table, LabeledTableModel model) {
    this.manifestation = manifestation;
    this.table = table;
    this.model = model;

    table.getTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
      @Override
      public void valueChanged(ListSelectionEvent e) {
        TableControlPanelController.this.fireSelectionChanged();
      }
    });
   
    table.getTable().getColumnModel().addColumnModelListener(new TableColumnModelAdapter() {
      @Override
      public void columnSelectionChanged(ListSelectionEvent e) {
        TableControlPanelController.this.fireSelectionChanged();
      }
    });
   
    table.getRowHeaders().addListSelectionListener(new ListSelectionListener() {
      @Override
      public void valueChanged(ListSelectionEvent e) {
        TableControlPanelController.this.fireSelectionChanged();
      }
    });
  }
 
  @Override
  public boolean getShowGrid() {
    return table.getTable().getShowHorizontalLines();
  }

  @Override
  public TableOrientation getTableOrientation() {
    return model.getOrientation();
  }

  @Override
  public void setShowGrid(boolean showGrid) {
    table.setShowGrid(showGrid);
    manifestation.saveCellSettings();
  }

  @Override
  public void setTableOrientation(TableOrientation orientation) {
    model.setOrientation(orientation);
    manifestation.swapAbbreviationsUponTableOrientationChange(orientation);
    table.updateColumnsHeaderValuesOnly();
    table.updateDropMode();
    manifestation.saveCellSettingsUponTableOrientationChange();
   
    for (int row = 0; row < table.getTable().getRowCount(); row++) {
        table.getTable().setRowHeight(row, getRowHeightFromPersistence(row));
    }

  }

  @Override
  public void transposeTable() {
    logger.error("Should transpose the table.");
  }

  @Override
  public int getSelectedCellCount() {
    return getSelectedRowCount() * getSelectedColumnCount();
  }

  @Override
  public int getSelectedColumnCount() {
    if (model.isSkeleton()) {
      return 0;
    } else if (model.getTableType() == TableType.ZERO_DIMENSIONAL) {
      // We have to special-case a 0-D table since the
      // row or column selection might be zero while the other
      // is nonzero.
      return (table.getTable().isCellSelected(0, 0) ? 1 : 0);
    } else {
      return table.getTable().getSelectedColumnCount();
    }
  }

  @Override
  public int getSelectedRowCount() {
    if (model.isSkeleton()) {
      return 0;
    } else if (model.getTableType() == TableType.ZERO_DIMENSIONAL) {
      // We have to special-case a 0-D table since the
      // row or column selection might be zero while the other
      // is nonzero.
      return (table.getTable().isCellSelected(0, 0) ? 1 : 0);
    } else {
      return table.getTable().getSelectedRowCount();
    }
  }

  @Override
  public boolean isCanHideHeaders() {
    return true;
  }

  @Override
  public int getColumnWidth() {
    if (getSelectedColumnCount() == 0) {
      return -1;
    } else {
      int firstColumn = table.getTable().getColumnModel().getSelectedColumns()[0];
      return table.getTable().getColumnModel().getColumn(firstColumn).getPreferredWidth();
    }
  }

  private int getRowHeightFromPersistence(int rowIndex) {
    int rowHeight = table.getTable().getRowHeight();
    TableSettings tableSettings = manifestation.loadSettingsFromPersistence();
    for (TableSettings.AvailableSettings setting : TableSettings.AvailableSettings
        .values()) {
      try {
        String name = setting.name();
        String value = manifestation.getViewProperties().getProperty(name, String.class);
        if (name.equals(TableSettings.AvailableSettings.ROW_HEIGHTS.name())) {

          if ((value != null) && !value.isEmpty()) {
            int[] rowHeights = tableSettings.toIntegerArray(value);
            return rowHeights[rowIndex];
          }

        }
      } catch (Exception ex) {
        logger.error("Exception when loading persistent settings: ", ex);
      }
    }
    return rowHeight;
  }
 
  @Override
  public int getRowHeight() {
    int[] selectedRows = table.getTable().getSelectedRows();
   
    if (selectedRows == null || selectedRows.length == 0) {
      return -1;
    }
   
    int firstRowHeight = -1;
   
    for (int i = 0; i < selectedRows.length; i++) {
      int currentRowHeight = getRowHeightFromPersistence(selectedRows[i]);
      if (currentRowHeight > 0) {
        if (i == 0) {
          firstRowHeight = currentRowHeight;
        }
        setRowHeight(selectedRows[i], currentRowHeight);
      }
    }
  return firstRowHeight;
  }
 
/*  @Override
  public Integer getRowHeight() {
    Integer commonSize = null;
   
    for (Integer row : table.getSelectedRows()) {
      Integer aSize = table.getRowHeight(row);
      if (commonSize!=null && commonSize!=aSize) {
        return null;
      }
      commonSize = aSize;
    }
   
    return commonSize;
  }*/

  @Override
  public void setColumnWidth(int newWidth) {
    for (int col : table.getTable().getSelectedColumns()) {
      TableColumn column = table.getTable().getColumnModel().getColumn(col);
      if (column.getPreferredWidth() != newWidth) {
        column.setPreferredWidth(newWidth);
      }
    }
    manifestation.saveCellSettings();
  }

  @Override
  public void setRowHeight(int newHeight) {
    for (int row : table.getTable().getSelectedRows()) {
      if (table.getTable().getRowHeight(row) != newHeight) {
        table.setRowHeight(row, newHeight);
        table.getTable().setRowHeight(row, newHeight);
      }
    }
    manifestation.saveCellSettings();
  }
 
  private void setRowHeight(int rowIndex, int newHeight) {
    if (table.getTable().getRowHeight(rowIndex) != newHeight) {
        table.getTable().setRowHeight(rowIndex, newHeight);
        manifestation.saveCellSettings();
    }
  }
 
  /**
   * Tests whether a single, non-empty cell has been selected. If a single
   * cell selection exists, return true if the cell has a component at that
   * location.
   *
   * @return true, if a single, non-empty cell has been selected, false otherwise
   */
  public boolean isSingleCellSelection() {
    if (getSelectedCellCount() != 1) {
      return false;
    } else {
      return !isSelectionContainsEmptyCells();
    }
  }
 
  private boolean isSelectionContainsEmptyCells() {
    for (int row : table.getSelectedRows()) {
      for (int column : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, column);
        if (component == null) {
          return true;
        }
      }
    }
   
    return false;
  }
 
  @Override
  public ComboBoxModel getEnumerationModel() {
    DefaultComboBoxModel enumerationModel = new DefaultComboBoxModel();
    if (isSelectionContainsEmptyCells()) {
      enumerationModel.addElement(new EnumerationItem(null));
      return enumerationModel;
    }
    if (isSingleCellSelection()) {
      EnumerationItem selectedItem = null;
      AbstractComponent component = (AbstractComponent) model.getStoredValueAt(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
      TableCellSettings cellSettings = tableModel.getCellSettings(tableModel.getKey(component));
      AbstractComponent evaluator = cellSettings.getEvaluator();
      //Enumeration control is now always visible, so show None as option
      enumerationModel.addElement(new EnumerationItem(null));
     
      // Add the component itself, if it can be a self-evaluator.
      if (component.getCapability(Evaluator.class) != null && !component.getCapability(Evaluator.class).requiresMultipleInputs()) {
        EnumerationItem item = new EnumerationItem(component);
        enumerationModel.addElement(item);
        if (evaluator!=null && evaluator.getId().equals(component.getId())) {
          selectedItem = item;
        }
      }

      AbstractComponent referencedComponent = component;
     
      for (AbstractComponent parent : referencedComponent.getReferencingComponents()) {
        // For now, we only find evaluators that have exactly one child (the current component).
        Evaluator e = parent.getCapability(Evaluator.class);
        if (e != null && !e.requiresMultipleInputs()) {
          // Found an evaluator for the component.
          EnumerationItem item = new EnumerationItem(parent);
          enumerationModel.addElement(item);
          if (evaluator!=null && evaluator.getId().equals(parent.getId())) {
            selectedItem = item;
          }
        }
      }
     
      if (selectedItem != null) {
        enumerationModel.setSelectedItem(selectedItem);
      }
    } else {
      addCommonEnumerators(enumerationModel);
    }
   
    return enumerationModel;
  }

  /** Find all common (i.e., intersection of) enumerators for selected cells
   * @param enumerationModel
   */
  private void addCommonEnumerators(DefaultComboBoxModel enumerationModel) {
    if (getSelectedCellCount() > 0) {
      Set<EnumerationItem> commonEnums = new HashSet<EnumerationItem>();
      AbstractComponent commonSelectedEvaluator = null;
      boolean commonEvaluator = true;
      boolean mixedEvaluatorSet = false;
      boolean firstCell = true;
     
      ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
      // Enumeration control is always showing, so add None as option
      EnumerationItem none = new EnumerationItem(null);
      enumerationModel.addElement(none);
      enumerationModel.setSelectedItem(none);
         
      AbstractComponent component = (AbstractComponent) model.getStoredValueAt(table.getSelectedRows()[0], table.getSelectedColumns()[0]);       
      AbstractComponent referencedComponent = component;
      // Add the component itself, if it can be a self-evaluator.
      if (referencedComponent.getCapability(Evaluator.class) != null &&
          !referencedComponent.getCapability(Evaluator.class).requiresMultipleInputs()) {
        EnumerationItem item = new EnumerationItem(referencedComponent);
        enumerationModel.addElement(item);
      }
 
      for (AbstractComponent parent : referencedComponent.getReferencingComponents()) {
        // For now, we only find evaluators that have exactly one child (the current component).
        Evaluator e = parent.getCapability(Evaluator.class);
        if (e != null && !e.requiresMultipleInputs()) {
          // Found an enumeration for the component.
            commonEnums.add(new EnumerationItem(parent));
        }
      }
 
      for (int row : table.getSelectedRows()) {
        for (int column : table.getSelectedColumns()) {
          component = (AbstractComponent) model.getStoredValueAt(row, column);
          if (component == null) {
            mixedEvaluatorSet = true;
            continue;
          }
          referencedComponent = component;
          TableCellSettings cellSettings = tableModel.getCellSettings(tableModel.getKey(referencedComponent));
          AbstractComponent evaluator = cellSettings.getEvaluator();
          if (commonSelectedEvaluator != null)
            if (evaluator != null) {
              if (!evaluator.getId().equals(commonSelectedEvaluator.getId())) {
                mixedEvaluatorSet = true;
              }
            } else {
              mixedEvaluatorSet = true;
          } else {
            if (evaluator != null && !firstCell) {
              mixedEvaluatorSet = true;
            }
          }
          if (!mixedEvaluatorSet) {
            commonSelectedEvaluator = evaluator;
          }
          firstCell = false;
         
          Iterator<EnumerationItem> iterator = commonEnums.iterator();
          while (iterator.hasNext()) {
            EnumerationItem commonEnum = iterator.next();       
            if (!commonEnum.getEvaluator().getComponents().contains(referencedComponent)) {
              iterator.remove();
            }
          }
        }
      }     
      Iterator<EnumerationItem> iterator = commonEnums.iterator();
      while (iterator.hasNext()) {
        EnumerationItem nextItem = iterator.next();
        enumerationModel.addElement(nextItem);
        if (!mixedEvaluatorSet && nextItem.getEvaluator().equals(commonSelectedEvaluator)) {
          enumerationModel.setSelectedItem(nextItem);
        }
      } 
    }
  }
 
  /** Determine whether or not all selected cells have the same evaluator or not
   * @return true if all the selected cells do not have the same evaluator
   */
  @Override
  public boolean selectedCellsHaveMixedEnumerations() {
    AbstractComponent commonSelectedEvaluator = null;
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    boolean firstCell = true;
    for (int row : table.getSelectedRows()) {
      for (int column : table.getSelectedColumns()) { 
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, column);
        if (component == null) {
          return true;
        }
        AbstractComponent referencedComponent = component;
        TableCellSettings cellSettings = tableModel.getCellSettings(tableModel.getKey(referencedComponent));
        AbstractComponent evaluator = cellSettings.getEvaluator();
        if (commonSelectedEvaluator != null)
          if (evaluator != null) {
            if (!evaluator.getId().equals(commonSelectedEvaluator.getId())) {
              return true;
            }
          } else {
            return true;
        } else {
          if (evaluator != null && !firstCell) {
            return true;
          }
        }
        commonSelectedEvaluator = evaluator;
        firstCell = false;
       
      }
    }
    return false;
  }
 
  @Override
  public void setEnumeration(ComboBoxModel comboBoxModel) {
    if (isSingleCellSelection()) {
      TableCellSettings settings = getTableCellSettings(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      settings.setEvaluator(EnumerationItem.class.cast(comboBoxModel.getSelectedItem()).getEvaluator());

      manifestation.saveCellSettings();
    } else {
      for (Integer row : table.getSelectedRows()) {
        for (Integer column : table.getSelectedColumns()) {
          TableCellSettings settings = getTableCellSettings(row, column);
          settings.setEvaluator(EnumerationItem.class.cast(comboBoxModel.getSelectedItem()).getEvaluator());
        }
      }
      manifestation.saveCellSettings();
    }
  }
 
  @Override
  public boolean enumerationIsNone(ComboBoxModel model) {
    if (model.getSelectedItem() == null ||    //Mixed enum state
        (model.getSelectedItem() != null &&   // an enum is selected/set
        EnumerationItem.class.cast(model.getSelectedItem()).getEvaluator() != null)) {
      return false; //nothing is selected
    }
    return (EnumerationItem.class.cast(model.getSelectedItem()).getEvaluator() == null);
  }
 
  @Override
  public boolean dateIsNone(ComboBoxModel model) {
    if (DateFormatItem.None == model.getSelectedItem()) {
      return true;
    }
    return false;
  }

 
  @Override
  public boolean showDecimalPlaces() {
    if (isSelectionContainsEmptyCells()) {
      return false;
    }
    if (table.getSelectedRows().length == 0 && table.getSelectedColumns().length == 0) {
      return false;
    }
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        FeedProvider fp = component.getCapability(FeedProvider.class);
        if (fp == null || fp.getFeedType() == FeedType.STRING) {
          return false;
        }
      }
    }
   
    return true;
  }
 
  @Override
  public Integer getDecimalPlaces() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    Integer decimalPlaces = null;
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        int decimals = settings.getNumberOfDecimals();
        // determine default decimal places
        if (decimals == -1) {
          FeedProvider fp = component.getCapability(FeedProvider.class);
          if (fp != null) {
            decimals = fp.getFeedType() == FeedType.INTEGER ? 0 : TableCellSettings.DEFAULT_DECIMALS;
          }
        }
        if (decimalPlaces != null && decimalPlaces != decimals) {
          return null;
        }
        decimalPlaces = decimals;
      }
    }
   
    return decimalPlaces;
  }
 
  @Override
  public JVMFontFamily getCellFontName() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    if (isSingleCellSelection()) {
      AbstractComponent component = (AbstractComponent) model.getStoredValueAt(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      String id = tableModel.getKey(component);
      TableCellSettings settings = tableModel.getCellSettings(id);
      return settings.getCellFont();
    }
    JVMFontFamily defaultFont = TableFormattingConstants.defaultJVMFontFamily;
    JVMFontFamily commonCellFont = null;
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        JVMFontFamily aCellFont = settings.getCellFont();
        if (aCellFont == null) {
            aCellFont = defaultFont;
        }
        if (commonCellFont != null && !aCellFont.equals(commonCellFont)) {
          return null;
        }
        commonCellFont = aCellFont;
      }
    }
   
    return commonCellFont;
  }
 
  @Override
  public Integer getCellFontSize() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    if (isSingleCellSelection()) {
      AbstractComponent component = (AbstractComponent) model.getStoredValueAt(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      String id = tableModel.getKey(component);
      TableCellSettings settings = tableModel.getCellSettings(id);
      return Integer.valueOf(settings.getFontSize());
    }
    Integer defaultFontSize = Integer.valueOf(TableFormattingConstants.defaultFontSize);
    Integer commonCellFontSize = null;
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        Integer aCellFontSize = settings.getFontSize();
        // determine default decimal places
        if (aCellFontSize == null) {
            aCellFontSize = defaultFontSize;
        }
        if (commonCellFontSize != null && !aCellFontSize.equals(commonCellFontSize)) {
          return null;
        }
        commonCellFontSize = aCellFontSize;
      }
    }
   
    return commonCellFontSize;
  }
 
  @Override
  public Color getCellFontColor() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    if (isSingleCellSelection()) {
      AbstractComponent component = (AbstractComponent) model.getStoredValueAt(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      String id = tableModel.getKey(component);
      TableCellSettings settings = tableModel.getCellSettings(id);
      return settings.getFontColor();
    }
    Color commonCellColor = null;
   
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        Color aCellFontColor = settings.getFontColor();
        if ((commonCellColor != null && !commonCellColor.equals(aCellFontColor))) {
          return null;
        }
        commonCellColor = aCellFontColor;
      }
    }
   
    return commonCellColor;
  }
 
  @Override
  public Color getCellBackgroundColor() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    if (isSingleCellSelection()) {
      AbstractComponent component = (AbstractComponent) model.getStoredValueAt(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      String id = tableModel.getKey(component);
      TableCellSettings settings = tableModel.getCellSettings(id);
      return settings.getBackgroundColor();
    }
    Color commonCellColor = null;
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        Color aCellBackgroundColor = settings.getBackgroundColor();
        if (commonCellColor != null && !commonCellColor.equals(aCellBackgroundColor)) {
          return null;
        }
        commonCellColor = aCellBackgroundColor;
      }
    }
   
    return commonCellColor;
  }
 
  @Override
  public Integer getCellFontStyle() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    if (isSingleCellSelection()) {
      AbstractComponent component = (AbstractComponent) model.getStoredValueAt(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      String id = tableModel.getKey(component);
      TableCellSettings settings = tableModel.getCellSettings(id);
      return Integer.valueOf(settings.getFontStyle());
    }
    Integer defaultFontStyle = TableFormattingConstants.defaultFontStyle;
    Integer commonCellFontStyle = null;
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        Integer aCellFontStyle = settings.getFontStyle();
        // determine default decimal places
        if (aCellFontStyle == null) {
          aCellFontStyle = defaultFontStyle;
        }
        if (commonCellFontStyle != null && !aCellFontStyle.equals(commonCellFontStyle)) {
          return null;
        }
        commonCellFontStyle = aCellFontStyle;
      }
    }
   
    return commonCellFontStyle;
  }
 
  @Override
  public Integer getCellFontTextAttribute() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    if (isSingleCellSelection()) {
      AbstractComponent component = (AbstractComponent) model.getStoredValueAt(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      String id = tableModel.getKey(component);
      TableCellSettings settings = tableModel.getCellSettings(id);
      return Integer.valueOf(settings.getTextAttributeUnderline());
    }
    Integer defaultFontTextAttribute = TableFormattingConstants.UNDERLINE_OFF;
    Integer commonCellFontTextAttribute = null;
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        Integer aCellFontTextAttribute = settings.getTextAttributeUnderline();
        // determine default decimal places
        if (aCellFontTextAttribute == null) {
          aCellFontTextAttribute = defaultFontTextAttribute;
        }
        if (commonCellFontTextAttribute != null && !aCellFontTextAttribute.equals(commonCellFontTextAttribute)) {
          return null;
        }
        commonCellFontTextAttribute = aCellFontTextAttribute;
      }
    }
   
    return commonCellFontTextAttribute;
  }
 
  @Override
  public void setDecimalPlaces(ComboBoxModel comboBoxModel) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        settings.setNumberOfDecimals(Integer.class.cast(comboBoxModel.getSelectedItem()).intValue());
      }
    }
   
    tableModel.updateDecimalsForColumns();
    manifestation.saveCellSettings();
  }
 
  @Override
  public void setCellFont(ComboBoxModel comboBoxModel) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        if (component == null) continue; // component-less cells
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        settings.setCellFont(JVMFontFamily.class.cast(comboBoxModel.getSelectedItem()));
       
      }
    }
    manifestation.saveCellSettings();
  }
 
  @Override
  public void setCellFontColor(Color fontColor) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        if (component == null) continue; // component-less cells
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        settings.setForegroundColor(fontColor);
       
      }
    }
    manifestation.saveCellSettings();
  }
 
  @Override
  public void setCellBackgroundColor(Color backgroundColor) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        if (component == null) continue; // component-less cells
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        settings.setBackgroundColor(backgroundColor);
       
      }
    }
    manifestation.saveCellSettings();
  }
 
  @Override
  public void setCellFontSize(int fontSize) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        if (component == null) continue; // component-less cells
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        settings.setFontSize(fontSize);
      }
    }
    manifestation.saveCellSettings();
  }
 
  @Override
  public void setCellFontStyle(int fontStyle) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        if (component == null) continue; // component-less cells
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        settings.setFontStyle(fontStyle);
      }
    }
    manifestation.saveCellSettings();
  }
 
  @Override
  public void setCellFontTextAttribute(int fontStyle) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        if (component == null) continue; // component-less cells
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        settings.setTextAttributeUnderline(fontStyle);
      }
    }
    manifestation.saveCellSettings();
  }
 
  @Override
  public DateFormatItem getDateFormat() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    DateFormatItem df = null;
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        DateFormatItem cellDateFormat = settings.getDateFormat();
     
        df = cellDateFormat;
      }     
    } 
    return df;
  }

  @Override
  public void setDateFormat(ComboBoxModel comboBoxModel) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        DateFormatItem df = (DateFormatItem)comboBoxModel.getSelectedItem();
        settings.setDateFormat(df);
      }
    }
    manifestation.saveCellSettings();//persistDate
  }


  private TableCellSettings getTableCellSettings(int rowIndex, int columnIndex) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    AbstractComponent component = (AbstractComponent) model.getStoredValueAt(rowIndex, columnIndex);
    String id = tableModel.getKey(component);
    TableCellSettings settings = tableModel.getCellSettings(id);
    return settings;
  }

  private static class EnumerationItem implements Comparable<EnumerationItem> {
   
    private AbstractComponent evaluator;
    private String evalID = "";

    public EnumerationItem(AbstractComponent enumeration) {
      this.evaluator = enumeration;
      if (evaluator != null) {
        this.evalID = evaluator.getComponentId();
      }
    }
   
    @Override
    public String toString() {
      if (evaluator == null) {
        return bundle.getString("ENUMERATION_NONE");
      } else {
        return evaluator.getDisplayName() + " (" + evaluator.getCapability(Evaluator.class).getLanguage() + ")";
      }
    }

    public AbstractComponent getEvaluator() {
      return evaluator;
    }
   
    @Override
    public boolean equals(Object other) {
      boolean result = false;
      if (other instanceof EnumerationItem) {
        EnumerationItem that = (EnumerationItem) other;
        result = (this.evalID.equals(that.evalID) && super.equals(that));
      }
      return result;
    }
   
      @Override public int hashCode() {
          return this.evalID.hashCode();
      }
     
      @Override
    public int compareTo(EnumerationItem other) {
        return evalID.compareTo(other.getEvaluator().getComponentId());
      }
  }
 
  @Override
  public boolean canSetOrientation() {
    return model.getTableType() != TableType.ZERO_DIMENSIONAL;
  }

  @Override
  public boolean canTranspose() {
    return model.getTableType() == TableType.TWO_DIMENSIONAL;
  }

  @Override
  public AbbreviationSettings getRowLabelAbbreviationSettings() {
    if (!isSingleCellSelection()) {
      return null;
    } else {
      ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
      String fullLabel = tableModel.getFullRowName(table.getSelectedRows()[0]);
      LabelAbbreviations currentAbbrevs = tableModel.getRowLabelAbbreviations(table.getSelectedRows()[0]);
      Abbreviations availableAbbrevs = ServiceAccess.getService(AbbreviationService.class).getAbbreviations(fullLabel);
      return new AbbreviationSettings(fullLabel, availableAbbrevs, currentAbbrevs);
    }
  }

  @Override
  public void setRowLabelAbbreviations(AbbreviationSettings settings) {
    if (isSingleCellSelection()) {
      ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
      tableModel.setRowLabelAbbreviations(table.getSelectedRows()[0], settings.getAbbreviations());
      manifestation.saveCellSettings();
    }
   
  }

  @Override
  public AbbreviationSettings getColumnLabelAbbreviationSettings() {
    if (!isSingleCellSelection()) {
      return null;
    } else {
      ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
      String fullLabel = tableModel.getFullColumnName(table.getSelectedColumns()[0]);
      LabelAbbreviations currentAbbrevs = tableModel.getColumnLabelAbbreviations(table.getSelectedColumns()[0]);
      Abbreviations availableAbbrevs = ServiceAccess.getService(AbbreviationService.class).getAbbreviations(fullLabel);
      return new AbbreviationSettings(fullLabel, availableAbbrevs, currentAbbrevs);
    }
  }

  @Override
  public void setColumnLabelAbbreviations(AbbreviationSettings settings) {
    if (isSingleCellSelection()) {
      ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
      tableModel.setColumnLabelAbbreviations(table.getSelectedColumns()[0], settings.getAbbreviations());
      table.updateColumnsHeaderValuesOnly();

      manifestation.saveCellSettings();
    }
  }

  @Override
  public AbbreviationSettings getCellLabelAbbreviationSettings() {
    if (!isSingleCellSelection()) {
      return null;
    } else {
      ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
      AbstractComponent component = (AbstractComponent) model.getStoredValueAt(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      String fullLabel = tableModel.getFullCellName(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      LabelAbbreviations currentAbbrevs = tableModel.getCellLabelAbbreviations(tableModel.getKey(component));
      Abbreviations availableAbbrevs = ServiceAccess.getService(AbbreviationService.class).getAbbreviations(fullLabel);
      return new AbbreviationSettings(fullLabel, availableAbbrevs, currentAbbrevs);
    }
  }

  @Override
  public void setCellLabelAbbreviations(AbbreviationSettings settings) {
    if (isSingleCellSelection()) {
      ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
      AbstractComponent component = (AbstractComponent) model.getStoredValueAt(table.getSelectedRows()[0], table.getSelectedColumns()[0]);
      tableModel.setCellLabelAbbreviations(tableModel.getKey(component), settings.getAbbreviations());
      manifestation.saveCellSettings();
    }
  }

  @Override
  public ContentAlignment getRowHeaderAlignment() {
    ContentAlignment alignment = null;
   
    for (Integer row : table.getSelectedRows()) {
      ContentAlignment rowAlignment = table.getRowHeaderAlignment(row);
      if (alignment!=null && alignment!=rowAlignment) {
        return null;
      }
      alignment = rowAlignment;
    }
   
    return alignment;
  }

  @Override
  public void setRowHeaderAlignment(ContentAlignment newAlignment) {
    for (Integer row : table.getSelectedRows()) {
      table.setRowHeaderAlignment(row, newAlignment);
    }
    manifestation.saveCellSettings();
    table.getRowHeaders().repaint();
  }
 
  @Override
  public BorderState getRowHeaderBorderState() {
    BorderState commonBorderState = null;
    for (Integer row : table.getSelectedRows()) {
      BorderState rowBorderState = table.getRowHeaderBorderState(row);
      if (commonBorderState!=null && commonBorderState!=rowBorderState) {
        return null;
      }
      commonBorderState = rowBorderState;
    }
   
    return commonBorderState;
  }

  @Override
  public void setRowHeaderBorderState(BorderState newBorderState) {
    for (Integer row : table.getSelectedRows()) {
      table.setRowHeaderBorderState(row, newBorderState);
    }
    manifestation.saveCellSettings();
    table.getRowHeaders().repaint();
  }
 
  @Override
  public void setRowHeaderFontName(ComboBoxModel comboBoxModel) {
    for (Integer row : table.getSelectedRows()) {
      table.setRowHeaderFontName(row,
          TableFormattingConstants.JVMFontFamily.class.cast(
              comboBoxModel.getSelectedItem()))
    }
    manifestation.saveCellSettings();
    table.getRowHeaders().repaint();
  }
 
  @Override
  public void setRowHeaderFontStyle(int newStyle) {
    for (Integer row : table.getSelectedRows()) {
      table.setRowHeaderFontStyle(row, Integer.valueOf(newStyle));
    }
    manifestation.saveCellSettings();
    table.getRowHeaders().repaint();
  }
 
  @Override
  public void setRowHeaderTextAttribute(int newTextAttribute) {
    for (Integer row : table.getSelectedRows()) {
      table.setRowHeaderTextAttribute(row, Integer.valueOf(newTextAttribute));
    }
    manifestation.saveCellSettings();
    table.getRowHeaders().repaint();
  }
 
  @Override
  public void setColumnHeaderTextAttribute(int newTextAttribute) {
    for (Integer col : table.getSelectedColumns()) {
      table.setColumnHeaderTextAttribute(col, Integer.valueOf(newTextAttribute));
    }
    manifestation.saveCellSettings();
    table.getTable().getTableHeader().repaint();
  }
 
  @Override
  public void setColumnHeaderFontName(ComboBoxModel comboBoxModel) {
    for (Integer column : table.getSelectedColumns()) {
      table.setColumnHeaderFontName(column, JVMFontFamily.class.cast(comboBoxModel.getSelectedItem()));
    }
    manifestation.saveCellSettings();
    table.getTable().getTableHeader().repaint();
  }
 
  @Override
  public void setColumnHeaderFontStyle(int fontStyle) {
    for (Integer column : table.getSelectedColumns()) {
      table.setColumnHeaderFontStyle(column, Integer.valueOf(fontStyle));
    }
    manifestation.saveCellSettings();
    table.getTable().getTableHeader().repaint();
  }

  @Override
  public ContentAlignment getColumnHeaderAlignment() {
    ContentAlignment alignment = null;
   
    for (Integer col : table.getSelectedColumns()) {
      ContentAlignment columnAlignment = table.getColumnHeaderAlignment(col);
      if (alignment!=null && alignment!=columnAlignment) {
        return null;
      }
      alignment = columnAlignment;
    }
   
    return alignment;
  }

  @Override
  public void setColumnHeaderAlignment(ContentAlignment newAlignment) {
    for (Integer col : table.getSelectedColumns()) {
      table.setColumnHeaderAlignment(col, newAlignment);
    }
    manifestation.saveCellSettings();
    table.getTable().getTableHeader().repaint();
  }
 
  @Override
  public BorderState getColumnHeaderBorderState() {
    BorderState commonBorderState = null;
    for (Integer col : table.getSelectedColumns()) {
      BorderState colBorderState = table.getColumnHeaderBorderState(col);
      if (commonBorderState!=null && commonBorderState!=colBorderState) {
        return null;
      }
      commonBorderState = colBorderState;
    }
   
    return commonBorderState;
  }

  @Override
  public void setColumnHeaderBorderState(BorderState newBorderState) {
    for (Integer col : table.getSelectedColumns()) {
      table.setColumnHeaderBorderState(col, newBorderState);
    }
    manifestation.saveCellSettings();
    table.getTable().getTableHeader().repaint();
  }

  @Override
  public ContentAlignment getCellAlignment() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
   
    ContentAlignment alignment = null;
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        TableCellSettings settings = tableModel.getCellSettings(tableModel.getKey(component));
        ContentAlignment cellAlignment = settings.getAlignment();
       
        if (alignment!=null && cellAlignment!=alignment) {
          return null;
        }
       
        alignment = cellAlignment;
      }
    }
   
    return alignment;
  }

  @Override
  public void setCellAlignment(ContentAlignment newAlignment) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        if (component == null) continue; // component-less cells
        TableCellSettings settings = tableModel.getCellSettings(tableModel.getKey(component));
        settings.setAlignment(newAlignment);
      }
    }
   
    manifestation.saveCellSettings();
  }

  @Override
  public int getTableRowCount() {
    return table.getTable().getRowCount();
  }

  @Override
  public int getTableColumnCount() {
    return table.getTable().getColumnCount();
  }

  @Override
  public BorderState getBorderState() {
    if (isSelectionContainsEmptyCells()) {
      return new BorderState(BorderEdge.NONE.value());
    }
   
    BorderState fourEdgeControlState =  new BorderState(BorderEdge.NONE.value());
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);
   
    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {

        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        fourEdgeControlState = settings.getCellBorderState();
        assert fourEdgeControlState != null;
      }     
    } 
    return fourEdgeControlState;
  }
 
  @Override
  public void mergeCellFontStyle(ButtonModel boldModel, ButtonModel italicModel) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        if (component == null) continue; // component-less cells
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        if (boldModel.isSelected()) {
          if (italicModel.isSelected()) {
            settings.setFontStyle(Font.BOLD+Font.ITALIC);
          } else {
            settings.setFontStyle(Font.BOLD);
          }
        } else {
          if (italicModel.isSelected()) {
            settings.setFontStyle(Font.ITALIC);
          } else {
            settings.setFontStyle(Font.PLAIN);
          }
        }
        manifestation.saveCellSettings();
      }
    }
       
  }
 
  @Override
  public void mergeBorderState(BorderState controllerState) {
    ComponentTableModel tableModel = ComponentTableModel.class.cast(model);

    for (Integer row : table.getSelectedRows()) {
      for (Integer col : table.getSelectedColumns()) {
        BorderState stateToUpdate = null;
        AbstractComponent component = (AbstractComponent) model.getStoredValueAt(row, col);
        if (component == null) continue; // component-less cells
        String id = tableModel.getKey(component);
        TableCellSettings settings = tableModel.getCellSettings(id);
        stateToUpdate = settings.getCellBorderState();

        // for each selected cell, either clear it or set it according to the controller edge state and multiple selection criteria. 
        if (!controllerState.hasWestBorder()) {
          stateToUpdate.removeBorderState(BorderEdge.WEST.value());
        } else {
          if (controllerState.hasWestBorder() && shouldToggleWest(row, col)) {
            stateToUpdate.addBorderState(BorderEdge.WEST.value());
          }
        }
        if (!controllerState.hasNorthBorder()) {
          stateToUpdate.removeBorderState(BorderEdge.NORTH.value());
        } else {
          if (controllerState.hasNorthBorder() && shouldToggleNorth(row, col)) {
            stateToUpdate.addBorderState(BorderEdge.NORTH.value());
          }
        }
        if (!controllerState.hasEastBorder()) {
          stateToUpdate.removeBorderState(BorderEdge.EAST.value());
        } else {
          if (controllerState.hasEastBorder() && shouldToggleEast(row, col)) {
            stateToUpdate.addBorderState(BorderEdge.EAST.value());
          }
        }
        if (!controllerState.hasSouthBorder()) {
          stateToUpdate.removeBorderState(BorderEdge.SOUTH.value());
        } else {
          if (controllerState.hasSouthBorder() && shouldToggleSouth(row, col)) {
            stateToUpdate.addBorderState(BorderEdge.SOUTH.value());
          }
        }
        settings.setCellBorderState(stateToUpdate);
      }
    }
    manifestation.saveCellSettings();   
  }
 
  @Override
  public void mergeRowHeaderBorderState(BorderState controllerState) {
 
    for (Integer row : table.getSelectedRows()) {
      BorderState stateToUpdate = table.getRowHeaderBorderState(row);

      // for each selected cell, either clear it or set it according to the controller edge state and multiple selection criteria. 
      if (!controllerState.hasWestBorder()) {
        stateToUpdate.removeBorderState(BorderEdge.WEST.value());
      } else {
        stateToUpdate.addBorderState(BorderEdge.WEST.value());
      }
      if (!controllerState.hasNorthBorder()) {
        stateToUpdate.removeBorderState(BorderEdge.NORTH.value());
      } else {
        stateToUpdate.addBorderState(BorderEdge.NORTH.value());
      }
      if (!controllerState.hasEastBorder()) {
        stateToUpdate.removeBorderState(BorderEdge.EAST.value());
      } else {
        stateToUpdate.addBorderState(BorderEdge.EAST.value());
      }
      if (!controllerState.hasSouthBorder()) {
        stateToUpdate.removeBorderState(BorderEdge.SOUTH.value());
      } else {
        stateToUpdate.addBorderState(BorderEdge.SOUTH.value());
      }
      table.setRowHeaderBorderState(row,stateToUpdate);
    }
    manifestation.saveCellSettings()
    table.getRowHeaders().repaint();
  }
 
  @Override
  public void mergeColumnHeaderBorderState(BorderState controllerState) {
 
    for (Integer col : table.getSelectedColumns()) {
      BorderState stateToUpdate = table.getColumnHeaderBorderState(col);

      // for each selected cell, either clear it or set it according to the controller edge state and multiple selection criteria. 
      if (!controllerState.hasWestBorder()) {
        stateToUpdate.removeBorderState(BorderEdge.WEST.value());
      } else {
        stateToUpdate.addBorderState(BorderEdge.WEST.value());
      }
      if (!controllerState.hasNorthBorder()) {
        stateToUpdate.removeBorderState(BorderEdge.NORTH.value());
      } else {
        stateToUpdate.addBorderState(BorderEdge.NORTH.value());
      }
      if (!controllerState.hasEastBorder()) {
        stateToUpdate.removeBorderState(BorderEdge.EAST.value());
      } else {
        stateToUpdate.addBorderState(BorderEdge.EAST.value());
      }
      if (!controllerState.hasSouthBorder()) {
        stateToUpdate.removeBorderState(BorderEdge.SOUTH.value());
      } else {
        stateToUpdate.addBorderState(BorderEdge.SOUTH.value());
      }
      table.setColumnHeaderBorderState(col,stateToUpdate);
    }
    manifestation.saveCellSettings()
    table.getTable().getTableHeader().repaint();
  }
 
  private boolean shouldToggleEast(int row, int col) {
    int [] selectedCols = table.getSelectedColumns();
    int maximumSelectedColumnInThisRow = -1;
    for (int r : table.getSelectedRows()) {
      if (r != row) continue;
      maximumSelectedColumnInThisRow = maximum(selectedCols);
    }
    assert maximumSelectedColumnInThisRow >= 0;
    return col == maximumSelectedColumnInThisRow;
  }
 
  private boolean shouldToggleWest(int row, int col) {
    int [] selectedCols = table.getSelectedColumns();
    int minimumSelectedColumnInThisRow = -1;
    for (int r : table.getSelectedRows()) {
      if (r != row) continue;
        minimumSelectedColumnInThisRow = minimum(selectedCols);
    }
    assert minimumSelectedColumnInThisRow >= 0;
    return col == minimumSelectedColumnInThisRow;
  }

  private boolean shouldToggleNorth(int row, int col) {
    int [] selectedRows = table.getSelectedRows();
    int minimumSelectedRowInThisColumn = -1;
    for (int c : table.getSelectedColumns()) {
      if (c != col) continue;
      minimumSelectedRowInThisColumn = minimum(selectedRows);
    }
    assert minimumSelectedRowInThisColumn >= 0;
    return row == minimumSelectedRowInThisColumn;
  }
 
  private boolean shouldToggleSouth(int row, int col) {
    int [] selectedRows = table.getSelectedRows();
    int maximumSelectedRowInThisColumn = -1;
    for (int c : table.getSelectedColumns()) {
      if (c != col) continue;
      maximumSelectedRowInThisColumn = maximum(selectedRows);
    }
    assert maximumSelectedRowInThisColumn >= 0;
    return row == maximumSelectedRowInThisColumn;
  }

  /** Minimum
   * @param array
   * @return the min in this array
   */
  private int minimum(int[] selectedItem) {
    assert selectedItem.length >= 1;
    int min = selectedItem[0];
    for (int i=1; i < selectedItem.length; i++) {
      if (selectedItem[i] < min) {
        min = selectedItem[i];
      }
    }
    return min;
  }
 
  /** Maximum.
   * @param array
   * @return the max in this array
   */
  private int maximum(int[] selectedItem) {
    assert selectedItem.length >= 1;
    int max = selectedItem[0];
    for (int i=1; i< selectedItem.length; i++) {
      if (selectedItem[i] > max) {
        max = selectedItem[i];
      }
    }
    return max;
  }

  @Override
  public void setRowHeaderFontSize(int fontSize) {
    for (Integer row : table.getSelectedRows()) {
      table.setRowHeaderFontSize(row, fontSize);
     
    }
    manifestation.saveCellSettings();
    table.getRowHeaders().repaint();
  }

  @Override
  public void setColumnHeaderFontSize(int fontSize) {
    for (Integer col : table.getSelectedColumns()) {
      table.setColumnHeaderFontSize(col, fontSize);
    }
    manifestation.saveCellSettings();
    table.getTable().getTableHeader().repaint();
  }

  @Override
  public void setRowHeaderFontColor(Color fontColor) {
    for (Integer row : table.getSelectedRows()) {
      table.setRowHeaderFontColor(row, fontColor)
    }
    manifestation.saveCellSettings();
    table.getRowHeaders().repaint();
  }
 
  @Override
  public void setRowHeaderBorderColor(Color borderColor) {
    for (Integer row : table.getSelectedRows()) {
      table.setRowHeaderBorderColor(row, borderColor)
    }
    manifestation.saveCellSettings();
    table.getRowHeaders().repaint();
  }

  @Override
  public void setColumnHeaderFontColor(Color fontColor) {
    for (Integer col : table.getSelectedColumns()) {
      table.setColumnHeaderFontColor(col, fontColor)
    }
    manifestation.saveCellSettings();
    table.getTable().getTableHeader().repaint();
  }
 
  @Override
  public void setColumnHeaderBorderColor(Color borderColor) {
    for (Integer col : table.getSelectedColumns()) {
      table.setColumnHeaderBorderColor(col, borderColor)
    }
    manifestation.saveCellSettings();
    table.getTable().getTableHeader().repaint();
  }
 
  @Override
  public void setRowHeaderBackgroundColor(Color fontColor) {
    for (Integer row : table.getSelectedRows()) {
      table.setRowHeaderBackgroundColor(row, fontColor)
    }
    manifestation.saveCellSettings();
    table.getRowHeaders().repaint();
  }

  @Override
  public void setColumnHeaderBackgroundColor(Color fontColor) {
    for (Integer col : table.getSelectedColumns()) {
      table.setColumnHeaderBackgroundColor(col, fontColor)
    }
    manifestation.saveCellSettings();
    table.getRowHeaders().repaint();
  }

  @Override
  public Integer getRowFontStyle() {
    Integer commonStyle = null;
   
    for (Integer row : table.getSelectedRows()) {
      Integer aStyle = table.getRowHeaderFontStyle(row);
      if (commonStyle!=null && commonStyle!=aStyle) {
        return null;
      }
      commonStyle = aStyle;
    }
   
    return commonStyle;
  }
 
  @Override
  public Integer getRowHeaderTextAttribute() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getRowHeaderTextAttribute(table.getSelectedRows()[0]);
    }
    Integer commonTextAttribute = null;
   
    for (Integer row : table.getSelectedRows()) {
      Integer aTextAttribute = table.getRowHeaderTextAttribute(row);
      if (commonTextAttribute!=null && commonTextAttribute!=aTextAttribute) {
        return null;
      }
      commonTextAttribute = aTextAttribute;
    }
   
    return commonTextAttribute;
  }
 
  @Override
  public Integer getColumnHeaderTextAttribute() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getColumnHeaderTextAttribute(table.getSelectedColumns()[0]);
    }
    Integer commonTextAttribute = null;
   
    for (Integer col : table.getSelectedColumns()) {
      Integer aTextAttribute = table.getColumnHeaderTextAttribute(col);
      if (commonTextAttribute!=null && commonTextAttribute!=aTextAttribute) {
        return null;
      }
      commonTextAttribute = aTextAttribute;
    }
   
    return commonTextAttribute;
  }
 
  @Override
  public JVMFontFamily getRowHeaderFontName() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getRowHeaderFontName(table.getSelectedRows()[0]);
    }
    JVMFontFamily commonFont = null;
   
    for (Integer row : table.getSelectedRows()) {
      JVMFontFamily aFont = table.getRowHeaderFontName(row);
      if (commonFont !=null && !commonFont.equals(aFont)) {
        return null;
      }
      commonFont = aFont;
    }
   
    return commonFont;
  }

  @Override
  public Integer getColumnHeaderFontStyle() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getColumnHeaderFontStyle(table.getSelectedColumns()[0]);
    }
    Integer commonStyle = null;
   
    for (Integer col : table.getSelectedColumns()) {
      Integer aStyle = table.getColumnHeaderFontStyle(col);
      if (commonStyle!=null && commonStyle!=aStyle) {
        return null;
      }
      commonStyle = aStyle;
    }
   
    return commonStyle;
  }

  @Override
  public Integer getRowHeaderFontSize() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getRowHeaderFontSize(table.getSelectedRows()[0]);
    }
    Integer commonSize = null;
   
    for (Integer row : table.getSelectedRows()) {
      Integer aSize = table.getRowHeaderFontSize(row);
      if (commonSize!=null && commonSize!=aSize) {
        return null;
      }
      commonSize = aSize;
    }
   
    return commonSize;
  }

  @Override
  public Integer getColumnHeaderFontSize() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getColumnHeaderFontSize(table.getSelectedColumns()[0]);
    }
    Integer commonSize = null;
   
    for (Integer col : table.getSelectedColumns()) {
      Integer aSize = table.getColumnHeaderFontSize(col);
      if (commonSize!=null && commonSize!=aSize) {
        return null;
      }
      commonSize = aSize;
    }
   
    return commonSize;
  }

  @Override
  public Color getRowHeaderFontColor() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getRowHeaderFontColor(table.getSelectedRows()[0]);
    }
    Color commonColor = null;
   
    for (Integer row : table.getSelectedRows()) {
      Color aColor = table.getRowHeaderFontColor(row);
      if (commonColor!=null && commonColor!=aColor) {
        return null;
      }
      commonColor = aColor;
    }
   
    return commonColor;
  }
 
  @Override
  public Color getRowHeaderBorderColor() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getRowHeaderBorderColor(table.getSelectedRows()[0]);
    }
    Color commonColor = null;
   
    for (Integer row : table.getSelectedRows()) {
      Color aColor = table.getRowHeaderBorderColor(row);
      if (commonColor!=null && commonColor!=aColor) {
        return null;
      }
      commonColor = aColor;
    }
   
    return commonColor;
  }

  @Override
  public Color getColumnHeaderFontColor() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getColumnHeaderFontColor(table.getSelectedColumns()[0]);
    }
    Color commonColor = null;
   
    for (Integer col : table.getSelectedColumns()) {
      Color aColor = table.getColumnHeaderFontColor(col);
      if (commonColor!=null && commonColor!=aColor) {
        return null;
      }
      commonColor = aColor;
    }
   
    return commonColor;
  }
 
  @Override
  public Color getColumnHeaderBorderColor() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getColumnHeaderBorderColor(table.getSelectedColumns()[0]);
    }
    Color commonColor = null;
   
    for (Integer col : table.getSelectedColumns()) {
      Color aColor = table.getColumnHeaderBorderColor(col);
      if (commonColor!=null && commonColor!=aColor) {
        return null;
      }
      commonColor = aColor;
    }
   
    return commonColor;
  }
 
  @Override
  public Color getRowHeaderBackgroundColor() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getRowHeaderBackgroundColor(table.getSelectedRows()[0]);
    }
    Color commonColor = null;
   
    for (Integer row : table.getSelectedRows()) {
      Color aColor = table.getRowHeaderBackgroundColor(row);
      if (commonColor!=null && commonColor!=aColor) {
        return null;
      }
      commonColor = aColor;
    }
   
    return commonColor;
  }

  @Override
  public Color getColumnHeaderBackgroundColor() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getColumnHeaderBackgroundColor(table.getSelectedColumns()[0]);
    }
    Color commonColor = null;
   
    for (Integer col : table.getSelectedColumns()) {
      Color aColor = table.getColumnHeaderBackgroundColor(col);
      if (commonColor!=null && commonColor!=aColor) {
        return null;
      }
      commonColor = aColor;
    }
   
    return commonColor;
  }

  @Override
  public JVMFontFamily getColumnHeaderFontName() {
    if (isSelectionContainsEmptyCells()) {
      return null;
    }
    if (isSingleCellSelection()) {
      return table.getColumnHeaderFontName(table.getSelectedColumns()[0]);
    }
    JVMFontFamily commonFont = null;
   
    for (Integer col : table.getSelectedColumns()) {
      JVMFontFamily aFont = table.getColumnHeaderFontName(col);
      if (commonFont !=null && !commonFont.equals(aFont)) {
        return null;
      }
      commonFont = aFont;
    }
   
    return commonFont;
  }

 
}
TOP

Related Classes of gov.nasa.arc.mct.table.view.TableControlPanelController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.