Coverage Report

Created: 2025-11-16 09:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/sfx2/inc/autoredactdialog.hxx
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
2
/*
3
 * This file is part of the LibreOffice project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 */
9
10
#ifndef INCLUDED_SFX2_INC_AUTOREDACTDIALOG_HXX
11
#define INCLUDED_SFX2_INC_AUTOREDACTDIALOG_HXX
12
13
#include <memory>
14
#include <sal/config.h>
15
#include <sfx2/basedlgs.hxx>
16
#include <sfx2/objsh.hxx>
17
18
enum RedactionTargetType
19
{
20
    REDACTION_TARGET_TEXT,
21
    REDACTION_TARGET_REGEX,
22
    REDACTION_TARGET_PREDEFINED,
23
    REDACTION_TARGET_IMAGE,
24
    REDACTION_TARGET_UNKNOWN
25
};
26
27
/// Keeps information for a single redaction target
28
struct RedactionTarget
29
{
30
    OUString sName;
31
    RedactionTargetType sType;
32
    OUString sContent;
33
    bool bCaseSensitive;
34
    bool bWholeWords;
35
    sal_uInt32 nID;
36
};
37
38
/// Used to display the targets list
39
class TargetsTable
40
{
41
    std::unique_ptr<weld::TreeView> m_xControl;
42
    int GetRowByTargetName(std::u16string_view sName);
43
44
public:
45
    TargetsTable(std::unique_ptr<weld::TreeView> xControl);
46
    void InsertTarget(RedactionTarget* pTarget);
47
    bool HasTargetType(RedactionTargetType aTargetType);
48
    RedactionTarget* GetTargetByName(std::u16string_view sName);
49
    OUString GetNameProposal() const;
50
51
0
    int get_selected_index() const { return m_xControl->get_selected_index(); }
52
0
    std::vector<int> get_selected_rows() const { return m_xControl->get_selected_rows(); }
53
0
    void clear() { m_xControl->clear(); }
54
0
    void remove(int nRow) { m_xControl->remove(nRow); }
55
0
    void select(int nRow) { m_xControl->select(nRow); }
56
0
    OUString get_id(int nRow) const { return m_xControl->get_id(nRow); }
57
58
    // Sync data on the targets box with the data on the target
59
    void setRowData(int nRowIndex, const RedactionTarget* pTarget);
60
61
    void connect_row_activated(const Link<weld::TreeView&, bool>& rLink)
62
0
    {
63
0
        m_xControl->connect_row_activated(rLink);
64
0
    };
65
};
66
67
namespace sfx2
68
{
69
class FileDialogHelper;
70
}
71
72
enum class StartFileDialogType
73
{
74
    Open,
75
    SaveAs
76
};
77
78
class SfxAutoRedactDialog final : public SfxDialogController
79
{
80
    SfxObjectShellLock m_xDocShell;
81
    std::vector<std::pair<std::unique_ptr<RedactionTarget>, OUString>> m_aTableTargets;
82
    std::unique_ptr<sfx2::FileDialogHelper> m_pFileDlg;
83
    bool m_bIsValidState;
84
    bool m_bTargetsCopied;
85
86
    TargetsTable m_aTargetsBox;
87
    std::unique_ptr<weld::Button> m_xLoadBtn;
88
    std::unique_ptr<weld::Button> m_xSaveBtn;
89
    std::unique_ptr<weld::Button> m_xAddBtn;
90
    std::unique_ptr<weld::Button> m_xEditBtn;
91
    std::unique_ptr<weld::Button> m_xDeleteBtn;
92
93
    DECL_LINK(Load, weld::Button&, void);
94
    DECL_LINK(Save, weld::Button&, void);
95
    DECL_LINK(AddHdl, weld::Button&, void);
96
    DECL_LINK(EditHdl, weld::Button&, void);
97
    DECL_LINK(DeleteHdl, weld::Button&, void);
98
    DECL_LINK(DoubleClickEditHdl, weld::TreeView&, bool);
99
    DECL_LINK(LoadHdl, sfx2::FileDialogHelper*, void);
100
    DECL_LINK(SaveHdl, sfx2::FileDialogHelper*, void);
101
102
    void StartFileDialog(StartFileDialogType nType, const OUString& rTitle);
103
    /// Carry out proper addition both to the targets box, and to the tabletargets vector.
104
    void addTarget(std::unique_ptr<RedactionTarget> pTarget);
105
    /// Clear all targets both visually and from the targets vector
106
    void clearTargets();
107
108
    void ImplDestroy();
109
110
public:
111
    SfxAutoRedactDialog(weld::Window* pParent);
112
    virtual ~SfxAutoRedactDialog() override;
113
114
    /// Check if the dialog has any valid redaction targets.
115
    bool hasTargets() const;
116
    /// Check if the dialog is in a valid state.
117
0
    bool isValidState() const { return m_bIsValidState; }
118
    /** Copies targets vector
119
     *  Does a shallow copy.
120
     *  Returns true if successful.
121
     */
122
    bool getTargets(std::vector<std::pair<RedactionTarget, OUString>>& r_aTargets);
123
};
124
125
class SfxAddTargetDialog final : public weld::GenericDialogController
126
{
127
private:
128
    std::unique_ptr<weld::Entry> m_xName;
129
    std::unique_ptr<weld::ComboBox> m_xType;
130
    std::unique_ptr<weld::Label> m_xLabelContent;
131
    std::unique_ptr<weld::Entry> m_xContent;
132
    std::unique_ptr<weld::Label> m_xLabelPredefContent;
133
    std::unique_ptr<weld::ComboBox> m_xPredefContent;
134
    std::unique_ptr<weld::CheckButton> m_xCaseSensitive;
135
    std::unique_ptr<weld::CheckButton> m_xWholeWords;
136
137
    DECL_LINK(SelectTypeHdl, weld::ComboBox&, void);
138
139
public:
140
    SfxAddTargetDialog(weld::Window* pWindow, const OUString& rName);
141
    SfxAddTargetDialog(weld::Window* pWindow, const OUString& sName,
142
                       const RedactionTargetType& eTargetType, const OUString& sContent,
143
                       bool bCaseSensitive, bool bWholeWords);
144
145
0
    OUString getName() const { return m_xName->get_text(); }
146
    RedactionTargetType getType() const;
147
    OUString getContent() const;
148
    bool isCaseSensitive() const
149
0
    {
150
0
        return m_xCaseSensitive->get_state() == TriState::TRISTATE_TRUE;
151
0
    }
152
0
    bool isWholeWords() const { return m_xWholeWords->get_state() == TriState::TRISTATE_TRUE; }
153
};
154
155
#endif
156
157
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */