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
141
142
|
/* -*- 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
#include "menuwindow.hxx"
#include <vcl/toolkit/button.hxx>
#include <vcl/menu.hxx>
#include <vcl/toolbox.hxx>
#include <vcl/window.hxx>
#include <map>
class Button;
/** Toolbox that holds the close button (right hand side of the menubar).
This is also used by the online update check; when an update is available, it
inserts here the button that leads to the download of the update.
*/
class DecoToolBox : public ToolBox
{
tools::Long lastSize;
Size maMinSize;
public:
explicit DecoToolBox(vcl::Window* pParent);
void DataChanged( const DataChangedEvent& rDCEvt ) override;
void SetImages( tools::Long nMaxHeight, bool bForce = false );
void calcMinSize();
const Size& getMinSize() const { return maMinSize;}
Image maImage;
};
/** Class that implements the actual window of the menu bar.
*/
class MenuBarWindow : public vcl::Window, public MenuWindow
{
friend class MenuBar;
friend class Menu;
private:
struct AddButtonEntry
{
Link<MenuBarButtonCallbackArg&,bool> m_aSelectLink;
Link<MenuBarButtonCallbackArg&,bool> m_aHighlightLink;
};
VclPtr<Menu> m_pMenu;
VclPtr<PopupMenu> m_pActivePopup;
VclPtr<PopupMenu> mpParentPopup;
sal_uInt16 m_nHighlightedItem;
sal_uInt16 m_nRolloveredItem;
VclPtr<vcl::Window> m_xSaveFocusId;
bool mbAutoPopup;
bool m_bIgnoreFirstMove;
VclPtr<DecoToolBox> m_aCloseBtn;
VclPtr<PushButton> m_aFloatBtn;
VclPtr<PushButton> m_aHideBtn;
std::map< sal_uInt16, AddButtonEntry > m_aAddButtons;
void HighlightItem(vcl::RenderContext& rRenderContext, sal_uInt16 nPos);
void ChangeHighlightItem(sal_uInt16 n, bool bSelectPopupEntry, bool bAllowRestoreFocus = true, bool bDefaultToDocument = true);
sal_uInt16 ImplFindEntry( const Point& rMousePos ) const;
void ImplCreatePopup( bool bPreSelectFirst );
bool HandleKeyEvent(const KeyEvent& rKEvent, bool bFromMenu = true);
tools::Rectangle ImplGetItemRect( sal_uInt16 nPos ) const;
void ImplInitStyleSettings();
virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
DECL_LINK( CloseHdl, ToolBox*, void );
DECL_LINK( ToolboxEventHdl, VclWindowEvent&, void );
DECL_LINK( ShowHideListener, VclWindowEvent&, void );
void StateChanged( StateChangedType nType ) override;
void DataChanged( const DataChangedEvent& rDCEvt ) override;
void LoseFocus() override;
void GetFocus() override;
public:
explicit MenuBarWindow( vcl::Window* pParent );
virtual ~MenuBarWindow() override;
virtual void dispose() override;
void ShowButtons(bool bClose, bool bFloat, bool bHide);
virtual void MouseMove( const MouseEvent& rMEvt ) override;
virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
virtual void MouseButtonUp( const MouseEvent& rMEvt ) override;
virtual void KeyInput( const KeyEvent& rKEvent ) override;
virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
virtual void Resize() override;
virtual void RequestHelp( const HelpEvent& rHEvt ) override;
void SetMenu(MenuBar* pMenu);
void SetHeight(tools::Long nHeight);
void KillActivePopup();
void PopupClosed(Menu const * pMenu);
sal_uInt16 GetHighlightedItem() const { return m_nHighlightedItem; }
virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible() override;
void SetAutoPopup(bool bAuto) { mbAutoPopup = bAuto; }
void LayoutChanged();
Size const & MinCloseButtonSize() const;
/// Add an arbitrary button to the menubar that will appear next to the close button.
sal_uInt16 AddMenuBarButton(const Image&, const Link<MenuBarButtonCallbackArg&,bool>&, const OUString&);
void SetMenuBarButtonHighlightHdl(sal_uInt16 nId, const Link<MenuBarButtonCallbackArg&,bool>&);
tools::Rectangle GetMenuBarButtonRectPixel(sal_uInt16 nId);
void RemoveMenuBarButton(sal_uInt16 nId);
bool HandleMenuButtonEvent(sal_uInt16 i_nButtonId);
bool CanGetFocus() const;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|