magnet::GL::Buffer<GLfloat>& getBuffer()
    {
      if (singleValueMode())
	M_throw() << "Cannot get the attribute ";

      Gtk::TreeModel::iterator iter = _comboBox.get_active();
      std::tr1::shared_ptr<Attribute> ptr = (*iter)[_modelColumns.m_ptr];
 
      if ((!_componentSelect.get_visible())
	  || (_componentSelect.get_active_row_number() == 0))
	return ptr->getBuffer();

      //Check if the data actually needs updating
      if ((_lastAttribute != ptr.get())
	  || (_lastAttributeDataCount != ptr->getUpdateCount())
	  || (_lastComponentSelected != _componentSelect.get_active_row_number())
	  || _filteredData.empty())
	{
	  _lastAttribute = ptr.get();
	  _lastAttributeDataCount = ptr->getUpdateCount();
	  _lastComponentSelected = _componentSelect.get_active_row_number();
	  
	  std::vector<GLfloat> scalardata;
	  generateFilteredData(scalardata, ptr, _lastComponentSelected);
	  _filteredData = scalardata;
	}
      
      return _filteredData;
    }
    virtual void bindAttribute(size_t attrnum, size_t divisor = 1)
    {
      Gtk::TreeModel::iterator iter = _comboBox.get_active();

      if (singleValueMode())
	setConstantAttribute(attrnum);
      else
	{
	  std::shared_ptr<Attribute> ptr = (*iter)[_modelColumns.m_ptr];
	  //We have an attribute, check the mode the ComboBox is in,
	  //and determine if we have to do something with the data!

	  //Detect if it is in simple pass-through mode
	  if ((_componentSelect.get_visible())
	      && (_componentSelect.get_active_row_number() == 0))
	    {
	      ptr->bindAttribute(attrnum, false, divisor);
	      return;
	    }
	    
	  //Check if the data actually needs updating
	  if ((_lastAttribute != ptr.get())
	      || (_lastAttributeDataCount != ptr->getUpdateCount())
	      || (_lastComponentSelected != _componentSelect.get_active_row_number())
	      || (_lastColorMap != _colorMapSelector.getMode())
	      || _filteredData.empty())
	    {
	      std::vector<GLfloat> scalardata;
	      generateFilteredData(scalardata, ptr, _lastComponentSelected);
	      
	      if (_autoScaling.get_active() && !scalardata.empty())
		{
		  GLfloat min(scalardata[0]), max(scalardata[0]);
		  
		  for (std::vector<GLfloat>::const_iterator iPtr = scalardata.begin();
		       iPtr != scalardata.end();
		       ++iPtr)
		    {
		      min = std::min(min, *iPtr);
		      max = std::max(max, *iPtr);
		    }
		  _colorMapSelector.setRange(min, max);
		}

	      //Now convert to HSV or whatever
	      _filteredData.init(4 * scalardata.size(), 4);
	      GLfloat* data_ptr = _filteredData.map();
	      
	      for (size_t i(0); i < scalardata.size(); ++i)
		_colorMapSelector.map(data_ptr + 4 * i, scalardata[i]);

	      
	      _filteredData.unmap();
	      
	      _lastAttribute = ptr.get();
	      _lastAttributeDataCount = ptr->getUpdateCount();
	      _lastComponentSelected = _componentSelect.get_active_row_number();
	      _lastColorMap = _colorMapSelector.getMode();
	    }

	  _filteredData.attachToAttribute(attrnum, divisor);
	}
    }