text: /*=========================================================================
  
    Program:   ParaView
    Module:    vtkSMChartRepresentationProxy.cxx
  
    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.
  
  =========================================================================*/
  #include "vtkSMChartRepresentationProxy.h"
  
  #include "vtkChartRepresentation.h"
  #include "vtkClientServerStream.h"
  #include "vtkObjectFactory.h"
  #include "vtkPVExtractSelection.h"
  #include "vtkPVXMLElement.h"
  #include "vtkSMChartSeriesListDomain.h"
  #include "vtkSMDomain.h"
  #include "vtkSMProperty.h"
  #include "vtkSMPropertyHelper.h"
  
  vtkStandardNewMacro(vtkSMChartRepresentationProxy);
  //----------------------------------------------------------------------------
  vtkSMChartRepresentationProxy::vtkSMChartRepresentationProxy()
  {
  }
  
  //----------------------------------------------------------------------------
  vtkSMChartRepresentationProxy::~vtkSMChartRepresentationProxy()
  {
  }
  
  //----------------------------------------------------------------------------
  vtkChartRepresentation* vtkSMChartRepresentationProxy::GetRepresentation()
  {
    this->CreateVTKObjects();
    return vtkChartRepresentation::SafeDownCast(this->GetClientSideObject());
  }
  
  //----------------------------------------------------------------------------
  void vtkSMChartRepresentationProxy::PrintSelf(ostream& os, vtkIndent indent)
  {
    this->Superclass::PrintSelf(os, indent);
  }
  
  //----------------------------------------------------------------------------
  int vtkSMChartRepresentationProxy::ReadXMLAttributes(
    vtkSMSessionProxyManager* pm, vtkPVXMLElement* element)
  {
    if (!this->Superclass::ReadXMLAttributes(pm, element))
    {
      return 0;
    }
  
    vtkSMProxy* optionsProxy = this->GetSubProxy("PlotOptions");
    if (optionsProxy)
    {
      const char* names[] = { "Input", "CompositeDataSetIndex", "AttributeType", NULL };
      for (int cc = 0; names[cc] != NULL; cc++)
      {
        vtkSMProperty* src = this->GetProperty(names[cc]);
        vtkSMProperty* dest = optionsProxy->GetProperty(names[cc]);
        if (src && dest)
        {
          this->LinkProperty(src, dest);
        }
      }
    }
    return 1;
  }
  
  //----------------------------------------------------------------------------
  void vtkSMChartRepresentationProxy::SetPropertyModifiedFlag(const char* name, int flag)
  {
    if (name && strcmp(name, "Input") == 0)
    {
      vtkSMPropertyHelper helper(this, name);
      for (unsigned int cc = 0; cc < helper.GetNumberOfElements(); cc++)
      {
        vtkSMSourceProxy* input = vtkSMSourceProxy::SafeDownCast(helper.GetAsProxy(cc));
        if (input)
        {
          input->CreateSelectionProxies();
          vtkSMSourceProxy* esProxy = input->GetSelectionOutput(helper.GetOutputPort(cc));
          if (!esProxy)
          {
            vtkErrorMacro("Input proxy does not support selection extraction.");
          }
          else
          {
            vtkSMProxy* selectionReprProxy = this->GetSubProxy("SelectionRepresentation");
            if (selectionReprProxy)
            {
              // We use these internal properties since we need to add consumer dependecy
              // on this proxy so that MarkModified() is called correctly.
  
              // Based on the name of the Property, we either pass the id-based
              // selection generated by vtkPVExtractSelection or the original
              // input selection to the selection representation.
              vtkSMPropertyHelper(selectionReprProxy, "SelectionInput", /*quiet*/ true)
                .Set(esProxy, vtkPVExtractSelection::OUTPUT_PORT_SELECTION_IDS);
  
              vtkSMPropertyHelper(selectionReprProxy, "OriginalSelectionInput", /*quiet*/ true)
                .Set(esProxy, vtkPVExtractSelection::OUTPUT_PORT_SELECTION_ORIGINAL);
              selectionReprProxy->UpdateVTKObjects();
            }
          }
        }
      }
    }
    this->Superclass::SetPropertyModifiedFlag(name, flag);
  }
  