00001 #include "rose.h"
00002
00003 #include "RoseGraphicsView.h"
00004
00005
00006 #include "AstFilters.h"
00007 #include "SageMimeData.h"
00008
00009 #include <QApplication>
00010 #include <QDataStream>
00011 #include <QDragEnterEvent>
00012 #include <QDragMoveEvent>
00013 #include <QDropEvent>
00014 #include <QWheelEvent>
00015
00016 #include "DisplayNode.h"
00017
00018 #include <cmath>
00019
00020 #include <QDebug>
00021
00022
00023 RoseGraphicsView::RoseGraphicsView(QWidget * par)
00024 : QGraphicsView(par),
00025 dragEnabled(true),
00026 dropEnabled(true),
00027 curFilter(NULL),
00028 curNode(NULL)
00029 {
00030 setAcceptDrops(true);
00031 viewport()->setAcceptDrops(true);
00032
00033 setRenderHints(QPainter::Antialiasing);
00034 setDragMode(QGraphicsView::ScrollHandDrag);
00035
00036 connect ( this, SIGNAL(nodeDropped(SgNode*,QPoint)),
00037 this, SLOT(setNode(SgNode*)) );
00038
00039 }
00040
00041
00042 RoseGraphicsView::~RoseGraphicsView()
00043 {
00044 if(curFilter)
00045 delete curFilter;
00046 }
00047 void RoseGraphicsView::setNode(SgNode * node)
00048 {
00049 curNode = node;
00050 updateGraph(curNode,curFilter);
00051 }
00052
00053 void RoseGraphicsView::setFilter(AstFilterInterface * filter)
00054 {
00055 if(curFilter)
00056 delete curFilter;
00057
00058 curFilter = filter->copy();
00059 updateGraph(curNode,curFilter);
00060 }
00061
00062
00063
00064 void RoseGraphicsView::setFileFilter(int id)
00065 {
00066 if(id==-1)
00067 setFilter(NULL);
00068 else
00069 setFilter(new AstFilterFileById(id));
00070 }
00071
00072
00073 void RoseGraphicsView::mousePressEvent(QMouseEvent * ev)
00074 {
00075 DisplayNode * node = dynamic_cast<DisplayNode*>(itemAt(ev->pos()));
00076
00077 if(node)
00078 {
00079 SgNode * sgNode = node->getSgNode();
00080 nodeActivated(sgNode);
00081
00082 SgLocatedNode* sgLocNode = isSgLocatedNode(sgNode);
00083 if(sgLocNode)
00084 {
00085 Sg_File_Info* fi = sgLocNode->get_file_info();
00086
00087 emit clicked(QString(fi->get_filenameString().c_str()),
00088 fi->get_line(),fi->get_col());
00089 }
00090 }
00091
00092
00093 if (ev->button() == Qt::RightButton)
00094 dragStartPosition = ev->pos();
00095
00096
00097 QGraphicsView::mousePressEvent(ev);
00098 }
00099
00100
00101
00102
00103
00104 void RoseGraphicsView::mouseMoveEvent(QMouseEvent *ev)
00105 {
00106 if(!dragEnabled)
00107 return QGraphicsView::mouseMoveEvent(ev);
00108
00109 if (!(ev->buttons() & Qt::RightButton))
00110 return QGraphicsView::mouseMoveEvent(ev);;
00111 if ((ev->pos() - dragStartPosition).manhattanLength() < QApplication::startDragDistance())
00112 return QGraphicsView::mouseMoveEvent(ev);;
00113
00114
00115
00116 DisplayNode * dispNode = dynamic_cast<DisplayNode*>(itemAt(dragStartPosition));
00117 if(!dispNode)
00118 return;
00119
00120 SgNode * sgNode = dispNode->getSgNode();
00121 if(!sgNode)
00122 return;
00123
00124
00125 QDrag *drag = new QDrag(viewport());
00126
00127 drag->setMimeData( createSageMimeData( sgNode ) );
00128 drag->exec();
00129
00130 QGraphicsView::mouseMoveEvent(ev);
00131 }
00132
00133 void RoseGraphicsView::dragEnterEvent(QDragEnterEvent * ev)
00134 {
00135 if( acceptMimeData( ev->mimeData() ) && this != ev->source() )
00136 ev->accept();
00137 else
00138 ev->ignore();
00139
00140 QGraphicsView::dragEnterEvent(ev);
00141 }
00142
00143 void RoseGraphicsView::dragMoveEvent(QDragMoveEvent * ev)
00144 {
00145 QWidget::dragMoveEvent(ev);
00146 }
00147
00148
00149 void RoseGraphicsView::dropEvent(QDropEvent *ev)
00150 {
00151 if(ev->source()==this || ev->source()== viewport() || !dropEnabled )
00152 return;
00153
00154 handleMimeData( ev->mimeData(), ev->pos() );
00155 ev->acceptProposedAction();
00156 }
00157
00158 bool RoseGraphicsView::acceptMimeData( const QMimeData *mimeData )
00159 {
00160 return mimeData->hasFormat(SG_NODE_MIMETYPE) && dropEnabled ;
00161 }
00162
00163 void RoseGraphicsView::handleMimeData( const QMimeData *mimeData, const QPoint& pos )
00164 {
00165 SgNode *node( getGeneralNode( mimeData ) );
00166 emit nodeDropped( node, pos );
00167 }
00168
00169
00170
00171
00172 void RoseGraphicsView::scaleView(qreal scaleFactor)
00173 {
00174 qreal factor = matrix().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width();
00175 if (factor < 0.07 || factor > 100)
00176 return;
00177
00178 scale(scaleFactor, scaleFactor);
00179 }
00180
00181 void RoseGraphicsView::wheelEvent(QWheelEvent *ev)
00182 {
00183 scaleView( std::pow((double)2, ev->delta() / 240.0));
00184 }
00185