File: ServiceProviderManager.cpp

package info (click to toggle)
codelite 14.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 112,816 kB
  • sloc: cpp: 483,662; ansic: 150,144; php: 9,569; lex: 4,186; python: 3,417; yacc: 2,820; sh: 1,147; makefile: 52; xml: 13
file content (101 lines) | stat: -rw-r--r-- 3,720 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "ServiceProviderManager.h"
#include <algorithm>
#include "event_notifier.h"
#include "codelite_events.h"
#include "file_logger.h"

ServiceProviderManager::ServiceProviderManager() {}

ServiceProviderManager::~ServiceProviderManager() { m_providers.clear(); }

void ServiceProviderManager::Register(ServiceProvider* provider)
{
    // No duplicates
    Unregister(provider);
    // Now register the service
    if(this->m_providers.count(provider->GetType()) == 0) {
        m_providers.insert({ provider->GetType(), ServiceProvider::Vec_t() });
    }
    ServiceProvider::Vec_t& V = m_providers[provider->GetType()];
    V.push_back(provider);

    clDEBUG() << "Handler:" << provider->GetName() << "registerd. Priority:" << provider->GetPriority()
              << ". Type:" << (int)provider->GetType();

    // Sort the providers by priority (descending order)
    std::sort(V.begin(), V.end(),
              [](ServiceProvider* a, ServiceProvider* b) { return a->GetPriority() > b->GetPriority(); });

    wxString order;
    for(ServiceProvider* p : V) {
        order << p->GetName() << "(" << p->GetPriority() << ") ";
    }
    clDEBUG() << "Service providers:" << order;
}

void ServiceProviderManager::Unregister(ServiceProvider* provider)
{
    if(this->m_providers.count(provider->GetType()) == 0) { return; }
    ServiceProvider::Vec_t& V = m_providers[provider->GetType()];

    // Find our provider and remove it
    while(true) {
        // Do this in a loop, incase someone registered this provider twice...
        auto where =
            std::find_if(V.begin(), V.end(), [&](ServiceProvider* p) { return p->GetName() == provider->GetName(); });
        if(where == V.end()) { break; }
        V.erase(where); // remove it
        clDEBUG() << "Handler:" << provider->GetName() << "Uregisterd. Priority:" << provider->GetPriority()
                  << ". Type:" << (int)provider->GetType();
    }
}

ServiceProviderManager& ServiceProviderManager::Get()
{
    static ServiceProviderManager instance;
    return instance;
}

bool ServiceProviderManager::ProcessEvent(wxEvent& event)
{
    eServiceType type = GetServiceFromEvent(event);
    if(type == eServiceType::kUnknown || m_providers.count(type) == 0) {
        // Let the default event processing take place by using EventNotifier
        return EventNotifier::Get()->ProcessEvent(event);
    } else {
        // Call our chain
        auto& V = m_providers[type];
        for(ServiceProvider* p : V) {
            if(p->ProcessEvent(event)) { return true; }
        }
        return false;
    }
}

eServiceType ServiceProviderManager::GetServiceFromEvent(wxEvent& event)
{
    wxEventType type = event.GetEventType();
    // Code Completion events
    if(type == wxEVT_CC_CODE_COMPLETE || type == wxEVT_CC_FIND_SYMBOL || type == wxEVT_CC_FIND_SYMBOL_DECLARATION ||
       type == wxEVT_CC_FIND_SYMBOL_DEFINITION || type == wxEVT_CC_CODE_COMPLETE_FUNCTION_CALLTIP ||
       type == wxEVT_CC_TYPEINFO_TIP || type == wxEVT_CC_WORD_COMPLETE) {
        return eServiceType::kCodeCompletion;
    }
    return eServiceType::kUnknown;
}

void ServiceProviderManager::UnregisterAll() { m_providers.clear(); }

void ServiceProviderManager::Sort(eServiceType type)
{
    if(m_providers.count(type) == 0) { return; }
    clDEBUG() << "sorting providers for type:" << (int)type;
    ServiceProvider::Vec_t& V = m_providers[type];
    std::sort(V.begin(), V.end(),
              [](ServiceProvider* a, ServiceProvider* b) { return a->GetPriority() > b->GetPriority(); });
    wxString order;
    for(ServiceProvider* p : V) {
        order << p->GetName() << "(" << p->GetPriority() << ") ";
    }
    clDEBUG() << "Service providers:" << order;
}