1
# -*- coding: utf-8 -*-
3
# Copyright (c) 2002 - 2007 Detlev Offenbach <detlev@die-offenbachs.de>
7
Module implementing a class used to display the Sources part of the project.
13
from PyQt4.QtCore import *
14
from PyQt4.QtGui import *
16
from KdeQt import KQMessageBox, KQInputDialog
17
from KdeQt.KQApplication import e4App
19
from Checks import Checkers
21
from UI.BrowserModel import BrowserClassItem, BrowserMethodItem
22
from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
25
from DataViews.CodeMetricsDialog import CodeMetricsDialog
26
from DataViews.PyCoverageDialog import PyCoverageDialog
27
from DataViews.PyProfileDialog import PyProfileDialog
29
from Graphics.UMLClassDiagram import UMLClassDiagram
30
from Graphics.ImportsDiagram import ImportsDiagram
31
from Graphics.ApplicationDiagram import ApplicationDiagram
32
from Graphics.PackageDiagram import PackageDiagram
34
from ProjectBrowserModel import ProjectBrowserFileItem, \
35
ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem, \
36
ProjectBrowserSourceType
37
from ProjectBaseBrowser import ProjectBaseBrowser
41
class ProjectSourcesBrowser(ProjectBaseBrowser):
43
A class used to display the Sources part of the project.
45
@signal closeSourceWindow(string) emitted after a file has been removed/deleted
48
def __init__(self, project, parent = None):
52
@param project reference to the project object
53
@param parent parent widget of this browser (QWidget)
55
self.checkers = Checkers(self, parent)
57
ProjectBaseBrowser.__init__(self, project, ProjectBrowserSourceType, parent)
59
self.selectedItemsFilter = \
60
[ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem]
62
self.setWindowTitle(self.trUtf8('Sources'))
64
self.setWhatsThis(self.trUtf8(
65
"""<b>Project Sources Browser</b>"""
66
"""<p>This allows to easily see all sources contained in the current"""
67
""" project. Several actions can be executed via the context menu.</p>"""
70
self.connect(project, SIGNAL("prepareRepopulateItem"),
71
self._prepareRepopulateItem)
72
self.connect(project, SIGNAL("completeRepopulateItem"),
73
self._completeRepopulateItem)
75
self.codemetrics = None
76
self.codecoverage = None
77
self.profiledata = None
78
self.classDiagram = None
79
self.importsDiagram = None
80
self.packageDiagram = None
81
self.applicationDiagram = None
83
def __closeAllWindows(self):
85
Private method to close all project related windows.
87
self.codemetrics and self.codemetrics.close()
88
self.codecoverage and self.codecoverage.close()
89
self.profiledata and self.profiledata.close()
90
self.checkers.closeAllWindows()
91
self.classDiagram and self.classDiagram.close()
92
self.importsDiagram and self.importsDiagram.close()
93
self.packageDiagram and self.packageDiagram.close()
94
self.applicationDiagram and self.applicationDiagram.close()
96
def _projectClosed(self):
98
Protected slot to handle the projectClosed signal.
100
self.__closeAllWindows()
101
ProjectBaseBrowser._projectClosed(self)
103
def _createPopupMenus(self):
105
Protected overloaded method to generate the popup menu.
107
ProjectBaseBrowser._createPopupMenus(self)
108
self.sourceMenuActions = {}
110
if self.project.pdata["PROGLANGUAGE"][0] == "Python":
111
self.__createPythonPopupMenus()
112
elif self.project.pdata["PROGLANGUAGE"][0] == "Ruby":
113
self.__createRubyPopupMenus()
115
def __createPythonPopupMenus(self):
117
Privat method to generate the popup menus for a Python project.
119
self.checkers.initActions()
120
self.checksMenu = self.checkers.initMenu()
121
self.checksMenu.setTitle(self.trUtf8('Check'))
123
self.showMenu = QMenu(self.trUtf8('Show'))
124
self.showMenu.addAction(self.trUtf8('Code metrics...'), self.__showCodeMetrics)
125
self.coverageMenuAction = self.showMenu.addAction(\
126
self.trUtf8('Code coverage...'), self.__showCodeCoverage)
127
self.profileMenuAction = self.showMenu.addAction(\
128
self.trUtf8('Profile data...'), self.__showProfileData)
129
self.cyclopsMenuAction = self.showMenu.addAction(\
130
self.trUtf8('Cyclops report...'), self.__showCyclopsReport)
131
self.removeCyclopsMenuAction = self.showMenu.addAction(\
132
self.trUtf8('Remove cyclops report'), self.__removeCyclopsReport)
133
self.connect(self.showMenu,SIGNAL('aboutToShow()'),self.__showShowMenu)
135
self.graphicsMenu = QMenu(self.trUtf8('Diagrams'))
136
self.classDiagramAction = self.graphicsMenu.addAction(\
137
self.trUtf8("Class Diagram..."), self.__showClassDiagram)
138
self.graphicsMenu.addAction(\
139
self.trUtf8("Package Diagram..."), self.__showPackageDiagram)
140
self.importsDiagramAction = self.graphicsMenu.addAction(\
141
self.trUtf8("Imports Diagram..."), self.__showImportsDiagram)
142
self.graphicsMenu.addAction(\
143
self.trUtf8("Application Diagram..."), self.__showApplicationDiagram)
145
self.unittestAction = self.sourceMenu.addAction(\
146
self.trUtf8('Run unittest...'), self.handleUnittest)
147
self.sourceMenu.addSeparator()
148
act = self.sourceMenu.addAction(self.trUtf8('Rename file'), self._renameFile)
149
self.menuActions.append(act)
150
act = self.sourceMenu.addAction(self.trUtf8('Remove from project'),
152
self.menuActions.append(act)
153
act = self.sourceMenu.addAction(self.trUtf8('Delete'), self.__deleteFile)
154
self.menuActions.append(act)
155
self.sourceMenu.addSeparator()
156
self.sourceMenu.addAction(self.trUtf8('Add source files...'),
157
self.__addSourceFiles)
158
self.sourceMenu.addAction(self.trUtf8('Add source directory...'),
159
self.__addSourceDirectory)
160
self.sourceMenu.addSeparator()
161
act = self.sourceMenu.addMenu(self.graphicsMenu)
162
self.sourceMenu.addSeparator()
163
self.sourceMenuActions["Check"] = \
164
self.sourceMenu.addMenu(self.checksMenu)
165
self.sourceMenu.addSeparator()
166
self.sourceMenuActions["Show"] = \
167
self.sourceMenu.addMenu(self.showMenu)
168
self.sourceMenu.addSeparator()
169
self.sourceMenu.addAction(self.trUtf8('Expand all directories'),
171
self.sourceMenu.addAction(self.trUtf8('Collapse all directories'),
172
self._collapseAllDirs)
174
self.menu.addSeparator()
175
self.menu.addAction(self.trUtf8('Add source files...'), self.__addSourceFiles)
176
self.menu.addAction(self.trUtf8('Add source directory...'),
177
self.__addSourceDirectory)
178
self.menu.addSeparator()
179
self.menu.addAction(self.trUtf8('Expand all directories'),
181
self.menu.addAction(self.trUtf8('Collapse all directories'),
182
self._collapseAllDirs)
184
self.backMenu = QMenu(self)
185
self.backMenu.addAction(self.trUtf8('Add source files...'),
186
self.project.addSourceFiles)
187
self.backMenu.addAction(self.trUtf8('Add source directory...'),
188
self.project.addSourceDir)
189
self.backMenu.addSeparator()
190
self.backMenu.addAction(self.trUtf8('Expand all directories'),
192
self.backMenu.addAction(self.trUtf8('Collapse all directories'),
193
self._collapseAllDirs)
194
self.backMenu.setEnabled(False)
196
self.multiMenu.addSeparator()
197
act = self.multiMenu.addAction(self.trUtf8('Remove from project'),
199
self.multiMenuActions.append(act)
200
act = self.multiMenu.addAction(self.trUtf8('Delete'), self.__deleteFile)
201
self.multiMenuActions.append(act)
202
self.multiMenu.addSeparator()
203
self.multiMenu.addAction(self.trUtf8('Expand all directories'),
205
self.multiMenu.addAction(self.trUtf8('Collapse all directories'),
206
self._collapseAllDirs)
208
self.dirMenu = QMenu(self)
209
act = self.dirMenu.addAction(self.trUtf8('Remove from project'), self._removeDir)
210
self.dirMenuActions.append(act)
211
self.dirMenu.addSeparator()
212
self.dirMenu.addAction(self.trUtf8('Add source files...'), self.__addSourceFiles)
213
self.dirMenu.addAction(self.trUtf8('Add source directory...'),
214
self.__addSourceDirectory)
215
self.dirMenu.addSeparator()
216
act = self.dirMenu.addMenu(self.graphicsMenu)
217
self.dirMenu.addSeparator()
218
self.dirMenu.addMenu(self.checksMenu)
219
self.dirMenu.addSeparator()
220
self.dirMenu.addAction(self.trUtf8('Expand all directories'),
222
self.dirMenu.addAction(self.trUtf8('Collapse all directories'),
223
self._collapseAllDirs)
225
self.dirMultiMenu = QMenu(self)
226
self.dirMultiMenu.addAction(self.trUtf8('Expand all directories'),
228
self.dirMultiMenu.addAction(self.trUtf8('Collapse all directories'),
229
self._collapseAllDirs)
231
self.connect(self.sourceMenu, SIGNAL('aboutToShow()'),
232
self.__showPopupMenu)
233
self.connect(self.multiMenu, SIGNAL('aboutToShow()'),
234
self.__showPopupMenuMulti)
235
self.connect(self.dirMenu, SIGNAL('aboutToShow()'),
236
self.__showPopupMenuDir)
237
self.connect(self.dirMultiMenu, SIGNAL('aboutToShow()'),
238
self.__showPopupMenuDirMulti)
239
self.mainMenu = self.sourceMenu
241
def __createRubyPopupMenus(self):
243
Privat method to generate the popup menus for a Ruby project.
245
self.graphicsMenu = QMenu(self.trUtf8('Diagrams'))
246
self.classDiagramAction = self.graphicsMenu.addAction(\
247
self.trUtf8("Class Diagram..."), self.__showClassDiagram)
248
self.graphicsMenu.addAction(self.trUtf8("Package Diagram..."),
249
self.__showPackageDiagram)
250
self.graphicsMenu.addAction(self.trUtf8("Application Diagram..."),
251
self.__showApplicationDiagram)
253
self.sourceMenu.addSeparator()
254
act = self.sourceMenu.addAction(self.trUtf8('Rename file'), self._renameFile)
255
self.menuActions.append(act)
256
act = self.sourceMenu.addAction(self.trUtf8('Remove from project'),
258
self.menuActions.append(act)
259
act = self.sourceMenu.addAction(self.trUtf8('Delete'), self.__deleteFile)
260
self.menuActions.append(act)
261
self.sourceMenu.addSeparator()
262
self.sourceMenu.addAction(self.trUtf8('Add source files...'),
263
self.__addSourceFiles)
264
self.sourceMenu.addAction(self.trUtf8('Add source directory...'),
265
self.__addSourceDirectory)
266
self.sourceMenu.addSeparator()
267
act = self.sourceMenu.addMenu(self.graphicsMenu)
268
self.sourceMenu.addSeparator()
269
self.sourceMenu.addAction(self.trUtf8('Expand all directories'),
271
self.sourceMenu.addAction(self.trUtf8('Collapse all directories'),
272
self._collapseAllDirs)
274
self.menu.addSeparator()
275
self.menu.addAction(self.trUtf8('Add source files...'), self.__addSourceFiles)
276
self.menu.addAction(self.trUtf8('Add source directory...'),
277
self.__addSourceDirectory)
278
self.menu.addSeparator()
279
self.menu.addAction(self.trUtf8('Expand all directories'),
281
self.menu.addAction(self.trUtf8('Collapse all directories'),
282
self._collapseAllDirs)
284
self.backMenu = QMenu(self)
285
self.backMenu.addAction(self.trUtf8('Add source files...'),
286
self.project.addSourceFiles)
287
self.backMenu.addAction(self.trUtf8('Add source directory...'),
288
self.project.addSourceDir)
289
self.backMenu.addSeparator()
290
self.backMenu.addAction(self.trUtf8('Expand all directories'),
292
self.backMenu.addAction(self.trUtf8('Collapse all directories'),
293
self._collapseAllDirs)
294
self.backMenu.setEnabled(False)
296
self.multiMenu.addSeparator()
297
act = self.multiMenu.addAction(self.trUtf8('Remove from project'),
299
self.multiMenuActions.append(act)
300
act = self.multiMenu.addAction(self.trUtf8('Delete'), self.__deleteFile)
301
self.multiMenuActions.append(act)
302
self.multiMenu.addSeparator()
303
self.multiMenu.addAction(self.trUtf8('Expand all directories'),
305
self.multiMenu.addAction(self.trUtf8('Collapse all directories'),
306
self._collapseAllDirs)
308
self.dirMenu = QMenu(self)
309
act = self.dirMenu.addAction(self.trUtf8('Remove from project'), self._removeDir)
310
self.dirMenuActions.append(act)
311
self.dirMenu.addSeparator()
312
self.dirMenu.addAction(self.trUtf8('Add source files...'), self.__addSourceFiles)
313
self.dirMenu.addAction(self.trUtf8('Add source directory...'),
314
self.__addSourceDirectory)
315
self.dirMenu.addSeparator()
316
act = self.dirMenu.addMenu(self.graphicsMenu)
317
self.dirMenu.addSeparator()
318
self.dirMenu.addAction(self.trUtf8('Expand all directories'),
320
self.dirMenu.addAction(self.trUtf8('Collapse all directories'),
321
self._collapseAllDirs)
323
self.dirMultiMenu = QMenu(self)
324
self.dirMultiMenu.addAction(self.trUtf8('Expand all directories'),
326
self.dirMultiMenu.addAction(self.trUtf8('Collapse all directories'),
327
self._collapseAllDirs)
329
self.connect(self.sourceMenu, SIGNAL('aboutToShow()'),
330
self.__showPopupMenu)
331
self.connect(self.multiMenu, SIGNAL('aboutToShow()'),
332
self.__showPopupMenuMulti)
333
self.connect(self.dirMenu, SIGNAL('aboutToShow()'),
334
self.__showPopupMenuDir)
335
self.connect(self.dirMultiMenu, SIGNAL('aboutToShow()'),
336
self.__showPopupMenuDirMulti)
337
self.mainMenu = self.sourceMenu
339
def _showContextMenu(self, coord):
341
Protected slot to show the context menu.
343
@param coord the position of the mouse pointer (QPoint)
345
if not self.project.isOpen():
349
categories = self.getSelectedItemsCountCategorized(\
350
[ProjectBrowserFileItem, BrowserClassItem,
351
BrowserMethodItem, ProjectBrowserSimpleDirectoryItem])
352
cnt = categories["sum"]
354
index = self.indexAt(coord)
356
self._selectSingleItem(index)
357
categories = self.getSelectedItemsCountCategorized(\
358
[ProjectBrowserFileItem, BrowserClassItem,
359
BrowserMethodItem, ProjectBrowserSimpleDirectoryItem])
360
cnt = categories["sum"]
362
bfcnt = categories[unicode(ProjectBrowserFileItem)]
363
cmcnt = categories[unicode(BrowserClassItem)] + \
364
categories[unicode(BrowserMethodItem)]
365
sdcnt = categories[unicode(ProjectBrowserSimpleDirectoryItem)]
366
if cnt > 1 and cnt == bfcnt:
367
self.multiMenu.popup(self.mapToGlobal(coord))
368
elif cnt > 1 and cnt == sdcnt:
369
self.dirMultiMenu.popup(self.mapToGlobal(coord))
371
index = self.indexAt(coord)
372
if cnt == 1 and index.isValid():
373
if bfcnt == 1 or cmcnt == 1:
374
itm = self.model().item(index)
375
if isinstance(itm, ProjectBrowserFileItem):
377
if self.project.pdata["PROGLANGUAGE"][0] == "Python":
378
if fn.endswith('.py') or fn.endswith('.pyw'):
379
for act in self.sourceMenuActions.values():
381
self.sourceMenuActions["Check"].setEnabled(True)
382
self.classDiagramAction.setEnabled(True)
383
self.importsDiagramAction.setEnabled(True)
384
self.unittestAction.setEnabled(True)
385
elif fn.endswith('.ptl'):
386
for act in self.sourceMenuActions.values():
387
act.setEnabled(False)
388
self.sourceMenuActions["Check"].setEnabled(True)
389
self.classDiagramAction.setEnabled(True)
390
self.importsDiagramAction.setEnabled(True)
391
self.unittestAction.setEnabled(False)
392
elif fn.endswith('.rb'): # entry for mixed mode programs
393
for act in self.sourceMenuActions.values():
394
act.setEnabled(False)
395
self.sourceMenuActions["Check"].setEnabled(False)
396
self.classDiagramAction.setEnabled(True)
397
self.importsDiagramAction.setEnabled(False)
398
self.unittestAction.setEnabled(False)
400
for act in self.sourceMenuActions.values():
401
act.setEnabled(False)
402
self.sourceMenuActions["Check"].setEnabled(False)
403
self.classDiagramAction.setEnabled(False)
404
self.importsDiagramAction.setEnabled(False)
405
self.unittestAction.setEnabled(False)
406
self.sourceMenu.popup(self.mapToGlobal(coord))
407
elif isinstance(itm, BrowserClassItem) or \
408
isinstance(itm, BrowserMethodItem):
409
self.menu.popup(self.mapToGlobal(coord))
411
self.backMenu.popup(self.mapToGlobal(coord))
413
self.classDiagramAction.setEnabled(False)
414
self.dirMenu.popup(self.mapToGlobal(coord))
416
self.backMenu.popup(self.mapToGlobal(coord))
418
self.backMenu.popup(self.mapToGlobal(coord))
422
def __showPopupMenu(self):
424
Private slot called by the sourceMenu aboutToShow signal.
426
ProjectBaseBrowser._showPopupMenu(self, self.sourceMenu)
428
def __showPopupMenuMulti(self):
430
Private slot called by the multiMenu aboutToShow signal.
432
ProjectBaseBrowser._showPopupMenuMulti(self, self.multiMenu)
434
def __showPopupMenuDir(self):
436
Private slot called by the dirMenu aboutToShow signal.
438
ProjectBaseBrowser._showPopupMenuDir(self, self.dirMenu)
440
def __showPopupMenuDirMulti(self):
442
Private slot called by the dirMultiMenu aboutToShow signal.
444
ProjectBaseBrowser._showPopupMenuDirMulti(self, self.dirMultiMenu)
446
def __showShowMenu(self):
448
Private slot called before the show menu is shown.
454
# first check if the file belongs to a project and there is
455
# a project coverage file
456
fn = self.project.getMainScript(True)
458
tfn = Utilities.getTestFileName(fn)
459
basename = os.path.splitext(fn)[0]
460
tbasename = os.path.splitext(tfn)[0]
461
prEnable = prEnable or \
462
os.path.isfile("%s.profile" % basename) or \
463
os.path.isfile("%s.profile" % tbasename)
464
coEnable = coEnable or \
465
os.path.isfile("%s.coverage" % basename) or \
466
os.path.isfile("%s.coverage" % tbasename)
467
cyEnable = cyEnable or \
468
os.path.isfile("%s.cycles.html" % basename) or \
469
os.path.isfile("%s.cycles.html" % tbasename)
471
# now check the selected item
472
itm = self.model().item(self.currentIndex())
473
fn = unicode(itm.fileName())
475
basename = os.path.splitext(fn)[0]
476
prEnable = prEnable or \
477
os.path.isfile("%s.profile" % basename)
478
coEnable = coEnable or \
479
os.path.isfile("%s.coverage" % basename)
480
cyEnable = cyEnable or \
481
os.path.isfile("%s.cycles.html" % basename)
483
self.profileMenuAction.setEnabled(prEnable)
484
self.coverageMenuAction.setEnabled(coEnable)
485
self.cyclopsMenuAction.setEnabled(cyEnable)
486
self.removeCyclopsMenuAction.setEnabled(cyEnable)
488
def __addSourceFiles(self):
490
Private method to add a source file to the project.
492
itm = self.model().item(self.currentIndex())
493
if isinstance(itm, ProjectBrowserFileItem) or \
494
isinstance(itm, BrowserClassItem) or \
495
isinstance(itm, BrowserMethodItem):
496
dn = os.path.dirname(unicode(itm.fileName()))
497
elif isinstance(itm, ProjectBrowserSimpleDirectoryItem) or \
498
isinstance(itm, ProjectBrowserDirectoryItem):
499
dn = unicode(itm.dirName())
502
self.project.addFiles('source', dn)
504
def __addSourceDirectory(self):
506
Private method to add source files of a directory to the project.
508
itm = self.model().item(self.currentIndex())
509
if isinstance(itm, ProjectBrowserFileItem) or \
510
isinstance(itm, BrowserClassItem) or \
511
isinstance(itm, BrowserMethodItem):
512
dn = os.path.dirname(unicode(itm.fileName()))
513
elif isinstance(itm, ProjectBrowserSimpleDirectoryItem) or \
514
isinstance(itm, ProjectBrowserDirectoryItem):
515
dn = unicode(itm.dirName())
518
self.project.addDirectory('source', dn)
520
def __deleteFile(self):
522
Private method to delete files from the project.
524
itmList = self.getSelectedItems()
529
fn2 = unicode(itm.fileName())
530
fullNames.append(fn2)
531
fn = fn2.replace(self.project.ppath+os.sep, '')
534
dlg = DeleteFilesConfirmationDialog(self.parent(),
535
self.trUtf8("Delete files"),
536
self.trUtf8("Do you really want to delete these files from the project?"),
539
if dlg.exec_() == QDialog.Accepted:
540
for fn2, fn in zip(fullNames, files):
541
self.emit(SIGNAL('closeSourceWindow'), fn2)
542
self.project.deleteFile(fn)
544
############################################################################
545
## Methods for the Checks submenu
546
############################################################################
548
def handleTabnanny(self):
550
Public method to handle the tabnanny context menu action.
552
itm = self.model().item(self.currentIndex())
555
except AttributeError:
557
if os.path.isdir(fn):
558
fn = [f for f in self.project.getSources(True) if f.startswith(fn)]
560
self.checkers.tabnanny(fn)
562
def handleSyntaxCheck(self):
564
Public method to handle the syntax check context menu action.
566
itm = self.model().item(self.currentIndex())
569
except AttributeError:
571
if os.path.isdir(fn):
572
fn = [f for f in self.project.getSources(True) if f.startswith(fn)]
574
self.checkers.syntaxCheck(fn)
576
def handlePyLint(self):
578
Public method to handle the syntax check context menu action.
580
itm = self.model().item(self.currentIndex())
583
except AttributeError:
585
self.checkers.pyLint(self.project, fn)
587
############################################################################
588
## Methods for the Show submenu
589
############################################################################
591
def __showCodeMetrics(self):
593
Private method to handle the code metrics context menu action.
595
itm = self.model().item(self.currentIndex())
598
self.codemetrics = CodeMetricsDialog()
599
self.codemetrics.show()
600
self.codemetrics.start(fn)
602
def __showCodeCoverage(self):
604
Private method to handle the code coverage context menu action.
606
itm = self.model().item(self.currentIndex())
608
pfn = self.project.getMainScript(True)
613
tpfn = Utilities.getTestFileName(pfn)
614
basename = os.path.splitext(pfn)[0]
615
tbasename = os.path.splitext(tpfn)[0]
617
f = "%s.coverage" % basename
618
tf = "%s.coverage" % tbasename
619
if os.path.isfile(f):
621
if os.path.isfile(tf):
625
tfn = Utilities.getTestFileName(fn)
626
basename = os.path.splitext(fn)[0]
627
tbasename = os.path.splitext(tfn)[0]
629
f = "%s.coverage" % basename
630
tf = "%s.coverage" % tbasename
631
if os.path.isfile(f) and not f in files:
633
if os.path.isfile(tf) and not tf in files:
638
filelist = QStringList()
641
pfn, ok = KQInputDialog.getItem(\
643
self.trUtf8("Code Coverage"),
644
self.trUtf8("Please select a coverage file"),
655
self.codecoverage = PyCoverageDialog()
656
self.codecoverage.show()
657
self.codecoverage.start(pfn, fn)
659
def __showProfileData(self):
661
Private method to handle the show profile data context menu action.
663
itm = self.model().item(self.currentIndex())
665
pfn = self.project.getMainScript(True)
670
tpfn = Utilities.getTestFileName(pfn)
671
basename = os.path.splitext(pfn)[0]
672
tbasename = os.path.splitext(tpfn)[0]
674
f = "%s.profile" % basename
675
tf = "%s.profile" % tbasename
676
if os.path.isfile(f):
678
if os.path.isfile(tf):
682
tfn = Utilities.getTestFileName(fn)
683
basename = os.path.splitext(fn)[0]
684
tbasename = os.path.splitext(tfn)[0]
686
f = "%s.profile" % basename
687
tf = "%s.profile" % tbasename
688
if os.path.isfile(f) and not f in files:
690
if os.path.isfile(tf) and not tf in files:
695
filelist = QStringList()
698
pfn, ok = KQInputDialog.getItem(\
700
self.trUtf8("Profile Data"),
701
self.trUtf8("Please select a profile file"),
712
self.profiledata = PyProfileDialog()
713
self.profiledata.show()
714
self.profiledata.start(pfn, fn)
716
def __showCyclopsReport(self):
718
Private method to handle the show cyclops report context menu action.
720
itm = self.model().item(self.currentIndex())
722
pfn = self.project.getMainScript(True)
727
tpfn = Utilities.getTestFileName(pfn)
728
basename = os.path.splitext(pfn)[0]
729
tbasename = os.path.splitext(tpfn)[0]
731
f = "%s.cycles.html" % basename
732
tf = "%s.cycles.html" % tbasename
733
if os.path.isfile(f):
735
if os.path.isfile(tf):
739
tfn = Utilities.getTestFileName(fn)
740
basename = os.path.splitext(fn)[0]
741
tbasename = os.path.splitext(tfn)[0]
743
f = "%s.cycles.html" % basename
744
tf = "%s.cycles.html" % tbasename
745
if os.path.isfile(f) and not f in files:
747
if os.path.isfile(tf) and not tf in files:
752
filelist = QStringList()
755
pfn, ok = KQInputDialog.getItem(\
757
self.trUtf8("Cyclops Report"),
758
self.trUtf8("Please select a Cyclops report file"),
769
e4App().getObject("UserInterface").launchHelpViewer(pfn)
771
def __removeCyclopsReport(self):
773
Private method to handle the Remove Cyclops report context menu action.
775
itm = self.model().item(self.currentIndex())
777
pfn = self.project.getMainScript(1)
782
tpfn = Utilities.getTestFileName(pfn)
783
basename = os.path.splitext(pfn)[0]
784
tbasename = os.path.splitext(tpfn)[0]
786
f = "%s.cycles.html" % basename
787
tf = "%s.cycles.html" % tbasename
788
if os.path.isfile(f):
790
if os.path.isfile(tf):
794
tfn = Utilities.getTestFileName(fn)
795
basename = os.path.splitext(fn)[0]
796
tbasename = os.path.splitext(tfn)[0]
798
f = "%s.cycles.html" % basename
799
tf = "%s.cycles.html" % tbasename
800
if os.path.isfile(f) and not f in files:
802
if os.path.isfile(tf) and not tf in files:
807
filelist = QStringList()
810
pfn, ok = KQInputDialog.getItem(\
812
self.trUtf8("Remove Cyclops Report"),
813
self.trUtf8("Please select a Cyclops report file to be removed"),
824
if os.path.exists(pfn):
828
############################################################################
829
## Methods for the Graphics submenu
830
############################################################################
832
def __showClassDiagram(self):
834
Private method to handle the class diagram context menu action.
836
itm = self.model().item(self.currentIndex())
839
except AttributeError:
841
res = KQMessageBox.question(None,
842
self.trUtf8("Class Diagram"),
843
self.trUtf8("""Include class attributes?"""),
844
QMessageBox.StandardButtons(\
848
self.classDiagram = UMLClassDiagram(fn, self,
849
noAttrs = (res != QMessageBox.Yes))
850
self.classDiagram.show()
852
def __showImportsDiagram(self):
854
Private method to handle the imports diagram context menu action.
856
itm = self.model().item(self.currentIndex())
859
except AttributeError:
861
package = os.path.isdir(fn) and fn or os.path.dirname(fn)
862
self.importsDiagram = ImportsDiagram(package, self)
863
self.importsDiagram.show()
865
def __showPackageDiagram(self):
867
Private method to handle the package diagram context menu action.
869
itm = self.model().item(self.currentIndex())
872
except AttributeError:
874
package = os.path.isdir(fn) and fn or os.path.dirname(fn)
875
res = KQMessageBox.question(None,
876
self.trUtf8("Package Diagram"),
877
self.trUtf8("""Include class attributes?"""),
878
QMessageBox.StandardButtons(\
882
self.packageDiagram = PackageDiagram(package, self,
883
noAttrs = (res != QMessageBox.Yes))
884
self.packageDiagram.show()
886
def __showApplicationDiagram(self):
888
Private method to handle the application diagram context menu action.
890
res = KQMessageBox.question(None,
891
self.trUtf8("Application Diagram"),
892
self.trUtf8("""Include module names?"""),
893
QMessageBox.StandardButtons(\
897
self.applicationDiagram = ApplicationDiagram(self.project, self,
898
noModules = (res != QMessageBox.Yes))
899
self.applicationDiagram.show()