/////////////////////////////////////////////////////////////////////////////
// Name: wx/qt/mdi.h
// Author: Peter Most, Mariano Reingart
// Copyright: (c) 2010 wxWidgets dev team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_QT_MDI_H_
#define _WX_QT_MDI_H_
class QMdiArea;
class QMdiSubWindow;
class WXDLLIMPEXP_CORE wxMDIParentFrame : public wxMDIParentFrameBase
{
public:
wxMDIParentFrame() = default;
wxMDIParentFrame(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,
const wxString& name = wxASCII_STR(wxFrameNameStr));
~wxMDIParentFrame();
bool Create(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,
const wxString& name = wxASCII_STR(wxFrameNameStr));
QMdiArea* GetQtMdiArea() const;
enum class Layout
{
MDI,
Tabbed
};
void QtSetPreferredDILayout(Layout layout);
// override/implement base class [pure] virtual methods
// ----------------------------------------------------
// The default is to return what wxMDIParentFrame::IsTDI() is supposed to
// return under the target platform. i.e. wxMSW and wxOSX return false,
// while wxGTK returns true. Use QtSetPreferredDILayout() to change that.
static bool IsTDI() { return ms_layout == Layout::Tabbed; }
virtual void Cascade() override;
virtual void Tile(wxOrientation orient = wxHORIZONTAL) override;
virtual void ActivateNext() override;
virtual void ActivatePrevious() override;
// implementation only from now on
// MDI helpers
// -----------
#if wxUSE_MENUS
// called by wxMDIChildFrame after it was successfully created
void AddMDIChild(wxMDIChildFrame* child);
// called by wxMDIChildFrame just before it is destroyed
void RemoveMDIChild(wxMDIChildFrame* child);
#endif // wxUSE_MENUS
private:
void OnMDICommand(wxCommandEvent& event);
// add/remove window menu if we have it (i.e. m_windowMenu != nullptr)
void AddWindowMenu();
void RemoveWindowMenu();
// update the window menu (if we have it) to enable or disable the commands
// which only make sense when we have more than one child
void UpdateWindowMenu(bool enable);
// return the number of child frames we currently have (maybe 0)
int GetChildFramesCount() const;
// TDI=true, MDI=false
// Default to false under Windows, true otherwise.
static Layout ms_layout;
wxDECLARE_DYNAMIC_CLASS(wxMDIParentFrame);
};
class WXDLLIMPEXP_CORE wxMDIChildFrame : public wxMDIChildFrameBase
{
public:
wxMDIChildFrame() = default;
wxMDIChildFrame(wxMDIParentFrame *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE,
const wxString& name = wxASCII_STR(wxFrameNameStr));
~wxMDIChildFrame();
bool Create(wxMDIParentFrame *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE,
const wxString& name = wxASCII_STR(wxFrameNameStr));
virtual void Activate() override;
virtual void SetMenuBar(wxMenuBar* menubar) override;
// This function is responsible for attaching/detaching this frame's menubar
// to m_mdiParent. i.e. the menubar is attached when this frame becomes active
// Otherwise, it will be detached and the m_mdiParent's menubar will be restored.
void InternalSetMenuBar();
// wxMDIChildFrame doesn't have toolbar nor statusbar
// --------------------------------------------------
#if wxUSE_STATUSBAR
virtual void SetStatusBar(wxStatusBar* WXUNUSED(statusBar)) override {}
#endif // wxUSE_STATUSBAR
#if wxUSE_TOOLBAR
virtual void SetToolBar(wxToolBar* WXUNUSED(toolbar)) override {}
#endif // wxUSE_TOOLBAR
virtual void SetWindowStyleFlag( long style ) override;
private:
void AttachWindowMenuTo(wxMenuBar* attachedMenuBar, wxMenuBar* detachedMenuBar);
wxMenuBar* m_menuBar = nullptr;
QMdiSubWindow* m_qtSubWindow = nullptr;
wxDECLARE_DYNAMIC_CLASS(wxMDIChildFrame);
};
class WXDLLIMPEXP_CORE wxMDIClientWindow : public wxMDIClientWindowBase
{
public:
wxMDIClientWindow() = default;
virtual bool CreateClient(wxMDIParentFrame *parent, long style = wxVSCROLL | wxHSCROLL) override;
wxDECLARE_DYNAMIC_CLASS(wxMDIClientWindow);
};
#endif // _WX_QT_MDI_H_