/* * Copyright (C) 2003 Roberto Raggi (roberto@kdevelop.org) * Copyright (C) 2003 Alexander Dymo (cloudtemple@mksat.net) * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "classviewwidget.h" #include "classviewpart.h" #include "hierarchydlg.h" #include "navigator.h" #include "tdelistviewaction.h" #include #include #include #include #include #include class FunctionCompletion : public CustomCompleter { public: FunctionCompletion() { setOrder( Insertion ); }; typedef TQMap FuncMap; FuncMap nameMap; /// real -> short FuncMap revNameMap; /// short -> real static const TQString processName( TQString function ) { TQString args; TQString fScope; int cutpos; if((cutpos = function.find('(')) != -1) { args = function.right( function.length() - cutpos ); function = function.left( cutpos ); } else { return function; } if((cutpos = function.findRev(':')) != -1 || (cutpos = function.findRev('.')) != -1) { fScope = function.left( cutpos + 1 ); function = function.right( function.length() - cutpos - 1); } return function; } virtual void addItem ( const TQString &item ) { TQString newItemName = item; TDECompletion::addItem(newItemName); TQString tx = processName( item ); tx += " \"" + item + "\""; nameMap[item] = tx; revNameMap[tx] = item; if(tx.length() == 0) { kdDebug() << "function-name-extraction failed with \"" << item << "\"" << endl; }else{ TDECompletion::addItem( tx ); kdDebug() << "addding \"" << item << "\" as \"" << tx << "\"" << endl; } TDECompletion::addItem( item ); } virtual void removeItem ( const TQString &item ) { FuncMap::iterator it = nameMap.find( item ); if( it != nameMap.end() ) { TDECompletion::removeItem( *it ); revNameMap.remove( *it ); nameMap.remove( it ); } } virtual void clear() { nameMap.clear(); revNameMap.clear(); TDECompletion::clear(); } virtual void postProcessMatch ( TQString *match ) const { FuncMap::const_iterator it = revNameMap.find( *match ); if( it != revNameMap.end() ) { *match = *it; } }; virtual void postProcessMatches ( TQStringList *matches ) const { TQStringList::iterator it = matches->begin(); while( it != matches->end() ) { postProcessMatch( &(*it) ); ++it; } } virtual void postProcessMatches ( TDECompletionMatches *matches ) const { } }; typedef TDevGenericFactory ClassViewFactory; static const TDevPluginInfo data("tdevclassview"); K_EXPORT_COMPONENT_FACTORY( libtdevclassview, ClassViewFactory( data ) ) ClassViewPart::ClassViewPart(TQObject *parent, const char *name, const TQStringList& ) :/// TDevPlugin( &data, parent, name ? name : "ClassViewPart" ), TDevCodeBrowserFrontend( &data, parent, name ? name : "ClassViewPart" ), m_activeDocument(0), m_activeView(0), m_activeSelection(0), m_activeEditor(0), m_activeViewCursor(0), m_hierarchyDlg(0) { setInstance(ClassViewFactory::instance()); setXMLFile("tdevclassview.rc"); navigator = new Navigator(this); setupActions(); m_widget = new ClassViewWidget(this); m_widget->setIcon( SmallIcon("view_tree") ); m_widget->setCaption(i18n("Class Browser")); mainWindow()->embedSelectView( m_widget, i18n("Classes"), i18n("Class browser") ); TQWhatsThis::add(m_widget, i18n("Class browser

" "The class browser shows all namespaces, classes and namespace and class members in a project.")); connect( core(), TQT_SIGNAL(projectOpened()), this, TQT_SLOT(slotProjectOpened()) ); connect( core(), TQT_SIGNAL(projectClosed()), this, TQT_SLOT(slotProjectClosed()) ); connect( core(), TQT_SIGNAL(languageChanged()), this, TQT_SLOT(slotProjectOpened()) ); connect( partController(), TQT_SIGNAL(activePartChanged(KParts::Part*)), this, TQT_SLOT(activePartChanged(KParts::Part*))); } bool ClassViewPart::jumpedToItem( ItemDom item ) { if(!m_widget) return false; return m_widget->selectItem(item); } ClassViewPart::~ClassViewPart() { mainWindow()->removeView( m_widget ); delete (ClassViewWidget*) m_widget; delete m_hierarchyDlg; } void ClassViewPart::slotProjectOpened( ) { connect( languageSupport(), TQT_SIGNAL(updatedSourceInfo()), navigator, TQT_SLOT(refresh()) ); connect( languageSupport(), TQT_SIGNAL(addedSourceInfo(const TQString& )), navigator, TQT_SLOT(addFile(const TQString& ))); navigator->refresh(); } void ClassViewPart::slotProjectClosed( ) { // navigator->refresh(); // disconnect( languageSupport(), TQT_SIGNAL(updatedSourceInfo()), navigator, TQT_SLOT(refresh()) ); } void ClassViewPart::setupActions( ) { m_functionsnav = new TDEListViewAction( new KComboView(true, 150, 0, "m_functionsnav_combo", new FunctionCompletion() ), i18n("Functions Navigation"), 0, 0, 0, actionCollection(), "functionsnav_combo", true ); connect(m_functionsnav->view(), TQT_SIGNAL(activated(TQListViewItem*)), navigator, TQT_SLOT(selectFunctionNav(TQListViewItem*))); // m_functionsnav->view()->setEditable(false); connect(m_functionsnav->view(), TQT_SIGNAL(focusGranted()), navigator, TQT_SLOT(functionNavFocused())); connect(m_functionsnav->view(), TQT_SIGNAL(focusLost()), navigator, TQT_SLOT(functionNavUnFocused())); m_functionsnav->setToolTip(i18n("Functions in file")); m_functionsnav->setWhatsThis(i18n("Function navigator

Navigates over functions contained in the file.")); // m_functionsnav->view()->setCurrentText(NAV_NODEFINITION); m_functionsnav->view()->setDefaultText(NAV_NODEFINITION); new TDEAction( i18n("Focus Navigator"), 0, this, TQT_SLOT(slotFocusNavbar()), actionCollection(), "focus_navigator" ); if (langHasFeature(TDevLanguageSupport::Classes)) { TDEAction *ac = new TDEAction(i18n("Class Inheritance Diagram"), "view_tree", 0, this, TQT_SLOT(graphicalClassView()), actionCollection(), "inheritance_dia"); ac->setToolTip(i18n("Class inheritance diagram")); ac->setWhatsThis(i18n("Class inheritance diagram

Displays inheritance relationship between classes in project. " "Note, it does not display classes outside inheritance hierarchy.")); } } bool ClassViewPart::langHasFeature(TDevLanguageSupport::Features feature) { bool result = false; if (languageSupport()) result = (feature & languageSupport()->features()); return result; } void ClassViewPart::graphicalClassView( ) { if( !m_hierarchyDlg ) m_hierarchyDlg = new HierarchyDialog(this); m_hierarchyDlg->refresh(); m_hierarchyDlg->show(); } void ClassViewPart::refresh() { if( navigator ) navigator->refresh(); } void ClassViewPart::activePartChanged( KParts::Part * part) { navigator->stopTimer(); if (m_activeView) { disconnect(m_activeView, TQT_SIGNAL(cursorPositionChanged()), navigator, TQT_SLOT(slotCursorPositionChanged())); } kdDebug() << "ClassViewPart::activePartChanged()" << endl; m_activeDocument = dynamic_cast( part ); m_activeView = part ? dynamic_cast( part->widget() ) : 0; m_activeEditor = dynamic_cast( part ); m_activeSelection = dynamic_cast( part ); m_activeViewCursor = part ? dynamic_cast( m_activeView ) : 0; m_activeFileName = TQString(); if (m_activeDocument) { m_activeFileName = URLUtil::canonicalPath( m_activeDocument->url().path() ); navigator->refreshNavBars(m_activeFileName); navigator->syncFunctionNavDelayed(200); /* if ( languageSupport()->mimeTypes().find( KMimeType::findByPath(m_activeFileName)) != languageSupport()->mimeTypes().end() ) m_activeFileName = TQString();*/ } if( m_activeViewCursor ) { connect(m_activeView, TQT_SIGNAL(cursorPositionChanged()), navigator, TQT_SLOT(slotCursorPositionChanged()) ); } } void ClassViewPart::slotFocusNavbar() { m_functionsnav->view()->setFocus(); } #include "classviewpart.moc"