/***************************************************************************
 *  copyright (C) 2005                                                     *
 *  Umbrello UML Modeller Authors <uml-devel @uml.sf.net>                  *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include "autolayouteradapter.h"


namespace Autolayout
  {

  AutolayouterAdapter::AutolayouterAdapter()
      : Autolayout::Autolayouter()
    {}


  AutolayouterAdapter::~AutolayouterAdapter()
  {}}

void Autolayout::AutolayouterAdapter::addRelationship( AssociationWidget * a )
  {
  int weight;
  switch (a->getAssocType())
    {
      case Uml::at_Generalization:;
      case Uml::at_Realization:
        {
        if (genralizationAsEdges)weight=generalizationWeight;
        else return;
        break;
        }
      case Uml::at_Dependency:
        {
        if (dependenciesAsEdges) weight=dependenciesWeight;
        else return;
        break;
        }
      case Uml::at_Anchor:
        {
        if (anchorsAsEdges) weight=anchorsWeight;
        else return;
        break;
        }
      case Uml::at_Aggregation:;
      case Uml::at_Association:;
      case Uml::at_Containment:;
      case Uml::at_Composition:;
      default: return;
      /*case Uml::at_Association_Self:;
      case Uml::at_Activity:;
      case Uml::at_Relationship:;
      case Uml::at_Coll_Message:;
      case Uml::at_Seq_Message:;
      case Uml::at_Coll_Message_Self:;
      case Uml::at_Seq_Message_Self:;
      case Uml::at_Containment:;
      case Uml::at_Composition:;
      case Uml::at_Realization:;
      case Uml::at_UniAssociation:;

      case Uml::at_State:;
      case Uml::at_Unknown:;
      */
    };
  getGraph()->addEdge(a->getWidgetID(Uml::A).c_str(),a->getWidgetID(Uml::B).c_str(),weight);
  }

void Autolayout::AutolayouterAdapter::setAssociationWeight( int i )
  {
  associationWeight=i;
  }

void Autolayout::AutolayouterAdapter::setDependenciesWeight( int i )
  {
  dependenciesWeight=i;
  }

void Autolayout::AutolayouterAdapter::setGeneralizationWeight( int i )
  {
  generalizationWeight=i;
  }

void Autolayout::AutolayouterAdapter::setGeneralizationAsEdges( bool b )
  {
  genralizationAsEdges=b;
  }

void Autolayout::AutolayouterAdapter::setDependenciesAsEdges( bool b )
  {
  dependenciesAsEdges=b;
  }

void Autolayout::AutolayouterAdapter::setAssociationAsEdges( bool b )
  {
  associationAsEdges=b;
  }

void Autolayout::AutolayouterAdapter::setCompressShapes( bool b )
  {
  compressShapes=b;
  }

void Autolayout::AutolayouterAdapter::setCenterDiagram( bool b )
  {
  centerDiagram=b;
  }

void Autolayout::AutolayouterAdapter::setClusterizeHierarchies( bool b )
  {
  clusterizeHierarchies=b;
  }

void Autolayout::AutolayouterAdapter::setShapeSeparation( int i )
  {
  shapeSeparation=i;
  }

Autolayout::Graph  * Autolayout::AutolayouterAdapter::setGraph( UMLView * view )
  {
  if (! view) return 0;
  Autolayout::Graph * g=getGraph();
  if (g&&g->empty())
    {
    UMLWidgetList list = view->getWidgetList();
    UMLWidget* widget;
    for ( widget = list.first(); widget; widget= list.next() )
      {
      if (widget->getBaseType() == Uml::wt_Class)
        {


        g->addNode(widget->getID().c_str(),widget->getWidth(),
                   widget->getHeight());
        }
      }
    AssociationWidgetList as_list=view->getAssociationList();
    AssociationWidget* assoc;
    AssociationWidgetListIt it(as_list);
    while ( (assoc = it.current()) != 0 )
      {
      ++it;
      addRelationship(assoc);
      }
    }
  return g;
  }

void Autolayout::AutolayouterAdapter::updateView( UMLView* view )
  {
if (! view) return ;  
UMLWidgetList list = view->getWidgetList();
  UMLWidget* widget;
  Graph *g=getGraph();
  if (! view||!g)  return ;
  for ( widget = list.first(); widget; widget= list.next() )
    if (widget->getBaseType() == Uml::wt_Class)
      {
      Node* n =g->getNode(widget->getID().c_str());
      //printf("old values widgets %s x,y:%d,%d\n",widget->getID().c_str(),widget->getX(),widget->getY());
      //int x_old=widget->getX();
      //int x_calc=n.getX();
      //int x_calc2=30 +n.getX()-widget->getWidth()/2;
      widget->setX(getCanvas()->getBaseX() +n->getX()-widget->getWidth()/2);
      //int x=widget->getX();
      widget->setY(getCanvas()->getMaxY()/2-(n->getY()+(widget->getHeight()/2)));

      widget->updateWidget();

      }
  }

Autolayout::Canvas * Autolayout::AutolayouterAdapter::setCanvas( UMLView* view )
  {
  return canvas=new Autolayout::SimpleCanvas(view->getCanvasWidth(),view->getCanvasHeight());
  }

void Autolayout::AutolayouterAdapter::setNoteConnectionWeight( int i )
{
noteConnectionWeight=i;
}

void Autolayout::AutolayouterAdapter::setNoteConnectionsAsEdges( bool b )
{
noteConnectionAsEdges=b;
}
