aboutsummaryrefslogtreecommitdiff
path: root/Src/external_dependencies/openmpt-trunk/mptrack/PatternFindReplaceDlg.h
blob: afd640b82f9fc603ed538bc79938e0946db25d65 (plain) (blame)
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
/*
 * PatternFindReplaceDlg.h
 * -----------------------
 * Purpose: The find/replace dialog for pattern data.
 * Notes  : (currently none)
 * Authors: Olivier Lapicque
 *          OpenMPT Devs
 * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
 */

#pragma once

#include "openmpt/all/BuildSettings.hpp"

#include "EffectInfo.h"
#include "PatternCursor.h"

OPENMPT_NAMESPACE_BEGIN

/////////////////////////////////////////////////////////////////////////
// Search/Replace

struct FindReplace;

class CFindReplaceTab: public CPropertyPage
{
protected:
	CComboBox m_cbnNote, m_cbnInstr, m_cbnVolCmd, m_cbnVolume, m_cbnCommand, m_cbnParam, m_cbnPCParam;

	CSoundFile &m_sndFile;
	FindReplace &m_settings;
	EffectInfo m_effectInfo;
	ModCommand m_initialValues;
	bool m_isReplaceTab;

	// Special ItemData values
	enum
	{
		kFindAny = INT_MAX - 1,
		kFindRange = INT_MAX - 2,

		kReplaceRelative = INT_MAX - 3,
		kReplaceMultiply = INT_MAX - 4,

		kReplaceNoteMinusOne = INT_MAX - 5,
		kReplaceNotePlusOne = INT_MAX - 6,
		kReplaceNoteMinusOctave = INT_MAX - 7,
		kReplaceNotePlusOctave = INT_MAX - 8,

		kReplaceInstrumentMinusOne = INT_MAX - 5,
		kReplaceInstrumentPlusOne = INT_MAX - 6,
	};

public:
	CFindReplaceTab(UINT nIDD, bool isReplaceTab, CSoundFile &sf, FindReplace &settings, const ModCommand &initialValues)
		: CPropertyPage(nIDD)
		, m_sndFile(sf)
		, m_settings(settings)
		, m_effectInfo(sf)
		, m_initialValues(initialValues)
		, m_isReplaceTab(isReplaceTab)
	{ }

protected:
	BOOL OnInitDialog() override;
	void OnOK() override;
	void DoDataExchange(CDataExchange* pDX) override;

	bool IsPCEvent() const;
	
	void UpdateInstrumentList();
	void UpdateVolumeList();
	void UpdateParamList();

	// When a combobox is focussed, check the corresponding checkbox.
	void CheckOnChange(int nIDButton) { CheckDlgButton(nIDButton, BST_CHECKED); CheckReplace(nIDButton); };
	afx_msg void OnNoteChanged();
	afx_msg void OnInstrChanged();
	afx_msg void OnVolCmdChanged()	{ CheckOnChange(IDC_CHECK3); UpdateVolumeList(); };
	afx_msg void OnVolumeChanged();
	afx_msg void OnEffectChanged()	{ CheckOnChange(IDC_CHECK5); UpdateParamList(); };
	afx_msg void OnParamChanged();
	afx_msg void OnPCParamChanged();
	// When a checkbox is checked, also check "Replace By".
	afx_msg void OnCheckNote()		{ CheckReplace(IDC_CHECK1); };
	afx_msg void OnCheckInstr()		{ CheckReplace(IDC_CHECK2); };
	afx_msg void OnCheckVolCmd()	{ CheckReplace(IDC_CHECK3); };
	afx_msg void OnCheckVolume()	{ CheckReplace(IDC_CHECK4); };
	afx_msg void OnCheckEffect()	{ CheckReplace(IDC_CHECK5); };
	afx_msg void OnCheckParam()		{ CheckReplace(IDC_CHECK6); };
	// Check "Replace By"
	afx_msg void CheckReplace(int nIDButton)	{ if(m_isReplaceTab && IsDlgButtonChecked(nIDButton)) CheckDlgButton(IDC_CHECK7, BST_CHECKED); };

	afx_msg void OnCheckChannelSearch();

	void RelativeOrMultiplyPrompt(CComboBox &comboBox, FindReplace::ReplaceMode &action, int &value, int range, bool isHex);
	DECLARE_MESSAGE_MAP()
};

OPENMPT_NAMESPACE_END