1 /*
2 ===========================================================================
3 
4 Doom 3 GPL Source Code
5 Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
6 
7 This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
8 
9 Doom 3 Source Code is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13 
14 Doom 3 Source Code is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with Doom 3 Source Code.  If not, see <http://www.gnu.org/licenses/>.
21 
22 In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code.  If not, please request a copy in writing from id Software at the address below.
23 
24 If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
25 
26 ===========================================================================
27 */
28 
29 #ifndef _GEWORKSPACE_H_
30 #define _GEWORKSPACE_H_
31 
32 #ifndef GESELECTIONMGR_H_
33 #include "GESelectionMgr.h"
34 #endif // GESELECTIONMGR_H_
35 
36 #ifndef GEMODIFIERSTACK_H_
37 #include "GEModifierStack.h"
38 #endif // GEMODIFIERSTACK_H_
39 
40 class rvGEApp;
41 
42 class rvGEClipboardItem
43 {
44 public:
45 
46 	idDict	mStateDict;
47 	idDict	mScriptDict;
48 	idDict	mVarDict;
49 };
50 
51 class rvGEWorkspace
52 {
53 public:
54 
55 	enum ESourceControlState
56 	{
57 		SCS_NONE,
58 		SCS_CHECKEDOUT,
59 		SCS_CHECKEDIN,
60 	};
61 
62 	enum EZoomLevel
63 	{
64 		ZOOM_MIN,
65 		ZOOM_25,
66 		ZOOM_33,
67 		ZOOM_50,
68 		ZOOM_66,
69 		ZOOM_100,
70 		ZOOM_150,
71 		ZOOM_200,
72 		ZOOM_300,
73 		ZOOM_MAX
74 	};
75 
76 	enum EItemAlign
77 	{
78 		ALIGN_LEFTS,
79 		ALIGN_CENTERS,
80 		ALIGN_RIGHTS,
81 		ALIGN_TOPS,
82 		ALIGN_MIDDLES,
83 		ALIGN_BOTTOMS,
84 	};
85 
86 	rvGEWorkspace ( rvGEApp* app );
87 	~rvGEWorkspace ( );
88 
89 	// Attach the workspace to a win32 window
90 	bool					Attach					( HWND wnd );
91 
92 	// Detach the workspace from the current win32 window
93 	void					Detach					( void );
94 
95 	bool					NewFile					( void );
96 	bool					LoadFile				( const char* filename, idStr* error = NULL );
97 	bool					SaveFile				( const char* filename );
98 	const char*				GetFilename				( void );
99 
100 	// Source control methods
101 	bool					CheckOut				( void );
102 	bool					CheckIn					( void );
103 	bool					UndoCheckout			( void );
104 	ESourceControlState		GetSourceControlState	( void );
105 
106 	void					Render					( HDC hDC );
107 
108 	rvGEApp*				GetApplication			( void );
109 
110 	void					HideSelected			( void );
111 	void					UnhideSelected			( void );
112 	void					DeleteSelected			( void );
113 	bool					EditSelectedProperties	( void );
114 	bool					EditSelectedScripts		( void );
115 	void					BringSelectedForward	( void );
116 	void					BringSelectedToFront	( void );
117 	void					SendSelectedBackward	( void );
118 	void					SendSelectedToBack		( void );
119 	void					AlignSelected			( EItemAlign align );
120 	void					MakeSelectedSameSize	( bool width, bool height );
121 	void					MakeSelectedAChild		( void );
122 
123 	bool					CanHide					( void );
124 	void					ShowHidden				( void );
125 	void					HideWindow				( idWindow* window );
126 	void					UnhideWindow			( idWindow* window );
127 
128 	EZoomLevel				ZoomIn					( void );
129 	EZoomLevel				ZoomOut					( void );
130 	EZoomLevel				GetZoom					( void );
131 	float					GetZoomScale			( void );
132 
133 	static rvGEWorkspace*		GetWorkspace			( HWND wnd );
134 	rvGEModifierStack&			GetModifierStack		( void );
135 	idUserInterfaceLocal*		GetInterface			( void );
136 	rvGESelectionMgr&			GetSelectionMgr			( void );
137 	idList<rvGEClipboardItem*>	GetClipboard			( void );
138 	HWND						GetWindow				( void );
139 
140 	void					HandleMessage			( UINT msg, WPARAM wParam, LPARAM lParam );
141 
142 	idVec2&					WindowToWorkspace		( idVec2& point );
143 	idVec2&					WorkspaceToWindow		( idVec2& point );
144 	idRectangle&			WindowToWorkspace		( idRectangle& rect );
145 	idRectangle&			WorkspaceToWindow		( idRectangle& rect );
146 
147 	bool					IsModified				( void );
148 	bool					IsNew					( void );
149 
150 	idWindow*				AddWindow				( rvGEWindowWrapper::EWindowType type );
151 
152 //	void					Cut						( void );
153 	void					Copy					( void );
154 	void					Paste					( void );
155 
156 	void					AddModifierMove			( const char* modName, float x, float y, bool snap );
157 	void					AddModifierSize			( const char* modName, float l, float t, float r, float b, bool snap );
158 
159 	void					SetModified				( bool mod );
160 
161 protected:
162 
163 	enum EModifierType
164 	{
165 		MOD_UNKNOWN,
166 		MOD_DELETE,
167 		MOD_HIDE,
168 		MOD_UNHIDE,
169 		MOD_SHOWHIDDEN,
170 		MOD_SEND_BACKWARD,
171 		MOD_BRING_FORWARD,
172 		MOD_SEND_BACK,
173 		MOD_BRING_FRONT,
174 	};
175 
176 	bool					SetupPixelFormat	( void );
177 	void					UpdateSelections	( void );
178 
179 	// Additional rendering routines
180 	void					RenderGrid			( void );
181 
182 	// File related methods
183 	void					WriteTabs			( idFile* file, int depth );
184 	bool					WriteWindow			( idFile* file, int depth, idWindow* window );
185 
186 	// Message handlers
187 	int						HandleRButtonDown	( WPARAM wParam, LPARAM lParam );
188 	int						HandleLButtonDown	( WPARAM wParam, LPARAM lParam );
189 	int						HandleLButtonUp		( WPARAM wParam, LPARAM lParam );
190 	int						HandleLButtonDblClk	( WPARAM wParam, LPARAM lParam );
191 	int						HandleMButtonDown	( WPARAM wParam, LPARAM lParam );
192 	int						HandleMButtonUp		( WPARAM wParam, LPARAM lParam );
193 	int						HandleMouseMove		( WPARAM wParam, LPARAM lParam );
194 	int						HandleKeyDown		( WPARAM wParam, LPARAM lParam );
195 	int						HandleScroll		( int scrollbar, WPARAM wParam, LPARAM lParam );
196 	int						HandleCommand		( WPARAM wParam, LPARAM lParam );
197 
198 	// General protected functions
199 	void					UpdateScrollbars	( void );
200 	void					UpdateRectangle		( bool useScroll = true );
201 	void					UpdateCursor		( void );
202 	void					UpdateCursor		( float x, float y );
203 	void					UpdateCursor		( rvGESelectionMgr::EHitTest type );
204 	void					UpdateTitle			( void );
205 	idWindow*				NewWindow			( idDict* state, rvGEWindowWrapper::EWindowType type );
206 	void					Scroll				( int scrollbar, int offset );
207 
208 	// Modifier methods
209 	void					AddModifierMoveNudge( float x, float y, bool snap );
210 	void					AddModifierSizeNudge( float w, float h, bool snap );
211 	void					AddModifierShowAll	( void );
212 
213 	void					AddModifiers		( EModifierType type, ... );
214 	void					AddModifiers		( idWindow* window, EModifierType type, ... );
215 	rvGEModifier*			CreateModifier		( EModifierType type, idWindow* window, va_list args );
216 
217 	idUserInterfaceLocal*		mInterface;
218 	HWND						mWnd;
219 
220 	int							mZoom;
221 	idRectangle					mRect;
222 
223 	bool						mScrollHorz;
224 	bool						mScrollVert;
225 
226 	int							mWindowWidth;
227 	int							mWindowHeight;
228 
229 	idStr						mFilename;
230 
231 	rvGEModifierStack			mModifiers;
232 	rvGESelectionMgr			mSelections;
233 
234 	rvGESelectionMgr::EHitTest	mDragType;
235 	idVec2						mDragPoint;
236 	int							mDragTime;
237 	bool						mDragX;
238 	bool						mDragY;
239 	bool						mDragScroll;
240 
241 	rvGEApp*					mApplication;
242 
243 	static idList<rvGEClipboardItem*>	mClipboard;
244 	idList<idWindow*>					mSelectMenu;
245 	idVec2								mSelectMenuPos;
246 
247 private:
248 
249 	static bool				CleanupEnumProc			( rvGEWindowWrapper* wrapper, void* data );
250 	static bool				ShowAllEnumProc			( rvGEWindowWrapper* wrapper, void* data );
251 	static bool				BuildSelectMenuEnumProc	( rvGEWindowWrapper* wrapper, void* data );
252 
253 	// States
254 	bool					mModified;
255 	bool					mNew;
256 	bool					mDontAdd;
257 	ESourceControlState		mSourceControlState;
258 
259 	// Resources
260 	HCURSOR					mHandCursor;
261 };
262 
GetZoom(void)263 ID_INLINE rvGEWorkspace::EZoomLevel rvGEWorkspace::GetZoom ( void )
264 {
265 	return (EZoomLevel)mZoom;
266 }
267 
GetWorkspace(HWND wnd)268 ID_INLINE rvGEWorkspace* rvGEWorkspace::GetWorkspace ( HWND wnd )
269 {
270 	return (rvGEWorkspace*) GetWindowLong ( wnd, GWL_USERDATA );
271 }
272 
GetFilename(void)273 ID_INLINE const char* rvGEWorkspace::GetFilename ( void )
274 {
275 	return mFilename;
276 }
277 
IsModified(void)278 ID_INLINE bool rvGEWorkspace::IsModified ( void )
279 {
280 	return mModified;
281 }
282 
IsNew(void)283 ID_INLINE bool rvGEWorkspace::IsNew ( void )
284 {
285 	return mNew;
286 }
287 
GetModifierStack(void)288 ID_INLINE rvGEModifierStack& rvGEWorkspace::GetModifierStack ( void )
289 {
290 	return mModifiers;
291 }
292 
GetSelectionMgr(void)293 ID_INLINE rvGESelectionMgr& rvGEWorkspace::GetSelectionMgr ( void )
294 {
295 	return mSelections;
296 }
297 
ShowHidden(void)298 ID_INLINE void rvGEWorkspace::ShowHidden ( void )
299 {
300 	AddModifierShowAll ( );
301 }
302 
AddModifierMoveNudge(float x,float y,bool snap)303 ID_INLINE void rvGEWorkspace::AddModifierMoveNudge ( float x, float y, bool snap )
304 {
305 	AddModifierMove ( "Nudge Move", x, y, snap );
306 }
307 
AddModifierSizeNudge(float w,float h,bool snap)308 ID_INLINE void rvGEWorkspace::AddModifierSizeNudge ( float w, float h, bool snap )
309 {
310 	AddModifierSize ( "Nudge Size", 0, 0, w, h, snap );
311 }
312 
GetInterface(void)313 ID_INLINE idUserInterfaceLocal* rvGEWorkspace::GetInterface ( void )
314 {
315 	return mInterface;
316 }
317 
GetApplication(void)318 ID_INLINE rvGEApp* rvGEWorkspace::GetApplication ( void )
319 {
320 	return mApplication;
321 }
322 
GetWindow(void)323 ID_INLINE HWND rvGEWorkspace::GetWindow ( void )
324 {
325 	return mWnd;
326 }
327 
GetClipboard(void)328 ID_INLINE idList<rvGEClipboardItem*> rvGEWorkspace::GetClipboard ( void )
329 {
330 	return mClipboard;
331 }
332 
GetSourceControlState(void)333 ID_INLINE rvGEWorkspace::ESourceControlState rvGEWorkspace::GetSourceControlState ( void )
334 {
335 	return mSourceControlState;
336 }
337 
338 #endif // _GEWORKSPACE_H_
339