TransformableMarkerOperatorAction::TransformableMarkerOperatorAction( QWidget* parent )
    : rviz::Panel( parent )
  {
    layout = new QVBoxLayout;

    QVBoxLayout* layout1 = new QVBoxLayout;
    QVBoxLayout* layout2 = new QVBoxLayout;

    QTabWidget* tabs = new QTabWidget();

    QWidget* tab_1 = new QWidget();
    QWidget* tab_2 = new QWidget();

    //Button to send cancel topic
    insert_box_button_ = new QPushButton("Insert New Box Marker");
    layout1->addWidget( insert_box_button_ );

    insert_cylinder_button_ = new QPushButton("Insert New Cylinder Marker");
    layout1->addWidget( insert_cylinder_button_ );

    insert_torus_button_ = new QPushButton("Insert New Torus Marker");
    layout1->addWidget( insert_torus_button_ );

    QHBoxLayout* name_layout = new QHBoxLayout;
    name_layout->addWidget( new QLabel( "Name:" ));
    name_editor_ = new QLineEdit;
    name_layout->addWidget( name_editor_ );
    layout1->addLayout( name_layout );

    QHBoxLayout* description_layout = new QHBoxLayout;
    description_layout->addWidget( new QLabel( "Description:" ));
    description_editor_ = new QLineEdit;
    description_layout->addWidget( description_editor_ );
    layout1->addLayout( description_layout );

    QHBoxLayout* frame_layout = new QHBoxLayout;
    frame_layout->addWidget( new QLabel( "Frame:" ));
    frame_editor_ = new QLineEdit;
    frame_layout->addWidget( frame_editor_ );
    layout1->addLayout( frame_layout );

    erase_with_id_button_ = new QPushButton("Erase with id");
    layout2->addWidget( erase_with_id_button_ );

    QHBoxLayout* id_layout = new QHBoxLayout;
    id_layout->addWidget( new QLabel( "Id:" ));
    id_editor_ = new QLineEdit;
    id_layout->addWidget( id_editor_ );
    layout2->addLayout( id_layout );

    erase_all_button_ = new QPushButton("Erase all");
    layout2->addWidget( erase_all_button_ );

    erase_focus_button_ = new QPushButton("Erase focus");
    layout2->addWidget( erase_focus_button_ );

    tab_1->setLayout( layout1 );
    tab_2->setLayout( layout2 );

    tabs->addTab(tab_1, QString("Insert"));
    tabs->addTab(tab_2, QString("Erase"));

    layout->addWidget( tabs );
    setLayout( layout );

    connect( insert_box_button_, SIGNAL( clicked() ), this, SLOT( insertBoxService ()));
    connect( insert_cylinder_button_, SIGNAL( clicked() ), this, SLOT( insertCylinderService ()));
    connect( insert_torus_button_, SIGNAL( clicked() ), this, SLOT( insertTorusService ()));
    connect( erase_with_id_button_, SIGNAL( clicked() ), this, SLOT( eraseWithIdService ()));
    connect( erase_all_button_, SIGNAL( clicked() ), this, SLOT( eraseAllService ()));
    connect( erase_focus_button_, SIGNAL( clicked() ), this, SLOT( eraseFocusService ()));
  }
  TransformableMarkerOperatorAction::TransformableMarkerOperatorAction( QWidget* parent )
    : rviz::Panel( parent )
  {
    layout = new QVBoxLayout;

    // server name
    QHBoxLayout* server_name_layout = new QHBoxLayout;
    server_name_layout->addWidget( new QLabel( "Server Name:" ));
    server_name_editor_ = new QLineEdit;
    server_name_layout->addWidget( server_name_editor_ );
    layout->addLayout( server_name_layout );

    // topic name
    QHBoxLayout* obj_array_topic_layout = new QHBoxLayout;
    obj_array_topic_layout->addWidget( new QLabel( "ObjectArray Topic:" ));
    topic_name_editor_ = new QLineEdit;
    obj_array_topic_layout->addWidget( topic_name_editor_ );
    layout->addLayout( obj_array_topic_layout );

    // tabs for operations
    QTabWidget* tabs = new QTabWidget();

    QVBoxLayout* layout1 = new QVBoxLayout;
    QVBoxLayout* layout2 = new QVBoxLayout;
    QVBoxLayout* layout3 = new QVBoxLayout;

    QWidget* tab_1 = new QWidget();
    QWidget* tab_2 = new QWidget();
    QWidget* tab_3 = new QWidget();

    // tab_1, layout1: insert

    insert_box_button_ = new QPushButton("Insert New Box Marker");
    layout1->addWidget( insert_box_button_ );

    insert_cylinder_button_ = new QPushButton("Insert New Cylinder Marker");
    layout1->addWidget( insert_cylinder_button_ );

    insert_torus_button_ = new QPushButton("Insert New Torus Marker");
    layout1->addWidget( insert_torus_button_ );

    insert_mesh_button_ = new QPushButton("Insert New Mesh Marker");
    layout1->addWidget( insert_mesh_button_ );

    QHBoxLayout* object_layout = new QHBoxLayout;
    object_layout->addWidget( new QLabel( "Object:" ));
    object_editor_ = new QComboBox;
    object_editor_->setIconSize(QSize(50, 50));
    object_editor_->setSizeAdjustPolicy(QComboBox::AdjustToContents);
    object_layout->addWidget( object_editor_ );
    layout1->addLayout( object_layout );

    QHBoxLayout* name_layout = new QHBoxLayout;
    name_layout->addWidget( new QLabel( "Name:" ));
    name_editor_ = new QLineEdit;
    name_layout->addWidget( name_editor_ );
    layout1->addLayout( name_layout );

    QHBoxLayout* description_layout = new QHBoxLayout;
    description_layout->addWidget( new QLabel( "Description:" ));
    description_editor_ = new QLineEdit;
    description_layout->addWidget( description_editor_ );
    layout1->addLayout( description_layout );

    QHBoxLayout* frame_layout = new QHBoxLayout;
    frame_layout->addWidget( new QLabel( "Frame:" ));
    frame_editor_ = new QLineEdit;
    frame_layout->addWidget( frame_editor_ );
    layout1->addLayout( frame_layout );

    // tab_2, layout2: transform
    QVBoxLayout* transform_layout = new QVBoxLayout;
    transform_layout->addWidget( new QLabel( "Object Name:" ));
    transform_name_editor_ = new QLineEdit;
    transform_layout->addWidget( transform_name_editor_ );
    transform_layout->addWidget( new QLabel( "Dimension X:" ));
    dimension_x_editor_ = new QLineEdit;
    transform_layout->addWidget( dimension_x_editor_ );
    transform_layout->addWidget( new QLabel( "Dimension Y:" ));
    dimension_y_editor_ = new QLineEdit;
    transform_layout->addWidget( dimension_y_editor_ );
    transform_layout->addWidget( new QLabel( "Dimension Z:" ));
    dimension_z_editor_ = new QLineEdit;
    transform_layout->addWidget( dimension_z_editor_ );
    transform_layout->addWidget( new QLabel( "Dimension Radius:" ));
    dimension_radius_editor_ = new QLineEdit;
    transform_layout->addWidget( dimension_radius_editor_ );
    transform_layout->addWidget( new QLabel( "Dimension Small Radius:" ));
    dimension_sm_radius_editor_ = new QLineEdit;
    transform_layout->addWidget( dimension_sm_radius_editor_ );
    layout2->addLayout( transform_layout );

    // tab_3, layout3: erase

    erase_with_id_button_ = new QPushButton("Erase with id");
    layout3->addWidget( erase_with_id_button_ );

    QHBoxLayout* id_layout = new QHBoxLayout;
    id_layout->addWidget( new QLabel( "Id:" ));
    id_editor_ = new QLineEdit;
    id_layout->addWidget( id_editor_ );
    layout3->addLayout( id_layout );

    erase_all_button_ = new QPushButton("Erase all");
    layout3->addWidget( erase_all_button_ );

    erase_focus_button_ = new QPushButton("Erase focus");
    layout3->addWidget( erase_focus_button_ );

    tab_1->setLayout( layout1 );
    tab_2->setLayout( layout2 );
    tab_3->setLayout( layout3 );

    tabs->addTab(tab_1, QString("Insert"));
    tabs->addTab(tab_2, QString("Transform"));
    tabs->addTab(tab_3, QString("Erase"));

    layout->addWidget( tabs );
    setLayout( layout );

    connect( insert_box_button_, SIGNAL( clicked() ), this, SLOT( insertBoxService ()));
    connect( insert_cylinder_button_, SIGNAL( clicked() ), this, SLOT( insertCylinderService ()));
    connect( insert_torus_button_, SIGNAL( clicked() ), this, SLOT( insertTorusService ()));
    connect( insert_mesh_button_, SIGNAL( clicked() ), this, SLOT( insertMeshService ()));
    connect( erase_with_id_button_, SIGNAL( clicked() ), this, SLOT( eraseWithIdService ()));
    connect( erase_all_button_, SIGNAL( clicked() ), this, SLOT( eraseAllService ()));
    connect( erase_focus_button_, SIGNAL( clicked() ), this, SLOT( eraseFocusService ()));

    connect( dimension_x_editor_, SIGNAL( editingFinished() ), this, SLOT( updateDimensionsService ()));
    connect( dimension_y_editor_, SIGNAL( editingFinished() ), this, SLOT( updateDimensionsService ()));
    connect( dimension_z_editor_, SIGNAL( editingFinished() ), this, SLOT( updateDimensionsService ()));
    connect( dimension_radius_editor_, SIGNAL( editingFinished() ), this, SLOT( updateDimensionsService ()));
    connect( dimension_sm_radius_editor_, SIGNAL( editingFinished() ), this, SLOT( updateDimensionsService ()));
    connect( object_editor_, SIGNAL( currentIndexChanged(int)), SLOT( updateName ()));
    connect( topic_name_editor_, SIGNAL( editingFinished() ), this, SLOT( updateObjectArrayTopic ()));
  }