Salome HOME
#refs 76 - reported by Hervé Legrand: Edit Sketch as Constructions child - crash
[modules/shaper.git] / src / XGUI / XGUI_ViewWindow.cpp
index cf6bcc6d16be08e646840b10012325acfac18f72..7c0bc5d9ac14c8c9e225178db90b52ae4344bf63 100644 (file)
@@ -1,6 +1,8 @@
 #include "XGUI_ViewWindow.h"
 #include "XGUI_ViewPort.h"
 #include "XGUI_Viewer.h"
+#include "XGUI_Tools.h"
+#include "XGUI_RubberBand.h"
 
 #include <QLayout>
 #include <QLabel>
 #include <QMdiArea>
 #include <QMdiSubWindow>
 #include <QPainter>
-#include <QTime>
+#include <QTimer>
+#include <QFileDialog>
+#include <QStyleOptionToolBar>
+
+#include <TopoDS_Shape.hxx>
+#include <BRep_Tool.hxx>
+#include <TopoDS.hxx>
+#include <Visual3d_View.hxx>
 
 #define BORDER_SIZE 2
 
+const char* imageZoomCursor[] = { "32 32 3 1", ". c None", "a c #000000", "# c #ffffff",
+    "................................", "................................",
+    ".#######........................", "..aaaaaaa.......................",
+    "................................", ".............#####..............",
+    "...........##.aaaa##............", "..........#.aa.....a#...........",
+    ".........#.a.........#..........", ".........#a..........#a.........",
+    "........#.a...........#.........", "........#a............#a........",
+    "........#a............#a........", "........#a............#a........",
+    "........#a............#a........", ".........#...........#.a........",
+    ".........#a..........#a.........", ".........##.........#.a.........",
+    "........#####.....##.a..........", ".......###aaa#####.aa...........",
+    "......###aa...aaaaa.......#.....", ".....###aa................#a....",
+    "....###aa.................#a....", "...###aa...............#######..",
+    "....#aa.................aa#aaaa.", ".....a....................#a....",
+    "..........................#a....", "...........................a....",
+    "................................", "................................",
+    "................................", "................................" };
 
-//**************************************************************************
-void ViewerToolbar::paintEvent( QPaintEvent* theEvent)
+const char* imageRotateCursor[] = { "32 32 3 1", ". c None", "a c #000000", "# c #ffffff",
+    "................................", "................................",
+    "................................", "................................",
+    "........#.......................", ".......#.a......................",
+    "......#######...................", ".......#aaaaa#####..............",
+    "........#..##.a#aa##........##..", ".........a#.aa..#..a#.....##.aa.",
+    ".........#.a.....#...#..##.aa...", ".........#a.......#..###.aa.....",
+    "........#.a.......#a..#aa.......", "........#a.........#..#a........",
+    "........#a.........#a.#a........", "........#a.........#a.#a........",
+    "........#a.........#a.#a........", ".........#.........#a#.a........",
+    "........##a........#a#a.........", "......##.a#.......#.#.a.........",
+    "....##.aa..##.....##.a..........", "..##.aa.....a#####.aa...........",
+    "...aa.........aaa#a.............", "................#.a.............",
+    "...............#.a..............", "..............#.a...............",
+    "...............a................", "................................",
+    "................................", "................................",
+    "................................", "................................" };
+
+const char* imageCrossCursor[] = { "32 32 3 1", ". c None", "a c #000000", "# c #ffffff",
+    "................................", "................................",
+    "................................", "................................",
+    "................................", "................................",
+    "................................", "...............#................",
+    "...............#a...............", "...............#a...............",
+    "...............#a...............", "...............#a...............",
+    "...............#a...............", "...............#a...............",
+    "...............#a...............", ".......#################........",
+    "........aaaaaaa#aaaaaaaaa.......", "...............#a...............",
+    "...............#a...............", "...............#a...............",
+    "...............#a...............", "...............#a...............",
+    "...............#a...............", "...............#a...............",
+    "................a...............", "................................",
+    "................................", "................................",
+    "................................", "................................",
+    "................................", "................................" };
+
+
+ViewerToolbar::ViewerToolbar(QWidget* theParent, XGUI_ViewPort* thePort)
+  : QToolBar(theParent), myVPort(thePort), myResize(false)
+{
+  connect(myVPort, SIGNAL(resized()), this, SLOT(onViewPortResized()));
+}
+
+void ViewerToolbar::paintEvent(QPaintEvent* theEvent)
 {
-    QTime aTime;
-    aTime.start();
-    QRect aRect = rect();
-    QRect aVPRect = myVPort->rect();
-    QPoint aGlobPnt = mapToGlobal(aRect.topLeft());
-    QPoint aPnt = myVPort->mapFromGlobal(aGlobPnt);
+  //QToolBar::paintEvent(theEvent);
+  // Paint background
+  QPainter aPainter(this);
+  QRect aRect = rect();
+  QRect aVPRect = myVPort->rect();
+  QPoint aGlobPnt = mapToGlobal(aRect.topLeft());
+  QPoint aPnt = myVPort->mapFromGlobal(aGlobPnt);
 
-    QRect aImgRect(QRect(aPnt.x(), aPnt.y() + aVPRect.height() - aRect.height(), aRect.width(), aRect.height()));
-    QPainter(this).drawImage(aRect, myVPort->dumpView(aImgRect, false));
-    QString aMsg = QString("### Painted in %1").arg(aTime.elapsed());
-    qDebug(qPrintable(aMsg));
+  QRect aImgRect(QRect(aPnt.x(), aPnt.y() + aVPRect.height() - aRect.height(),
+                       aRect.width(), aRect.height()));
+  QImage aImg = myVPort->dumpView(aImgRect, myResize);
+  if (!aImg.isNull())
+    aPainter.drawImage(aRect, aImg);
+  myResize = false;
+
+  // Paint foreground
+  QStyle *style = this->style();
+  QStyleOptionToolBar aOpt;
+  initStyleOption(&aOpt);
+
+  aOpt.rect = style->subElementRect(QStyle::SE_ToolBarHandle, &aOpt, this);
+  if (aOpt.rect.isValid())
+    style->drawPrimitive(QStyle::PE_IndicatorToolBarHandle, &aOpt, &aPainter, this);
 }
 
+
+
 //**************************************************************************
