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