1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 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 * This file incorporates work covered by the following license notice: 10 * 11 * Licensed to the Apache Software Foundation (ASF) under one or more 12 * contributor license agreements. See the NOTICE file distributed 13 * with this work for additional information regarding copyright 14 * ownership. The ASF licenses this file to you under the Apache 15 * License, Version 2.0 (the "License"); you may not use this file 16 * except in compliance with the License. You may obtain a copy of 17 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 18 */ 19 20 #pragma once 21 22 #if !defined(VCL_DLLIMPLEMENTATION) && !defined(TOOLKIT_DLLIMPLEMENTATION) && !defined(VCL_INTERNALS) 23 #error "don't use this in new code" 24 #endif 25 26 #include <config_options.h> 27 #include <vcl/toolkit/button.hxx> 28 #include <vcl/dllapi.h> 29 #include <memory> 30 31 class Timer; 32 class PopupMenu; 33 34 class VCL_DLLPUBLIC MenuButton : public PushButton 35 { 36 private: 37 friend class VclBuilder; 38 39 std::unique_ptr<Timer> mpMenuTimer; 40 VclPtr<PopupMenu> mpMenu; 41 VclPtr<Window> mpFloatingWindow; 42 OString msCurItemIdent; 43 sal_uInt16 mnCurItemId; 44 bool mbDelayMenu; 45 bool mbStartingMenu; 46 Link<MenuButton*,void> maActivateHdl; 47 Link<MenuButton*,void> maSelectHdl; 48 49 DECL_DLLPRIVATE_LINK( ImplMenuTimeoutHdl, Timer*, void ); 50 51 MenuButton( const MenuButton & ) = delete; 52 MenuButton& operator=( const MenuButton & ) = delete; 53 54 protected: 55 using Window::ImplInit; 56 SAL_DLLPRIVATE void ImplInit( vcl::Window* pParent, WinBits nStyle ); 57 58 public: 59 explicit MenuButton( vcl::Window* pParent, WinBits nStyle = 0 ); 60 virtual ~MenuButton() override; 61 virtual void dispose() override; 62 63 virtual void MouseButtonDown( const MouseEvent& rMEvt ) override; 64 virtual void KeyInput( const KeyEvent& rKEvt ) override; 65 66 virtual void Activate() override; 67 void Select(); 68 69 void ExecuteMenu(); 70 bool InPopupMode() const; 71 void CancelMenu(); 72 73 //if false then the whole button launches the menu 74 //if true, then the button has a separator 75 //where the right portion launches the menu immediately 76 //where the left portion activates the underlying Button handlers 77 //before launching the menu in an idle, allowing it to be cancelled 78 //before being shown SetDelayMenu(bool bDelay)79 void SetDelayMenu(bool bDelay) { mbDelayMenu = bDelay; } 80 81 void SetPopupMenu(PopupMenu* pNewMenu); GetPopupMenu() const82 PopupMenu* GetPopupMenu() const { return mpMenu; } 83 84 void SetPopover(Window* pWindow); 85 GetCurItemIdent() const86 OString const & GetCurItemIdent() const { return msCurItemIdent; } 87 SetActivateHdl(const Link<MenuButton *,void> & rLink)88 void SetActivateHdl( const Link<MenuButton *, void>& rLink ) { maActivateHdl = rLink; } SetSelectHdl(const Link<MenuButton *,void> & rLink)89 void SetSelectHdl( const Link<MenuButton *, void>& rLink ) { maSelectHdl = rLink; } 90 91 virtual FactoryFunction GetUITestFactory() const override; 92 93 void SetCurItemId(); 94 95 }; 96 97 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 98