KDevelop API Documentation

parts/classview/viewcombos.cpp

Go to the documentation of this file.
00001 /* 00002 * Copyright (C) 2003 Alexander Dymo (cloudtemple@mksat.net) 00003 * 00004 * This program is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU General Public 00006 * License as published by the Free Software Foundation; either 00007 * version 2 of the License, or (at your option) any later version. 00008 * 00009 * This program is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Library General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU General Public License 00015 * along with this program; see the file COPYING. If not, write to 00016 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00017 * Boston, MA 02111-1307, USA. 00018 * 00019 */ 00020 #include <kiconloader.h> 00021 #include <klocale.h> 00022 #include <kdebug.h> 00023 00024 #include "klistviewaction.h" 00025 #include "kcomboview.h" 00026 00027 #include "viewcombos.h" 00028 #include "classviewpart.h" 00029 00030 NamespaceItem::NamespaceItem(ClassViewPart *part, QListView *parent, QString name, NamespaceDom dom) 00031 :QListViewItem(parent, name), m_dom(dom), m_part(part) 00032 { 00033 m_part->nsmap[m_dom->name()] = this; 00034 } 00035 00036 NamespaceItem::NamespaceItem(ClassViewPart *part, QListViewItem *parent, QString name, NamespaceDom dom) 00037 :QListViewItem(parent, name), m_dom(dom), m_part(part) 00038 { 00039 m_part->nsmap[m_dom->name()] = this; 00040 } 00041 00042 NamespaceItem::~ NamespaceItem( ) 00043 { 00044 m_part->nsmap.remove(m_dom->name()); 00045 } 00046 00047 NamespaceDom NamespaceItem::dom() const 00048 { 00049 return m_dom; 00050 } 00051 00052 void NamespaceItem::setup() 00053 { 00054 QListViewItem::setup(); 00055 setPixmap( 0, UserIcon("CVnamespace", KIcon::DefaultState, m_part->instance()) ); 00056 } 00057 00058 00059 ClassItem::ClassItem(ClassViewPart *part, QListView *parent, QString name, ClassDom dom) 00060 :QListViewItem(parent, name), m_dom(dom), m_part(part) 00061 { 00062 m_part->clmap[m_dom] = this; 00063 } 00064 00065 ClassItem::ClassItem(ClassViewPart *part, QListViewItem *parent, QString name, ClassDom dom) 00066 :QListViewItem(parent, name), m_dom(dom), m_part(part) 00067 { 00068 m_part->clmap[m_dom] = this; 00069 } 00070 00071 ClassItem::~ ClassItem( ) 00072 { 00073 m_part->clmap.remove(m_dom); 00074 } 00075 00076 ClassDom ClassItem::dom() const 00077 { 00078 return m_dom; 00079 } 00080 00081 void ClassItem::setup() 00082 { 00083 QListViewItem::setup(); 00084 setPixmap( 0, UserIcon("CVclass", KIcon::DefaultState, m_part->instance()) ); 00085 } 00086 00087 00088 FunctionItem::FunctionItem(ClassViewPart *part, QListView *parent, QString name, FunctionDom dom) 00089 :QListViewItem(parent, name), m_dom(dom), m_part(part) 00090 { 00091 m_part->fnmap[m_dom] = this; 00092 } 00093 00094 FunctionItem::FunctionItem(ClassViewPart *part, QListViewItem *parent, QString name, FunctionDom dom) 00095 :QListViewItem(parent, name), m_dom(dom), m_part(part) 00096 { 00097 m_part->fnmap[m_dom] = this; 00098 } 00099 00100 FunctionItem::~ FunctionItem( ) 00101 { 00102 m_part->fnmap.remove(m_dom); 00103 } 00104 00105 FunctionDom FunctionItem::dom() const 00106 { 00107 return m_dom; 00108 } 00109 00110 void FunctionItem::setup() 00111 { 00112 QListViewItem::setup(); 00113 QString iconName; 00114 if( m_dom->access() == CodeModelItem::Private ) 00115 iconName = "CVprivate_meth"; 00116 else if( m_dom->access() == CodeModelItem::Protected ) 00117 iconName = "CVprotected_meth"; 00118 else 00119 iconName = "CVpublic_meth"; 00120 setPixmap( 0, UserIcon(iconName, KIcon::DefaultState, m_part->instance()) ); 00121 } 00122 00123 00124 namespace ViewCombosOp{ 00125 00126 void refreshNamespaces(ClassViewPart *part, KComboView *view) 00127 { 00128 view->clear(); 00129 00130 part->global_item = new NamespaceItem( part, view->listView(), i18n("(Global Namespace)"), part->codeModel()->globalNamespace() ); 00131 view->addItem(part->global_item); 00132 part->global_item->setPixmap( 0, UserIcon("CVnamespace", KIcon::DefaultState, part->instance()) ); 00133 NamespaceList namespaces = part->codeModel()->globalNamespace()->namespaceList(); 00134 for (NamespaceList::const_iterator it = namespaces.begin(); it != namespaces.end(); ++it) 00135 { 00136 NamespaceItem *item = new NamespaceItem(part, view->listView(), part->languageSupport()->formatModelItem(*it), *it); 00137 view->addItem(item); 00138 item->setOpen(true); 00139 processNamespace(part, view, item); 00140 } 00141 view->setCurrentActiveItem(part->global_item); 00142 } 00143 00144 void refreshClasses(ClassViewPart *part, KComboView *view, const QString &dom) 00145 { 00146 view->clear(); 00147 00148 view->setCurrentText(EmptyClasses); 00149 NamespaceDom nsdom; 00150 if (dom == "::") 00151 nsdom = part->codeModel()->globalNamespace(); 00152 else 00153 { 00154 nsdom = namespaceByName(part->codeModel()->globalNamespace(), dom); 00155 if (!nsdom) 00156 return; 00157 } 00158 ClassList classes = nsdom->classList(); 00159 for (ClassList::const_iterator it = classes.begin(); it != classes.end(); ++it) 00160 { 00161 ClassItem *item = new ClassItem(part, view->listView(), part->languageSupport()->formatModelItem(*it), *it); 00162 view->addItem(item); 00163 item->setOpen(true); 00164 processClass(part, view, item); 00165 } 00166 } 00167 00168 void refreshFunctions(ClassViewPart *part, KComboView *view, const ClassDom & dom) 00169 { 00170 view->clear(); 00171 00172 view->setCurrentText(EmptyFunctions); 00173 FunctionList functions = dom->functionList(); 00174 for (FunctionList::const_iterator it = functions.begin(); it != functions.end(); ++it) 00175 { 00176 FunctionItem *item = new FunctionItem(part, view->listView(), part->languageSupport()->formatModelItem(*it, true), *it); 00177 view->addItem(item); 00178 item->setOpen(true); 00179 processFunction(part, view, item); 00180 } 00181 } 00182 00183 void refreshFunctions(ClassViewPart *part, KComboView *view, const QString & dom) 00184 { 00185 view->clear(); 00186 00187 view->setCurrentText(EmptyFunctions); 00188 NamespaceDom nsdom; 00189 if (dom == "::") 00190 nsdom = part->codeModel()->globalNamespace(); 00191 else 00192 { 00193 nsdom = namespaceByName(part->codeModel()->globalNamespace(), dom); 00194 if (!nsdom) 00195 return; 00196 } 00197 FunctionList functions = nsdom->functionList(); 00198 for (FunctionList::const_iterator it = functions.begin(); it != functions.end(); ++it) 00199 { 00200 FunctionItem *item = new FunctionItem(part, view->listView(), part->languageSupport()->formatModelItem(*it, true), *it); 00201 view->addItem(item); 00202 item->setOpen(true); 00203 processFunction(part, view, item); 00204 } 00205 } 00206 00207 void processNamespace( ClassViewPart *part, KComboView *view, NamespaceItem * item, ProcessType type ) 00208 { 00209 NamespaceDom baseDom = namespaceByName(part->codeModel()->globalNamespace(), item->dom()->name()); 00210 if (!baseDom) 00211 return; 00212 NamespaceList namespaces = baseDom->namespaceList(); 00213 for (NamespaceList::const_iterator it = namespaces.begin(); it != namespaces.end(); ++it) 00214 { 00215 kdDebug() << " processNamespace( for " << item->dom()->name() << endl; 00216 if ((type == ViewCombosOp::Refresh) && (part->nsmap.contains((*it)->name()))) 00217 { 00218 kdDebug() << " ok. refresh " << (*it)->name() << endl; 00219 NamespaceDom nsdom = *it; 00220 //namespace item exists - update 00221 NamespaceItem *ns = part->nsmap[nsdom->name()]; 00222 ns->setText(0, part->languageSupport()->formatModelItem(nsdom)); 00223 if (part->m_namespaces->view()->currentItem() == ns) 00224 { 00225 //reload this and dependent combos because namespace item is currently selected 00226 part->m_namespaces->view()->setCurrentText(part->languageSupport()->formatModelItem(nsdom)); 00227 00228 //check classes 00229 part->updateClassesForAdd(nsdom); 00230 //check functions 00231 part->updateFunctionsForAdd(model_cast<ClassDom>(nsdom)); 00232 } 00233 //refresh info about nested namespaces 00234 processNamespace(part, part->m_namespaces->view(), ns, ViewCombosOp::Refresh); 00235 00236 continue; 00237 } 00238 00239 kdDebug() << " ok. add " << (*it)->name() << endl; 00240 NamespaceItem *newitem = new NamespaceItem(part, item, part->languageSupport()->formatModelItem(*it, true), *it); 00241 view->addItem(newitem); 00242 newitem->setOpen(true); 00243 processNamespace(part, view, newitem); 00244 } 00245 } 00246 00247 void processClass( ClassViewPart *part, KComboView *view, ClassItem * item, ProcessType type ) 00248 { 00249 ClassList classes = item->dom()->classList(); 00250 for (ClassList::const_iterator it = classes.begin(); it != classes.end(); ++it) 00251 { 00252 if ((type == ViewCombosOp::Refresh) && (part->clmap.contains(*it))) 00253 { 00254 ClassDom cldom = *it; 00255 //class item exists - update 00256 ClassItem *cl = part->clmap[cldom]; 00257 cl->setText(0, part->languageSupport()->formatModelItem(cldom)); 00258 if (part->m_classes->view()->currentItem() == cl) 00259 { 00260 //reload this and dependent combos because class item is currently selected 00261 part->m_classes->view()->setCurrentText(part->languageSupport()->formatModelItem(cldom)); 00262 00263 //check functions 00264 part->updateFunctionsForAdd(cldom); 00265 } 00266 //refresh info about nested classes 00267 processClass(part, part->m_classes->view(), cl, ViewCombosOp::Refresh); 00268 00269 continue; 00270 } 00271 00272 ClassItem *newitem = new ClassItem(part, item, part->languageSupport()->formatModelItem(*it), *it); 00273 view->addItem(newitem); 00274 newitem->setOpen(true); 00275 processClass(part, view, newitem); 00276 } 00277 } 00278 00279 void processFunction( ClassViewPart* /*part*/, KComboView* /*view*/, FunctionItem* /*item*/, ProcessType /*type*/ ) 00280 { 00281 //@todo allow nested functions (adymo: Pascal has nested procedures and functions) 00282 /* FunctionList functions = item->dom()->functionList(); 00283 for (FunctionList::const_iterator it = functions.begin(); it != functions.end(); ++it) 00284 { 00285 FunctionItem *newitem = new FunctionItem(part, item, part->languageSupport()->formatModelItem(*it), *it); 00286 view->addItem(newitem); 00287 newitem->setOpen(true); 00288 processFunction(part, view, newitem); 00289 }*/ 00290 } 00291 00292 } 00293 00294 bool ViewCombosOp::removeNamespacesItems(ClassViewPart *part, QListView *view, const NamespaceDom &dom) 00295 { 00296 removeFunctionItems(part, view, model_cast<ClassDom>(dom)); 00297 removeClassItems(part, view, model_cast<ClassDom>(dom)); 00298 00299 bool result = false; 00300 00301 NamespaceList nl = dom->namespaceList(); 00302 for (NamespaceList::const_iterator it = nl.begin(); it != nl.end(); ++it) 00303 { 00304 result = result || removeNamespacesItems(part, view, *it); 00305 NamespaceDom nsd = *it; 00306 if ( (part->nsmap.contains((*it)->name())) && (part->nsmap[(*it)->name()] != 0) ) 00307 result = true; 00308 } 00309 return result; 00310 } 00311 00312 void ViewCombosOp::removeClassItems( ClassViewPart * part, QListView * view, const ClassDom & dom ) 00313 { 00314 removeFunctionItems(part, view, dom); 00315 00316 ClassList cl = dom->classList(); 00317 for (ClassList::const_iterator it = cl.begin(); it != cl.end(); ++it) 00318 { 00319 removeClassItems(part, view, *it); 00320 if ( (part->clmap.contains(*it)) && (part->clmap[*it] != 0) ) 00321 part->m_classes->view()->removeItem(part->clmap[*it]); 00322 } 00323 } 00324 00325 void ViewCombosOp::removeFunctionItems( ClassViewPart * part, QListView * /*view*/, const ClassDom & dom ) 00326 { 00327 FunctionList fl = dom->functionList(); 00328 for (FunctionList::const_iterator it = fl.begin(); it != fl.end(); ++it) 00329 { 00330 if ( (part->fnmap.contains(*it)) && (part->fnmap[*it] != 0) ) 00331 part->m_functions->view()->removeItem(part->fnmap[*it]); 00332 } 00333 } 00334 00335 NamespaceDom ViewCombosOp::namespaceByName( NamespaceDom dom, QString name ) 00336 { 00337 NamespaceDom result; 00338 00339 result = dom->namespaceByName(name); 00340 if (!result) 00341 { 00342 NamespaceList nslist = dom->namespaceList(); 00343 for (NamespaceList::const_iterator it = nslist.begin(); it != nslist.end(); ++it) 00344 { 00345 result = namespaceByName(*it, name); 00346 if (result) 00347 break; 00348 } 00349 } 00350 return result; 00351 } 00352
KDE Logo
This file is part of the documentation for KDevelop Version 3.0.4.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Oct 6 17:39:10 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003