17 QMenu, QPalette, QFont, QPixmap, QPainter |
17 QMenu, QPalette, QFont, QPixmap, QPainter |
18 from PyQt4.Qsci import QsciScintilla, QsciMacro, QsciStyledText |
18 from PyQt4.Qsci import QsciScintilla, QsciMacro, QsciStyledText |
19 |
19 |
20 from E5Gui.E5Application import e5App |
20 from E5Gui.E5Application import e5App |
21 from E5Gui import E5FileDialog, E5MessageBox |
21 from E5Gui import E5FileDialog, E5MessageBox |
22 from E5Gui.E5MapWidget import E5MapWidget |
|
23 |
22 |
24 from .QsciScintillaCompat import QsciScintillaCompat, QSCINTILLA_VERSION |
23 from .QsciScintillaCompat import QsciScintillaCompat, QSCINTILLA_VERSION |
|
24 from .EditorMarkerMap import EditorMarkerMap |
25 |
25 |
26 import Preferences |
26 import Preferences |
27 import Utilities |
27 import Utilities |
28 |
28 |
29 import UI.PixmapCache |
29 import UI.PixmapCache |
290 (1 << self.dbreakpoint) |
290 (1 << self.dbreakpoint) |
291 |
291 |
292 self.changeMarkersMask = (1 << self.__changeMarkerSaved) | \ |
292 self.changeMarkersMask = (1 << self.__changeMarkerSaved) | \ |
293 (1 << self.__changeMarkerUnsaved) |
293 (1 << self.__changeMarkerUnsaved) |
294 |
294 |
295 self.__markerMap = E5MapWidget(self) |
295 self.__markerMap = EditorMarkerMap(self) |
296 |
296 |
297 # configure the margins |
297 # configure the margins |
298 self.__setMarginsDisplay() |
298 self.__setMarginsDisplay() |
299 self.linesChanged.connect(self.__resizeLinenoMargin) |
299 self.linesChanged.connect(self.__resizeLinenoMargin) |
300 |
300 |
442 self.project.isProjectSource(self.fileName): |
442 self.project.isProjectSource(self.fileName): |
443 self.project.projectPropertiesChanged.connect( |
443 self.project.projectPropertiesChanged.connect( |
444 self.__projectPropertiesChanged) |
444 self.__projectPropertiesChanged) |
445 |
445 |
446 self.grabGesture(Qt.PinchGesture) |
446 self.grabGesture(Qt.PinchGesture) |
|
447 |
|
448 self.SCN_ZOOM.connect(self.__markerMap.update) |
|
449 self.__markerMap.update() |
447 |
450 |
448 def __registerImages(self): |
451 def __registerImages(self): |
449 """ |
452 """ |
450 Private method to register images for autocompletion lists. |
453 Private method to register images for autocompletion lists. |
451 """ |
454 """ |
1652 doSpelling = False |
1655 doSpelling = False |
1653 if doSpelling: |
1656 if doSpelling: |
1654 pos = self.positionFromLineIndex(self.lastLine, self.lastIndex) |
1657 pos = self.positionFromLineIndex(self.lastLine, self.lastIndex) |
1655 self.spell.checkWord(pos) |
1658 self.spell.checkWord(pos) |
1656 |
1659 |
|
1660 if self.lastLine != line: |
|
1661 self.__markerMap.update() |
|
1662 |
1657 self.lastLine = line |
1663 self.lastLine = line |
1658 self.lastIndex = index |
1664 self.lastIndex = index |
1659 |
1665 |
1660 def __modificationReadOnly(self): |
1666 def __modificationReadOnly(self): |
1661 """ |
1667 """ |
1949 """ |
1955 """ |
1950 for handle in list(self.breaks.keys()): |
1956 for handle in list(self.breaks.keys()): |
1951 self.markerDeleteHandle(handle) |
1957 self.markerDeleteHandle(handle) |
1952 self.__addBreakPoints( |
1958 self.__addBreakPoints( |
1953 QModelIndex(), 0, self.breakpointModel.rowCount() - 1) |
1959 QModelIndex(), 0, self.breakpointModel.rowCount() - 1) |
|
1960 self.__markerMap.update() |
1954 |
1961 |
1955 def __deleteBreakPoints(self, parentIndex, start, end): |
1962 def __deleteBreakPoints(self, parentIndex, start, end): |
1956 """ |
1963 """ |
1957 Private slot to delete breakpoints. |
1964 Private slot to delete breakpoints. |
1958 |
1965 |
2025 # not found, simply ignore it |
2032 # not found, simply ignore it |
2026 return |
2033 return |
2027 |
2034 |
2028 del self.breaks[handle] |
2035 del self.breaks[handle] |
2029 self.markerDeleteHandle(handle) |
2036 self.markerDeleteHandle(handle) |
|
2037 self.__markerMap.update() |
2030 |
2038 |
2031 def newBreakpointWithProperties(self, line, properties): |
2039 def newBreakpointWithProperties(self, line, properties): |
2032 """ |
2040 """ |
2033 Private method to set a new breakpoint and its properties. |
2041 Private method to set a new breakpoint and its properties. |
2034 |
2042 |
2045 |
2053 |
2046 if self.markersAtLine(line - 1) & self.breakpointMask == 0: |
2054 if self.markersAtLine(line - 1) & self.breakpointMask == 0: |
2047 handle = self.markerAdd(line - 1, marker) |
2055 handle = self.markerAdd(line - 1, marker) |
2048 self.breaks[handle] = (line,) + properties |
2056 self.breaks[handle] = (line,) + properties |
2049 self.breakpointToggled.emit(self) |
2057 self.breakpointToggled.emit(self) |
|
2058 self.__markerMap.update() |
2050 |
2059 |
2051 def __toggleBreakpoint(self, line, temporary=False): |
2060 def __toggleBreakpoint(self, line, temporary=False): |
2052 """ |
2061 """ |
2053 Private method to toggle a breakpoint. |
2062 Private method to toggle a breakpoint. |
2054 |
2063 |
2268 |
2277 |
2269 @param line line number of the bookmark (integer) |
2278 @param line line number of the bookmark (integer) |
2270 """ |
2279 """ |
2271 for handle in self.bookmarks: |
2280 for handle in self.bookmarks: |
2272 if self.markerLine(handle) == line - 1: |
2281 if self.markerLine(handle) == line - 1: |
|
2282 self.bookmarks.remove(handle) |
|
2283 self.markerDeleteHandle(handle) |
2273 break |
2284 break |
2274 else: |
2285 else: |
2275 # set a new bookmark |
2286 # set a new bookmark |
2276 handle = self.markerAdd(line - 1, self.bookmark) |
2287 handle = self.markerAdd(line - 1, self.bookmark) |
2277 self.bookmarks.append(handle) |
2288 self.bookmarks.append(handle) |
2278 self.bookmarkToggled.emit(self) |
|
2279 return |
|
2280 |
|
2281 self.bookmarks.remove(handle) |
|
2282 self.markerDeleteHandle(handle) |
|
2283 self.bookmarkToggled.emit(self) |
2289 self.bookmarkToggled.emit(self) |
|
2290 self.__markerMap.update() |
2284 |
2291 |
2285 def getBookmarks(self): |
2292 def getBookmarks(self): |
2286 """ |
2293 """ |
2287 Public method to retrieve the bookmarks. |
2294 Public method to retrieve the bookmarks. |
2288 |
2295 |
2371 """ |
2378 """ |
2372 for handle in self.bookmarks: |
2379 for handle in self.bookmarks: |
2373 self.markerDeleteHandle(handle) |
2380 self.markerDeleteHandle(handle) |
2374 self.bookmarks = [] |
2381 self.bookmarks = [] |
2375 self.bookmarkToggled.emit(self) |
2382 self.bookmarkToggled.emit(self) |
|
2383 self.__markerMap.update() |
2376 |
2384 |
2377 ########################################################################### |
2385 ########################################################################### |
2378 ## Printing methods below |
2386 ## Printing methods below |
2379 ########################################################################### |
2387 ########################################################################### |
2380 |
2388 |
2543 shouldBreak = True |
2551 shouldBreak = True |
2544 break |
2552 break |
2545 if shouldBreak: |
2553 if shouldBreak: |
2546 break |
2554 break |
2547 self.taskMarkersUpdated.emit(self) |
2555 self.taskMarkersUpdated.emit(self) |
|
2556 self.__markerMap.update() |
2548 |
2557 |
2549 ########################################################################### |
2558 ########################################################################### |
2550 ## Change tracing methods below |
2559 ## Change tracing methods below |
2551 ########################################################################### |
2560 ########################################################################### |
2552 |
2561 |
2626 self.markerAdd(lineNo, self.__changeMarkerUnsaved) |
2635 self.markerAdd(lineNo, self.__changeMarkerUnsaved) |
2627 self.__hasChangeMarkers = True |
2636 self.__hasChangeMarkers = True |
2628 |
2637 |
2629 if self.__hasChangeMarkers: |
2638 if self.__hasChangeMarkers: |
2630 self.changeMarkersUpdated.emit(self) |
2639 self.changeMarkersUpdated.emit(self) |
|
2640 self.__markerMap.update() |
2631 |
2641 |
2632 def __resetOnlineChangeTraceInfo(self): |
2642 def __resetOnlineChangeTraceInfo(self): |
2633 """ |
2643 """ |
2634 Private slot to reset the online change trace info. |
2644 Private slot to reset the online change trace info. |
2635 """ |
2645 """ |
2647 self.markerAdd(lineNo, self.__changeMarkerSaved) |
2657 self.markerAdd(lineNo, self.__changeMarkerSaved) |
2648 self.__hasChangeMarkers = True |
2658 self.__hasChangeMarkers = True |
2649 |
2659 |
2650 if self.__hasChangeMarkers: |
2660 if self.__hasChangeMarkers: |
2651 self.changeMarkersUpdated.emit(self) |
2661 self.changeMarkersUpdated.emit(self) |
|
2662 self.__markerMap.update() |
2652 |
2663 |
2653 def __deleteAllChangeMarkers(self): |
2664 def __deleteAllChangeMarkers(self): |
2654 """ |
2665 """ |
2655 Private slot to delete all change markers. |
2666 Private slot to delete all change markers. |
2656 """ |
2667 """ |
2657 self.markerDeleteAll(self.__changeMarkerUnsaved) |
2668 self.markerDeleteAll(self.__changeMarkerUnsaved) |
2658 self.markerDeleteAll(self.__changeMarkerSaved) |
2669 self.markerDeleteAll(self.__changeMarkerSaved) |
2659 self.__hasChangeMarkers = False |
2670 self.__hasChangeMarkers = False |
2660 self.changeMarkersUpdated.emit(self) |
2671 self.changeMarkersUpdated.emit(self) |
|
2672 self.__markerMap.update() |
2661 |
2673 |
2662 def getChangeLines(self): |
2674 def getChangeLines(self): |
2663 """ |
2675 """ |
2664 Public method to get the lines containing a change. |
2676 Public method to get the lines containing a change. |
2665 |
2677 |
5246 missing = cover.analysis2(self.fileName)[3] |
5258 missing = cover.analysis2(self.fileName)[3] |
5247 if missing: |
5259 if missing: |
5248 for line in missing: |
5260 for line in missing: |
5249 handle = self.markerAdd(line - 1, self.notcovered) |
5261 handle = self.markerAdd(line - 1, self.notcovered) |
5250 self.notcoveredMarkers.append(handle) |
5262 self.notcoveredMarkers.append(handle) |
5251 self.coverageMarkersShown.emit(True) |
5263 self.coverageMarkersShown.emit(True) |
|
5264 self.__markerMap.update() |
5252 else: |
5265 else: |
5253 if not silent: |
5266 if not silent: |
5254 E5MessageBox.information( |
5267 E5MessageBox.information( |
5255 self, |
5268 self, |
5256 self.tr("Show Code Coverage Annotations"), |
5269 self.tr("Show Code Coverage Annotations"), |
5271 for handle in self.notcoveredMarkers: |
5284 for handle in self.notcoveredMarkers: |
5272 self.markerDeleteHandle(handle) |
5285 self.markerDeleteHandle(handle) |
5273 self.notcoveredMarkers = [] |
5286 self.notcoveredMarkers = [] |
5274 self.coverageMarkersShown.emit(False) |
5287 self.coverageMarkersShown.emit(False) |
5275 self.showingNotcoveredMarkers = False |
5288 self.showingNotcoveredMarkers = False |
|
5289 self.__markerMap.update() |
5276 |
5290 |
5277 def getCoverageLines(self): |
5291 def getCoverageLines(self): |
5278 """ |
5292 """ |
5279 Public method to get the lines containing a coverage marker. |
5293 Public method to get the lines containing a coverage marker. |
5280 |
5294 |
5447 del self.syntaxerrors[handle] |
5461 del self.syntaxerrors[handle] |
5448 self.markerDeleteHandle(handle) |
5462 self.markerDeleteHandle(handle) |
5449 self.syntaxerrorToggled.emit(self) |
5463 self.syntaxerrorToggled.emit(self) |
5450 |
5464 |
5451 self.__setAnnotation(line - 1) |
5465 self.__setAnnotation(line - 1) |
|
5466 self.__markerMap.update() |
5452 |
5467 |
5453 def getSyntaxErrors(self): |
5468 def getSyntaxErrors(self): |
5454 """ |
5469 """ |
5455 Public method to retrieve the syntax error markers. |
5470 Public method to retrieve the syntax error markers. |
5456 |
5471 |
5574 del self.warnings[handle] |
5589 del self.warnings[handle] |
5575 self.markerDeleteHandle(handle) |
5590 self.markerDeleteHandle(handle) |
5576 self.syntaxerrorToggled.emit(self) |
5591 self.syntaxerrorToggled.emit(self) |
5577 |
5592 |
5578 self.__setAnnotation(line - 1) |
5593 self.__setAnnotation(line - 1) |
|
5594 self.__markerMap.update() |
5579 |
5595 |
5580 def getWarnings(self): |
5596 def getWarnings(self): |
5581 """ |
5597 """ |
5582 Public method to retrieve the warning markers. |
5598 Public method to retrieve the warning markers. |
5583 |
5599 |
5685 else: |
5701 else: |
5686 del self.warnings[handle] |
5702 del self.warnings[handle] |
5687 self.__setAnnotation(self.markerLine(handle)) |
5703 self.__setAnnotation(self.markerLine(handle)) |
5688 self.markerDeleteHandle(handle) |
5704 self.markerDeleteHandle(handle) |
5689 self.syntaxerrorToggled.emit(self) |
5705 self.syntaxerrorToggled.emit(self) |
|
5706 self.__markerMap.update() |
5690 |
5707 |
5691 def clearWarnings(self): |
5708 def clearWarnings(self): |
5692 """ |
5709 """ |
5693 Public slot to clear all warnings. |
5710 Public slot to clear all warnings. |
5694 """ |
5711 """ |
5696 self.warnings[handle] = [] |
5713 self.warnings[handle] = [] |
5697 self.__setAnnotation(self.markerLine(handle)) |
5714 self.__setAnnotation(self.markerLine(handle)) |
5698 self.markerDeleteHandle(handle) |
5715 self.markerDeleteHandle(handle) |
5699 self.warnings = {} |
5716 self.warnings = {} |
5700 self.syntaxerrorToggled.emit(self) |
5717 self.syntaxerrorToggled.emit(self) |
|
5718 self.__markerMap.update() |
5701 |
5719 |
5702 def __showWarning(self, line=-1): |
5720 def __showWarning(self, line=-1): |
5703 """ |
5721 """ |
5704 Private slot to handle the 'Show warning' context menu action. |
5722 Private slot to handle the 'Show warning' context menu action. |
5705 |
5723 |
6327 self.toggleBookmark(bm) |
6345 self.toggleBookmark(bm) |
6328 self.__restoreBreakpoints() |
6346 self.__restoreBreakpoints() |
6329 |
6347 |
6330 self.editorSaved.emit(self.fileName) |
6348 self.editorSaved.emit(self.fileName) |
6331 self.__autoSyntaxCheck(useText=False) |
6349 self.__autoSyntaxCheck(useText=False) |
|
6350 |
|
6351 self.__markerMap.update() |
6332 |
6352 |
6333 self.refreshed.emit() |
6353 self.refreshed.emit() |
6334 |
6354 |
6335 def setMonospaced(self, on): |
6355 def setMonospaced(self, on): |
6336 """ |
6356 """ |