OpenCores
URL https://opencores.org/ocsvn/ezidebug/ezidebug/trunk

Subversion Repositories ezidebug

[/] [ezidebug/] [trunk/] [EziDebug_src/] [listwindow.cpp] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 EziDebug
#include <QtGui>
2
 
3
#include "toolwindow.h"
4
#include "treeview.h"
5
#include "treeitem.h"
6
//#include "ezidebugprj.h"
7
#include "ezidebugmodule.h"
8
#include "updatedetectthread.h"
9
#include "ezidebuginstancetreeitem.h"
10
#include "ezidebugtreemodel.h"
11
#include "ezidebugscanchain.h"
12
 
13
 
14
#include<QDebug>
15
 
16
ListWindow::ListWindow(QWidget *parent, Qt::WindowFlags f) :
17
    QWidget(parent, f)
18
{
19
    QStringList ifileList ;
20
    QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
21
    setMouseTracking(true);
22
    getToolWindowPointer(parent);
23
 
24
    findDialog = 0;
25
    moduleTreeView = NULL ;
26
    m_peziDebugTreeModel = NULL ;
27
    eDirection = eNone ;
28
    isLeftButtonPress = false ;
29
 
30
    //创建菜单栏和按钮
31
    //createButtons();
32
//    createActions();
33
//    createMenus();
34
    //    QPalette palette;
35
    //    palette.setBrush(QColor(255,255,255));
36
    //    menuBar->setPalette(palette);
37
    //    menuBar->setWindowOpacity(0);
38
 
39
    //创建标题栏
40
    titleBar = new TitleBar(this);
41
 
42
    connect(titleBar->closeButton, SIGNAL(clicked()), this, SLOT(close()));
43
    //创建工具栏
44
    //QToolBar toolBar = new ToolBar(this);
45
    //创建内容区域
46
    //QPushButton *btn = new QPushButton(this);
47
    //btn->setText(tr("cancel"));
48
    //QWidget *contentWidget = new QWidget(this);
49
    //分栏
50
//    closeButton = new Button(tr(":/images/ListWindowExit.bmp"), this);
51
//    //closeButton = new Button ;
52
//    closeButton->setIconSize(QSize(11, 10));
53
//   // closeButton->setGeometry(QRect(this->geometry().left()-20, 7, 11, 10));
54
//    closeButton->setGeometry(QRect(this->geometry().width()-20, 7, 11, 10));
55
//    qDebug()<< this->geometry().width()<<geometry().height();
56
//    connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
57
//    button1 = new QPushButton(tr("hello"),this);
58
//    button1->setGeometry(QRect(10,7, 11, 10));
59
//    connect(button1, SIGNAL(clicked()), this, SLOT(close()));
60
    m_pmessageTreeView = new TreeView(this) ;
61
 
62
 
63
    m_iShowMessageModel = new QStandardItemModel(0,2,this);
64
 
65
 
66
    m_iShowMessageModel->setHeaderData(0, Qt::Horizontal, QObject::tr("Type"));
67
    m_iShowMessageModel->setHeaderData(1, Qt::Horizontal, QObject::tr("Message"));
68
 
69
 
70
    moduleTreeView = new TreeView(this);
71
 
72
    moduleTreeView->setWindowTitle(QObject::tr("Simple Tree Model"));
73
    m_pcontextMenu = new QMenu(moduleTreeView);
74 4 EziDebug
 
75
        #if 0
76 2 EziDebug
    m_paddChainAct = m_pcontextMenu->addAction(QIcon(":/images/insert.png"),tr("添加链"));
77
    m_pdeleteChainAct = m_pcontextMenu->addAction(QIcon(":/images/delete.png"),tr("删除链"));
78 4 EziDebug
        #else
79
        m_paddChainAct = m_pcontextMenu->addAction(QIcon(":/images/insert.png"),tr("insert scanchain"));
80
    m_pdeleteChainAct = m_pcontextMenu->addAction(QIcon(":/images/delete.png"),tr("delete scanchain"));
81
        #endif
82
 
83 2 EziDebug
    connect(m_paddChainAct,SIGNAL(triggered()), toolWindow, SLOT(addScanChain()));
84
    connect(m_pdeleteChainAct,SIGNAL(triggered()),toolWindow, SLOT(deleteScanChain()));
85
 
86
    moduleTreeView->setModel(NULL);
87
    m_pmessageTreeView->setModel(m_iShowMessageModel);
88
 
89
    mainSplitter = new Splitter(Qt::Horizontal, this);
90
 
91
 
92
    mainSplitter->addWidget(moduleTreeView);
93
    mainSplitter->addWidget(m_pmessageTreeView);
94
 
95
 
96
    moduleTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
97
    connect(moduleTreeView, SIGNAL(customContextMenuRequested(const QPoint&)),
98
            this, SLOT(show_contextmenu(const QPoint&)));
99
    moduleTreeView->show();
100
 
101 4 EziDebug
    addMessage("welcome","####Welcome to EziDebug####");
102 2 EziDebug
 
103
    /* 根据工程 文件是否创建 来是否显示 树状结构图*/
104
    // 在 toolwindow 的 构造 时 检测是否存在 默认路径 ,如果存在有效的默认路径,则会根据该路径1个工程对象
105
    // 构造完 toolwindow 后 接着 构造 listwindow ,如果 listwidow 检查 toolwindow 下的
106
    // 工程对象指针来 判断 是否 需要 重现 树状结构 ,如果 工程对象指针 不为空的话 ,
107
 
108
    // 1 、根据工程对象指针 来判断 是否存在 log 文件、以及工程文件
109
    // 如果没有的话 不在窗口构造的时候 构造树形结构,在旁边的 文本栏 提示错误信息:默认路径 不存在有效数据
110
    // 2 、从log 文件恢复 所有数据,恢复时 检测 log 文件 是否 ok,如果有错误,则在 文本栏提示 错误信息 log 文件被破坏
111
    //
112
    // 当构造函数完成最后,开启 进程信息,并开启定时器,定时器定时 从工程文件中提取所有的 代码文件信息,与目前工程文件中保存的
113
    // 所有文件信息进行对比,检查 代码文件是否 被更新,如果更新 则将 部分更新按钮 有效
114
    //
115
    // 部分更新按钮初始化后不可用,待线程启用后,检测到文件可更新时,再可用
116
    ToolWindow * pparent = static_cast<ToolWindow*>(toolWindow) ;
117
    EziDebugPrj* prj ;
118
    if(prj = const_cast<EziDebugPrj*>(pparent->getCurrentProject()))
119
    {
120
        /*检查所需工程文件是否存在 0:存在 1:不存在*/
121
 
122
        if(!prj->isPrjFileExist())
123
        {
124
            addMessage("error",tr("EziDebug error: There is no Project file in the default path:%1").arg(prj->getCurrentDir().absolutePath()));
125
            delete prj ;
126
            pparent->setCurrentProject(NULL);
127
        }
128
        else
129
        {
130
            // 检测log文件是否存在
131
            if(prj->getCurrentDir().exists("config.ezi"))
132
            {
133
                prj->setLogFileExistFlag(true);
134
 
135
                prj->setLogFileName(prj->getCurrentDir().absoluteFilePath("config.ezi")) ;
136
 
137
                /*检查保存的log文件是否ok 并恢复log文件中的扫描链信息,用于检测要扫描的工程是否被修改导致扫描链被破坏,提取所有信息*/
138
                if(prj->detectLogFile(READ_MODULE_INFO|READ_FILE_INFO|READ_CHAIN_INFO))
139
                {
140
                   // do nothing until the toolwindow show!!
141
                   // listwindow will show infomation after toolwindow show!
142
                }
143
                else
144
                {
145
                    prj->clearupCheckedChainList();
146
                    prj->clearupDestroyedChainList();
147
                    //  对所有改动过的文件(文件时间不一致、文件增、删)进行扫描
148
                    if(EziDebugPrj::ToolQuartus == prj->getToolType())
149
                    {
150
                        prj->parseQuartusPrjFile(ifileList);
151
                    }
152
                    else if(EziDebugPrj::ToolIse == prj->getToolType())
153
                    {
154
                        prj->parseIsePrjFile(ifileList);
155
                    }
156
                    else
157
                    {
158
                        addMessage("error","EziDebug error: EziDebug is not support this kind project file parse!");
159
                        delete prj ;
160
                        pparent->setCurrentProject(NULL);
161
                    }
162
 
163
                    QStringList iaddFileList ;
164
                    QStringList idelFileList ;
165
                    QStringList ichgFileList ;
166
 
167
                    QList<EziDebugPrj::LOG_FILE_INFO*> iaddedinfoList ;
168
                    QList<EziDebugPrj::LOG_FILE_INFO*> ideletedinfoList ;
169
 
170
                    ifileList.sort();
171
 
172
                    prj->compareFileList(ifileList,iaddFileList,idelFileList,ichgFileList);
173
 
174
                    if(prj->updatePrjAllFile(iaddFileList,idelFileList,ichgFileList,iaddedinfoList,ideletedinfoList,false))
175
                    {
176
                        delete prj ;
177
                        pparent->setCurrentProject(NULL);
178
                        qDeleteAll(iaddedinfoList);
179
                        qDeleteAll(ideletedinfoList);
180
                    }
181
                    else
182
                    {
183
                        // store to macro
184
                        prj->addToMacroMap();
185
 
186
                        QString itopModule = prj->getTopModule() ;
187
 
188
                        QString itopModuleComboName = itopModule + QObject::tr(":")+ itopModule ;
189
                        EziDebugInstanceTreeItem* pnewHeadItem = new EziDebugInstanceTreeItem(itopModule,itopModule);
190
                        if(!pnewHeadItem)
191
                        {
192
                            addMessage("error","EziDebug error: There is no memory left!");
193
                            delete prj ;
194
                            pparent->setCurrentProject(NULL);
195
                        }
196
                        else
197
                        {
198
                            if(!itopModule.isEmpty())
199
                            {
200
                                if(prj->getScanChainInfo().count())
201
                                {
202
                                    // 通过备份 进行还原
203
                                    prj->backupChainMap();
204
                                    prj->cleanupBakChainTreeItemMap();
205
                                    prj->cleanupChainTreeItemMap();
206
                                }
207
                                // set the headitem
208
                                prj->setInstanceTreeHeadItem(pnewHeadItem) ;
209
                                if(prj->traverseModuleTree(itopModuleComboName,pnewHeadItem))
210
                                {
211
                                    qDebug() << tr("从log文件恢复失败") << __FILE__ << __LINE__ ;
212
                                    addMessage("error","EziDebug error: resume data failed from EziDebug config file!");
213
 
214
                                    prj->resumeChainMap();
215
                                    prj->updateOperation(EziDebugPrj::OperateTypeNone,NULL,NULL);
216
                                    delete pnewHeadItem ;
217
                                    delete prj ;
218
                                    pparent->setCurrentProject(NULL);
219
                                    qDeleteAll(iaddedinfoList);
220
                                    qDeleteAll(ideletedinfoList);
221
                                    //return ;
222
                                }
223
                                else
224
                                {
225
 
226
                                    if(prj->getBackupChainMap().count())
227
                                    {
228
                                        prj->resumeChainMap();
229
                                        prj->resumeChainTreeItemMap();
230
                                        // 用于清空 备份的 map
231
                                        prj->updateOperation(EziDebugPrj::OperateTypeNone,NULL,NULL);
232
                                    }
233
 
234
 
235
                                    EziDebugInstanceTreeItem::setProject(prj);
236
 
237
                                    if(prj->changedLogFile(iaddedinfoList,ideletedinfoList))
238
                                    {
239
                                        //提示 保存 log 文件出错
240
                                        addMessage("info","EziDebug info: changedLogFile encounter some problem!");
241
                                    }
242
 
243
                                    // 删除 新分配的  log_file_info 指针
244
                                    qDeleteAll(iaddedinfoList);
245
                                    qDeleteAll(ideletedinfoList);
246
 
247
                                    m_peziDebugTreeModel = new EziDebugTreeModel(pnewHeadItem,this);
248
                                    moduleTreeView->setModel(m_peziDebugTreeModel);
249
 
250
                                    // welcomeinfoinit(prj);
251
#if 0
252
                                    QStringList iunexistChainList = prj->checkChainExist();
253
                                    if(iunexistChainList.count())
254
                                    {
255
                                        addMessage("warning","EziDebug warning: Some chains lost partly or full  for some reasons!");
256
                                        for(int i = 0 ; i < iunexistChainList.count() ;i++)
257
                                        {
258
                                            addMessage("warning",tr("EziDebug chain:%1").arg(iunexistChainList.at(i)));
259
                                        }
260
                                    }
261
 
262
                                    if(prj->getDestroyedChainList().count())
263
                                    {
264
                                        // 把所有破坏掉的链打印出来
265
 
266
                                        QString ichain ;
267
                                        QStringList idestroyedChainList = prj->getDestroyedChainList() ;
268
 
269
                                        addMessage("warning","The destroyed chain are:");
270
                                        for(int i = 0 ; i < idestroyedChainList.count() ;i++)
271
                                        {
272
                                            QString ichainName = idestroyedChainList.at(i) ;
273
 
274
                                            EziDebugInstanceTreeItem *pitem = prj->getChainTreeItemMap().value(ichainName);
275
                                            if(pitem)
276
                                            {
277
                                                ichain.append(tr("EziDebug chain:   %1  topInstance:    %2:%3").arg(ichainName)\
278
                                                              .arg(pitem->getModuleName()).arg(pitem->getInstanceName())) ;
279
                                            }
280
                                            addMessage("warning",ichain);
281
                                        }
282
 
283
                                        // 扫描链被破坏 ,提示删除  部分扫描链被破坏  是否删除相关扫描链代码,否则相应扫描链不可用!
284
                                        QMessageBox::StandardButton rb = QMessageBox::question(this, tr("部分扫描链被破坏"), tr("相关扫描链不可用,是否删除相关扫描链代码?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
285
                                        if(rb == QMessageBox::Yes)
286
                                        {
287
                                            QStringList iunDelChainList = prj->deleteDestroyedChain() ;
288
                                            if(iunDelChainList.count())
289
                                            {
290
                                                addMessage("error","EziDebug error: Some chains do not be deleted for some reasons!");
291
                                                for(int i = 0 ; i < iunDelChainList.count() ;i++)
292
                                                {
293
                                                    addMessage("error",tr("EziDebug chain:%1").arg(iunDelChainList.at(i)));
294
                                                }
295
                                                addMessage("error","EziDebug error: Please check the code file is compiled successed!");
296
                                            }
297
 
298
                                            for(int i = 0 ; i < idestroyedChainList.count() ; i++)
299
                                            {
300
                                                QString idestroyedChain = idestroyedChainList.at(i) ;
301
                                                if(!iunDelChainList.contains(idestroyedChain))
302
                                                {
303
                                                    struct EziDebugPrj::LOG_FILE_INFO* pdelChainInfo = new EziDebugPrj::LOG_FILE_INFO ;
304
                                                    memcpy(pdelChainInfo->ainfoName,idestroyedChain.toAscii().data(),idestroyedChain.size()+1);
305
                                                    pdelChainInfo->pinfo = NULL ;
306
                                                    pdelChainInfo->etype = EziDebugPrj::infoTypeScanChainStructure ;
307
                                                    ideletedinfoList << pdelChainInfo ;
308
                                                }
309
 
310
                                            }
311
 
312
                                        }
313
 
314
                                    }
315
 
316
 
317
#if 0
318
                                    if(prj->getScanChainInfo().count())
319
                                    {
320
                                        QMap<QString,EziDebugScanChain*>::const_iterator iaddedChainIter = prj->getScanChainInfo().constBegin() ;
321
                                        while(iaddedChainIter !=  prj->getScanChainInfo().constEnd())
322
                                        {
323
                                            QString ichainName = iaddedChainIter.key();
324
                                            struct EziDebugPrj::LOG_FILE_INFO* pinfo = new EziDebugPrj::LOG_FILE_INFO ;
325
                                            memcpy(pinfo->ainfoName ,ichainName.toAscii().data(),ichainName.size()+1);
326
                                            pinfo->pinfo = iaddedChainIter.value() ;
327
                                            pinfo->etype = EziDebugPrj::infoTypeScanChainStructure ;
328
                                            iaddedinfoList << pinfo ;
329
                                            ++iaddedChainIter ;
330
                                        }
331
                                    }
332
#endif
333
 
334
                                    if(prj->changedLogFile(iaddedinfoList,ideletedinfoList))
335
                                    {
336
                                        //提示 保存 log 文件出错
337
                                        addMessage("info","EziDebug info: changedLogFile encounter some problem!");
338
                                    }
339
 
340
 
341
                                    // 删除 新分配的  log_file_info 指针
342
 
343
                                    qDeleteAll(iaddedinfoList);
344
                                    qDeleteAll(ideletedinfoList);
345
 
346
                                    QStandardItem * pitem = addMessage("info",tr("EziDebug info: The default project parameter:"));
347
                                    addMessage("process",tr("      Scanchain Max Reg Number: %1").arg(prj->getMaxRegNumPerChain()),pitem);
348
                                    addMessage("process",tr("      Project Path: %1").arg(prj->getCurrentDir().absolutePath()),pitem);
349
                                    addMessage("process",tr("      Compile Software: \"%1\"").arg((prj->getToolType() == EziDebugPrj::ToolQuartus) ? ("quartus") :("ise")),pitem);
350
 
351
                                    if(prj->getChainTreeItemMap().count())
352
                                    {
353
                                        QStandardItem * psecondItem = addMessage("info","      EziDebug info: The complete chain are:",pitem);
354
                                        QMap<QString,EziDebugInstanceTreeItem*> itreeItemMap = prj->getChainTreeItemMap() ;
355
                                        QMap<QString,EziDebugInstanceTreeItem*>::const_iterator i = itreeItemMap.constBegin() ;
356
                                        while( i!= itreeItemMap.constEnd())
357
                                        {
358
                                            EziDebugInstanceTreeItem* pitem = i.value();
359
                                            addMessage("process",tr("            EziDebug chain: %1\tInstance Node:%2").arg(i.key()).arg(pitem->getNameData()),psecondItem);
360
                                            EziDebugScanChain *pscanChain = pitem->getScanChainInfo();
361
                                            QString iclockNumStr ;
362
                                            QString itraversedInstStr ;
363
                                            QMap<QString,QVector<QStringList> > iregChain = pscanChain->getRegChain();
364
                                            QMap<QString,QVector<QStringList> >::const_iterator iregChainIter = iregChain.constBegin() ;
365
                                            while( iregChainIter != iregChain.constEnd())
366
                                            {
367
                                                iclockNumStr.append(tr("%1 (%2)     ").arg(pscanChain->getChainRegCount(iregChainIter.key())).arg(iregChainIter.key()));
368
                                                ++iregChainIter ;
369
                                            }
370
 
371
                                            addMessage("process" , tr("            The chain total reg number: %1").arg(iclockNumStr),psecondItem);
372
                                            addMessage("process" , tr("            The traversed NodeList:"),psecondItem);
373
 
374
                                            for(int j = 0 ; j < pscanChain->getInstanceItemList().count() ;j++)
375
                                            {
376
                                                itraversedInstStr.append(tr("  ->  ") + pscanChain->getInstanceItemList().at(j)) ;
377
                                                if((j+1)%3 == 0)
378
                                                {
379
                                                    addMessage("process" , tr("            ") + itraversedInstStr,psecondItem);
380
                                                    itraversedInstStr.clear();
381
                                                }
382
                                            }
383
                                            addMessage("process" , tr("            ") + itraversedInstStr,psecondItem);
384
 
385
                                            ++i ;
386
                                        }
387
                                    }
388
 
389
 
390
                                    UpdateDetectThread * pthread = prj->getThread() ;
391
                                    pthread->start();
392
#endif
393
                                }
394
                            }
395
                            else
396
                            {
397
                                addMessage("error","EziDebug error: There is no top module definition!");
398
                                delete pnewHeadItem ;
399
                                delete prj ;
400
                                pparent->setCurrentProject(NULL);
401
                            }
402
                        }
403
                    }
404
                }
405
 
406
            }
407
            else
408
            {
409
                /*向文本栏 传递错误信息 默认路径不存在log文件*/
410
                addMessage("warning","EziDebug warning: There is no EziDebug config File !");
411
                delete prj ;
412
                pparent->setCurrentProject(NULL);
413
            }
414
        }
415
    }
416
    else
417
    {
418
       addMessage("info",tr("EziDebug info: There is no default EziDebug project file!"));
419
       moduleTreeView->setModel(NULL);
420
    }
421
 
422
//    //创建状态栏
423
//    //m_pStatuBar = new StatuBar(this);
424
 
425
    //创建布局
426
    //QHBoxLayout *secondLayout = new QHBoxLayout(this);
427
    QVBoxLayout *mainLayout = new QVBoxLayout(this) ;
428
    //将部件加入到布局中
429
    mainLayout->addWidget(titleBar);
430
    //mainLayout->addWidget(closeButton);
431
    //secondLayout->addStretch(1);
432
    //secondLayout->addWidget(closeButton);
433
    //mainLayout->addLayout(secondLayout);
434
    mainLayout->addWidget(mainSplitter);
435
 
436
    //mainLayout->addWidget(m_pStatuBar);
437
 
438
 
439
//    mainSplitter->setStyleSheet("Splitter{margin-left:8px;margin-right:6px;margin-top:6px;margin-bottom:10px;}");
440
    mainSplitter->setStyleSheet("Splitter{margin-left:6px;margin-right:6px;margin-top:3px;margin-bottom:10px;}");
441
    //设置间距与边缘空白
442
    mainLayout->setSpacing(0);
443
    mainLayout->setContentsMargins(0,0,0,0);
444
//    mainLayout->setGeometry(QRect(this->geometry().left(),this->geometry().top(),100,100));
445
    setLayout(mainLayout);
446
 
447
 
448
 
449
    //设置列表窗口的背景
450
    setAutoFillBackground(true);
451
    //设置调色板
452
    listBackground.load(":/images/listBackground.bmp",//4.jpg",
453
                        0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);
454
    QPalette palette;
455
    palette.setBrush(QPalette::Background, QBrush(listBackground));//竖条纹背景对应这QBrush(listBackground.copy(0, 0, 850, 480))
456
//    palette.setBrush(QPalette::Window,
457
//                     QBrush(listBackground.scaled(size(), Qt::IgnoreAspectRatio,
458
//                                                  Qt::SmoothTransformation)));
459
    setPalette(palette);
460
//  setGeometry(QRect(toolWindow->frameGeometry().bottomLeft().rx(),
461
//                      toolWindow->frameGeometry().bottomLeft().ry(),
462
//                      290, 105));
463
    //setGeometry(QRect(100, 100, 290, 105));
464
    resize(listBackground.size());
465
 
466
    //isListWindowAdsorbedFlag = true;//初始状态下,ListWindow吸附在toolWindow下方
467
 
468
    //设置掩板
469
    //生成一张位图
470
    QBitmap objBitmap(size());
471
    //QPainter用于在位图上绘画
472
    QPainter painter(&objBitmap);
473
    //填充位图矩形框(用白色填充)
474
    painter.fillRect(rect(),Qt::white);
475
    painter.setBrush(QColor(0,0,0));
476
    //在位图上画圆角矩形(用黑色填充)
477
    painter.drawRoundedRect(this->rect(),4,4);
478
    //使用setmask过滤即可
479
    setMask(objBitmap);
480
 
481
 
482
    //设置为无边框
483
    //setWindowFlags(Qt::FramelessWindowHint);
484
    //设置窗口的最大尺寸(桌面)和最小尺寸(图片的尺寸)
485
    setMinimumSize(listBackground.size());
486
    setMaximumSize(qApp->desktop()->size());
487
    //setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
488
    isMaxWin = false;   //初始状态下不是最大化的窗口
489
    //isDrag = true ;
490
    isDrag = false ;
491
    isStick = false ;
492
 
493
 
494
    //放大,方便调试
495
//    resize(291,106);
496
 
497
 
498
    //设置普通模式下的按键
499
    //exitButton->setGeometry(QRect(273, 4, 11, 10));
500
    //menuBar->setGeometry(1, 18, 273, 18);//1, 18, 274, 34
501
    //titleBar->setGeometry(0,0,290,17);
502
    qDebug()<< this->hasMouseTracking();
503
}
504
 
505
ListWindow::~ListWindow()
506
{
507
    qDebug() << "Attention: Begin destruct listwindow object!";
508
    if(m_peziDebugTreeModel)
509
        delete m_peziDebugTreeModel ;
510
 
511
}
512
 
513
QStandardItem *ListWindow::addMessage(const QString &type ,const QString &message ,QStandardItem *parentitem)
514
{
515
    if(!m_iShowMessageModel)
516
    {
517
        return NULL ;
518
    }
519
    QStandardItem* pparentItem ;
520
    QStandardItem* piconItem ;
521
    QStandardItem* pstrItem ;
522
    QList<QStandardItem*> iitemList ;
523
 
524
    if(!parentitem)
525
    {
526
        pparentItem = m_iShowMessageModel->invisibleRootItem() ;
527
    }
528
    else
529
    {
530
        pparentItem = parentitem ;
531
    }
532
 
533
    if(type.toLower() == "warning")
534
    {
535
        QIcon iwarning(":/images/warning");
536
        piconItem = new QStandardItem(iwarning,"");
537
        pstrItem = new QStandardItem(message);
538
        //pstrItem->setForeground(QBrush(QColor(22,130,54)));
539
        pstrItem->setForeground(QBrush(QColor(21,255,21)));
540
        pstrItem->setFont(QFont("Times", 10 , QFont::Bold));
541
    }
542
    else if(type.toLower() == "info")
543
    {
544
        QIcon iinfo(":/images/info");
545
        piconItem = new QStandardItem(iinfo,"");
546
        pstrItem = new QStandardItem(message);
547
        pstrItem->setFont(QFont("Times", 10 , QFont::Black));
548
    }
549
    else if(type.toLower() == "error")
550
    {
551
        QIcon ierror(":/images/error");
552
        piconItem = new QStandardItem(ierror,"");
553
        pstrItem = new QStandardItem(message);
554
        pstrItem->setForeground(QBrush(QColor(255,0,0)));
555
        pstrItem->setFont(QFont("Times", 10 , QFont::Normal));
556
    }
557
    else if(type.toLower() == "process")
558
    {
559
        QIcon iok(":/images/ok");
560
        piconItem = new QStandardItem(iok,"");
561
        pstrItem = new QStandardItem(message);
562
        pstrItem->setForeground(QBrush(QColor(0,0,255)));
563
        pstrItem->setFont(QFont("Times", 10 , QFont::Normal));
564
    }
565
    else if(type.toLower() == "welcome")
566
    {
567
        QIcon iok1(":/images/ok_1");
568
        piconItem = new QStandardItem(iok1,"");
569
        pstrItem = new QStandardItem(message);
570
        pstrItem->setFont(QFont("Times", 10 , QFont::Bold));
571
    }
572
    else
573
    {
574
        QIcon iinfo(":/images/info");
575
        piconItem = new QStandardItem(iinfo,"");
576
        pstrItem = new QStandardItem(message);
577
        pstrItem->setFont(QFont("Times", 10 , QFont::Black));
578
    }
579
 
580
    iitemList << piconItem << pstrItem ;
581
    pparentItem->appendRow(iitemList);
582
 
583
 
584
    return  pparentItem->child((pparentItem->rowCount()-1),0) ;
585
}
586
 
587
 
588
//获取ToolWindow的指针,以获取其位置等信息
589
void ListWindow::getToolWindowPointer(QWidget *toolWin)
590
{
591
    toolWindow = toolWin;
592
}
593
 
594
void ListWindow::createButtons()
595
{
596
 
597
//    exitButton = createToolButton(tr("退出"),
598
//                                  QIcon(":/images/ListWindowExit.bmp"),
599
//                                  QSize(11, 10),
600
//                                  SLOT(close()));
601
 
602
}
603
 
604
void ListWindow::createActions()
605
{
606
    proSettingWizardAct = new QAction(tr("工程设置向导"), this);
607
    //normalAct->setShortcuts(QKeySequence::Quit);
608
    //normalAct->setStatusTip(tr("Exit the application"));
609
    connect(proSettingWizardAct, SIGNAL(triggered()), this, SLOT(proSetting()));
610
 
611
    setProPathAct = new QAction(tr("工程目录"), this);
612
    connect(setProPathAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
613
 
614
    setRegNumACt = new QAction(tr("设置寄存器个数"), this);
615
    connect(setRegNumACt, SIGNAL(triggered()), this, SLOT(proUpdate()));
616
 
617
    useVerilogAct = new QAction(tr("使用verilog语言"), this);
618
    useVerilogAct->setCheckable(true);
619
    //useVerilogAct->setChecked(spreadsheet->showGrid());
620
    connect(useVerilogAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
621
 
622
    useVHDLAct = new QAction(tr("使用VHDL语言"), this);
623
    useVHDLAct->setCheckable(true);
624
    //useVerilogAct->setChecked(spreadsheet->showGrid());
625
    connect(useVHDLAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
626
 
627
    useMixeLanguagedAct = new QAction(tr("使用verilong和VHDL语言"), this);
628
    useMixeLanguagedAct->setCheckable(true);
629
    //useVerilogAct->setChecked(spreadsheet->showGrid());
630
    connect(useMixeLanguagedAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
631
 
632
    setSlotAct = new QAction(tr("设置计时器的时钟"), this);
633
    connect(setSlotAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
634
 
635
    useAlteraAct = new QAction(tr("使用Altera"), this);
636
    useAlteraAct->setCheckable(true);
637
    //useVerilogAct->setChecked(spreadsheet->showGrid());
638
    connect(useAlteraAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
639
 
640
    useXilinxAct = new QAction(tr("使用Xilinx"), this);
641
    useXilinxAct->setCheckable(true);
642
    //useVerilogAct->setChecked(spreadsheet->showGrid());
643
    connect(useXilinxAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
644
 
645
    exitAct = new QAction(tr("退出"), this);
646
    exitAct->setShortcuts(QKeySequence::Quit);
647
    //exitAct->setStatusTip(tr("退出"));
648
    connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
649
 
650
 
651
    rankAfterFileNameAct = new QAction(tr("按文件名"), this);
652
    connect(rankAfterFileNameAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
653
 
654
    rankAfterPathNameAct = new QAction(tr("按路径名"), this);
655
    connect(rankAfterPathNameAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
656
 
657
 
658
    fastOrientAct = new QAction(tr("快速定位"), this);
659
    connect(fastOrientAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
660
 
661
    findAct = new QAction(tr("查找"), this);
662
    //connect(findAct, SIGNAL(triggered()), this, SLOT());
663
    connect(findAct, SIGNAL(triggered()), this, SLOT(find()));
664
 
665
    findNextAct = new QAction(tr("查找下一个"), this);
666
    connect(findNextAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
667
 
668
 
669
    aboutEziDebugAct = new QAction(tr("关于..."), this);
670
    connect(aboutEziDebugAct, SIGNAL(triggered()), this, SLOT(about()));
671
 
672
    helpFileAct = new QAction(tr("帮助"), this);
673
    connect(helpFileAct, SIGNAL(triggered()), this, SLOT(proUpdate()));
674
}
675
 
676
void ListWindow::createMenus()
677
{
678
    menuBar = new MenuBar(this);
679
 
680
    addMenu = menuBar->addMenu(tr("添加"));
681
    addMenu->addAction(proSettingWizardAct);
682
    addMenu->addAction(setProPathAct);
683
    addMenu->addAction(setRegNumACt);
684
    addMenu->addSeparator();
685
    addMenu->addAction(useVerilogAct);
686
    addMenu->addAction(useVHDLAct);
687
    addMenu->addAction(useMixeLanguagedAct);
688
    addMenu->addSeparator();
689
    addMenu->addAction(setSlotAct);
690
    addMenu->addSeparator();
691
    addMenu->addAction(useAlteraAct);
692
    addMenu->addAction(useXilinxAct);
693
    addMenu->addSeparator();
694
    addMenu->addAction(exitAct);
695
 
696
    checkMenu = menuBar->addMenu(tr("查看"));
697
 
698
    sortMenu = menuBar->addMenu(tr("排序"));
699
    sortMenu->addAction(rankAfterFileNameAct);
700
    sortMenu->addAction(rankAfterPathNameAct);
701
 
702
    findMenu = menuBar->addMenu(tr("查找"));
703
    findMenu->addAction(fastOrientAct);
704
    findMenu->addSeparator();
705
    findMenu->addAction(findAct);
706
    findMenu->addAction(findNextAct);
707
 
708
    helpMenu = menuBar->addMenu(tr("帮助"));
709
    helpMenu->addAction(aboutEziDebugAct);
710
    helpMenu->addAction(helpFileAct);
711
 
712
//    //获取图像
713
//    QPixmap objPixmap(tr(":/images/listWindowMenubar.bmp"));
714
//    //得到图像宽和高
715
//    int nPixWidth = objPixmap.width() / 5;
716
//    int nPixHeight = objPixmap.height();
717
//    addMenu->setIcon(QIcon(objPixmap.copy(nPixWidth*0,0,nPixWidth,nPixHeight)));
718
//    checkMenu->setIcon(QIcon(objPixmap.copy(nPixWidth*1,0,nPixWidth,nPixHeight)));
719
//    sortMenu->setIcon(QIcon(objPixmap.copy(nPixWidth*2,0,nPixWidth,nPixHeight)));
720
//    findMenu->setIcon(QIcon(objPixmap.copy(nPixWidth*3,0,nPixWidth,nPixHeight)));
721
//    helpMenu->setIcon(QIcon(objPixmap.copy(nPixWidth*4,0,nPixWidth,nPixHeight)));
722
 
723
//    addMenu->setContentsMargins(0,0,0,0);
724
//    //addMenu->setBaseSize(QSize(nPixWidth,nPixHeight));
725
//    //addMenu->setSizeIncrement(nPixWidth,nPixHeight);
726
//    addMenu->setFixedSize(nPixWidth,nPixHeight);
727
 
728
 
729
}
730
 
731
//void ListWindow::contextMenuEvent(QContextMenuEvent *event)
732
//{
733
//    QMenu menu(this);
734
//    menu.addAction(ListWindowmizeAct);
735
//    menu.addAction(normalAct);
736
//    menu.addAction(exitAct);
737
//    menu.exec(event->globalPos());
738
//}
739
 
740
 
741
 
742
 
743
 
744
 
745
//void ListWindow::mousePressEvent(QMouseEvent * event)
746
//{
747
//    if (event->button() == Qt::LeftButton) //点击左边鼠标
748
//    {
749
//        //globalPos()获取根窗口的相对路径,frameGeometry().topLeft()获取主窗口左上角的位置
750
//        dragPosition = event->globalPos() - frameGeometry().topLeft();
751
//        event->accept();   //鼠标事件被系统接收
752
//    }
753
//    //    if (event->button() == Qt::RightButton)
754
//    //    {
755
//    //         close();
756
//    //    }
757
//}
758
 
759
//void ListWindow::mouseMoveEvent(QMouseEvent * event)
760
//{
761
//    if (event->buttons() == Qt::LeftButton) //当满足鼠标左键被点击时。
762
//    {
763
//        move(event->globalPos() - dragPosition);//移动窗口
764
////        //如果ListWindow的上边沿和ToolWindow的下边沿靠近,则移至紧紧贴合的位置
765
////        int disY = toolWindow->geometry().bottom() - this->geometry().top();
766
////        if(disY < 5 || disY > -5){
767
////            move(this->geometry().left(), this->geometry().top() + disY);
768
////        }
769
//        event->accept();
770
//    }
771
//}
772
 
773
//void ListWindow::mouseReleaseEvent(QMouseEvent *event)
774
//{
775
////    if (event->buttons() == Qt::LeftButton) //当满足鼠标左键被点击时。
776
////    {
777
 
778
//        //如果ListWindow的上边沿和ToolWindow的下边沿靠近,则移至紧紧贴合的位置
779
//        int disY = toolWindow->geometry().bottom() - this->geometry().top();
780
//        if((disY < 15) && (disY > -15)){
781
//            move(this->geometry().left(), this->geometry().top() + disY);//移动窗口
782
//            toolWindow->setListWindowAdsorbedFlag(true);
783
//        }
784
//        else{
785
//            toolWindow->setListWindowAdsorbedFlag(false);
786
//        }
787
 
788
//        event->accept();
789
////    }
790
//}
791
 
792
 
793
 
794
 
795
//当鼠标移动到主界面内部周围5像素时,改变鼠标形状;当进行伸缩拖动时,根据拖动方向进行主界面的位置和大小设置即可。
796
//鼠标按下事件
797
void ListWindow::mousePressEvent(QMouseEvent *event)
798
{
799
//    static int i = 0 ;
800
//    qDebug()<<"mouse Press Event"<<i++ ;
801
    if (event->button() == Qt::LeftButton)
802
    {
803
        oldPointGlobal = pointPressGlobal = event->globalPos();
804
        isLeftButtonPress = true;
805
 
806
        oldWindowPoint = this->geometry().topLeft();
807
 
808
        mousePressPoint = event->pos();
809
        parentRect = parentWidget()->geometry();
810
        //isDrag = true ;
811
    }
812
    event->accept();
813
}
814
 
815
// 窗体拖动事件
816
void ListWindow::moveEvent(QMoveEvent *event)
817
{
818
//    static int i = 0 ;
819
//    qDebug()<<"moveEvent"<<i++ ;
820
//    QWidget * parent = this->parentWidget();
821
//    const int disMax = 30;
822
//    ToolWindow* parent_tool = static_cast<ToolWindow*>(parent);
823
//    parent_tool->setListWindowAdsorbedFlag(false);
824
 
825
//    int dis = parent_tool->geometry().bottom() - this->geometry().top();
826
//    if((dis < disMax) && (dis > -disMax)){
827
////        move(this->geometry().left(), parent->geometry().bottom());//移动窗口
828
////        move(200,300);
829
//        qDebug()<< parent_tool->geometry().left()<< parent_tool->geometry().right() \
830
//                   << parent_tool->geometry().top()<< parent_tool->geometry().bottom ();
831
 
832
//        qDebug()<< this->geometry().left()<< this->geometry().right() \
833
//                   << this->geometry().top()<< this->geometry().bottom ();
834
 
835
//        move(300,400);
836
//        qDebug()<<"move the widget to bottom of parent !";
837
//        parent_tool->setListWindowAdsorbedFlag(true);
838
//    }
839
//    dis = parent->geometry().top() - this->geometry().bottom();
840
//    if((dis < disMax) && (dis > -disMax)){
841
//        move(this->geometry().left(), this->geometry().top() + dis);//移动窗口
842
//        parent_tool->setListWindowAdsorbedFlag(true);
843
//    }
844
//    dis = parent->geometry().right() - this->geometry().left();
845
//    if((dis < disMax) && (dis > -disMax)){
846
//        move(parent->geometry().right(), this->geometry().top());//移动窗口
847
//        parent_tool->setListWindowAdsorbedFlag(true);
848
//    }
849
//    dis = parent->geometry().left() - this->geometry().right();
850
//    if((dis < disMax) && (dis > -disMax)){
851
//        move(this->geometry().left() + dis, this->geometry().top());//移动窗口
852
//        parent_tool->setListWindowAdsorbedFlag(true);
853
//    }
854
//    event->accept();
855
      event->ignore();
856
 
857
    //  event->accept();
858
     // QWidget::moveEvent(event);
859
      //event->accept();
860
}
861
 
862
//鼠标移动事件
863
void ListWindow::mouseMoveEvent(QMouseEvent *event)
864
{
865
    //qDebug()<<"ListWindow::mouseMoveEvent" ;
866
    // qDebug()<<"ListWindow::mouseMoveEvent"<<this->geometry().width()<<this->geometry().height()<<"mouse track!"<<event->x()<<event->y();
867
    if(!isLeftButtonPress)
868
    {
869
        eDirection = (enum_Direction)PointValid(event->x(),event->y());
870
 
871
        SetCursorStyle(eDirection);
872
 
873
    }
874
    else
875
    {
876
        int nXGlobal = event->globalX();
877
        int nYGlobal = event->globalY();
878
        NewPointGlobal = event->globalPos();
879
        SetDrayMove(nXGlobal,nYGlobal,eDirection);
880
        pointPressGlobal =QPoint(nXGlobal,nYGlobal);
881
        if(cursor().shape() == Qt::ArrowCursor)
882
        {
883
            mouseMovePoint = event->pos() ;
884
            diffPos = event->pos() - mousePressPoint;
885
            magneticMove(parentRect,geometry());
886
        }
887
 
888
    }
889
    event->accept();
890
}
891
//鼠标释放事件
892
void ListWindow::mouseReleaseEvent(QMouseEvent *event)
893
{
894
    if (event->button() == Qt::LeftButton)
895
    {
896
        isLeftButtonPress = false;
897
        eDirection = eNone;
898
        //isDrag = false ;
899
    }
900
    event->accept();
901
}
902
 
903
//鼠标双击事件
904
void ListWindow::mouseDoubleClickEvent(QMouseEvent *event)
905
{
906
    //Null
907
//    qDebug()<< "list window"<<this->frameGeometry().left() << this->frameGeometry().top();
908
    if ((event->button() == Qt::LeftButton) && (event->y()<= 10))
909
        //if ((event->button() == Qt::LeftButton) && (event->y()<= titleBar->height()))
910
     {
911
        if(!isMaxWin)
912
        {
913
            rectRestoreWindow = geometry();
914
            setGeometry(qApp->desktop()->availableGeometry());
915
        }
916
        else
917
        {
918
            setGeometry(rectRestoreWindow);
919
        }
920
        isMaxWin = !isMaxWin;
921
    }
922
    event->accept();
923
}
924
 
925
void ListWindow::magneticMove(const QRect &bechmarkRect, const QRect &targetRect)
926
{
927
    int bechmarkLeft = bechmarkRect.left();
928
    int bechmarkRight = bechmarkRect.right();
929
    int bechmarkTop = bechmarkRect.top();
930
    int bechmarkBottom = bechmarkRect.bottom();
931
    int targetLeft = targetRect.left();
932
    int targetRight = targetRect.right();
933
    int targetTop = targetRect.top();
934
    int targetBottom = targetRect.bottom();
935
    QPoint finalPosition;
936
    const int magneticOffset = 12 ;
937
 
938
    isStick = false;
939
//    qDebug()<< "move widget"<<tr("上") <<targetTop <<tr("下") << targetBottom \
940
//            <<tr("左")<< targetLeft <<tr("右")<< targetRight ;
941
 
942
//    qDebug()<< "static widget"<<tr("上") <<bechmarkTop <<tr("下") << bechmarkBottom \
943
//            <<tr("左")<< bechmarkLeft <<tr("右")<< bechmarkRight ;
944
 
945
//    qDebug()<< "magneticMove" << mousePressPoint.x() << mousePressPoint.y() \
946
//            << mouseMovePoint.x()<< mouseMovePoint.y()<< this->parentWidget()->geometry().bottom()\
947
//               << this->parentWidget()->geometry().right();
948
    /*
949
    qDebug() << "bechmarkLeft - targetLeft:" << qAbs(bechmarkLeft - targetLeft);
950
    qDebug() << "pos().y():" << pos().y();
951
    qDebug() << "geometry().top():" << geometry().top();
952
    qDebug() << "bechmarkBottom:" << bechmarkBottom;
953
    qDebug() << "bechmarkTop - targetRect.height()):" << bechmarkTop - targetRect.height();
954
    */
955
 
956
    //if (qAbs(bechmarkLeft - targetLeft) < qAbs(bechmarkRight - targetLeft))
957
    //move(pos() + diffPos);
958
    // 移动窗口 的 pos()
959
    //horizontal-1:left to left
960
     //&& (pos().y() <= bechmarkBottom && pos().y() >= (bechmarkTop - targetRect.height()))
961
    if(qAbs(diffPos.x()) < magneticOffset \
962
       &&qAbs(bechmarkLeft - targetLeft) < magneticOffset
963
       && bechmarkRect.intersects(geometry()))
964
    {
965
        qDebug() << "Left To Left" << endl;
966
        //move(geometry().topLeft() + diffPos);
967
        //move(bechmarkLeft, pos().y() + diffPos.y());
968
        finalPosition.setX(bechmarkLeft);
969
        finalPosition.setY(pos().y() + diffPos.y());
970
        isStick |= true;
971
    }
972
 
973
    //horizontal-2:left to right
974
    if (qAbs(diffPos.x()) < magneticOffset
975
        && qAbs(bechmarkRight - targetLeft) < magneticOffset
976
        && bechmarkRect.intersects(QRect(pos().x() - magneticOffset, pos().y(),
977
                                     targetRect.width(), targetRect.height())))
978
    {
979
        qDebug() << "Left To Right" << endl;
980
        //move(bechmarkRight, pos().y() + diffPos.y());
981
        finalPosition.setX(bechmarkRight);
982
        finalPosition.setY(pos().y() + diffPos.y());
983
        isStick |= true;
984
    }
985
 
986
    //horizontal-3:right to left
987
    if (qAbs(diffPos.x()) < magneticOffset
988
    && qAbs(bechmarkLeft - targetRight) < magneticOffset
989
    && bechmarkRect.intersects(QRect(pos().x(), pos().y(),
990
                                     targetRect.width() + magneticOffset, targetRect.height())))
991
    {
992
        qDebug() << "Right TO Left" << endl;
993
        //move(pos().x() + (bechmarkLeft - targetRight),
994
        //    pos().y() + diffPos.y());
995
        finalPosition.setX(pos().x() + bechmarkLeft - targetRight);
996
        finalPosition.setY(pos().y() + diffPos.y());
997
        qDebug() << "finalPosition.x():" << finalPosition.x() << endl;
998
        qDebug() << "bechmarkLeft - targetRect.width():" << bechmarkLeft - targetRect.width();
999
        isStick |= true;
1000
    }
1001
 
1002
    //horizontal-4:right to right
1003
    if (qAbs(diffPos.x()) < magneticOffset
1004
        && qAbs(bechmarkRight - targetRight) < magneticOffset
1005
        //&& bechmarkRect.intersects(geometry())
1006
        )
1007
    {
1008
        qDebug() << "Right TO Right" << endl;
1009
        //move(pos().x() + (bechmarkRight - targetRight), pos().y() + diffPos.y());
1010
        finalPosition.setX(pos().x() + (bechmarkRight - targetRight));
1011
        //finalPosition.setX(targetLeft + (bechmarkRight - targetRight));
1012
        finalPosition.setY(pos().y() + diffPos.y());
1013
        isStick |= true;
1014
    }
1015
 
1016
    //veritcal-1:top to top
1017
    if (qAbs(diffPos.y()) < magneticOffset
1018
        && qAbs(bechmarkTop - targetTop) < magneticOffset \
1019
            && bechmarkRect.intersects(geometry())
1020
        //&& (isStick || bechmarkRect.intersects(geometry()))
1021
        )
1022
    {
1023
        qDebug() << "Top TO Top" << endl;
1024
 
1025
        if (isStick)
1026
        finalPosition.setY(bechmarkTop);
1027
        else
1028
        {
1029
            finalPosition.setX(pos().x() + diffPos.x());
1030
            finalPosition.setY(bechmarkTop);
1031
        }
1032
 
1033
        //move(pos().x() + diffPos.x(), bechmarkTop);
1034
        isStick |= true;
1035
    }
1036
 
1037
    //veritcal-2:top to bottom
1038
    if (qAbs(diffPos.y()) < magneticOffset
1039
        && qAbs(bechmarkBottom - targetTop) < magneticOffset
1040
        && bechmarkRect.intersects(QRect(pos().x(), pos().y()- magneticOffset,
1041
                                         targetRect.width(), targetRect.height())))
1042
    {
1043
        qDebug() << "Top To Bottom" << endl;
1044
        //move(pos().x() + diffPos.x(), bechmarkBottom);
1045
        if (isStick)
1046
        {
1047
            qDebug() << "case 1" ;
1048
            finalPosition.setY(bechmarkBottom);
1049
        }
1050
        else
1051
        {
1052
//            finalPosition.setX(pos().x() + diffPos.x());
1053
            finalPosition.setX(pos().x()+diffPos.x());
1054
            finalPosition.setY(bechmarkBottom);
1055
        }
1056
        isStick |= true;
1057
    }
1058
 
1059
    //veritcal-3:bottom to top
1060
    if (qAbs(diffPos.y()) < magneticOffset
1061
        && qAbs(bechmarkTop - targetBottom) < magneticOffset
1062
        && bechmarkRect.intersects(QRect(pos().x(), pos().y(),
1063
        targetRect.width(), targetRect.height() + magneticOffset)))
1064
    {
1065
        qDebug() << "Bottom TO Top" << endl;
1066
        if (isStick)
1067
        {
1068
            qDebug() << "case 2";
1069
            finalPosition.setY(pos().y() + (bechmarkTop - targetBottom));
1070
        }
1071
        else
1072
        {
1073
            finalPosition.setX(pos().x() + diffPos.x());
1074
            finalPosition.setY(pos().y() + (bechmarkTop - targetBottom));
1075
        }
1076
        //move(pos().x() + diffPos.x(), pos().y() + (bechmarkTop - targetBottom));
1077
        isStick |= true;
1078
    }
1079
 
1080
    //veritcal-4:bottom to bottom
1081
    if (qAbs(diffPos.y()) < magneticOffset
1082
        && qAbs(bechmarkBottom - targetBottom) < magneticOffset
1083
        && bechmarkRect.intersects(geometry()))
1084
    {
1085
        qDebug() << "Bottom TO Bottom" << endl;
1086
 
1087
        if (isStick)
1088
            finalPosition.setY(pos().y() + (bechmarkBottom - targetBottom));
1089
        else
1090
        {
1091
            finalPosition.setX(pos().x() + diffPos.x());
1092
            finalPosition.setY(pos().y() + (bechmarkBottom - targetBottom));
1093
        }
1094
        //move(pos().x() + diffPos.x(), pos().y() + (bechmarkBottom - targetBottom));
1095
 
1096
        isStick |= true;
1097
    }
1098
 
1099
    if (isStick)
1100
    {
1101
        qDebug()<< "finalPosition" << finalPosition.x()<< finalPosition.y() << isStick ;
1102
        move(finalPosition);
1103
    }
1104
    else
1105
    {
1106
 
1107
        qDebug()<<"!!!move the widget!!!" << diffPos.x()<< diffPos.y()\
1108
               << (pos() + diffPos).x()<<(pos() + diffPos).y() << isStick;
1109
 
1110
        move(pos() + diffPos);
1111
    }
1112
//        move(oldWindowPoint+NewPointGlobal-oldPointGlobal);
1113
//        i++ ;
1114
////        move(700,10+i*10);
1115
//        move(700+diffPos.x(),i*5+diffPos.y());
1116
}
1117
 
1118
//判断鼠标所在位置在当前窗口的什么位置,上下左右 边界上,或者都不是
1119
int ListWindow::PointValid(int x, int y)
1120
{
1121
    enum_Direction direction = eNone;
1122
 
1123
//    int top = geometry().top();
1124
//    int bottom = geometry().bottom();
1125
//    int left = geometry().left();
1126
//    int right = geometry().right();
1127
//    int width = this->width();
1128
//    int height = this->height();
1129
 
1130
//    int ra = this->x();
1131
//    int rb = this->y();
1132
 
1133
//    QRect rr = rect();
1134
//    QRect rg = geometry();
1135
//    QPoint q1 = geometry().topLeft();
1136
//    QPoint q2 = geometry().bottomRight();
1137
 
1138
//    QSize rsize = this->size();
1139
 
1140
 
1141
//    if ((x >= left) && (x < left + 5))
1142
//    {
1143
//        if((y >= top) && (y < top + 5))
1144
//            direction = eLeftTop;
1145
//        else if((y > bottom - 5) && (y <= bottom))
1146
//            direction = eBottomLeft;
1147
//        else
1148
//            direction = eLeft;
1149
//    }
1150
//    else if((x > right - 5) && (x <= right))
1151
//    {
1152
//        if((y >= top) && (y < top + 5))
1153
//            direction = eTopRight;
1154
//        else if((y > bottom - 5) && (y <= bottom))
1155
//            direction = eRightBottom;
1156
//        else
1157
//            direction = eLeft;
1158
//    }
1159
    // this is listwindow
1160
    if ((x >= 0) && (x < 5))
1161
    {
1162
        if((y >= 0) && (y < 5))
1163
            direction = eLeftTop;
1164
        else if((y > this->height() - 5) && (y <= this->height()))
1165
            direction = eBottomLeft;
1166
        else
1167
            direction = eLeft;
1168
    }
1169
    else if((x > this->width() - 5) && (x <= this->width()))
1170
    {
1171
        if((y >= 0) && (y < 5))
1172
            direction = eTopRight;
1173
        else if((y > this->height() - 5) && (y <= this->height()))
1174
            direction = eRightBottom;
1175
        else
1176
            direction = eRight;
1177
    }
1178
    else if((y >= 0) && (y < 5))
1179
    {
1180
        direction = eTop;
1181
    }
1182
    else if((y > this->height() - 5) && (y <= this->height()))
1183
    {
1184
        direction = eBottom;
1185
    }
1186
 
1187
    //qDebug() << "judget direction" << x << y << direction ;
1188
    return (int)direction;
1189
}
1190
 
1191
//设置鼠标样式
1192
void ListWindow::SetCursorStyle(enum_Direction direction)
1193
{
1194
    //设置上下左右以及右上、右下、左上、坐下的鼠标形状
1195
    //isDrag = false ;
1196
    switch(direction)
1197
    {
1198
    case eTop:
1199
    case eBottom:
1200
        setCursor(Qt::SizeVerCursor);
1201
        break;
1202
    case eRight:
1203
    case eLeft:
1204
        setCursor(Qt::SizeHorCursor);
1205
        break;
1206
    case eTopRight:
1207
    case eBottomLeft:
1208
        setCursor(Qt::SizeBDiagCursor);
1209
        break;
1210
    case eRightBottom:
1211
    case eLeftTop:
1212
        setCursor(Qt::SizeFDiagCursor);
1213
        break;
1214
    default:
1215
        {
1216
            setCursor(Qt::ArrowCursor);
1217
            //isDrag = true ;
1218
        }
1219
        break;
1220
    }
1221
}
1222
 
1223
//设置鼠标拖动的窗口位置信息
1224
void ListWindow::SetDrayMove(int nXGlobal,int nYGlobal,enum_Direction direction)
1225
{
1226
//    //计算偏差
1227
//    int ndX = nXGlobal - pointPressGlobal.x();
1228
//    int ndY = nYGlobal - pointPressGlobal.y();
1229
    //获得主窗口位置信息
1230
 
1231
    QRect rectWindow = geometry();
1232
    qDebug()<< "direction" << direction << geometry().bottom()<<geometry().right();
1233
    //判别方向
1234
    switch(direction)
1235
    {
1236
    case eTop:
1237
        rectWindow.setTop(nYGlobal);
1238
        break;
1239
    case eBottom:
1240
        rectWindow.setBottom(nYGlobal);
1241
        break;
1242
    case eRight:
1243
        rectWindow.setRight(nXGlobal);
1244
        //titleBar->lineLabel->
1245
                //resize(titleBar->lineLabel->size().width() + ndX,
1246
                //                    titleBar->lineLabel->size().height());
1247
        break;
1248
    case eLeft:
1249
        rectWindow.setLeft(nXGlobal);
1250
        break;
1251
    case eTopRight:
1252
        rectWindow.setTop(nYGlobal);
1253
        rectWindow.setRight(nXGlobal);
1254
        break;
1255
    case eBottomLeft:
1256
        rectWindow.setBottom(nYGlobal);
1257
        rectWindow.setLeft(nXGlobal);
1258
        break;
1259
    case eRightBottom:
1260
        rectWindow.setBottom(nYGlobal);
1261
        rectWindow.setRight(nXGlobal);
1262
        break;
1263
    case eLeftTop:
1264
        rectWindow.setTop(nYGlobal);
1265
        rectWindow.setLeft(nXGlobal);
1266
         break;
1267
    default:
1268
        break;
1269
    }
1270
 
1271
    qDebug()<< "new pos" << rectWindow.top()<< rectWindow.left()<<rectWindow.width()<< rectWindow.height() \
1272
               <<nXGlobal << nYGlobal;
1273
    if(rectWindow.width()< minimumWidth() || rectWindow.height()<minimumHeight())
1274
    {
1275
        qDebug()<< "the window size less than miniumWidth ";
1276
 
1277
 
1278
        return;
1279
    }
1280
 
1281
//  qDebug()<< "new pos" << rectWindow.top()<< rectWindow.left()<<rectWindow.width()<< rectWindow.height();
1282
    qDebug()<< "move positon";
1283
    //重新设置窗口位置为新位置信息
1284
    setGeometry(rectWindow);
1285
//    move(100,200);
1286
}
1287
 
1288
 
1289
 
1290
 
1291
 
1292
 
1293
 
1294
 
1295
 
1296
 
1297
 
1298
 
1299
 
1300
 
1301
//bool ListWindow::isAdsorbed()
1302
//{
1303
//    return isNormalListWindowAdsorbed;
1304
//}
1305
 
1306
//void ListWindow::paintEvent(QPaintEvent *)
1307
//{
1308
//    QPainter painter(this);//创建一个QPainter对象
1309
//    painter.drawPixmap(0,0,QPixmap(":/images/Watermelon.png"));//绘制图片到窗口
1310
//    /*
1311
//      QPixmap(":/images/Watermelon.png")如果改为QPixmap(),则只能看到绘制出的框架,看不到图片颜色,也就是看不到图片。
1312
//    */
1313
//}
1314
 
1315
// 随着窗体变化而设置背景
1316
void ListWindow::resizeEvent(QResizeEvent *event)
1317
{
1318
//    QWidget::resizeEvent(event);
1319
//    QPalette pal(palette());
1320
//    pal.setBrush(QPalette::Window,
1321
//                 QBrush(listBackground.scaled(event->size(),
1322
//                                                 Qt::IgnoreAspectRatio,
1323
//                                                 Qt::SmoothTransformation)));
1324
////    pal.setBrush(QPalette::Window,
1325
////                QBrush(_image.scaled(event->size(), Qt::IgnoreAspectRatio,
1326
////                        Qt::SmoothTransformation)));
1327
//    setPalette(pal);
1328
 
1329
    QWidget::resizeEvent(event);
1330
 
1331
 
1332
 
1333
    //背景图片缩放,九宫格,四个角不变,其他缩放
1334
    int dx = event->size().width() - listBackground.width();
1335
    int dy = event->size().height() - listBackground.height();
1336
/*暂时去掉  最小窗口时  无法扩大 */
1337
//    if(dx < 1 || dy <1)
1338
//    {
1339
//        qDebug()<< "no zoom !";
1340
//        return;
1341
//    }
1342
    qDebug()<< "begin zoom !";
1343
 
1344
    //创建一个size为变化后size的新画布
1345
    QImage img(event->size(), QImage::Format_ARGB32);
1346
    QPainter *paint = new QPainter(&img);
1347
    //在新区域画图
1348
    //左上-fixed,中上-x方向scaled,右上-fixed
1349
    paint->drawPixmap(0, 0, listBackground.copy(0, 0, 5, 27));
1350
    paint->drawPixmap(5, 0, listBackground.copy(5, 0, 321, 27).scaled(QSize(321 + dx, 27),
1351
                                                                         Qt::IgnoreAspectRatio,
1352
                                                                         Qt::SmoothTransformation));
1353
    paint->drawPixmap(326 + dx, 0, listBackground.copy(326, 0, 42, 27));
1354
    //左下-fixed,中下-x方向scaled,右下-fixed
1355
    paint->drawPixmap(0, 359 + dy, listBackground.copy(0, 359, 4, 10));
1356
    paint->drawPixmap(4, 359 + dy, listBackground.copy(4, 359, 363, 10).scaled(QSize(363 + dx, 10),
1357
                                                                         Qt::IgnoreAspectRatio,
1358
                                                                         Qt::SmoothTransformation));
1359
    paint->drawPixmap(363 + dx, 359 + dy, listBackground.copy(363, 359, 5, 10));
1360
    //左中-y方向scaled,中中-xy方向scaled,右中-y方向scaled
1361
    paint->drawPixmap(0, 27, listBackground.copy(0, 27, 4, 333).scaled(QSize(4, 333 + dy),
1362
                                                                       Qt::IgnoreAspectRatio,
1363
                                                                       Qt::SmoothTransformation));
1364
    paint->drawPixmap(4, 27, listBackground.copy(4, 27, 358, 333).scaled(QSize(358 + dx, 333 + dy),
1365
                                                                         Qt::IgnoreAspectRatio,
1366
                                                                         Qt::SmoothTransformation));
1367
    paint->drawPixmap(363 + dx, 27, listBackground.copy(363, 27, 5, 333).scaled(QSize(5, 333 + dy),
1368
                                                                            Qt::IgnoreAspectRatio,
1369
                                                                            Qt::SmoothTransformation));
1370
 
1371
 
1372
//保留原背景图片对应的resize参数,以供参考和查错
1373
//    //左上-fixed,中上-x方向scaled,右上-fixed
1374
//    paint->drawPixmap(0, 0, listBackground.copy(0, 0, 24, 40));
1375
//    paint->drawPixmap(24, 0, listBackground.copy(24, 0, 240, 40).scaled(QSize(240 + dx, 40),
1376
//                                                                         Qt::IgnoreAspectRatio,
1377
//                                                                         Qt::SmoothTransformation));
1378
//    paint->drawPixmap(264 + dx, 0, listBackground.copy(264, 0, 25, 40));
1379
//    //左下-fixed,中下-x方向scaled,右下-fixed
1380
//    paint->drawPixmap(0, 52 + dy, listBackground.copy(0, 52, 24, 53));
1381
//    paint->drawPixmap(24, 52 + dy, listBackground.copy(24, 52, 240, 53).scaled(QSize(240 + dx, 53),
1382
//                                                                         Qt::IgnoreAspectRatio,
1383
//                                                                         Qt::SmoothTransformation));
1384
//    paint->drawPixmap(264 + dx, 52 + dy, listBackground.copy(264, 52, 25, 53));
1385
//    //左中-y方向scaled,中中-xy方向scaled,右中-y方向scaled
1386
//    paint->drawPixmap(0, 40, listBackground.copy(0, 40, 24, 12).scaled(QSize(24, 12 + dy),
1387
//                                                                       Qt::IgnoreAspectRatio,
1388
//                                                                       Qt::SmoothTransformation));
1389
//    paint->drawPixmap(24, 40, listBackground.copy(24, 40, 240, 12).scaled(QSize(240 + dx, 12 + dy),
1390
//                                                                         Qt::IgnoreAspectRatio,
1391
//                                                                         Qt::SmoothTransformation));
1392
//    paint->drawPixmap(264 + dx, 40, listBackground.copy(264, 40, 25, 12).scaled(QSize(25, 12 + dy),
1393
//                                                                            Qt::IgnoreAspectRatio,
1394
//                                                                            Qt::SmoothTransformation));
1395
    paint->end();
1396
 
1397
//    QLabel *l = new QLabel;
1398
//    l->setPixmap(QPixmap::fromImage(img));
1399
//    l->show();
1400
 
1401
    QPalette pal(palette());
1402
    pal.setBrush(QPalette::Window,QBrush(img));
1403
    //    pal.setBrush(QPalette::Window,
1404
    //                 QBrush(backgroundPix.scaled(event->size(),
1405
    //                                              Qt::IgnoreAspectRatio,
1406
    //                                              Qt::SmoothTransformation)));
1407
    setPalette(pal);
1408
 
1409
    //设置掩板
1410
    //生成一张位图
1411
    QBitmap objBitmap(size());
1412
    //QPainter用于在位图上绘画
1413
    QPainter painter(&objBitmap);
1414
    //填充位图矩形框(用白色填充)
1415
    painter.fillRect(rect(),Qt::white);
1416
    painter.setBrush(QColor(0,0,0));
1417
    //在位图上画圆角矩形(用黑色填充)
1418
    painter.drawRoundedRect(this->rect(),4,4);
1419
    //使用setmask过滤即可
1420
    setMask(objBitmap);
1421
//    closeButton->setGeometry(QRect(this->geometry().width()-18, 5, 11, 10));
1422
}
1423
 
1424
 
1425
 
1426
//点击右上角标题栏按钮时,仅隐藏列表窗口
1427
void ListWindow::close()
1428
{
1429
    setListWindowHidden(true);
1430
}
1431
 
1432
 
1433
 
1434
//void ListWindow::moveListWindow(const QPoint &p, QPoint bottomLeft, QPoint bottomRight)
1435
//{
1436
//    QPoint listWtopLeft = this->geometry().topLeft();
1437
//    if((listWtopLeft.ry() == bottomLeft.ry())
1438
//            &&((listWtopLeft.rx() <= bottomRight.rx())
1439
//               || (geometry().topRight().rx() >= bottomLeft.rx()))){
1440
//        move(p + geometry().topLeft());
1441
//    }
1442
//}
1443
 
1444
//void ListWindow::toMiniMode()
1445
//{
1446
//    toolWindow->hide();
1447
//    this->hide();
1448
//    miniWindow->show();
1449
//    if(!miniWindow->statusWidgetHidden())
1450
//        miniWindow->setStatusWidgetHidden(false);
1451
//}
1452
 
1453
//void ListWindow::deleteChain()
1454
//{
1455
 
1456
//}
1457
 
1458
void ListWindow::testbenchGeneration()
1459
{
1460
 
1461
}
1462
 
1463
void ListWindow::about()
1464
{
1465
    QMessageBox::about(this, tr("About EziDebug"),
1466
            tr("<h2>EziDebug 0.1</h2>"
1467
               "<p>Copyright &copy; 2012 Software Inc."
1468
               "<p>EziDebug is a application that... "
1469
               ""
1470
               ));
1471
}
1472
 
1473
 
1474
void ListWindow::show_contextmenu(const QPoint& pos)
1475
{
1476
    QModelIndex  index = moduleTreeView->indexAt(pos) ;
1477
    EziDebugPrj * pcurrentPrj = NULL ;
1478
    pcurrentPrj = const_cast<EziDebugPrj *>(EziDebugInstanceTreeItem::getProject());
1479
    if(index.isValid())
1480
    {
1481
       m_ptreeItem = static_cast<EziDebugInstanceTreeItem *>(index.internalPointer());
1482
 
1483
       if(m_ptreeItem)
1484
       {
1485
           if(!m_ptreeItem->getScanChainInfo())
1486
           {
1487
                /*可以添加链 不能删除链*/
1488
               m_paddChainAct->setEnabled(true); ;
1489
               m_pdeleteChainAct->setEnabled(false);
1490
           }
1491
           else
1492
           {
1493
               /*可以删除链 不能添加链*/
1494
               m_paddChainAct->setEnabled(false);
1495
               m_pdeleteChainAct->setEnabled(true);
1496
           }
1497
       }
1498
 
1499
       if(m_ptreeItem->getModuleName() == pcurrentPrj->getTopModule())
1500
       {
1501
           m_paddChainAct->setEnabled(false);
1502
           m_pdeleteChainAct->setEnabled(false);
1503
       }
1504
 
1505
       if(pcurrentPrj->getPrjModuleMap().value(m_ptreeItem->getModuleName())->isLibaryCore())
1506
       {
1507
           m_paddChainAct->setEnabled(false);
1508
           m_pdeleteChainAct->setEnabled(false);
1509
       }
1510
    }
1511
    else
1512
    {
1513
        m_paddChainAct->setEnabled(false);
1514
        m_pdeleteChainAct->setEnabled(false);
1515
    }
1516
 
1517
    QPoint mm = QCursor::pos();
1518
    if(m_pcontextMenu)
1519
       m_pcontextMenu->exec(mm) ;
1520
 
1521
 
1522
//        m_pcontextMenu->exec(pos) ;
1523
}
1524
 
1525
void ListWindow::generateTreeView(EziDebugInstanceTreeItem* item)
1526
{
1527
    // item 是 要显示的节点的头节点
1528
//    QString itopModuleComboName  ;
1529
//    QString itopModule ;
1530
//    EziDebugPrj *pcurrentPrj = NULL ;
1531
    if(!m_peziDebugTreeModel)
1532
    {
1533
        qDebug() << "Generate Tree View!!!" << item->getNameData();
1534
        m_peziDebugTreeModel = new EziDebugTreeModel(item,this);
1535
        moduleTreeView->setModel(m_peziDebugTreeModel);
1536
    }
1537
    else
1538
    {
1539
        qDebug() << "Generate Tree View!!!"  ;
1540
 
1541
        // 插入链 删除链
1542
        moduleTreeView->setModel(NULL);
1543
        // 更新 图标
1544
        if(!item)
1545
        {
1546
        }
1547
        else
1548
        {
1549
#if 0
1550
            EziDebugInstanceTreeItem* poldTreeRootItem = m_peziDebugTreeModel->getInstanceTreeRootItem() ;
1551
            qDebug() << "top item "<< item ;
1552
            // 替换为新的头节点
1553
            m_peziDebugTreeModel->setInstanceTreeRootItem(item);
1554
 
1555
            /*成功则 删除 上次更新的所有节点 ,插入链的节点咱不能删除  */
1556
            delete poldTreeRootItem ;
1557
 
1558
            moduleTreeView->setModel(m_peziDebugTreeModel);
1559
#else
1560
            // EziDebugInstanceTreeItem* poldTreeRootItem = m_peziDebugTreeModel->getInstanceTreeRootItem() ;
1561
 
1562
            delete m_peziDebugTreeModel ;
1563
            // 替换为新的头节点
1564
            m_peziDebugTreeModel = new EziDebugTreeModel(item,this);
1565
 
1566
            /*成功则 删除 上次更新的所有节点 ,插入链的节点咱不能删除  */
1567
            //delete poldTreeRootItem ;
1568
 
1569
            moduleTreeView->setModel(m_peziDebugTreeModel);
1570
 
1571
#endif
1572
        }
1573
 
1574
    }
1575
}
1576
 
1577
void ListWindow::clearTreeView(void)
1578
{
1579
    if(moduleTreeView)
1580
    {
1581
        moduleTreeView->setModel(NULL);
1582
        if(m_peziDebugTreeModel)
1583
        {
1584
            delete m_peziDebugTreeModel ;
1585
            m_peziDebugTreeModel = NULL ;
1586
        }
1587
    }
1588
}
1589
 
1590
void ListWindow::welcomeinfoinit(EziDebugPrj *prj)
1591
{
1592
 #if 0
1593
    // (代码中的扫描链 在 log文件中不存在  说明log文件曾经被破坏过!)
1594
    if(prj->getLogFileExistFlag()&&prj->getLogfileDestroyedFlag())
1595
    {
1596
        // 提示删除所有链   部分扫描链信息丢失  是否删除所有扫描链代码
1597
        QMessageBox::StandardButton rb = QMessageBox::question(this, tr("部分扫描链信息丢失"), tr("是否删除所有扫描链代码?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
1598
        if(rb == QMessageBox::Yes)
1599
        {
1600
            // 删除所有链代码
1601
            currentPrj->deleteAllEziDebugCode(ivlgFileMap,ivhdlFileMap);
1602
            // 删除所有链相关的信息
1603
            QMap<QString,EziDebugScanChain*> ichainMap = currentPrj->getScanChainInfo();
1604
            QMap<QString,EziDebugScanChain*>::const_iterator k = ichainMap.constBegin() ;
1605
            while(k != ichainMap.constEnd())
1606
            {
1607
                EziDebugScanChain* pchain = k.value() ;
1608
                if(pchain)
1609
                {
1610
                    delete pchain ;
1611
                    pchain = NULL ;
1612
                }
1613
                ++k ;
1614
            }
1615
            currentPrj->cleanupChainMap();
1616
            currentPrj->cleanupChainTreeItemMap();
1617
            currentPrj->cleanupChainQueryTreeItemMap();
1618
 
1619
            // 删除log所有链信息 (新的log文件所以不用添加信息,此步可跳过)
1620
 
1621
            // 清空 被破坏的扫描链list
1622
            currentPrj->clearupDestroyedChainList();
1623
 
1624
        }
1625
        else
1626
        {
1627
            // 不处理
1628
        }
1629
 
1630
    }
1631
 #endif
1632
    if(prj)
1633
    {
1634
        if(!m_peziDebugTreeModel)
1635
        {
1636
            ToolWindow * pparent = static_cast<ToolWindow*>(toolWindow) ;
1637
 
1638
            /*向文本栏 传递错误信息 待窗体显示的时候,显示给用户看*/
1639
            addMessage("error","EziDebug error: The EziDebug config file has been destroyed!");
1640
 
1641
            // log 文件被破坏, 可能还没有扫描到扫描链
1642
            //if(prj->getScanChainInfo().count())
1643
            //{
1644
                // 配置文件被破坏  是否删除工程代码中所有的扫描链代码?
1645 4 EziDebug
                #if 0
1646 2 EziDebug
                QMessageBox::StandardButton rb = QMessageBox::question(this, tr("配置文件被破坏"), tr("是否删除工程代码中所有扫描链代码?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
1647 4 EziDebug
                                #else
1648
                                QMessageBox::StandardButton rb = QMessageBox::question(this, tr("EziDebug"), tr("The configuration file has been destroyed,\n Do you want to delete all scan chain code ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
1649 2 EziDebug
 
1650 4 EziDebug
                                #endif
1651
 
1652 2 EziDebug
                if(rb == QMessageBox::Yes)
1653
                {
1654
                    QMap<QString,EziDebugVlgFile*> ivlgFileMap ;
1655
                    QMap<QString,EziDebugVhdlFile*> ivhdlFileMap ;
1656
                    if(EziDebugPrj::ToolQuartus == prj->getToolType())
1657
                    {
1658
                        prj->parseQuartusPrjFile(ivlgFileMap,ivhdlFileMap);
1659
                    }
1660
                    else if(EziDebugPrj::ToolIse == prj->getToolType())
1661
                    {
1662
                        prj->parseIsePrjFile(ivlgFileMap,ivhdlFileMap);
1663
                    }
1664
                    else
1665
                    {
1666
                        addMessage("error","EziDebug error: EziDebug is not support this kind project file parse!");
1667
                        delete prj ;
1668
                        pparent->setCurrentProject(NULL);
1669
                    }
1670
 
1671
                    // delete all ezidebug code
1672
                    prj->deleteAllEziDebugCode(ivlgFileMap,ivhdlFileMap) ;
1673
 
1674
                    // delete all log file
1675
                    addMessage("warning","EziDebug warning: The EziDebug config file has been deleted!");
1676
                    QFile ilogFile(prj->getCurrentDir().absoluteFilePath("config.ezi"));
1677
                    ilogFile.remove();
1678
 
1679
                    // set exist flag false
1680
                    //prj->setLogFileExistFlag(false);
1681
 
1682
                    delete prj ;
1683
                    pparent->setCurrentProject(NULL);
1684
 
1685
                }
1686
                else
1687
                {
1688
                    // 如果不删除代码,不进行恢复
1689
                    delete prj ;
1690
                    pparent->setCurrentProject(NULL);
1691
                }
1692
            //}
1693
        }
1694
        else
1695
        {
1696
            QList<EziDebugPrj::LOG_FILE_INFO*> iaddedinfoList ;
1697
            QList<EziDebugPrj::LOG_FILE_INFO*> ideletedinfoList ;
1698
            QStringList iunDelChainList ;
1699
            QStringList ideletedChainList ;
1700
 
1701
            // (代码中的扫描链 在 log文件中不存在  说明log文件曾经被破坏过!)
1702
            if(prj->getLogFileExistFlag()&&prj->getLogfileDestroyedFlag())
1703
            {
1704
                // 提示删除所有链
1705
                // 部分扫描链信息丢失  是否删除所有扫描链代码
1706 4 EziDebug
                #if 0
1707 2 EziDebug
                QMessageBox::StandardButton rb = QMessageBox::question(this, tr("部分扫描链信息丢失"), tr("是否删除所有扫描链代码?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
1708 4 EziDebug
                                #else
1709
                            QMessageBox::StandardButton rb = QMessageBox::question(this, tr("EziDebug"), tr("Some scan chain information has lost, \n Do you want to delete all scan chain code ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
1710
                                #endif
1711 2 EziDebug
                if(rb == QMessageBox::Yes)
1712
                {
1713
                    // 删除所有链代码
1714
 
1715
                    prj->deleteAllEziDebugCode(prj->getPrjVlgFileMap(),prj->getPrjVhdlFileMap());
1716
 
1717
                    QMap<QString,EziDebugVlgFile*>::const_iterator ivlgFileIter = prj->getPrjVlgFileMap().constBegin() ;
1718
                    while(ivlgFileIter != prj->getPrjVlgFileMap().constEnd())
1719
                    {
1720
                        QString irelativeFileName = ivlgFileIter.key() ;
1721
                        EziDebugVlgFile* pfile = ivlgFileIter.value() ;
1722
 
1723
                        EziDebugPrj::LOG_FILE_INFO* pdelFileInfo = new EziDebugPrj::LOG_FILE_INFO ;
1724
                        pdelFileInfo->etype = EziDebugPrj::infoTypeFileInfo ;
1725
                        pdelFileInfo->pinfo = NULL ;
1726
                        memcpy(pdelFileInfo->ainfoName , irelativeFileName.toAscii().data() , irelativeFileName.size()+1);
1727
                        ideletedinfoList.append(pdelFileInfo);
1728
 
1729
                        struct EziDebugPrj::LOG_FILE_INFO* paddFileInfo = new EziDebugPrj::LOG_FILE_INFO ;
1730
                        paddFileInfo->etype = EziDebugPrj::infoTypeFileInfo ;
1731
                        paddFileInfo->pinfo = pfile ;
1732
                        memcpy(paddFileInfo->ainfoName , irelativeFileName.toAscii().data(), irelativeFileName.size()+1);
1733
                        iaddedinfoList.append(paddFileInfo);
1734
 
1735
                        ++ivlgFileIter ;
1736
                    }
1737
 
1738
 
1739
                    QMap<QString,EziDebugVhdlFile*>::const_iterator ivhdlFileIter = prj->getPrjVhdlFileMap().constBegin() ;
1740
                    while(ivhdlFileIter != prj->getPrjVhdlFileMap().constEnd())
1741
                    {
1742
                        QString irelativeFileName = ivhdlFileIter.key() ;
1743
                        EziDebugVhdlFile* pfile = ivhdlFileIter.value() ;
1744
                        EziDebugPrj::LOG_FILE_INFO* pdelFileInfo = new EziDebugPrj::LOG_FILE_INFO ;
1745
                        pdelFileInfo->etype = EziDebugPrj::infoTypeFileInfo ;
1746
                        pdelFileInfo->pinfo = NULL ;
1747
                        memcpy(pdelFileInfo->ainfoName , irelativeFileName.toAscii().data() , irelativeFileName.size()+1);
1748
                        ideletedinfoList.append(pdelFileInfo);
1749
 
1750
                        struct EziDebugPrj::LOG_FILE_INFO* paddFileInfo = new EziDebugPrj::LOG_FILE_INFO ;
1751
                        paddFileInfo->etype = EziDebugPrj::infoTypeFileInfo ;
1752
                        paddFileInfo->pinfo = pfile ;
1753
                        memcpy(paddFileInfo->ainfoName , irelativeFileName.toAscii().data(), irelativeFileName.size()+1);
1754
                        iaddedinfoList.append(paddFileInfo);
1755
                        ++ivhdlFileIter ;
1756
                    }
1757
 
1758
 
1759
                    // 删除所有链相关的信息
1760
                    QMap<QString,EziDebugScanChain*> ichainMap = prj->getScanChainInfo();
1761
                    QMap<QString,EziDebugScanChain*>::const_iterator k = ichainMap.constBegin() ;
1762
                    while(k != ichainMap.constEnd())
1763
                    {
1764
                        QString ichainName = k.key() ;
1765
                        EziDebugScanChain* pchain = k.value() ;
1766
 
1767
                        // 从log文件中删除相关信息
1768
                        struct EziDebugPrj::LOG_FILE_INFO* pdelChainInfo = new EziDebugPrj::LOG_FILE_INFO ;
1769
                        memcpy(pdelChainInfo->ainfoName,ichainName.toAscii().data(),ichainName.size()+1);
1770
                        pdelChainInfo->pinfo = NULL ;
1771
                        pdelChainInfo->etype = EziDebugPrj::infoTypeScanChainStructure ;
1772
                        ideletedinfoList << pdelChainInfo ;
1773
 
1774
                        if(pchain)
1775
                        {
1776
                            delete pchain ;
1777
                            pchain = NULL ;
1778
                        }
1779
                        ++k ;
1780
                    }
1781
                    prj->cleanupChainMap();
1782
                    prj->cleanupChainTreeItemMap();
1783
                    prj->cleanupChainQueryTreeItemMap();
1784
 
1785
                    // 删除log所有链信息 (新的log文件所以不用添加信息,此步可跳过)
1786
 
1787
                    // 清空 被破坏的扫描链list
1788
                    prj->clearupDestroyedChainList();
1789
 
1790
                }
1791
                else
1792
                {
1793
                    // 不处理
1794
                }
1795
 
1796
            }
1797
 
1798
 
1799
            if(prj->getDestroyedChainList().count())
1800
            {
1801
                // 把所有破坏掉的链打印出来
1802
 
1803
                QString ichain ;
1804
                QStringList idestroyedChainList = prj->getDestroyedChainList() ;
1805
 
1806
                addMessage("error","The destroyed chain are:");
1807
                for(int i = 0 ; i < idestroyedChainList.count() ;i++)
1808
                {
1809
                    QString ichainName = idestroyedChainList.at(i) ;
1810
 
1811
                    EziDebugInstanceTreeItem *pitem = prj->getChainTreeItemMap().value(ichainName);
1812
                    if(pitem)
1813
                    {
1814
                        ichain.append(tr("EziDebug chain:   %1  topInstance:    %2:%3").arg(ichainName)\
1815
                                      .arg(pitem->getModuleName()).arg(pitem->getInstanceName())) ;
1816
                    }
1817
                    addMessage("error",ichain);
1818
                }
1819
 
1820
                // 是否删除相关扫描链代码,否则相应扫描链不可用!
1821 4 EziDebug
                #if 0
1822 2 EziDebug
                QMessageBox::StandardButton rb = QMessageBox::question(this, tr("部分扫描链被破坏"), tr("相关扫描链不可用,是否删除相关扫描链代码?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
1823 4 EziDebug
                                #else
1824
                                QMessageBox::StandardButton rb = QMessageBox::question(this, tr("EziDebug"), tr("Some scan chains has been destroyed ,\n Do you want to delete all scan chain code ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
1825
                                #endif
1826 2 EziDebug
                if(rb == QMessageBox::Yes)
1827
                {
1828
                    iunDelChainList = prj->deleteDestroyedChain(iaddedinfoList,ideletedinfoList) ;
1829
                    if(iunDelChainList.count())
1830
                    {
1831 4 EziDebug
                        addMessage("error","EziDebug error: Some chains can not be deleted for some reasons!");
1832 2 EziDebug
                        for(int i = 0 ; i < iunDelChainList.count() ;i++)
1833
                        {
1834
                            addMessage("error",tr("EziDebug chain:%1").arg(iunDelChainList.at(i)));
1835
                        }
1836 4 EziDebug
                        addMessage("error","EziDebug error: Please check the code file is compiled successfully or not!");
1837 2 EziDebug
                    }
1838
 
1839
                    for(int i = 0 ; i < idestroyedChainList.count() ; i++)
1840
                    {
1841
                        QString idestroyedChain = idestroyedChainList.at(i) ;
1842
                        if(!iunDelChainList.contains(idestroyedChain))
1843
                        {
1844
                            ideletedChainList.append(idestroyedChain);
1845
                            struct EziDebugPrj::LOG_FILE_INFO* pdelChainInfo = new EziDebugPrj::LOG_FILE_INFO ;
1846
                            memcpy(pdelChainInfo->ainfoName,idestroyedChain.toAscii().data(),idestroyedChain.size()+1);
1847
                            pdelChainInfo->pinfo = NULL ;
1848
                            pdelChainInfo->etype = EziDebugPrj::infoTypeScanChainStructure ;
1849
                            ideletedinfoList << pdelChainInfo ;
1850
                        }
1851
                    }
1852
 
1853
                }
1854
            }
1855
 
1856
            QStringList icheckChainList = prj->checkChainExist();
1857
 
1858
            for(int i = 0 ; i < icheckChainList.count() ;i++)
1859
            {
1860
                QString iupdatedChain = icheckChainList.at(i) ;
1861
                if(!ideletedChainList.contains(iupdatedChain))
1862
                {
1863
                    struct EziDebugPrj::LOG_FILE_INFO* pdelChainInfo = new EziDebugPrj::LOG_FILE_INFO ;
1864
                    memcpy(pdelChainInfo->ainfoName,iupdatedChain.toAscii().data(),iupdatedChain.size()+1);
1865
                    pdelChainInfo->pinfo = NULL ;
1866
                    pdelChainInfo->etype = EziDebugPrj::infoTypeScanChainStructure ;
1867
                    ideletedinfoList << pdelChainInfo ;
1868
 
1869
                    struct EziDebugPrj::LOG_FILE_INFO* paddChainInfo = new EziDebugPrj::LOG_FILE_INFO ;
1870
                    memcpy(paddChainInfo->ainfoName,iupdatedChain.toAscii().data(),iupdatedChain.size()+1);
1871
                    paddChainInfo->pinfo = paddChainInfo ;
1872
                    paddChainInfo->etype = EziDebugPrj::infoTypeScanChainStructure ;
1873
                    iaddedinfoList << paddChainInfo ;
1874
                }
1875
            }
1876
 
1877
#if 0
1878
            if(prj->getScanChainInfo().count())
1879
            {
1880
                QMap<QString,EziDebugScanChain*>::const_iterator iaddedChainIter = prj->getScanChainInfo().constBegin() ;
1881
                while(iaddedChainIter !=  prj->getScanChainInfo().constEnd())
1882
                {
1883
                    QString ichainName = iaddedChainIter.key();
1884
                    struct EziDebugPrj::LOG_FILE_INFO* pinfo = new EziDebugPrj::LOG_FILE_INFO ;
1885
                    memcpy(pinfo->ainfoName ,ichainName.toAscii().data(),ichainName.size()+1);
1886
                    pinfo->pinfo = iaddedChainIter.value() ;
1887
                    pinfo->etype = EziDebugPrj::infoTypeScanChainStructure ;
1888
                    iaddedinfoList << pinfo ;
1889
                    ++iaddedChainIter ;
1890
                }
1891
            }
1892
#endif
1893
 
1894
            if(prj->changedLogFile(iaddedinfoList,ideletedinfoList))
1895
            {
1896
                //提示 保存 log 文件出错
1897
                addMessage("info","EziDebug info: changedLogFile encounter some problem!");
1898
            }
1899
 
1900
 
1901
            // 删除 新分配的  log_file_info 指针
1902
 
1903
            qDeleteAll(iaddedinfoList);
1904
            qDeleteAll(ideletedinfoList);
1905
 
1906 4 EziDebug
            QStandardItem * pitem = addMessage("info",tr("EziDebug info: The default project parameters:"));
1907
            addMessage("process",tr("      Scanchain Max Register Number: %1").arg(prj->getMaxRegNumPerChain()),pitem);
1908 2 EziDebug
            addMessage("process",tr("      Project Path: %1").arg(prj->getCurrentDir().absolutePath()),pitem);
1909
            addMessage("process",tr("      Compile Software: \"%1\"").arg((prj->getToolType() == EziDebugPrj::ToolQuartus) ? ("quartus") :("ise")),pitem);
1910
 
1911
            if(prj->getChainTreeItemMap().count())
1912
            {
1913
                QStandardItem * psecondItem = addMessage("info","      EziDebug info: The existed chains are:",pitem);
1914
                QMap<QString,EziDebugInstanceTreeItem*> itreeItemMap = prj->getChainTreeItemMap() ;
1915
                QMap<QString,EziDebugInstanceTreeItem*>::const_iterator i = itreeItemMap.constBegin() ;
1916
                while( i!= itreeItemMap.constEnd())
1917
                {
1918
                    EziDebugInstanceTreeItem* pitem = i.value();
1919
                    addMessage("process",tr("            EziDebug chain: %1\tInstance Node:%2").arg(i.key()).arg(pitem->getNameData()),psecondItem);
1920
                    EziDebugScanChain *pscanChain = pitem->getScanChainInfo();
1921
                    QString iclockNumStr ;
1922
                    QString itraversedInstStr ;
1923
                    QMap<QString,QVector<QStringList> > iregChain = pscanChain->getRegChain();
1924
                    QMap<QString,QVector<QStringList> >::const_iterator iregChainIter = iregChain.constBegin() ;
1925
                    while( iregChainIter != iregChain.constEnd())
1926
                    {
1927
                        iclockNumStr.append(tr("%1 (%2)     ").arg(pscanChain->getChainRegCount(iregChainIter.key())).arg(iregChainIter.key()));
1928
                        ++iregChainIter ;
1929
                    }
1930
 
1931
                    addMessage("process" , tr("            The chain total reg number: %1").arg(iclockNumStr),psecondItem);
1932
                    addMessage("process" , tr("            The traversed NodeList:"),psecondItem);
1933
 
1934
                    for(int j = 0 ; j < pscanChain->getInstanceItemList().count() ;j++)
1935
                    {
1936
                        itraversedInstStr.append(tr("  ->  ") + pscanChain->getInstanceItemList().at(j)) ;
1937
                        if((j+1)%3 == 0)
1938
                        {
1939
                            addMessage("process" , tr("            ") + itraversedInstStr,psecondItem);
1940
                            itraversedInstStr.clear();
1941
                        }
1942
                    }
1943
                    addMessage("process" , tr("            ") + itraversedInstStr,psecondItem);
1944
 
1945
                    ++i ;
1946
                }
1947
            }
1948
 
1949
 
1950
            UpdateDetectThread * pthread = prj->getThread() ;
1951
            pthread->start();
1952
        }
1953
    }
1954
}
1955
 
1956
 
1957
QPushButton *ListWindow::createToolButton(const QString &toolTip, const QIcon &icon,
1958
                                    const QSize &size, const char *member)
1959
{
1960
    QPushButton *button = new QPushButton(this);
1961
    button->setToolTip(toolTip);
1962
    button->setIcon(icon);
1963
    button->setIconSize(size);//(QSize(10, 10));
1964
    // button->setSizeIncrement(size);
1965
    //button->setSizePolicy(size.width(), size.height());
1966
    button->setFlat(true);
1967
    connect(button, SIGNAL(clicked()), this, member);
1968
 
1969
    return button;
1970
}
1971
 
1972
void ListWindow::find()
1973
{
1974
    if (!findDialog) {
1975
        findDialog = new FindDialog;
1976
//        connect(findDialog, SIGNAL(findNext(const QString &,
1977
//                                            Qt::CaseSensitivity)),
1978
//                spreadsheet, SLOT(findNext(const QString &,
1979
//                                           Qt::CaseSensitivity)));
1980
//        connect(findDialog, SIGNAL(findPrevious(const QString &,
1981
//                                                Qt::CaseSensitivity)),
1982
//                spreadsheet, SLOT(findPrevious(const QString &,
1983
//                                               Qt::CaseSensitivity)));
1984
    }
1985
 
1986
    findDialog->show();
1987
    findDialog->raise();
1988
    findDialog->activateWindow();
1989
}
1990
 
1991
 
1992
//控制列表窗口是否隐藏
1993
void ListWindow::setListWindowHidden(bool flag)
1994
{
1995
    isListWindowHiddenFlag = flag;
1996
    if(isListWindowHiddenFlag)
1997
        this->hide();
1998
    else
1999
        this->showNormal();
2000
}
2001
 
2002
//获取普通模式下,ToolWindow不隐藏时,列表窗口是否隐藏
2003
bool ListWindow::isListWindowHidden()
2004
{
2005
    return isListWindowHiddenFlag;
2006
}
2007
 
2008
void ListWindow::enterEvent(QEvent * event)
2009
{
2010
//    QMouseEvent * mouseEvent = (QMouseEvent *) event ;
2011
//    qDebug()<<"enter  Event" << mouseEvent->x()<< mouseEvent->y()<< this->frameGeometry().right();
2012
//    eDirection = (enum_Direction)PointValid(mouseEvent->x(),mouseEvent->y());
2013
//    SetCursorStyle(eDirection);
2014
}
2015
 
2016
void ListWindow::leaveEvent(QEvent * event)
2017
{
2018
//    QMouseEvent * mouseEvent = (QMouseEvent *) event ;
2019
//    qDebug()<<"leave  Event" << mouseEvent->x()<< mouseEvent->y()<< this->frameGeometry().right();
2020
//    eDirection = (enum_Direction)PointValid(mouseEvent->x(),mouseEvent->y());
2021
//    SetCursorStyle(eDirection);
2022
}
2023
 
2024
void ListWindow::setChainActEnable(bool addenable,bool delenable)
2025
{
2026
//    m_paddChainAct->setEnabled(addenable) ;
2027
//    m_pdeleteChainAct->setEnabled(delenable) ;
2028
}
2029
 
2030
////工具栏窗口只需要获取isListWindowAdsorbed,而不需要更改之
2031
//bool ListWindow::isListWindowAdsorbed()
2032
//{
2033
//    return isListWindowAdsorbedFlag;
2034
//}
2035
 
2036
EziDebugInstanceTreeItem * ListWindow::getCurrentTreeItem(void)
2037
{
2038
    return m_ptreeItem ;
2039
}
2040
 
2041
void ListWindow::setCurrentTreeItem(EziDebugInstanceTreeItem * item)
2042
{
2043
    m_ptreeItem = item ;
2044
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.