]>
Commit | Line | Data |
---|---|---|
457814b5 JS |
1 | ///////////////////////////////////////////////////////////////////////////// |
2 | // Name: reseditr.h | |
3 | // Purpose: Resource editor class | |
4 | // Author: Julian Smart | |
5 | // Modified by: | |
6 | // Created: 04/01/98 | |
7 | // RCS-ID: $Id$ | |
8 | // Copyright: (c) Julian Smart | |
9 | // Licence: wxWindows license | |
10 | ///////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | #ifndef _RESEDITR_H_ | |
13 | #define _RESEDITR_H_ | |
14 | ||
f6bcfd97 | 15 | #define wxDIALOG_EDITOR_VERSION 2.1 |
457814b5 | 16 | |
ab7ce33c | 17 | #if defined(__GNUG__) && !defined(__APPLE__) |
457814b5 JS |
18 | #pragma interface "reseditr.h" |
19 | #endif | |
20 | ||
2fc9385a JS |
21 | #include "wx/deprecated/setup.h" |
22 | ||
457814b5 JS |
23 | #include "wx/wx.h" |
24 | #include "wx/string.h" | |
25 | #include "wx/layout.h" | |
ae8351fc JS |
26 | #include "wx/toolbar.h" |
27 | #include "wx/imaglist.h" | |
1195ec42 | 28 | #include "wx/treectrl.h" |
e70f5e13 | 29 | #include "wx/txtstrm.h" |
2fc9385a JS |
30 | |
31 | #include "wx/deprecated/resource.h" | |
32 | #include "wx/deprecated/proplist.h" | |
33 | ||
03f68f12 | 34 | #include "symbtabl.h" |
bbcdf8bc | 35 | #include "winstyle.h" |
457814b5 | 36 | |
f6bcfd97 BP |
37 | #define RESED_DELETE 301 |
38 | #define RESED_RECREATE 303 | |
39 | #define RESED_CLEAR 304 | |
40 | #define RESED_NEW_DIALOG 305 | |
41 | #define RESED_NEW_PANEL 306 | |
42 | #define RESED_TEST 310 | |
43 | #define RESED_CONVERT_WXRS 311 // Convert old WXRs to new | |
457814b5 | 44 | |
f6bcfd97 | 45 | #define RESED_CONTENTS 320 |
457814b5 | 46 | |
f6bcfd97 BP |
47 | #define IDC_TREECTRL 500 |
48 | #define IDC_LISTCTRL 501 | |
ae8351fc JS |
49 | |
50 | // For control list ('palette') | |
51 | #define RESED_POINTER 0 | |
52 | #define RESED_BUTTON 1 | |
53 | #define RESED_BMPBUTTON 2 | |
54 | #define RESED_STATICTEXT 3 | |
55 | #define RESED_STATICBMP 4 | |
56 | #define RESED_STATICBOX 5 | |
57 | #define RESED_TEXTCTRL_SINGLE 6 | |
58 | #define RESED_TEXTCTRL_MULTIPLE 7 | |
59 | #define RESED_LISTBOX 8 | |
60 | #define RESED_CHOICE 9 | |
61 | #define RESED_COMBOBOX 10 | |
62 | #define RESED_CHECKBOX 11 | |
63 | #define RESED_SLIDER 12 | |
64 | #define RESED_GAUGE 13 | |
65 | #define RESED_RADIOBOX 14 | |
66 | #define RESED_RADIOBUTTON 15 | |
67 | #define RESED_SCROLLBAR 16 | |
68 | #define RESED_TREECTRL 17 | |
69 | #define RESED_LISTCTRL 18 | |
70 | #define RESED_SPINBUTTON 19 | |
71 | ||
457814b5 | 72 | /* |
f6bcfd97 BP |
73 | * Controls loading, saving, user interface of resource editor(s). |
74 | */ | |
457814b5 JS |
75 | |
76 | class wxResourceEditorFrame; | |
457814b5 JS |
77 | class EditorToolBar; |
78 | class wxWindowPropertyInfo; | |
ae8351fc JS |
79 | class wxResourceEditorProjectTree; |
80 | class wxResourceEditorControlList; | |
457814b5 | 81 | |
2049ba38 | 82 | #ifdef __WXMSW__ |
457814b5 JS |
83 | #define wxHelpController wxWinHelpController |
84 | #else | |
b127f301 | 85 | #define wxHelpController wxHTMLHelpController; |
457814b5 JS |
86 | #endif |
87 | ||
88 | class wxHelpController; | |
89 | ||
90 | /* | |
f6bcfd97 BP |
91 | * The resourceTable contains a list of wxItemResources (which each may |
92 | * have further children, defining e.g. a dialog box with controls). | |
93 | * | |
94 | * We need to associate actual windows with each wxItemResource, | |
95 | * instead of the current 'one current window' scheme. | |
96 | * | |
97 | * - We create a new dialog, create a wxItemResource, | |
98 | * associate the dialog with wxItemResource via a hash table. | |
99 | * Must be a hash table in case dialog is deleted without | |
100 | * telling the resource manager. | |
101 | * - When we save the resource after editing/closing the dialog, | |
102 | * we check the wxItemResource/wxDialog and children for | |
103 | * consistency (throw away items no longer in the wxDialog, | |
104 | * create any new wxItemResources). | |
105 | * - We save the wxItemResources via the wxPropertyInfo classes, | |
106 | * so devolve the code to the appropriate class. | |
107 | * This involves creating a new temporary wxPropertyInfo for | |
108 | * the purpose. | |
109 | * | |
110 | * We currently assume we only create one instance of a window for | |
111 | * each wxItemResource. We will need to relax this when we're editing | |
112 | * in situ. | |
113 | * | |
114 | * | |
bbcdf8bc | 115 | */ |
457814b5 | 116 | |
f6bcfd97 BP |
117 | class wxResourceTableWithSaving: public wxResourceTable |
118 | { | |
119 | public: | |
120 | wxResourceTableWithSaving():wxResourceTable() | |
121 | { | |
122 | // Add all known window styles | |
123 | m_styleTable.Init(); | |
124 | } | |
125 | virtual bool Save(const wxString& filename); | |
126 | virtual bool SaveResource(wxTextOutputStream& stream, wxItemResource* item, wxItemResource* parentItem); | |
127 | ||
128 | void GeneratePanelStyleString(long windowStyle, char *buf); | |
129 | void GenerateDialogStyleString(long windowStyle, char *buf); | |
130 | ||
131 | void GenerateControlStyleString(const wxString& windowClass, long windowStyle, char *buf); | |
132 | ||
133 | void OutputFont(wxTextOutputStream& stream, const wxFont& font); | |
134 | wxControl *CreateItem(wxPanel *panel, const wxItemResource *childResource, const wxItemResource* parentResource); | |
135 | ||
bbcdf8bc | 136 | protected: |
f6bcfd97 | 137 | wxWindowStyleTable m_styleTable; |
457814b5 | 138 | }; |
f6bcfd97 | 139 | |
ae8351fc JS |
140 | class wxResourceEditorScrolledWindow; |
141 | ||
457814b5 JS |
142 | class wxResourceManager: public wxObject |
143 | { | |
f6bcfd97 BP |
144 | friend class wxResourceEditorFrame; |
145 | ||
ae8351fc | 146 | public: |
f6bcfd97 BP |
147 | wxResourceManager(); |
148 | ~wxResourceManager(); | |
149 | ||
150 | // Operations | |
151 | ||
152 | // Initializes the resource manager | |
153 | bool Initialize(); | |
154 | ||
155 | // Load/save window size etc. | |
156 | bool LoadOptions(); | |
157 | bool SaveOptions(); | |
158 | ||
159 | // Show or hide the resource editor frame, which displays a list | |
160 | // of resources with ability to edit them. | |
161 | virtual bool ShowResourceEditor(bool show, wxWindow *parent = NULL, const char *title = "wxWindows Dialog Editor"); | |
162 | ||
163 | // Convert old WXRs to new | |
164 | virtual bool ConvertWXRs(); | |
165 | bool DoConvertWXR(const wxString& oldPath, const wxString& newPath); | |
166 | bool ChangeOldToNewResource(wxItemResource* parent, wxItemResource* res); | |
167 | bool InsertLabelResource(wxItemResource* parent, wxItemResource* res); | |
168 | ||
169 | virtual bool Save(); | |
170 | virtual bool SaveAs(); | |
171 | virtual bool Save(const wxString& filename); | |
172 | virtual bool Load(const wxString& filename); | |
173 | virtual bool Clear(bool deleteWindows = TRUE, bool force = TRUE); | |
174 | virtual void SetFrameTitle(const wxString& filename); | |
175 | virtual void ClearCurrentDialog(); | |
176 | virtual bool New(bool loadFromFile = TRUE, const wxString& filename = ""); | |
177 | virtual bool SaveIfModified(); | |
178 | virtual void AlignItems(int flag); | |
179 | virtual void CopySize(int command); // Copy width, height or both from first control | |
180 | virtual void ToBackOrFront(bool toBack); | |
181 | virtual void DistributePositions(int command); // Distribute controls evenly between first and last | |
182 | virtual wxWindow *FindParentOfSelection(); | |
183 | ||
184 | virtual wxFrame *OnCreateEditorFrame(const char *title); | |
185 | virtual wxMenuBar *OnCreateEditorMenuBar(wxFrame *parent); | |
186 | virtual wxResourceEditorScrolledWindow *OnCreateEditorPanel(wxFrame *parent); | |
187 | virtual wxToolBar *OnCreateToolBar(wxFrame *parent); | |
188 | ||
58d5bf3a | 189 | // Create a window information object for the given window |
f6bcfd97 BP |
190 | wxWindowPropertyInfo* CreatePropertyInfoForWindow(wxWindow *win); |
191 | // Edit the given window | |
192 | void EditWindow(wxWindow *win); | |
193 | ||
194 | virtual void UpdateResourceList(); | |
195 | virtual void AddItemsRecursively(long parent, wxItemResource *resource); | |
196 | virtual bool EditSelectedResource(); | |
197 | virtual bool Edit(wxItemResource *res); | |
198 | virtual bool CreateNewPanel(); | |
199 | virtual bool CreatePanelItem(wxItemResource *panelResource, wxPanel *panel, char *itemType, int x = 10, int y = 10, bool isBitmap = FALSE); | |
200 | virtual bool DeleteSelection(); | |
201 | virtual bool TestCurrentDialog(wxWindow* parent); | |
202 | ||
203 | // Saves the window info into the resource, and deletes the | |
204 | // handler. Doesn't actually disassociate the window from | |
205 | // the resources. Replaces OnClose. | |
206 | virtual bool SaveInfoAndDeleteHandler(wxWindow* win); | |
207 | ||
208 | // Destroys the window. If this is the 'current' panel, NULLs the | |
209 | // variable. | |
210 | virtual bool DeleteWindow(wxWindow* win); | |
211 | virtual bool DeleteResource(wxItemResource *res); | |
212 | virtual bool DeleteResource(wxWindow *win); | |
213 | ||
214 | // Add bitmap resource if there isn't already one with this filename. | |
215 | virtual wxString AddBitmapResource(const wxString& filename); | |
216 | ||
217 | // Delete the bitmap resource if it isn't being used by another resource. | |
218 | virtual void PossiblyDeleteBitmapResource(const wxString& resourceName); | |
219 | ||
220 | // Helper function for above | |
221 | virtual bool IsBitmapResourceUsed(const wxString& resourceName); | |
222 | ||
223 | wxItemResource *FindBitmapResourceByFilename(const wxString& filename); | |
224 | ||
225 | wxString FindBitmapFilenameForResource(wxItemResource *resource); | |
226 | ||
227 | // Is this window identifier in use? | |
228 | bool IsSymbolUsed(wxItemResource* thisResource, wxWindowID id) ; | |
229 | ||
230 | // Is this window identifier compatible with the given name? (i.e. | |
231 | // does it already exist under a different name) | |
232 | bool IsIdentifierOK(const wxString& name, wxWindowID id); | |
233 | ||
234 | // Change all integer ids that match oldId, to newId. | |
235 | // This is necessary if an id is changed for one resource - all resources | |
236 | // must be changed. | |
237 | void ChangeIds(int oldId, int newId); | |
238 | ||
239 | // If any resource ids were missing (or their symbol was missing), | |
240 | // repair them i.e. give them new ids. Returns TRUE if any resource | |
241 | // needed repairing. | |
242 | bool RepairResourceIds(); | |
243 | ||
244 | // Deletes 'win' and creates a new window from the resource that | |
245 | // was associated with it. E.g. if you can't change properties on the | |
246 | // fly, you'll need to delete the window and create it again. | |
247 | virtual wxWindow *RecreateWindowFromResource(wxWindow *win, wxWindowPropertyInfo *info = NULL, bool instantiateFirst = TRUE); | |
248 | ||
249 | virtual bool RecreateSelection(); | |
250 | ||
251 | // Remove selection handles if this control is selected | |
252 | void DeselectItemIfNecessary(wxWindow *win); | |
253 | ||
254 | // Need to search through resource table removing this from | |
255 | // any resource which has this as a parent. | |
256 | virtual bool RemoveResourceFromParent(wxItemResource *res); | |
257 | ||
258 | virtual bool EditDialog(wxDialog *dialog, wxWindow *parent); | |
259 | ||
260 | void AddSelection(wxWindow *win); | |
261 | void RemoveSelection(wxWindow *win); | |
262 | ||
263 | virtual void MakeUniqueName(char *prefix, char *buf); | |
264 | ||
265 | // (Dis)associate resource<->physical window | |
266 | // Doesn't delete any windows. | |
267 | virtual void AssociateResource(wxItemResource *resource, wxWindow *win); | |
268 | virtual bool DisassociateResource(wxItemResource *resource); | |
269 | virtual bool DisassociateResource(wxWindow *win); | |
270 | virtual bool DisassociateWindows(); | |
271 | virtual wxItemResource *FindResourceForWindow(wxWindow *win); | |
272 | virtual wxWindow *FindWindowForResource(wxItemResource *resource); | |
273 | ||
274 | virtual bool InstantiateAllResourcesFromWindows(); | |
275 | virtual bool InstantiateResourceFromWindow(wxItemResource *resource, wxWindow *window, bool recurse = FALSE); | |
276 | ||
277 | // Accessors | |
278 | inline void SetEditorFrame(wxFrame *fr) { m_editorFrame = fr; } | |
279 | inline void SetEditorToolBar(EditorToolBar *tb) { m_editorToolBar = tb; } | |
280 | inline wxFrame *GetEditorFrame() const { return m_editorFrame; } | |
281 | inline wxResourceEditorProjectTree *GetEditorResourceTree() const { return m_editorResourceTree; } | |
282 | inline wxResourceEditorControlList *GetEditorControlList() const { return m_editorControlList; } | |
283 | inline wxList& GetSelections() { return m_selections; } | |
284 | inline wxMenu *GetPopupMenu() const { return m_popupMenu; } | |
d0fff5cb | 285 | #ifdef __WXMSW__ |
f6bcfd97 | 286 | inline wxHelpController *GetHelpController() const { return m_helpController; } |
d0fff5cb | 287 | #endif |
f6bcfd97 BP |
288 | |
289 | inline void Modify(bool mod = TRUE) { m_modified = mod; } | |
290 | inline bool Modified() const { return m_modified; } | |
291 | ||
292 | inline wxResourceTable& GetResourceTable() { return m_resourceTable; } | |
293 | inline wxHashTable& GetResourceAssociations() { return m_resourceAssociations; } | |
294 | ||
295 | inline wxString GetCurrentFilename() const { return m_currentFilename; } | |
296 | static wxResourceManager* GetCurrentResourceManager() { return sm_currentResourceManager; } | |
297 | ||
298 | inline void SetSymbolFilename(const wxString& s) { m_symbolFilename = s; } | |
299 | inline wxString GetSymbolFilename() const { return m_symbolFilename; } | |
300 | ||
301 | inline wxRect& GetPropertyWindowSize() { return m_propertyWindowSize; } | |
302 | inline wxRect& GetResourceEditorWindowSize() { return m_resourceEditorWindowSize; } | |
303 | ||
304 | wxResourceSymbolTable& GetSymbolTable() { return m_symbolTable; } | |
305 | ||
306 | // Generate a window id and a first stab at a name | |
307 | int GenerateWindowId(const wxString& prefix, wxString& idName) ; | |
308 | ||
309 | // Member variables | |
ae8351fc | 310 | protected: |
d0fff5cb | 311 | #ifdef __WXMSW__ |
f6bcfd97 | 312 | wxHelpController* m_helpController; |
d0fff5cb | 313 | #endif |
f6bcfd97 BP |
314 | wxResourceTableWithSaving m_resourceTable; |
315 | wxFrame* m_editorFrame; | |
316 | wxResourceEditorScrolledWindow* m_editorPanel; | |
317 | wxMenu* m_popupMenu; | |
318 | wxResourceEditorProjectTree* m_editorResourceTree; | |
319 | wxResourceEditorControlList* m_editorControlList; | |
320 | EditorToolBar* m_editorToolBar; | |
321 | int m_nameCounter; | |
322 | int m_symbolIdCounter; // For generating window ids | |
323 | bool m_modified; | |
324 | wxHashTable m_resourceAssociations; | |
325 | wxList m_selections; | |
326 | wxString m_currentFilename; | |
327 | wxBitmap* m_bitmapImage; // Default for static bitmaps/buttons | |
328 | ||
329 | wxImageList m_imageList; | |
330 | long m_rootDialogItem; // Root of dialog hierarchy in tree (unused) | |
331 | ||
332 | // Options to be saved/restored | |
333 | wxString m_optionsResourceFilename; // e.g. dialoged.ini, .dialogrc | |
334 | wxRect m_propertyWindowSize; | |
335 | wxRect m_resourceEditorWindowSize; | |
336 | static wxResourceManager* sm_currentResourceManager; | |
337 | ||
338 | // Symbol table with identifiers for controls | |
339 | wxResourceSymbolTable m_symbolTable; | |
340 | // Filename for include file, e.g. resource.h | |
341 | wxString m_symbolFilename; | |
457814b5 JS |
342 | }; |
343 | ||
ae8351fc | 344 | |
457814b5 JS |
345 | class wxResourceEditorFrame: public wxFrame |
346 | { | |
f6bcfd97 BP |
347 | public: |
348 | DECLARE_CLASS(wxResourceEditorFrame) | |
349 | ||
350 | wxResourceManager *manager; | |
351 | wxResourceEditorFrame(wxResourceManager *resMan, wxFrame *parent, const wxString& title, | |
352 | const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize(600, 400), | |
353 | long style = wxDEFAULT_FRAME_STYLE, const wxString& name = "frame"); | |
354 | ~wxResourceEditorFrame(); | |
355 | ||
356 | void OnCloseWindow(wxCloseEvent& event); | |
357 | ||
358 | void OnNew(wxCommandEvent& event); | |
359 | void OnOpen(wxCommandEvent& event); | |
360 | void OnNewDialog(wxCommandEvent& event); | |
361 | void OnClear(wxCommandEvent& event); | |
362 | void OnSave(wxCommandEvent& event); | |
363 | void OnSaveAs(wxCommandEvent& event); | |
364 | void OnExit(wxCommandEvent& event); | |
365 | void OnAbout(wxCommandEvent& event); | |
366 | void OnContents(wxCommandEvent& event); | |
367 | void OnDeleteSelection(wxCommandEvent& event); | |
368 | void OnRecreateSelection(wxCommandEvent& event); | |
369 | void OnTest(wxCommandEvent& event); | |
370 | void OnConvertWXRs(wxCommandEvent& event); | |
371 | ||
372 | DECLARE_EVENT_TABLE() | |
457814b5 JS |
373 | }; |
374 | ||
ae8351fc | 375 | class wxResourceEditorScrolledWindow: public wxScrolledWindow |
457814b5 | 376 | { |
f6bcfd97 BP |
377 | public: |
378 | wxResourceEditorScrolledWindow(wxWindow *parent, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, | |
379 | long style = 0); | |
380 | ~wxResourceEditorScrolledWindow(); | |
381 | ||
382 | void OnPaint(wxPaintEvent& event); | |
383 | ||
384 | void DrawTitle(wxDC& dc); | |
385 | ||
386 | // Accessors | |
387 | inline int GetMarginX() { return m_marginX; } | |
388 | inline int GetMarginY() { return m_marginY; } | |
389 | ||
390 | public: | |
391 | wxWindow* m_childWindow; | |
392 | private: | |
393 | int m_marginX, m_marginY; | |
394 | ||
395 | DECLARE_EVENT_TABLE() | |
ae8351fc | 396 | }; |
457814b5 | 397 | |
58d5bf3a GT |
398 | #define OBJECT_MENU_TITLE 1 |
399 | #define OBJECT_MENU_EDIT 2 | |
400 | #define OBJECT_MENU_DELETE 3 | |
457814b5 JS |
401 | |
402 | /* | |
f6bcfd97 BP |
403 | * Main toolbar |
404 | * | |
405 | */ | |
406 | ||
ae8351fc | 407 | class EditorToolBar: public wxToolBar |
457814b5 | 408 | { |
ae8351fc | 409 | public: |
f6bcfd97 BP |
410 | EditorToolBar(wxFrame *frame, const wxPoint& pos = wxPoint(0, 0), const wxSize& size = wxSize(0, 0), |
411 | long style = wxTB_HORIZONTAL); | |
412 | bool OnLeftClick(int toolIndex, bool toggled); | |
413 | void OnMouseEnter(int toolIndex); | |
414 | ||
415 | DECLARE_EVENT_TABLE() | |
457814b5 JS |
416 | }; |
417 | ||
418 | // Toolbar ids | |
f6bcfd97 BP |
419 | #define TOOLBAR_LOAD_FILE 101 |
420 | #define TOOLBAR_SAVE_FILE 102 | |
421 | #define TOOLBAR_NEW 103 | |
422 | #define TOOLBAR_TREE 105 | |
423 | #define TOOLBAR_HELP 106 | |
457814b5 JS |
424 | |
425 | // Formatting tools | |
f6bcfd97 BP |
426 | #define TOOLBAR_FORMAT_HORIZ 110 |
427 | #define TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN 111 | |
428 | #define TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN 112 | |
429 | #define TOOLBAR_FORMAT_VERT 113 | |
430 | #define TOOLBAR_FORMAT_VERT_TOP_ALIGN 114 | |
431 | #define TOOLBAR_FORMAT_VERT_BOT_ALIGN 115 | |
432 | ||
433 | #define TOOLBAR_TO_FRONT 116 | |
434 | #define TOOLBAR_TO_BACK 117 | |
435 | #define TOOLBAR_COPY_SIZE 118 | |
436 | #define TOOLBAR_COPY_WIDTH 119 | |
437 | #define TOOLBAR_COPY_HEIGHT 120 | |
438 | #define TOOLBAR_DISTRIBUTE_HORIZ 121 | |
439 | #define TOOLBAR_DISTRIBUTE_VERT 122 | |
457814b5 | 440 | |
1195ec42 | 441 | /* |
f6bcfd97 BP |
442 | * this class is used to store data associated with a tree item |
443 | */ | |
1195ec42 VZ |
444 | class wxResourceTreeData : public wxTreeItemData |
445 | { | |
446 | public: | |
447 | wxResourceTreeData(wxItemResource *resource) { m_resource = resource; } | |
f6bcfd97 | 448 | |
1195ec42 | 449 | wxItemResource *GetResource() const { return m_resource; } |
f6bcfd97 | 450 | |
1195ec42 VZ |
451 | private: |
452 | wxItemResource *m_resource; | |
453 | }; | |
454 | ||
457814b5 JS |
455 | #endif |
456 |