-void ViewerLabel::paintEvent( QPaintEvent* theEvent)
+ViewerLabel::ViewerLabel(QWidget* theParent, XGUI_ViewPort* thePort)
+  : QLabel(theParent), myVPort(thePort), myResize(false)
+{
+  connect(myVPort, SIGNAL(resized()), this, SLOT(onViewPortResized()));
+}
+
+void ViewerLabel::paintEvent(QPaintEvent* theEvent)
 {
-    QRect aRect = rect();
-    QRect aVPRect = myVPort->rect();
-    QPoint aGlobPnt = mapToGlobal(aRect.topLeft());
-    QPoint aPnt = myVPort->mapFromGlobal(aGlobPnt);
+  QRect aRect = rect();
+  QRect aVPRect = myVPort->rect();
+  QPoint aGlobPnt = mapToGlobal(aRect.topLeft());
+  QPoint aPnt = myVPort->mapFromGlobal(aGlobPnt);
 
-    QRect aImgRect(QRect(aPnt.x(), aPnt.y() + aVPRect.height() - aRect.height(), aRect.width(), aRect.height()));
-    QPainter(this).drawImage(aRect, myVPort->dumpView(aImgRect, false));
-    QLabel::paintEvent(theEvent);
+  QRect aImgRect(QRect(aPnt.x(), aPnt.y() + aVPRect.height() - aRect.height(), 
+                 aRect.width(), aRect.height()));
+  QImage aImg = myVPort->dumpView(aImgRect, myResize);
+  if (!aImg.isNull())
+    QPainter(this).drawImage(aRect, aImg);
+  myResize = false;
+  QLabel::paintEvent(theEvent);
 }
 
 //**************************************************************************
 //**************************************************************************
 //**************************************************************************
