Salome HOME
CurveCreator was updated
[modules/geom.git] / src / CurveCreator / CurveCreator_Widget.cxx
index 0c0ceac9b44396f82a11241839ab1bd1cc12cd34..c2fd75048a0d60d0c327ef1e3c8f610d9738c339 100644 (file)
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// File:        CurveCreator_Widget.cxx
-// Created:     Mon Jul  01 12:49:31 2013
-// Author:      Sergey KHROMOV
-//
-
-
-#include <CurveCreator_Widget.h>
-#include <CurveCreator_EditPntsWidget.h>
-#include <CurveCreator_UndoOptsDlg.h>
-#include <CurveCreator_EditPntDlg.h>
-#include <CurveCreator_PointItem.h>
-#include <QPushButton>
-#include <QButtonGroup>
-#include <QHBoxLayout>
-#include <QListWidget>
-#include <QGroupBox>
-#include <QLabel>
-#include <QLineEdit>
-#include <QRadioButton>
-#include <QComboBox>
-#include <QCheckBox>
-
-#define SECTION_ADD          0
-#define SECTION_MODIFY       1
-#define POLYLINE_INDEX       0
-#define BSPLINE_INDEX        1
-#define UNDO_REDO_DISABLED   0
-#define UNDO_REDO_UNLIMITED -1
-
-//=======================================================================
-// function: Constructor
-// purpose:
-//=======================================================================
-CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
-                                         CurveCreator_Curve *theCurve,
-                                         Qt::WindowFlags fl)
-  : QWidget          (parent, fl),
-    myEditor         (theCurve),
-    myDimension      (theCurve == NULL ?
-                       CurveCreator::Dim2d : theCurve->getDimension()),
-    myEnabledUndoLbl (NULL),
-    myBufSizeUndoLbl (NULL),
-    myUndoBtn        (NULL),
-    myRedoBtn        (NULL),
-    myUndoOptsBtn    (NULL),
-    myUndoOptsDlg    (NULL),
-    myAddSecGrp      (NULL),
-    mySecBtnGrp      (NULL),
-    mySecTypeCmbBox  (NULL),
-    mySecCloseChkBox (NULL),
-    mySecAddModifBtn (NULL),
-    mySecRmBtn       (NULL),
-    mySecJoinBtn     (NULL),
-    mySecJoinAllBtn  (NULL),
-    mySecClearBtn    (NULL),
-    mySecUpBtn       (NULL),
-    mySecDownBtn     (NULL),
-    mySecList        (NULL),
-    myEditSecPnts    (NULL),
-    myPntsGrp        (NULL),
-    myPntsList       (NULL),
-    myPntEditDlg     (NULL),
-    myEditPnts       (NULL),
-    myAddPntsBtn     (NULL),
-    myInsertPntsBtn  (NULL),
-    myRmPntsBtn      (NULL)
-{
-  setWindowTitle(tr("CC_TITLE"));
-
-  // Set undo/redo options group
-  QGroupBox   *anUndoOptsGrp = new QGroupBox(tr("CC_UNDO_REDO_OPTIONS"));
-  QGridLayout *anUndoOptsLO  = new QGridLayout(anUndoOptsGrp);
-
-  myEnabledUndoLbl = new QLabel(tr("CC_UNDO_REDO_ENABLED"), anUndoOptsGrp);
-  myBufSizeUndoLbl = new QLabel(tr("CC_UNDO_REDO_BUFFER_SIZE"), anUndoOptsGrp);
-  myUndoOptsBtn    = new QPushButton(tr("CC_UNDO_REDO_MODIFY"), anUndoOptsGrp);
-  anUndoOptsLO->setMargin(9);
-  anUndoOptsLO->setSpacing(6);
-  anUndoOptsLO->addWidget(myEnabledUndoLbl, 0, 0);
-  anUndoOptsLO->addWidget(myBufSizeUndoLbl, 1, 0);
-  anUndoOptsLO->addWidget(myUndoOptsBtn,    0, 1, 2, 1);
-
-  // Set undo/redo group
-  QGroupBox   *anUndoRedoGrp     = new QGroupBox(tr("CC_UNDO_REDO_TITLE"));
-  QHBoxLayout *anUndoRedoLO      = new QHBoxLayout(anUndoRedoGrp);
-
-  myUndoBtn = new QPushButton(tr("CC_UNDO"), anUndoRedoGrp);
-  myRedoBtn = new QPushButton(tr("CC_REDO"), anUndoRedoGrp);
-  anUndoRedoLO->setMargin(9);
-  anUndoRedoLO->setSpacing(6);
-  anUndoRedoLO->addWidget(myUndoBtn,     0, Qt::AlignRight);
-  anUndoRedoLO->addWidget(myRedoBtn,     0, Qt::AlignLeft);
-  anUndoRedoLO->addWidget(anUndoOptsGrp, 0, Qt::AlignRight);
-
-  // Set section add/modification group.
-  myAddSecGrp = new QGroupBox(tr("CC_SECTION_ADD_TITLE"));
-
-  QGridLayout  *anAddSecLO      = new QGridLayout(myAddSecGrp);
-  QLabel       *aSectTypeLbl    =
-                new QLabel(tr("CC_SECTION_TYPE"), myAddSecGrp);
-  QLabel       *aSecPntsLbl     =
-                new QLabel(tr("CC_SECTION_POINTS_ADD_LBL"), myAddSecGrp);
-
-  mySecCloseChkBox = new QCheckBox(tr("CC_SECTION_CLOSED"), myAddSecGrp);
-  mySecTypeCmbBox  = new QComboBox(myAddSecGrp);
-  mySecAddModifBtn = new QPushButton(tr("CC_SECTION_NEW"), myAddSecGrp);
-  myEditSecPnts    = new CurveCreator_EditPntsWidget
-                (myAddSecGrp, true, myDimension);
-  anAddSecLO->setMargin(9);
-  anAddSecLO->setSpacing(6);
-  anAddSecLO->addWidget(mySecCloseChkBox, 0, 0);
-  anAddSecLO->addWidget(aSectTypeLbl,     1, 0);
-  anAddSecLO->addWidget(mySecTypeCmbBox,  1, 1);
-  anAddSecLO->addWidget(aSecPntsLbl,      2, 0);
-  anAddSecLO->addWidget(myEditSecPnts,    2, 1);
-  anAddSecLO->addWidget(mySecAddModifBtn, 1, 3);
-
-  // Set section group
-  QGroupBox    *aSecGrp         = new QGroupBox(tr("CC_SECTION_TITLE"));
-  QGridLayout  *aSecLO          = new QGridLayout(aSecGrp);
-  QRadioButton *anAddSecRdBtn   =
-               new QRadioButton(tr("CC_SECTION_ADD_TITLE"), aSecGrp);
-  QRadioButton *aModifSecRdBtn  =
-               new QRadioButton(tr("CC_SECTION_MODIFY_TITLE"), aSecGrp);
-
-  mySecRmBtn      = new QPushButton(tr("CC_SECTION_REMOVE"), aSecGrp);
-  mySecJoinBtn    = new QPushButton(tr("CC_SECTION_JOIN"), aSecGrp);
-  mySecJoinAllBtn = new QPushButton(tr("CC_SECTION_JOIN_ALL"), aSecGrp);
-  mySecClearBtn   = new QPushButton(tr("CC_SECTION_CLEAR"), aSecGrp);
-  mySecUpBtn      = new QPushButton(tr("CC_SECTION_UP"), aSecGrp);
-  mySecDownBtn    = new QPushButton(tr("CC_SECTION_DOWN"), aSecGrp);
-  mySecBtnGrp     = new QButtonGroup(aSecGrp);
-  mySecList       = new QListWidget(aSecGrp);
-  aSecLO->setMargin(9);
-  aSecLO->setSpacing(6);
-  aSecLO->addWidget(anAddSecRdBtn,   0, 0);
-  aSecLO->addWidget(aModifSecRdBtn,  0, 1);
-  aSecLO->addWidget(myAddSecGrp,     1, 0, 1, 5);
-  aSecLO->addWidget(mySecRmBtn,      2, 0);
-  aSecLO->addWidget(mySecJoinBtn,    2, 1);
-  aSecLO->addWidget(mySecJoinAllBtn, 2, 2);
-  aSecLO->addWidget(mySecClearBtn,   2, 3);
-  aSecLO->addWidget(mySecUpBtn,      4, 4);
-  aSecLO->addWidget(mySecDownBtn,    5, 4);
-  aSecLO->addWidget(mySecList,       3, 0, 4, 4);
-  mySecBtnGrp->addButton(anAddSecRdBtn,  SECTION_ADD);
-  mySecBtnGrp->addButton(aModifSecRdBtn, SECTION_MODIFY);
-
-  // Set point add/modification group.
-  QGroupBox    *anAddPntsGrp   = new QGroupBox(tr("CC_POINTS_ADD_TITLE"));
-
-  QGridLayout  *anAddPntsLO    = new QGridLayout(anAddPntsGrp);
-  QLabel       *aPntsLbl       =
-                new QLabel(tr("CC_POINTS_ADD_LBL"), anAddPntsGrp);
-
-  myEditPnts      = new CurveCreator_EditPntsWidget
-                            (anAddPntsGrp, false, myDimension);
-  myAddPntsBtn    = new QPushButton(tr("CC_POINTS_ADD"), anAddPntsGrp);
-  myInsertPntsBtn = new QPushButton(tr("CC_POINTS_INSERT"), anAddPntsGrp);
-  anAddPntsLO->setMargin(9);
-  anAddPntsLO->setSpacing(6);
-  anAddPntsLO->addWidget(aPntsLbl,        0, 0);
-  anAddPntsLO->addWidget(myEditPnts,      0, 1);
-  anAddPntsLO->addWidget(myAddPntsBtn,    0, 4);
-  anAddPntsLO->addWidget(myInsertPntsBtn, 1, 4);
-
-  // Set Points group
-  myPntsGrp = new QGroupBox(tr("CC_POINTS_TITLE"));
-
-  QGridLayout *aPntsLO = new QGridLayout(myPntsGrp);
-
-  myPntsList  = new QListWidget(myPntsGrp);
-  myRmPntsBtn = new QPushButton(tr("CC_POINTS_REMOVE"), myPntsGrp);
-  aPntsLO->setMargin(9);
-  aPntsLO->setSpacing(6);
-  aPntsLO->addWidget(anAddPntsGrp, 0, 0, 1, 4);
-  aPntsLO->addWidget(myRmPntsBtn,  1, 0);
-  aPntsLO->addWidget(myPntsList,   2, 0, 4, 4);
-
-  // Set main group
-  QGroupBox   *aMainGrp = new QGroupBox(tr("CC_TITLE"));
-  QGridLayout *aMainLO = new QGridLayout(aMainGrp);
-
-  aMainLO->setMargin(9);
-  aMainLO->setSpacing(6);
-  aMainLO->addWidget(anUndoRedoGrp, 0, 0, 1, 2);
-  aMainLO->addWidget(aSecGrp,       1, 0);
-  aMainLO->addWidget(myPntsGrp,     1, 1);
-
-  setLayout(aMainLO);
-
-  init();
-}
-
-//=======================================================================
-// function: init
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::init()
-{
-  // Initialize Undo/Redo group.
-  QString anUnlim = tr("CC_UNDO_REDO_UNLIMITED");
-
-  myEnabledUndoLbl->setText(tr("CC_UNDO_REDO_ENABLED"));
-  myBufSizeUndoLbl->setText(tr("CC_UNDO_REDO_BUFFER_SIZE").arg(anUnlim));
-  connect(myUndoOptsBtn, SIGNAL(clicked()), this, SLOT(undoOptionsChanged()));
-  connect(myUndoBtn, SIGNAL(clicked()), this, SLOT(undo()));
-  connect(myRedoBtn, SIGNAL(clicked()), this, SLOT(redo()));
-  updateUndoRedoButtons();
-
-  // Initialize sections group.
-  mySecBtnGrp->setExclusive(true);
-  mySecBtnGrp->button(SECTION_ADD)->setChecked(true);
-  connect(mySecBtnGrp, SIGNAL(buttonClicked(int)),
-          this, SLOT(addModifChanged(int)));
-
-  // Init section buttons.
-  mySecAddModifBtn->setEnabled(true);
-  mySecRmBtn->setEnabled(false);
-  mySecJoinBtn->setEnabled(false);
-  mySecJoinAllBtn->setEnabled(false);
-  mySecClearBtn->setEnabled(false);
-  mySecUpBtn->setEnabled(false);
-  mySecDownBtn->setEnabled(false);
-
-  connect(mySecAddModifBtn, SIGNAL(clicked()),this, SLOT(sectionAddOrModify()));
-  connect(mySecRmBtn,       SIGNAL(clicked()),this, SLOT(sectionRemove()));
-  connect(mySecJoinBtn,     SIGNAL(clicked()),this, SLOT(sectionJoin()));
-  connect(mySecJoinAllBtn,  SIGNAL(clicked()),this, SLOT(sectionJoinAll()));
-  connect(mySecClearBtn,    SIGNAL(clicked()),this, SLOT(sectionClear()));
-  connect(mySecUpBtn,       SIGNAL(clicked()),this, SLOT(sectionUp()));
-  connect(mySecDownBtn,     SIGNAL(clicked()),this, SLOT(sectionDown()));
-
-  // Init section input fields.
-  mySecCloseChkBox->setChecked(false);
-  mySecTypeCmbBox->addItem(tr("CC_SECTION_TYPE_POLYLINE"));
-  mySecTypeCmbBox->addItem(tr("CC_SECTION_TYPE_BSPLINE"));
-  mySecTypeCmbBox->setCurrentIndex(POLYLINE_INDEX);
-  myEditSecPnts->clear();
-
-  // Init sections list widget.
-  mySecList->setSelectionMode(QAbstractItemView::ExtendedSelection);
-
-  connect(this, SIGNAL(numberOfItemsChanged(QListWidget *)),
-          this, SLOT(onNumberOfItemsChanged(QListWidget *)));
-  initSections();
-  connect(mySecList, SIGNAL(itemSelectionChanged()),
-          this, SLOT(changeSecSelection()));
-
-  // Init points list widget.
-  myPntsGrp->setEnabled(false);
-  myPntsList->clear();
-  myPntsList->setSelectionMode(QAbstractItemView::ExtendedSelection);
-
-  connect(myPntsList, SIGNAL(itemSelectionChanged()),
-          this, SLOT(changePntsSelection()));
-  connect(myPntsList, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
-          this, SLOT(editPnt(QListWidgetItem *)));
-
-  // Init points buttons.
-  connect(myAddPntsBtn,    SIGNAL(clicked()),this, SLOT(pntsAdd()));
-  connect(myInsertPntsBtn, SIGNAL(clicked()),this, SLOT(pntsInsert()));
-  connect(myRmPntsBtn,     SIGNAL(clicked()),this, SLOT(pntsRemove()));
-
-  // Init edit points widgets.
-  myEditSecPnts->setPointsList(myPntsList);
-  myEditPnts->setPointsList(myPntsList);
-
-  // Set tab order
-  setTabOrder();
-}
-
-//=======================================================================
-// function: initSections
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::initSections()
-{
-  CurveCreator_Curve *aCurve = myEditor.getCurve();
-
-  const int aNbSections = aCurve->getNbSections();
-  int i;
-
-  mySecList->clear();
-
-  for (i = 0; i < aNbSections; i++) {
-    addSectionItem(aCurve->getType(i), aCurve->isClosed(i));
-  }
-
-  emit numberOfItemsChanged(mySecList);
-}
-
-//=======================================================================
-// function: addSectionItem
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::addSectionItem(const CurveCreator::Type theType,
-                                         const bool isClosed)
-{
-  const int aRow = mySecList->count();
-
-  new QListWidgetItem(mySecList);
-  updateSectionItem(aRow, theType, isClosed);
-  emit numberOfItemsChanged(mySecList);
-}
-
-//=======================================================================
-// function: updateSectionItem
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::updateSectionItem(const int theRow,
-                                            const CurveCreator::Type theType,
-                                            const bool isClosed)
-{
-  QListWidgetItem *anItem = mySecList->item(theRow);
-  QString          aStrType;
-
-  if (theType == CurveCreator::Polyline) {
-    aStrType = tr("CC_SECTION_ITEM_POLYLINE");
-  } else {
-    aStrType = tr("CC_SECTION_ITEM_BSPLINE");
-  }
-
-  const QString aTrCode =
-    (isClosed ? "CC_SECTION_ITEM_CLOSED" : "CC_SECTION_ITEM");
-
-  anItem->setText(tr(aTrCode.toLatin1().constData()).arg(aStrType));
-}
-
-//=======================================================================
-// function: sectionMove
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionMove(const int theShift)
-{
-  // Sort list items in ascending or descending order depending on
-  // the sign of theShift.
-  QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-
-  if (!aListItems.empty() && theShift != 0) {
-    QMap<int, QListWidgetItem *> aMapItems;
-
-    foreach(QListWidgetItem *anItem, aListItems) {
-      int aRow = mySecList->row(anItem);
-
-      if (theShift > 0) {
-        aRow = -aRow;
-      }
-
-      aMapItems.insert(aRow, anItem);
-    }
-
-    // Compute new rows
-    QList<int> aListRows = aMapItems.keys();
-    QList<int> aListNewRows;
-    int i;
-    const int aSize = aListRows.size();
-
-
-    if (theShift < 0) {
-      // Check each row to be positive.
-      int aMinIndex = 0;
-
-      for (i = 0; i < aSize; i++) {
-        int aRow = aListRows[i] + theShift;
-
-        if (aRow < aMinIndex) {
-          aRow = aMinIndex++;
-        }
-
-        aListNewRows.append(aRow);
-      }
-    } else {
-      // Check each row to be not greater then a mySecList's size.
-      int aMaxIndex = mySecList->count() - 1;
-
-      for (i = 0; i < aSize; i++) {
-        int aRow = -aListRows[i] + theShift;
-
-        if (aRow > aMaxIndex) {
-          aRow = aMaxIndex--;
-        }
-
-        aListRows[i] = -aListRows[i];
-        aListNewRows.append(aRow);
-      }
-    }
-
-    // Move each item to another position.
-    for (i = 0; i < aSize; i++) {
-      if (aListRows[i] != aListNewRows[i]) {
-        QListWidgetItem *anItem = mySecList->takeItem(aListRows[i]);
-
-        // Move section.
-        mySecList->insertItem(aListNewRows[i], anItem);
-        myEditor.moveSection(aListRows[i], aListNewRows[i]);
-      }
-    }
-
-    // Select added items.
-    foreach (int anIndex, aListNewRows) {
-      mySecList->item(anIndex)->setSelected(true);
-    }
-
-    // Update undo/redo buttons.
-    updateUndoRedoButtons();
-  }
-}
-
-//=======================================================================
-// function: initPoints
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::initPoints(const int theSectionIndex)
-{
-  // Clear the points list
-  const int aNbPnts = myPntsList->count();
-
-  myPntsList->clear();
-
-  if (theSectionIndex < 0) {
-    if (aNbPnts > 0) {
-      emit numberOfItemsChanged(myPntsList);
-    }
-  } else {
-    // Fill the points list with the points of the section.
-    const CurveCreator::Coordinates &aPoints =
-        myEditor.getCurve()->getPoints(theSectionIndex);
-    const int aNbCoords = aPoints.size();
-
-    if (aNbCoords % myDimension == 0) {
-      int i = 0;
-
-      while (i < aNbCoords) {
-        const CurveCreator::TypeCoord aX = aPoints[i++];
-        const CurveCreator::TypeCoord aY = aPoints[i++];
-
-        if (myDimension == CurveCreator::Dim3d) {
-          const CurveCreator::TypeCoord aZ = aPoints[i++];
-
-          new CurveCreator_PointItem(aX, aY, aZ, myPntsList);
-        } else {
-          new CurveCreator_PointItem(aX, aY, myPntsList);
-        }
-      }
-    }
-
-    if (aNbPnts != aNbCoords/myDimension) {
-      emit numberOfItemsChanged(myPntsList);
-    }
-  }
-}
-
-//=======================================================================
-// function: getCurrentSectionIndex
-// purpose:
-//=======================================================================
-int CurveCreator_Widget::getCurrentSectionIndex()
-{
-  int anIndex = -1;
-  QList<QListWidgetItem *> aListSec = mySecList->selectedItems();
-
-  if (aListSec.size() == 1) {
-    anIndex = mySecList->row(aListSec.first());
-  }
-
-  return anIndex;
-}
-
-//=======================================================================
-// function: updateUndoRedo
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::updateUndoRedo()
-{
-  // Update undo/redo buttons.
-  updateUndoRedoButtons();
-
-  // Update sections.
-  CurveCreator_Curve *aCurve = myEditor.getCurve();
-  const bool isKeepSelection = (mySecList->count() == aCurve->getNbSections());
-  QList<int> aSelectedRows;
-  QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-
-  if (isKeepSelection) {
-    foreach (QListWidgetItem *anItem, aListItems) {
-      aSelectedRows.append(mySecList->row(anItem));
-    }
-  }
-
-  initSections();
-
-  // Set selection.
-  if (isKeepSelection) {
-    foreach (int aRow, aSelectedRows) {
-      mySecList->item(aRow)->setSelected(true);
-    }
-  }
-
-  changeSecSelection();
-}
-
-//=======================================================================
-// function: updateUndoRedoButtons
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::updateUndoRedoButtons()
-{
-  // Update undo/redo buttons.
-  const int anUndoDepth = myEditor.getUndoDepth();
-
-  if (anUndoDepth == UNDO_REDO_DISABLED) {
-    myUndoBtn->setEnabled(false);
-    myRedoBtn->setEnabled(false);
-  } else {
-    myUndoBtn->setEnabled(myEditor.getNbUndo() > 0);
-    myRedoBtn->setEnabled(myEditor.getNbRedo() > 0);
-  }
-}
-
-
-//=======================================================================
-// function: setTabOrder
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::setTabOrder()
-{
-  QWidget::setTabOrder(myUndoBtn, myRedoBtn);
-  QWidget::setTabOrder(myRedoBtn, myUndoOptsBtn);
-  QWidget::setTabOrder(myUndoOptsBtn, mySecBtnGrp->button(SECTION_ADD));
-  QWidget::setTabOrder(mySecBtnGrp->button(SECTION_ADD),
-                       mySecBtnGrp->button(SECTION_MODIFY));
-  QWidget::setTabOrder(mySecBtnGrp->button(SECTION_MODIFY), mySecCloseChkBox);
-  QWidget::setTabOrder(mySecCloseChkBox, mySecTypeCmbBox);
-  QWidget::setTabOrder(mySecTypeCmbBox, myEditSecPnts->getPointsEdit());
-  QWidget::setTabOrder(myEditSecPnts->getPointsEdit(),
-                       myEditSecPnts->getPointsButton());
-  QWidget::setTabOrder(myEditSecPnts->getPointsButton(), mySecAddModifBtn);
-  QWidget::setTabOrder(mySecAddModifBtn, mySecRmBtn);
-  QWidget::setTabOrder(mySecRmBtn, mySecJoinBtn);
-  QWidget::setTabOrder(mySecJoinBtn, mySecJoinAllBtn);
-  QWidget::setTabOrder(mySecJoinAllBtn, mySecClearBtn);
-  QWidget::setTabOrder(mySecClearBtn, mySecList);
-  QWidget::setTabOrder(mySecList, mySecUpBtn);
-  QWidget::setTabOrder(mySecUpBtn, mySecDownBtn);
-  QWidget::setTabOrder(mySecDownBtn, myEditPnts->getPointsEdit());
-  QWidget::setTabOrder(myEditPnts->getPointsEdit(),
-                       myEditPnts->getPointsButton());
-  QWidget::setTabOrder(myEditPnts->getPointsButton(), myAddPntsBtn);
-  QWidget::setTabOrder(myAddPntsBtn, myInsertPntsBtn);
-  QWidget::setTabOrder(myInsertPntsBtn, myRmPntsBtn);
-  QWidget::setTabOrder(myRmPntsBtn, myPntsList);
-}
-
-//=======================================================================
-// function: undoOptionsChanged
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::undoOptionsChanged()
-{
-  if (myUndoOptsDlg == NULL) {
-    // Create the dialog.
-    myUndoOptsDlg = new CurveCreator_UndoOptsDlg(this);
-  }
-
-  // set undo depth.
-  myUndoOptsDlg->setUndoDepth(myEditor.getUndoDepth());
-
-  const int aResult = myUndoOptsDlg->exec();
-
-  if (aResult == QDialog::Accepted) {
-    // Get undo depth.
-    const int  anUndoDepth = myUndoOptsDlg->getUndoDepth();
-    const bool isEnabled   = myUndoOptsDlg->isEnabled();
-
-    myEditor.setUndoDepth(anUndoDepth);
-
-    // Update options labels.
-    myBufSizeUndoLbl->setVisible(isEnabled);
-
-    if (isEnabled) {
-      QString aSize;
-
-      if (myUndoOptsDlg->isUnlimited()) {
-        aSize = tr("CC_UNDO_REDO_UNLIMITED");
-      } else {
-        aSize = QString::number(anUndoDepth);
-      }
-
-      myEnabledUndoLbl->setText(tr("CC_UNDO_REDO_ENABLED"));
-      myBufSizeUndoLbl->setText(tr("CC_UNDO_REDO_BUFFER_SIZE").arg(aSize));
-    } else {
-      myEnabledUndoLbl->setText(tr("CC_UNDO_REDO_DISABLED"));
-    }
-  }
-
-  // Update Undo Redo buttons.
-  updateUndoRedoButtons();
-}
-
-//=======================================================================
-// function: sectionAddOrModify
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionAddOrModify()
-{
-  const bool         isClosed = mySecCloseChkBox->isChecked();
-  CurveCreator::Type aType;
-
-  if (mySecTypeCmbBox->currentIndex() == POLYLINE_INDEX) {
-    aType = CurveCreator::Polyline;
-  } else {
-    aType = CurveCreator::BSpline;
-  }
-
-  if (mySecBtnGrp->checkedId() == SECTION_MODIFY) {
-    // Modify section mode.
-    QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-
-    if (aListItems.size() == 1) {
-      const int           aRow       = mySecList->row(aListItems.first());
-      bool                isModified = false;
-      CurveCreator_Curve *aCurve     = myEditor.getCurve();
-
-
-      if (aCurve->getType(aRow) != aType) {
-        // Set type.
-        isModified = true;
-        myEditor.setType(aType, aRow);
-      }
-
-      if (aCurve->isClosed(aRow) != isClosed) {
-        // Set closed flag.
-        isModified = true;
-        myEditor.setClosed(isClosed, aRow);
-      }
-
-      if (isModified) {
-        updateSectionItem(aRow, aType, isClosed);
-
-        // Update undo/redo buttons.
-        updateUndoRedoButtons();
-      }
-    }
-  } else {
-    // Add section mode. Add section.
-    myEditor.addSection(aType, isClosed, myEditSecPnts->getPoints());
-    addSectionItem(aType, isClosed);
-
-    // Update undo/redo buttons.
-    updateUndoRedoButtons();
-  }
-}
-
-//=======================================================================
-// function: secButtonClicked
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::addModifChanged(int theId)
-{
-  if (theId == SECTION_ADD) {
-    // Add section
-    myAddSecGrp->setTitle(tr("CC_SECTION_ADD_TITLE"));
-    mySecAddModifBtn->setText(tr("CC_SECTION_NEW"));
-    myEditSecPnts->setEnabled(true);
-    mySecAddModifBtn->setEnabled(true);
-  } else {
-    // Modify section
-    myAddSecGrp->setTitle(tr("CC_SECTION_MODIFICATION_TITLE"));
-    mySecAddModifBtn->setText(tr("CC_SECTION_MODIFY"));
-    myEditSecPnts->setEnabled(false);
-    changeSecSelection();
-  }
-}
-
-//=======================================================================
-// function: changeSecSelection
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::changeSecSelection()
-{
-  // Update modify button and section data.
-  QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-  const int aNbItems = aListItems.size();
-
-  if (mySecBtnGrp->checkedId() == SECTION_MODIFY) {
-    // Modify section mode.
-    if (aNbItems == 1) {
-      // Initialize type and closed flags.
-      CurveCreator_Curve *aCurve  = myEditor.getCurve();
-      const int           anIndex = mySecList->row(aListItems.first());
-
-      mySecAddModifBtn->setEnabled(true);
-      mySecCloseChkBox->setChecked(aCurve->isClosed(anIndex));
-
-      if (aCurve->getType(anIndex) == CurveCreator::Polyline) {
-        mySecTypeCmbBox->setCurrentIndex(POLYLINE_INDEX);
-      } else {
-        mySecTypeCmbBox->setCurrentIndex(BSPLINE_INDEX);
-      }
-    } else if (mySecAddModifBtn->isEnabled()) {
-      mySecAddModifBtn->setEnabled(false);
-    }
-  } else {
-    // Add section mode.
-    mySecAddModifBtn->setEnabled(true);
-  }
-
-  // Set enabled remove, up and down points.
-  bool isEnabled = (aNbItems > 0);
-  const int aCount = mySecList->count();
-
-  mySecRmBtn->setEnabled(isEnabled);
-  isEnabled &= (aNbItems < aCount);
-  mySecUpBtn->setEnabled(isEnabled);
-  mySecDownBtn->setEnabled(isEnabled);
-  mySecJoinBtn->setEnabled(aNbItems == 2);
-
-  // Init points.
-  myPntsGrp->setEnabled(aNbItems == 1);
-
-  if (aNbItems == 1) {
-    const int aSecIndex = mySecList->row(aListItems.first());
-
-    initPoints(aSecIndex);
-  } else {
-    initPoints(-1);
-  }
-}
-
-//=======================================================================
-// function: sectionRemove
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionRemove()
-{
-  QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-
-  if (!aListItems.empty()) {
-    QList<int> aListRows;
-
-    // Get items rows.
-    foreach(QListWidgetItem *anItem, aListItems) {
-      aListRows.append(mySecList->row(anItem));
-    }
-
-    // Delete items.
-    foreach(QListWidgetItem *anItem, aListItems) {
-      delete anItem;
-    }
-
-    qSort(aListRows);
-
-    // Delete points from curve.
-    const int aNbPnts = aListRows.size();
-    int       i;
-
-    for (i = aNbPnts - 1; i >= 0; i--) {
-      myEditor.removeSection(aListRows[i]);
-    }
-
-    // Set the new selection.
-    int aRow = aListRows[0];
-
-    if (aListRows[0] >= mySecList->count()) {
-      aRow = mySecList->count() - 1;
-    }
-
-    if (aRow >= 0) {
-      mySecList->item(aRow)->setSelected(true);
-    }
-
-    emit numberOfItemsChanged(mySecList);
-
-    // Update undo/redo buttons.
-    updateUndoRedoButtons();
-  }
-}
-
-//=======================================================================
-// function: sectionJoin
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionJoin()
-{
-  QList<QListWidgetItem *> aListItems = mySecList->selectedItems();
-
-  if (aListItems.size() == 2) {
-    int aRowTo   = mySecList->row(aListItems.first());
-    int aRowFrom = mySecList->row(aListItems.last());
-
-    if (aRowTo > aRowFrom) {
-      // Swap rows.
-      int aTmp = aRowTo;
-
-      aRowTo   = aRowFrom;
-      aRowFrom = aTmp;
-    }
-
-    // Join two sections.
-    myEditor.join(aRowTo, aRowFrom);
-    delete mySecList->takeItem(aRowFrom);
-    emit numberOfItemsChanged(mySecList);
-    // Select the joined item.
-    mySecList->item(aRowTo)->setSelected(true);
-    changeSecSelection();
-
-    // Update undo/redo buttons.
-    updateUndoRedoButtons();
-  }
-}
-
-//=======================================================================
-// function: sectionJoinAll
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionJoinAll()
-{
-  const int aNbItems = mySecList->count();
-
-  if (aNbItems > 1) {
-    // Join two sections.
-    myEditor.join();
-
-    // Update mySecList.
-    for (int i = 1; i < aNbItems; i++) {
-      delete mySecList->takeItem(1);
-    }
-
-    emit numberOfItemsChanged(mySecList);
-    // Select the joined item.
-    mySecList->item(0)->setSelected(true);
-    changeSecSelection();
-
-    // Update undo/redo buttons.
-    updateUndoRedoButtons();
-  }
-}
-
-//=======================================================================
-// function: sectionClear
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionClear()
-{
-  bool isEmpty = (mySecList->count() == 0);
-
-  if (!isEmpty) {
-    mySecList->clear();
-    myEditor.clear();
-    emit numberOfItemsChanged(mySecList);
-
-    // Update undo/redo buttons.
-    updateUndoRedoButtons();
-  }
-}
-
-//=======================================================================
-// function: sectionUp
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionUp()
-{
-  sectionMove(-1);
-}
-
-//=======================================================================
-// function: sectionDown
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::sectionDown()
-{
-  sectionMove(1);
-}
-
-//=======================================================================
-// function: onNumberOfItemsChanged
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::onNumberOfItemsChanged(QListWidget *theListWidget)
-{
-  if (theListWidget == mySecList) {
-    // List of sections is modified.
-    mySecJoinAllBtn->setEnabled(mySecList->count() > 1);
-    mySecClearBtn->setEnabled(mySecList->count() > 0);
-  } else {
-    // List of points is modified.
-    QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
-    const int aNbItems = aListItems.size();
-
-    myRmPntsBtn->setEnabled(aNbItems > 0);
-  }
-}
-
-//=======================================================================
-// function: changePntsSelection
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::changePntsSelection()
-{
-  // Update modify buttons and section data.
-  QList<QListWidgetItem *> aListItems = myPntsList->selectedItems();
-  const int aNbItems = aListItems.size();
-  const int aCount   = myPntsList->count();
-
-  myRmPntsBtn->setEnabled(aNbItems > 0);
-  myInsertPntsBtn->setEnabled(aCount == 0 || aNbItems == 1);
-}
-
-//=======================================================================
-// function: editPnt
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::editPnt(QListWidgetItem *theItem)
-{
-  if (theItem != NULL) {
-    if (myPntEditDlg == NULL) {
-      // Create the dialog.
-      myPntEditDlg = new CurveCreator_EditPntDlg(this, myDimension);
-    }
-
-    // Get coordinates.
-    CurveCreator_PointItem    *aPntItem = (CurveCreator_PointItem *)theItem;
-    CurveCreator::Coordinates  aPoint;
-
-    aPoint.push_back(aPntItem->getX());
-    aPoint.push_back(aPntItem->getY());
-
-    if (myDimension == CurveCreator::Dim3d) {
-      aPoint.push_back(aPntItem->getZ());
-    }
-
-    myPntEditDlg->setPoint(aPoint);
-
-    const int aResult = myPntEditDlg->exec();
-
-    if (aResult == QDialog::Accepted) {
-      // Get the section index.
-      const int aSectionIndex = getCurrentSectionIndex();
-
-      if (aSectionIndex >= 0) {
-        // Update the point.
-        const CurveCreator::Coordinates &aNewPoint = myPntEditDlg->getPoint();
-
-        if (myDimension == CurveCreator::Dim3d) {
-          aPntItem->setCoord(aNewPoint[0], aNewPoint[1], aNewPoint[2]);
-        } else {
-          aPntItem->setCoord(aNewPoint[0], aNewPoint[1]);
-        }
-
-        // Update curve
-        const int aPntIndex = myPntsList->row(theItem);
-
-        myEditor.setCoordinates(aNewPoint, aSectionIndex, aPntIndex);
-
-        // Update undo/redo buttons.
-        updateUndoRedoButtons();
-      }
-    }
-  }
-}
-
-//=======================================================================
-// function: pntsAdd
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::pntsAdd()
-{
-  const CurveCreator::Coordinates &aNewPoints = myEditPnts->getPoints();
-  const int                        aNbCoords  = aNewPoints.size();
-
-  if (aNbCoords > 0 && aNbCoords % myDimension == 0) {
-    // Get the section index.
-    const int aSectionIndex = getCurrentSectionIndex();
-
-    if (aSectionIndex >= 0) {
-      // Update list.
-      int i = 0;
-
-      while (i < aNbCoords) {
-        const CurveCreator::TypeCoord aX = aNewPoints[i++];
-        const CurveCreator::TypeCoord aY = aNewPoints[i++];
-
-        if (myDimension == CurveCreator::Dim3d) {
-          const CurveCreator::TypeCoord aZ = aNewPoints[i++];
-
-          new CurveCreator_PointItem(aX, aY, aZ, myPntsList);
-        } else {
-          new CurveCreator_PointItem(aX, aY, myPntsList);
-        }
-      }
-
-      // Update curve
-      myEditor.addPoints(aNewPoints, aSectionIndex);
-      emit numberOfItemsChanged(myPntsList);
-
-      // Update undo/redo buttons.
-      updateUndoRedoButtons();
-    }
-  }
-}
-
-//=======================================================================
-// function: pntsInsert
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::pntsInsert()
-{
-  const CurveCreator::Coordinates &aNewPoints = myEditPnts->getPoints();
-  const int                        aNbCoords  = aNewPoints.size();
-
-  if (aNbCoords > 0 && aNbCoords % myDimension == 0) {
-    // Get the section index.
-    const int aSectionIndex = getCurrentSectionIndex();
-
-    if (aSectionIndex >= 0) {
-      // Get the selected point index.
-      int aPntIndex = -1;
-      QList<QListWidgetItem *> aListPnts = myPntsList->selectedItems();
-
-      if (aListPnts.size() == 1) {
-        aPntIndex = myPntsList->row(aListPnts.first());
-      }
-
-      // Update list.
-      int i = 0;
-      int aRow = aPntIndex;
-
-      while (i < aNbCoords) {
-        const CurveCreator::TypeCoord  aX       = aNewPoints[i++];
-        const CurveCreator::TypeCoord  aY       = aNewPoints[i++];
-        CurveCreator_PointItem        *aNewItem = NULL;
-
-        if (myDimension == CurveCreator::Dim3d) {
-          const CurveCreator::TypeCoord aZ = aNewPoints[i++];
-
-          aNewItem = new CurveCreator_PointItem(aX, aY, aZ);
-        } else {
-          aNewItem = new CurveCreator_PointItem(aX, aY);
-        }
-
-
-        if (aPntIndex < 0) {
-          // Append point.
-          myPntsList->addItem(aNewItem);
-        } else {
-          // Insert point.
-          myPntsList->insertItem(aRow++, aNewItem);
-        }
-      }
-
-      // Update curve
-      myEditor.insertPoints(aNewPoints, aSectionIndex, aPntIndex);
-      emit numberOfItemsChanged(myPntsList);
-
-      // Update undo/redo buttons.
-      updateUndoRedoButtons();
-    }
-  }
-}
-
-//=======================================================================
-// function: pntsRemove
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::pntsRemove()
-{
-  QList<QListWidgetItem *> aListItems    = myPntsList->selectedItems();
-  const int                aSectionIndex = getCurrentSectionIndex();
-
-  if (aSectionIndex >= 0 && aListItems.size() > 0) {
-    QList<int> aListRows;
-
-    // Get items rows.
-    foreach(QListWidgetItem *anItem, aListItems) {
-      aListRows.append(myPntsList->row(anItem));
-    }
-
-    // Delete items.
-    foreach(QListWidgetItem *anItem, aListItems) {
-      delete anItem;
-    }
-
-    qSort(aListRows);
-
-    // Delete points from curve.
-    const int aNbPnts   = aListRows.size();
-    int       aNbPntsRm = 1;
-    int       aCurRow   = aListRows.last();
-    int       i;
-
-    for (i = aNbPnts - 2; i >= 0; i--) {
-      if (aListRows[i] == aCurRow - 1) {
-        // This is the previous index.
-        aCurRow--;
-        aNbPntsRm++;
-      } else {
-        // This is not the previous index. Remove the current chain of points.
-        myEditor.removePoints(aSectionIndex, aCurRow, aNbPntsRm);
-        aCurRow   = aListRows[i];
-        aNbPntsRm = 1;
-      }
-    }
-
-    // Remove last points.
-    myEditor.removePoints(aSectionIndex, aCurRow, aNbPntsRm);
-
-    emit numberOfItemsChanged(myPntsList);
-
-    // Set the new selection.
-    int aRow = aListRows.first();
-
-    if (aRow >= myPntsList->count()) {
-      aRow = myPntsList->count() - 1;
-    }
-
-    if (aRow >= 0) {
-      myPntsList->item(aRow)->setSelected(true);
-    }
-
-    // Update undo/redo buttons.
-    updateUndoRedoButtons();
-  }
-}
-
-//=======================================================================
-// function: undo
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::undo()
-{
-  if (myEditor.getNbUndo() > 0) {
-    // Perform undo
-    myEditor.undo();
-
-    // Reinitialize required widgets.
-    updateUndoRedo();
-  }
-}
-
-//=======================================================================
-// function: redo
-// purpose:
-//=======================================================================
-void CurveCreator_Widget::redo()
-{
-  if (myEditor.getNbRedo() > 0) {
-    // Perform undo
-    myEditor.redo();
-
-    // Reinitialize required widgets.
-    updateUndoRedo();
-  }
-}
+#include "CurveCreator_NewPointDlg.h"\r
+#include "CurveCreator_NewSectionDlg.h"\r
+#include "CurveCreator_TreeView.h"\r
+#include "CurveCreator_Widget.h"\r
+\r
+#include "CurveCreator.hxx"\r
+#include "CurveCreator_Curve.hxx"\r
+#include "CurveCreator_CurveEditor.hxx"\r
+\r
+#include <SUIT_Session.h>\r
+#include <SUIT_ResourceMgr.h>\r
+\r
+#include <QHBoxLayout>\r
+#include <QVBoxLayout>\r
+#include <QLabel>\r
+#include <QLineEdit>\r
+#include <QGroupBox>\r
+#include <QToolButton>\r
+#include <QToolBar>\r
+#include <QAction>\r
+#include <QMenu>\r
+#include <QPixmap>\r
+\r
+CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,\r
+                      CurveCreator_Curve *theCurve,\r
+                      Qt::WindowFlags fl ) :\r
+    QWidget(parent), myNewPointEditor(NULL)\r
+{\r
+    myCurve = theCurve;        \r
+    myEdit = new CurveCreator_CurveEditor( myCurve );\r
+\r
+    myNewPointEditor = new CurveCreator_NewPointDlg(myCurve->getDimension(), this);\r
+    connect( myNewPointEditor, SIGNAL(addPoint()), this, SLOT(onAddNewPoint()));\r
+\r
+    myNewSectionEditor = new CurveCreator_NewSectionDlg(this);\r
+    connect( myNewSectionEditor, SIGNAL(addSection()), this, SLOT(onAddNewSection()));\r
+\r
+/*    QHBoxLayout* aNameLayout = new QHBoxLayout();\r
+    QLabel* aNameLabel = new QLabel(tr("CURVE_NAME_TLT"), this);\r
+    aNameLayout->addWidget(aNameLabel);\r
+    QLineEdit* aNameEdit = new QLineEdit(this);\r
+    aNameLayout->addWidget(aNameEdit); */\r
+\r
+    QGroupBox* aSectionGroup = new QGroupBox(tr("SECTION_GROUP_TLT"),this);\r
+\r
+    mySectionView = new CurveCreator_TreeView(myCurve, aSectionGroup);\r
+    connect( mySectionView, SIGNAL(selectionChanged()), this, SLOT( onSelectionChanged() ) );\r
+    connect( mySectionView, SIGNAL(pointEntered(int,int)), this, SLOT(onEditPoint(int,int)) );\r
+    connect( mySectionView, SIGNAL(sectionEntered(int)), this, SLOT(onEditSection(int)) );\r
+    connect( mySectionView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onContextMenu(QPoint)) );\r
+    QToolBar* aTB = new QToolBar(tr("TOOL_BAR_TLT"), aSectionGroup);\r
+//    QToolButton* anUndoBtn = new QToolButton(aTB);\r
+\r
+    QPixmap anUndoImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_UNDO")));\r
+    QAction* anAct = createAction( UNDO_ID, tr("UNDO"), anUndoImage, tr("UNDO_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Z) );\r
+    aTB->addAction(anAct);\r
+\r
+    QPixmap aRedoImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_REDO")));\r
+    anAct = createAction( REDO_ID, tr("REDO"), aRedoImage, tr("REDO_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Y) );\r
+    aTB->addAction(anAct);\r
+\r
+    aTB->addSeparator();\r
+\r
+    QPixmap aNewSectImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_NEW_SECTION")));\r
+    anAct = createAction( NEW_SECTION_ID, tr("NEW_SECTION"), aNewSectImage, tr("NEW_SECTION_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_N) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onNewSection()) );\r
+    aTB->addAction(anAct);\r
+\r
+    anAct = createAction( INSERT_SECTION_BEFORE_ID, tr("INSERT_SECTION_BEFORE"), QPixmap(), tr("INSERT_SECTION_BEFORE_TLT"),\r
+                          QKeySequence(Qt::ControlModifier | Qt::Key_Insert ) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onInsertSectionBefore()) );\r
+\r
+    anAct = createAction( INSERT_SECTION_AFTER_ID, tr("INSERT_SECTION_AFTER"), QPixmap(), tr("INSERT_SECTION_AFTER_TLT"),\r
+                          QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Insert ) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onInsertSectionAfter()) );\r
+\r
+    QPixmap aNewPointImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_NEW_POINT")));\r
+    anAct = createAction( NEW_POINT_ID, tr("NEW_POINT"), aNewPointImage, tr("NEW_POINT_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_P) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onNewPoint()) );\r
+    aTB->addAction(anAct);\r
+    aTB->addSeparator();\r
+\r
+    anAct = createAction( INSERT_POINT_BEFORE_ID, tr("INSERT_POINT_BEFORE"), QPixmap(), tr("INSERT_POINT_BEFORE_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_B) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onInsertPointBefore()) );\r
+\r
+    anAct = createAction( INSERT_POINT_AFTER_ID, tr("INSERT_POINT_AFTER"), QPixmap(), tr("INSERT_POINT_AFTER_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_M) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onInsertPointAfter()) );\r
+\r
+    anAct = createAction( CLOSE_SECTIONS_ID, tr("CLOSE_SECTIONS"), QPixmap(), tr("CLOSE_SECTIONS_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_W) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onCloseSections()) );\r
+\r
+    anAct = createAction( UNCLOSE_SECTIONS_ID, tr("UNCLOSE_SECTIONS"), QPixmap(), tr("UNCLOSE_SECTIONS_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_S) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onUncloseSections()) );\r
+\r
+    QPixmap aPolylineImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_POLYLINE")));\r
+    anAct = createAction( SET_SECTIONS_POLYLINE_ID, tr("SET_SECTIONS_POLYLINE"), aPolylineImage, tr("SET_POLYLINE_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_E) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onSetPolyline()) );\r
+\r
+    QPixmap aSplineImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_SPLINE")));\r
+    anAct = createAction( SET_SECTIONS_SPLINE_ID, tr("SET_SECTIONS_SPLINE"), aSplineImage, tr("SET_SPLINE_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_R) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onSetSpline()) );\r
+\r
+    QPixmap aRemoveImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_DELETE")));\r
+    anAct = createAction( REMOVE_ID, tr("REMOVE"), aRemoveImage, tr("REMOVE_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Delete ) );\r
+    connect(anAct, SIGNAL(triggered()), this, SLOT(onRemove()) );\r
+    aTB->addAction(anAct);\r
+    aTB->addSeparator();\r
+\r
+    QPixmap aJoinImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_JOIN")));\r
+    anAct = createAction( JOIN_ID, tr("JOIN"), aJoinImage, tr("JOIN_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Plus ) );\r
+    connect( anAct, SIGNAL(triggered()), this, SLOT(onJoin()) );\r
+    aTB->addAction(anAct);\r
+    aTB->addSeparator();\r
+\r
+    QPixmap aStepUpImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_ARROW_UP")));\r
+    anAct = createAction( UP_ID, tr("STEP_UP"), aStepUpImage, tr("STEP_UP_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Up ) );\r
+    connect( anAct, SIGNAL(triggered()), this, SLOT(onMoveUp()) );\r
+    aTB->addAction(anAct);\r
+\r
+    QPixmap aStepDownImage(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_CC_ARROW_DOWN")));\r
+    anAct = createAction( DOWN_ID, tr("STEP_DOWN"), aStepDownImage, tr("STEP_DOWN_TLT"), QKeySequence(Qt::ControlModifier|Qt::Key_Down ) );\r
+    connect( anAct, SIGNAL(triggered()), this, SLOT(onMoveDown()) );\r
+    aTB->addAction(anAct);\r
+\r
+    anAct = createAction( CLEAR_ALL_ID, tr("CLEAR_ALL"), QPixmap(), tr("CLEAR_ALL_TLT"), QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Delete ) );\r
+    connect( anAct, SIGNAL(triggered()), this, SLOT( onClearAll()) );\r
+\r
+    anAct = createAction( JOIN_ALL_ID, tr("JOIN_ALL"), QPixmap(), tr("JOIN_ALL_TLT"), QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_Plus ) );\r
+    connect( anAct, SIGNAL(triggered()), this, SLOT(onJoinAll()) );\r
+\r
+    QVBoxLayout* aSectLayout = new QVBoxLayout();\r
+    aSectLayout->addWidget(aTB);\r
+    aSectLayout->addWidget(mySectionView);\r
+    aSectionGroup->setLayout(aSectLayout);\r
+    QVBoxLayout* aLay = new QVBoxLayout();\r
+//    aLay->addLayout(aNameLayout);\r
+    aLay->addWidget(aSectionGroup);\r
+    setLayout(aLay);\r
+    onSelectionChanged();\r
+}\r
+\r
+void CurveCreator_Widget::onSelectionChanged()\r
+{\r
+    QList<ActionId> anEnabledAct;\r
+    anEnabledAct << NEW_SECTION_ID;\r
+    int aSectCnt = myCurve->getNbPoints();\r
+    if( aSectCnt > 0 )\r
+        anEnabledAct << CLEAR_ALL_ID;\r
+    if( aSectCnt > 1 )\r
+        anEnabledAct << JOIN_ALL_ID;\r
+    QList<int> aSelSections = mySectionView->getSelectedSections();\r
+    QList< QPair< int, int > > aSelPoints = mySectionView->getSelectedPoints();\r
+    CurveCreator_TreeView::SelectionType aSelType = mySectionView->getSelectionType();\r
+    switch( aSelType ){\r
+    case CurveCreator_TreeView::ST_NOSEL:{\r
+        break;\r
+    }\r
+    case CurveCreator_TreeView::ST_SECTIONS:{\r
+        if( aSelSections.size() > 1 ){\r
+            anEnabledAct << JOIN_ID;\r
+        }\r
+        if( aSelSections[0] > 0 ){\r
+            anEnabledAct << UP_ID;\r
+        }\r
+        if( aSelSections.size() == 1 ){\r
+            anEnabledAct << NEW_POINT_ID << INSERT_SECTION_BEFORE_ID << INSERT_SECTION_AFTER_ID;\r
+        }\r
+        if( aSelSections[ aSelSections.size() - 1 ] < ( myCurve->getNbSections() - 1 ) ){\r
+            anEnabledAct << DOWN_ID;\r
+        }\r
+        anEnabledAct << CLOSE_SECTIONS_ID << UNCLOSE_SECTIONS_ID << SET_SECTIONS_POLYLINE_ID << SET_SECTIONS_SPLINE_ID;\r
+        break;\r
+    }\r
+    case CurveCreator_TreeView::ST_POINTS_ONE_SECTION:{\r
+        if( aSelPoints[0].second > 0 ){\r
+            anEnabledAct << UP_ID;\r
+        }\r
+        int aLastIndex = aSelPoints.size()-1;\r
+        int aSect = aSelPoints[0].first;\r
+        if( aSelPoints[aLastIndex].second < (myCurve->getNbPoints(aSect) - 1)){\r
+            anEnabledAct << DOWN_ID;\r
+        }\r
+        if( aSelPoints.size() == 1){\r
+            anEnabledAct << INSERT_POINT_BEFORE_ID << INSERT_POINT_AFTER_ID;\r
+        }\r
+        break;\r
+    }\r
+    }\r
+    int aSelObjsCnt = aSelPoints.size() + aSelSections.size();\r
+    if( aSelObjsCnt > 0 ){\r
+        anEnabledAct << REMOVE_ID;\r
+    }\r
+    if( myCurve->getNbSections() > 0 ){\r
+        anEnabledAct << REMOVE_ALL_ID;\r
+    }\r
+    if( myCurve->getNbSections() > 1 ){\r
+        anEnabledAct << JOIN_ALL_ID;\r
+    }\r
+    QList<ActionId> anIds = myActionMap.keys();\r
+    for( int i = 0 ; i < anIds.size() ; i++ ){\r
+        if( myActionMap.contains(anIds[i]) ){\r
+            if( anEnabledAct.contains(anIds[i]) ){\r
+                myActionMap[anIds[i]]->setEnabled(true);\r
+            }\r
+            else{\r
+                myActionMap[anIds[i]]->setEnabled(false);\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onNewPoint()\r
+{\r
+    mySection= -1;\r
+    myPointNum = -1;\r
+    QList<int> aSelSection = mySectionView->getSelectedSections();\r
+    if( aSelSection.size() > 0 ){\r
+        mySection = aSelSection[0];\r
+    }\r
+    else{\r
+        QList< QPair<int,int> > aSelPoints = mySectionView->getSelectedPoints();\r
+        if( aSelPoints.size() > 0 ){\r
+            mySection = aSelPoints[0].first;\r
+            myPointNum = aSelPoints[0].second + 1;\r
+        }\r
+    }\r
+    QString aSectName;\r
+    if( mySection < 0 ){\r
+        mySection = myCurve->getNbSections() - 1;\r
+    }\r
+    aSectName = QString::fromStdString( myCurve->getSectionName(mySection));\r
+    if( myPointNum < 0 ){\r
+        myPointNum = myCurve->getNbPoints(mySection);\r
+    }\r
+    myNewPointEditor->clear();\r
+    myNewPointEditor->setEditMode(false);\r
+    myNewPointEditor->setSectionName(aSectName);\r
+    if( myNewPointEditor->exec() == QDialog::Accepted ){\r
+        onAddNewPoint();\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onAddNewPoint()\r
+{\r
+    CurveCreator::Coordinates aCoords = myNewPointEditor->getCoordinates();\r
+    myEdit->insertPoints(aCoords, mySection, myPointNum );\r
+    mySectionView->pointsAdded( mySection, myPointNum );\r
+    myNewPointEditor->clear();\r
+    myPointNum++;\r
+}\r
+\r
+void CurveCreator_Widget::onNewSection()\r
+{\r
+    myNewSectionEditor->clear();\r
+    myNewSectionEditor->setEditMode(false);\r
+    QString aSectName = QString( myCurve->getUnicSectionName().c_str() );\r
+    myNewSectionEditor->setSectionParameters(aSectName, true, CurveCreator::Polyline );\r
+    if( myNewSectionEditor->exec() == QDialog::Accepted ){\r
+        onAddNewSection();\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onAddNewSection()\r
+{\r
+    CurveCreator::Coordinates aCoords;\r
+    myEdit->addSection( myNewSectionEditor->getName().toStdString(), myNewSectionEditor->getSectionType(),\r
+                        myNewSectionEditor->isClosed(), aCoords  );\r
+    mySectionView->sectionAdded( mySection );\r
+    QString aNewName = QString(myCurve->getUnicSectionName().c_str());\r
+    myNewSectionEditor->setSectionName(aNewName);\r
+    mySection++;\r
+}\r
+\r
+QAction* CurveCreator_Widget::createAction( ActionId theId, const QString& theName, \r
+                                            const QPixmap& theImage, const QString& theToolTip, \r
+                                            const QKeySequence& theShortcut )\r
+{\r
+    QAction* anAct = new QAction(theName,this);\r
+    if( !theImage.isNull() ){\r
+        anAct->setIcon(theImage);\r
+    }\r
+    anAct->setShortcut(theShortcut);\r
+    anAct->setToolTip(theToolTip);\r
+    myActionMap[theId] = anAct;\r
+    return anAct;\r
+}\r
+\r
+QAction* CurveCreator_Widget::getAction(ActionId theId)\r
+{\r
+    if( myActionMap.contains(theId) )\r
+        return myActionMap[theId];\r
+    return NULL;\r
+}\r
+\r
+void CurveCreator_Widget::onEditSection( int theSection )\r
+{\r
+    mySection = theSection;\r
+    QString aSectName = QString::fromStdString( myCurve->getSectionName(theSection));\r
+    bool isClosed = myCurve->isClosed(theSection);\r
+    CurveCreator::Type aType = myCurve->getType(theSection);\r
+    myNewSectionEditor->setEditMode(true);\r
+    myNewSectionEditor->setSectionParameters( aSectName, isClosed, aType );\r
+    if( myNewSectionEditor->exec() == QDialog::Accepted ){\r
+        QString aName = myNewSectionEditor->getName();\r
+        bool    isClosed = myNewSectionEditor->isClosed();\r
+        CurveCreator::Type aSectType = myNewSectionEditor->getSectionType();\r
+        myEdit->setClosed( isClosed, mySection );\r
+        myEdit->setName( aName.toStdString(), mySection );\r
+        myEdit->setType( aSectType, mySection );\r
+        mySectionView->sectionChanged(mySection);\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onEditPoint( int theSection, int thePoint )\r
+{\r
+    if( !myNewPointEditor ){\r
+    }\r
+    QString aSectName = QString::fromStdString( myCurve->getSectionName(theSection));\r
+    myNewPointEditor->setEditMode(true);\r
+    myNewPointEditor->setSectionName(aSectName);\r
+    CurveCreator::Coordinates aCoords = myCurve->getCoordinates(theSection,thePoint);\r
+    myNewPointEditor->setCoordinates(aCoords);\r
+    if( myNewPointEditor->exec() == QDialog::Accepted ){\r
+        aCoords = myNewPointEditor->getCoordinates();\r
+        myEdit->setCoordinates(aCoords, theSection, thePoint);\r
+        mySectionView->pointDataChanged(theSection, thePoint );\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onJoin()\r
+{\r
+    QList<int> aSections = mySectionView->getSelectedSections();\r
+    if( aSections.size() == 0 ){\r
+        return;\r
+    }\r
+    int aMainSect = aSections[0];\r
+    int aMainSectSize = myCurve->getNbPoints(aMainSect);\r
+    for( int i = 1 ; i < aSections.size() ; i++ ){\r
+        int aSectNum = aSections[i] - (i-1);\r
+        myEdit->join( aMainSect, aSectNum );\r
+        mySectionView->sectionsRemoved( aSectNum );\r
+    }\r
+    int aNewSectSize = myCurve->getNbPoints(aMainSect);\r
+    if( aNewSectSize != aMainSectSize )\r
+        mySectionView->pointsAdded( aMainSect, aMainSectSize, aNewSectSize-aMainSectSize );\r
+}\r
+\r
+void CurveCreator_Widget::onRemove()\r
+{\r
+    QList< QPair<int,int> > aSelPoints = mySectionView->getSelectedPoints();\r
+    int aCurrSect=-1;\r
+    int aRemoveCnt = 0;\r
+    for( int i = 0 ; i < aSelPoints.size() ; i++ ){\r
+        if( aCurrSect != aSelPoints[i].first ){\r
+            aRemoveCnt = 0;\r
+            aCurrSect = aSelPoints[i].first;\r
+        }\r
+        int aPntIndx = aSelPoints[i].second - aRemoveCnt;\r
+        myEdit->removePoints(aCurrSect,aPntIndx, 1);\r
+        mySectionView->pointsRemoved( aCurrSect, aPntIndx );\r
+        aRemoveCnt++;\r
+    }\r
+    QList<int> aSections = mySectionView->getSelectedSections();\r
+    for( int i = 0 ; i < aSections.size() ; i++ ){\r
+        int aSectNum = aSections[i] - (i);\r
+        myEdit->removeSection( aSectNum );\r
+        mySectionView->sectionsRemoved( aSectNum );\r
+    }\r
+    mySectionView->clearSelection();\r
+}\r
+\r
+void CurveCreator_Widget::onMoveUp()\r
+{\r
+    if( mySectionView->getSelectionType() == CurveCreator_TreeView::ST_SECTIONS ){\r
+//Move sections\r
+        QList<int> aSections = mySectionView->getSelectedSections();\r
+        for( int i = 0 ; i < aSections.size() ; i++ ){\r
+            int anIndx = aSections[i];\r
+            myEdit->moveSection( anIndx, anIndx-1);\r
+            mySectionView->sectionsSwapped( anIndx, -1 );\r
+        }\r
+    }\r
+    else{\r
+//Move points\r
+        QList< QPair<int,int> > aPoints = mySectionView->getSelectedPoints();\r
+        for( int i = 0 ; i < aPoints.size() ; i++ ){\r
+            int aSection = aPoints[i].first;\r
+            int aPoint = aPoints[i].second;\r
+            myEdit->movePoint(aSection, aPoint, aPoint-2);\r
+            mySectionView->pointsSwapped( aSection, aPoint, -1 );\r
+        }\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onMoveDown()\r
+{\r
+    if( mySectionView->getSelectionType() == CurveCreator_TreeView::ST_SECTIONS ){\r
+//Move sections\r
+        QList<int> aSections = mySectionView->getSelectedSections();\r
+        for( int i = aSections.size()-1 ; i >=0 ; i-- ){\r
+            int anIndx = aSections[i];\r
+            myEdit->moveSection( anIndx, anIndx+1);\r
+            mySectionView->sectionsSwapped( anIndx, 1 );\r
+        }\r
+    }\r
+    else{\r
+//Move points\r
+        QList< QPair<int,int> > aPoints = mySectionView->getSelectedPoints();\r
+        for( int i = aPoints.size() - 1; i >= 0 ; i--  ){\r
+            int aSection = aPoints[i].first;\r
+            int aPoint = aPoints[i].second;\r
+            myEdit->movePoint(aSection, aPoint, aPoint+1);\r
+            mySectionView->pointsSwapped( aSection, aPoint, 1 );\r
+        }\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onClearAll()\r
+{\r
+    myEdit->clear();\r
+    mySectionView->reset();\r
+    onSelectionChanged();\r
+}\r
+\r
+void CurveCreator_Widget::onJoinAll()\r
+{\r
+    myEdit->join();\r
+    mySectionView->reset();\r
+    onSelectionChanged();\r
+}\r
+\r
+void CurveCreator_Widget::onInsertSectionBefore()\r
+{\r
+\r
+}\r
+\r
+void CurveCreator_Widget::onInsertSectionAfter()\r
+{\r
+\r
+}\r
+\r
+void CurveCreator_Widget::onInsertPointBefore()\r
+{\r
+\r
+}\r
+\r
+void CurveCreator_Widget::onInsertPointAfter()\r
+{\r
+\r
+}\r
+\r
+void CurveCreator_Widget::onUndoSettings()\r
+{\r
+\r
+}\r
+\r
+void CurveCreator_Widget::onSetSpline()\r
+{\r
+    QList<int> aSelSections = mySectionView->getSelectedSections();\r
+    for( int i = 0 ; i < aSelSections.size() ; i++ ){\r
+        myEdit->setType(CurveCreator::BSpline, aSelSections[i]);\r
+        mySectionView->sectionChanged(aSelSections[i]);\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onSetPolyline()\r
+{\r
+    QList<int> aSelSections = mySectionView->getSelectedSections();\r
+    for( int i = 0 ; i < aSelSections.size() ; i++ ){\r
+        myEdit->setType(CurveCreator::Polyline, aSelSections[i]);\r
+        mySectionView->sectionChanged(aSelSections[i]);\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onCloseSections()\r
+{\r
+    QList<int> aSelSections = mySectionView->getSelectedSections();\r
+    for( int i = 0 ; i < aSelSections.size() ; i++ ){\r
+        myEdit->setClosed(true, aSelSections[i]);\r
+        mySectionView->sectionChanged(aSelSections[i]);\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onUncloseSections()\r
+{\r
+    QList<int> aSelSections = mySectionView->getSelectedSections();\r
+    for( int i = 0 ; i < aSelSections.size() ; i++ ){\r
+        myEdit->setClosed(false, aSelSections[i]);\r
+        mySectionView->sectionChanged(aSelSections[i]);\r
+    }\r
+}\r
+\r
+void CurveCreator_Widget::onContextMenu( QPoint thePoint )\r
+{\r
+    QList<ActionId> aContextActions;\r
+    aContextActions << CLEAR_ALL_ID << JOIN_ALL_ID << SEPARATOR_ID <<\r
+                       INSERT_SECTION_BEFORE_ID << INSERT_SECTION_AFTER_ID << SEPARATOR_ID <<\r
+                       CLOSE_SECTIONS_ID << UNCLOSE_SECTIONS_ID << SET_SECTIONS_POLYLINE_ID <<\r
+                       SET_SECTIONS_SPLINE_ID << SEPARATOR_ID <<\r
+                       INSERT_POINT_BEFORE_ID << INSERT_POINT_AFTER_ID;\r
+    QPoint aGlPoint = mySectionView->mapToGlobal(thePoint);\r
+    bool isVis = false;\r
+    QList<ActionId> aResAct;\r
+    for( int i = 0 ; i < aContextActions.size() ; i++ ){\r
+        if( aContextActions[i] != SEPARATOR_ID ){\r
+            if( myActionMap.contains(aContextActions[i]) ){\r
+                QAction* anAct = myActionMap[aContextActions[i]];\r
+                if( anAct->isEnabled() ){\r
+                    aResAct << aContextActions[i];\r
+                    isVis = true;\r
+                }\r
+            }\r
+        }\r
+        else{\r
+            aResAct << SEPARATOR_ID;\r
+        }\r
+    }\r
+    if( !isVis )\r
+        return;\r
+\r
+    QMenu* aMenu = new QMenu(this);\r
+    for( int i = 0 ; i < aResAct.size() ; i++ ){\r
+        if( aResAct[i] == SEPARATOR_ID ){\r
+            aMenu->addSeparator();\r
+        }\r
+        else{\r
+            QAction* anAct = myActionMap[aResAct[i]];\r
+            aMenu->insertAction(NULL, anAct);\r
+        }\r
+    }\r
+    aMenu->exec(aGlPoint);\r
+}\r