gt:         if (text == null || text.equals("null"))
context: /*
   * Copyright 2006-2016 The MZmine 3 Development Team
   * 
   * This file is part of MZmine 3.
   * 
   * MZmine 3 is free software; you can redistribute it and/or modify it under the terms of the GNU
   * General Public License as published by the Free Software Foundation; either version 2 of the
   * License, or (at your option) any later version.
   * 
   * MZmine 3 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
   * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   * General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with MZmine 3; if not,
   * write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
   * USA
   */
  
  package io.github.mzmine.util;
  
  import java.util.List;
  import java.util.Map;
  
  import io.github.msdk.datamodel.chromatograms.Chromatogram;
  import io.github.msdk.datamodel.featuretables.FeatureTableRow;
  import io.github.msdk.datamodel.ionannotations.IonAnnotation;
  import io.github.msdk.datamodel.rawdata.ChromatographyInfo;
  import javafx.collections.ObservableList;
  import javafx.event.EventHandler;
  import javafx.scene.control.TreeTableColumn;
  import javafx.scene.control.TreeTablePosition;
  import javafx.scene.control.TreeTableView;
  import javafx.scene.input.Clipboard;
  import javafx.scene.input.ClipboardContent;
  import javafx.scene.input.KeyCode;
  import javafx.scene.input.KeyCodeCombination;
  import javafx.scene.input.KeyCombination;
  import javafx.scene.input.KeyEvent;
  
  public class TableUtils {
  
    /**
     * Add the keyboard handler.
     * 
     * @param table
     */
    public static void addCopyHandler(TreeTableView<?> table,
        Map<Integer, TreeTableColumn<FeatureTableRow, Object>> columnMap) {
      table.setOnKeyPressed(new KeyEventHandler(columnMap));
    }
  
    /**
     * Copy event handler.
     */
    public static class KeyEventHandler implements EventHandler<KeyEvent> {
      KeyCodeCombination keyCodeCompination =
          new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_ANY);
  
      Map<Integer, TreeTableColumn<FeatureTableRow, Object>> columnMap;
  
      KeyEventHandler(Map<Integer, TreeTableColumn<FeatureTableRow, Object>> columnMap) {
        this.columnMap = columnMap;
      }
  
      public void handle(final KeyEvent keyEvent) {
        if (keyCodeCompination.match(keyEvent)) {
          if (keyEvent.getSource() instanceof TreeTableView) {
            // Copy to clipboard
            copySelectionToClipboard((TreeTableView<?>) keyEvent.getSource());
  
            // Event is handled, consume it
            keyEvent.consume();
          }
        }
      }
  
      /**
       * Get table selection and copy it to the clipboard.
       * 
       * @param <S>
       * 
       * @param table
       */
      public void copySelectionToClipboard(TreeTableView table) {
        StringBuilder clipboardString = new StringBuilder();
  
        ObservableList<TreeTablePosition<?, ?>> positionList =
            table.getSelectionModel().getSelectedCells();
        int prevRow = -1;
  
        // Add sample headers
        int hiddenColumns = 0;
        for (TreeTablePosition<?, ?> position : positionList) {
          int rowNr = position.getRow();
          int columnNr = position.getColumn() + hiddenColumns;
  
          // Account for hidden columns
          while (!columnMap.get(columnNr).isVisible()) {
            hiddenColumns++;
            columnNr++;
          }
  
          // Get the column from the map to avoid trouble with sample
          // headers
          TreeTableColumn<?, ?> column = columnMap.get(columnNr);
          Object object = (Object) column.getCellData(rowNr);
  
          // Skip chromatogram column
          if (object instanceof Chromatogram)
            continue;
  
          if (prevRow == rowNr || prevRow == -1) {
            String columnTitle;
            if (column.getParentColumn() != null) {
              columnTitle = column.getParentColumn().getText();
            } else {
              columnTitle = "";
            }
  
            clipboardString.append(columnTitle);
            clipboardString.append('\t');
          } else {
            break;
          }
          prevRow = rowNr;
        }
        prevRow = -1;
        clipboardString.append('\n');
  
        // Add column headers
        hiddenColumns = 0;
        for (TreeTablePosition<?, ?> position : positionList) {
          int rowNr = position.getRow();
          int columnNr = position.getColumn() + hiddenColumns;
  
          // Account for hidden columns
          while (!columnMap.get(columnNr).isVisible()) {
            hiddenColumns++;
            columnNr++;
          }
  
          // Get the column from the map to avoid trouble with sample
          // headers
          TreeTableColumn<?, ?> column = columnMap.get(columnNr);
          Object object = (Object) column.getCellData(rowNr);
  
          // Skip chromatogram column
          if (object instanceof Chromatogram)
            continue;
  
          // Add all columns
          if (prevRow == rowNr || prevRow == -1) {
            String columnTitle = column.getText();
            clipboardString.append(columnTitle);
            clipboardString.append('\t');
          } else {
            break;
          }
          prevRow = rowNr;
        }
        prevRow = -1;
        clipboardString.append('\n');
  
        // Add data
        hiddenColumns = 0;
        for (TreeTablePosition<?, ?> position : positionList) {
  
          int rowNr = position.getRow();
          if (prevRow != rowNr) {
            hiddenColumns = 0;
          }
          int columnNr = position.getColumn() + hiddenColumns;
  
          // Account for hidden columns
          while (!columnMap.get(columnNr).isVisible()) {
            hiddenColumns++;
            columnNr++;
          }
  
          // Get the column from the map to avoid trouble with sample
          // headers
          TreeTableColumn<?, ?> column = columnMap.get(columnNr);
  
          String text = null;
          Object object = (Object) column.getCellData(rowNr);
          if (object instanceof ChromatographyInfo) {
            // Format to RT1, RT2
            ChromatographyInfo chromatographyInfo = (ChromatographyInfo) object;
            Float rt1 = chromatographyInfo.getRetentionTime();
            Float rt2 = chromatographyInfo.getSecondaryRetentionTime();
            if (rt1 != null) {
              text = rt1.toString();
            }
            if (text != null && rt2 != null) {
              text = text + ", ";
            }
            if (rt2 != null) {
              text = text + rt2.toString();
            }
          } else if (object instanceof List) {
            text = "";
            List<IonAnnotation> ionAnnotations = (List<IonAnnotation>) object;
            for (IonAnnotation ionAnnotation : ionAnnotations) {
              if (text != "")
                text += ", ";
              if (ionAnnotation.getDescription() != null)
                text += ionAnnotation.getDescription();
              else
                text += ionAnnotation.getAnnotationId();
            }
          } else if (object instanceof Chromatogram) {
            continue;
          } else {
            if (object != null)
              text = object.toString();
          }
  
          // Are we looping over a row or column?
          if (prevRow == rowNr) {
            clipboardString.append('\t');
          } else if (prevRow != -1) {
            clipboardString.append('\n');
          }
  
  