/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkAssignAttribute.h

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
/**
 * @class   vtkAssignAttribute
 * @brief   Labels/marks a field as an attribute
 *
 * vtkAssignAttribute is used to label/mark a field (vtkDataArray) as an attribute.
 * A field name or an attribute to labeled can be specified. For example:
 * @verbatim
 * aa->Assign("foo", vtkDataSetAttributes::SCALARS,
 *            vtkAssignAttribute::POINT_DATA);
 * @endverbatim
 * tells vtkAssignAttribute to make the array in the point data called
 * "foo" the active scalars. On the other hand,
 * @verbatim
 * aa->Assign(vtkDataSetAttributes::VECTORS, vtkDataSetAttributes::SCALARS,
 *            vtkAssignAttribute::POINT_DATA);
 * @endverbatim
 * tells vtkAssignAttribute to make the active vectors also the active
 * scalars.
 *
 * @warning
 * When using Java, Python or Visual Basic bindings, the array name
 * can not be one of the  AttributeTypes when calling Assign() which takes
 * strings as arguments. The wrapped command will
 * always assume the string corresponds to an attribute type when
 * the argument is one of the AttributeTypes. In this situation,
 * use the Assign() which takes enums.
 *
 * @sa
 * vtkFieldData vtkDataSet vtkDataObjectToDataSetFilter
 * vtkDataSetAttributes vtkDataArray vtkRearrangeFields
 * vtkSplitField vtkMergeFields
 */

#ifndef vtkAssignAttribute_h
#define vtkAssignAttribute_h

#include "vtkFiltersCoreModule.h" // For export macro
#include "vtkPassInputTypeAlgorithm.h"

#include "vtkDataSetAttributes.h" // Needed for NUM_ATTRIBUTES

class vtkFieldData;

class VTKFILTERSCORE_EXPORT vtkAssignAttribute : public vtkPassInputTypeAlgorithm
{
public:
  vtkTypeMacro(vtkAssignAttribute, vtkPassInputTypeAlgorithm);
  void PrintSelf(ostream& os, vtkIndent indent) override;

  /**
   * Create a new vtkAssignAttribute.
   */
  static vtkAssignAttribute* New();

  /**
   * Label an attribute as another attribute.
   */
  void Assign(int inputAttributeType, int attributeType, int attributeLoc);

  /**
   * Label an array as an attribute.
   */
  void Assign(const char* fieldName, int attributeType, int attributeLoc);

  /**
   * Helper method used by other language bindings. Allows the caller to
   * specify arguments as strings instead of enums.
   */
  void Assign(const char* name, const char* attributeType, const char* attributeLoc);

  // Always keep NUM_ATTRIBUTE_LOCS as the last entry
  enum AttributeLocation
  {
    POINT_DATA = 0,
    CELL_DATA = 1,
    VERTEX_DATA = 2,
    EDGE_DATA = 3,
    NUM_ATTRIBUTE_LOCS
  };

protected:
  enum FieldType
  {
    NAME,
    ATTRIBUTE
  };

  vtkAssignAttribute();
  ~vtkAssignAttribute() override;

  int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
  int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
  int FillInputPortInformation(int, vtkInformation*) override;

  char* FieldName;
  int FieldTypeAssignment;
  int AttributeType;
  int InputAttributeType;
  int AttributeLocationAssignment;

  static char AttributeLocationNames[vtkAssignAttribute::NUM_ATTRIBUTE_LOCS][12];
  static char AttributeNames[vtkDataSetAttributes::NUM_ATTRIBUTES][20];

private:
  vtkAssignAttribute(const vtkAssignAttribute&) = delete;
  void operator=(const vtkAssignAttribute&) = delete;
};

#endif
