Salome HOME
Fix for bug IPAL9558 : Maintainance Mandrake porting: black rectangle in table view.
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_ArrayView.cxx
1 //  SUPERV SUPERVGUI : GUI for Supervisor component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE
4 //
5 //  File   : SUPERVGUI_ArrayView.cxx
6 //  Author : 
7 //  Module : SUPERV
8
9
10 using namespace std;
11 #include "SUPERVGUI_ArrayView.h"
12 #include "SUPERVGUI_Main.h"
13 #include "SUPERVGUI_CanvasCellNodePrs.h"
14
15 #include <qcolordialog.h>
16
17 #if QT_VERSION >= 0x030005
18 QCursor PanCursor(Qt::SizeAllCursor);
19 #else
20 QCursor PanCursor(SizeAllCursor);
21 #endif
22
23 SUPERVGUI_ArrayView::SUPERVGUI_ArrayView(SUPERVGUI_CanvasArray* theArray, SUPERVGUI_Main* theMain):
24   QCanvasView(theArray, theMain),
25   myMain(theMain)
26 {
27   setName("TableView");
28
29   myIsPanActivated = false;
30
31   myAddStudyItem = 0;
32   myCursor = cursor();
33
34   viewport()->setMouseTracking(true); //widget receives mouse move events 
35                                       //even if no buttons are pressed down
36
37   myPopup = new QPopupMenu(viewport());
38
39   if (myMain->isEditable()) {
40     myPopup->insertItem(tr("MSG_ADD_NODE"), myMain, SLOT(addNode()));
41     myPopup->insertItem(tr("MSG_INS_FILE"), myMain, SLOT(insertFile()));
42     myPopup->insertSeparator();
43   }
44
45   QPopupMenu* aViewPopup = new QPopupMenu(viewport());
46   aViewPopup->insertItem(tr("POP_FULLVIEW"), myMain, SLOT(showCanvas()));
47   aViewPopup->insertItem(tr("POP_CONTROLVIEW"), myMain, SLOT(showContolFlow()));
48   aViewPopup->insertItem(tr("POP_TABLEVIEW"), myMain, SLOT(showCanvasTable()));
49
50   myPopup->insertItem(tr("POP_VIEW"), aViewPopup);
51   myPopup->insertSeparator();
52
53   /*QPopupMenu* aZoomPopup = new QPopupMenu(viewport());
54   aZoomPopup->insertItem("200%", this, SLOT(zoomIn()));
55   aZoomPopup->insertItem("100%", this, SLOT(zoomReset()));
56   aZoomPopup->insertItem("50%", this, SLOT(zoomOut()));
57   aZoomPopup->insertSeparator();
58   aZoomPopup->insertItem("Fit All", this, SLOT(fitAll()));
59
60   myPopup->insertItem("Zoom", aZoomPopup);
61   myPopup->insertSeparator();*/
62
63   myAddStudyItem = myPopup->insertItem(tr("MSG_ADD_STUDY"), myMain, SLOT(addDataflowToStudy()));
64   myPopup->insertItem(tr("MSG_CHANGE_INFO"), myMain, SLOT(changeInformation()));
65   myPopup->insertSeparator();
66
67   myPopup->insertItem(tr("MSG_COPY_DATAFLOW"), myMain, SLOT(copy()));
68   myPopup->insertItem(tr("MSG_FILTER_NOTIFY"), myMain, SLOT(filterNotification()));
69
70   myPopup->insertSeparator();
71   myPopup->insertItem(tr("MSG_CHANGE_BACKGROUND"), this, SLOT(changeBackground()));
72  
73   hide();
74 }
75  
76
77 SUPERVGUI_ArrayView::~SUPERVGUI_ArrayView()
78 {
79 }
80
81 void SUPERVGUI_ArrayView::ActivatePanning()
82 {
83   myIsPanActivated = true;
84   viewport()->setMouseTracking(false);
85 }
86
87 void SUPERVGUI_ArrayView::ResetView()
88 {
89   setContentsPos(0,0);
90   QWMatrix m;
91   setWorldMatrix(m);
92 }
93
94 void SUPERVGUI_ArrayView::changeBackground()
95 {
96   QColor aColor = QColorDialog::getColor(canvas()->backgroundColor(), this );
97   if ( aColor.isValid() ) {
98     // change background color for array view
99     canvas()->setBackgroundColor(aColor);
100     setPaletteBackgroundColor(aColor.light(120));
101     // change background color for canvas view
102     getMain()->getCanvasView()->canvas()->setBackgroundColor(aColor);
103     getMain()->getCanvasView()->setPaletteBackgroundColor(aColor.light(120));
104   }
105 }
106
107 void SUPERVGUI_ArrayView::resizeEvent( QResizeEvent* e) {
108   QCanvasView::resizeEvent( e );
109   canvas()->resize( e->size().width() > canvas()->width() ? e->size().width() : canvas()->width(), 
110                     e->size().height() > canvas()->height() ? e->size().height() : canvas()->height() );
111 }
112
113 void SUPERVGUI_ArrayView::contentsMousePressEvent(QMouseEvent* theEvent) {
114   myGlobalPoint = theEvent->globalPos();
115
116   if (((theEvent->button() == Qt::MidButton)
117        &&
118        (theEvent->state() == Qt::ControlButton)) || myIsPanActivated) {
119     myIsPanActivated = true;
120     viewport()->setMouseTracking(false); //widget only receives mouse move events when at least one 
121                                          //mouse button is pressed down while the mouse is being moved
122     myCursor = cursor();
123     setCursor(PanCursor);
124     return;
125   } 
126
127   QPoint thePoint = inverseWorldMatrix().map(theEvent->pos());
128   // compute collision rectangle
129   QRect aSel(thePoint.x()-MARGIN, thePoint.y()-MARGIN, 1+2*MARGIN, 1+2*MARGIN);
130
131   if (theEvent->button() == RightButton) {
132     QCanvasItemList l = canvas()->collisions(aSel);
133     for (QCanvasItemList::Iterator it = l.begin(); it != l.end(); ++it) {
134       if ((*it)->rtti() == SUPERVGUI_Canvas::Rtti_Node) {
135         SUPERVGUI_CanvasCellNodePrs* aNodePrs = (SUPERVGUI_CanvasCellNodePrs*) (*it);
136         QObject* anObj = aNodePrs->getObject(thePoint);
137         if (anObj->inherits("SUPERVGUI_CanvasCellNode")) {
138           myMain->showPopup(((SUPERVGUI_CanvasCellNode*)anObj)->getPopupMenu(viewport()), 
139                             theEvent);
140           return;
141         }
142       }
143     }
144
145     myPopup->setItemEnabled(myAddStudyItem, !myMain->isDataflowInStudy());
146     myMain->showPopup(myPopup, theEvent);
147     return;
148   }
149 }
150
151 void SUPERVGUI_ArrayView::contentsMouseMoveEvent(QMouseEvent* theEvent) {
152   QPoint g = theEvent->globalPos();
153   if (myIsPanActivated) {
154     scrollBy(myGlobalPoint.x() - g.x(),
155              myGlobalPoint.y() - g.y());
156     myGlobalPoint = g;
157     return;
158   }
159
160   // QToolTip for title and label for SUPERVGUI_CanvasCellNode
161   SUPERVGUI_ToolTip* aTT = new SUPERVGUI_ToolTip(this);
162   QPoint aPoint1 = inverseWorldMatrix().map(theEvent->pos());
163   aTT->maybeTip(aPoint1);
164 }
165
166 void SUPERVGUI_ArrayView::contentsMouseReleaseEvent(QMouseEvent* theEvent) {
167   if (myIsPanActivated) {
168     myIsPanActivated = false;
169     viewport()->setMouseTracking(true);
170     setCursor(myCursor);
171   }
172 }
173
174 void SUPERVGUI_ToolTip::maybeTip(const QPoint& theP) {
175   // compute collision rectangle
176   QRect aSel(theP.x()-MARGIN, theP.y()-MARGIN, 1+2*MARGIN, 1+2*MARGIN);
177
178   QCanvasItemList l = ((SUPERVGUI_ArrayView*)parentWidget())->canvas()->collisions(aSel);
179   for (QCanvasItemList::Iterator it = l.begin(); it != l.end(); ++it) {
180     if ((*it)->rtti() == SUPERVGUI_Canvas::Rtti_Node) {
181       SUPERVGUI_CanvasCellNodePrs* aNodePrs = (SUPERVGUI_CanvasCellNodePrs*) (*it);
182       QObject* anObj = aNodePrs->getObject(theP);
183       if (anObj->inherits("SUPERVGUI_CanvasCellNode")) {
184         
185         QRect aTitleRect = aNodePrs->getTitleRect();
186         if (aTitleRect.contains(theP, true)) {
187           tip(aTitleRect, ((SUPERVGUI_CanvasCellNode*)anObj)->getEngine()->Name());
188           return;
189         }
190
191         QRect aLabelRect = aNodePrs->getLabelRect();
192         if (aLabelRect.contains(theP, true)) {
193           tip(aLabelRect, ((SUPERVGUI_CanvasCellNode*)anObj)->getLabelText());
194           return;
195         }
196       }
197     }
198   }
199 }