summaryrefslogtreecommitdiffstats
path: root/include/vcl/toolkit/treelistentry.hxx
blob: 7a35e8e0b222dfbc6dc62d69cc9a1b84caaa2ada (plain)
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
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */

#pragma once

#if !defined(VCL_DLLIMPLEMENTATION) && !defined(TOOLKIT_DLLIMPLEMENTATION) && !defined(VCL_INTERNALS)
#error "don't use this in new code"
#endif

#include <vcl/dllapi.h>
#include <tools/color.hxx>
#include <vcl/toolkit/treelistbox.hxx>
#include <vcl/toolkit/treelistentries.hxx>
#include <o3tl/typed_flags_set.hxx>

#include <optional>
#include <vector>
#include <memory>

// flags related to the model
enum class SvTLEntryFlags
{
    NONE                = 0x0000,
    CHILDREN_ON_DEMAND  = 0x0001,
    DISABLE_DROP        = 0x0002,
    // is set if RequestingChildren has not set any children
    NO_NODEBMP          = 0x0004,
    // is set if this is a separator line
    IS_SEPARATOR        = 0x0008,
    // entry had or has children
    HAD_CHILDREN        = 0x0010,
    SEMITRANSPARENT     = 0x8000,      // draw semi-transparent entry bitmaps
};
namespace o3tl
{
    template<> struct typed_flags<SvTLEntryFlags> : is_typed_flags<SvTLEntryFlags, 0x801f> {};
}

class VCL_DLLPUBLIC SvTreeListEntry
{
    friend class SvTreeList;
    friend class SvListView;
    friend class SvTreeListBox;

    typedef std::vector<std::unique_ptr<SvLBoxItem>> ItemsType;

    SvTreeListEntry*    pParent;
    SvTreeListEntries   m_Children;
    sal_uInt32          nAbsPos;
    sal_uInt32          nListPos;
    sal_uInt32          mnExtraIndent;
    ItemsType           m_Items;
    void*               pUserData;
    SvTLEntryFlags      nEntryFlags;
    Color               maBackColor;
    std::optional<Color> mxTextColor;

private:
    void ClearChildren();
    void SetListPositions();
    void InvalidateChildrensListPositions();

    SvTreeListEntry(const SvTreeListEntry& r) = delete;
    void operator=(SvTreeListEntry const&) = delete;

public:
    static const size_t ITEM_NOT_FOUND = SAL_MAX_SIZE;

    SvTreeListEntry();
    virtual ~SvTreeListEntry();

    bool HasChildren() const;
    bool HasChildListPos() const;
    sal_uInt32 GetChildListPos() const;

    SvTreeListEntries& GetChildEntries() { return m_Children; }
    const SvTreeListEntries& GetChildEntries() const { return m_Children; }

    void Clone(SvTreeListEntry* pSource);

    size_t ItemCount() const;

    // MAY ONLY BE CALLED IF THE ENTRY HAS NOT YET BEEN INSERTED INTO
    // THE MODEL, AS OTHERWISE NO VIEW-DEPENDENT DATA ARE ALLOCATED
    // FOR THE ITEM!
    void        AddItem(std::unique_ptr<SvLBoxItem> pItem);
    void ReplaceItem(std::unique_ptr<SvLBoxItem> pNewItem, size_t nPos);
    const SvLBoxItem& GetItem( size_t nPos ) const;
    SvLBoxItem& GetItem( size_t nPos );
    const SvLBoxItem* GetFirstItem(SvLBoxItemType eType) const;
    SvLBoxItem* GetFirstItem(SvLBoxItemType eType);
    size_t GetPos( const SvLBoxItem* pItem ) const;
    void*       GetUserData() const { return pUserData;}
    void        SetUserData( void* pPtr );
    void        EnableChildrenOnDemand( bool bEnable=true );
    bool        HasChildrenOnDemand() const;

    SvTLEntryFlags GetFlags() const { return nEntryFlags;}
    void SetFlags( SvTLEntryFlags nFlags );

    void SetBackColor( const Color& rColor ) { maBackColor = rColor; }
    const Color& GetBackColor() const { return maBackColor; }

    void SetTextColor( std::optional<Color> xColor ) { mxTextColor = xColor; }
    std::optional<Color> const & GetTextColor() const { return mxTextColor; }

    void SetExtraIndent(sal_uInt32 nExtraIndent) { mnExtraIndent = nExtraIndent; }
    sal_uInt32 GetExtraIndent() const { return mnExtraIndent; }

    SvTreeListEntry* NextSibling() const;
    SvTreeListEntry* PrevSibling() const;
    SvTreeListEntry* LastSibling() const;
};

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */