winamp/Src/external_dependencies/openmpt-trunk/mptrack/Globals.h
2024-09-24 14:54:57 +02:00

253 lines
9.1 KiB
C++

/*
* Globals.h
* ---------
* Purpose: Implementation of various views of the tracker interface.
* Notes : (currently none)
* Authors: OpenMPT Devs
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
*/
#pragma once
#include "openmpt/all/BuildSettings.hpp"
OPENMPT_NAMESPACE_BEGIN
#ifndef WM_HELPHITTEST
#define WM_HELPHITTEST 0x366
#endif
#ifndef HID_BASE_COMMAND
#define HID_BASE_COMMAND 0x10000
#endif
#define ID_EDIT_MIXPASTE ID_EDIT_PASTE_SPECIAL //rewbs.mixPaste
class CModControlView;
class CModControlBar;
class CModDoc;
class CModControlBar: public CToolBarCtrl
{
public:
BOOL Init(CImageList &icons, CImageList &disabledIcons);
void UpdateStyle();
BOOL AddButton(UINT nID, int iImage=0, UINT nStyle=TBSTYLE_BUTTON, UINT nState=TBSTATE_ENABLED);
afx_msg LRESULT OnHelpHitTest(WPARAM, LPARAM);
DECLARE_MESSAGE_MAP()
};
class CModControlDlg: public CDialog
{
protected:
CModDoc &m_modDoc;
CSoundFile &m_sndFile;
CModControlView &m_parent;
HWND m_hWndView;
LONG m_nLockCount;
int m_nDPIx, m_nDPIy; // Cached DPI settings
BOOL m_bInitialized;
public:
CModControlDlg(CModControlView &parent, CModDoc &document);
virtual ~CModControlDlg();
public:
void SetViewWnd(HWND hwndView) { m_hWndView = hwndView; }
HWND GetViewWnd() const { return m_hWndView; }
LRESULT SendViewMessage(UINT uMsg, LPARAM lParam=0) const;
BOOL PostViewMessage(UINT uMsg, LPARAM lParam=0) const;
LRESULT SwitchToView() const { return SendViewMessage(VIEWMSG_SETACTIVE); }
void LockControls() { m_nLockCount++; }
void UnlockControls() { PostMessage(WM_MOD_UNLOCKCONTROLS); }
bool IsLocked() const { return (m_nLockCount > 0); }
virtual Setting<LONG> &GetSplitPosRef() = 0; //rewbs.varWindowSize
afx_msg void OnEditCut() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_CUT, 0); }
afx_msg void OnEditCopy() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_COPY, 0); }
afx_msg void OnEditPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTE, 0); }
afx_msg void OnEditMixPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE, 0); }
afx_msg void OnEditMixPasteITStyle() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE_ITSTYLE, 0); }
afx_msg void OnEditPasteFlood() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTEFLOOD, 0); }
afx_msg void OnEditPushForwardPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PUSHFORWARDPASTE, 0); }
afx_msg void OnEditFind() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_FIND, 0); }
afx_msg void OnEditFindNext() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_FINDNEXT, 0); }
afx_msg void OnSwitchToView() { if (m_hWndView) ::PostMessage(m_hWndView, WM_MOD_VIEWMSG, VIEWMSG_SETFOCUS, 0); }
//{{AFX_VIRTUAL(CModControlDlg)
void OnOK() override {}
void OnCancel() override {}
virtual void RecalcLayout() = 0;
virtual void UpdateView(UpdateHint, CObject *) = 0;
virtual CRuntimeClass *GetAssociatedViewClass() { return nullptr; }
virtual LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam);
virtual void OnActivatePage(LPARAM) {}
virtual void OnDeactivatePage() {}
BOOL OnInitDialog() override;
INT_PTR OnToolHitTest(CPoint point, TOOLINFO *pTI) const override;
virtual BOOL GetToolTipText(UINT, LPTSTR) { return FALSE; }
//}}AFX_VIRTUAL
//{{AFX_MSG(CModControlDlg)
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg LRESULT OnUnlockControls(WPARAM, LPARAM) { if (m_nLockCount > 0) m_nLockCount--; return 0; }
afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);
afx_msg LRESULT OnDPIChanged(WPARAM = 0, LPARAM = 0);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
class CModTabCtrl: public CTabCtrl
{
public:
BOOL InsertItem(int nIndex, LPCTSTR pszText, LPARAM lParam=0, int iImage=-1);
BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
LPARAM GetItemData(int nIndex);
};
class CModControlView: public CView
{
public:
enum Views
{
VIEW_UNKNOWN = -1,
VIEW_GLOBALS = 0,
VIEW_PATTERNS,
VIEW_SAMPLES,
VIEW_INSTRUMENTS,
VIEW_COMMENTS,
VIEW_PLUGINS,
MAX_PAGES
};
protected:
CModTabCtrl m_TabCtrl;
CModControlDlg *m_Pages[MAX_PAGES];
int m_nActiveDlg, m_nInstrumentChanged;
HWND m_hWndView, m_hWndMDI;
protected: // create from serialization only
CModControlView();
DECLARE_DYNCREATE(CModControlView)
public:
virtual ~CModControlView() {}
CModDoc* GetDocument() const { return (CModDoc *)m_pDocument; }
void SampleChanged(SAMPLEINDEX smp);
void InstrumentChanged(int nInstr=-1) { m_nInstrumentChanged = nInstr; }
int GetInstrumentChange() const { return m_nInstrumentChanged; }
void SetMDIParentFrame(HWND hwnd) { m_hWndMDI = hwnd; }
void ForceRefresh();
CModControlDlg *GetCurrentControlDlg() { return m_Pages[m_nActiveDlg]; }
protected:
void RecalcLayout();
void UpdateView(UpdateHint hint, CObject *pHint = nullptr);
BOOL SetActivePage(int nIndex = -1, LPARAM lParam=-1);
public:
int GetActivePage() const { return m_nActiveDlg; }
protected:
//{{AFX_VIRTUAL(CModControlView)
public:
BOOL PreCreateWindow(CREATESTRUCT& cs) override;
protected:
void OnInitialUpdate() override; // called first time after construct
void OnDraw(CDC *) override {}
void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) override;
//}}AFX_VIRTUAL
protected:
//{{AFX_MSG(CModControlView)
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnDestroy();
afx_msg void OnTabSelchange(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnEditCut() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_CUT, 0); }
afx_msg void OnEditCopy() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_COPY, 0); }
afx_msg void OnEditPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTE, 0); }
afx_msg void OnEditMixPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE, 0); } //rewbs.mixPaste
afx_msg void OnEditMixPasteITStyle() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE_ITSTYLE, 0); }
afx_msg void OnEditFind() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_FIND, 0); }
afx_msg void OnEditFindNext() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_FINDNEXT, 0); }
afx_msg void OnSwitchToView() { if (m_hWndView) ::PostMessage(m_hWndView, WM_MOD_VIEWMSG, VIEWMSG_SETFOCUS, 0); }
afx_msg LRESULT OnActivateModView(WPARAM, LPARAM);
afx_msg LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnGetToolTipText(WPARAM, LPARAM);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// Non-client button attributes
#define NCBTNS_MOUSEOVER 0x01
#define NCBTNS_CHECKED 0x02
#define NCBTNS_DISABLED 0x04
#define NCBTNS_PUSHED 0x08
class CModScrollView: public CScrollView
{
protected:
HWND m_hWndCtrl;
int m_nScrollPosX, m_nScrollPosY;
int m_nDPIx, m_nDPIy; // Cached DPI settings
public:
DECLARE_SERIAL(CModScrollView)
CModScrollView() : m_hWndCtrl(nullptr), m_nScrollPosX(0), m_nScrollPosY(0) { }
virtual ~CModScrollView() {}
public:
CModDoc* GetDocument() const { return (CModDoc *)m_pDocument; }
LRESULT SendCtrlMessage(UINT uMsg, LPARAM lParam=0) const;
void SendCtrlCommand(int id) const;
BOOL PostCtrlMessage(UINT uMsg, LPARAM lParam=0) const;
void UpdateIndicator(LPCTSTR lpszText = nullptr);
public:
//{{AFX_VIRTUAL(CModScrollView)
void OnInitialUpdate() override;
void OnDraw(CDC *) override {}
void OnPrepareDC(CDC*, CPrintInfo*) override {}
void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) override;
virtual void UpdateView(UpdateHint, CObject *) {}
virtual LRESULT OnModViewMsg(WPARAM wParam, LPARAM lParam);
virtual BOOL OnDragonDrop(BOOL, const DRAGONDROP *) { return FALSE; }
virtual LRESULT OnPlayerNotify(Notification *) { return 0; }
//}}AFX_VIRTUAL
CModControlDlg *GetControlDlg() { return static_cast<CModControlView *>(CWnd::FromHandle(m_hWndCtrl))->GetCurrentControlDlg(); }
protected:
//{{AFX_MSG(CModScrollView)
afx_msg void OnDestroy();
afx_msg LRESULT OnReceiveModViewMsg(WPARAM wParam, LPARAM lParam);
afx_msg BOOL OnMouseWheel(UINT fFlags, short zDelta, CPoint point);
afx_msg void OnMouseHWheel(UINT fFlags, short zDelta, CPoint point);
afx_msg LRESULT OnDragonDropping(WPARAM bDoDrop, LPARAM lParam) { return OnDragonDrop((BOOL)bDoDrop, (const DRAGONDROP *)lParam); }
afx_msg LRESULT OnUpdatePosition(WPARAM, LPARAM);
afx_msg LRESULT OnDPIChanged(WPARAM = 0, LPARAM = 0);
// Fixes for 16-bit limitation in MFC's CScrollView
BOOL OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll = TRUE) override;
BOOL OnScrollBy(CSize sizeScroll, BOOL bDoScroll = TRUE) override;
int SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE);
void SetScrollSizes(int nMapMode, SIZE sizeTotal, const SIZE& sizePage = CScrollView::sizeDefault, const SIZE& sizeLine = CScrollView::sizeDefault);
BOOL OnGesturePan(CPoint ptFrom, CPoint ptTo) override;
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
OPENMPT_NAMESPACE_END