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