void New_region_from_property_dialog::populate_categories(){
  if( !isCategorical_ ) return;

  QString grid_name = selected_grid();
  QString prop_name = selected_property();
  if(grid_name.isEmpty() || prop_name.isEmpty()) return;
  SmartPtr< Named_interface > ni =
	Root::instance()->interface( gridModels_manager + "/" + grid_name.toStdString() );
  Geostat_grid* grid = dynamic_cast<Geostat_grid*>(ni.raw_ptr());
  Grid_categorical_property *prop = grid->categorical_property(prop_name.toStdString());

  if(!prop) return;

  const CategoricalPropertyDefinition* cat_def = prop->get_category_definition();
  const CategoricalPropertyDefinitionName* cat_def_name =
	  dynamic_cast<const CategoricalPropertyDefinitionName*>(cat_def);

  if( cat_def_name ) {
    cat_selector_->show_categories( cat_def_name->name().c_str() );
  }
  else {
    cat_selector_->show_default_categories( prop->get_number_of_category() );
  }

}
void New_region_from_property_dialog::set_filter_type(){
  QString grid_name = selected_grid();
  QString prop_name = selected_property();
  if(grid_name.isEmpty() || prop_name.isEmpty()) return;
  SmartPtr< Named_interface > ni =
	Root::instance()->interface( gridModels_manager + "/" + grid_name.toStdString() );
  Geostat_grid* grid = dynamic_cast<Geostat_grid*>(ni.raw_ptr());
  Grid_categorical_property *prop = grid->categorical_property(prop_name.toStdString());
  if(prop) {
	  min_max_box_->setHidden(true);
	  category_box_->setVisible(true);
	  isCategorical_ = true;
  } else {
	  category_box_->setHidden(true);
	  min_max_box_->setVisible(true);
	  isCategorical_ = false;
  }

}
/* Convert_continuous_to_categorical_property grid_name::prop1::[prop2::]
* will copy convert the property from continuous to categorical
*/
bool Convert_continuous_to_categorical_property::
init( std::string& parameters, GsTL_project* proj,
      Error_messages_handler* errors ) {

  std::vector< std::string > params =
    String_Op::decompose_string( parameters, Actions::separator,
                      				   Actions::unique );

  if( params.size() <2 ) {
    errors->report( "some parameters are missing, Needs at least two parameters (grid + property)" );
    return false;
  }

  SmartPtr<Named_interface> grid_ni =
    Root::instance()->interface( gridModels_manager + "/" + params[0] );
  Geostat_grid* grid = dynamic_cast<Geostat_grid*>( grid_ni.raw_ptr() );
  if( !grid ) {
    std::ostringstream message;
    message << "No grid called \"" << params[0] << "\" was found";
    errors->report( message.str() );
    return false;
  }

  for(int i=1; i<params.size(); ++i) {
    Grid_categorical_property* cprop = grid->categorical_property(params[i]);
    if(cprop) continue;
    Grid_continuous_property* prop = grid->property(params[i]);
    if(prop == 0) continue;
    std::set<int> cat_codes;
    std::string prop_name = prop->name()+" - categorical";
    cprop = grid->add_categorical_property(prop_name);
    while(!cprop) {
      prop_name.append("_0");
      cprop = grid->add_categorical_property(prop_name);
    }
    for(int nodeid=0; nodeid < prop->size(); ++nodeid) {
      if( prop->is_informed(nodeid)) {
        int code = static_cast<int>(prop->get_value(nodeid));
        cprop->set_value(code,nodeid);
        cat_codes.insert(code);
      }
    }
    // Check is sequential coding
    bool is_sequential_coding = false;
    std::set<int>::iterator it = cat_codes.begin();
    if( *it == 0  ) {
      std::advance(it, cat_codes.size()-1);
      if( *it == cat_codes.size()-1 ) {
        is_sequential_coding = true;
      }
      
    }

    if( !is_sequential_coding  ) {  // Need to build a categorical definition
      CategoricalPropertyDefinitionName* cat_def = 0;
      std::string catdef_name = grid->name()+"-"+prop->name();
      while(!cat_def) {
        SmartPtr<Named_interface> ni = Root::instance()->new_interface( "categoricaldefinition://"+catdef_name,categoricalDefinition_manager +"/"+catdef_name );
        cat_def = dynamic_cast<CategoricalPropertyDefinitionName*>(ni.raw_ptr());
          if(!cat_def) catdef_name.append("_0");
      }

      std::set<int>::iterator it_cat_codes = cat_codes.begin();
      for(; it_cat_codes != cat_codes.end(); ++it_cat_codes) {
        cat_def->add_category(*it_cat_codes, QString("Code %1").arg(*it_cat_codes).toStdString() );
      }
      cprop->set_category_definition( cat_def );
    }

  }

  proj->update( params[0] );
  return true;
}
/* Convert_continuous_to_categorical_property grid_name::prop1::[prop2::]
* will copy convert the property from continuous to categorical
*/
bool Convert_categorical_property_to_sequential_coding::
init( std::string& parameters, GsTL_project* proj,
      Error_messages_handler* errors ) {

  std::vector< std::string > params =
    String_Op::decompose_string( parameters, Actions::separator,
                      				   Actions::unique );

  if( params.size() != 2 ) {
    errors->report( "Some parameters are missing, needs two paramters (grid and categorical property)" );
    return false;
  }

  SmartPtr<Named_interface> grid_ni =
    Root::instance()->interface( gridModels_manager + "/" + params[0] );
  Geostat_grid* grid = dynamic_cast<Geostat_grid*>( grid_ni.raw_ptr() );
  if( !grid ) {
    std::ostringstream message;
    message << "No grid called \"" << params[0] << "\" was found";
    errors->report( message.str() );
    return false;
  }

  Grid_categorical_property* cprop = grid->categorical_property(params[1]);
  if(cprop->get_category_definition()->is_sequential_coding()) return true;

  const CategoricalPropertyDefinitionName* cdef = dynamic_cast<const CategoricalPropertyDefinitionName*>(cprop->get_category_definition());
  if(!cdef) {
    errors->report( "Error with the categorical definition" );
    return false;
  }
  std::vector<int> current_codes = cdef->category_codes();

  int ncat = cdef->number_of_category();
  std::string sequential_catdef_name = cdef->name() + " - Sequential";

// Check if the categorical definition exist
  SmartPtr<Named_interface> ni = Root::instance()->interface( categoricalDefinition_manager+"/"+sequential_catdef_name );

  CategoricalPropertyDefinitionName* cat_def = 
            dynamic_cast<CategoricalPropertyDefinitionName*>(ni.raw_ptr());

  while(!cat_def) {
    sequential_catdef_name.append(" "+cprop->name());
    SmartPtr<Named_interface> ni = Root::instance()->new_interface( "categoricaldefinition://"+sequential_catdef_name,categoricalDefinition_manager +"/"+sequential_catdef_name );
    cat_def = dynamic_cast<CategoricalPropertyDefinitionName*>(ni.raw_ptr());

    if(cat_def) {
 

      for(int i=0; i< ncat; ++i) {
        QString new_cat_name = QString("%1 (code:%2)").arg(cdef->get_category_name(current_codes[i]).c_str()).arg(current_codes[i]);
        cat_def->add_category(i, new_cat_name.toStdString() );
      }
    }
  }

  //Get the new value
  std::map<int,int> map_codes;
  for(int i=0; i< current_codes.size(); ++i ) {
    map_codes[current_codes[i]] = i;
  }

  std::string prop_name = cprop->name()+" sequential";
  Grid_categorical_property* seq_cprop = grid->add_categorical_property(cprop->name()+" sequential",cdef->name());
  while(!seq_cprop) {
    prop_name.append("_0");
    seq_cprop = grid->add_categorical_property(prop_name);
  }

  
  for(int i=0; i < cprop->size(); ++i) {
    if( !cprop->is_informed(i) ) continue;

    int code = cprop->get_value(i);
    std::map<int,int>::const_iterator it = map_codes.find(code);
    if( it == map_codes.end()  ) continue;
    seq_cprop->set_value(static_cast<Grid_continuous_property::property_type>(it->second),i);
  }
  seq_cprop->set_category_definition(cat_def);
  proj->update( params[0] );
  return true;
}