From 114a878c64ce6f8223cfd22d76a20eb16d177e5e Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdevelop@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- parts/classview/classviewwidget.h | 414 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 414 insertions(+) create mode 100644 parts/classview/classviewwidget.h (limited to 'parts/classview/classviewwidget.h') diff --git a/parts/classview/classviewwidget.h b/parts/classview/classviewwidget.h new file mode 100644 index 00000000..0e9fa04b --- /dev/null +++ b/parts/classview/classviewwidget.h @@ -0,0 +1,414 @@ +/* + * Copyright (C) 2003 Roberto Raggi (roberto@kdevelop.org) + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Partially based on KDE Studio ClassListView http://www.thekompany.com/projects/kdestudio/ + */ + +#ifndef __CLASSVIEW_WIDGET_H__ +#define __CLASSVIEW_WIDGET_H__ + +#include +#include +#include +#include +#include +#include +#include +#include + +class KDevProject; +class ClassViewPart; +class ClassViewItem; +class FolderBrowserItem; +class NamespaceDomBrowserItem; +class ClassDomBrowserItem; +class TypeAliasDomBrowserItem; +class FunctionDomBrowserItem; +class VariableDomBrowserItem; +class KSelectAction; +class KToggleAction; + +class ClassViewWidget : public KListView, public QToolTip +{ + Q_OBJECT +public: + enum ViewMode + { + KDevelop3ViewMode = 0, + KDevelop2ViewMode, + JavaLikeViewMode + }; + +public: + ClassViewWidget( ClassViewPart *part ); + virtual ~ClassViewWidget(); + + int viewMode() const; + void setViewMode( int mode ); + + void clear(); + + bool selectItem(ItemDom item); + bool doFollowEditor(); + + inline TextPaintStyleStore& paintStyles() { + return m_paintStyles; + } + +private slots: + void slotNewClass(); + void slotAddMethod(); + void slotAddAttribute(); + void slotOpenDeclaration(); + void slotOpenImplementation(); + void slotCreateAccessMethods(); + void slotFollowEditor(); + +protected: + void contentsContextMenuEvent( QContextMenuEvent* ); + void maybeTip( QPoint const & ); + +private slots: + void slotProjectOpened(); + void slotProjectClosed(); + void refresh(); + void insertFile( const QString& fileName ); + void removeFile( const QString& fileName ); + void slotExecuted( QListViewItem* item ); + +private: + ClassViewPart* m_part; + QStringList removedText; + QString m_projectDirectory; + int m_projectDirectoryLength; + FolderBrowserItem* m_projectItem; + KSelectAction* m_actionViewMode; + KAction* m_actionNewClass; + KAction* m_actionAddMethod; + KAction* m_actionAddAttribute; + KAction* m_actionOpenDeclaration; + KAction* m_actionOpenImplementation; + KAction* m_actionCreateAccessMethods; + KToggleAction * m_actionFollowEditor; + bool m_doFollowEditor; + friend class ClassViewItem; + friend class FolderBrowserItem; + friend class NamespaceDomBrowserItem; + friend class ClassDomBrowserItem; + friend class TypeAliasDomBrowserItem; + friend class FunctionDomBrowserItem; + friend class VariableDomBrowserItem; + TextPaintStyleStore m_paintStyles; +}; + +class ClassViewItem: public FancyListViewItem +{ + private: +public: + ClassViewItem( QListView* parent, const QString& text=QString::null ) + : FancyListViewItem( static_cast( parent )->m_paintStyles, parent, text ) {} + ClassViewItem( QListViewItem* parent, const QString& text=QString::null ) + : FancyListViewItem( static_cast( parent->listView() )->m_paintStyles, parent, text ) {} + + virtual const CodeModelItem* model() const { return 0; } + + virtual bool isFolder() const { return false; } + virtual bool isFile() const { return false; } + virtual bool isNamespace() const { return false; } + virtual bool isClass() const { return false; } + virtual bool isFunction() const { return false; } + virtual bool isVariable() const { return false; } + virtual bool isTypeAlias() const { return false; } + + virtual bool hasDeclaration() const { return false; } + virtual bool hasImplementation() const { return false; } + + virtual void openDeclaration() {} + virtual void openImplementation() {} + + void select(); + + virtual QString comment(); + + ClassViewWidget* listView() { return static_cast( QListViewItem::listView() ); } + const ClassViewWidget* listView() const { return static_cast( QListViewItem::listView() ); } +}; + +class FolderBrowserItem: public ClassViewItem +{ +public: + FolderBrowserItem( ClassViewWidget* widget, QListView* parent, const QString& name=QString::null ) + : ClassViewItem( parent, name ), m_widget(widget) {} + FolderBrowserItem( ClassViewWidget* widget, QListViewItem* parent, const QString& name=QString::null ) + : ClassViewItem( parent, name ), m_widget(widget) {} + + virtual bool isFolder() const { return true; } + + void setup(); + QString key( int, bool ) const; + + void processFile( FileDom file, QStringList& path, bool remove=false ); + void processNamespace( NamespaceDom ns, bool remove=false ); + void processClass( ClassDom klass, bool remove=false ); + void processTypeAlias( TypeAliasDom typeAlias, bool remove=false ); + void processFunction( FunctionDom fun, bool remove=false ); + void processVariable( VariableDom var, bool remove=false ); + bool selectItem(ItemDom item); + +private: + QMap m_folders; + QMap m_namespaces; + QMap m_classes; + QMap m_typeAliases; + QMap m_functions; + QMap m_variables; + + ClassViewWidget* m_widget; +}; + +class NamespaceDomBrowserItem: public ClassViewItem +{ +public: + NamespaceDomBrowserItem( QListView* parent, NamespaceDom dom ) + : ClassViewItem( parent, dom->name() ), m_dom( dom ) {} + NamespaceDomBrowserItem( QListViewItem* parent, NamespaceDom dom ) + : ClassViewItem( parent, dom->name() ), m_dom( dom ) {} + + const CodeModelItem* model() const { return m_dom; } + + virtual bool isNamespace() const { return true; } + + void setup(); + QString key( int, bool ) const; + + void processNamespace( NamespaceDom ns, bool remove=false ); + void processClass( ClassDom klass, bool remove=false ); + void processTypeAlias( TypeAliasDom typeAlias, bool remove=false ); + void processFunction( FunctionDom fun, bool remove=false ); + void processVariable( VariableDom var, bool remove=false ); + bool selectItem( ItemDom item ); + virtual QString comment(); + + NamespaceDom dom() { return m_dom; } + +private: + NamespaceDom m_dom; + QMap m_namespaces; + QMap m_classes; + QMap m_typeAliases; + QMap m_functions; + QMap m_variables; +}; + +class ClassDomBrowserItem: public ClassViewItem +{ +public: + ClassDomBrowserItem( QListView* parent, ClassDom dom ) + : ClassViewItem( parent, dom->name() ), m_dom( dom ) {} + ClassDomBrowserItem( QListViewItem* parent, ClassDom dom ) + : ClassViewItem( parent, dom->name() ), m_dom( dom ) {} + + const CodeModelItem* model() const { return m_dom; } + virtual bool isClass() const { return true; } + + virtual bool hasDeclaration() const { return true; } + virtual void openDeclaration(); + + void setup(); + QString key( int, bool ) const; + + void processClass( ClassDom klass, bool remove=false ); + void processTypeAlias( TypeAliasDom typeAlias, bool remove=false ); + void processFunction( FunctionDom fun, bool remove=false ); + void processVariable( VariableDom var, bool remove=false ); + + virtual QString comment() { + if( !m_dom ) return ""; + return m_dom->comment(); + } + + bool selectItem(ItemDom item); + ClassDom dom() { return m_dom; } + +private: + ClassDom m_dom; + QMap m_classes; + QMap m_typeAliases; + QMap m_functions; + QMap m_variables; +}; + +class TypeAliasDomBrowserItem: public ClassViewItem +{ +public: + TypeAliasDomBrowserItem( QListView* parent, TypeAliasDom dom ) + : ClassViewItem( parent, dom->name() ), m_dom( dom ) {} + TypeAliasDomBrowserItem( QListViewItem* parent, TypeAliasDom dom ) + : ClassViewItem( parent, dom->name() ), m_dom( dom ) {} + + const CodeModelItem* model() const { return m_dom; } + virtual bool isTypeAlias() const { return true; } + + virtual bool hasDeclaration() const { return true; } + virtual void openDeclaration(); + + virtual QString comment() { + if( !m_dom ) return ""; + return m_dom->comment(); + } + + void setup(); + QString key( int, bool ) const; + + TypeAliasDom dom() { return m_dom; } + +private: + TypeAliasDom m_dom; +}; + +class FunctionDomBrowserItem: public ClassViewItem +{ +public: + FunctionDomBrowserItem( QListView* parent, FunctionDom dom ) + : ClassViewItem( parent, dom->name() ), m_dom( dom ) {} + FunctionDomBrowserItem( QListViewItem* parent, FunctionDom dom ) + : ClassViewItem( parent, dom->name() ), m_dom( dom ) {} + + const CodeModelItem* model() const { return m_dom; } + virtual bool isFunction() const { return true; } + + virtual bool hasDeclaration() const { return true; } + virtual bool hasImplementation() const; + + virtual void openDeclaration(); + virtual void openImplementation(); + + virtual QString comment() { + if( !m_dom ) return ""; + return m_dom->comment(); + } + + void setup(); + QString key( int, bool ) const; + + FunctionDom dom() { return m_dom; } + +private: + FunctionDom m_dom; +}; + +class VariableDomBrowserItem: public ClassViewItem +{ +public: + VariableDomBrowserItem( QListView* parent, VariableDom dom ) + : ClassViewItem( parent, dom->name() ), m_dom( dom ) {} + VariableDomBrowserItem( QListViewItem* parent, VariableDom dom ) + : ClassViewItem( parent, dom->name() ), m_dom( dom ) {} + + const CodeModelItem* model() const { return m_dom; } + virtual bool isVariable() const { return true; } + + virtual bool hasDeclaration() const { return true; } + virtual bool hasImplementation() const { return false; } + + virtual QString comment() { + if( !m_dom ) return ""; + return m_dom->comment(); + } + + virtual void openDeclaration(); + virtual void openImplementation(); + + void setup(); + QString key( int, bool ) const; + + VariableDom dom() { return m_dom; } + +private: + VariableDom m_dom; +}; + +struct FindOp2 ///a template would look nicer +{ + FindOp2( const FunctionDefinitionDom& dom ): m_dom( dom ) {} + + bool operator() ( const FunctionDom& def ) const + { + if( m_dom->name() != def->name() ) + return false; + + if( m_dom->isConstant() != m_dom->isConstant() ) + return false; + + QString scope1 = QString("::") + m_dom->scope().join("::"); + QString scope2 = QString("::") + def->scope().join("::"); + if( !scope1.endsWith(scope2) ) + return false; + + const ArgumentList args = m_dom->argumentList(); + const ArgumentList args2 = def->argumentList(); + if( args.size() != args2.size() ) + return false; + + for( uint i=0; itype() != args[i]->type() ) + return false; + } + + return true; + } + + private: + const FunctionDefinitionDom& m_dom; +}; + +struct FindOp +{ + FindOp( const FunctionDom& dom ): m_dom( dom ) {} + + bool operator() ( const FunctionDefinitionDom& def ) const + { + if( m_dom->name() != def->name() ) + return false; + + if( m_dom->isConstant() != m_dom->isConstant() ) + return false; + + QString scope1 = QString("::") + m_dom->scope().join("::"); + QString scope2 = QString("::") + def->scope().join("::"); + if( !scope1.endsWith(scope2) ) + return false; + + const ArgumentList args = m_dom->argumentList(); + const ArgumentList args2 = def->argumentList(); + if( args.size() != args2.size() ) + return false; + + for( uint i=0; itype() != args2[i]->type() ) + return false; + } + + return true; + } + +private: + const FunctionDom& m_dom; +}; + +#endif -- cgit v1.2.1