Пример #1
0
//
// handle_object_created
//
int CBML_MultiInput_Handler::
handle_object_created (GAME::Mga::Object_in obj)
{
  if (this->is_importing_)
    return 0;

  const std::string no_op_message = "A MultiInputAction has already been created for all facet operations.";

  GAME::Mga::Connection connection = GAME::Mga::Connection::_narrow (obj);
  GAME::Mga::Reference facet = GAME::Mga::Reference::_narrow (connection->src ());
  GAME::Mga::FCO input_action = connection->dst ();
  GAME::Mga::Model object = GAME::Mga::Model::_narrow (facet->refers_to ());

  // Collect the operations on the Object
  std::vector <GAME::Mga::Object> operations;
  this->get_operations (object, operations);

  // Get all the other MultiInputActions connected to the facet
  std::vector <GAME::Mga::Object> existing_actions;
  this->get_actions (facet, existing_actions);

  // Remove existing actions from the operations
  std::vector <GAME::Mga::Object> targets;
  this->narrow_targets (operations, existing_actions, targets);

  // The name to use for the MultiInputAction
  std::string name;

  if (targets.size () == 0)
  {
    ::AfxMessageBox (no_op_message.c_str (), MB_ICONINFORMATION | MB_OK);
    return 0;
  }
  else if (targets.size () == 1)
    name = targets.front ()->name ();
  else
  {
    AFX_MANAGE_STATE (::AfxGetStaticModuleState ());

    using GAME::Dialogs::Selection_List_Dialog_T;
    Selection_List_Dialog_T <GAME::Mga::Object> dlg (0, ::AfxGetMainWnd ());

    dlg.title ("Target Operation");
    dlg.directions ("Select the target Operation for the MultiInputAction");
    dlg.insert (targets);

    if (IDOK != dlg.DoModal ())
      return 0;

    name = dlg.selection ()->name ();
  }

  if (!name.empty())
    input_action->name (name);

  return 0;
}
Пример #2
0
//
// list delete
//
bool Lesser_Expr::list_delete (GAME::Mga::Model & obj, 
                               size_t count, 
                               GAME::Mga::Meta::FCO & metatype, 
                               GAME::Mga::Meta::Role & metarole)
{
    std::vector <GAME::Mga::FCO> elements;
  GAME::Mga::FCO select;
  obj->children (elements);

   std::vector <GAME::Mga::FCO> qual_fcos;

  std::vector <GAME::Mga::FCO>::iterator
    it = elements.begin (), it_end = elements.end ();

  for (; it != it_end; ++it)
  {
    if ((*it)->meta ()->name () == metatype->name ())
      qual_fcos.push_back ((*it));
  }

  for (size_t i = 0; i < count; ++i)
  {
    AFX_MANAGE_STATE (::AfxGetStaticModuleState ());
    // Create the dialog and pass in the data
    using GAME::Dialogs::Selection_List_Dialog_T;
    Selection_List_Dialog_T <GAME::Mga::FCO> dlg (0, ::AfxGetMainWnd (), 0);
    dlg.title ("Please select the Model/Atom for deletion");
    dlg.directions ("Target evaluator");
    dlg.insert (qual_fcos);

    if (IDOK != dlg.DoModal ())
      return false;

    select = dlg.selection ();

    if (!select.is_nil ())
    {
      select->destroy ();
    }
  }
  return true;
}
Пример #3
0
//
// evaluate
//
bool Lesser_Expr::evaluate (Ocl_Context & res)
{
  // flag to decide the case
  size_t flag = 0;
  bool ret = false;

	if (res.model_constraint)
	{

		// Checking if the local variables are mutable/non-mutable
		if (this->lhs_->is_mutable () && !this->rhs_->is_mutable ())
			flag = 1;
		else if (!this->lhs_->is_mutable () && this->rhs_->is_mutable ())
			flag = 2;
		else if (this->lhs_->is_mutable () && this->rhs_->is_mutable ())
			flag = 3;

		switch (flag) {

			case 1:
				{
					if (this->lhs_->evaluate (res)->is_greater (this->rhs_->evaluate (res)))
					 {
						 // Counting the number of objects to be deleted
						 double count;
						 this->rhs_->evaluate (res)->get_diff (this->lhs_->evaluate (res), count);

						 // Calling the delete command
						 ret = true;
					 }
					break;
				}
			case 2:
				{
					if (this->lhs_->evaluate (res)->is_lesser (this->rhs_->evaluate (res)))
					{
						// Counting the number of objects to be deleted
						double count;
						this->lhs_->evaluate (res)->get_diff (this->rhs_->evaluate (res), count);

						// Calling the delete command
						ret = true;
					}
					break;
				}
			default:
				{
					//throw an exception
					ret = false;
				}
		}
	}
  else if (res.model_attributes)
  {
    // Assumption for now is that the attribute_expression is lhs and constant_value_expr
    // is rhs

    // Caller
    std::string obj = "";
    // Attribute name
    std::string name = "";


    // Performing the automated attribute value setting only if
    // the constraint contains attribute i.e. either lhs or rhs has attribute
    Attribute_Expr * left = dynamic_cast <Attribute_Expr *> (this->lhs_);
    Attribute_Expr * right = dynamic_cast <Attribute_Expr *> (this->rhs_);

    if (left != 0 || right != 0 )
    {
      if (left != 0)
      {
        name = left->attribute_name ();
        obj = left->caller ();
      }
      else
      {
        name = right->attribute_name ();
        obj = right->caller ();
      }

      GAME::Mga::FCO fco;

      // Checking the invoking object for the attribute
      if (obj == "self")
        fco = GAME::Mga::FCO::_narrow (res.self);
      else
      {
        // The object value associated with the local variable is taken from map
        // and is used for attribute value calculation
        Object_Value * iv = dynamic_cast <Object_Value *> (res.locals [obj]);
        fco = GAME::Mga::FCO::_narrow (iv->value ());
      }

      if (!this->lhs_->evaluate (res)->is_lesser (this->rhs_->evaluate (res)))
      {
        Expr_Command *cmd = new Attribute_Add_Command (fco, name, new Int_Value (0));

        //Pushing adding operation to the action list
        res.actions.push_back (cmd);
      }
      ret = true;
    }
    else
      ret = this->lhs_->evaluate (res)->is_lesser (this->rhs_->evaluate (res));
    
  }
  else if (res.checker)      // This section is used by Containment Check Handler only
  {
    // Checking if the local variables are mutable/non-mutable
		if (this->lhs_->is_mutable () && !this->rhs_->is_mutable ())
			flag = 1;
		else if (!this->lhs_->is_mutable () && this->rhs_->is_mutable ())
			flag = 2;
		else if (this->lhs_->is_mutable () && this->rhs_->is_mutable ())
			flag = 3;

    // Collecting the value and data of left hand side
    Value * v1 = this->lhs_->evaluate (res);
    Int_Value * iv = dynamic_cast <Int_Value * > (v1);
    int left_value = iv->value ();
    GAME::Mga::Meta::FCO left_metatype;
    GAME::Mga::Meta::Role left_metarole;
    if (flag == 1 || flag == 3)
    {
      left_metatype = res.target_metaroles[0]->kind ();
      left_metarole = res.target_metaroles[0];
    }

    if (flag == 3)
    {
      // Clearing the metaroles
      res.target_metaroles.clear ();
    }

    // Collecting the value and data of right hand side
    Value * v2 = this->rhs_->evaluate (res);
    Int_Value * iv2 = dynamic_cast <Int_Value * > (v2);
    int right_value = iv2->value ();
    GAME::Mga::Meta::FCO right_metatype;
    GAME::Mga::Meta::Role right_metarole;
    if (flag == 3 || flag == 2)
    {
      right_metatype = res.target_metaroles[0]->kind ();
      right_metarole = res.target_metaroles[0];
    }
    std::vector <std::string> options;
    double count;

    if (iv != 0 && iv2 != 0)
    {
      switch (flag) {
        case 1:
          {
            if (left_value >= right_value)
            {
             // This option is when the left side is greater than the constant right side 
             // Counting the number of objects to be deleted
						  double count = left_value - right_value;						
              ret = list_delete (res.model_object, count, left_metatype, left_metarole);
            }
            break;
          }
        case 2:
          {
            if (right_value <= left_value)
            {
              // This option is when the right side is greater than the constant left side 
              // Counting the number of objects to be deleted
						  double count = left_value - right_value;
              ret = list_add (res.model_object, count, right_metatype, right_metarole);
            }
            break;
          }
        case 3:
          {
            // This option is used when both sides are variable
            if (this->lhs_->evaluate (res)->is_equal (this->rhs_->evaluate (res)))
              ret = true;
            else if (left_value > right_value)
            {
              // Options for the modeler if the right side is greater than left side
              count = left_value - right_value;
              options.push_back ("Add " + right_metatype->name ());
              options.push_back ("Delete " + left_metatype->name ());
            }
            if (options.size () > 0)
            {
              std::string select;
              AFX_MANAGE_STATE (::AfxGetStaticModuleState ());

              // Create the dialog and pass in the data
              using GAME::Dialogs::Selection_List_Dialog_T;
              Selection_List_Dialog_T <std::string> dlg (0, ::AfxGetMainWnd (), 2);
              dlg.title ("Object Addition/Deletion Resolver");
              dlg.directions ("Select the desired action");
              dlg.string_insert (options);
              if (IDOK != dlg.DoModal ())
                return false;

              select = dlg.string_selection ();

              if (!select.empty ())
              {
                if (select == ("Add " + right_metatype->name ()))
                  ret = list_add (res.model_object, count, right_metatype, right_metarole);
                else if (select == ("Delete " + left_metatype->name ()))
                  ret = list_delete (res.model_object, count, left_metatype, left_metarole);
              }
            }
            break;
          }
        default:
          {
            ret = false;
          }
        }
      }
    
  }
	else
		ret = this->lhs_->evaluate (res)->is_lesser (this->rhs_->evaluate (res));

	return ret;
}