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

  Program:   Visualization Toolkit
  Module:    vtkTreeAreaView.h

  -------------------------------------------------------------------------
  Copyright 2008 Sandia Corporation.
  Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
  the U.S. Government retains certain rights in this software.
  -------------------------------------------------------------------------

  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   vtkTreeAreaView
 * @brief   Accepts a graph and a hierarchy - currently
 * a tree - and provides a hierarchy-aware display.  Currently, this means
 * displaying the hierarchy using a tree ring layout, then rendering the graph
 * vertices as leaves of the tree with curved graph edges between leaves.
 *
 *
 * Takes a graph and a hierarchy (currently a tree) and lays out the graph
 * vertices based on their categorization within the hierarchy.
 *
 * .SEE ALSO
 * vtkGraphLayoutView
 *
 * @par Thanks:
 * Thanks to Jason Shepherd for implementing this class
 */

#ifndef vtkTreeAreaView_h
#define vtkTreeAreaView_h

#include "vtkRenderView.h"
#include "vtkViewsInfovisModule.h" // For export macro

class vtkAreaLayoutStrategy;
class vtkGraph;
class vtkLabeledDataMapper;
class vtkPolyDataAlgorithm;
class vtkRenderedTreeAreaRepresentation;
class vtkTree;

class VTKVIEWSINFOVIS_EXPORT vtkTreeAreaView : public vtkRenderView
{
public:
  static vtkTreeAreaView* New();
  vtkTypeMacro(vtkTreeAreaView, vtkRenderView);
  void PrintSelf(ostream& os, vtkIndent indent) override;

  ///@{
  /**
   * Set the tree and graph representations to the appropriate input ports.
   */
  vtkDataRepresentation* SetTreeFromInputConnection(vtkAlgorithmOutput* conn);
  vtkDataRepresentation* SetTreeFromInput(vtkTree* input);
  vtkDataRepresentation* SetGraphFromInputConnection(vtkAlgorithmOutput* conn);
  vtkDataRepresentation* SetGraphFromInput(vtkGraph* input);
  ///@}

  ///@{
  /**
   * The array to use for area labeling.  Default is "label".
   */
  void SetAreaLabelArrayName(const char* name);
  const char* GetAreaLabelArrayName();
  ///@}

  ///@{
  /**
   * The array to use for area sizes. Default is "size".
   */
  void SetAreaSizeArrayName(const char* name);
  const char* GetAreaSizeArrayName();
  ///@}

  ///@{
  /**
   * The array to use for area labeling priority.
   * Default is "GraphVertexDegree".
   */
  void SetLabelPriorityArrayName(const char* name);
  const char* GetLabelPriorityArrayName();
  ///@}

  ///@{
  /**
   * The array to use for edge labeling.  Default is "label".
   */
  void SetEdgeLabelArrayName(const char* name);
  const char* GetEdgeLabelArrayName();
  ///@}

  ///@{
  /**
   * The name of the array whose value appears when the mouse hovers
   * over a rectangle in the treemap.
   * This must be a string array.
   */
  void SetAreaHoverArrayName(const char* name);
  const char* GetAreaHoverArrayName();
  ///@}

  ///@{
  /**
   * Whether to show area labels.  Default is off.
   */
  void SetAreaLabelVisibility(bool vis);
  bool GetAreaLabelVisibility();
  vtkBooleanMacro(AreaLabelVisibility, bool);
  ///@}

  ///@{
  /**
   * Whether to show edge labels.  Default is off.
   */
  void SetEdgeLabelVisibility(bool vis);
  bool GetEdgeLabelVisibility();
  vtkBooleanMacro(EdgeLabelVisibility, bool);
  ///@}

  ///@{
  /**
   * The array to use for coloring vertices.  Default is "color".
   */
  void SetAreaColorArrayName(const char* name);
  const char* GetAreaColorArrayName();
  ///@}

  ///@{
  /**
   * Whether to color vertices.  Default is off.
   */
  void SetColorAreas(bool vis);
  bool GetColorAreas();
  vtkBooleanMacro(ColorAreas, bool);
  ///@}

  ///@{
  /**
   * The array to use for coloring edges.  Default is "color".
   */
  void SetEdgeColorArrayName(const char* name);
  const char* GetEdgeColorArrayName();
  ///@}

  /**
   * Set the color to be the spline fraction
   */
  void SetEdgeColorToSplineFraction();

  ///@{
  /**
   * Set the region shrink percentage between 0.0 and 1.0.
   */
  void SetShrinkPercentage(double value);
  double GetShrinkPercentage();
  ///@}

  ///@{
  /**
   * Whether to color edges.  Default is off.
   */
  void SetColorEdges(bool vis);
  bool GetColorEdges();
  vtkBooleanMacro(ColorEdges, bool);
  ///@}

  ///@{
  /**
   * Set the bundling strength.
   */
  void SetBundlingStrength(double strength);
  double GetBundlingStrength();
  ///@}

  ///@{
  /**
   * The size of the font used for area labeling
   */
  virtual void SetAreaLabelFontSize(const int size);
  virtual int GetAreaLabelFontSize();
  ///@}

  ///@{
  /**
   * The size of the font used for edge labeling
   */
  virtual void SetEdgeLabelFontSize(const int size);
  virtual int GetEdgeLabelFontSize();
  ///@}

  ///@{
  /**
   * The layout strategy for producing spatial regions for the tree.
   */
  virtual void SetLayoutStrategy(vtkAreaLayoutStrategy* strategy);
  virtual vtkAreaLayoutStrategy* GetLayoutStrategy();
  ///@}

  ///@{
  /**
   * Whether the area represents radial or rectangular coordinates.
   */
  virtual void SetUseRectangularCoordinates(bool rect);
  virtual bool GetUseRectangularCoordinates();
  vtkBooleanMacro(UseRectangularCoordinates, bool);
  ///@}

  ///@{
  /**
   * Visibility of scalar bar actor for edges.
   */
  virtual void SetEdgeScalarBarVisibility(bool b);
  virtual bool GetEdgeScalarBarVisibility();
  ///@}

protected:
  vtkTreeAreaView();
  ~vtkTreeAreaView() override;

  ///@{
  /**
   * The filter for converting areas to polydata. This may e.g. be
   * vtkTreeMapToPolyData or vtkTreeRingToPolyData.
   * The filter must take a vtkTree as input and produce vtkPolyData.
   */
  virtual void SetAreaToPolyData(vtkPolyDataAlgorithm* areaToPoly);
  virtual vtkPolyDataAlgorithm* GetAreaToPolyData();
  ///@}

  ///@{
  /**
   * The mapper for rendering labels on areas. This may e.g. be
   * vtkDynamic2DLabelMapper or vtkTreeMapLabelMapper.
   */
  virtual void SetAreaLabelMapper(vtkLabeledDataMapper* mapper);
  virtual vtkLabeledDataMapper* GetAreaLabelMapper();
  ///@}

  ///@{
  /**
   * Overrides behavior in vtkView to create a vtkRenderedGraphRepresentation
   * by default.
   */
  vtkDataRepresentation* CreateDefaultRepresentation(vtkAlgorithmOutput* conn) override;
  virtual vtkRenderedTreeAreaRepresentation* GetTreeAreaRepresentation();
  ///@}

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

#endif
