summaryrefslogtreecommitdiff
path: root/include/svtools/toolbarmenu.hxx
blob: c08da7e9c8991d5ce2c71c58f19dc262bb277ba7 (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
132
133
134
135
136
137
138
139
140
/* -*- 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 .
 */

#ifndef INCLUDED_SVTOOLS_TOOLBARMENU_HXX
#define INCLUDED_SVTOOLS_TOOLBARMENU_HXX

#include <config_options.h>
#include <svtools/svtdllapi.h>

#include <memory>

#include <rtl/ref.hxx>
#include <vcl/dockwin.hxx>
#include <vcl/weld.hxx>

namespace com :: sun :: star :: frame { class XFrame; }
namespace com :: sun :: star :: frame { struct FeatureStateEvent; }
namespace svt { class FrameStatusListener; }

namespace svtools {

class SVT_DLLPUBLIC ToolbarPopupBase
{
    friend class ToolbarPopupStatusListener;
public:
    ToolbarPopupBase(const css::uno::Reference<css::frame::XFrame>& rFrame);
    virtual ~ToolbarPopupBase();

protected:
    void AddStatusListener( const OUString& rCommandURL );

    // Forwarded from XStatusListener (subclasses must override this one to get the status updates):
    /// @throws css::uno::RuntimeException
    virtual void statusChanged(const css::frame::FeatureStateEvent& Event );

    css::uno::Reference<css::frame::XFrame>  mxFrame;
    rtl::Reference<svt::FrameStatusListener> mxStatusListener;
};

class UNLESS_MERGELIBS(SVT_DLLPUBLIC) ToolbarPopup : public DockingWindow, public ToolbarPopupBase
{
public:
    ToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
                 vcl::Window* pParentWindow,
                 const OString& rID, const OUString& rUIXMLDescription );
    virtual ~ToolbarPopup() override;
    virtual void dispose() override;

protected:
    void EndPopupMode();

private:
    void init();
};

} // namespace svtools

class SVT_DLLPUBLIC WeldToolbarPopup : public svtools::ToolbarPopupBase
{
private:
    DECL_LINK(FocusHdl, weld::Widget&, void);

protected:
    std::unique_ptr<weld::Builder> m_xBuilder;
    std::unique_ptr<weld::Container> m_xTopLevel;
    std::unique_ptr<weld::Container> m_xContainer;

public:
    WeldToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame,
                     weld::Widget* pParent, const OUString& rUIFile, const OString& rId);
    virtual ~WeldToolbarPopup() override;
    weld::Container* getTopLevel() { return m_xTopLevel.get(); }
    weld::Container* getContainer() { return m_xContainer.get(); }

    virtual void GrabFocus() = 0;
};

// we want to create WeldToolbarPopup on-demand when a toolbar dropdown is
// clicked, but the widget to be shown must exist before the dropdown
// is activated, so ToolbarPopupContainer is that widget and the
// contents of the on-demand created WeldToolbarPopup is placed
// within the ToolbarPopupContainer
class SVT_DLLPUBLIC ToolbarPopupContainer final
{
private:
    DECL_LINK(FocusHdl, weld::Widget&, void);

    std::unique_ptr<weld::Builder> m_xBuilder;
    std::unique_ptr<weld::Container> m_xTopLevel;
    std::unique_ptr<weld::Container> m_xContainer;
    std::unique_ptr<WeldToolbarPopup> m_xPopup;
public:
    ToolbarPopupContainer(weld::Widget* pParent);
    ~ToolbarPopupContainer();
    weld::Container* getTopLevel() { return m_xTopLevel.get(); }
    weld::Container* getContainer() { return m_xContainer.get(); }

    void setPopover(std::unique_ptr<WeldToolbarPopup> xPopup);
    WeldToolbarPopup* getPopover() const { return m_xPopup.get(); }
    void unsetPopover();
};

class SVT_DLLPUBLIC InterimToolbarPopup final : public svtools::ToolbarPopup
{
private:
    VclPtr<vcl::Window> m_xBox;
    std::unique_ptr<weld::Builder> m_xBuilder;
    std::unique_ptr<weld::Container> m_xContainer;
    std::unique_ptr<WeldToolbarPopup> m_xPopup;
public:
    InterimToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParent,
                        std::unique_ptr<WeldToolbarPopup> xPopup);
    weld::Container* getContainer() { return m_xContainer.get(); }
    virtual void dispose() override;
    virtual ~InterimToolbarPopup() override;

    virtual void GetFocus() override;

    using ToolbarPopup::EndPopupMode;
};

#endif

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