File: DiffFoldersFrame.h

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (138 lines) | stat: -rw-r--r-- 4,365 bytes parent folder | download | duplicates (2)
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#ifndef DIFFFOLDERSFRAME_H
#define DIFFFOLDERSFRAME_H

#include "DiffUI.h"
#include "bitmap_loader.h"
#include "clFilesCollector.h"
#include "codelite_exports.h"
#include "globals.h"
#include "imanager.h"

#include <thread>

struct WXDLLIMPEXP_SDK DiffViewEntry {
protected:
    bool m_existsInLeft = false;
    bool m_existsInRight = false;
    clFilesScanner::EntryData m_left;
    clFilesScanner::EntryData m_right;

private:
    int GetImageId(const clFilesScanner::EntryData& d) const
    {
        if(d.flags & clFilesScanner::kIsFolder) {
            return clGetManager()->GetStdIcons()->GetMimeImageId(FileExtManager::TypeFolder);
        } else {
            return clGetManager()->GetStdIcons()->GetMimeImageId(d.fullpath);
        }
    }

public:
    bool IsExistsInLeft() const { return m_existsInLeft; }
    bool IsExistsInRight() const { return m_existsInRight; }
    bool IsExistsInBoth() const { return m_existsInRight && m_existsInLeft; }
    bool IsOK() const { return !m_left.fullpath.empty() || !m_right.fullpath.empty(); }
    int GetImageId(bool left) const { return GetImageId(left ? m_left : m_right); }

    wxString GetFullName() const
    {
        if(m_existsInLeft) {
            return wxFileName(GetLeft().fullpath).GetFullName();
        } else {
            return wxFileName(GetRight().fullpath).GetFullName();
        }
    }

    void SetLeft(const clFilesScanner::EntryData& left)
    {
        this->m_left = left;
        m_existsInLeft = true;
    }
    void SetRight(const clFilesScanner::EntryData& right)
    {
        this->m_right = right;
        m_existsInRight = true;
    }
    const clFilesScanner::EntryData& GetLeft() const { return m_left; }
    const clFilesScanner::EntryData& GetRight() const { return m_right; }
    typedef std::vector<DiffViewEntry> Vect_t;
    typedef std::unordered_map<wxString, DiffViewEntry> Hash_t;
};

struct WXDLLIMPEXP_SDK DiffView {
protected:
    DiffViewEntry::Hash_t m_table;

public:
    void CreateEntry(const clFilesScanner::EntryData& d, bool left)
    {
        DiffViewEntry entry;
        if(left) {
            entry.SetLeft(d);
        } else {
            entry.SetRight(d);
        }
        m_table.insert({ entry.GetFullName(), entry });
    }

    DiffViewEntry& GetEntry(const wxString& filename)
    {
        static DiffViewEntry nullEntry;
        if(HasFile(filename)) {
            return m_table[filename];
        }
        return nullEntry;
    }

    bool HasFile(const wxString& filename) const { return m_table.count(filename); }
    DiffViewEntry::Hash_t& GetTable() { return m_table; }
    DiffViewEntry::Vect_t ToSortedVector() const
    {
        DiffViewEntry::Vect_t V;
        std::for_each(m_table.begin(), m_table.end(),
                      [&](const DiffViewEntry::Hash_t::value_type& vt) { V.push_back(vt.second); });
        // sort the vector
        std::sort(V.begin(), V.end(), [&](const DiffViewEntry& a, const DiffViewEntry& b) {
            return a.GetFullName().CmpNoCase(b.GetFullName()) < 0;
        });
        return V;
    }
};

class WXDLLIMPEXP_SDK DiffFoldersFrame : public DiffFoldersBaseDlg
{
    wxString m_leftFolder;
    wxString m_rightFolder;
    size_t m_depth = 0;
    bool m_showSimilarItems = false;
    std::thread* m_checksumThread = nullptr;
    DiffViewEntry::Vect_t m_entries;

public:
    DiffFoldersFrame(wxWindow* parent);
    virtual ~DiffFoldersFrame();
    void OnChecksum(int callId, const wxArrayString& checksumArray);

protected:
    void BuildTrees(const wxString& left, const wxString& right);
    void DoOpenDiff(const wxDataViewItem& item);
    void StopChecksumThread();
    bool CanUp() const;

protected:
    virtual void OnClose(wxCommandEvent& event);
    virtual void OnNewCmparison(wxCommandEvent& event);
    virtual void OnItemActivated(wxDataViewEvent& event);
    virtual void OnItemContextMenu(wxDataViewEvent& event);

    void OnMenuDiff(wxCommandEvent& event);
    void OnCopyToRight(wxCommandEvent& event);
    void OnCopyToLeft(wxCommandEvent& event);
    void OnShowSimilarFiles(wxCommandEvent& event);
    void OnShowSimilarFilesUI(wxUpdateUIEvent& event);
    void OnRefresh(wxCommandEvent& event);
    void OnRefreshUI(wxUpdateUIEvent& event);
    void OnUpFolder(wxCommandEvent& event);
    void OnUpFolderUI(wxUpdateUIEvent& event);
};
#endif // DIFFFOLDERSFRAME_H