/mks-svn4458/qCtagsSense/src/qCtagsSenseUtils.cpp

# · C++ · 650 lines · 542 code · 79 blank · 29 comment · 26 complexity · 1a49d021aebc84190c39135dc04ce192 MD5 · raw file

  1. /****************************************************************************
  2. Copyright (C) 2005 - 2011 Filipe AZEVEDO & The Monkey Studio Team
  3. http://monkeystudio.org licensing under the GNU GPL.
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  15. ****************************************************************************/
  16. #include "qCtagsSenseUtils.h"
  17. #include "qCtagsSense.h"
  18. #include <QCoreApplication>
  19. #include <QVariant>
  20. // Fileds
  21. /*
  22. flags: "afmikKlnsStz") [fks].
  23. */
  24. namespace qCtagsSenseUtils
  25. {
  26. typedef QPair<QChar, qCtagsSense::Kind> CharKindPair; // kind char, kind enum
  27. typedef QList<CharKindPair> CharKindPairList;
  28. QMap<qCtagsSense::Kind, QString> mKindText;
  29. QMap<QString, CharKindPairList> mLanguageChars; // language, list of pair of char/kind
  30. QMap<QString, qCtagsSense::Kind> mKindStrings; // kind string, kind enum
  31. QMap<QString, QPixmap> mPixmaps;
  32. };
  33. void qCtagsSenseUtils::initMaps()
  34. {
  35. if ( mLanguageChars.isEmpty() )
  36. {
  37. // language kinds
  38. CharKindPairList asmList = CharKindPairList()
  39. << CharKindPair( 'd', qCtagsSense::Define )
  40. << CharKindPair( 'l', qCtagsSense::Label )
  41. << CharKindPair( 'm', qCtagsSense::Macro )
  42. << CharKindPair( 't', qCtagsSense::Type );
  43. CharKindPairList aspList = CharKindPairList()
  44. << CharKindPair( 'c', qCtagsSense::Constant )
  45. << CharKindPair( 'f', qCtagsSense::Function )
  46. << CharKindPair( 's', qCtagsSense::SubRoutine )
  47. << CharKindPair( 'v', qCtagsSense::Variable );
  48. CharKindPairList awkList = CharKindPairList()
  49. << CharKindPair( 'f', qCtagsSense::Function );
  50. CharKindPairList basicList = CharKindPairList()
  51. << CharKindPair( 'c', qCtagsSense::Constant )
  52. << CharKindPair( 'f', qCtagsSense::Function )
  53. << CharKindPair( 'l', qCtagsSense::Label )
  54. << CharKindPair( 't', qCtagsSense::Type )
  55. << CharKindPair( 'v', qCtagsSense::Variable )
  56. << CharKindPair( 'g', qCtagsSense::Enumeration );
  57. CharKindPairList betaList = CharKindPairList()
  58. << CharKindPair( 'f', qCtagsSense::Fragment )
  59. << CharKindPair( 'p', qCtagsSense::AllPatterns ) // off
  60. << CharKindPair( 's', qCtagsSense::Slot )
  61. << CharKindPair( 'v', qCtagsSense::Pattern );
  62. CharKindPairList cList = CharKindPairList()
  63. << CharKindPair( 'c', qCtagsSense::Class )
  64. << CharKindPair( 'd', qCtagsSense::Macro )
  65. << CharKindPair( 'e', qCtagsSense::Enumerator )
  66. << CharKindPair( 'f', qCtagsSense::Function )
  67. << CharKindPair( 'g', qCtagsSense::Enumeration )
  68. << CharKindPair( 'l', qCtagsSense::VariableLocal ) // off
  69. << CharKindPair( 'm', qCtagsSense::Member )
  70. << CharKindPair( 'n', qCtagsSense::Namespace )
  71. << CharKindPair( 'p', qCtagsSense::Prototype ) // off
  72. << CharKindPair( 's', qCtagsSense::Structure )
  73. << CharKindPair( 't', qCtagsSense::Typedef )
  74. << CharKindPair( 'u', qCtagsSense::Union )
  75. << CharKindPair( 'v', qCtagsSense::Variable )
  76. << CharKindPair( 'x', qCtagsSense::VariableGlobal ); // off
  77. CharKindPairList cppList = CharKindPairList()
  78. << CharKindPair( 'c', qCtagsSense::Class )
  79. << CharKindPair( 'd', qCtagsSense::Macro )
  80. << CharKindPair( 'e', qCtagsSense::Enumerator )
  81. << CharKindPair( 'f', qCtagsSense::Function )
  82. << CharKindPair( 'g', qCtagsSense::Enumeration )
  83. << CharKindPair( 'l', qCtagsSense::VariableLocal ) // off
  84. << CharKindPair( 'm', qCtagsSense::Member )
  85. << CharKindPair( 'n', qCtagsSense::Namespace )
  86. << CharKindPair( 'p', qCtagsSense::Prototype ) // off
  87. << CharKindPair( 's', qCtagsSense::Structure )
  88. << CharKindPair( 't', qCtagsSense::Typedef )
  89. << CharKindPair( 'u', qCtagsSense::Union )
  90. << CharKindPair( 'v', qCtagsSense::Variable )
  91. << CharKindPair( 'x', qCtagsSense::VariableGlobal ); // off
  92. CharKindPairList csharpList = CharKindPairList()
  93. << CharKindPair( 'c', qCtagsSense::Class )
  94. << CharKindPair( 'd', qCtagsSense::Macro )
  95. << CharKindPair( 'e', qCtagsSense::Enumerator )
  96. << CharKindPair( 'E', qCtagsSense::Event )
  97. << CharKindPair( 'f', qCtagsSense::Field )
  98. << CharKindPair( 'g', qCtagsSense::Enumeration )
  99. << CharKindPair( 'i', qCtagsSense::Interface )
  100. << CharKindPair( 'l', qCtagsSense::VariableLocal ) // off
  101. << CharKindPair( 'm', qCtagsSense::Method )
  102. << CharKindPair( 'n', qCtagsSense::Namespace )
  103. << CharKindPair( 'p', qCtagsSense::Property )
  104. << CharKindPair( 's', qCtagsSense::Structure )
  105. << CharKindPair( 't', qCtagsSense::Typedef );
  106. CharKindPairList cobolList = CharKindPairList()
  107. << CharKindPair( 'd', qCtagsSense::ItemData )
  108. << CharKindPair( 'f', qCtagsSense::FileDescriptor )
  109. << CharKindPair( 'g', qCtagsSense::ItemGroup )
  110. << CharKindPair( 'p', qCtagsSense::Paragraph )
  111. << CharKindPair( 'P', qCtagsSense::ProgramId )
  112. << CharKindPair( 's', qCtagsSense::Section );
  113. CharKindPairList eiffelList = CharKindPairList()
  114. << CharKindPair( 'c', qCtagsSense::Class )
  115. << CharKindPair( 'f', qCtagsSense::Feature )
  116. << CharKindPair( 'l', qCtagsSense::VariableLocal ); // off
  117. CharKindPairList erlangList = CharKindPairList()
  118. << CharKindPair( 'd', qCtagsSense::Macro )
  119. << CharKindPair( 'f', qCtagsSense::Function )
  120. << CharKindPair( 'm', qCtagsSense::Module )
  121. << CharKindPair( 'r', qCtagsSense::Record );
  122. CharKindPairList fortranList = CharKindPairList()
  123. << CharKindPair( 'b', qCtagsSense::BlockData )
  124. << CharKindPair( 'c', qCtagsSense::BlockCommon )
  125. << CharKindPair( 'e', qCtagsSense::EntryPoint )
  126. << CharKindPair( 'f', qCtagsSense::Function )
  127. << CharKindPair( 'i', qCtagsSense::Interface ) // off
  128. << CharKindPair( 'k', qCtagsSense::Type )
  129. << CharKindPair( 'l', qCtagsSense::Label )
  130. << CharKindPair( 'L', qCtagsSense::VariableLocal ) // off
  131. << CharKindPair( 'm', qCtagsSense::Module )
  132. << CharKindPair( 'n', qCtagsSense::NameList )
  133. << CharKindPair( 'p', qCtagsSense::Program )
  134. << CharKindPair( 's', qCtagsSense::SubRoutine )
  135. << CharKindPair( 't', qCtagsSense::DerivatedType )
  136. << CharKindPair( 'v', qCtagsSense::Variable );
  137. CharKindPairList htmlList = CharKindPairList()
  138. << CharKindPair( 'a', qCtagsSense::Anchor )
  139. << CharKindPair( 'f', qCtagsSense::JavaScriptFunction );
  140. CharKindPairList javaList = CharKindPairList()
  141. << CharKindPair( 'c', qCtagsSense::Class )
  142. << CharKindPair( 'e', qCtagsSense::Enumeration )
  143. << CharKindPair( 'f', qCtagsSense::Field )
  144. << CharKindPair( 'g', qCtagsSense::EnumType )
  145. << CharKindPair( 'i', qCtagsSense::Interface )
  146. << CharKindPair( 'l', qCtagsSense::VariableLocal ) // off
  147. << CharKindPair( 'm', qCtagsSense::Method )
  148. << CharKindPair( 'p', qCtagsSense::Package );
  149. CharKindPairList javascriptList = CharKindPairList()
  150. << CharKindPair( 'f', qCtagsSense::Function )
  151. << CharKindPair( 'c', qCtagsSense::Class )
  152. << CharKindPair( 'm', qCtagsSense::Method )
  153. << CharKindPair( 'v', qCtagsSense::VariableGlobal );
  154. CharKindPairList lispList = CharKindPairList()
  155. << CharKindPair( 'f', qCtagsSense::Function );
  156. CharKindPairList luaList = CharKindPairList()
  157. << CharKindPair( 'f', qCtagsSense::Function );
  158. CharKindPairList makeList = CharKindPairList()
  159. << CharKindPair( 'm', qCtagsSense::Macro );
  160. CharKindPairList pascalList = CharKindPairList()
  161. << CharKindPair( 'f', qCtagsSense::Function )
  162. << CharKindPair( 'p', qCtagsSense::Procedure );
  163. CharKindPairList perlList = CharKindPairList()
  164. << CharKindPair( 'c', qCtagsSense::Constant )
  165. << CharKindPair( 'f', qCtagsSense::Format )
  166. << CharKindPair( 'l', qCtagsSense::Label )
  167. << CharKindPair( 'p', qCtagsSense::Package )
  168. << CharKindPair( 's', qCtagsSense::SubRoutine )
  169. << CharKindPair( 'd', qCtagsSense::SubRoutineDeclaration ); // off
  170. CharKindPairList phpList = CharKindPairList()
  171. << CharKindPair( 'c', qCtagsSense::Class )
  172. << CharKindPair( 'i', qCtagsSense::Interface )
  173. << CharKindPair( 'd', qCtagsSense::Constant )
  174. << CharKindPair( 'f', qCtagsSense::Function )
  175. << CharKindPair( 'v', qCtagsSense::Variable )
  176. << CharKindPair( 'j', qCtagsSense::JavaScriptFunction );
  177. CharKindPairList pythonList = CharKindPairList()
  178. << CharKindPair( 'c', qCtagsSense::Class )
  179. << CharKindPair( 'f', qCtagsSense::Function )
  180. << CharKindPair( 'm', qCtagsSense::Member );
  181. CharKindPairList rexxList = CharKindPairList()
  182. << CharKindPair( 's', qCtagsSense::SubRoutine );
  183. CharKindPairList rubyList = CharKindPairList()
  184. << CharKindPair( 'c', qCtagsSense::Class )
  185. << CharKindPair( 'f', qCtagsSense::Method )
  186. << CharKindPair( 'm', qCtagsSense::Module )
  187. << CharKindPair( 'F', qCtagsSense::MethodSingleton );
  188. CharKindPairList schemeList = CharKindPairList()
  189. << CharKindPair( 'f', qCtagsSense::Function )
  190. << CharKindPair( 's', qCtagsSense::Set );
  191. CharKindPairList shList = CharKindPairList()
  192. << CharKindPair( 'f', qCtagsSense::Function );
  193. CharKindPairList slangList = CharKindPairList()
  194. << CharKindPair( 'f', qCtagsSense::Function )
  195. << CharKindPair( 'n', qCtagsSense::Namespace );
  196. CharKindPairList smlList = CharKindPairList()
  197. << CharKindPair( 'e', qCtagsSense::Exception )
  198. << CharKindPair( 'f', qCtagsSense::Function )
  199. << CharKindPair( 'c', qCtagsSense::Functor )
  200. << CharKindPair( 's', qCtagsSense::Signature )
  201. << CharKindPair( 'r', qCtagsSense::Structure )
  202. << CharKindPair( 't', qCtagsSense::Type )
  203. << CharKindPair( 'v', qCtagsSense::ValueBinding );
  204. CharKindPairList sqlList = CharKindPairList()
  205. << CharKindPair( 'c', qCtagsSense::Cursor )
  206. << CharKindPair( 'd', qCtagsSense::Prototype ) // off
  207. << CharKindPair( 'f', qCtagsSense::Function )
  208. << CharKindPair( 'F', qCtagsSense::Field )
  209. << CharKindPair( 'l', qCtagsSense::VariableLocal ) // off
  210. << CharKindPair( 'L', qCtagsSense::Label )
  211. << CharKindPair( 'P', qCtagsSense::Package )
  212. << CharKindPair( 'p', qCtagsSense::Procedure )
  213. << CharKindPair( 'r', qCtagsSense::Record )
  214. << CharKindPair( 's', qCtagsSense::SubType )
  215. << CharKindPair( 't', qCtagsSense::Table )
  216. << CharKindPair( 'T', qCtagsSense::Trigger )
  217. << CharKindPair( 'v', qCtagsSense::Variable )
  218. << CharKindPair( 'i', qCtagsSense::Index )
  219. << CharKindPair( 'e', qCtagsSense::Event )
  220. << CharKindPair( 'U', qCtagsSense::Publication )
  221. << CharKindPair( 'R', qCtagsSense::Service )
  222. << CharKindPair( 'D', qCtagsSense::Domain )
  223. << CharKindPair( 'V', qCtagsSense::View )
  224. << CharKindPair( 'n', qCtagsSense::Synonym )
  225. << CharKindPair( 'x', qCtagsSense::MobiLinkTableScript )
  226. << CharKindPair( 'y', qCtagsSense::MobiLinkConnScript );
  227. CharKindPairList tclList = CharKindPairList()
  228. << CharKindPair( 'c', qCtagsSense::Class )
  229. << CharKindPair( 'm', qCtagsSense::Method )
  230. << CharKindPair( 'p', qCtagsSense::Procedure );
  231. CharKindPairList veraList = CharKindPairList()
  232. << CharKindPair( 'c', qCtagsSense::Class )
  233. << CharKindPair( 'd', qCtagsSense::Macro )
  234. << CharKindPair( 'e', qCtagsSense::Enumerator )
  235. << CharKindPair( 'f', qCtagsSense::Function )
  236. << CharKindPair( 'g', qCtagsSense::Enumeration )
  237. << CharKindPair( 'l', qCtagsSense::VariableLocal )
  238. << CharKindPair( 'm', qCtagsSense::Member )
  239. << CharKindPair( 'p', qCtagsSense::Program )
  240. << CharKindPair( 'P', qCtagsSense::Prototype )
  241. << CharKindPair( 't', qCtagsSense::Task )
  242. << CharKindPair( 'T', qCtagsSense::Typedef )
  243. << CharKindPair( 'v', qCtagsSense::Variable )
  244. << CharKindPair( 'x', qCtagsSense::VariableGlobal );
  245. CharKindPairList verilogList = CharKindPairList()
  246. << CharKindPair( 'c', qCtagsSense::Constant )
  247. << CharKindPair( 'e', qCtagsSense::Event )
  248. << CharKindPair( 'f', qCtagsSense::Function )
  249. << CharKindPair( 'm', qCtagsSense::Module )
  250. << CharKindPair( 'n', qCtagsSense::NetDataType )
  251. << CharKindPair( 'p', qCtagsSense::Port )
  252. << CharKindPair( 'r', qCtagsSense::RegisterDataType )
  253. << CharKindPair( 't', qCtagsSense::Task );
  254. CharKindPairList vimList = CharKindPairList()
  255. << CharKindPair( 'a', qCtagsSense::AutoCommandGroup )
  256. << CharKindPair( 'c', qCtagsSense::UserDefinedCommand )
  257. << CharKindPair( 'f', qCtagsSense::Function )
  258. << CharKindPair( 'm', qCtagsSense::Map )
  259. << CharKindPair( 'v', qCtagsSense::Variable );
  260. CharKindPairList yaccList = CharKindPairList()
  261. << CharKindPair( 'l', qCtagsSense::Label );
  262. // fill language kinds map
  263. mLanguageChars[ "Asm" ] = asmList;
  264. mLanguageChars[ "Asp" ] = aspList;
  265. mLanguageChars[ "Awk" ] = awkList;
  266. mLanguageChars[ "Basic" ] = basicList;
  267. mLanguageChars[ "BETA" ] = betaList;
  268. mLanguageChars[ "C" ] = cList;
  269. mLanguageChars[ "C++" ] = cppList;
  270. mLanguageChars[ "C#" ] = csharpList;
  271. mLanguageChars[ "Cobol" ] = cobolList;
  272. mLanguageChars[ "Eiffel" ] = eiffelList;
  273. mLanguageChars[ "Erlang" ] = erlangList;
  274. mLanguageChars[ "Fortran" ] = fortranList;
  275. mLanguageChars[ "HTML" ] = htmlList;
  276. mLanguageChars[ "Java" ] = javaList;
  277. mLanguageChars[ "JavaScript" ] = javascriptList;
  278. mLanguageChars[ "Lisp" ] = lispList;
  279. mLanguageChars[ "Lua" ] = luaList;
  280. mLanguageChars[ "Make" ] = makeList;
  281. mLanguageChars[ "Pascal" ] = pascalList;
  282. mLanguageChars[ "Perl" ] = perlList;
  283. mLanguageChars[ "PHP" ] = phpList;
  284. mLanguageChars[ "Python" ] = pythonList;
  285. mLanguageChars[ "REXX" ] = rexxList;
  286. mLanguageChars[ "Ruby" ] = rubyList;
  287. mLanguageChars[ "Scheme" ] = schemeList;
  288. mLanguageChars[ "Sh" ] = shList;
  289. mLanguageChars[ "SLang" ] = slangList;
  290. mLanguageChars[ "SML" ] = smlList;
  291. mLanguageChars[ "SQL" ] = sqlList;
  292. mLanguageChars[ "Tcl" ] = tclList;
  293. mLanguageChars[ "Vera" ] = veraList;
  294. mLanguageChars[ "Verilog" ] = verilogList;
  295. mLanguageChars[ "Vim" ] = vimList;
  296. mLanguageChars[ "YACC" ] = yaccList;
  297. // kind strings
  298. mKindStrings[ "class" ] = qCtagsSense::Class;
  299. mKindStrings[ "enum" ] = qCtagsSense::Enumeration;
  300. mKindStrings[ "function" ] = qCtagsSense::Function;
  301. mKindStrings[ "namespace" ] = qCtagsSense::Namespace;
  302. mKindStrings[ "struct" ] = qCtagsSense::Structure;
  303. mKindStrings[ "union" ] = qCtagsSense::Union;
  304. // kind text
  305. mKindText[ qCtagsSense::Class ] = QCoreApplication::translate( "qCtagsSense", "Class" );
  306. mKindText[ qCtagsSense::Macro ] = QCoreApplication::translate( "qCtagsSense", "Macro" );
  307. mKindText[ qCtagsSense::Enumerator ] = QCoreApplication::translate( "qCtagsSense", "Enumerator" );
  308. mKindText[ qCtagsSense::Function ] = QCoreApplication::translate( "qCtagsSense", "Function" );
  309. mKindText[ qCtagsSense::Enumeration ] = QCoreApplication::translate( "qCtagsSense", "Enum" );
  310. mKindText[ qCtagsSense::VariableLocal ] = QCoreApplication::translate( "qCtagsSense", "Local Variable" );
  311. mKindText[ qCtagsSense::Member ] = QCoreApplication::translate( "qCtagsSense", "Member" );
  312. mKindText[ qCtagsSense::Namespace ] = QCoreApplication::translate( "qCtagsSense", "Namespace" );
  313. mKindText[ qCtagsSense::Prototype ] = QCoreApplication::translate( "qCtagsSense", "Prototype" );
  314. mKindText[ qCtagsSense::Structure ] = QCoreApplication::translate( "qCtagsSense", "Structure" );
  315. mKindText[ qCtagsSense::Typedef ] = QCoreApplication::translate( "qCtagsSense", "Typedef" );
  316. mKindText[ qCtagsSense::Union ] = QCoreApplication::translate( "qCtagsSense", "Union" );
  317. mKindText[ qCtagsSense::Variable ] = QCoreApplication::translate( "qCtagsSense", "Variable" );
  318. mKindText[ qCtagsSense::VariableGlobal ] = QCoreApplication::translate( "qCtagsSense", "Extern Variable" );
  319. mKindText[ qCtagsSense::Unknow ] = QCoreApplication::translate( "qCtagsSense", "Unknow" );
  320. }
  321. }
  322. qCtagsSense::Kind qCtagsSenseUtils::kindType( const QChar& c, const QString& language )
  323. {
  324. const CharKindPairList kinds = mLanguageChars.value( language );
  325. foreach ( const CharKindPair& pair, kinds )
  326. {
  327. if ( c == pair.first )
  328. {
  329. return pair.second;
  330. }
  331. }
  332. return qCtagsSense::Unknow;
  333. }
  334. qCtagsSense::Kind qCtagsSenseUtils::kindType( const QString& string )
  335. {
  336. return mKindStrings.value( string, qCtagsSense::Unknow );
  337. }
  338. QChar qCtagsSenseUtils::kindChar( qCtagsSense::Kind kind, const QString& language )
  339. {
  340. const CharKindPairList kinds = mLanguageChars.value( language );
  341. foreach ( const CharKindPair& pair, kinds )
  342. {
  343. if ( kind == pair.second )
  344. {
  345. return pair.first;
  346. }
  347. }
  348. return QChar();
  349. }
  350. QString qCtagsSenseUtils::kindText( qCtagsSense::Kind kind )
  351. {
  352. return mKindText.value( kind, "Unknow kind - please update the map" );
  353. }
  354. QString qCtagsSenseUtils::kindText( const QChar& c, const QString& language )
  355. {
  356. return kindText( kindType( c, language ) );
  357. }
  358. bool qCtagsSenseUtils::caseInsensitiveFilePathLessThan( const QString& s1, const QString& s2 )
  359. {
  360. return QFileInfo( s1 ).fileName().toLower() < QFileInfo( s2 ).fileName().toLower();
  361. }
  362. qCtagsSenseEntry* qCtagsSenseUtils::entryForRecord( const QSqlRecord& rec, const QString& fileName )
  363. {
  364. qCtagsSenseEntry* entry = new qCtagsSenseEntry;
  365. entry->fileName = fileName.isEmpty() ? rec.value( "fileName" ).toString() : fileName;
  366. entry->language = rec.value( "language" ).toString();
  367. entry->lineNumberEntry = rec.value( "line_number_entry" ).toBool();
  368. entry->lineNumber = rec.value( "line_number" ).value<ulong>();
  369. entry->isFileScope = rec.value( "is_file_scope" ).toBool();
  370. entry->isFileEntry = rec.value( "is_file_entry" ).toBool();
  371. entry->truncateLine = rec.value( "truncate_line" ).toBool();
  372. entry->name = rec.value( "name" ).toString();
  373. entry->kind = (qCtagsSense::Kind)rec.value( "kind" ).toInt();
  374. // extended fields
  375. entry->access = rec.value( "access" ).toString();
  376. entry->fileScope = rec.value( "file_scope" ).toString();
  377. entry->implementation = rec.value( "implementation" ).toString();
  378. entry->inheritance = rec.value( "inheritance" ).toString();
  379. entry->scope.first = rec.value( "scope_value" ).toString();
  380. entry->scope.second = rec.value( "scope_key" ).toString();
  381. entry->signature = rec.value( "signature" ).toString();
  382. entry->typeRef.first = rec.value( "type" ).toString();
  383. entry->typeRef.second = rec.value( "type_name" ).toString();
  384. return entry;
  385. }
  386. QString qCtagsSenseUtils::entryDecorationFilePath( const qCtagsSenseEntry* entry )
  387. {
  388. qCtagsSense::Kind kind = entry->kind;
  389. QString access = entry->access;
  390. QString name;
  391. if ( access == "public" )
  392. {
  393. access.clear();
  394. }
  395. switch ( kind )
  396. {
  397. case qCtagsSense::Class:
  398. name = "class";
  399. access.clear();
  400. break;
  401. case qCtagsSense::Macro:
  402. name = "macro";
  403. access.clear();
  404. break;
  405. case qCtagsSense::Enumerator:
  406. name = "enumerator";
  407. access.clear();
  408. break;
  409. case qCtagsSense::Function:
  410. case qCtagsSense::Prototype:
  411. name = "function";
  412. break;
  413. case qCtagsSense::Enumeration:
  414. name = "enum";
  415. access.clear();
  416. break;
  417. case qCtagsSense::VariableLocal:
  418. case qCtagsSense::Member:
  419. case qCtagsSense::Variable:
  420. case qCtagsSense::VariableGlobal:
  421. name = "variable";
  422. break;
  423. case qCtagsSense::Namespace:
  424. name = "namespace";
  425. access.clear();
  426. break;
  427. case qCtagsSense::Structure:
  428. name = "structure";
  429. access.clear();
  430. break;
  431. case qCtagsSense::Typedef:
  432. name = "typedef";
  433. access.clear();
  434. break;
  435. case qCtagsSense::Union:
  436. name = "union";
  437. break;
  438. case qCtagsSense::Unknow:
  439. name = "unknow";
  440. break;
  441. default:
  442. #ifdef Q_CC_MSVC
  443. #pragma message("handle all enumerator")
  444. #else
  445. #warning handle all enumerator
  446. #endif
  447. break;
  448. }
  449. QString fn = name;
  450. if ( !access.isEmpty() )
  451. {
  452. fn += "_" +access;
  453. }
  454. fn += ".png";
  455. fn = QString( ":/icons/%1" ).arg( fn );
  456. //qWarning() << fn;
  457. if ( !mPixmaps.contains( fn ) )
  458. {
  459. mPixmaps[ fn ] = QPixmap( fn );
  460. }
  461. return fn;
  462. }
  463. QPixmap qCtagsSenseUtils::entryDecoration( const qCtagsSenseEntry* entry )
  464. {
  465. return mPixmaps.value( entryDecorationFilePath( entry ) );
  466. }
  467. QString qCtagsSenseUtils::entryDisplay( const qCtagsSenseEntry* entry )
  468. {
  469. qCtagsSenseEntry* parent = entry->parent;
  470. qCtagsSenseEntry* granParent = parent ? parent->parent : 0;
  471. QString display = entry->name;
  472. if ( !granParent )
  473. {
  474. if ( !entry->scope.second.isEmpty() )
  475. {
  476. display.prepend( QString( "%1::" ).arg( entry->scope.second ) );
  477. }
  478. }
  479. switch ( entry->kind )
  480. {
  481. case qCtagsSense::Function:
  482. case qCtagsSense::Prototype:
  483. //display.append( entry->signature );
  484. break;
  485. case qCtagsSense::VariableLocal:
  486. case qCtagsSense::Member:
  487. case qCtagsSense::Variable:
  488. case qCtagsSense::VariableGlobal:
  489. if ( !entry->typeRef.first.isEmpty() )
  490. {
  491. display.append( QString( ": %1" ).arg( entry->typeRef.first ) );
  492. }
  493. break;
  494. case qCtagsSense::Class:
  495. case qCtagsSense::Structure:
  496. case qCtagsSense::Union:
  497. case qCtagsSense::Macro:
  498. case qCtagsSense::Enumerator:
  499. case qCtagsSense::Enumeration:
  500. case qCtagsSense::Namespace:
  501. case qCtagsSense::Typedef:
  502. case qCtagsSense::Unknow:
  503. break;
  504. default:
  505. #ifdef Q_CC_MSVC
  506. #pragma message("handle all enumerator")
  507. #else
  508. #warning handle all enumerator
  509. #endif
  510. break;
  511. }
  512. return display;
  513. }
  514. QString qCtagsSenseUtils::entryToolTip( const qCtagsSenseEntry* entry )
  515. {
  516. QString tooltip;
  517. tooltip += QString( "<b>*** %1 %2</b><br />(<u>%3:%4</u>)<br />" )
  518. .arg( QString( "<img src=\"%1\" /> " ).arg( entryDecorationFilePath( entry ) ) )
  519. .arg( kindText( entry->kind ) )
  520. .arg( QFileInfo( entry->fileName ).fileName() )
  521. .arg( entry->lineNumber +1 );
  522. if ( !entry->inheritance.isEmpty() )
  523. {
  524. tooltip += QString( "<i>Inherits:</i> %1<br />" ).arg( entry->inheritance );
  525. }
  526. if ( !entry->access.isEmpty() )
  527. {
  528. tooltip += QString( "<i>[%1]</i> " ).arg( entry->access );
  529. }
  530. if ( !entry->implementation.isEmpty() )
  531. {
  532. tooltip += QString( "<i>[%1]</i> " ).arg( entry->implementation );
  533. }
  534. if ( !entry->typeRef.first.isEmpty() )
  535. {
  536. tooltip += QString( "<u><i>%1</i></u> " ).arg( entry->typeRef.first );
  537. }
  538. if ( !entry->typeRef.second.isEmpty() )
  539. {
  540. tooltip += QString( "%1 " ).arg( entry->typeRef.second );
  541. }
  542. if ( entry->scope.second.isEmpty() )
  543. {
  544. tooltip += entry->name;
  545. }
  546. else
  547. {
  548. tooltip += QString( "%1::%2" ).arg( entry->scope.second ).arg( entry->name );
  549. }
  550. tooltip += QString( "<i><b>%1</b></i>" ).arg( entry->signature );
  551. return tooltip;
  552. }
  553. QFileInfoList qCtagsSenseUtils::getFiles( QDir fromDir, const QStringList& filters, bool recursive )
  554. {
  555. QFileInfoList files;
  556. foreach ( QFileInfo file, fromDir.entryInfoList( QDir::AllEntries | QDir::AllDirs | QDir::NoDotAndDotDot, QDir::DirsFirst | QDir::Name ) )
  557. {
  558. if ( file.isFile() && ( filters.isEmpty() || QDir::match( filters, file.fileName() ) ) )
  559. files << file;
  560. else if ( file.isDir() && recursive )
  561. {
  562. fromDir.cd( file.filePath() );
  563. files << getFiles( fromDir, filters, recursive );
  564. fromDir.cdUp();
  565. }
  566. }
  567. return files;
  568. }