You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
338 lines
11 KiB
338 lines
11 KiB
/***************************************************************************
|
|
* plugin_katesymbolviewer.cpp - description
|
|
* -------------------
|
|
* begin : Apr 2 2003
|
|
* author : 2003 Massimo Callegari
|
|
* email : massitqmocallegari@yahoo.it
|
|
*
|
|
* Changes:
|
|
* Nov 09 2004 v.1.3 - For changelog please refer to KDE CVS
|
|
* Nov 05 2004 v.1.2 - Choose parser from the current highlight. Minor i18n changes.
|
|
* Nov 28 2003 v.1.1 - Structured for multilanguage support
|
|
* Added preliminary Tcl/Tk parser (thanks Rohit). To be improved.
|
|
* Various bugfixing.
|
|
* Jun 19 2003 v.1.0 - Removed TQTimer (polling is Evil(tm)... )
|
|
* - Captured documentChanged() event to refresh symbol list
|
|
* - Tooltips vanished into nowhere...sigh :(
|
|
* May 04 2003 v 0.6 - Symbol List becomes a KListView object. Removed Tooltip class.
|
|
* Added a TQTimer that every 200ms checks:
|
|
* * if the list width has changed
|
|
* * if the document has changed
|
|
* Added an entry in the popup menu to switch between List and Tree mode
|
|
* Various bugfixing.
|
|
* Apr 24 2003 v 0.5 - Added three check buttons in popup menu to show/hide symbols
|
|
* Apr 23 2003 v 0.4 - "View Symbol" moved in Settings menu. "Refresh List" is no
|
|
* longer in Kate menu. Moved into a popup menu activated by a
|
|
* mouse right button click. + Bugfixing.
|
|
* Apr 22 2003 v 0.3 - Added macro extraction + several bugfixing
|
|
* Apr 19 2003 v 0.2 - Added to CVS. Extract functions and structures
|
|
* Apr 07 2003 v 0.1 - First version.
|
|
*
|
|
***************************************************************************/
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include "plugin_katesymbolviewer.h"
|
|
#include "plugin_katesymbolviewer.moc"
|
|
|
|
#include <kaction.h>
|
|
#include <klocale.h>
|
|
#include <kstandarddirs.h>
|
|
#include <kgenericfactory.h>
|
|
#include <kfiledialog.h>
|
|
|
|
#include <tqlayout.h>
|
|
#include <tqgroupbox.h>
|
|
|
|
K_EXPORT_COMPONENT_FACTORY( katecppsymbolviewerplugin, KGenericFactory<KatePluginSymbolViewer>( "katesymbolviewer" ) )
|
|
|
|
KatePluginSymbolViewerView::KatePluginSymbolViewerView(Kate::MainWindow *w)
|
|
{
|
|
KGlobal::locale()->insertCatalogue("katecppsymbolviewer");
|
|
KToggleAction* act = new KToggleAction ( i18n("Hide Symbols"), 0, this, TQT_SLOT( slotInsertSymbol() ), actionCollection(), "view_insert_symbolviewer" );
|
|
act->setCheckedState(i18n("Show Symbols"));
|
|
|
|
setInstance (new KInstance("kate"));
|
|
setXMLFile("plugins/katecppsymbolviewer/ui.rc");
|
|
w->guiFactory()->addClient (this);
|
|
win = w;
|
|
symbols = 0;
|
|
|
|
m_Active = false;
|
|
popup = new TQPopupMenu();
|
|
popup->insertItem(i18n("Refresh List"), this, TQT_SLOT(slotRefreshSymbol()));
|
|
popup->insertSeparator();
|
|
m_macro = popup->insertItem(i18n("Show Macros"), this, TQT_SLOT(toggleShowMacros()));
|
|
m_struct = popup->insertItem(i18n("Show Structures"), this, TQT_SLOT(toggleShowStructures()));
|
|
m_func = popup->insertItem(i18n("Show Functions"), this, TQT_SLOT(toggleShowFunctions()));
|
|
popup->insertSeparator();
|
|
popup->insertItem(i18n("List/Tree Mode"), this, TQT_SLOT(slotChangeMode()));
|
|
m_sort = popup->insertItem(i18n("Enable sorting"), this, TQT_SLOT(slotEnableSorting()));
|
|
|
|
popup->setItemChecked(m_macro, true);
|
|
popup->setItemChecked(m_struct, true);
|
|
popup->setItemChecked(m_func, true);
|
|
macro_on = true;
|
|
struct_on = true;
|
|
func_on = true;
|
|
slotInsertSymbol();
|
|
}
|
|
|
|
KatePluginSymbolViewerView::~KatePluginSymbolViewerView()
|
|
{
|
|
win->guiFactory()->removeClient (this);
|
|
delete dock;
|
|
delete popup;
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::toggleShowMacros(void)
|
|
{
|
|
bool s = !popup->isItemChecked(m_macro);
|
|
popup->setItemChecked(m_macro, s);
|
|
macro_on = s;
|
|
slotRefreshSymbol();
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::toggleShowStructures(void)
|
|
{
|
|
bool s = !popup->isItemChecked(m_struct);
|
|
popup->setItemChecked(m_struct, s);
|
|
struct_on = s;
|
|
slotRefreshSymbol();
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::toggleShowFunctions(void)
|
|
{
|
|
bool s = !popup->isItemChecked(m_func);
|
|
popup->setItemChecked(m_func, s);
|
|
func_on = s;
|
|
slotRefreshSymbol();
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::slotInsertSymbol()
|
|
{
|
|
TQPixmap cls( ( const char** ) class_xpm );
|
|
|
|
if (m_Active == false)
|
|
{
|
|
dock = win->toolViewManager()->createToolView("kate_plugin_cppsymbolviewer", Kate::ToolViewManager::Left, cls, i18n("Symbol List"));
|
|
|
|
symbols = new KListView(dock);
|
|
treeMode = 0;
|
|
|
|
connect(symbols, TQT_SIGNAL(executed(TQListViewItem *)), this, TQT_SLOT(goToSymbol(TQListViewItem *)));
|
|
connect(symbols, TQT_SIGNAL(rightButtonClicked(TQListViewItem *, const TQPoint&, int)),
|
|
TQT_SLOT(slotShowContextMenu(TQListViewItem *, const TQPoint&, int)));
|
|
connect(win->viewManager(), TQT_SIGNAL(viewChanged()), this, TQT_SLOT(slotDocChanged()));
|
|
//connect(symbols, TQT_SIGNAL(resizeEvent(TQResizeEvent *)), this, TQT_SLOT(slotViewChanged(TQResizeEvent *)));
|
|
|
|
m_Active = true;
|
|
//symbols->addColumn(i18n("Symbols"), symbols->parentWidget()->width());
|
|
symbols->addColumn(i18n("Symbols"));
|
|
symbols->addColumn(i18n("Position"));
|
|
symbols->setColumnWidthMode(1, TQListView::Manual);
|
|
symbols->setColumnWidth ( 1, 0 );
|
|
symbols->setSorting(-1, FALSE);
|
|
symbols->setRootIsDecorated(0);
|
|
symbols->setTreeStepSize(10);
|
|
symbols->setShowToolTips(TRUE);
|
|
|
|
/* First Symbols parsing here...*/
|
|
parseSymbols();
|
|
}
|
|
else
|
|
{
|
|
delete dock;
|
|
dock = 0;
|
|
symbols = 0;
|
|
m_Active = false;
|
|
}
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::slotRefreshSymbol()
|
|
{
|
|
if (!symbols)
|
|
return;
|
|
symbols->clear();
|
|
parseSymbols();
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::slotChangeMode()
|
|
{
|
|
treeMode = !treeMode;
|
|
symbols->clear();
|
|
parseSymbols();
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::slotEnableSorting()
|
|
{
|
|
lsorting = !lsorting;
|
|
popup->setItemChecked(m_sort, lsorting);
|
|
symbols->clear();
|
|
if (lsorting == TRUE)
|
|
symbols->setSorting(0, TRUE);
|
|
else
|
|
symbols->setSorting(-1, FALSE);
|
|
|
|
parseSymbols();
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::slotDocChanged()
|
|
{
|
|
//kdDebug(13000)<<"Document changed !!!!"<<endl;
|
|
slotRefreshSymbol();
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::slotViewChanged(TQResizeEvent *)
|
|
{
|
|
kdDebug(13000)<<"View changed !!!!"<<endl;
|
|
symbols->setColumnWidth(0, symbols->parentWidget()->width());
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::slotShowContextMenu(TQListViewItem *, const TQPoint &p, int)
|
|
{
|
|
popup->popup(p);
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::parseSymbols(void)
|
|
{
|
|
unsigned int hlMode = 0;
|
|
|
|
if (!win->viewManager()->activeView())
|
|
return;
|
|
|
|
Kate::Document *kv = win->viewManager()->activeView()->getDoc();
|
|
|
|
// be sure we have some document around !
|
|
if (!kv)
|
|
return;
|
|
|
|
/** Get the current highlighting mode */
|
|
hlMode = kv->hlMode();
|
|
TQString hlModeName = kv->hlModeName(hlMode);
|
|
|
|
//TQListViewItem mcrNode = new TQListViewItem(symbols, symbols->lastItem(), hlModeName);
|
|
|
|
if (hlModeName == "C++" || hlModeName == "C")
|
|
parseCppSymbols();
|
|
else if (hlModeName == "Tcl/Tk")
|
|
parseTclSymbols();
|
|
else if (hlModeName == "Java")
|
|
parseCppSymbols();
|
|
}
|
|
|
|
void KatePluginSymbolViewerView::goToSymbol(TQListViewItem *it)
|
|
{
|
|
Kate::View *kv = win->viewManager()->activeView();
|
|
|
|
// be sure we really have a view !
|
|
if (!kv)
|
|
return;
|
|
|
|
kdDebug(13000)<<"Slot Activated at pos: "<<symbols->itemIndex(it) <<endl;
|
|
kv->gotoLineNumber(it->text(1).toInt(NULL, 10) + 10);
|
|
kv->setFocus();
|
|
kv->gotoLineNumber(it->text(1).toInt(NULL, 10));
|
|
}
|
|
|
|
KatePluginSymbolViewer::KatePluginSymbolViewer( TQObject* parent, const char* name, const TQStringList& )
|
|
: Kate::Plugin ( (Kate::Application*)parent, name ),
|
|
pConfig("katecppsymbolviewerpluginrc")
|
|
{
|
|
pConfig.setGroup("global");
|
|
}
|
|
|
|
KatePluginSymbolViewer::~KatePluginSymbolViewer()
|
|
{
|
|
pConfig.sync();
|
|
}
|
|
|
|
void KatePluginSymbolViewer::addView (Kate::MainWindow *win)
|
|
{
|
|
KatePluginSymbolViewerView *view = new KatePluginSymbolViewerView (win);
|
|
m_views.append (view);
|
|
view->types_on = pConfig.readBoolEntry("view_types", true);
|
|
view->expanded_on = pConfig.readBoolEntry("expand_tree", false);
|
|
}
|
|
|
|
void KatePluginSymbolViewer::removeView(Kate::MainWindow *win)
|
|
{
|
|
for (uint z=0; z < m_views.count(); z++)
|
|
if (m_views.at(z)->win == win)
|
|
{
|
|
KatePluginSymbolViewerView *view = m_views.at(z);
|
|
m_views.remove (view);
|
|
pConfig.writeEntry("view_types", view->types_on);
|
|
pConfig.writeEntry("expand_tree", view->expanded_on);
|
|
delete view;
|
|
return;
|
|
}
|
|
}
|
|
|
|
Kate::PluginConfigPage* KatePluginSymbolViewer::configPage(
|
|
uint, TQWidget *w, const char* /*name*/)
|
|
{
|
|
KatePluginSymbolViewerConfigPage* p = new KatePluginSymbolViewerConfigPage(this, w);
|
|
initConfigPage( p );
|
|
connect( p, TQT_SIGNAL(configPageApplyRequest(KatePluginSymbolViewerConfigPage*)),
|
|
TQT_SLOT(applyConfig(KatePluginSymbolViewerConfigPage *)) );
|
|
return (Kate::PluginConfigPage*)p;
|
|
}
|
|
|
|
void KatePluginSymbolViewer::initConfigPage( KatePluginSymbolViewerConfigPage* p )
|
|
{
|
|
p->viewReturns->setChecked(pConfig.readBoolEntry("view_types", true));
|
|
p->expandTree->setChecked(pConfig.readBoolEntry("expand_tree", false));
|
|
}
|
|
|
|
void KatePluginSymbolViewer::applyConfig( KatePluginSymbolViewerConfigPage* p )
|
|
{
|
|
for (uint z=0; z < m_views.count(); z++)
|
|
{
|
|
m_views.at(z)->types_on = p->viewReturns->isChecked();
|
|
m_views.at(z)->expanded_on = p->expandTree->isChecked();
|
|
//kdDebug(13000)<<"KatePluginSymbolViewer: Configuration applied.("<<m_SymbolView->types_on<<")"<<endl;
|
|
m_views.at(z)->slotRefreshSymbol();
|
|
}
|
|
|
|
pConfig.writeEntry("view_types", p->viewReturns->isChecked());
|
|
pConfig.writeEntry("expand_tree", p->expandTree->isChecked());
|
|
}
|
|
|
|
// BEGIN KatePluginSymbolViewerConfigPage
|
|
KatePluginSymbolViewerConfigPage::KatePluginSymbolViewerConfigPage(
|
|
TQObject* /*parent*/ /*= 0L*/, TQWidget *parentWidget /*= 0L*/)
|
|
: Kate::PluginConfigPage( parentWidget )
|
|
{
|
|
TQVBoxLayout* top = new TQVBoxLayout(this, 0,
|
|
KDialogBase::spacingHint());
|
|
|
|
TQGroupBox* gb = new TQGroupBox( i18n("Parser Options"),
|
|
this, "cppsymbolviewer_config_page_layout" );
|
|
gb->setColumnLayout(1, Qt::Horizontal);
|
|
gb->setInsideSpacing(KDialogBase::spacingHint());
|
|
viewReturns = new TQCheckBox(i18n("Display functions parameters"), gb);
|
|
expandTree = new TQCheckBox(i18n("Automatically expand nodes in tree mode"), gb);
|
|
|
|
top->add(gb);
|
|
top->addStretch(1);
|
|
// throw signal changed
|
|
connect(viewReturns, TQT_SIGNAL(toggled(bool)), this, TQT_SIGNAL(changed()));
|
|
connect(expandTree, TQT_SIGNAL(toggled(bool)), this, TQT_SIGNAL(changed()));
|
|
}
|
|
|
|
KatePluginSymbolViewerConfigPage::~KatePluginSymbolViewerConfigPage() {}
|
|
|
|
void KatePluginSymbolViewerConfigPage::apply()
|
|
{
|
|
emit configPageApplyRequest( this );
|
|
}
|
|
// END KatePluginSymbolViewerConfigPage
|
|
|