1 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // SUPERV SUPERVGUI : GUI for Supervisor component
22 // File : SUPERVGUI_ArrayView.cxx
26 #include "SUPERVGUI.h"
27 #include "SUPERVGUI_ArrayView.h"
28 #include "SUPERVGUI_Main.h"
29 #include "SUPERVGUI_CanvasCellNodePrs.h"
30 #include "SUPERVGUI_CanvasLink.h"
31 #include "SUPERVGUI_CanvasPort.h"
33 #include <qcolordialog.h>
35 #if QT_VERSION >= 0x030005
36 QCursor PanCursor(Qt::SizeAllCursor);
38 QCursor PanCursor(SizeAllCursor);
41 SUPERVGUI_ArrayView::SUPERVGUI_ArrayView(SUPERVGUI_CanvasArray* theArray, SUPERVGUI_Main* theMain):
42 QCanvasView(theArray, theMain),
47 myIsPanActivated = false;
52 viewport()->setMouseTracking(true); //widget receives mouse move events
53 //even if no buttons are pressed down
55 myPopup = new QPopupMenu(viewport());
57 if (myMain->isEditable()) {
58 myPopup->insertItem(tr("MSG_ADD_NODE"), myMain, SLOT(addNode()));
59 myPopup->insertItem(tr("MSG_INS_FILE"), myMain, SLOT(insertFile()));
60 myPopup->insertSeparator();
63 QPopupMenu* aViewPopup = new QPopupMenu(viewport());
64 aViewPopup->insertItem(tr("POP_FULLVIEW"), myMain, SLOT(showCanvas()));
65 aViewPopup->insertItem(tr("POP_CONTROLVIEW"), myMain, SLOT(showContolFlow()));
66 aViewPopup->insertItem(tr("POP_TABLEVIEW"), myMain, SLOT(showCanvasTable()));
68 myPopup->insertItem(tr("POP_VIEW"), aViewPopup);
69 myPopup->insertSeparator();
71 /*QPopupMenu* aZoomPopup = new QPopupMenu(viewport());
72 aZoomPopup->insertItem("200%", this, SLOT(zoomIn()));
73 aZoomPopup->insertItem("100%", this, SLOT(zoomReset()));
74 aZoomPopup->insertItem("50%", this, SLOT(zoomOut()));
75 aZoomPopup->insertSeparator();
76 aZoomPopup->insertItem("Fit All", this, SLOT(fitAll()));
78 myPopup->insertItem("Zoom", aZoomPopup);
79 myPopup->insertSeparator();*/
81 myAddStudyItem = myPopup->insertItem(tr("MSG_ADD_STUDY"), myMain, SLOT(addDataflowToStudy()));
82 myPopup->insertItem(tr("MSG_CHANGE_INFO"), myMain, SLOT(changeInformation()));
83 myPopup->insertSeparator();
85 myPopup->insertItem(tr("MSG_COPY_DATAFLOW"), myMain, SLOT(copy()));
86 myPopup->insertItem(tr("MSG_FILTER_NOTIFY"), myMain, SLOT(filterNotification()));
88 myPopup->insertSeparator();
89 myPopup->insertItem(tr("MSG_CHANGE_BACKGROUND"), this, SLOT(changeBackground()));
91 SUPERVGraph_ViewFrame* anActiveVF = (SUPERVGraph_ViewFrame*)myMain->parent();
93 myPopup->insertSeparator();
94 myShowToolBarItem = myPopup->insertItem( tr( "MEN_SHOW_TOOLBAR" ), myMain, SLOT( onShowToolbar() ) );
101 SUPERVGUI_ArrayView::~SUPERVGUI_ArrayView()
105 void SUPERVGUI_ArrayView::ActivatePanning()
107 myIsPanActivated = true;
108 viewport()->setMouseTracking(false);
111 void SUPERVGUI_ArrayView::ResetView()
118 void SUPERVGUI_ArrayView::changeBackground()
120 QColor aColor = QColorDialog::getColor(canvas()->backgroundColor(), this );
121 if ( aColor.isValid() ) {
122 // change background color for array view
123 canvas()->setBackgroundColor(aColor);
124 setPaletteBackgroundColor(aColor.light(120));
125 // change background color for canvas view
126 getMain()->getCanvasView()->canvas()->setBackgroundColor(aColor);
127 getMain()->getCanvasView()->setPaletteBackgroundColor(aColor.light(120));
129 // mkr : IPAL10825 -->
130 SUPERVGUI* aSupMod = SUPERVGUI::Supervision();
132 MESSAGE("NULL Supervision module!");
135 aSupMod->setIVFBackgroundColor(aColor);
140 void SUPERVGUI_ArrayView::resizeEvent( QResizeEvent* e) {
141 QCanvasView::resizeEvent( e );
142 canvas()->resize( e->size().width() > canvas()->width() ? e->size().width() : canvas()->width(),
143 e->size().height() > canvas()->height() ? e->size().height() : canvas()->height() );
146 void SUPERVGUI_ArrayView::contentsMousePressEvent(QMouseEvent* theEvent) {
147 myGlobalPoint = theEvent->globalPos();
149 if (((theEvent->button() == Qt::MidButton)
151 (theEvent->state() == Qt::ControlButton)) || myIsPanActivated) {
152 myIsPanActivated = true;
153 viewport()->setMouseTracking(false); //widget only receives mouse move events when at least one
154 //mouse button is pressed down while the mouse is being moved
156 setCursor(PanCursor);
160 QPoint thePoint = inverseWorldMatrix().map(theEvent->pos());
161 // compute collision rectangle
162 QRect aSel(thePoint.x()-MARGIN, thePoint.y()-MARGIN, 1+2*MARGIN, 1+2*MARGIN);
164 if (theEvent->button() == RightButton) {
165 QCanvasItemList l = canvas()->collisions(aSel);
166 for (QCanvasItemList::Iterator it = l.begin(); it != l.end(); ++it) {
167 if ((*it)->rtti() == SUPERVGUI_Canvas::Rtti_Node) {
168 SUPERVGUI_CanvasCellNodePrs* aNodePrs = (SUPERVGUI_CanvasCellNodePrs*) (*it);
169 QObject* anObj = aNodePrs->getObject(thePoint);
170 if (anObj->inherits("SUPERVGUI_CanvasCellNode")) {
171 myMain->showPopup(((SUPERVGUI_CanvasCellNode*)anObj)->getPopupMenu(viewport()),
178 myPopup->setItemEnabled(myAddStudyItem, !myMain->isDataflowInStudy());
179 myPopup->setItemEnabled(myShowToolBarItem, !((SUPERVGraph_ViewFrame*)myMain->parent())->getToolBar()->isVisible());
180 myMain->showPopup(myPopup, theEvent);
185 void SUPERVGUI_ArrayView::contentsMouseMoveEvent(QMouseEvent* theEvent) {
186 QPoint g = theEvent->globalPos();
187 if (myIsPanActivated) {
188 scrollBy(myGlobalPoint.x() - g.x(),
189 myGlobalPoint.y() - g.y());
194 // QToolTip for title and label for SUPERVGUI_CanvasCellNode
195 SUPERVGUI_ToolTip* aTT = new SUPERVGUI_ToolTip(this);
196 aTT->maybeTip(theEvent->pos());
199 void SUPERVGUI_ArrayView::contentsMouseReleaseEvent(QMouseEvent* theEvent) {
200 if (myIsPanActivated) {
201 myIsPanActivated = false;
202 viewport()->setMouseTracking(true);
207 void SUPERVGUI_ToolTip::maybeTip(const QPoint& thePos) {
208 // mkr : 23.11.2006 - PAL13957 - modifications for correct tooltips displaying after scroll or zoom
209 QPoint theP = ((QCanvasView*)parentWidget())->inverseWorldMatrix().map(thePos);
212 ((QCanvasView*)parentWidget())->contentsToViewport(theP.x(), theP.y(), avX, avY);
213 QPoint avP(avX, avY);
215 QWMatrix aWM = ((QCanvasView*)parentWidget())->worldMatrix();
217 // compute collision rectangle for nodes, ports
218 QRect aNodeSel(theP.x()-MARGIN, theP.y()-MARGIN, 1+2*MARGIN, 1+2*MARGIN);
220 QCanvasItemList lN = ((QCanvasView*)parentWidget())->canvas()->collisions(aNodeSel);
221 for (QCanvasItemList::Iterator it = lN.begin(); it != lN.end(); ++it)
224 if ((*it)->rtti() == SUPERVGUI_Canvas::Rtti_Node)
226 SUPERVGUI_CanvasNodePrs* aNodePrs = (SUPERVGUI_CanvasNodePrs*) (*it);
227 QObject* anObj = aNodePrs->getObject(theP);
228 if (anObj->inherits("SUPERVGUI_CanvasNode"))
230 QRect aTitleRect = aNodePrs->getTitleRect();
231 QRect aLabelRect = aNodePrs->getLabelRect();
232 QRect aStatusRect = aNodePrs->getStatusRect();
234 if (aTitleRect.bottom()+1 == aLabelRect.top() &&
235 aLabelRect.bottom()+1 == aStatusRect.top())
237 ((QCanvasView*)parentWidget())->contentsToViewport((int)(aTitleRect.left()*aWM.m11()),
238 (int)(aTitleRect.top()*aWM.m22()),
240 QRect avTipRect(avX, avY,
241 (int)(aTitleRect.width()*aWM.m11()),
242 (int)((aTitleRect.height() + aLabelRect.height() + aStatusRect.height())*aWM.m22()));
243 tip(avTipRect, ((SUPERVGUI_CanvasNode*)anObj)->getToolTipText());
247 if (aTitleRect.contains(theP, true))
249 ((QCanvasView*)parentWidget())->contentsToViewport((int)(aTitleRect.left()*aWM.m11()),
250 (int)(aTitleRect.top()*aWM.m22()),
252 QRect avTipRect(avX, avY,
253 (int)(aTitleRect.width()*aWM.m11()), (int)(aTitleRect.height()*aWM.m22()));
254 tip(avTipRect, ((SUPERVGUI_CanvasNode*)anObj)->getToolTipText());
258 if (aLabelRect.contains(theP, true))
260 ((QCanvasView*)parentWidget())->contentsToViewport((int)(aLabelRect.left()*aWM.m11()),
261 (int)(aLabelRect.top()*aWM.m22()),
263 QRect avTipRect(avX, avY,
264 (int)(aLabelRect.width()*aWM.m11()), (int)(aLabelRect.height()*aWM.m22()));
265 tip(avTipRect, ((SUPERVGUI_CanvasNode*)anObj)->getToolTipText());
269 if (aStatusRect.contains(theP, true))
271 ((QCanvasView*)parentWidget())->contentsToViewport((int)(aStatusRect.left()*aWM.m11()),
272 (int)(aStatusRect.top()*aWM.m22()),
274 QRect avTipRect(avX, avY,
275 (int)(aStatusRect.width()*aWM.m11()), (int)(aStatusRect.height()*aWM.m22()));
276 tip(avTipRect, ((SUPERVGUI_CanvasNode*)anObj)->getToolTipText());
281 // tooltip for nodes' port
282 if (anObj->inherits("SUPERVGUI_CanvasPort"))
284 SUPERVGUI_CanvasPort* aPort = (SUPERVGUI_CanvasPort*)anObj;
285 QRect aPortRect = aPort->getPrs()->getPortRect();
286 ((QCanvasView*)parentWidget())->contentsToViewport((int)(aPortRect.left()*aWM.m11()),
287 (int)(aPortRect.top()*aWM.m22()),
289 QRect avTipRect(avX, avY,
290 (int)(aPortRect.width()*aWM.m11()), (int)(aPortRect.height()*aWM.m22()));
291 tip(avTipRect, aPort->getEngine()->Type() + QString(" ") + aPort->getPrs()->getText());
297 // compute collision rectangle for links
298 QRect aLinkSel((int)( theP.x() + (theP.x()-avP.x())/aWM.m11() ) - MARGIN,
299 (int)( theP.y() + (theP.y()-avP.y())/aWM.m22() ) - MARGIN,
300 1+2*MARGIN, 1+2*MARGIN);
302 QCanvasItemList lL = ((QCanvasView*)parentWidget())->canvas()->collisions(aLinkSel);
303 for (QCanvasItemList::Iterator it = lL.begin(); it != lL.end(); ++it)
305 // tootip for links' point
306 if ((*it)->rtti() == SUPERVGUI_Canvas::Rtti_LinkPoint)
308 SUPERVGUI_CanvasPointPrs* aPrs = (SUPERVGUI_CanvasPointPrs*) (*it);
309 if (aPrs->getLink()->getMain()->getViewType() == CANVAS)
311 ((QCanvasView*)parentWidget())->contentsToViewport((int)(aLinkSel.left()*aWM.m11()),
312 (int)(aLinkSel.top()*aWM.m22()),
314 QRect avTipRect(avX, avY,
315 (int)(aLinkSel.width()*aWM.m11()), (int)(aLinkSel.height()*aWM.m22()));
316 tip(avTipRect, aPrs->getLink()->getToolTipText());
320 // tooltip for links' edge
321 if ((*it)->rtti() == SUPERVGUI_Canvas::Rtti_LinkEdge)
323 SUPERVGUI_CanvasEdgePrs* aPrs = (SUPERVGUI_CanvasEdgePrs*) (*it);
324 if (aPrs->getLink()->getMain()->getViewType() == CANVAS)
326 ((QCanvasView*)parentWidget())->contentsToViewport((int)(aLinkSel.left()*aWM.m11()),
327 (int)(aLinkSel.top()*aWM.m22()),
329 QRect avTipRect(avX, avY,
330 (int)(aLinkSel.width()*aWM.m11()), (int)(aLinkSel.height()*aWM.m22()));
331 tip(avTipRect, aPrs->getLink()->getToolTipText());