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 SUPERVGUI_ArrayView::SUPERVGUI_ArrayView(SUPERVGUI_CanvasArray* theArray, SUPERVGUI_Main* theMain):
36 QCanvasView(theArray, theMain),
41 myIsPanActivated = false;
46 viewport()->setMouseTracking(true); //widget receives mouse move events
47 //even if no buttons are pressed down
49 myPopup = new QPopupMenu(viewport());
51 if (myMain->isEditable()) {
52 myPopup->insertItem(tr("MSG_ADD_NODE"), myMain, SLOT(addNode()));
53 myPopup->insertItem(tr("MSG_INS_FILE"), myMain, SLOT(insertFile()));
54 myPopup->insertSeparator();
57 QPopupMenu* aViewPopup = new QPopupMenu(viewport());
58 aViewPopup->insertItem(tr("POP_FULLVIEW"), myMain, SLOT(showCanvas()));
59 aViewPopup->insertItem(tr("POP_CONTROLVIEW"), myMain, SLOT(showContolFlow()));
60 aViewPopup->insertItem(tr("POP_TABLEVIEW"), myMain, SLOT(showCanvasTable()));
62 myPopup->insertItem(tr("POP_VIEW"), aViewPopup);
63 myPopup->insertSeparator();
65 /*QPopupMenu* aZoomPopup = new QPopupMenu(viewport());
66 aZoomPopup->insertItem("200%", this, SLOT(zoomIn()));
67 aZoomPopup->insertItem("100%", this, SLOT(zoomReset()));
68 aZoomPopup->insertItem("50%", this, SLOT(zoomOut()));
69 aZoomPopup->insertSeparator();
70 aZoomPopup->insertItem("Fit All", this, SLOT(fitAll()));
72 myPopup->insertItem("Zoom", aZoomPopup);
73 myPopup->insertSeparator();*/
75 myAddStudyItem = myPopup->insertItem(tr("MSG_ADD_STUDY"), myMain, SLOT(addDataflowToStudy()));
76 myPopup->insertItem(tr("MSG_CHANGE_INFO"), myMain, SLOT(changeInformation()));
77 myPopup->insertSeparator();
79 myPopup->insertItem(tr("MSG_COPY_DATAFLOW"), myMain, SLOT(copy()));
80 myPopup->insertItem(tr("MSG_FILTER_NOTIFY"), myMain, SLOT(filterNotification()));
82 myPopup->insertSeparator();
83 myPopup->insertItem(tr("MSG_CHANGE_BACKGROUND"), this, SLOT(changeBackground()));
85 SUPERVGraph_ViewFrame* anActiveVF = (SUPERVGraph_ViewFrame*)myMain->parent();
87 myPopup->insertSeparator();
88 myShowToolBarItem = myPopup->insertItem( tr( "MEN_SHOW_TOOLBAR" ), myMain, SLOT( onShowToolbar() ) );
95 SUPERVGUI_ArrayView::~SUPERVGUI_ArrayView()
99 void SUPERVGUI_ArrayView::ActivatePanning()
101 myIsPanActivated = true;
102 viewport()->setMouseTracking(false);
105 void SUPERVGUI_ArrayView::ResetView()
112 void SUPERVGUI_ArrayView::changeBackground()
114 QColor aColor = QColorDialog::getColor(canvas()->backgroundColor(), this );
115 if ( aColor.isValid() ) {
116 // change background color for array view
117 canvas()->setBackgroundColor(aColor);
118 setPaletteBackgroundColor(aColor.light(120));
119 // change background color for canvas view
120 getMain()->getCanvasView()->canvas()->setBackgroundColor(aColor);
121 getMain()->getCanvasView()->setPaletteBackgroundColor(aColor.light(120));
123 // mkr : IPAL10825 -->
124 SUPERVGUI* aSupMod = SUPERVGUI::Supervision();
126 MESSAGE("NULL Supervision module!");
129 aSupMod->setIVFBackgroundColor(aColor);
134 void SUPERVGUI_ArrayView::resizeEvent( QResizeEvent* e) {
135 QCanvasView::resizeEvent( e );
136 canvas()->resize( e->size().width() > canvas()->width() ? e->size().width() : canvas()->width(),
137 e->size().height() > canvas()->height() ? e->size().height() : canvas()->height() );
140 void SUPERVGUI_ArrayView::contentsMousePressEvent(QMouseEvent* theEvent) {
141 myGlobalPoint = theEvent->globalPos();
143 if (((theEvent->button() == Qt::MidButton)
145 (theEvent->state() == Qt::ControlButton)) || myIsPanActivated) {
146 myIsPanActivated = true;
147 viewport()->setMouseTracking(false); //widget only receives mouse move events when at least one
148 //mouse button is pressed down while the mouse is being moved
151 #if QT_VERSION >= 0x030005
152 QCursor PanCursor(Qt::SizeAllCursor);
154 QCursor PanCursor(SizeAllCursor);
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());