seascope-0.7/ 0000775 0023763 0023763 00000000000 12062273206 011634 5 ustar anil anil seascope-0.7/setup.py 0000775 0023763 0023763 00000003234 12062273150 013351 0 ustar anil anil #!/usr/bin/env python
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
from distutils.core import setup
setup(name='Seascope',
version='0.7',
description='A multi-platform multi-language source code browsing tool'
long_description='A pyQt GUI front-end for idutils, cscope and gtags. Written in python using pyQt, QScintilla libraries.',
url='http://seascope.googlecode.com',
packages=['Seascope',
'Seascope.backend',
'Seascope.backend.plugins',
'Seascope.backend.plugins.idutils'
'Seascope.backend.plugins.cscope',
'Seascope.backend.plugins.gtags',
'Seascope.view',
'Seascope.view.filecontext',
'Seascope.view.filecontext.plugins',
'Seascope.view.filecontext.plugins.ctags_view',
'Seascope.view.filecontext.plugins.generic_view',
],
package_dir={'Seascope': 'src'},
package_data={'Seascope': ['icons/*.svg','ui/*.ui','tools/*.py']},
license="BSD License",
classifiers=[
'Development Status :: 4 - Beta',
'Environment :: X11 Applications :: Qt',
'Environment :: Win32 (MS Windows)',
'Intended Audience :: End Users/Desktop',
'Intended Audience :: Developers',
'License :: OSI Approved :: BSD License',
'Operating System :: MacOS :: MacOS X',
'Operating System :: Microsoft :: Windows',
'Operating System :: POSIX',
'Programming Language :: Python',
'Topic :: Software Development',
],
options= {'bdist_rpm':{'requires': 'PyQt4,qscintilla-python,idutils,cscope,global,ctags,graphviz',
'group': 'Development Tools',
'vendor': 'The Seascope Team'}}
)
seascope-0.7/LICENSE 0000664 0023763 0023763 00000002554 12062273150 012645 0 ustar anil anil Copyright (c) 2010 Anil Kumar
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. seascope-0.7/README 0000664 0023763 0023763 00000000353 12062273150 012513 0 ustar anil anil Seascope is a GUI frontend for cscope, idutils.
* Running the application
cd src
python Seascope.py
* Generating source distribution package
python setup.py sdist
* Generating RPM distribution package
python setup.py bdist_rpm
seascope-0.7/MANIFEST.in 0000664 0023763 0023763 00000000020 12062273150 013360 0 ustar anil anil include LICENSE
seascope-0.7/src/ 0000775 0023763 0023763 00000000000 12062273150 012421 5 ustar anil anil seascope-0.7/src/ui/ 0000775 0023763 0023763 00000000000 12062273150 013036 5 ustar anil anil seascope-0.7/src/ui/filter.ui 0000664 0023763 0023763 00000007726 12062273150 014676 0 ustar anil anil
Dialog
0
0
345
222
Filter
-
-
Filter in
-
-
Qt::Horizontal
40
20
-
-
Filter for
-
-
true
Qt::AlignCenter
-
-
50
16777215
-
Regex
-
Negate search
-
Case insensitive
-
Qt::Horizontal
QDialogButtonBox::Cancel|QDialogButtonBox::Ok
fd_filter_inp
fd_regex_chkbox
fd_negate_chkbox
fd_icase_chkbox
buttonBox
fd_cmd_inp
buttonBox
accepted()
Dialog
accept()
248
254
157
274
buttonBox
rejected()
Dialog
reject()
316
260
286
274
seascope-0.7/src/ui/proj_new.ui 0000664 0023763 0023763 00000004447 12062273150 015231 0 ustar anil anil
ProjNewDialog
0
0
600
360
Project new
-
Choose backend
-
-
110
16777215
-1
-
true
QFrame::NoFrame
true
-
Qt::Horizontal
QDialogButtonBox::Cancel|QDialogButtonBox::Ok
buttonBox
accepted()
ProjNewDialog
accept()
248
254
157
274
buttonBox
rejected()
ProjNewDialog
reject()
316
260
286
274
seascope-0.7/src/ui/find.ui 0000664 0023763 0023763 00000006137 12062273150 014324 0 ustar anil anil
FindDialog
0
0
301
183
Find Text
-
true
-
-
Case sensitive
-
Regex
-
Whole words only
-
Find backwards
-
From cursor
-
Qt::Vertical
20
40
-
Qt::Horizontal
QDialogButtonBox::Cancel|QDialogButtonBox::Ok
ft_text_inp
ft_cs
ft_re
ft_wo
ft_bw
ft_from_cursor
buttonBox
buttonBox
accepted()
FindDialog
accept()
248
254
157
274
buttonBox
rejected()
FindDialog
reject()
316
260
286
274
seascope-0.7/src/ui/preferences.ui 0000664 0023763 0023763 00000013734 12062273150 015706 0 ustar anil anil
PrefDialog
0
0
400
300
Seascope Preferences
-
Qt::TabFocus
QTabWidget::North
QTabWidget::Rounded
0
Style
-
Font
-
Application
-
Application Font
-
Qt::Horizontal
40
20
-
Editor
-
Editor Font
-
Qt::Vertical
20
40
Option
-
Ask before exit if there is open project
-
-
Format: %F - filename, %L - line
-
External Editor
-
-
Enable internal editor editting support
-
Show line number in editor by default
-
Qt::Vertical
20
40
-
Qt::Horizontal
QDialogButtonBox::Cancel|QDialogButtonBox::Ok
buttonBox
accepted()
PrefDialog
accept()
248
254
157
274
buttonBox
rejected()
PrefDialog
reject()
316
260
286
274
seascope-0.7/src/ui/goto_line.ui 0000664 0023763 0023763 00000005204 12062273150 015355 0 ustar anil anil
Dialog
0
0
194
103
Goto line
-
Goto line
-
-
Qt::Horizontal
-
-
Qt::Horizontal
QDialogButtonBox::Cancel|QDialogButtonBox::Ok
gl_spinbox
buttonBox
gl_hslider
buttonBox
accepted()
Dialog
accept()
184
93
157
274
buttonBox
rejected()
Dialog
reject()
184
93
286
274
gl_hslider
sliderMoved(int)
gl_spinbox
setValue(int)
79
46
148
48
gl_spinbox
valueChanged(int)
gl_hslider
setValue(int)
142
51
90
49
seascope-0.7/src/ui/project_settings.ui 0000664 0023763 0023763 00000010636 12062273150 016771 0 ustar anil anil
ProjectDialog
0
0
351
168
Project Settings
-
Qt::Vertical
20
40
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Project Information</span></p></body></html>
-
-
Qt::Horizontal
10
20
-
-
path:
-
TextLabel
-
type:
-
TextLabel
-
Qt::Horizontal
40
20
-
Qt::Vertical
20
40
-
Qt::Horizontal
QDialogButtonBox::Ok
buttonBox
buttonBox
accepted()
ProjectDialog
accept()
257
579
157
274
buttonBox
rejected()
ProjectDialog
reject()
325
579
286
274
seascope-0.7/src/ui/proj_open.ui 0000664 0023763 0023763 00000005007 12062273150 015372 0 ustar anil anil
ProjOpenDlg
Qt::NonModal
0
0
400
300
Project Open
-
-
-
40
16777215
-
-
Qt::Horizontal
QDialogButtonBox::Cancel|QDialogButtonBox::Ok
pod_proj_name
pod_open_btn
pod_proj_list
buttonBox
buttonBox
accepted()
ProjOpenDlg
accept()
257
290
157
274
buttonBox
rejected()
ProjOpenDlg
reject()
325
290
286
274
pod_proj_list
doubleClicked(QModelIndex)
ProjOpenDlg
accept()
199
150
199
149
seascope-0.7/src/ui/about.ui 0000664 0023763 0023763 00000032037 12062273150 014514 0 ustar anil anil
AboutDialog
0
0
501
296
About Seascope
-
0
About
-
Qt::Vertical
20
40
-
-
Qt::Horizontal
40
20
-
ImageHere
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">Seascope 0.7</span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A graphical user interface for idutils, cscope and gtags.</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright © 2010-2012 Anil Kumar</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://seascope.googlecode.com"><span style=" text-decoration: underline; color:#0000ff;">http://seascope.googlecode.com</span></a></p></body></html>
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
Qt::Horizontal
40
20
-
Qt::Vertical
20
40
Author
-
QTextEdit::AutoNone
true
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anil Kumar</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> anil.omkar@gmail.com</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Developer</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Shu Shen</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> shu.shen@gmail.com</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Developer</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Binghoo Dang</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> dangbinghoo@gmail.com</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Developer</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Anthony Liu</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> antliu@gmail.com</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Developer </p></body></html>
true
Thanks
-
true
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ritesh Raj Sarraf</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> rrs@debian.org</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Debian packaging</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Bug fixes</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> xuhdev@gmail.com</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> tuomas.tuurala@gmail.com</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>
License
-
true
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">BSD License</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <a href="http://www.opensource.org/licenses/bsd-license.php"><span style=" text-decoration: underline; color:#0000ff;">http://www.debian.org/misc/bsd.license</span></a></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>
-
Qt::Horizontal
QDialogButtonBox::Close
ad_buttonbox
accepted()
AboutDialog
accept()
248
254
157
274
ad_buttonbox
rejected()
AboutDialog
reject()
316
260
286
274
seascope-0.7/src/ui/debug.ui 0000664 0023763 0023763 00000003751 12062273150 014471 0 ustar anil anil
dbg_main_window
0
0
514
394
Debug info...
-
QTabWidget::Rounded
0
Info
-
true
0
0
472
323
Version
-
Not implemented yet
seascope-0.7/src/view/ 0000775 0023763 0023763 00000000000 12062273150 013373 5 ustar anil anil seascope-0.7/src/view/EdView.py 0000664 0023763 0023763 00000031051 12062273150 015130 0 ustar anil anil #!/usr/bin/env python
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os
import re
from PyQt4 import QtGui
from PyQt4.QtGui import *
from PyQt4.QtCore import *
try:
from PyQt4.Qsci import QsciScintilla, QsciScintillaBase, QsciLexerCPP, QsciLexerPython
except ImportError:
print "Error: required qscintilla-python package not found"
raise ImportError
import DialogManager
from FileContextView import *
class EditorView(QsciScintilla):
ev_popup = None
def __init__(self, parent=None):
QsciScintilla.__init__(self, parent)
#self.setGeometry(300, 300, 400, 300)
## Editing line color
self.setCaretLineVisible(True)
self.setCaretLineBackgroundColor(QtGui.QColor("#EEF6FF"))
#self.setCaretWidth(2)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.font = None
self.lexer = None
self.codemark_marker = self.markerDefine(self.Circle)
def get_filename(self):
return self.filename
def ed_settings_1(self):
## Margins colors
# line numbers margin
self.setMarginsBackgroundColor(QtGui.QColor("#333333"))
self.setMarginsForegroundColor(QtGui.QColor("#CCCCCC"))
# folding margin colors (foreground,background)
self.setFoldMarginColors(QtGui.QColor("#888888"),QtGui.QColor("#eeeeee"))
## Edge Mode shows a red vetical bar at 80 chars
self.setEdgeMode(QsciScintilla.EdgeLine)
self.setEdgeColumn(80)
self.setEdgeColor(QtGui.QColor("#FF0000"))
## Editing line color
self.setCaretLineVisible(True)
self.setCaretLineBackgroundColor(QtGui.QColor("#CDA869"))
def show_line_number_cb(self, val):
if (val):
width = self.fm.width( "00000" ) + 5
else:
width = 0
self.setMarginWidth(0, width)
self.setMarginLineNumbers(0, val)
def show_folds_cb(self, val):
if val:
#self.setMarginsForegroundColor( QtGui.QColor("#404040") )
#self.setMarginsBackgroundColor( QtGui.QColor("#888888") )
## Folding visual : we will use circled tree fold
self.setFolding(QsciScintilla.CircledTreeFoldStyle)
else:
self.setFolding(QsciScintilla.NoFoldStyle)
self.clearFolds()
def toggle_folds_cb(self):
self.foldAll()
def codemark_add(self, line):
self.markerAdd(line, self.codemark_marker)
def codemark_del(self, line):
self.markerDelete(line, self.codemark_marker)
def goto_marker(self, is_next):
(eline, inx) = self.getCursorPosition()
if is_next:
val = self.markerFindNext(eline + 1, -1)
else:
val = self.markerFindPrevious(eline - 1, -1)
if val >= 0:
self.setCursorPosition(val, 0)
def set_font(self, font):
if not font:
return
if not self.font:
self.font = QtGui.QFont()
self.font.fromString(font)
# the font metrics here will help
# building the margin width later
self.fm = QtGui.QFontMetrics(self.font)
## set the default font of the editor
## and take the same font for line numbers
self.setFont(self.font)
self.setMarginsFont(self.font)
self.lexer.setFont(self.font,-1)
self.setLexer(self.lexer)
def open_file(self, filename):
self.filename = filename
## Choose a lexer
if not self.lexer:
if (re.search('\.(py|pyx|pxd|pxi|scons)$', filename) != None):
self.lexer = QsciLexerPython()
else:
self.lexer = QsciLexerCPP()
## Braces matching
self.setBraceMatching(QsciScintilla.SloppyBraceMatch)
## Render on screen
self.show()
## Show this file in the editor
self.setText(open(filename).read())
## Mark read-only
self.setReadOnly(True)
self.show()
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
#self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setFocus()
def goto_line(self, line):
line = line - 1
self.setCursorPosition(line, 0)
self.ensureLineVisible(line)
self.setFocus()
def contextMenuEvent(self, ev):
f = EditorView.ev_popup.font()
EditorView.ev_popup.setFont(QFont("San Serif", 8))
EditorView.ev_popup.exec_(QCursor.pos())
EditorView.ev_popup.setFont(f)
class EditorPage(QSplitter):
def __init__(self, parent=None):
QSplitter.__init__(self)
self.fcv = FileContextView(self)
self.ev = self.new_editor_view()
self.addWidget(self.fcv)
self.addWidget(self.ev)
self.setSizes([1, 300])
self.ev.cursorPositionChanged.connect(self.fcv.sig_ed_cursor_changed)
self.fcv.sig_goto_line.connect(self.ev.goto_line)
def new_editor_view(self):
return EditorView(self)
def open_file(self, filename):
self.ev.open_file(filename);
self.fcv.run(filename);
def get_filename(self):
return self.ev.get_filename()
class EditorBook(QTabWidget):
sig_file_closed = pyqtSignal(str)
sig_history_update = pyqtSignal(str, int)
sig_tab_changed = pyqtSignal(str)
sig_open_dir_view = pyqtSignal(str)
def __init__(self, *args):
apply(QTabWidget.__init__,(self, ) + args)
self.setMovable(True)
self.setTabsClosable(True)
self.tabCloseRequested.connect(self.removeTab)
self.currentChanged.connect(self.tab_change_cb)
self.is_show_line = False
self.is_show_folds = False
self.f_text = None
self.ev_font = "Monospace,10,-1,5,50,0,0,0,0,0"
def new_editor_page(self):
return EditorPage()
def addFile(self, fileName):
ed = self.new_editor_page()
ed.open_file(fileName)
ed.ev.set_font(self.ev_font)
ed.ev.show_line_number_cb(self.is_show_line)
ed.ev.show_folds_cb(self.is_show_folds)
self.addTab(ed, os.path.basename(fileName))
return ed
def search_already_opened_files(self, filename):
for i in range(self.count()):
page = self.widget(i)
if (page.get_filename() == filename):
return page
return None
def removeTab(self, inx):
ed = self.widget(inx)
f = ed.ev.get_filename()
QTabWidget.removeTab(self, inx)
self.sig_file_closed.emit(f)
def clear(self):
while self.count() != 0:
self.removeTab(0)
def remove_tab_list(self, inx_list):
for inx in sorted(inx_list, reverse=True):
self.removeTab(inx)
def tab_list(self, inx, type):
inx_list = []
if type == 'all' or type == 'files':
return range(self.count())
if type == 'left':
return range(inx)
if type == 'right':
return range(inx + 1, self.count())
if type == 'other':
return self.tab_list(inx, 'left') + self.tab_list(inx, 'right')
assert 0
def close_list_common(self, type):
inx_list = self.tab_list(self.currentIndex(), type)
if len(inx_list) == 0:
return
if not DialogManager.show_yes_no('Close all %s ?' % type):
return
self.remove_tab_list(inx_list)
def close_all_left_cb(self):
self.close_list_common('left')
def close_all_right_cb(self):
self.close_list_common('right')
def close_all_other_cb(self):
self.close_list_common('other')
def close_all_cb(self):
self.close_list_common('files')
def get_current_word(self):
ed = self.currentWidget()
if not ed:
return
if ed.ev.hasSelectedText():
return ed.ev.selectedText()
(line, index) = ed.ev.getCursorPosition()
text = ed.ev.text(line)
# Go left
linx = index
while linx > 0 and ed.ev.isWordCharacter(text[linx - 1]):
linx = linx - 1
# Go right
rinx = index
while rinx < len(text) and ed.ev.isWordCharacter(text[rinx]):
rinx = rinx + 1
text = text[linx:rinx]
if text == '':
return None
return text
def get_current_file_line(self):
ed = self.currentWidget()
if not ed:
return (None, None)
(line, inx) = ed.ev.getCursorPosition()
return (ed.ev.filename, line + 1)
def get_file_line_list(self):
fl_list = []
tlist = range(self.count())
inx = self.currentIndex()
if inx >= 0:
tlist.append(inx)
for inx in tlist:
ed = self.widget(inx)
(line, inx) = ed.ev.getCursorPosition()
fl_list.append('%s:%d' % (ed.ev.filename, line + 1))
return fl_list
def matching_brace_cb(self):
ed = self.currentWidget()
if ed:
ed.ev.moveToMatchingBrace()
#ed.ev.setFocus()
def goto_line_cb(self):
ed = self.currentWidget()
if not ed:
return (None, None)
(line, inx) = ed.ev.getCursorPosition()
#return (line + 1, ed.ev.lines())
line = DialogManager.show_goto_line_dialog(line + 1, ed.ev.lines())
if (line == None):
return
ed.ev.goto_line(line)
def focus_editor(self):
page = self.currentWidget()
if page:
page.ev.setFocus()
def close_current_page(self):
self.removeTab(self.currentIndex())
self.focus_editor()
def focus_search_ctags(self):
ed = self.currentWidget()
if ed:
ed.fcv.focus_search_ctags()
def copy_edit_cb(self):
ed = self.currentWidget()
if ed:
ed.ev.copy()
def tab_change_cb(self, inx):
if (inx == -1):
fname = ''
else:
page = self.currentWidget()
page.ev.setFocus()
fname = page.get_filename()
self.sig_tab_changed.emit(fname)
def open_dir_cb(self):
page = self.currentWidget()
if page:
fname = page.get_filename()
self.sig_open_dir_view.emit(fname)
def mousePressEvent(self, m_ev):
QTabWidget.mousePressEvent(self, m_ev)
if (m_ev.button() == Qt.RightButton):
# setup popup menu
self.pmenu = QMenu()
self.pmenu.addAction("Open dir", self.open_dir_cb)
self.pmenu.addSeparator()
self.pmenu.addAction("Close All &Left", self.close_all_left_cb)
self.pmenu.addAction("Close All &Right", self.close_all_right_cb)
self.pmenu.addAction("Close &Others", self.close_all_other_cb)
self.pmenu.addSeparator()
self.pmenu.addAction("Close &All", self.close_all_cb)
self.pmenu.exec_(QCursor.pos())
def show_file_line(self, filename, line, hist=True):
if line:
(f, l) = self.get_current_file_line()
if (f):
if hist:
self.sig_history_update.emit(f, l)
filename = str(filename)
if (not os.path.exists(filename)):
return
page = self.search_already_opened_files(filename)
if page == None:
page = self.addFile(filename)
self.setCurrentWidget(page)
if line:
page.ev.goto_line(line)
if hist:
self.sig_history_update.emit(filename, line)
page.ev.setFocus()
def show_file(self, filename):
self.show_file_line(filename, 0)
def show_line(self, line):
ed = self.currentWidget()
if not ed:
return
ed.ev.goto_line(line)
def find_cb(self):
ed = self.currentWidget()
if not ed:
return
res = DialogManager.show_find_dialog(self.get_current_word())
if (res == None):
return
(text, opt) = res
if (text == None):
return
self.f_text = text
self.f_opt = opt
self.find_text(opt['cursor'], opt['fw'])
def find_text(self, from_cursor, is_fw):
if (self.f_text == None):
return
ed = self.currentWidget()
if not ed:
return
text = self.f_text
opt = self.f_opt
if (from_cursor):
if (is_fw):
(line, inx) = (-1, -1)
else:
(line, inx) = ed.ev.getCursorPosition()
if (ed.ev.hasSelectedText()):
inx = inx - 1
if ed.ev.findFirst(text, opt['re'], opt['cs'], opt['wo'], False, is_fw, line, inx):
return True
if not DialogManager.show_yes_no('End of document reached. Continue from beginning?'):
return False
if (is_fw):
(line, inx) = (0, 0)
else:
(line, inx) = (ed.ev.lines(), 0)
if ed.ev.findFirst(text, opt['re'], opt['cs'], opt['wo'], False, is_fw, line, inx):
return
DialogManager.show_msg_dialog("Could not find " + "'" + text + "'")
def find_next_cb(self):
self.find_text(True, True)
def find_prev_cb(self):
self.find_text(True, False)
def change_ev_font(self, font):
if font == self.ev_font:
return
self.ev_font=font
for inx in range(self.count()):
ed = self.widget(inx)
ed.ev.set_font(self.ev_font)
def show_line_number_cb(self):
val = self.m_show_line_num.isChecked()
self.is_show_line = val
for inx in range(self.count()):
ed = self.widget(inx)
ed.ev.show_line_number_cb(val)
def show_line_number_pref(self, val):
if val == self.m_show_line_num.isChecked():
return
self.m_show_line_num.setChecked(val)
self.show_line_number_cb()
def show_folds_cb(self):
val = self.m_show_folds.isChecked()
self.is_show_folds = val
for inx in range(self.count()):
ed = self.widget(inx)
ed.ev.show_folds_cb(val)
def toggle_folds_cb(self):
ed = self.currentWidget()
if not ed:
return
if self.is_show_folds:
ed.ev.toggle_folds_cb()
def open_in_external_editor(self, cmd):
if not cmd:
DialogManager.show_msg_dialog('Please configure external editor')
return
(f, l) = self.get_current_file_line()
if not f:
return
cmd = cmd.replace('%F', f).replace('%L', str(l))
if not QProcess.startDetached(cmd):
DialogManager.show_msg_dialog('Failed to start: ' + cmd)
def codemark_add(self, filename, line):
ed = self.search_already_opened_files(filename)
if ed:
ed.ev.codemark_add(line)
def codemark_del(self, filename, line):
ed = self.search_already_opened_files(filename)
if ed:
ed.ev.codemark_del(line)
def bookmark_prev_cb(self):
ed = self.currentWidget()
if ed:
ed.ev.goto_marker(False)
def bookmark_next_cb(self):
ed = self.currentWidget()
if ed:
ed.ev.goto_marker(True)
seascope-0.7/src/view/ResView.py 0000664 0023763 0023763 00000017250 12062273150 015336 0 ustar anil anil #!/usr/bin/python
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import re
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import DialogManager
class ResultPageItem(QTreeWidgetItem):
def __init__(self, li):
QTreeWidgetItem.__init__(self, li)
def column_val(self, col):
try:
val = str(self.data(col, Qt.DisplayRole).toString())
except:
return None
return val
class ResultPage(QTreeWidget):
sig_show_file_line = pyqtSignal(str, int)
is_history_call = False
def __init__(self, parent):
QTreeWidget.__init__(self)
self.is_history = False
self.pbar = None
self.parent = parent
self.setColumnCount(4)
self.cmd_items = ['Tag', 'File', 'Line', 'Text']
self.setHeaderLabels(self.cmd_items)
self.setColumnWidth(0, 200)
self.setColumnWidth(1, 300)
self.setColumnWidth(2, 40)
# setup popup menu
self.pmenu = QMenu()
self.pmenu.addAction("&Filter", self.filter_cb)
self.pmenu.addAction("&Show All", self.show_all_cb)
self.pmenu.addSeparator()
self.pmenu.addAction("&Remove Item", self.remove_item_cb)
#self.setMinimumHeight(200)
#self.setMinimumWidth(600)
## set column width to fit contents
##self.resizeColumnsToContents()
##self.resizeRowsToContents()
## set row height
#nrows = len(result)
#for row in xrange(nrows):
#self.setRowHeight(row, 14)
#self.setTextElideMode(Qt.ElideLeft)
self.setIndentation(-2)
self.setAllColumnsShowFocus(True)
self.activated.connect(self.activated_cb)
def activated_cb(self, minx):
(filename, line) = self.get_file_line(minx)
if (not filename):
return
if (self.is_history):
ResultPage.is_history_call = True
self.sig_show_file_line.emit(filename, line)
ResultPage.is_history_call = False
def filter_cb(self):
filtered = False
cmd_sel = self.cmd_items[self.last_minx.column()]
res = DialogManager.show_filter_dialog(self.cmd_items,cmd_sel)
if res == None:
return
(filter_text, is_regex, is_negate, is_ignorecase, cmd_sel) = res
cmd_idx = self.cmd_items.index(cmd_sel)
if cmd_idx == -1:
return
for inx in range(self.topLevelItemCount()):
item = self.topLevelItem(inx)
text = item.column_val(cmd_idx)
if (text == None):
continue
matched = False
if (is_regex):
if (is_ignorecase):
if (re.search(filter_text, text, re.I) != None):
matched = True
else:
if (re.search(filter_text, text) != None):
matched = True
else:
if (is_ignorecase):
if (text.upper().find(filter_text.upper()) != -1):
matched = True
else:
if (text.find(filter_text) != -1):
matched = True
if (is_negate):
matched = not matched
if not matched:
self.setItemHidden(item, True)
filtered = True
if filtered:
self.mark_tab_filtered(True)
def mark_tab_filtered(self, mark):
tabIndex = self.parent.indexOf(self)
label = self.parent.tabText(tabIndex)
if mark and label[0] != "*":
self.parent.setTabText(tabIndex, "*" + label)
elif not mark and label[0] == "*":
self.parent.setTabText(tabIndex, label.remove(0,1))
def show_all_cb(self):
for inx in range(self.topLevelItemCount()):
item = self.topLevelItem(inx)
self.setItemHidden(item, False)
self.mark_tab_filtered(False)
def remove_item_cb(self):
self.setItemHidden(self.itemFromIndex(self.last_minx), True)
self.mark_tab_filtered(True)
def get_file_line(self, minx):
model = minx.model()
row = minx.row()
if (not model):
return (None, None)
filename = str(model.data(model.index(row, 1)).toString())
try:
line = model.data(model.index(row, 2)).toString()
line = int(line)
except:
line = 0
return (filename, line)
def add_result_continue(self):
self.add_result(self.name, self.res)
def add_result(self, name, res):
res_list = []
ret_val = True
root = self.invisibleRootItem()
count = 0
for line in res:
item = ResultPageItem(line)
#self.addTopLevelItem(item)
if (self.is_history):
root.insertChild(0, item)
else:
root.addChild(item)
count = count + 1
if (count == 1000):
self.name = name
self.res = res[count:]
QTimer.singleShot(100, self.add_result_continue)
return
self.remove_progress_bar()
if (self.topLevelItemCount() < 5000):
self.resizeColumnToContents(0)
self.resizeColumnToContents(1)
self.resizeColumnToContents(2)
self.resizeColumnToContents(3)
if (self.topLevelItemCount() == 1):
item = self.topLevelItem(0)
item.setSelected(True)
minx = self.indexFromItem(item)
self.activated_cb(minx)
return ret_val
def mousePressEvent(self, m_ev):
QTreeWidget.mousePressEvent(self, m_ev)
if (m_ev.button() == Qt.RightButton):
self.last_minx = self.indexAt(m_ev.pos())
self.pmenu.exec_(QCursor.pos())
def show_progress_bar(self):
self.pbar = QProgressBar(self)
self.pbar.setMinimum(0)
self.pbar.setMaximum(0)
self.pbar.show()
def remove_progress_bar(self):
if (self.pbar):
self.pbar.setParent(None)
self.pbar = None
class ResultManager(QTabWidget):
book = None
sig_show_file_line = pyqtSignal(str, int)
def __init__(self, *args):
apply(QTabWidget.__init__,(self, ) + args)
self.setMovable(True)
self.setTabsClosable(True)
self.tabCloseRequested.connect(self.close_cb)
self.h_page = None
self.setFont(QFont("San Serif", 8))
ResultManager.book = self
def go_next_res_common(self, page, inc):
if page == None:
return
if (inc == 1):
minx = page.moveCursor(QAbstractItemView.MoveDown, Qt.NoModifier)
else:
minx = page.moveCursor(QAbstractItemView.MoveUp, Qt.NoModifier)
page.setCurrentItem(page.itemFromIndex(minx))
page.activated.emit(minx)
def go_next_res(self, inc):
self.go_next_res_common(self.currentWidget(), inc)
def go_next_history(self, inc):
self.go_next_res_common(self.h_page, -inc)
def show_history(self):
if (self.h_page):
self.setCurrentWidget(self.h_page)
def new_cb(self):
print "new_cb"
def refresh_cb(self):
print "refresh_cb"
def close_cb(self, inx):
if (self.widget(inx) == self.h_page):
self.h_page = None
self.removeTab(inx)
def close_all_cb(self):
if DialogManager.show_yes_no("Close all query results ?"):
self.clear()
self.h_page = None
def mousePressEvent(self, m_ev):
QTabWidget.mousePressEvent(self, m_ev)
if (m_ev.button() == Qt.RightButton):
# setup popup menu
self.pmenu = QMenu()
#self.pmenu.addAction("&New", self.new_cb)
#self.pmenu.addAction("&Refresh", self.refresh_cb)
#self.pmenu.addSeparator()
self.pmenu.addAction("Close &All", self.close_all_cb)
self.pmenu.exec_(QCursor.pos())
def history_create(self):
self.h_page = ResultManager.create_result_page(self, None)
assert self.h_page.is_history
self.h_page.hideColumn(0)
self.h_page.hideColumn(3)
def history_update(self, filename, line):
if (ResultPage.is_history_call):
return
if (self.h_page == None):
self.history_create()
for idx in range(self.h_page.indexOfTopLevelItem(self.h_page.currentItem())):
self.h_page.invisibleRootItem().removeChild(self.h_page.topLevelItem(0))
if self.h_page.topLevelItemCount():
item = self.h_page.topLevelItem(0)
minx = self.h_page.indexFromItem(item)
(f, l) = self.h_page.get_file_line(minx)
if (filename and f == filename and l == line):
return
self.h_page.add_result('History', [['', filename, str(line), '']])
if self.h_page.topLevelItemCount():
self.h_page.setCurrentItem(self.h_page.topLevelItem(0))
def create_result_page(self, name):
page = ResultPage(self)
if not name:
name = 'History'
page.is_history = True
self.addTab(page, name)
if not page.is_history:
self.setCurrentWidget(page)
page.sig_show_file_line.connect(self.sig_show_file_line)
page.show_progress_bar()
return page
def create_result_page_single(self):
return ResultPage(self)
seascope-0.7/src/view/filecontext/ 0000775 0023763 0023763 00000000000 12062273150 015717 5 ustar anil anil seascope-0.7/src/view/filecontext/plugins/ 0000775 0023763 0023763 00000000000 12062273150 017400 5 ustar anil anil seascope-0.7/src/view/filecontext/plugins/ctags_view/ 0000775 0023763 0023763 00000000000 12062273150 021533 5 ustar anil anil seascope-0.7/src/view/filecontext/plugins/ctags_view/__init__.py 0000664 0023763 0023763 00000000416 12062273150 023645 0 ustar anil anil # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os
def name():
return 'ctags'
def run_plugin(filename, parent):
import CtagsView
CtagsView.run(filename, parent)
def description():
d = 'ctags description'
return d
priority = 500
seascope-0.7/src/view/filecontext/plugins/ctags_view/CtagsManager.py 0000664 0023763 0023763 00000010264 12062273150 024444 0 ustar anil anil # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import subprocess
import re
def _eintr_retry_call(func, *args):
while True:
try:
return func(*args)
except OSError, e:
if e.errno == errno.EINTR:
continue
raise
def ct_query(filename):
cmd = 'ctags -n -u --fields=+K -f -'
args = cmd.split()
args.append(filename)
try:
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
(out_data, err_data) = _eintr_retry_call(proc.communicate)
out_data = out_data.split('\n')
except Exception as e:
out_data = [
'Failed to run ctags cmd\tignore\t0;\t ',
'cmd: %s\tignore\t0;\t ' % ' '.join(args),
'error: %s\tignore\t0;\t ' % str(e),
'ctags not installed ?\tignore\t0;\t ',
]
res = []
for line in out_data:
if (line == ''):
break
line = line.split('\t')
num = line[2].split(';', 1)[0]
line = [line[0], num, line[3]]
res.append(line)
return res
is_OrderedDict_available = False
try:
# OrderedDict available only in python >= 2.7
from collections import OrderedDict
is_OrderedDict_available = True
except:
pass
def emptyOrderedDict():
if is_OrderedDict_available:
return OrderedDict({})
return {}
class CtagsTreeBuilder:
def __init__(self):
self.symTree = emptyOrderedDict()
def runCtags(self, f):
#args = 'ctags -n -u --fields=+K -f - --extra=+q'
#args = 'ctags -n -u --fields=+Ki -f -'
args = 'ctags -n -u --fields=+K-f-t -f -'
args = args.split()
args.append(f)
# In python >= 2.7 can use subprocess.check_output
# output = subprocess.check_output(args)
# return output
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
(out_data, err_data) = proc.communicate()
return out_data
def parseCtagsOutput(self, data):
data = re.split('\r?\n', data)
res = []
for line in data:
if line == '':
continue
line = line.split('\t', 4)
res.append(line)
return res
def addToSymLayout(self, sc):
t = self.symTree
if sc and sc != '':
for s in re.split('::|\.', sc):
if s not in t:
t[s] = emptyOrderedDict()
t = t[s]
def addToSymTree(self, sc, line):
t = self.symTree
if sc and sc != '':
for s in re.split('::|\.', sc):
assert s in t
t = t[s]
cline = [line[0], line[2].split(';')[0], line[3]]
if line[0] in t:
#print line[0], 'in', t
x = t[line[0]]
if '+' not in x:
x['+'] = cline
return
if '*' not in t:
t['*'] = []
t['*'].append(cline)
#print '...', t, line
def buildTree(self, data):
type_list = [ 'namespace', 'class', 'interface', 'struct', 'union', 'enum', 'function' ]
# build layout using 5th field
for line in data:
if len(line) == 4:
continue
sd = dict([ x.split(':', 1) for x in line[4].split('\t')])
line[4] = sd
count = 0
for t in type_list:
if t in sd:
self.addToSymLayout(sd[t])
count = count + 1
if count != 1:
print '******** count == 1 *********'
print data
print line
#assert count == 1
if len(self.symTree) == 0:
return (data, False)
for line in data:
if len(line) == 4:
self.addToSymTree(None, line)
continue
sd = line[4]
count = 0
for t in type_list:
if t in sd:
self.addToSymTree(sd[t], line)
count = count + 1
if count != 1:
print '******** count == 1 *********'
print data
print line
#assert count == 1
return (self.symTree, True)
def doQuery(self, filename):
output = self.runCtags(filename)
output = self.parseCtagsOutput(output)
output = self.buildTree(output)
return output
def ct_tree_query(filename):
ct = CtagsTreeBuilder()
output = ct.doQuery(filename)
return output
if __name__ == '__main__':
import optparse
import sys
depth = 0
def recursePrint(t):
global depth
for k, v in t.items():
if k == '*':
for line in v:
print '%s%s' % (' ' * depth, line)
continue
if k == '+':
continue
if '+' in v:
k = v['+']
print '%s%s' % (' ' * depth, k)
depth = depth + 4
recursePrint(v)
depth = depth - 4
op = optparse.OptionParser()
(options, args) = op.parse_args()
if len(args) != 1:
print 'Please specify a file'
sys.exit(-1)
(output, isTree) = ct_tree_query(args[0])
if isTree:
recursePrint(output)
else:
for line in output:
print line
seascope-0.7/src/view/filecontext/plugins/ctags_view/CtagsView.py 0000664 0023763 0023763 00000013776 12062273150 024017 0 ustar anil anil #!/usr/bin/python
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import CtagsManager
# Search Result
class SR:
NONE = 0
LSKIP = 1
LUPD = 2
MATCH = 3
RUPD = 4
RSKIP = 5
def __init__(self, k):
self.line = k
self.left = 0
self.right = 1000000
self.item = None
self.done = False
class CtagsListItem(QTreeWidgetItem):
def __init__(self, li):
QTreeWidgetItem.__init__(self, li)
if li[2] in [ 'class', 'interface', 'struct', 'type', 'enum', '' ]:
self.set_bold()
def set_bold(self):
f = self.font(0)
f.setBold(True)
self.setFont(0, f)
def column_val(self, col):
return str(self.data(col, Qt.DisplayRole).toString())
def line_val(self):
return (int(self.column_val(1)))
class CtagsList(QTreeWidget):
def __init__(self, parent=None, isTree=False):
QTreeWidget.__init__(self)
self.setColumnCount(3)
self.setHeaderLabels(['Name', 'Line', 'Type'])
#self.setMinimumHeight(200)
self.setMinimumWidth(50)
self.setFont(QFont("San Serif", 8))
if isTree:
self.setIndentation(12)
self.setExpandsOnDoubleClick(False)
#self.setAnimated(True)
else:
self.setIndentation(-2)
self.setAllColumnsShowFocus(True)
def add_ct_result(self, res):
for line in res:
item = CtagsListItem(line)
self.addTopLevelItem(item)
#self.sortItems(1, Qt.AscendingOrder)
#self.resizeColumnsToContents(1)
self.resizeColumnToContents(0)
self.resizeColumnToContents(1)
self.resizeColumnToContents(2)
def recurseTreeAdd(self, t, p):
for k, v in t.items():
if k == '+':
continue
if k == '*':
for line in v:
item = CtagsListItem(line)
p.addChild(item)
continue
if '+' in v:
item = CtagsListItem(v['+'])
else:
item = CtagsListItem([k, '', '', ''])
p.addChild(item)
self.recurseTreeAdd(v, item)
self.setItemExpanded(p, True)
def add_ctree_result(self, res):
p = self.invisibleRootItem()
self.recurseTreeAdd(res, p)
#self.sortItems(1, Qt.AscendingOrder)
#self.resizeColumnsToContents(1)
self.resizeColumnToContents(0)
self.resizeColumnToContents(1)
self.resizeColumnToContents(2)
def ed_cursor_changed(self, line, pos):
line = line + 1
item = self.currentItem()
if not item:
item = self.topLevelItem(0)
if not item:
return
if (item.line_val() == line):
pass
elif (item.line_val() < line):
while True:
next_item = self.itemBelow(item)
if not next_item:
break
if (next_item.line_val() > line):
break
item = next_item
else:
while True:
prev_item = self.itemAbove(item)
if not prev_item:
break
item = prev_item
if (item.line_val() <= line):
break
self.setCurrentItem(item)
def search_item_check(self, item, sr):
try:
val = item.line_val()
except:
return SR.NONE
if val < sr.left:
return SR.LSKIP
if val < sr.line:
sr.left = val
sr.item = item
return SR.LUPD
if val == sr.line:
sr.left = val
sr.item = item
sr.done = True
return SR.MATCH
if val < sr.right:
sr.right = val
if not sr.item:
sr.item = item
return SR.RUPD
return SR.RSKIP
def search_recursive(self, p, sr):
inx = 0;
r = SR.NONE
while inx < p.childCount():
item = p.child(inx)
if not item.childCount():
break
inx += 1
if r < SR.MATCH:
r = self.search_item_check(item, sr)
if r == SR.MATCH:
return
self.search_recursive(item, sr)
if sr.done:
return
if not inx < p.childCount():
return
last_item = p.child(p.childCount() - 1)
r = self.search_item_check(last_item, sr)
if r <= sr.MATCH:
return
r = SR.NONE
while inx < p.childCount():
item = p.child(inx)
inx += 1
r = self.search_item_check(item, sr)
if r >= SR.MATCH:
return
def search_tree(self, line, pos):
line = line + 1
sr = SR(line)
p = self.invisibleRootItem()
self.search_recursive(p, sr)
self.setCurrentItem(sr.item)
class CtagsListPage(QWidget):
sig_goto_line = pyqtSignal(int)
def __init__(self, parent=None):
QWidget.__init__(self)
self.le = QLineEdit()
self.ct = CtagsList(self)
vlay = QVBoxLayout()
vlay.addWidget(self.le)
vlay.addWidget(self.ct)
self.setLayout(vlay)
self.le.textChanged.connect(self.le_textChanged)
self.le.returnPressed.connect(self.le_returnPressed)
self.ct.itemActivated.connect(self.ct_itemActivated)
def le_textChanged(self, text):
#if (len(str(text)) == 1):
#self.ct.keyboardSearch('')
self.ct.keyboardSearch('')
self.ct.keyboardSearch(text)
def le_returnPressed(self):
items = self.ct.selectedItems()
if len(items) == 0:
return
self.ct.itemActivated.emit(items[0], 0)
def ct_itemActivated(self, item):
try:
line = int(str(item.data(1, Qt.DisplayRole).toString()))
except:
return
self.sig_goto_line.emit(line)
self.le.clear()
def keyPressEvent(self, ev):
if ev.key() in [Qt.Key_Up, Qt.Key_Down, Qt.Key_PageUp or Qt.Key_PageDown]:
self.ct.keyPressEvent(ev)
return
@staticmethod
def do_ct_query(filename, parent):
page = CtagsListPage(parent)
res = CtagsManager.ct_query(filename)
page.ct.add_ct_result(res)
parent.add_page(page, 'C')
parent.sig_ed_cursor_changed.connect(page.ct.ed_cursor_changed)
class CtagsTreePage(QWidget):
sig_goto_line = pyqtSignal(int)
def __init__(self, parent=None):
QWidget.__init__(self)
self.ct = CtagsList(self, isTree=True)
vlay = QVBoxLayout()
vlay.addWidget(self.ct)
self.setLayout(vlay)
self.ct.itemActivated.connect(self.ct_itemActivated)
def ct_itemActivated(self, item):
try:
line = int(str(item.data(1, Qt.DisplayRole).toString()))
except:
return
self.sig_goto_line.emit(line)
@staticmethod
def do_ct_query(filename, parent):
(res, isTree) = CtagsManager.ct_tree_query(filename)
if not isTree:
return
page = CtagsTreePage(parent)
page.ct.add_ctree_result(res)
parent.add_page(page, 'T')
parent.sig_ed_cursor_changed.connect(page.ct.search_tree)
def run(filename, parent):
CtagsListPage.do_ct_query(filename, parent)
CtagsTreePage.do_ct_query(filename, parent)
seascope-0.7/src/view/filecontext/plugins/__init__.py 0000664 0023763 0023763 00000000112 12062273150 021503 0 ustar anil anil # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
seascope-0.7/src/view/filecontext/plugins/generic_view/ 0000775 0023763 0023763 00000000000 12062273150 022046 5 ustar anil anil seascope-0.7/src/view/filecontext/plugins/generic_view/GenericView.py 0000664 0023763 0023763 00000004423 12062273150 024632 0 ustar anil anil #!/usr/bin/python
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class GenericResItem(QTreeWidgetItem):
def __init__(self, li):
QTreeWidgetItem.__init__(self, li)
def column_val(self, col):
return str(self.data(col, Qt.DisplayRole).toString())
def line_val(self):
return (int(self.column_val(1)))
class GenericRes(QTreeWidget):
def __init__(self, parent=None):
QTreeWidget.__init__(self)
self.setColumnCount(1)
self.setHeaderLabels(['Result'])
#self.setMinimumHeight(200)
self.setMinimumWidth(50)
self.setFont(QFont("San Serif", 8))
self.setIndentation(-2)
self.setAllColumnsShowFocus(True)
def add_result(self, res):
for line in res:
item = GenericResItem([line])
self.addTopLevelItem(item)
class GenericFileCmdPage(QWidget):
sig_goto_line = pyqtSignal(int)
def __init__(self, parent=None):
QWidget.__init__(self)
self.ct = GenericRes(self)
vlay = QVBoxLayout()
#self.lbl = QLabel()
#vlay.addWidget(self.lbl)
vlay.addWidget(self.ct)
self.setLayout(vlay)
self.ct.itemActivated.connect(self.ct_itemActivated)
def ct_itemActivated(self, item):
try:
line = int(str(item.data(1, Qt.DisplayRole).toString()))
except:
return
self.sig_goto_line.emit(line)
@staticmethod
def run_plugin(cmd, filename, parent):
if '%f' in cmd:
args = cmd.replace('%f', filename)
args = args.strip().split()
else:
args = cmd.strip().split()
args.append(filename)
import subprocess
try:
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
(res, err_data) = proc.communicate()
except Exception as e:
res = '%s\n%s' % (' '.join(args), str(e))
import re
res = [ x.strip() for x in re.split('\r?\n', res.strip()) ]
page = GenericFileCmdPage(parent)
page.cmd = cmd
#page.lbl.setText(' '.join(args))
page.ct.add_result(res)
parent.add_page(page, cmd)
def cmd_name():
cmd_list = [
#'stat',
#'ls %f',
#'ls %f %f'
]
import os
cmd = os.getenv('SEASCOPE_FC_CUSTOM_CMD')
if cmd:
cmd_list += [ x.strip() for x in cmd.split(';') ]
return list(set(cmd_list))
def run(filename, parent, cmd=None):
if cmd:
cmd_list = [ cmd ]
else:
cmd_list = cmd_name()
for cmd in cmd_list:
GenericFileCmdPage.run_plugin(cmd, filename, parent)
seascope-0.7/src/view/filecontext/plugins/generic_view/__init__.py 0000664 0023763 0023763 00000000565 12062273150 024165 0 ustar anil anil # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os
def name():
return 'generic_cmd'
def run_plugin(filename, parent, cmd=None):
import GenericView
GenericView.run(filename, parent, cmd=cmd)
def description():
d = 'generic cmd description'
return d
def cmd_name():
import GenericView
return GenericView.cmd_name()
priority = 100
seascope-0.7/src/view/filecontext/__init__.py 0000664 0023763 0023763 00000002127 12062273150 020032 0 ustar anil anil # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import re, os
from PyQt4 import QtGui, QtCore, uic
from PyQt4.QtGui import *
from PyQt4.QtCore import *
#import DialogManager
#from plugins import PluginHelper
fc_plugins = []
fc_dict = {}
def _load_plugins(module, directory):
pluginImports = __import__(module, globals(), locals())
print 'Scanning for view plugins...'
plist = []
pdict = {}
for i in sorted(os.listdir(directory)):
path = os.path.join( directory, i, '__init__.py' )
if os.path.isfile( path ):
p = __import__( '%s.%s' % (module, i), globals(), locals(), ['*'] )
plist.append(p)
pdict[p.name()] = p
if not hasattr(p, 'priority'):
p.priority = 0
plist = sorted(plist, key=lambda p: p.priority, reverse=True)
for p in plist:
print '\t', p.name()
return (plist, pdict)
def load_plugins():
global fc_plugins, fc_dict
(fc_plugins, fc_dict) = _load_plugins('view.filecontext.plugins', 'view/filecontext/plugins')
def run_plugins(filename, parent):
for p in fc_plugins:
if not hasattr(p, 'cmd_name'):
p.run_plugin(filename, parent)
seascope-0.7/src/view/CodemarkView.py 0000664 0023763 0023763 00000005005 12062273150 016325 0 ustar anil anil #!/usr/bin/env python
# Copyright (c) 2012 Anthony Liu
# All rights reserved.
#
# License: BSD
import sys
from array import *
class CodemarkManager():
def __init__(self, parent=None):
self.haystack = []
def check(self, filename, line):
if self.haystack.count((filename, line)):
return 1
return 0
def append(self, filename, line):
if self.check(filename, line) == 0:
self.haystack.append((filename, line))
return self.haystack.index((filename, line))
def delete(self, filename, line):
if self.haystack.count((filename, line)) == 0:
return -1
else:
self.haystack.remove((filename, line))
return 0
def delete_index(self, index):
if self.count() <= index:
return -1
elif index < 0:
return -1
else:
self.haystack.pop(index)
return 0
def count(self):
return len(self.haystack)
def get(self, index):
if self.count() <= index:
return (None, None)
elif index < 0:
return (None, None)
else:
(filename, line) = self.haystack.pop(index)
self.haystack.insert(index, (filename, line))
return (filename, line)
def clear(self):
del self.haystack[:]
def codemarks(self):
return self.haystack
def dump(self):
for i in range(len(self.haystack)):
print >> sys.stderr, "cm index ", i, " ", self.haystack[i]
#############################################################################
#
# Basic unit test
#
#############################################################################
if __name__ == '__main__':
cm = CodemarkManager()
#
# case 1, basic add, delete
#
print >> sys.stderr, "Initial empty"
print >> sys.stderr, "cm has ", cm.count(), "items (0)"
cm.append("file1", 100)
cm.append("file2", 200)
cm.append("file3", 300)
print >> sys.stderr, "cm has " , cm.count(), "items (3) "
cm.delete("file1", 100)
print >> sys.stderr, "cm has " , cm.count(), "items (2)"
cm.delete("file2", 100) # not existed
print >> sys.stderr, "cm has " , cm.count(), "items (2)"
cm.delete_index(1)
print >> sys.stderr, "cm has " , cm.count(), "items (1)"
#
# case 2, dump
#
for i in range(cm.count()):
(f, l) = cm.get(i)
print >> sys.stderr, f, " (#", l, ")"
#
# case 3, duplicate
#
index = cm.append("file4", 400)
print >> sys.stderr, "index for file4 #400 is " , index
index = cm.append("file4", 400)
print >> sys.stderr, "index for file4 #400 is " , index, " (again)"
print >> sys.stderr, "cm has " , cm.count(), "items (2) "
#
# case 4, dump for eye examine
#
print >> sys.stderr, "cm dump for final check"
cm.dump()
seascope-0.7/src/view/FileView.py 0000664 0023763 0023763 00000016003 12062273150 015457 0 ustar anil anil #!/usr/bin/python
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os
from PyQt4.QtGui import *
from PyQt4.QtCore import *
dir_prefix = None
class DirTab(QWidget):
sig_show_file = pyqtSignal(str)
def __init__(self, parent=None):
QWidget.__init__(self)
self.is_ft = False
# Tree view
self.tmodel = QFileSystemModel()
self.tmodel.setRootPath(QDir.rootPath())
self.tview = QTreeView()
self.tview.setHeaderHidden(True)
self.ted = QLineEdit()
self.completer = QCompleter()
self.completer.setCompletionMode(QCompleter.PopupCompletion)
self.ted.setToolTip("Current folder")
self.ted.setCompleter(self.completer)
self.tdbtn = QPushButton()
self.tdbtn.setIcon(QApplication.style().standardIcon(QStyle.SP_DirIcon))
self.tdbtn.setToolTip("Open folder for browsing")
self.trbtn = QPushButton()
self.trbtn.setIcon(QApplication.style().standardIcon(QStyle.SP_BrowserReload))
self.trbtn.setToolTip("Reset to common top-level folder of file in list")
self.completer.setModel(self.tmodel)
self.tview.setModel(self.tmodel)
thlay = QHBoxLayout()
thlay.addWidget(self.ted)
thlay.addWidget(self.tdbtn)
thlay.addWidget(self.trbtn)
tvlay = QVBoxLayout()
tvlay.addLayout(thlay)
tvlay.addWidget(self.tview)
self.setLayout(tvlay)
self.tview.activated.connect(self.tview_itemActivated)
self.tdbtn.clicked.connect(self.change_btn_cb)
self.ted.editingFinished.connect(self.ted_editingFinished)
self.trbtn.clicked.connect(self.reset_btn_cb)
self.hide_view_columns(self.tview)
def hide_view_columns(self, view):
header = view.header()
for col in range(header.count()):
if col > 0:
view.setColumnHidden(col, True)
def tview_itemActivated(self):
list = self.tview.selectionModel().selectedIndexes()
for item in list:
if self.tmodel.fileInfo(item).isFile():
self.sig_show_file.emit(self.tmodel.fileInfo(item).absoluteFilePath())
def set_tab_name(self, dirstr):
# Set tab name
inx = self.parent.indexOf(self)
try:
if dirstr != dir_prefix:
name = os.path.split(dirstr)[1]
else:
name = ''
self.parent.setTabText(inx, name)
except:
pass
def dir_reset(self, dirstr):
self.set_tab_name(dirstr)
self.tview.setRootIndex(self.tmodel.index(dirstr))
self.ted.setText(dirstr)
def ted_editingFinished(self):
path = str(self.ted.text())
if not os.path.isdir(path):
path = os.path.dirname(path)
if os.path.isdir(path):
self.dir_reset(path)
else:
self.dir_reset(dir_prefix)
def change_btn_cb(self):
fdlg = QFileDialog(None, "Choose directory to browse")
fdlg.setFileMode(QFileDialog.Directory)
fdlg.setOptions(QFileDialog.ShowDirsOnly) # and QFileDialog.HideNameFilterDetails)
fdlg.setDirectory(self.ted.text())
if (fdlg.exec_()):
browse_dir = fdlg.selectedFiles()[0]
self.dir_reset(str(browse_dir))
def reset_btn_cb(self):
self.dir_reset(dir_prefix)
def resizeEvent(self, event):
self.tdbtn.setMaximumHeight(self.ted.height())
self.trbtn.setMaximumHeight(self.ted.height())
class FileTab(QWidget):
sig_show_file = pyqtSignal(str)
def __init__(self, parent=None):
QWidget.__init__(self)
self.is_ft = True
# List view
self.le = QLineEdit()
self.lview = QTreeWidget(self)
self.lview.setColumnCount(2)
self.lview.setHeaderLabels(['File', 'Path'])
self.lview.setFont(QFont("San Serif", 8))
self.lview.setIndentation(-2)
self.lview.setAllColumnsShowFocus(True)
lvlay = QVBoxLayout()
lvlay.addWidget(self.le)
lvlay.addWidget(self.lview)
self.setLayout(lvlay)
self.le.textChanged.connect(self.le_textChanged)
self.le.returnPressed.connect(self.le_returnPressed)
self.lview.itemActivated.connect(self.lview_itemActivated)
global dir_prefix
dir_prefix = QDir.rootPath()
def le_textChanged(self, text):
if (text == ''):
return
self.lview.keyboardSearch('')
self.lview.keyboardSearch(text)
def le_returnPressed(self):
self.le.clear()
items = self.lview.selectedItems()
if len(items) == 0:
return
self.lview.itemActivated.emit(items[0], 0)
def lview_itemActivated(self, item):
filename = str(item.data(1, Qt.DisplayRole).toString())
if self.is_rel_path:
filename = filename.replace("...", dir_prefix, 1)
self.sig_show_file.emit(filename)
def keyPressEvent(self, ev):
if ev.key() in [Qt.Key_Up, Qt.Key_Down, Qt.Key_PageUp or Qt.Key_PageDown]:
self.lview.keyPressEvent(ev)
return
def search_file_cb(self):
self.le.setFocus()
self.le.selectAll()
def clear(self):
global dir_prefix
dir_prefix = QDir.rootPath()
self.is_rel_path = False
self.le.clear()
self.lview.clear()
def add_files(self, flist):
global dir_prefix
self.clear()
dir_prefix = os.path.dirname(os.path.commonprefix(flist))
if len(dir_prefix) > 16:
self.is_rel_path = True
for f in flist:
if self.is_rel_path:
f = f.replace(dir_prefix, "...", 1)
item = QTreeWidgetItem([os.path.basename(f), f])
self.lview.addTopLevelItem(item)
#if (self.lview.topLevelItemCount() > 0):
#self.lview.resizeColumnToContents(0)
#self.lview.resizeColumnToContents(1)
self.lview.sortByColumn(0, Qt.AscendingOrder)
class FileTree(QTabWidget):
sig_show_file = pyqtSignal(str)
def __init__(self, parent=None):
QTabWidget.__init__(self)
self.setMovable(True)
t = FileTab()
icon = QApplication.style().standardIcon(QStyle.SP_FileDialogDetailedView)
self.addTab(t, icon, '')
self.ft = t
self.dlist = []
self.new_dir_tab_cb()
self.clear()
# setup popup menu
self.pmenu = QMenu()
self.pmenu.addAction("&New Dir View", self.new_dir_tab_cb)
self.pmenu.addAction("&Close Active Dir View", self.close_active_dir_tab_cb)
self.pmenu.addAction("&Close All Dir View", self.close_all_dir_tab_cb)
def new_dir_tab_cb(self, d=None):
t = DirTab()
t.parent = self
self.dlist.append(t)
icon = QApplication.style().standardIcon(QStyle.SP_DirClosedIcon)
self.addTab(t, icon, '')
if d:
t.dir_reset(d)
else:
t.reset_btn_cb()
def close_all_dir_tab_cb(self):
for t in self.dlist:
inx = self.indexOf(t)
self.removeTab(inx)
self.dlist = []
# Always have atleast one dir view
self.new_dir_tab_cb()
def open_dir_view(self, filename):
d = os.path.dirname(str(filename))
self.new_dir_tab_cb(d)
def close_active_dir_tab_cb(self):
inx = self.currentIndex()
if inx < 0:
return
t = self.widget(inx)
if t.is_ft:
return
if self.count() <= 2:
self.close_all_dir_tab_cb()
return
self.dlist.remove(t)
self.removeTab(inx)
def addTab(self, t, icon, x):
t.sig_show_file.connect(self.sig_show_file)
QTabWidget.addTab(self, t, icon, x)
if self.count() > 2:
inx = self.indexOf(t)
else:
inx = 0
self.setCurrentIndex(inx)
def mousePressEvent(self, m_ev):
QTabWidget.mousePressEvent(self, m_ev)
if (m_ev.button() == Qt.RightButton):
self.pmenu.exec_(QCursor.pos())
def search_file_cb(self):
self.ft.search_file_cb()
self.setCurrentWidget(self.ft)
def clear(self):
self.ft.clear()
self.close_all_dir_tab_cb()
def add_files(self, flist):
self.ft.add_files(flist)
for t in self.dlist:
t.reset_btn_cb()
seascope-0.7/src/view/__init__.py 0000664 0023763 0023763 00000000330 12062273150 015500 0 ustar anil anil # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
__all__ = ["CallView", "ClassGraphView", "EdView", "FileView", "ResView"]
def load_plugins():
import filecontext
filecontext.load_plugins() seascope-0.7/src/view/ClassGraphView.py 0000664 0023763 0023763 00000013602 12062273150 016631 0 ustar anil anil #!/usr/bin/python
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtSvg import *
import os
import sys
if __name__ == '__main__':
import sys
import os
app_dir = os.path.dirname(os.path.realpath(__file__))
os.chdir(app_dir)
sys.path.insert(0, os.path.abspath('..'))
os.chdir(os.path.abspath('..'))
from backend.plugins.PluginBase import PluginProcess
class CallGraphProcess(PluginProcess):
def __init__(self, wdir, rq):
PluginProcess.__init__(self, wdir)
self.name = 'call graph process'
if rq == None:
rq = ['', '']
self.cmd_str = rq[0]
self.req = rq[1]
def parse_result(self, text, sig):
return [text]
class ClassGraphWidget(QWidget):
def __init__(self, parent, cmd_func, cmd_id, cmd_opt):
QWidget.__init__(self, parent)
self.is_busy = False
self.is_done = False
self.cmd_func = cmd_func
self.cmd_id = cmd_id
self.cmd_opt = cmd_opt
self.vlay1 = QVBoxLayout()
self.setLayout(self.vlay1)
#self.hlay1 = QHBoxLayout()
#self.vlay1.addLayout(self.hlay1)
#self.add_buttons(self.hlay1)
self.lbl = QLabel()
self.vlay1.addWidget(self.lbl)
self.vlay2 = QVBoxLayout()
self.scrolla = QScrollArea()
self.scrolla.setLayout(self.vlay2)
self.vlay1.addWidget(self.scrolla)
def startQuery(self, req, proj_dir, inx):
if self.is_done:
return
self.lbl.setText(['derived', 'base'][inx] + '(' + req + ')')
tool_path = os.path.join('tools', 'ClassGraph.py')
pargs = [sys.executable, tool_path]
if inx == 1:
pargs += ['-b']
pargs += ['-p', proj_dir, req]
sig_res = CallGraphProcess('.', None).run_query_process(pargs, req)
sig_res[0].connect(self.clgraph_add_result)
self.is_busy = True
self.show_progress_bar()
def set_current(self, btn):
inx = self.bgrp.id(btn)
#self.btn[inx].setChecked(True)
print 'inx clicked', inx
if inx == 0:
print self.svgw.renderer().defaultSize()
self.svgw.setMinimumSize(0, 0)
self.svgw.setMinimumSize(self.svgw.sizeHint())
#self.svgw.setMaximumSize(self.svgw.sizeHint())
print self.scrolla.sizeHint()
if inx == 1:
print self.svgw.renderer().defaultSize()
self.svgw.setMinimumSize(0, 0)
#self.svgw.setMaximumSize(self.svgw.sizeHint())
print self.scrolla.sizeHint()
if inx == 2:
print self.svgw.renderer().defaultSize()
self.svgw.setMinimumSize(0, 0)
self.svgw.resize(self.scrolla.size())
#self.svgw.setMaximumSize(self.svgw.sizeHint())
print self.scrolla.sizeHint()
def add_buttons(self, hlay):
self.bgrp = QButtonGroup()
self.bgrp.buttonClicked.connect(self.set_current)
self.bgrp.setExclusive(True)
for inx in range(3):
btn = QToolButton()
btn.setText(str(inx))
btn.setToolTip(str(inx))
#btn.setFlat(True)
btn.setCheckable(True)
self.bgrp.addButton(btn, inx)
hlay.addWidget(btn)
def clgraph_add_result(self, req, res):
self.is_busy = False
self.is_done = True
self.remove_progress_bar()
self.svgw = QSvgWidget()
self.scrolla.setWidget(self.svgw)
self.svgw.load(QByteArray(res[0]))
#print self.svgw.renderer().defaultSize()
sz = self.svgw.sizeHint()
scale = 1
if sz.width() > 1024:
scale = 0.8
self.svgw.setMinimumSize(sz.width() * scale, sz.height() * scale)
#self.svgw.setMaximumSize(self.svgw.sizeHint())
#print self.scrolla.sizeHint()
def show_progress_bar(self):
self.pbar = QProgressBar(self.scrolla)
self.pbar.setMinimum(0)
self.pbar.setMaximum(0)
self.pbar.show()
def remove_progress_bar(self):
if self.pbar:
self.pbar.hide()
self.pbar.setParent(None)
self.pbar = None
class ClassGraphWindow(QMainWindow):
parent = None
def __init__(self, req, proj_dir, cmd_func, cmd_args, cmd_opt):
QMainWindow.__init__(self, ClassGraphWindow.parent)
self.req = req
self.proj_dir = proj_dir
self.setWindowTitle(req)
self.setFont(QFont("San Serif", 8))
w = QWidget()
self.setCentralWidget(w)
self.vlay = QVBoxLayout()
w.setLayout(self.vlay)
self.sw = QStackedWidget()
self.hlay = QHBoxLayout()
self.vlay.addLayout(self.hlay)
self.vlay.addWidget(self.sw)
self.bgrp = QButtonGroup()
self.bgrp.buttonClicked.connect(self.set_current)
self.bgrp.setExclusive(True)
self.btn = []
self.ctree = []
for inx in range(len(cmd_args)):
# cmd format: [ cmd_id, cmd_str, cmd_tip ]
cmd = cmd_args[inx]
btn = QToolButton()
btn.setText(cmd[1])
btn.setToolTip(cmd[2])
#btn.setFlat(True)
btn.setCheckable(True)
self.bgrp.addButton(btn, inx)
self.hlay.addWidget(btn)
ct = ClassGraphWidget(self, cmd_func, cmd[0], cmd_opt)
self.sw.addWidget(ct)
self.btn.append(btn)
self.ctree.append(ct)
self.hlay.addStretch(0)
self.set_current(self.btn[0])
def set_current(self, btn):
inx = self.bgrp.id(btn)
self.btn[inx].setChecked(True)
self.sw.setCurrentIndex(inx)
ct = self.ctree[inx]
ct.setFocus()
ct.startQuery(self.req, self.proj_dir, inx)
def create_page(req, proj_dir, cmd_func, cmd_args, cmd_opt):
w = ClassGraphWindow(req, proj_dir, cmd_func, cmd_args, cmd_opt)
w.resize(900, 600)
w.show()
return w
if __name__ == '__main__':
import optparse
usage = "usage: %prog [options] symbol"
op = optparse.OptionParser(usage=usage)
op.add_option("-p", "--project", dest="id_path", help="Idutils project dir", metavar="PROJECT")
(options, args) = op.parse_args()
# id utils project dir
if not options.id_path:
print >> sys.stderr, 'idutils project path required'
sys.exit(-1)
id_path = os.path.normpath(options.id_path)
if not os.path.exists(os.path.join(id_path, 'ID')):
print >> sys.stderr, 'idutils project path does not exist'
sys.exit(-2)
# symbol
if len(args) != 1:
print >> sys.stderr, 'Please specify a symbol'
sys.exit(-3)
sym = args[0]
#print options.id_path, args
app = QApplication(sys.argv)
cmd_args = [
['CLGRAPH', 'D', 'Derived classes'],
['CLGRAPH', 'B', 'Base classes']
]
w = create_page(sym, id_path, None, cmd_args, None)
sys.exit(app.exec_())
seascope-0.7/src/view/CallView.py 0000664 0023763 0023763 00000012371 12062273150 015457 0 ustar anil anil #!/usr/bin/python
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class CallTreeWidgetItem(QTreeWidgetItem):
def __init__(self, li):
QTreeWidgetItem.__init__(self, li)
func = li[0]
if (func == ""):
self.setChildIndicatorPolicy(QTreeWidgetItem.DontShowIndicatorWhenChildless)
else:
self.setChildIndicatorPolicy(QTreeWidgetItem.ShowIndicator)
self.is_done = False
def set_no_children(self):
self.setChildIndicatorPolicy(QTreeWidgetItem.DontShowIndicatorWhenChildless)
def column_val(self, col):
return str(self.data(col, Qt.DisplayRole).toString())
def add_result(self, res):
self.is_done = True
res_list = []
ret_val = True
for line in res:
if (line[0] == ""):
continue
if (line[0] == self.column_val(0)):
if (line [1] == self.column_val(1) and line[2] == self.column_val(2)):
continue
self.addChild(CallTreeWidgetItem(line))
if (self.childCount() == 0):
self.set_no_children()
# resize column
self.treeWidget().resizeColumnToContents(0)
self.treeWidget().resizeColumnToContents(1)
self.treeWidget().resizeColumnToContents(2)
self.treeWidget().resizeColumnToContents(3)
# hdr
#self.treeWidget().header().setDefaultAlignment(Qt.AlignRight)
return ret_val
class CallTreeWidget(QTreeWidget):
sig_show_file_line = pyqtSignal(str, int)
def __init__(self, parent, cmd_func, cmd_id, cmd_opt, hint_file):
QTreeWidget.__init__(self, parent)
self.is_busy = False
self.cmd_func = cmd_func
self.cmd_id = cmd_id
self.cmd_opt = cmd_opt
self.hint_file = hint_file
self.itemExpanded.connect(self.ctree_itemExpanded)
self.itemActivated.connect(self.ctree_itemActivated)
self.setExpandsOnDoubleClick(False)
self.setColumnCount(4)
self.setHeaderLabels(['Tag', 'File', 'Line', 'Text'])
self.setSelectionMode(QAbstractItemView.SingleSelection)
#self.resize(QSize(800, 500))
self.setMinimumWidth(800)
self.setMinimumHeight(500)
##sel behaviour
#self.setSelectionBehavior(QAbstractItemView.SelectRows)
## set the font
self.setFont(QFont("San Serif", 8))
#self.setTextElideMode(Qt.ElideLeft)
self.setAllColumnsShowFocus(True)
def add_root(self, name):
parent = CallTreeWidgetItem([name, '', '', ''])
self.addTopLevelItem(parent)
parent.setExpanded(True)
def mousePressEvent(self, m_ev):
QTreeWidget.mousePressEvent(self, m_ev)
if (m_ev.button() == Qt.RightButton):
self.last_minx = self.indexAt(m_ev.pos())
def ctree_itemActivated(self, item, col):
filename = item.column_val(1)
try:
line = int(item.column_val(2))
except:
return
self.sig_show_file_line.emit(filename, line)
def ctree_itemExpanded(self, item):
if (item.is_done):
return
tag = str(item.data(0, Qt.DisplayRole).toString())
if str(item.data(1, Qt.DisplayRole).toString()) == '':
opt = self.cmd_opt
else:
opt = None
if (self.is_busy):
return
self.is_busy = True
self.pbar = QProgressBar(self)
self.pbar.setMinimum(0)
self.pbar.setMaximum(0)
self.pbar.show()
## add result
rquery = {}
rquery['cmd'] = self.cmd_id
rquery['req'] = tag
rquery['opt'] = opt
hfile = str(item.data(1, Qt.DisplayRole).toString())
if hfile == '':
hfile = self.hint_file
rquery['hint_file'] = hfile
sig_res = self.cmd_func(rquery)
self.query_item = item
sig_res[0].connect(self.ctree_add_result)
def ctree_add_result(self, req, res):
self.query_item.add_result(res)
self.is_busy = False
if self.pbar:
self.pbar.setParent(None)
self.pbar = None
class CallTreeWindow(QMainWindow):
sig_show_file_line = pyqtSignal(str, int)
parent = None
def __init__(self, req, cmd_func, cmd_args, cmd_opt, hint_file):
QMainWindow.__init__(self, CallTreeWindow.parent)
self.req = req
self.setWindowTitle(req)
self.setFont(QFont("San Serif", 8))
w = QWidget()
self.setCentralWidget(w)
self.vlay = QVBoxLayout()
w.setLayout(self.vlay)
self.sw = QStackedWidget()
self.hlay = QHBoxLayout()
self.vlay.addLayout(self.hlay)
self.vlay.addWidget(self.sw)
self.bgrp = QButtonGroup()
self.bgrp.buttonClicked.connect(self.set_current)
self.bgrp.setExclusive(True)
self.btn = []
self.ctree = []
for inx in range(len(cmd_args)):
# cmd format: [ cmd_id, cmd_str, cmd_tip ]
cmd = cmd_args[inx]
btn = QToolButton()
btn.setText(cmd[1])
btn.setToolTip(cmd[2])
#btn.setFlat(True)
btn.setCheckable(True)
self.bgrp.addButton(btn, inx)
self.hlay.addWidget(btn)
ct = CallTreeWidget(self, cmd_func, cmd[0], cmd_opt, hint_file)
ct.sig_show_file_line.connect(self.sig_show_file_line)
self.sw.addWidget(ct)
self.btn.append(btn)
self.ctree.append(ct)
self.hlay.addStretch(0)
self.set_current(self.btn[0])
def set_current(self, btn):
inx = self.bgrp.id(btn)
self.btn[inx].setChecked(True)
self.sw.setCurrentIndex(inx)
ct = self.ctree[inx]
if ct.topLevelItemCount() == 0:
ct.add_root(self.req)
ct.setFocus()
def ctree_show_file_line(filename, line):
parent = CallTreeWindow.parent
parent.raise_()
parent.activateWindow()
parent.show_file_line(filename, line)
def create_page(req, cmd_func, cmd_args, cmd_opt, hint_file):
w = CallTreeWindow(req, cmd_func, cmd_args, cmd_opt, hint_file)
w.sig_show_file_line.connect(ctree_show_file_line)
w.show()
seascope-0.7/src/view/EdViewRW.py 0000664 0023763 0023763 00000007540 12062273150 015407 0 ustar anil anil #!/usr/bin/env python
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os
import re
from PyQt4 import QtGui
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from EdView import *
# inherit from EditView, add editing support.
class EditorViewRW(EditorView):
sig_file_modified = pyqtSignal(bool)
def __init__(self, parent=None):
EditorView.__init__(self, parent)
# use default settings.
EditorView.ed_settings_1(self)
def open_file(self, filename):
self.filename = filename
## Choose a lexer
if not self.lexer:
if (re.search('\.(py|pyx|pxd|pxi|scons)$', filename) != None):
self.lexer = QsciLexerPython()
else:
self.lexer = QsciLexerCPP()
## Braces matching
self.setBraceMatching(QsciScintilla.SloppyBraceMatch)
## Render on screen
self.show()
## Show this file in the editor
data = open(filename).read()
try:
data = data.decode("UTF-8")
except:
pass
self.setText(data)
## process for modifiled.
self.setModified(False)
self.modificationChanged.connect(self.modifiedChanged)
## support edit
self.setReadOnly(False)
self.show()
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.setFocus()
def modifiedChanged(self):
self.sig_file_modified.emit(self.isModified())
# FIXME: too simple for big files or remote files.
def save_file(self, filename):
if(self.isModified()):
fobj = open(filename, 'w')
if (not fobj.closed):
fobj.write(str(self.text().toUtf8()))
fobj.flush()
fobj.close()
self.setModified(False)
class EditorPageRW(EditorPage):
def new_editor_view(self):
return EditorViewRW(self)
class EditorBookRW(EditorBook):
def new_editor_page(self):
return EditorPageRW()
def save_file_at_inx(self, inx):
if inx < 0:
return
page = self.widget(inx)
filename = page.get_filename()
if filename:
page.ev.save_file(filename)
page.fcv.rerun(filename)
def save_current_page(self):
inx = self.currentIndex()
self.save_file_at_inx(inx)
def save_tab_list(self, inx_list):
for inx in inx_list:
self.save_file_at_inx(inx)
def save_all_file(self):
inx_list = range(self.count())
self.save_tab_list(inx_list)
def page_modified_cb(self, isModifiled):
inx = self.currentIndex()
filename = self.tabText(inx)
# Sign modified.
if isModifiled:
filename = "*" + filename
self.setTabText(inx, filename)
else:
filename = str(filename)
filename = filename.strip('*')
self.setTabText(inx, filename)
def close_cb(self, inx):
page = self.widget(self.currentIndex())
if page.ev.isModified():
if DialogManager.show_yes_no("Do you want to save file ?"):
self.save_current_page()
self.removeTab(inx)
def has_modified_file(self, inx_list):
for i in inx_list:
page = self.widget(i)
if page.ev.isModified():
return True
return False
def close_list_common(self, type):
inx_list = self.tab_list(self.currentIndex(), type)
if len(inx_list) == 0:
return
if self.has_modified_file(inx_list):
msg = 'Closing all %s.\nSave changes ?' % type
if DialogManager.show_yes_no(msg):
self.save_tab_list()
self.remove_tab_list(inx_list)
else:
msg = 'Close all %s ?' % type
if not DialogManager.show_yes_no(msg):
return
self.remove_tab_list(inx_list)
def show_file_line(self, filename, line, hist=True):
EditorBook.show_file_line(self, filename, line, hist=hist)
page = self.currentWidget()
# modified signal callback
page.ev.sig_file_modified.connect(self.page_modified_cb)
# redo editing callback
def redo_edit_cb(self):
ed = self.currentWidget()
if ed:
ed.ev.redo()
# undo editing callback
def undo_edit_cb(self):
ed = self.currentWidget()
if ed:
ed.ev.undo()
# edting callbacks
def cut_edit_cb(self):
ed = self.currentWidget()
if ed:
ed.ev.cut()
def paste_edit_cb(self):
ed = self.currentWidget()
if ed:
ed.ev.paste()
seascope-0.7/src/view/DebugView.py 0000664 0023763 0023763 00000003125 12062273150 015627 0 ustar anil anil # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import sys
import os
import string
from PyQt4 import QtGui, QtCore, uic
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class DebugInfoEntry(QFrame):
def __init__(self, parent=None):
QFrame.__init__(self)
self.vlay = QVBoxLayout()
self.setLayout(self.vlay)
#def add_result_continue(self):
#self.add_result(self.name, self.res)
def add_result(self, cmd, out, err):
#self.setFrameStyle(QFrame.StyledPanel | QFrame.Plain)
self.cmd_lbl = QLabel()
self.cmd_lbl.setText(cmd)
self.vlay.addWidget(self.cmd_lbl)
#if err != None and err != '':
#self.err_lbl = QLabel()
#self.err_lbl.setText('Error: ' + err)
#self.vlay.addWidget(self.err_lbl)
#self.res_lbl = QLabel()
#self.res_lbl.setText(out)
#self.vlay.addWidget(self.res_lbl)
#self.res_lbl.hide()
class DebugWindow(QMainWindow):
dlg = None
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
self.ui = uic.loadUi('ui/debug.ui', self)
self.vlay = self.ui.dbg_widget.layout()
def append_widget(self, w):
self.vlay.addWidget(w)
def run_dialog(self):
self.ui.show()
vbar = self.ui.dbg_scroll_area.verticalScrollBar()
vbar.setValue(vbar.maximum())
self.ui.show()
def closeEvent(self, e):
DebugWindow.dlg = None
def show_dbg_dialog(parent):
if (DebugWindow.dlg == None):
DebugWindow.dlg = DebugWindow(parent)
DebugWindow.dlg.run_dialog()
def connect_to_sig(sig_res):
if (DebugWindow.dlg == None):
return
entry = DebugInfoEntry()
DebugWindow.dlg.append_widget(entry)
sig_res.connect(entry.add_result)
seascope-0.7/src/view/FileContextView.py 0000664 0023763 0023763 00000004120 12062273150 017021 0 ustar anil anil #!/usr/bin/python
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import filecontext
class FileContextView(QTabWidget):
sig_goto_line = pyqtSignal(int)
sig_ed_cursor_changed = pyqtSignal(int, int)
def __init__(self, parent=None):
QTabWidget.__init__(self)
self.setTabPosition(QTabWidget.South)
def add_page(self, page, title):
page.sig_goto_line.connect(self.sig_goto_line)
self.addTab(page, title)
self.setCurrentWidget(page)
def run(self, filename):
self.filename = filename
filecontext.run_plugins(filename, self)
def rerun(self, filename):
inx = self.currentIndex()
self.clear()
self.run(filename)
self.setCurrentIndex(inx)
def focus_search_ctags(self):
for inx in range(self.count()):
page = self.widget(inx)
if hasattr(page, 'le') and hasattr(page.le, 'setFocus'):
self.setCurrentWidget(page)
page.le.setFocus()
break
def get_already_opened_cmd_list(self):
a_cmd_list = []
for inx in range(self.count()):
page = self.widget(inx)
if hasattr(page, 'cmd'):
a_cmd_list.append(page.cmd)
return a_cmd_list
def get_plugin_cmd_list(self):
a_cmd_list = self.get_already_opened_cmd_list()
cmd_list = []
for p in filecontext.fc_plugins:
if not hasattr(p, 'cmd_name'):
continue
cmd_name = p.cmd_name()
if not cmd_name:
continue
if not isinstance(cmd_name, list):
if cmd_name == '':
continue
cmd_name = [ cmd_name ]
for cmd in cmd_name:
if cmd in a_cmd_list:
continue
cmd_list.append((cmd, p))
return cmd_list
def menu_act_triggered_cb(self, act):
act.plugin.run_plugin(self.filename, self, cmd=act.cmd_name)
def mousePressEvent(self, m_ev):
cmd_list = self.get_plugin_cmd_list()
if len(cmd_list) == 0:
return
if (m_ev.button() == Qt.RightButton):
# setup popup menu
pmenu = QMenu()
pmenu.triggered.connect(self.menu_act_triggered_cb)
for (cmd_name, p) in cmd_list:
act = pmenu.addAction(cmd_name)
act.plugin = p
act.cmd_name = cmd_name
pmenu.exec_(QCursor.pos())
pmenu = None
seascope-0.7/src/icons/ 0000775 0023763 0023763 00000000000 12062273150 013534 5 ustar anil anil seascope-0.7/src/icons/seascope.svg 0000664 0023763 0023763 00000007505 12062273150 016066 0 ustar anil anil
seascope-0.7/src/icons/go-jump.png 0000664 0023763 0023763 00000001123 12062273150 015615 0 ustar anil anil PNG
IHDR a sBIT|d pHYs
B(x tEXtSoftware www.inkscape.org< IDAT8ARQtzTSavCaꈋ6pnʕM wB[IndIxBՋ~|s5q2pag8N7g84Ml|>@D5[^x0~x<~D;lJo_JnkE@D|"rh=`!Li"8 XJefR73!l`ڢ ײeYρu@/W^wڌD" V.\p8mJeZ&ZXFv f3<c# p%A~&~0{ Bo۶?-a`qc `Y4,
&ޮjw 29)Jg4}0MsbFٷE",ν^$J=mWK]Â/bX, IENDB` seascope-0.7/src/icons/cut.png 0000664 0023763 0023763 00000001344 12062273150 015037 0 ustar anil anil PNG
IHDR a sBIT|d pHYs
B(x tEXtSoftware www.inkscape.org< aIDAT8uKq?ut7 d0
AI J"nC
ܡЛa bl4X.d.{<}Q"S.2p
gS
`-spxI8HæifR[drHDd292M3#"V/) vDWDӽn{ "#ׁrRFG#T*~Tiaa#P(X,X5cݶ큵acccODdsN ifw].ײRt >rwnCSåˑH$;33ӷZ~F(1 "B0jYֽ@:
=VDlܿH 7Ri4_f2"hh>3?vvv@E%Q0VM`yqq#iJ"wSJ&&&6+`X,憇c.JMI=SDNwwwNNN
o"x.Ji 矩dYVl>Zil>驴_,+.r#`W`y } IENDB` seascope-0.7/src/icons/codeview.png 0000664 0023763 0023763 00000001072 12062273150 016047 0 ustar anil anil PNG
IHDR a sBIT|d pHYs
B(x tEXtSoftware www.inkscape.org< IDAT81QDd`3
bambA alBV
[fw;I0섉ɵy!)ywD>7}6`k7:'mtza,'21fs5Қc`5ȉ
F'ܦ;}/T#I.=bTs$Q:Xplz
N`*Js<;Y*>tK0zAVA#㼦wbFnρgFaDs`50?kZg[ i01>0-xSs6_x`bQ FF_Km_suL+2ujf0ߖ 5N6F7jB IENDB` seascope-0.7/src/icons/save.png 0000664 0023763 0023763 00000001060 12062273150 015175 0 ustar anil anil PNG
IHDR a sBIT|d pHYs
B(x tEXtSoftware www.inkscape.org< IDAT81Q;J&ň,bI5Qll[`XBHcRdAaۈn62$8<>WcN*mA?8]I$u<{#颼3r| |qbLRh>
:FE$YYޖcߐ=Iے