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

  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 "vtkRenderingQtModule.h" // For export macro
#include "vtkLabeledDataMapper.h"

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
