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

  Program:   Visualization Toolkit
  Module:    vtkQtTreeRingLabelMapper.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.

=========================================================================*/
/*-------------------------------------------------------------------------
  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.
-------------------------------------------------------------------------*/
/**
 * @class   vtkQtTreeRingLabelMapper
 * @brief   draw text labels on a tree map
 *
 *
 * vtkQtTreeRingLabelMapper is a mapper that renders text on a tree map.
 * A tree map is a vtkTree with an associated 4-tuple array
 * used for storing the boundary rectangle for each vertex in the tree.
 * The user must specify the array name used for storing the rectangles.
 *
 * The mapper iterates through the tree and attempts and renders a label
 * inside the vertex's rectangle as long as the following conditions hold:
 * 1. The vertex level is within the range of levels specified for labeling.
 * 2. The label can fully fit inside its box.
 * 3. The label does not overlap an ancestor's label.
 *
 * @sa
 * vtkLabeledDataMapper
 *
 * @par Thanks:
 * Thanks to Jason Shepherd from
 * Sandia National Laboratories for help in developing this class.
 */

#ifndef vtkQtTreeRingLabelMapper_h
#define vtkQtTreeRingLabelMapper_h

#include "vtkLabeledDataMapper.h"
#include "vtkRenderingQtModule.h" // For export macro

class QImage;

class vtkQImageToImageSource;
class vtkCoordinate;
class vtkDoubleArray;
class vtkPlaneSource;
class vtkPolyDataMapper2D;
class vtkRenderer;
class vtkStringArray;
class vtkTexture;
class vtkTextureMapToPlane;
class vtkTree;
class vtkUnicodeStringArray;

class VTKRENDERINGQT_EXPORT vtkQtTreeRingLabelMapper : public vtkLabeledDataMapper
{
public:
  static vtkQtTreeRingLabelMapper* New();
  vtkTypeMacro(vtkQtTreeRingLabelMapper, vtkLabeledDataMapper);
  void PrintSelf(ostream& os, vtkIndent indent) override;

  //@{
  /**
   * Draw the text to the screen at each input point.
   */
  void RenderOpaqueGeometry(vtkViewport* viewport, vtkActor2D* actor) override;
  void RenderOverlay(vtkViewport* viewport, vtkActor2D* actor) override;
  //@}

  /**
   * The input to this filter.
   */
  virtual vtkTree* GetInputTree();

  /**
   * The name of the 4-tuple array used for
   */
  virtual void SetSectorsArrayName(const char* name);

  //@{
  /**
   * Set/Get the text property. Note that multiple type text properties
   * (set with a second integer parameter) are not currently supported,
   * but are provided to avoid compiler warnings.
   */
  void SetLabelTextProperty(vtkTextProperty* p) override;
  vtkTextProperty* GetLabelTextProperty() override { return this->LabelTextProperty; }
  void SetLabelTextProperty(vtkTextProperty* p, int type) override
  {
    this->Superclass::SetLabelTextProperty(p, type);
  }
  vtkTextProperty* GetLabelTextProperty(int type) override
  {
    return this->Superclass::GetLabelTextProperty(type);
  }
  //@}

  //@{
  /**
   * Set/Get the name of the text rotation array.
   */
  vtkSetStringMacro(TextRotationArrayName);
  vtkGetStringMacro(TextRotationArrayName);
  //@}

  /**
   * Return the object's MTime. This is overridden to include
   * the timestamp of its internal class.
   */
  vtkMTimeType GetMTime() override;

  void SetRenderer(vtkRenderer* ren)
  {
    if (this->Renderer != ren)
    {
      this->Renderer = ren;
      this->Modified();
    }
  }
  vtkRenderer* GetRenderer() { return this->Renderer; }

protected:
  vtkQtTreeRingLabelMapper();
  ~vtkQtTreeRingLabelMapper() override;
  void LabelTree(vtkTree* tree, vtkDataArray* sectorInfo, vtkDataArray* numericData,
    vtkStringArray* stringData, vtkUnicodeStringArray* uStringData, int activeComp, int numComps,
    vtkViewport* viewport);
  void GetVertexLabel(vtkIdType vertex, vtkDataArray* numericData, vtkStringArray* stringData,
    vtkUnicodeStringArray* uStringData, int activeComp, int numComps, char* string,
    size_t stringSize);

  // Returns true if the center of the sector is in the window
  // along with the pixel dimensions (width, height)  of the sector
  bool PointInWindow(double* sinfo, double* newDim, double* textPosDC, vtkViewport* viewport);

  vtkViewport* CurrentViewPort;
  vtkCoordinate* VCoord;
  vtkQImageToImageSource* QtImageSource;
  vtkPlaneSource* PlaneSource;
  vtkRenderer* Renderer;
  vtkTextProperty* LabelTextProperty;
  vtkTexture* LabelTexture;
  vtkTextureMapToPlane* TextureMapToPlane;
  char* TextRotationArrayName;
  vtkPolyDataMapper2D* polyDataMapper;
  QImage* QtImage;
  int WindowSize[2];

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

#endif
