library/forms/mforms/tabview.h (89 lines of code) (raw):

/* * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2.0, * as published by the Free Software Foundation. * * This program is designed to work with certain software (including * but not limited to OpenSSL) that is licensed under separate terms, as * designated in a particular file or component or in included license * documentation. The authors of MySQL hereby grant you an additional * permission to link the program and your derivative works with the * separately licensed software that they have either included with * the program or referenced in the documentation. * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License, version 2.0, for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #pragma once #include <mforms/view.h> namespace mforms { class TabView; class ContextMenu; enum TabViewType { TabViewSystemStandard = 0, //!< Normal tab views with tabs on top in the style used by the system. TabViewTabless = 1, //!< System style tab view without tabs. Switching tabs can then be // performed programmatically only. TabViewMainClosable, //!< WB main style tab view (top hanging tabs on Win), closable tabs TabViewDocument, //!< WB style for tabbed documents (top standing tabs, sql editors // and such). unclosable tabs TabViewDocumentClosable, //!< WB style for tabbed documents (top standing tabs, sql editors // and such). closable tabs TabViewPalette, //!< WB style tab view (bottom hanging tabs on Win), unclosable tabs TabViewSelectorSecondary, //!< Sidebar palette selector style, unclosable tabs. TabViewEditorBottom, //!< Bottom facing, closable tabs to be used for docking editors TabViewEditorBottomPinnable //!< same as earlier, but with pins }; #ifndef DOXYGEN_SHOULD_SKIP_THIS #ifndef SWIG struct MFORMS_EXPORT TabViewImplPtrs { bool (*create)(TabView *, TabViewType); void (*set_active_tab)(TabView *, int); void (*set_tab_title)(TabView *, int, const std::string &); int (*get_active_tab)(TabView *); int (*add_page)(TabView *, View *, const std::string &, bool); void (*remove_page)(TabView *, View *); void (*set_aux_view)(TabView *, View *); void (*set_allows_reordering)(TabView *, bool); }; #endif #endif /** A Notebook/Tabbed view. */ class MFORMS_EXPORT TabView : public View { TabViewImplPtrs *_tabview_impl; TabViewType _type; View *_aux_view; int _menu_tab; ContextMenu *_tab_menu; boost::signals2::signal<void()> _signal_tab_changed; boost::signals2::signal<void(View *, int, int)> _signal_tab_reordered; boost::signals2::signal<bool(int)> _signal_tab_closing; boost::signals2::signal<void(View *, int)> _signal_tab_closed; boost::signals2::signal<void(int, bool)> _signal_tab_pin_changed; public: /** Constructor. @param type - Type of the tabView. See @ref TabViewType */ TabView(TabViewType tabType = TabViewSystemStandard); virtual ~TabView(); TabViewType get_type() const { return _type; } /** Sets the currently selected/active tab */ void set_active_tab(int index); /** Get currently selected tab */ int get_active_tab(); /** Add a new page to the tab view, with its tab caption. */ int add_page(View *page, const std::string &caption, bool hasCloseButton = true); /** Remove a tab page by its content. */ void remove_page(View *page); /** Sets the caption of the tab page at the given index. */ void set_tab_title(int page, const std::string &caption); /** Returns the index of the tab page or -1 if its not found */ int get_page_index(View *page); /** Returns the page object at the given page index */ View *get_page(int index); /** Number of tabs in the control */ int page_count(); /** Returns true if the tab with the given index can be closed. */ bool can_close_tab(int index); /** Whether the tabs can be reordered by the user by dragging (supported by select tabview types) */ void set_allows_reordering(bool flag); /** Sets a menu to be shown when right clicking on a tab (supported by select tabview types) */ void set_tab_menu(ContextMenu *menu); ContextMenu *get_tab_menu() { return _tab_menu; } /** Returns the index of the tab for which the context menu is being shown */ int get_menu_tab(); void set_aux_view(View *view); View *get_aux_view() { return _aux_view; } #ifndef SWIG void set_menu_tab(int tab); void reordered(View *view, int index); void pin_changed(int tab, bool pinned); /** Signal emitted when the tab is switched by user. In Python use add_tab_changed_callback() */ boost::signals2::signal<void()> *signal_tab_changed() { return &_signal_tab_changed; } boost::signals2::signal<void(View *, int, int)> *signal_tab_reordered() { return &_signal_tab_reordered; } /** Callback called when a tab is about to close. Returning false will prevent the closure. */ boost::signals2::signal<bool(int)> *signal_tab_closing() { return &_signal_tab_closing; } boost::signals2::signal<void(View *, int)> *signal_tab_closed() { return &_signal_tab_closed; } boost::signals2::signal<void(int, bool)> *signal_tab_pin_changed() { return &_signal_tab_pin_changed; } std::function<bool(int)> is_pinned; #endif }; };