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

  Program:   ParaView
  Module:    vtkXYChartRepresentation.h

  Copyright (c) Kitware, Inc.
  All rights reserved.
  See Copyright.txt or http://www.paraview.org/HTML/Copyright.html 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.

=========================================================================*/
// .NAME vtkXYChartRepresentation
// .SECTION Description
// vtkXYChartRepresentation is representation that is used to add vtkPlot
// subclasses to a vtkChartXY instance e.g. adding vtkPlotBar to create a bar
// chart or vtkPlotLine to create a line chart. For every selected series (or
// column in a vtkTable), this class adds a new vtkPlot to the vtkChartXY.
// vtkXYChartRepresentation provides a union of APIs for changing the appearance
// of vtkPlot instances. Developers should only expose the applicable API in the
// ServerManager XML.
//
// To select which type of vtkPlot instances this class will use, you must set
// the ChartType. Refer to vtkChartXY::AddPlot() for details on what the type
// must be.

#ifndef vtkXYChartRepresentation_h
#define vtkXYChartRepresentation_h

#include "vtkChartRepresentation.h"

class vtkChartXY;
class vtkScalarsToColors;

class VTKPVCLIENTSERVERCORERENDERING_EXPORT vtkXYChartRepresentation : public vtkChartRepresentation
{
public:
  static vtkXYChartRepresentation* New();
  vtkTypeMacro(vtkXYChartRepresentation, vtkChartRepresentation);
  void PrintSelf(ostream& os, vtkIndent indent);

  // Description:
  // Set visibility of the representation. Overridden to ensure that internally
  // added vtkPlot instances are updated when hiding the representation.
  virtual void SetVisibility(bool visible);

  // Description:
  // Get/Set the chart type, defaults to line chart. This must be set before
  // this representation is updated.
  // Valid values are vtkChart::LINE, vtkChart::POINTS, vtkChart::BAR, etc.
  // Default is vtkChart::LINE.
  vtkSetMacro(ChartType, int);
  vtkGetMacro(ChartType, int);

  void SetChartTypeToLine();
  void SetChartTypeToPoints();
  void SetChartTypeToBar();
  void SetChartTypeToStacked();
  void SetChartTypeToBag();
  void SetChartTypeToFunctionalBag();
  void SetChartTypeToArea();

  // Description:
  // Returns the vtkChartXY instance from the view to which this representation
  // is added. Thus this will return a non-null value only when this
  // representation is added to a view.
  vtkChartXY* GetChart();

  // Description:
  // Set the series to use as the X-axis.
  vtkSetStringMacro(XAxisSeriesName);
  vtkGetStringMacro(XAxisSeriesName);

  // Description:
  // Set whether the index should be used for the x axis. When true, XSeriesName
  // is ignored.
  vtkSetMacro(UseIndexForXAxis, bool);
  vtkGetMacro(UseIndexForXAxis, bool);

  // Description:
  // Set/Clear the properties for Y series/columns.
  void SetSeriesVisibility(const char* seriesname, bool visible);
  void SetLineThickness(const char* name, int value);
  void SetLineStyle(const char* name, int value);
  void SetColor(const char* name, double r, double g, double b);
  void SetAxisCorner(const char* name, int corner);
  void SetMarkerStyle(const char* name, int style);
  void SetLabel(const char* name, const char* label);
  void SetUseColorMapping(const char* name, bool useColorMapping);
  void SetLookupTable(const char* name, vtkScalarsToColors* lut);
  const char* GetLabel(const char* name) const;

  void ClearSeriesVisibilities();
  void ClearLineThicknesses();
  void ClearLineStyles();
  void ClearColors();
  void ClearAxisCorners();
  void ClearMarkerStyles();
  void ClearLabels();

  vtkSetVector3Macro(SelectionColor, double);
  vtkGetVector3Macro(SelectionColor, double);

  // Description:
  // Get/Set the series label prefix.
  vtkSetStringMacro(SeriesLabelPrefix);
  vtkGetStringMacro(SeriesLabelPrefix);

  // Description:
  // Called by vtkPVContextView::Export() to export the representation's data to
  // a CSV file. Return false on failure which will call the exporting process
  // to abort and raise an error. Default implementation simply returns false.
  virtual bool Export(vtkCSVExporter* exporter);

protected:
  vtkXYChartRepresentation();
  ~vtkXYChartRepresentation();

  // Description:
  // Overridden to remove all plots from the view.
  virtual bool RemoveFromView(vtkView* view);

  virtual int RequestData(vtkInformation *,
    vtkInformationVector **, vtkInformationVector *);

  virtual void PrepareForRendering();

  class vtkInternals;
  friend class vtkInternals;
  vtkInternals* Internals;

private:
  vtkXYChartRepresentation(const vtkXYChartRepresentation&) VTK_DELETE_FUNCTION;
  void operator=(const vtkXYChartRepresentation&) VTK_DELETE_FUNCTION;

  int ChartType;
  char* XAxisSeriesName;
  bool UseIndexForXAxis;
  bool PlotDataHasChanged;
  double SelectionColor[3];
  char* SeriesLabelPrefix;

};

#endif