-XGUI_ViewWindow::XGUI_ViewWindow(XGUI_Viewer* theViewer, 
-                                 V3d_TypeOfView theType):
-QFrame(),
-    myViewer(theViewer),
-    myMoving(false),
-    MinimizeIco(":pictures/wnd_minimize.png"),
-    MaximizeIco(":pictures/wnd_maximize.png"),
-    CloseIco(":pictures/wnd_close.png"),
-    RestoreIco(":pictures/wnd_restore.png")
-{
-    setFrameStyle(QFrame::Raised);
-    setFrameShape(QFrame::Panel);
-    setLineWidth(BORDER_SIZE);
-    setMouseTracking(true);
-
-    QVBoxLayout* aLay = new QVBoxLayout(this);
-    aLay->setContentsMargins(BORDER_SIZE,BORDER_SIZE,BORDER_SIZE,BORDER_SIZE);
-    myViewPort = new XGUI_ViewPort(this, myViewer->v3dViewer(), theType);
-    aLay->addWidget(myViewPort);
-
-    myPicture = new QLabel();
-    myPicture->setFrameStyle(QFrame::Sunken);
-    myPicture->setFrameShape(QFrame::Panel);
-    myPicture->setMouseTracking(true);
-    myPicture->installEventFilter(this);
-    myPicture->hide();
-
-    QStringList aPictures;
-    aPictures<<":pictures/occ_view_camera_dump.png"<<":pictures/occ_view_style_switch.png";
-    aPictures<<":pictures/occ_view_triedre.png"<<":pictures/occ_view_fitall.png";
-    aPictures<<":pictures/occ_view_fitarea.png"<<":pictures/occ_view_zoom.png";
-    aPictures<<":pictures/occ_view_pan.png"<<":pictures/occ_view_glpan.png";
-    aPictures<<":pictures/occ_view_rotate.png"<<":pictures/occ_view_front.png";
-    aPictures<<":pictures/occ_view_back.png"<<":pictures/occ_view_left.png";
-    aPictures<<":pictures/occ_view_right.png"<<":pictures/occ_view_top.png";
-    aPictures<<":pictures/occ_view_bottom.png"<<":pictures/occ_view_clone.png";
-
-    QStringList aTitles;
-    aTitles << "Dump view" << "Mouse style switch" << "Show trihedron" << "Fit all";
-    aTitles << "Fit area" << "Zoom" << "Panning" << "Global panning" << "Rotate";
-    aTitles << "Front" << "Back" << "Left" << "Right" << "Top" << "Bottom" << "Clone view";
-
-    myGripWgt = new ViewerLabel(this, myViewPort);
-    myGripWgt->setPixmap(QPixmap(":pictures/wnd_grip.png"));
-    myGripWgt->setGeometry(BORDER_SIZE + 2, BORDER_SIZE + 2, 19, 32);
-    myGripWgt->setMouseTracking(true);
-    myGripWgt->installEventFilter(this);
-
-    myViewBar = new ViewerToolbar(this, myViewPort);
-
-    QAction* aBtn;
-    for (int i = 0; i < aTitles.length(); i++) {
-        aBtn = new QAction(QIcon(aPictures.at(i)), aTitles.at(i), myViewBar);
-        myViewBar->addAction(aBtn);
-    }
+XGUI_ViewWindow::XGUI_ViewWindow(XGUI_Viewer* theViewer, V3d_TypeOfView theType)
+    : QFrame(), 
+    myViewer(theViewer), 
+    myMoving(false), 
+    MinimizeIco(":pictures/wnd_minimize.png"), 
+    MaximizeIco(":pictures/wnd_maximize.png"), 
+    CloseIco(":pictures/wnd_close.png"), 
+    RestoreIco(":pictures/wnd_restore.png"), 
+    myInteractionStyle(XGUI::STANDARD), 
+    myRectBand(0), 
+    myIsKeyFree(false), 
+    my2dMode(XGUI::No2dMode), 
+    myCurrPointType(XGUI::GRAVITY), 
+    myPrevPointType(XGUI::GRAVITY), 
+    myRotationPointSelection(false),
+    myClosable(true),
+    myStartX(0), myStartY(0), myCurrX(0), myCurrY(0), myCurScale(0.0), myCurSketch(0),
+    myDrawRect(false), myEnableDrawMode(false), myCursorIsHand(false), myEventStarted(false),
+    myIsActive(false),
+    myLastState(WindowNormalState), myOperation(NOTHING)
+{
+  mySelectedPoint = gp_Pnt(0., 0., 0.);
+  setFrameStyle(QFrame::Raised);
+  setFrameShape(QFrame::Panel);
+  setLineWidth(BORDER_SIZE);
+  setMouseTracking(true);
 
-    myWindowBar = new ViewerToolbar(this, myViewPort);
+  QVBoxLayout* aLay = new QVBoxLayout(this);
+  aLay->setContentsMargins(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE);
+  myViewPort = new XGUI_ViewPort(this, myViewer->v3dViewer(), theType);
+  myViewPort->installEventFilter(this);
+  myViewPort->setCursor(Qt::ArrowCursor);
+  aLay->addWidget(myViewPort);
 
-    myMinimizeBtn = new QAction(myWindowBar);
-    myMinimizeBtn->setIcon(MinimizeIco);
-    myWindowBar->addAction(myMinimizeBtn);
-    connect(myMinimizeBtn, SIGNAL(triggered()), SLOT(onMinimize()));
+  myPicture = new QLabel(this);
+  myPicture->setFrameStyle(QFrame::Sunken);
+  myPicture->setFrameShape(QFrame::Panel);
+  myPicture->setMouseTracking(true);
+  myPicture->installEventFilter(this);
+  aLay->addWidget(myPicture);
+  myPicture->hide();
 
-    myMaximizeBtn = new QAction(myWindowBar);
-    myMaximizeBtn->setIcon(MaximizeIco);
-    myWindowBar->addAction(myMaximizeBtn);
-    connect(myMaximizeBtn, SIGNAL(triggered()), SLOT(onMaximize()));
+  QVBoxLayout* aVPLay = new QVBoxLayout(myViewPort);
+  aVPLay->setMargin(0);
+  aVPLay->setSpacing(0);
+  aVPLay->setContentsMargins(0,0,0,0);
 
-    aBtn = new QAction(myWindowBar);
-    aBtn->setIcon(CloseIco);
-    myWindowBar->addAction(aBtn);
-    connect(aBtn, SIGNAL(triggered()), SLOT(onClose()));
+  QHBoxLayout* aToolLay = new QHBoxLayout();
+  aToolLay->setMargin(0);
+  aToolLay->setSpacing(0);
+  aToolLay->setContentsMargins(0,0,0,0);
+  aVPLay->addLayout(aToolLay);
+  aVPLay->addStretch(); 
 
-    myViewBar->hide();
-    myWindowBar->hide();
-    myGripWgt->hide();
+  myGripWgt = new ViewerLabel(this, myViewPort);
+  myGripWgt->setPixmap(QPixmap(":pictures/wnd_grip.png"));
+  myGripWgt->setMouseTracking(true);
+  myGripWgt->installEventFilter(this);
+  myGripWgt->setCursor(Qt::OpenHandCursor);
+  aToolLay->addWidget(myGripWgt);
+
+    // Create Viewer management buttons
+  myViewBar = new ViewerToolbar(this, myViewPort);
+  myViewBar->setCursor(Qt::PointingHandCursor);
+  aToolLay->addWidget(myViewBar); 
+  aToolLay->addStretch();
+
+  QAction* aBtn;
+
+  // Dump view
+  aBtn = new QAction(QIcon(":pictures/occ_view_camera_dump.png"), tr("Dump view"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(dumpView()));
+  myViewBar->addAction(aBtn);
+  // Fit all
+  aBtn = new QAction(QIcon(":pictures/occ_view_fitall.png"), tr("Fit all"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(fitAll()));
+  myViewBar->addAction(aBtn);
+  // Fit area
+  aBtn = new QAction(QIcon(":pictures/occ_view_fitarea.png"), tr("Fit area"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(activateWindowFit()));
+  myViewBar->addAction(aBtn);
+  // Zoom
+  aBtn = new QAction(QIcon(":pictures/occ_view_zoom.png"), tr("Zoom"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(activateZoom()));
+  myViewBar->addAction(aBtn);
+  // Pan
+  aBtn = new QAction(QIcon(":pictures/occ_view_pan.png"), tr("Panning"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(activatePanning()));
+  myViewBar->addAction(aBtn);
+  // Global Panning
+  aBtn = new QAction(QIcon(":pictures/occ_view_glpan.png"), tr("Global panning"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(activateGlobalPanning()));
+  myViewBar->addAction(aBtn);
+  // Rotation
+  aBtn = new QAction(QIcon(":pictures/occ_view_rotate.png"), tr("Rotate"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(activateRotation()));
+  myViewBar->addAction(aBtn);
+  // Reset
+  aBtn = new QAction(QIcon(":pictures/occ_view_reset.png"), tr("Reset"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(reset()));
+  myViewBar->addAction(aBtn);
+  // Front view
+  aBtn = new QAction(QIcon(":pictures/occ_view_front.png"), tr("Front"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(frontView()));
+  myViewBar->addAction(aBtn);
+  // Back view
+  aBtn = new QAction(QIcon(":pictures/occ_view_back.png"), tr("Back"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(backView()));
+  myViewBar->addAction(aBtn);
+  // Top view
+  aBtn = new QAction(QIcon(":pictures/occ_view_top.png"), tr("Top"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(topView()));
+  myViewBar->addAction(aBtn);
+  // Bottom view
+  aBtn = new QAction(QIcon(":pictures/occ_view_bottom.png"), tr("Bottom"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(bottomView()));
+  myViewBar->addAction(aBtn);
+  // Left view
+  aBtn = new QAction(QIcon(":pictures/occ_view_left.png"), tr("Left"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(leftView()));
+  myViewBar->addAction(aBtn);
+  // Right view
+  aBtn = new QAction(QIcon(":pictures/occ_view_right.png"), tr("Right"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(rightView()));
+  myViewBar->addAction(aBtn);
+  // Clone view
+  aBtn = new QAction(QIcon(":pictures/occ_view_clone.png"), tr("Clone"), myViewBar);
+  connect(aBtn, SIGNAL(triggered()), SLOT(cloneView()));
+  myViewBar->addAction(aBtn);
+
+    // Create Window management buttons
+  myWindowBar = new ViewerToolbar(this, myViewPort);
+  myWindowBar->setCursor(Qt::PointingHandCursor);
+  aToolLay->addWidget(myWindowBar);
+
+  myMinimizeBtn = new QAction(myWindowBar);
+  myMinimizeBtn->setIcon(MinimizeIco);
+  myWindowBar->addAction(myMinimizeBtn);
+  connect(myMinimizeBtn, SIGNAL(triggered()), SLOT(onMinimize()));
+
+  myMaximizeBtn = new QAction(myWindowBar);
+  myMaximizeBtn->setIcon(MaximizeIco);
+  myWindowBar->addAction(myMaximizeBtn);
+  connect(myMaximizeBtn, SIGNAL(triggered()), SLOT(onMaximize()));
+
+  aBtn = new QAction(myWindowBar);
+  aBtn->setIcon(CloseIco);
+  myWindowBar->addAction(aBtn);
+  connect(aBtn, SIGNAL(triggered()), SLOT(onClose()));
+
+  //Support copy of background on updating of viewer
+  connect(myViewPort, SIGNAL(vpTransformed()), this, SLOT(updateToolBar()));
+  connect(myViewPort, SIGNAL(vpUpdated()), this, SLOT(updateToolBar()));
+  connect(this, SIGNAL(vpTransformationFinished(XGUI_ViewWindow::OperationType)), 
+          this, SLOT(updateToolBar()));
 }
 
 //****************************************************************
@@ -131,152 +302,889 @@ XGUI_ViewWindow::~XGUI_ViewWindow()
 {
 }
 
+
 //****************************************************************
-void XGUI_ViewWindow::resizeEvent(QResizeEvent* theEvent)
+void XGUI_ViewWindow::showEvent(QShowEvent* theEvent)
 {
-    QSize aSize = theEvent->size();
-    QSize aWndBarSize = myWindowBar->sizeHint();
-    QSize myViewBarSize = myViewBar->sizeHint();
-
-    myWindowBar->move(aSize.width() - aWndBarSize.width() - BORDER_SIZE - 4, BORDER_SIZE + 2);
-    int aViewBarWidth = aSize.width() - aWndBarSize.width() - myGripWgt->width() - 8;
-    if (aViewBarWidth > myViewBarSize.width())
-        aViewBarWidth = myViewBarSize.width();
-    myViewBar->setGeometry(BORDER_SIZE + 18, BORDER_SIZE + 2, aViewBarWidth, myViewBarSize.height());
+  QFrame::showEvent(theEvent);
+  myWindowBar->setFixedSize(myWindowBar->sizeHint());
 }
 
 //****************************************************************
 void XGUI_ViewWindow::changeEvent(QEvent* theEvent)
 {
 
-    if (theEvent->type() == QEvent::WindowStateChange) {
-        if (isMinimized()) {
-            if (!myPicture->parentWidget()) {
-                QMdiSubWindow* aParent = static_cast<QMdiSubWindow*>(parentWidget());
-                QMdiArea* aMDIArea = aParent->mdiArea();
-                myPicture->setParent(aMDIArea);
-            }
-            myPicture->move(parentWidget()->x(), parentWidget()->y());
-            myPicture->show();
-        } else {
-            myPicture->hide();
-            if (isMaximized()) {
-                myMinimizeBtn->setIcon(MinimizeIco);
-                myMaximizeBtn->setIcon(RestoreIco);
-            }
-        }
-    } else
-        QWidget::changeEvent(theEvent);
+  if (theEvent->type() == QEvent::WindowStateChange) {
+    if (isMinimized()) {
+      if (myPicture->isHidden()) {
+        myViewBar->hide();
+        myGripWgt->hide(); 
+        myWindowBar->hide();
+        myViewPort->hide();
+        myPicture->show();
+      }
+    } else {
+      if (myPicture->isVisible()) {
+        myPicture->hide();
+        myViewPort->show();
+      }
+      if (isMaximized()) {
+        myMinimizeBtn->setIcon(MinimizeIco);
+        myMaximizeBtn->setIcon(RestoreIco);
+      }
+      myViewBar->setVisible(myIsActive);
+      myWindowBar->setVisible(myIsActive);
+      myGripWgt->setVisible(myIsActive && (!isMaximized()));
+    }
+  } else
+    QWidget::changeEvent(theEvent);
 }
 
-//****************************************************************
-void XGUI_ViewWindow::onClose()
-{
-    if (parentWidget())
-        parentWidget()->close();
 
-}
 
 //****************************************************************
-void XGUI_ViewWindow::enterEvent(QEvent* theEvent)
+void XGUI_ViewWindow::windowActivated()
 {
-    if (!isMinimized()) {
-        myViewBar->show();
-        if (!isMaximized())
-            myGripWgt->show(); 
+  if (!(isMinimized() || parentWidget()->isMinimized())) {
+    myIsActive = true;
+    if (isMaximized() || parentWidget()->isMaximized()) {
+      myMaximizeBtn->setIcon(RestoreIco);
+    } else {
+      myMaximizeBtn->setIcon(MaximizeIco);
     }
+    myViewBar->show();
     myWindowBar->show();
+    myGripWgt->setVisible(!(isMaximized() || isMinimized() ||
+        parentWidget()->isMaximized() || parentWidget()->isMinimized()));
+  } else 
+    myIsActive = false;
 }
 
 //****************************************************************
-void XGUI_ViewWindow::leaveEvent(QEvent* theEvent)
+void XGUI_ViewWindow::windowDeactivated()
 {
+  myIsActive = false;
+  if (!(isMinimized() || parentWidget()->isMinimized())) {
+    if (isMaximized() || parentWidget()->isMaximized()) {
+      myMaximizeBtn->setIcon(RestoreIco);
+    } else {
+      myMaximizeBtn->setIcon(MaximizeIco);
+    }
     myViewBar->hide();
-    myGripWgt->hide(); 
     myWindowBar->hide();
+    myGripWgt->hide(); 
+  }
+}
+
+
+//****************************************************************
+void XGUI_ViewWindow::onClose()
+{
+  if (parentWidget()) {
+    emit tryClosing(this);
+    if (closable()) {
+      emit closed(static_cast<QMdiSubWindow*>(parentWidget()));
+      parentWidget()->close();
+    }
+  }
 }
 
 //****************************************************************
 void XGUI_ViewWindow::onMinimize()
 {
-    QPixmap aPMap = QPixmap::fromImage(myViewPort->dumpView());
-    int aW = width();
-    int aH = height();
-    double aR = aW / 100.;
-    myPicture->setPixmap(aPMap.scaled(100,  int(aH / aR)));
-    
-    myLastState = isMaximized()? MaximizedState : NormalState;
-    showMinimized();
+  QPixmap aPMap = QPixmap::fromImage(myViewPort->dumpView());
+  int aW = width();
+  int aH = height();
+  double aR = aW / 100.;
+  int aNewH = int(aH / aR);
+  myPicture->setPixmap(aPMap.scaled(100,  aNewH));
+
+  myLastState = (isMaximized() || parentWidget()->isMaximized()) ? MaximizedState : WindowNormalState;
+  showMinimized();
+  parentWidget()->showMinimized();
+  parentWidget()->setGeometry(parentWidget()->x(), parentWidget()->y(), 100, aNewH);
+  parentWidget()->lower();
+  windowDeactivated();
+  myViewer->onWindowMinimized((QMdiSubWindow*)parentWidget());
 }
 
 //****************************************************************
 void XGUI_ViewWindow::onMaximize()
 {
-    if (isMaximized()) {
-        myMaximizeBtn->setIcon(MaximizeIco);
-        myGripWgt->show();
-        showNormal();
-    } else {
-        myMaximizeBtn->setIcon(RestoreIco);
-        myGripWgt->hide();
+  if (isMaximized() || parentWidget()->isMaximized()) {
+    myMaximizeBtn->setIcon(MaximizeIco);
+    myGripWgt->show();
+    showNormal();
+    parentWidget()->showNormal();
+  } else {
+    myMaximizeBtn->setIcon(RestoreIco);
+    myGripWgt->hide();
+    showMaximized();
+    parentWidget()->showMaximized();
+  }
+  parentWidget()->activateWindow();
+  myMinimizeBtn->setIcon(MinimizeIco);
+  
+  //  In order to avoid frosen background in toolbars when it shown as a second view
+  QTimer::singleShot(50, parentWidget(), SLOT(setFocus()));
+}
+
+//****************************************************************
+bool XGUI_ViewWindow::processWindowControls(QObject *theObj, QEvent *theEvent)
+{
+  switch(theEvent->type()) {
+  case QEvent::MouseButtonPress: {
+    QMouseEvent* aEvent = static_cast<QMouseEvent*>(theEvent);
+    if ((aEvent->button() == Qt::LeftButton) && (!myMoving)) {
+      myMoving = true;
+      myMousePnt = aEvent->globalPos();
+      return true;
+    }
+  }
+    break;
+  case QEvent::MouseButtonRelease: {
+    QMouseEvent* aEvent = static_cast<QMouseEvent*>(theEvent);
+    if ((aEvent->button() == Qt::LeftButton) && myMoving) {
+      myMoving = false;
+      return true;
+    }
+  }
+    break;
+  case QEvent::MouseMove: {
+    QMouseEvent* aEvent = static_cast<QMouseEvent*>(theEvent);
+    if (myMoving) {
+      QMdiSubWindow* aParent = static_cast<QMdiSubWindow*>(parentWidget());
+      QMdiArea* aMDIArea = aParent->mdiArea();
+
+      QPoint aPnt = aEvent->globalPos();
+      QPoint aMDIPnt = aMDIArea->mapFromGlobal(aPnt);
+      if (aMDIArea->rect().contains(aMDIPnt)) {
+                    int aX = aParent->x() + (aPnt.x() - myMousePnt.x());
+                    int aY = aParent->y() + (aPnt.y() - myMousePnt.y());
+                    aParent->move(aX, aY);
+        myMousePnt = aPnt;
+      }
+      return true;
+    }
+  }
+    break;
+  case QEvent::MouseButtonDblClick:
+    if (theObj == myPicture) {
+      myMoving = false;
+      if (myLastState == MaximizedState) {
         showMaximized();
+      } else {
+        showNormal();
+      }
+      myViewer->onWindowActivated((QMdiSubWindow*)parentWidget());
+
+      //  In order to avoid frosen background in toolbars when it shown as a second view
+      QTimer::singleShot(20, parentWidget(), SLOT(setFocus()));
+
+      return true;
     }
-    myMinimizeBtn->setIcon(MinimizeIco);
+  }
+  return false;
+}
+
+//****************************************************************
+bool XGUI_ViewWindow::processViewPort(QEvent *theEvent)
+{
+  switch(theEvent->type()) {
+  case QEvent::MouseButtonPress:
+    vpMousePressEvent((QMouseEvent*) theEvent);
+    return true;
+
+  case QEvent::MouseButtonRelease:
+    vpMouseReleaseEvent((QMouseEvent*) theEvent);
+    return true;
+
+  case QEvent::MouseMove:
+    vpMouseMoveEvent((QMouseEvent*) theEvent);
+    return true;
+
+  case QEvent::MouseButtonDblClick:
+    emit mouseDoubleClicked(this, (QMouseEvent*) theEvent);
+    return true;
+    case QEvent::Wheel:
+        {
+            QWheelEvent* aEvent = (QWheelEvent*) theEvent;
+            myViewPort->startZoomAtPoint( aEvent->x(), aEvent->y() );
+            double aDelta = (double)( aEvent->delta() ) / ( 15 * 8 );
+            int x  = aEvent->x();
+            int y  = aEvent->y();
+            int x1 = (int)( aEvent->x() + width()*aDelta/100 );
+            int y1 = (int)( aEvent->y() + height()*aDelta/100 );
+            myViewPort->zoom( x, y, x1, y1 );
+        }
+        return true;
+  }
+  return false;
 }
 
 //****************************************************************
 bool XGUI_ViewWindow::eventFilter(QObject *theObj, QEvent *theEvent)
 {
-    if ((theObj == myGripWgt) || (theObj == myPicture)) {
-        QWidget* aWgt = (theObj == myPicture)? myPicture : static_cast<QWidget*>(parentWidget());
-        switch (theEvent->type()) {
-        case QEvent::MouseButtonPress: 
-            {
-                QMouseEvent* aEvent = static_cast<QMouseEvent*>(theEvent);
-                if ((aEvent->button() == Qt::LeftButton) && (!myMoving)){
-                    myMoving = true;
-                    myMousePnt = aEvent->globalPos();
-                    return true;
-                }
-            }
-            break;
-        case QEvent::MouseButtonRelease: 
-            {
-                QMouseEvent* aEvent = static_cast<QMouseEvent*>(theEvent);
-                if ((aEvent->button() == Qt::LeftButton) && myMoving) {
-                    myMoving = false;
-                    return true;
-                }
-            }
-            break;
-        case QEvent::MouseMove: 
-            {
-                QMouseEvent* aEvent = static_cast<QMouseEvent*>(theEvent);
-                if (myMoving) {
-                    QMdiSubWindow* aParent = static_cast<QMdiSubWindow*>(parentWidget());
-                    QMdiArea* aMDIArea = aParent->mdiArea();
-                    
-                    QPoint aPnt = aEvent->globalPos();
-                    QPoint aMDIPnt = aMDIArea->mapFromGlobal(aPnt);
-                    if (aMDIArea->rect().contains(aMDIPnt)) {
-                        int aX = aWgt->x() + (aPnt.x() - myMousePnt.x());
-                        int aY = aWgt->y() + (aPnt.y() - myMousePnt.y());
-                        aWgt->move(aX, aY);
-                        myMousePnt = aPnt;
-                    }
-                    return true;
-                }
+  if ((theObj == myGripWgt) || (theObj == myPicture)) {
+    if (processWindowControls(theObj, theEvent))
+      return true;
+  } else if (theObj == myViewPort) {
+    if (processViewPort(theEvent)) {
+      return true;
+    }
+    if (theEvent->type() == QEvent::KeyRelease) {
+      emit keyReleased(this, (QKeyEvent*) theEvent);
+      return true;
+    }
+  }
+  return QFrame::eventFilter(theObj, theEvent);
+}
+
+//****************************************************************
+XGUI_ViewWindow::OperationType XGUI_ViewWindow::getButtonState(
+    QMouseEvent* theEvent, XGUI::InteractionStyle theInteractionStyle)
+{
+  OperationType aOp = NOTHING;
+  XGUI::InteractionStyle aStyle = (XGUI::InteractionStyle) theInteractionStyle;
+  if ((theEvent->modifiers() == XGUI_Viewer::myStateMap[aStyle][XGUI::ZOOM])
+      && (theEvent->buttons() == XGUI_Viewer::myButtonMap[aStyle][XGUI::ZOOM]))
+    aOp = ZOOMVIEW;
+  else if ((theEvent->modifiers() == XGUI_Viewer::myStateMap[aStyle][XGUI::PAN])
+      && (theEvent->buttons() == XGUI_Viewer::myButtonMap[aStyle][XGUI::PAN]))
+    aOp = PANVIEW;
+  else if ((theEvent->modifiers() == XGUI_Viewer::myStateMap[aStyle][XGUI::ROTATE])
+      && (theEvent->buttons() == XGUI_Viewer::myButtonMap[aStyle][XGUI::ROTATE])
+      && (my2dMode == XGUI::No2dMode))
+    aOp = ROTATE;
+
+  return aOp;
+}
+
+//****************************************************************
+void XGUI_ViewWindow::vpMousePressEvent(QMouseEvent* theEvent)
+{
+  myStartX = theEvent->x();
+  myStartY = theEvent->y();
+  XGUI::InteractionStyle anInteractionStyle = interactionStyle();
+
+  // in "key free" interaction style zoom operation is activated by two buttons (simultaneously pressed),
+  // which are assigned for pan and rotate - these operations are activated immediately after pressing 
+  // of the first button, so it is necessary to switch to zoom when the second button is pressed
+  bool aSwitchToZoom = false;
+  if ((anInteractionStyle == XGUI::KEY_FREE) && (myOperation == PANVIEW || myOperation == ROTATE)) {
+    aSwitchToZoom = getButtonState(theEvent, anInteractionStyle) == ZOOMVIEW;
+  }
+
+  switch(myOperation) {
+  case WINDOWFIT:
+    if (theEvent->button() == Qt::LeftButton)
+      emit vpTransformationStarted(WINDOWFIT);
+    break;
+
+  case PANGLOBAL:
+    if (theEvent->button() == Qt::LeftButton)
+      emit vpTransformationStarted(PANGLOBAL);
+    break;
+
+  case ZOOMVIEW:
+    if (theEvent->button() == Qt::LeftButton) {
+      myViewPort->startZoomAtPoint(myStartX, myStartY);
+      emit vpTransformationStarted(ZOOMVIEW);
+    }
+    break;
+
+  case PANVIEW:
+    if (aSwitchToZoom) {
+      myViewPort->startZoomAtPoint(myStartX, myStartY);
+      activateZoom();
+    } else if (theEvent->button() == Qt::LeftButton)
+      emit vpTransformationStarted(PANVIEW);
+    break;
+
+  case ROTATE:
+    if (aSwitchToZoom) {
+      myViewPort->startZoomAtPoint(myStartX, myStartY);
+      activateZoom();
+    } else if (theEvent->button() == Qt::LeftButton) {
+      myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);
+      emit vpTransformationStarted(ROTATE);
+    }
+    break;
+
+  default:
+    /*  Try to activate a transformation */
+    OperationType aState;
+    if (interactionStyle() == XGUI::STANDARD)
+      aState = getButtonState(theEvent, anInteractionStyle);
+    else {
+      aState = XGUI_ViewWindow::NOTHING;
+      myIsKeyFree = true;
+    }
+    switch(aState) {
+    case ZOOMVIEW:
+      myViewPort->startZoomAtPoint(myStartX, myStartY);
+      activateZoom();
+      break;
+    case PANVIEW:
+      activatePanning();
+      break;
+    case ROTATE:
+      activateRotation();
+      myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);
+      break;
+    default:
+      if (myRotationPointSelection) {
+        if (theEvent->button() == Qt::LeftButton) {
+          Handle(AIS_InteractiveContext) ic = myViewer->AISContext();
+          ic->Select();
+          for(ic->InitSelected(); ic->MoreSelected(); ic->NextSelected()) {
+            TopoDS_Shape aShape = ic->SelectedShape();
+            if (!aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX) {
+              gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(ic->SelectedShape()));
+              /*if ( mySetRotationPointDlg ) {
+               myRotationPointSelection = false;
+               mySetRotationPointDlg->setCoords(aPnt.X(), aPnt.Y(), aPnt.Z());
+               }*/
+            } else {
+              myCurrPointType = myPrevPointType;
+              break;
             }
+          }
+          if (ic->NbSelected() == 0)
+            myCurrPointType = myPrevPointType;
+          //if ( mySetRotationPointDlg ) mySetRotationPointDlg->toggleChange();
+          ic->CloseAllContexts();
+          myOperation = NOTHING;
+          myViewPort->setCursor(myCursor);
+          myCursorIsHand = false;
+          myRotationPointSelection = false;
         }
-        if ((theObj == myPicture) && (theEvent->type() == QEvent::MouseButtonDblClick)) {
-            myMoving = false;
-            if (myLastState == MaximizedState)
-                showMaximized();
-            else
-                showNormal();
-            return true;
+      } else
+        emit mousePressed(this, theEvent);
+      break;
+    }
+    /* notify that we start a transformation */
+    if (transformRequested())
+      emit vpTransformationStarted(myOperation);
+  }
+  if (transformRequested())
+    setTransformInProcess(true);
+
+  /* we may need it for sketching... */
+  /*    if ( l_mbPressEvent )
+   delete l_mbPressEvent;
+   l_mbPressEvent = new QMouseEvent( *theEvent );*/
+}
+
+//****************************************************************
+void XGUI_ViewWindow::contextMenuEvent(QContextMenuEvent* theEvent)
+{
+  if (theEvent->modifiers() == Qt::NoModifier) {
+    // Temporary: has to be removed when viewer popup will be defined
+    //QFrame::contextMenuEvent(theEvent);
+    emit contextMenuRequested(theEvent);
+  }
+}
+
+//****************************************************************
+void XGUI_ViewWindow::vpMouseReleaseEvent(QMouseEvent* theEvent)
+{
+  switch(myOperation) {
+  case NOTHING: {
+    int prevState = myCurSketch;
+    /*            if(theEvent->button() == Qt::RightButton) {
+     QList<OCCViewer_ViewSketcher*>::Iterator it;
+     for ( it = mySketchers.begin(); it != mySketchers.end() && myCurSketch != -1; ++it ) {
+     OCCViewer_ViewSketcher* sk = (*it);
+     if( ( sk->sketchButton() & theEvent->button() ) && sk->sketchButton() == myCurSketch )
+     myCurSketch = -1;
+     }
+     }
+     */
+    emit mouseReleased(this, theEvent);
+  }
+    break;
+  case ROTATE:
+    myViewPort->endRotation();
+    resetState();
+    break;
+
+  case PANVIEW:
+  case ZOOMVIEW:
+    resetState();
+    break;
+
+  case PANGLOBAL:
+    if (theEvent->button() == Qt::LeftButton) {
+      myViewPort->setCenter(theEvent->x(), theEvent->y());
+      myViewPort->getView()->SetScale(myCurScale);
+      resetState();
+    }
+    break;
+
+  case WINDOWFIT:
+    if (theEvent->button() == Qt::LeftButton) {
+      myCurrX = theEvent->x();
+      myCurrY = theEvent->y();
+      drawRect();
+      QRect rect = XGUI_Tools::makeRect(myStartX, myStartY, myCurrX, myCurrY);
+      if (!rect.isEmpty())
+        myViewPort->fitRect(rect);
+      endDrawRect();
+      resetState();
+    }
+    break;
+  }
+
+  // NOTE: viewer 3D detects a rectangle of selection using this event
+  // so we must emit it BEFORE resetting the selection rectangle
+  if (theEvent->button() == Qt::LeftButton && myDrawRect) {
+    drawRect();
+    endDrawRect();
+    resetState();
+    myViewPort->update();
+  }
+  /*    if ( l_mbPressEvent ) {
+   delete l_mbPressEvent;
+   l_mbPressEvent = 0;
+   }*/
+}
+
+//****************************************************************
+void XGUI_ViewWindow::vpMouseMoveEvent(QMouseEvent* theEvent)
+{
+  if (myIsKeyFree && interactionStyle() == XGUI::KEY_FREE) {
+    myIsKeyFree = false;
+    switch(getButtonState(theEvent, interactionStyle())) {
+    case ZOOMVIEW:
+      myViewPort->startZoomAtPoint(myStartX, myStartY);
+      activateZoom();
+      break;
+    case PANVIEW:
+      activatePanning();
+      break;
+    case ROTATE:
+      activateRotation();
+      myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);
+      break;
+    default:
+      break;
+    }
+  }
+
+  myCurrX = theEvent->x();
+  myCurrY = theEvent->y();
+  switch(myOperation) {
+  case ROTATE:
+    myViewPort->rotate(myCurrX, myCurrY, myCurrPointType, mySelectedPoint);
+    break;
+
+  case ZOOMVIEW:
+    myViewPort->zoom(myStartX, myStartY, myCurrX, myCurrY);
+    myStartX = myCurrX;
+    myStartY = myCurrY;
+    break;
+
+  case PANVIEW:
+    myViewPort->pan(myCurrX - myStartX, myStartY - myCurrY);
+    myStartX = myCurrX;
+    myStartY = myCurrY;
+    break;
+
+  case PANGLOBAL:
+    break;
+
+  default:
+    if (myRotationPointSelection /*|| isSketcherStyle()*/) {
+      emit mouseMoving(this, theEvent);
+    } else {
+      int aState = theEvent->modifiers();
+      int aButton = theEvent->buttons();
+      int anInteractionStyle = interactionStyle();
+      if (((anInteractionStyle == XGUI::STANDARD) && (aButton == Qt::LeftButton)
+          && (aState == Qt::NoModifier || Qt::ShiftModifier))
+          || ((anInteractionStyle == XGUI::KEY_FREE) && (aButton == Qt::LeftButton)
+              && (aState == Qt::ControlModifier
+                  || aState == (Qt::ControlModifier | Qt::ShiftModifier)))) {
+        myDrawRect = myEnableDrawMode;
+        if (myDrawRect) {
+          drawRect();
+          if (!myCursorIsHand) {   // we are going to sketch a rectangle
+            QCursor handCursor(Qt::PointingHandCursor);
+            myCursorIsHand = true;
+            myCursor = cursor();
+            myViewPort->setCursor(handCursor);
+          }
         }
+        emit mouseMoving(this, theEvent);
+      } /* else if ( ( (anInteractionStyle == XGUI::STANDARD) &&
+       (aButton == Qt::RightButton) && 
+       ( aState == Qt::NoModifier || Qt::ShiftModifier ) ) ||
+       ( (anInteractionStyle == XGUI::KEY_FREE) &&
+       (aButton == Qt::RightButton) && 
+       ( aState == Qt::ControlModifier || aState == ( Qt::ControlModifier|Qt::ShiftModifier ) ) ) ) {
+       OCCViewer_ViewSketcher* sketcher = 0;
+       QList<OCCViewer_ViewSketcher*>::Iterator it;
+       for ( it = mySketchers.begin(); it != mySketchers.end() && !sketcher; ++it ) {
+       OCCViewer_ViewSketcher* sk = (*it);
+       if( sk->isDefault() && sk->sketchButton() == aButton )
+       sketcher = sk;
+       }
+       if ( sketcher && myCurSketch == -1 ) {
+       activateSketching( sketcher->type() );
+       if ( mypSketcher ) {
+       myCurSketch = mypSketcher->sketchButton();
+
+       if ( l_mbPressEvent )  {
+       QApplication::sendEvent( getViewPort(), l_mbPressEvent );
+       delete l_mbPressEvent;
+       l_mbPressEvent = 0;
+       }
+       QApplication::sendEvent( getViewPort(), theEvent );
+       }
+       }
+       } */else
+        emit mouseMoving(this, theEvent);
     }
-    return QFrame::eventFilter(theObj, theEvent);
+  }
 }
 
+/*!
+ \brief Draw rubber band rectangle.
+ */
+void XGUI_ViewWindow::drawRect()
+{
+  if (!myRectBand) {
+    myRectBand = new XGUI_RectRubberBand(myViewPort);
+  }
+
+  myRectBand->setUpdatesEnabled(false);
+  QRect aRect = XGUI_Tools::makeRect(myStartX, myStartY, myCurrX, myCurrY);
+  myRectBand->initGeometry(aRect);
+
+  if (!myRectBand->isVisible())
+    myRectBand->show();
+
+  myRectBand->setUpdatesEnabled(true);
+}
+
+/*!
+ \brief Clear rubber band rectangle on the end on the dragging operation.
+ */
+void XGUI_ViewWindow::endDrawRect()
+{
+  if (myRectBand) {
+    myRectBand->clearGeometry();
+    myRectBand->hide();
+  }
+}
+
+void XGUI_ViewWindow::activateZoom()
+{
+  if (!transformRequested() && !myCursorIsHand)
+    myCursor = cursor(); /* save old cursor */
+
+  if (myOperation != ZOOMVIEW) {
+    QPixmap zoomPixmap(imageZoomCursor);
+    QCursor zoomCursor(zoomPixmap);
+    if (setTransformRequested(ZOOMVIEW))
+      myViewPort->setCursor(zoomCursor);
+  }
+}
+
+bool XGUI_ViewWindow::transformRequested() const
+{
+  return (myOperation != NOTHING);
+}
+
+/*!
+ \brief Start delayed viewer operation.
+ */
+bool XGUI_ViewWindow::setTransformRequested(OperationType op)
+{
+  bool ok = transformEnabled(op);
+  myOperation = ok ? op : NOTHING;
+  myViewPort->setMouseTracking(myOperation == NOTHING);
+  return ok;
+}
+
+/*!
+ Set enabled state of transformation (rotate, zoom, etc)
+ */
+void XGUI_ViewWindow::setTransformEnabled(const OperationType id, const bool on)
+{
+  if (id != NOTHING)
+    myStatus.insert(id, on);
+}
+
+/*!
+ \return enabled state of transformation (rotate, zoom, etc)
+ */
+bool XGUI_ViewWindow::transformEnabled(const OperationType id) const
+{
+  return myStatus.contains(id) ? myStatus[id] : true;
+}
+
+/*!
+ \brief Start panning operation.
+
+ Sets the corresponding cursor for the widget.
+ */
+void XGUI_ViewWindow::activatePanning()
+{
+  if (!transformRequested() && !myCursorIsHand)
+    myCursor = cursor();                // save old cursor
+
+  if (myOperation != PANVIEW) {
+    QCursor panCursor(Qt::SizeAllCursor);
+    if (setTransformRequested(PANVIEW))
+      myViewPort->setCursor(panCursor);
+  }
+}
+
+/*!
+  \brief Start global panning operation
+
+  Sets the corresponding cursor for the widget.
+*/
+void XGUI_ViewWindow::activateGlobalPanning()
+{
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) {
+    QPixmap globalPanPixmap (imageCrossCursor);
+    QCursor glPanCursor (globalPanPixmap);
+    myCurScale = aView3d->Scale();
+    aView3d->FitAll(0.01, false);
+    myCursor = cursor();                // save old cursor
+    myViewPort->fitAll(); // fits view before selecting a new scene center
+    if( setTransformRequested( PANGLOBAL ) )
+      myViewPort->setCursor( glPanCursor );
+  }
+}
+
+/*!
+ \brief Start rotation operation
+
+ Sets the corresponding cursor for the widget.
+ */
+void XGUI_ViewWindow::activateRotation()
+{
+  if (!transformRequested() && !myCursorIsHand)
+    myCursor = cursor();                // save old cursor
+
+  if (myOperation != ROTATE) {
+    QPixmap rotatePixmap(imageRotateCursor);
+    QCursor rotCursor(rotatePixmap);
+    if (setTransformRequested(ROTATE))
+      myViewPort->setCursor(rotCursor);
+  }
+}
+
+/*!
+ \brief Reset the viewport to its initial state
+ ( no transformations in process etc. )
+ */
+void XGUI_ViewWindow::resetState()
+{
+  myDrawRect = false;
+
+  if (myRotationPointSelection) {
+    QCursor handCursor(Qt::PointingHandCursor);
+    myViewPort->setCursor(handCursor);
+  } else {
+    if (transformRequested() || myCursorIsHand)
+      myViewPort->setCursor(myCursor);
+    myCursorIsHand = false;
+  }
+
+  if (transformRequested())
+    emit vpTransformationFinished(myOperation);
+
+  setTransformInProcess(false);
+  setTransformRequested(NOTHING);
+}
+
+XGUI_ViewBackground XGUI_ViewWindow::background() const
+{
+  return myViewPort ? myViewPort->background() : XGUI_ViewBackground();
+}
+
+void XGUI_ViewWindow::setBackground(const XGUI_ViewBackground& theBackground)
+{
+  if (myViewPort) 
+       myViewPort->setBackground( theBackground );
+}
+
+/*!
+   \brief Create one more window with same content.
+*/
+void XGUI_ViewWindow::cloneView()
+{
+  QMdiSubWindow* vw = myViewer->createView();
+  XGUI_ViewWindow* aNewWnd = static_cast<XGUI_ViewWindow*>(vw->widget());
+  aNewWnd->viewPort()->syncronizeWith(myViewPort);
+
+  emit viewCloned( vw );
+
+  //  In order to avoid frosen background in toolbars when it shown as a second view
+  QTimer::singleShot(20, vw, SLOT(setFocus()));
+}
+
+void XGUI_ViewWindow::dumpView()
+{
+  QString aFilter(tr("Images Files (*.bmp *.png *.jpg *.jpeg *.eps *.ps)"));
+  QString aSelectedFilter;
+  QString aFileName = QFileDialog::getSaveFileName(this, "Save picture", QString(), aFilter, &aSelectedFilter);
+  if (!aFileName.isNull()) {
+    QApplication::setOverrideCursor( Qt::WaitCursor );
+    QImage aPicture = myViewPort->dumpView();
+
+    QString aFmt = XGUI_Tools::extension(aFileName).toUpper();
+    if( aFmt.isEmpty() )
+      aFmt = QString( "BMP" ); // default format
+    else if( aFmt == "JPG" )
+      aFmt = "JPEG";
+
+    Handle(Visual3d_View) a3dView = myViewPort->getView()->View();
+    if (aFmt == "PS")
+      a3dView->Export(strdup(qPrintable(aFileName)), Graphic3d_EF_PostScript);
+    else if (aFmt == "EPS")
+      a3dView->Export(strdup(qPrintable(aFileName)), Graphic3d_EF_EnhPostScript);
+    else
+      aPicture.save( aFileName, aFmt.toLatin1() );
+    QApplication::restoreOverrideCursor();
+  }
+}
+
+void XGUI_ViewWindow::fitAll()
+{
+  emit vpTransformationStarted( FITALLVIEW );
+  myViewPort->fitAll();
+  emit vpTransformationFinished( FITALLVIEW );
+}
+
+/*!
+  \brief Starts fit operation.
+
+  Sets the corresponding cursor for the widget.
+*/
+void XGUI_ViewWindow::activateWindowFit()
+{
+  if ( !transformRequested() && !myCursorIsHand )
+    myCursor = cursor();                /* save old cursor */
+
+  if ( myOperation != WINDOWFIT ) {
+    QCursor handCursor (Qt::PointingHandCursor);
+    if( setTransformRequested ( WINDOWFIT ) ) {
+      myViewPort->setCursor ( handCursor );
+      myCursorIsHand = true;
+    }
+  }
+}
+
+
+/*!
+  \brief Perform "front view" transformation.
+*/
+void XGUI_ViewWindow::frontView()
+{
+  emit vpTransformationStarted ( FRONTVIEW );
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) 
+    aView3d->SetProj (V3d_Xpos);
+  myViewPort->fitAll();
+  emit vpTransformationFinished ( FRONTVIEW );
+}
+
+/*!
+  \brief Perform "back view" transformation.
+*/
+void XGUI_ViewWindow::backView()
+{
+  emit vpTransformationStarted ( BACKVIEW );
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) 
+    aView3d->SetProj (V3d_Xneg);
+  myViewPort->fitAll();
+  emit vpTransformationFinished ( BACKVIEW );
+}
+
+/*!
+  \brief Perform "top view" transformation.
+*/
+void XGUI_ViewWindow::topView()
+{
+  emit vpTransformationStarted ( TOPVIEW );
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) 
+    aView3d->SetProj (V3d_Zpos);
+  myViewPort->fitAll();
+  emit vpTransformationFinished ( TOPVIEW );
+}
+
+/*!
+  \brief Perform "bottom view" transformation.
+*/
+void XGUI_ViewWindow::bottomView()
+{
+  emit vpTransformationStarted ( BOTTOMVIEW );
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) 
+    aView3d->SetProj (V3d_Zneg);
+  myViewPort->fitAll();
+  emit vpTransformationFinished ( BOTTOMVIEW );
+}
+
+/*!
+  \brief Perform "left view" transformation.
+*/
+void XGUI_ViewWindow::leftView()
+{
+  emit vpTransformationStarted ( LEFTVIEW );
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) 
+    aView3d->SetProj (V3d_Yneg);
+  myViewPort->fitAll();
+  emit vpTransformationFinished ( LEFTVIEW );
+}
+
+/*!
+  \brief Perform "right view" transformation.
+*/
+void XGUI_ViewWindow::rightView()
+{
+  emit vpTransformationStarted ( RIGHTVIEW );
+  Handle(V3d_View) aView3d = myViewPort->getView();
+  if ( !aView3d.IsNull() ) 
+    aView3d->SetProj (V3d_Ypos);
+  myViewPort->fitAll();
+  emit vpTransformationFinished ( RIGHTVIEW );
+}
+
+void XGUI_ViewWindow::reset()
+{
+  emit vpTransformationStarted( RESETVIEW );
+  bool upd = myViewPort->getView()->SetImmediateUpdate( false );
+  myViewPort->getView()->Reset( false );
+  myViewPort->fitAll( false, true, false );
+  myViewPort->getView()->SetImmediateUpdate( upd );
+  myViewPort->getView()->Update();
+  emit vpTransformationFinished( RESETVIEW );
+}
+
+
+void XGUI_ViewWindow::updateToolBar()
+{
+  myGripWgt->update();
+  myViewBar->update();
+  myWindowBar->update();
+}
+
+/*!
+  \brief Update state of enable draw mode state.
+*/
+void XGUI_ViewWindow::updateEnabledDrawMode()
+{
+  myEnableDrawMode = myViewer->isSelectionEnabled() && 
+                     myViewer->isMultiSelectionEnabled();
+}