QmitkToolRoiDataSelectionBox::QmitkToolRoiDataSelectionBox(QWidget* parent, mitk::DataStorage* storage)
:QWidget(parent),
m_SelfCall(false),
m_lastSelection(mitk::DataNode::New()),
m_lastSelectedName(tr("none"))
{

  QBoxLayout* mainLayout = new QVBoxLayout(this);
  m_segmentationComboBox = new QComboBox(this);
  QLabel* label = new QLabel("region of interest:", this);
  m_boundingObjectWidget = new QmitkBoundingObjectWidget();

  mainLayout->addWidget(label);
  mainLayout->addWidget(m_segmentationComboBox);
  mainLayout->addWidget(m_boundingObjectWidget);

  //connect signals
  connect(m_segmentationComboBox, SIGNAL(activated(const QString&)), this, SLOT(OnRoiDataSelectionChanged(const QString&)) );
  connect(m_boundingObjectWidget, SIGNAL(BoundingObjectsChanged()), this, SLOT(OnRoiDataSelectionChanged()));

  //create ToolManager
  m_ToolManager = mitk::ToolManager::New(storage);

  //setup message delegates
  m_ToolManager->RoiDataChanged += mitk::MessageDelegate<QmitkToolRoiDataSelectionBox> (this, &QmitkToolRoiDataSelectionBox::OnToolManagerRoiDataModified);

  mainLayout->deleteLater();
  label->deleteLater();
}
void QmitkBoundingObjectWidget::OnItemDataChanged(QTreeWidgetItem *item, int col)
{
  if (m_ItemNodeMap.size() < 1)
    return;

  ItemNodeMapType::iterator it = m_ItemNodeMap.find(item);
  if (it == m_ItemNodeMap.end())
    return;

  mitk::DataNode* node = it->second;

  //name
  if (col == 0)
  {
    m_TreeWidget->closePersistentEditor(item, col);
    node->SetName(item->text(0).toLocal8Bit().data());
  }
  //positive
  else if (col == 1)
  {
    mitk::BoundingObject* boundingObject = dynamic_cast<mitk::BoundingObject*> (node->GetData());
    if (boundingObject)
      boundingObject->SetPositive(!(item->checkState(1)));
    emit BoundingObjectsChanged();
  }
  //visible
  else if (col == 2)
  {
    node->SetVisibility(item->checkState(2));
  }

  mitk::RenderingManager::GetInstance()->RequestUpdateAll();


}
void QmitkBoundingObjectWidget::OnBoundingObjectModified(const itk::EventObject&)
{
  emit BoundingObjectsChanged();
}
void QmitkBoundingObjectWidget::CreateBoundingObject(int type)
{

  //get cross position
  mitk::Point3D pos;
  mitk::RenderingManager::RenderWindowVector windows =  mitk::RenderingManager::GetInstance()->GetAllRegisteredRenderWindows();

  //hopefully we have the renderwindows in the "normal" order
  const mitk::PlaneGeometry *plane1 =
    mitk::BaseRenderer::GetInstance(windows.at(0))->GetSliceNavigationController()->GetCurrentPlaneGeometry();
  const mitk::PlaneGeometry *plane2 =
    mitk::BaseRenderer::GetInstance(windows.at(1))->GetSliceNavigationController()->GetCurrentPlaneGeometry();
  const mitk::PlaneGeometry *plane3 =
    mitk::BaseRenderer::GetInstance(windows.at(2))->GetSliceNavigationController()->GetCurrentPlaneGeometry();

  mitk::Line3D line;
  if ( (plane1 != NULL) && (plane2 != NULL)
    && (plane1->IntersectionLine( plane2, line )) )
  {
    if ( !((plane3 != NULL)
      && (plane3->IntersectionPoint( line, pos ))) )
    {
      return;
    }
  }

  if (type != 0)
  {
    mitk::BoundingObject::Pointer boundingObject;
    QString name;
    name.setNum(m_BoundingObjectCounter);

    switch (type-1)
    {
    case CUBOID:
      boundingObject = mitk::Cuboid::New();
      name.prepend("Cube_");
      break;
    case CONE:
      boundingObject = mitk::Cone::New();
      name.prepend("Cone_");
      break;
    case ELLIPSOID:
      boundingObject = mitk::Ellipsoid::New();
      name.prepend("Ellipse_");
      break;
    case CYLINDER:
      boundingObject = mitk::Cylinder::New();
      name.prepend("Cylinder_");
      break;
    default:
      return;
      break;
    }
    m_BoundingObjectCounter++;
    m_addComboBox->setCurrentIndex(0);

    // set initial size
    mitk::Vector3D size;
    size.Fill(10);
    boundingObject->GetGeometry()->SetSpacing( size );

    boundingObject->GetGeometry()->Translate(pos.GetVectorFromOrigin());
    boundingObject->GetTimeGeometry()->Update();

    //create node
    mitk::DataNode::Pointer node  = mitk::DataNode::New();
    node->SetData( boundingObject);
    node->SetProperty("name", mitk::StringProperty::New( name.toLocal8Bit().data()));
    node->SetProperty("color", mitk::ColorProperty::New(0.0, 0.0, 1.0));
    node->SetProperty("opacity", mitk::FloatProperty::New(0.7));
    node->SetProperty("bounding object", mitk::BoolProperty::New(true));
    node->SetProperty("helper object", mitk::BoolProperty::New(true));

    m_DataStorage->Add(node);

    mitk::RenderingManager::GetInstance()->RequestUpdateAll();

    emit BoundingObjectsChanged();

    AddItem(node);
  }
}