1 /*
2  * Copyright (C) 2002 - David W. Durham
3  *
4  * This file is part of ReZound, an audio editing application.
5  *
6  * ReZound is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published
8  * by the Free Software Foundation; either version 2 of the License,
9  * or (at your option) any later version.
10  *
11  * ReZound is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
19  */
20 
21 #ifndef __CMainWindow_H__
22 #define __CMainWindow_H__
23 
24 #include "../../config/common.h"
25 #include "fox_compat.h"
26 
27 #include <map>
28 #include <vector>
29 #include <string>
30 
31 class CSoundWindow;
32 class CMetersWindow;
33 class CActionMenuCommand;
34 class CNestedDataFile;
35 class AActionFactory;
36 
37 class CMainWindow : public FXMainWindow
38 {
39 	FXDECLARE(CMainWindow)
40 public:
41 
42 	CMainWindow(FXApp* a);
43 	virtual ~CMainWindow();
44 
45 	virtual void show();
46 	virtual void hide();
47 
48 	void createMenus();
49 
50 	long onQuit(FXObject *sender,FXSelector sel,void *ptr);
51 
52 	long onSetupKeyBindings(FXObject *sender,FXSelector sel,void *ptr);
53 
54 	long onFollowPlayPositionButton(FXObject *sender,FXSelector sel,void *ptr);
55 
56 	long onRenderClippingWarningButton(FXObject *sender,FXSelector sel,void *ptr);
57 
58 	long onDrawVerticalCuePositionsButton(FXObject *sender,FXSelector sel,void *ptr);
59 
60 	long onCrossfadeEdgesComboBox(FXObject *sender,FXSelector sel,void *ptr);
61 	long onCrossfadeEdgesSettings(FXObject *sender,FXSelector sel,void *ptr);
62 
63 	long onClipboardComboBox(FXObject *sender,FXSelector sel,void *ptr);
64 
65 	// file action events
66 	long onFileAction(FXObject *sender,FXSelector sel,void *ptr);
67 	long onRecordingMacroTimer(FXObject *sender,FXSelector sel,void *ptr);
68 
69 	// play/record/transport/misc control events
70 	long onControlAction(FXObject *sender,FXSelector sel,void *ptr);
71 
72 	long onShuttleReturn(FXObject *sender,FXSelector sel,void *ptr);
73 	long onShuttleChange(FXObject *sender,FXSelector sel,void *ptr);
74 	void positionShuttleGivenSpeed(double seekSpeed,const string shuttleControlScalar,bool springBack);
75 	long onShuttleDialSpringButton(FXObject *sender,FXSelector sel,void *ptr);
76 	long onShuttleDialScaleButton(FXObject *sender,FXSelector sel,void *ptr);
77 
78 	long onSoundListChange(FXObject *sender,FXSelector sel,void *ptr);
79 	long onSoundListHotKey(FXObject *sender,FXSelector sel,void *ptr);
80 
81 	long onHotKeyFocusFixup(FXObject *sender,FXSelector sel,void *ptr);
82 
83 	// used to control the shuttle control with the keyboard
84 	long onKeyboardShuttle(FXObject *sender,FXSelector sel,void *ptr);
85 
86 	long onViewKey(FXObject *sender,FXSelector sel,void *ptr); // main window gets view-change key presses because the sound window changes and we can't bind a key to any particualar object pointer
87 
88 	long onKeyPress(FXObject *sender,FXSelector sel,void *ptr);
89 	long onKeyRelease(FXObject *sender,FXSelector sel,void *ptr);
90 	long onMouseEnter(FXObject *sender,FXSelector sel,void *ptr);
91 
92 	long onDebugButton(FXObject *sender,FXSelector sel,void *ptr);
93 
94 
95 	enum
96 	{
97 		ID_REOPEN_FILE=FXMainWindow::ID_LAST,
98 		ID_CLOSE_FILE,
99 		ID_REVERT_FILE,
100 
101 		ID_RECORD_MACRO,
102 		ID_RECORDING_MACRO_TIMER,
103 
104 		ID_EDIT_USERNOTES,
105 
106 		ID_RECENT_ACTION,
107 
108 		ID_SHOW_ABOUT,
109 
110 		ID_SETUP_KEY_BINDINGS,
111 
112 		ID_QUIT,
113 
114 		ID_RECORD,
115 
116 		ID_PLAY_ALL_ONCE,
117 		ID_PLAY_ALL_LOOPED,
118 		ID_PLAY_SELECTION_ONCE,
119 		ID_PLAY_SELECTION_LOOPED,
120 		ID_PLAY_SELECTION_LOOPED_SKIP_MOST,
121 		ID_PLAY_SELECTION_LOOPED_GAP_BEFORE_REPEAT,
122 		ID_PLAY_SELECTION_START_TO_END,
123 		ID_PLAY_LEFT_EDGE_OF_SCREEN_TO_END,
124 
125 		ID_STOP,
126 		ID_PAUSE,
127 
128 		ID_JUMP_TO_BEGINNING,
129 		ID_JUMP_TO_SELECTION_START,
130 
131 		ID_JUMP_TO_PREV_CUE,
132 		ID_JUMP_TO_NEXT_CUE,
133 
134 		ID_SHUTTLE_DIAL,
135 		ID_SHUTTLE_DIAL_SPRING_BUTTON,
136 		ID_SHUTTLE_DIAL_SCALE_BUTTON,
137 
138 		// used for key bindings
139 		ID_SHUTTLE_RETURN,
140 		ID_SHUTTLE_BACKWARD,
141 		ID_SHUTTLE_INCREASE_RATE,
142 		ID_SHUTTLE_FORWARD,
143 
144 
145 		ID_FIND_SELECTION_START,
146 		ID_FIND_SELECTION_STOP,
147 
148 		ID_ZOOM_IN,
149 		ID_ZOOM_FIT_SELECTION,
150 		ID_ZOOM_OUT,
151 		ID_ZOOM_OUT_FULL,
152 
153 		ID_TOGGLE_LEVEL_METERS,
154 		ID_TOGGLE_STEREO_PHASE_METERS,
155 		ID_TOGGLE_FREQUENCY_ANALYZER,
156 
157 		ID_UNDO_EDIT,
158 		ID_CLEAR_UNDO_HISTORY,
159 
160 		ID_REDRAW,
161 
162 		ID_DEFRAG_MENUITEM,
163 		ID_PRINT_SAT_MENUITEM,
164 		ID_VERIFY_SAT_MENUITEM,
165 
166 		ID_FOLLOW_PLAY_POSITION_TOGGLE,
167 
168 		ID_RENDER_CLIPPING_WARNING_TOGGLE,
169 
170 		ID_DRAW_VERTICAL_CUE_POSITIONS_TOGGLE,
171 
172 		ID_CROSSFADE_EDGES_COMBOBOX,
173 		ID_CROSSFADE_EDGES_SETTINGS_BUTTON,
174 
175 		ID_CLIPBOARD_COMBOBOX,
176 
177 		ID_SOUND_LIST,
178 
179 		ID_SOUND_LIST_HOTKEY_PREV,
180 		ID_SOUND_LIST_HOTKEY1,
181 		ID_SOUND_LIST_HOTKEY2,
182 		ID_SOUND_LIST_HOTKEY3,
183 		ID_SOUND_LIST_HOTKEY4,
184 		ID_SOUND_LIST_HOTKEY5,
185 		ID_SOUND_LIST_HOTKEY6,
186 		ID_SOUND_LIST_HOTKEY7,
187 		ID_SOUND_LIST_HOTKEY8,
188 		ID_SOUND_LIST_HOTKEY9,
189 		ID_SOUND_LIST_HOTKEY10,
190 
191 		ID_LAST
192 	};
193 
194 	void rebuildSoundWindowList();
getParentOfSoundWindows()195 	FXComposite *getParentOfSoundWindows() { return soundWindowFrame; }
196 
getMetersWindow()197 	CMetersWindow *getMetersWindow() { return metersWindow; }
198 
199 	void actionMenuCommandTriggered(CActionMenuCommand *actionMenuCommand);
200 
201 	void setWhichClipboard(size_t whichClipboard);
202 
203 protected:
204 
CMainWindow()205 	CMainWindow() {}
206 
207 
208 private:
209 	map<const string,FXMenuCaption *> menuItemRegistry;
210 	void buildActionMap();
211 	void buildMenu(FXMenuPane *menu,const CNestedDataFile *menuLayoutFile,const string menuKey,const string itemName);
212 
213 	FXMenuBar 		*menubar;
214 	FXMenuPane		*dummymenu;
215 	FXPacker		*contents;		// top horizontal main frame which contains play controls and action controls
216 	FXPacker 		*soundWindowFrame; 	// parent of all sound windows (only one is visible though)
217 	CMetersWindow		*metersWindow;
218 
219 	FXFont *shuttleFont;
220 	FXFont *soundListFont;
221 	FXFont *soundListHeaderFont;
222 
223 	FXDial *shuttleDial;
224 	FXLabel *shuttleLabel;
225 	FXToggleButton *shuttleDialSpringButton;
226 	FXButton *shuttleDialScaleButton;
227 
228 	FXCheckButton	*followPlayPositionButton;
229 	FXCheckButton	*renderClippingWarningButton;
230 	FXCheckButton	*drawVerticalCuePositionsButton;
231 	FXComboBox	*crossfadeEdgesComboBox;
232 	FXComboBox	*clipboardComboBox;
233 	FXButton	*recordMacroButton;
234 
235 	FXIconList *soundList;
236 
237 	FXCursor *playMouseCursor;
238 	FXCursor *addCueMouseCursor;
239 
240 	FXMenuCommand *toggleLevelMetersMenuItem;
241 	FXMenuCommand *toggleStereoPhaseMetersMenuItem;
242 	FXMenuCommand *toggleFrequencyAnalyzerMenuItem;
243 
244 	FXMenuPane *recentActionsMenu;
245 
246 	friend class CRecentActionsPopup;
247 	vector<CActionMenuCommand *> recentActions;
248 
249 	AActionFactory *reopenActionFactory;
250 
251 	void addActionToKeyBindingRegistery(const string name,FXMenuCommand *mc);
252 	void setupKeyBindings();
253 
254 	void buildLADSPAMenus();
255 };
256 
257 
258 
259 #endif
260