File indexing completed on 2024-05-12 04:37:44

0001 /*
0002     SPDX-FileCopyrightText: 2007-2008 David Nolden <david.nolden.kdevelop@art-master.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef KDEVPLATFORM_ABSTRACTINCLUDEFILECOMPLETIONITEM_H
0008 #define KDEVPLATFORM_ABSTRACTINCLUDEFILECOMPLETIONITEM_H
0009 
0010 #include "codecompletionitem.h"
0011 #include <language/languageexport.h>
0012 #include "../util/includeitem.h"
0013 #include "../duchain/duchain.h"
0014 #include "../duchain/duchainlock.h"
0015 #include "codecompletionmodel.h"
0016 
0017 namespace KDevelop {
0018 //A completion item used for completing include-files
0019 template <typename NavigationWidget>
0020 class AbstractIncludeFileCompletionItem
0021     : public CompletionTreeItem
0022 {
0023 public:
0024     AbstractIncludeFileCompletionItem(const IncludeItem& include) : includeItem(include)
0025     {
0026     }
0027 
0028     QVariant data(const QModelIndex& index, int role, const KDevelop::CodeCompletionModel* model) const override
0029     {
0030         DUChainReadLocker lock(DUChain::lock(), 500);
0031         if (!lock.locked()) {
0032             qDebug() << "Failed to lock the du-chain in time";
0033             return QVariant();
0034         }
0035 
0036         const IncludeItem& item(includeItem);
0037 
0038         switch (role) {
0039         case CodeCompletionModel::IsExpandable:
0040             return QVariant(true);
0041         case CodeCompletionModel::ExpandingWidget: {
0042             auto* nav = new NavigationWidget(item, model->currentTopContext());
0043 
0044             QVariant v;
0045             v.setValue<QWidget*>(( QWidget* )nav);
0046             return v;
0047         }
0048         case Qt::DisplayRole:
0049             switch (index.column()) {
0050             case CodeCompletionModel::Prefix:
0051                 if (item.isDirectory)
0052                     return QStringLiteral("directory");
0053                 else
0054                     return QStringLiteral("file");
0055             case CodeCompletionModel::Name: {
0056                 return item.isDirectory ? (item.name + QLatin1Char('/')) : item.name;
0057             }
0058             }
0059             break;
0060         case CodeCompletionModel::ItemSelected:
0061         {
0062             return QVariant(NavigationWidget::shortDescription(item));
0063         }
0064         }
0065 
0066         return QVariant();
0067     }
0068 
0069     void execute(KTextEditor::View* view, const KTextEditor::Range& word) override = 0;
0070 
0071     int inheritanceDepth() const override
0072     {
0073         return includeItem.pathNumber;
0074     }
0075     int argumentHintDepth() const override
0076     {
0077         return 0;
0078     }
0079 
0080     IncludeItem includeItem;
0081 };
0082 }
0083 
0084 #endif // KDEVPLATFORM_ABSTRACTINCLUDEFILECOMPLETIONITEM_H