1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Resource editor class 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows license 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "reseditr.h" 
  16 // For compilers that support precompilation, includes "wx/wx.h". 
  17 #include "wx/wxprec.h" 
  26 #include "wx/checkbox.h" 
  27 #include "wx/button.h" 
  28 #include "wx/choice.h" 
  29 #include "wx/listbox.h" 
  30 #include "wx/radiobox.h" 
  31 #include "wx/statbox.h" 
  33 #include "wx/slider.h" 
  34 #include "wx/textctrl.h" 
  37 #include "wx/scrolbar.h" 
  44 #if defined(__WXMSW__) && !defined(__GNUWIN32__) 
  47 #include <strstream.h> 
  62 static void ObjectMenuProc(wxMenu
& menu
, wxCommandEvent
& event
); 
  63 wxResourceManager 
*wxResourceManager::sm_currentResourceManager 
= NULL
; 
  66 #include "bitmaps/load.xbm" 
  67 #include "bitmaps/save.xbm" 
  68 #include "bitmaps/new.xbm" 
  69 #include "bitmaps/vert.xbm" 
  70 #include "bitmaps/alignt.xbm" 
  71 #include "bitmaps/alignb.xbm" 
  72 #include "bitmaps/horiz.xbm" 
  73 #include "bitmaps/alignl.xbm" 
  74 #include "bitmaps/alignr.xbm" 
  75 #include "bitmaps/copysize.xbm" 
  76 #include "bitmaps/tofront.xbm" 
  77 #include "bitmaps/toback.xbm" 
  78 #include "bitmaps/help.xbm" 
  79 #include "bitmaps/wxwin.xbm" 
  86 wxResourceManager::wxResourceManager(): 
  87   m_imageList(16, 16, TRUE
) 
  89   sm_currentResourceManager 
= this; 
  93   m_editorResourceTree 
= NULL
; 
  94   m_editorControlList 
= NULL
; 
  96   m_symbolIdCounter 
= 99; 
  98   m_currentFilename 
= ""; 
  99   m_symbolFilename 
= ""; 
 100   m_editorToolBar 
= NULL
; 
 102   // Default window positions 
 103   m_resourceEditorWindowSize
.width 
= 470; 
 104   m_resourceEditorWindowSize
.height 
= 300; 
 106   m_resourceEditorWindowSize
.x 
= 0; 
 107   m_resourceEditorWindowSize
.y 
= 0; 
 109   m_propertyWindowSize
.width 
= 300; 
 110   m_propertyWindowSize
.height 
= 300; 
 112   m_helpController 
= NULL
; 
 114   m_bitmapImage 
= NULL
; 
 115   m_rootDialogItem 
= 0; 
 118 wxResourceManager::~wxResourceManager() 
 120   sm_currentResourceManager 
= NULL
; 
 123   if (m_helpController
) 
 125     m_helpController
->Quit(); 
 126     delete m_helpController
; 
 127     m_helpController 
= NULL
; 
 129   delete m_bitmapImage
; 
 133 bool wxResourceManager::Initialize() 
 135   // Set up the resource filename for each platform. 
 137   // dialoged.ini in the Windows directory 
 139   GetWindowsDirectory(buf
, 256); 
 140   strcat(buf
, "\\dialoged.ini"); 
 141   m_optionsResourceFilename 
= buf
; 
 145   strcat(buf
, "/.dialogedrc"); 
 146   m_optionsResourceFilename 
= buf
; 
 148 #error "Unsupported platform." 
 153   m_helpController 
= new wxHelpController
; 
 154   m_helpController
->Initialize("dialoged"); 
 156   m_popupMenu 
= new wxMenu("", (wxFunction
)ObjectMenuProc
); 
 157   m_popupMenu
->Append(OBJECT_MENU_EDIT
, "Edit properties"); 
 158   m_popupMenu
->Append(OBJECT_MENU_DELETE
, "Delete object"); 
 163     m_bitmapImage 
= new wxBitmap("WXWINBMP", wxBITMAP_TYPE_BMP_RESOURCE
); 
 166     m_bitmapImage 
= new wxBitmap(wxwin_bits
, wxwin_width
, wxwin_height
); 
 170   // Initialize the image list icons 
 172   wxIcon 
icon1("DIALOG_ICON", wxBITMAP_TYPE_ICO_RESOURCE
, 16, 16); 
 173   wxIcon 
icon2("FOLDER1_ICON", wxBITMAP_TYPE_ICO_RESOURCE
, 16, 16); 
 174   wxIcon 
icon3("FOLDER2_ICON", wxBITMAP_TYPE_ICO_RESOURCE
, 16, 16); 
 175   wxIcon 
icon4("BUTTONSM_ICON", wxBITMAP_TYPE_ICO_RESOURCE
, 16, 16); 
 176   m_imageList
.Add(icon1
); 
 177   m_imageList
.Add(icon2
); 
 178   m_imageList
.Add(icon3
); 
 179   m_imageList
.Add(icon4
); 
 182   m_symbolTable
.AddStandardSymbols(); 
 187 bool wxResourceManager::LoadOptions() 
 189   wxGetResource("DialogEd", "editorWindowX", &m_resourceEditorWindowSize
.x
, m_optionsResourceFilename
.GetData()); 
 190   wxGetResource("DialogEd", "editorWindowY", &m_resourceEditorWindowSize
.y
, m_optionsResourceFilename
.GetData()); 
 191   wxGetResource("DialogEd", "editorWindowWidth", &m_resourceEditorWindowSize
.width
, m_optionsResourceFilename
.GetData()); 
 192   wxGetResource("DialogEd", "editorWindowHeight", &m_resourceEditorWindowSize
.height
, m_optionsResourceFilename
.GetData()); 
 193   wxGetResource("DialogEd", "propertyWindowX", &m_propertyWindowSize
.x
, m_optionsResourceFilename
.GetData()); 
 194   wxGetResource("DialogEd", "propertyWindowY", &m_propertyWindowSize
.y
, m_optionsResourceFilename
.GetData()); 
 195   wxGetResource("DialogEd", "propertyWindowWidth", &m_propertyWindowSize
.width
, m_optionsResourceFilename
.GetData()); 
 196   wxGetResource("DialogEd", "propertyWindowHeight", &m_propertyWindowSize
.height
, m_optionsResourceFilename
.GetData()); 
 200 bool wxResourceManager::SaveOptions() 
 202   wxWriteResource("DialogEd", "editorWindowX", m_resourceEditorWindowSize
.x
, m_optionsResourceFilename
.GetData()); 
 203   wxWriteResource("DialogEd", "editorWindowY", m_resourceEditorWindowSize
.y
, m_optionsResourceFilename
.GetData()); 
 204   wxWriteResource("DialogEd", "editorWindowWidth", m_resourceEditorWindowSize
.width
, m_optionsResourceFilename
.GetData()); 
 205   wxWriteResource("DialogEd", "editorWindowHeight", m_resourceEditorWindowSize
.height
, m_optionsResourceFilename
.GetData()); 
 207   wxWriteResource("DialogEd", "propertyWindowX", m_propertyWindowSize
.x
, m_optionsResourceFilename
.GetData()); 
 208   wxWriteResource("DialogEd", "propertyWindowY", m_propertyWindowSize
.y
, m_optionsResourceFilename
.GetData()); 
 209   wxWriteResource("DialogEd", "propertyWindowWidth", m_propertyWindowSize
.width
, m_optionsResourceFilename
.GetData()); 
 210   wxWriteResource("DialogEd", "propertyWindowHeight", m_propertyWindowSize
.height
, m_optionsResourceFilename
.GetData()); 
 215 // Show or hide the resource editor frame, which displays a list 
 216 // of resources with ability to edit them. 
 217 bool wxResourceManager::ShowResourceEditor(bool show
, wxWindow 
*parent
, const char *title
) 
 223       m_editorFrame
->Iconize(FALSE
); 
 224       m_editorFrame
->Show(TRUE
); 
 227     m_editorFrame 
= OnCreateEditorFrame(title
); 
 229     wxMenuBar 
*menuBar 
= OnCreateEditorMenuBar(m_editorFrame
); 
 230     m_editorFrame
->SetMenuBar(menuBar
); 
 232     m_editorToolBar 
= (EditorToolBar 
*)OnCreateToolBar(m_editorFrame
); 
 233     m_editorControlList 
= new wxResourceEditorControlList(m_editorFrame
, IDC_LISTCTRL
, wxPoint(0, 0), wxSize(-1, -1)); 
 234     m_editorResourceTree 
= new wxResourceEditorProjectTree(m_editorFrame
, IDC_TREECTRL
, wxPoint(0, 0), wxSize(-1, -1), 
 236     m_editorPanel 
= OnCreateEditorPanel(m_editorFrame
); 
 238     m_editorResourceTree
->SetImageList(& m_imageList
); 
 240     // Constraints for toolbar 
 241     wxLayoutConstraints 
*c 
= new wxLayoutConstraints
; 
 242     c
->left
.SameAs       (m_editorFrame
, wxLeft
, 0); 
 243     c
->top
.SameAs        (m_editorFrame
, wxTop
, 0); 
 244     c
->right
.SameAs      (m_editorFrame
, wxRight
, 0); 
 245     c
->bottom
.Unconstrained(); 
 246     c
->width
.Unconstrained(); 
 247     c
->height
.Absolute(28); 
 248     m_editorToolBar
->SetConstraints(c
); 
 250     // Constraints for listbox 
 251     c 
= new wxLayoutConstraints
; 
 252     c
->left
.SameAs       (m_editorFrame
, wxLeft
, 0); 
 253     c
->top
.SameAs        (m_editorToolBar
, wxBottom
, 0); 
 254     c
->right
.Absolute    (150); 
 255     c
->bottom
.SameAs     (m_editorControlList
, wxTop
, 0); 
 256     c
->width
.Unconstrained(); 
 257     c
->height
.Unconstrained(); 
 258     m_editorResourceTree
->SetConstraints(c
); 
 260     // Constraints for panel 
 261     c 
= new wxLayoutConstraints
; 
 262     c
->left
.SameAs       (m_editorResourceTree
, wxRight
, 0); 
 263     c
->top
.SameAs        (m_editorToolBar
, wxBottom
, 0); 
 264     c
->right
.SameAs      (m_editorFrame
, wxRight
, 0); 
 265     c
->bottom
.SameAs     (m_editorControlList
, wxTop
, 0); 
 266     c
->width
.Unconstrained(); 
 267     c
->height
.Unconstrained(); 
 268     m_editorPanel
->SetConstraints(c
); 
 270     // Constraints for control list (bottom window) 
 271     c 
= new wxLayoutConstraints
; 
 272     c
->left
.SameAs       (m_editorFrame
, wxLeft
, 0); 
 273     c
->right
.SameAs      (m_editorFrame
, wxRight
, 0); 
 274     c
->bottom
.SameAs     (m_editorFrame
, wxBottom
, 0); 
 275     c
->width
.Unconstrained(); 
 276     c
->height
.Absolute(60); 
 277     m_editorControlList
->SetConstraints(c
); 
 279     m_editorFrame
->SetAutoLayout(TRUE
); 
 281     UpdateResourceList(); 
 283     m_editorFrame
->Show(TRUE
); 
 288     wxFrame 
*fr 
= m_editorFrame
; 
 289     if (m_editorFrame
->OnClose()) 
 293       m_editorFrame 
= NULL
; 
 294       m_editorPanel 
= NULL
; 
 300 void wxResourceManager::SetFrameTitle(const wxString
& filename
) 
 304     if (filename 
== wxString("")) 
 305       m_editorFrame
->SetTitle("wxWindows Dialog Editor - untitled"); 
 308       wxString 
str("wxWindows Dialog Editor - "); 
 309       wxString 
str2(wxFileNameFromPath(WXSTRINGCAST filename
)); 
 311       m_editorFrame
->SetTitle(str
); 
 316 bool wxResourceManager::Save() 
 318   if (m_currentFilename 
== wxString("")) 
 321     return Save(m_currentFilename
); 
 324 bool wxResourceManager::Save(const wxString
& filename
) 
 326   // Ensure all visible windows are saved to their resources 
 327   m_currentFilename 
= filename
; 
 328   SetFrameTitle(m_currentFilename
); 
 329   InstantiateAllResourcesFromWindows(); 
 330   if (m_resourceTable
.Save(filename
)) 
 332     m_symbolTable
.WriteIncludeFile(m_symbolFilename
); 
 340 bool wxResourceManager::SaveAs() 
 342   wxString 
s(wxFileSelector("Save resource file", wxPathOnly(WXSTRINGCAST m_currentFilename
), wxFileNameFromPath(WXSTRINGCAST m_currentFilename
), 
 343     "wxr", "*.wxr", wxSAVE 
| wxOVERWRITE_PROMPT
)); 
 345   if (s
.IsNull() || s 
== "") 
 348   m_currentFilename 
= s
; 
 349   wxStripExtension(m_currentFilename
); 
 350   m_currentFilename 
+= ".wxr"; 
 352   // Construct include filename from this file 
 353   m_symbolFilename 
= m_currentFilename
; 
 355   wxStripExtension(m_symbolFilename
); 
 356   m_symbolFilename 
+= ".h"; 
 358   Save(m_currentFilename
); 
 362 bool wxResourceManager::SaveIfModified() 
 369 bool wxResourceManager::Load(const wxString
& filename
) 
 371   return New(TRUE
, filename
); 
 374 bool wxResourceManager::New(bool loadFromFile
, const wxString
& filename
) 
 376   if (!Clear(TRUE
, FALSE
)) 
 379   m_symbolTable
.AddStandardSymbols(); 
 383     wxString str 
= filename
; 
 384     if (str 
== wxString("")) 
 386       wxString 
f(wxFileSelector("Open resource file", NULL
, NULL
, "wxr", "*.wxr", 0, NULL
)); 
 387       if (!f
.IsNull() && f 
!= "") 
 393     if (!m_resourceTable
.ParseResourceFile(WXSTRINGCAST str
)) 
 395       wxMessageBox("Could not read file.", "Resource file load error", wxOK 
| wxICON_EXCLAMATION
); 
 398     m_currentFilename 
= str
; 
 400     SetFrameTitle(m_currentFilename
); 
 402     UpdateResourceList(); 
 404     // Construct include filename from this file 
 405     m_symbolFilename 
= m_currentFilename
; 
 407     wxStripExtension(m_symbolFilename
); 
 408     m_symbolFilename 
+= ".h"; 
 410     if (!m_symbolTable
.ReadIncludeFile(m_symbolFilename
)) 
 412         wxString 
str("Could not find include file "); 
 413         str 
+= m_symbolFilename
; 
 414         str 
+= ".\nDialog Editor maintains a header file containing id symbols to be used in the application.\n"; 
 415         str 
+= "The next time this .wxr file is saved, a header file will be saved also."; 
 416         wxMessageBox(str
, "Dialog Editor Warning", MB_OK
); 
 418         m_symbolIdCounter 
= 99; 
 422         // Set the id counter to the last known id 
 423         m_symbolIdCounter 
= m_symbolTable
.FindHighestId(); 
 426     // Now check in case some (or all) resources don't have resource ids, or they 
 427     // don't match the .h file, or something of that nature. 
 428     bool altered 
= RepairResourceIds(); 
 431         wxMessageBox("Some resources have had new identifiers associated with them, since they were missing.", "Dialog Editor Warning", MB_OK
); 
 442     m_currentFilename 
= ""; 
 449 bool wxResourceManager::Clear(bool deleteWindows
, bool force
) 
 451   if (!force 
&& Modified()) 
 453     int ans 
= wxMessageBox("Save modified resource file?", "Dialog Editor", wxYES_NO 
| wxCANCEL
); 
 457       if (!SaveIfModified()) 
 463   ClearCurrentDialog(); 
 464   DisassociateWindows(); 
 466   m_symbolTable
.Clear(); 
 467   m_resourceTable
.ClearTable(); 
 468   UpdateResourceList(); 
 473 bool wxResourceManager::DisassociateWindows() 
 475   m_resourceTable
.BeginFind(); 
 477   while (node 
= m_resourceTable
.Next()) 
 479     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
 480     DisassociateResource(res
); 
 486 void wxResourceManager::AssociateResource(wxItemResource 
*resource
, wxWindow 
*win
) 
 488   if (!m_resourceAssociations
.Get((long)resource
)) 
 489     m_resourceAssociations
.Put((long)resource
, win
); 
 491   wxNode 
*node 
= resource
->GetChildren().First(); 
 494     wxItemResource 
*child 
= (wxItemResource 
*)node
->Data(); 
 495     wxWindow 
*childWindow 
= (wxWindow 
*)m_resourceAssociations
.Get((long)child
); 
 497       childWindow 
= win
->FindWindow(child
->GetName()); 
 499       AssociateResource(child
, childWindow
); 
 503       sprintf(buf
, "AssociateResource: cannot find child window %s", child
->GetName() ? child
->GetName() : "(unnamed)"); 
 504       wxMessageBox(buf
, "Dialog Editor problem", wxOK
); 
 511 bool wxResourceManager::DisassociateResource(wxItemResource 
*resource
) 
 513   wxWindow 
*win 
= FindWindowForResource(resource
); 
 517   // Disassociate children of window 
 518   if (win
->GetChildren()) 
 520     wxNode 
*node 
= win
->GetChildren()->First(); 
 523       wxWindow 
*child 
= (wxWindow 
*)node
->Data(); 
 524       if (child
->IsKindOf(CLASSINFO(wxControl
))) 
 525         DisassociateResource(child
); 
 530   RemoveSelection(win
); 
 531   m_resourceAssociations
.Delete((long)resource
); 
 535 bool wxResourceManager::DisassociateResource(wxWindow 
*win
) 
 537   wxItemResource 
*res 
= FindResourceForWindow(win
); 
 539     return DisassociateResource(res
); 
 544 // Saves the window info into the resource, and deletes the 
 545 // handler. Doesn't actually disassociate the window from 
 546 // the resources. Replaces OnClose. 
 547 bool wxResourceManager::SaveInfoAndDeleteHandler(wxWindow
* win
) 
 549     wxItemResource 
*res 
= FindResourceForWindow(win
); 
 551     if (win
->IsKindOf(CLASSINFO(wxPanel
))) 
 553         wxResourceEditorDialogHandler
* handler 
= (wxResourceEditorDialogHandler
*) win
->GetEventHandler(); 
 554         win
->PopEventHandler(); 
 556         // Now reset all child event handlers 
 557         wxNode 
*node 
= win
->GetChildren()->First(); 
 560                 wxWindow 
*child 
= (wxWindow 
*)node
->Data(); 
 561                 wxEvtHandler 
*childHandler 
= child
->GetEventHandler(); 
 562                 if ( child
->IsKindOf(CLASSINFO(wxControl
)) && childHandler 
!= child 
) 
 564                         child
->PopEventHandler(TRUE
); 
 572         win
->PopEventHandler(TRUE
); 
 575     // Save the information 
 576     InstantiateResourceFromWindow(res
, win
, TRUE
); 
 578 //  DisassociateResource(win); 
 583 // Destroys the window. If this is the 'current' panel, NULLs the 
 585 bool wxResourceManager::DeleteWindow(wxWindow
* win
) 
 587     bool clearDisplay 
= FALSE
; 
 588     if (m_editorPanel
->m_childWindow 
== win
) 
 590         m_editorPanel
->m_childWindow 
= NULL
; 
 597         m_editorPanel
->Clear(); 
 602 wxItemResource 
*wxResourceManager::FindResourceForWindow(wxWindow 
*win
) 
 604   m_resourceAssociations
.BeginFind(); 
 606   while (node 
= m_resourceAssociations
.Next()) 
 608     wxWindow 
*w 
= (wxWindow 
*)node
->Data(); 
 611       return (wxItemResource 
*)node
->key
.integer
; 
 617 wxWindow 
*wxResourceManager::FindWindowForResource(wxItemResource 
*resource
) 
 619   return (wxWindow 
*)m_resourceAssociations
.Get((long)resource
); 
 623 void wxResourceManager::MakeUniqueName(char *prefix
, char *buf
) 
 627     sprintf(buf
, "%s%d", prefix
, m_nameCounter
); 
 630     if (!m_resourceTable
.FindResource(buf
)) 
 635 wxFrame 
*wxResourceManager::OnCreateEditorFrame(const char *title
) 
 637   int frameWidth 
= 420; 
 638   int frameHeight 
= 300; 
 640   wxResourceEditorFrame 
*frame 
= new wxResourceEditorFrame(this, NULL
, title
, 
 641     wxPoint(m_resourceEditorWindowSize
.x
, m_resourceEditorWindowSize
.y
), 
 642     wxSize(m_resourceEditorWindowSize
.width
, m_resourceEditorWindowSize
.height
), 
 643     wxDEFAULT_FRAME_STYLE
); 
 645   frame
->CreateStatusBar(1); 
 647   frame
->SetAutoLayout(TRUE
); 
 649   wxIcon 
*icon 
= new wxIcon("DIALOGEDICON"); 
 650   frame
->SetIcon(icon
); 
 655 wxMenuBar 
*wxResourceManager::OnCreateEditorMenuBar(wxFrame 
*parent
) 
 657   wxMenuBar 
*menuBar 
= new wxMenuBar
; 
 659   wxMenu 
*fileMenu 
= new wxMenu
; 
 660   fileMenu
->Append(RESED_NEW_DIALOG
, "New &dialog", "Create a new dialog"); 
 661   fileMenu
->AppendSeparator(); 
 662   fileMenu
->Append(wxID_NEW
, "&New project",           "Clear the current project"); 
 663   fileMenu
->Append(wxID_OPEN
, "&Open...",         "Load a resource file"); 
 664   fileMenu
->Append(wxID_SAVE
, "&Save",            "Save a resource file"); 
 665   fileMenu
->Append(wxID_SAVEAS
, "Save &As...",   "Save a resource file as..."); 
 666   fileMenu
->Append(RESED_CLEAR
, "&Clear",   "Clear current resources"); 
 667   fileMenu
->AppendSeparator(); 
 668   fileMenu
->Append(wxID_EXIT
, "E&xit",            "Exit resource editor"); 
 670   wxMenu 
*editMenu 
= new wxMenu
; 
 671   editMenu
->Append(RESED_TEST
, "&Test Dialog",  "Test dialog"); 
 672   editMenu
->Append(RESED_RECREATE
, "&Recreate",  "Recreate the selected resource(s)"); 
 673   editMenu
->Append(RESED_DELETE
, "&Delete",  "Delete the selected resource(s)"); 
 675   wxMenu 
*helpMenu 
= new wxMenu
; 
 676   helpMenu
->Append(RESED_CONTENTS
, "&Help topics",          "Invokes the on-line help"); 
 677   helpMenu
->AppendSeparator(); 
 678   helpMenu
->Append(wxID_ABOUT
, "&About",          "About wxWindows Dialog Editor"); 
 680   menuBar
->Append(fileMenu
, "&File"); 
 681   menuBar
->Append(editMenu
, "&Edit"); 
 682   menuBar
->Append(helpMenu
, "&Help"); 
 687 wxResourceEditorScrolledWindow 
*wxResourceManager::OnCreateEditorPanel(wxFrame 
*parent
) 
 689   wxResourceEditorScrolledWindow 
*panel 
= new wxResourceEditorScrolledWindow(parent
, wxDefaultPosition
, wxDefaultSize
, 
 690 //    wxSUNKEN_BORDER|wxCLIP_CHILDREN); 
 693   panel
->SetScrollbars(10, 10, 100, 100); 
 698 wxToolBar 
*wxResourceManager::OnCreateToolBar(wxFrame 
*parent
) 
 700   // Load palette bitmaps 
 702   wxBitmap 
ToolbarLoadBitmap("LOADTOOL"); 
 703   wxBitmap 
ToolbarSaveBitmap("SAVETOOL"); 
 704   wxBitmap 
ToolbarNewBitmap("NEWTOOL"); 
 705   wxBitmap 
ToolbarVertBitmap("VERTTOOL"); 
 706   wxBitmap 
ToolbarAlignTBitmap("ALIGNTTOOL"); 
 707   wxBitmap 
ToolbarAlignBBitmap("ALIGNBTOOL"); 
 708   wxBitmap 
ToolbarHorizBitmap("HORIZTOOL"); 
 709   wxBitmap 
ToolbarAlignLBitmap("ALIGNLTOOL"); 
 710   wxBitmap 
ToolbarAlignRBitmap("ALIGNRTOOL"); 
 711   wxBitmap 
ToolbarCopySizeBitmap("COPYSIZETOOL"); 
 712   wxBitmap 
ToolbarToBackBitmap("TOBACKTOOL"); 
 713   wxBitmap 
ToolbarToFrontBitmap("TOFRONTTOOL"); 
 714   wxBitmap 
ToolbarHelpBitmap("HELPTOOL"); 
 717   wxBitmap 
ToolbarLoadBitmap(load_bits
, load_width
, load_height
); 
 718   wxBitmap 
ToolbarSaveBitmap(save_bits
, save_width
, save_height
); 
 719   wxBitmap 
ToolbarNewBitmap(new_bits
, save_width
, save_height
); 
 720   wxBitmap 
ToolbarVertBitmap(vert_bits
, vert_width
, vert_height
); 
 721   wxBitmap 
ToolbarAlignTBitmap(alignt_bits
, alignt_width
, alignt_height
); 
 722   wxBitmap 
ToolbarAlignBBitmap(alignb_bits
, alignb_width
, alignb_height
); 
 723   wxBitmap 
ToolbarHorizBitmap(horiz_bits
, horiz_width
, horiz_height
); 
 724   wxBitmap 
ToolbarAlignLBitmap(alignl_bits
, alignl_width
, alignl_height
); 
 725   wxBitmap 
ToolbarAlignRBitmap(alignr_bits
, alignr_width
, alignr_height
); 
 726   wxBitmap 
ToolbarCopySizeBitmap(copysize_bits
, copysize_width
, copysize_height
); 
 727   wxBitmap 
ToolbarToBackBitmap(toback_bits
, toback_width
, toback_height
); 
 728   wxBitmap 
ToolbarToFrontBitmap(tofront_bits
, tofront_width
, tofront_height
); 
 729   wxBitmap 
ToolbarHelpBitmap(help_bits
, help_width
, help_height
); 
 732   // Create the toolbar 
 733   EditorToolBar 
*toolbar 
= new EditorToolBar(parent
, wxPoint(0, 0), wxSize(-1, -1), wxNO_BORDER
|wxTB_HORIZONTAL
); 
 734   toolbar
->SetMargins(2, 2); 
 741   int width 
= ToolbarLoadBitmap
->GetWidth(); 
 746   toolbar
->AddSeparator(); 
 747   toolbar
->AddTool(TOOLBAR_NEW
, ToolbarNewBitmap
, (wxBitmap 
*)NULL
, 
 748                    FALSE
, (float)currentX
, -1, NULL
, "New dialog"); 
 749   currentX 
+= width 
+ dx
; 
 750   toolbar
->AddTool(TOOLBAR_LOAD_FILE
, ToolbarLoadBitmap
, (wxBitmap 
*)NULL
, 
 751                    FALSE
, (float)currentX
, -1, NULL
, "Load"); 
 752   currentX 
+= width 
+ dx
; 
 753   toolbar
->AddTool(TOOLBAR_SAVE_FILE
, ToolbarSaveBitmap
, (wxBitmap 
*)NULL
, 
 754                    FALSE
, (float)currentX
, -1, NULL
, "Save"); 
 755   currentX 
+= width 
+ dx 
+ gap
; 
 756   toolbar
->AddSeparator(); 
 757   toolbar
->AddTool(TOOLBAR_FORMAT_HORIZ
, ToolbarVertBitmap
, (wxBitmap 
*)NULL
, 
 758                    FALSE
, (float)currentX
, -1, NULL
, "Horizontal align"); 
 759   currentX 
+= width 
+ dx
; 
 760   toolbar
->AddTool(TOOLBAR_FORMAT_VERT_TOP_ALIGN
, ToolbarAlignTBitmap
, (wxBitmap 
*)NULL
, 
 761                    FALSE
, (float)currentX
, -1, NULL
, "Top align"); 
 762   currentX 
+= width 
+ dx
; 
 763   toolbar
->AddTool(TOOLBAR_FORMAT_VERT_BOT_ALIGN
, ToolbarAlignBBitmap
, (wxBitmap 
*)NULL
, 
 764                    FALSE
, (float)currentX
, -1, NULL
, "Bottom align"); 
 765   currentX 
+= width 
+ dx
; 
 766   toolbar
->AddTool(TOOLBAR_FORMAT_VERT
, ToolbarHorizBitmap
, (wxBitmap 
*)NULL
, 
 767                    FALSE
, (float)currentX
, -1, NULL
, "Vertical align"); 
 768   currentX 
+= width 
+ dx
; 
 769   toolbar
->AddTool(TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN
, ToolbarAlignLBitmap
, (wxBitmap 
*)NULL
, 
 770                    FALSE
, (float)currentX
, -1, NULL
, "Left align"); 
 771   currentX 
+= width 
+ dx
; 
 772   toolbar
->AddTool(TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN
, ToolbarAlignRBitmap
, (wxBitmap 
*)NULL
, 
 773                    FALSE
, (float)currentX
, -1, NULL
, "Right align"); 
 774   currentX 
+= width 
+ dx
; 
 775   toolbar
->AddTool(TOOLBAR_COPY_SIZE
, ToolbarCopySizeBitmap
, (wxBitmap 
*)NULL
, 
 776                    FALSE
, (float)currentX
, -1, NULL
, "Copy size"); 
 777   currentX 
+= width 
+ dx 
+ gap
; 
 778   toolbar
->AddSeparator(); 
 779   toolbar
->AddTool(TOOLBAR_TO_FRONT
, ToolbarToFrontBitmap
, (wxBitmap 
*)NULL
, 
 780                    FALSE
, (float)currentX
, -1, NULL
, "To front"); 
 781   currentX 
+= width 
+ dx
; 
 782   toolbar
->AddTool(TOOLBAR_TO_BACK
, ToolbarToBackBitmap
, (wxBitmap 
*)NULL
, 
 783                    FALSE
, (float)currentX
, -1, NULL
, "To back"); 
 784   currentX 
+= width 
+ dx 
+ gap
; 
 786   toolbar
->AddSeparator(); 
 787   toolbar
->AddTool(TOOLBAR_HELP
, ToolbarHelpBitmap
, (wxBitmap 
*)NULL
, 
 788                    FALSE
, (float)currentX
, -1, NULL
, "Help"); 
 789   currentX 
+= width 
+ dx
; 
 796 void wxResourceManager::UpdateResourceList() 
 798   if (!m_editorResourceTree
) 
 801   m_editorResourceTree
->SetInvalid(TRUE
); 
 802   m_editorResourceTree
->DeleteAllItems(); 
 804   long id 
= m_editorResourceTree
->InsertItem(0, "Dialogs" 
 810   m_resourceTable
.BeginFind(); 
 812   while (node 
= m_resourceTable
.Next()) 
 814     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
 815     wxString 
resType(res
->GetType()); 
 816     if (resType 
== "wxDialog" || resType 
== "wxDialogBox" || resType 
== "wxPanel" || resType 
== "wxBitmap") 
 818       AddItemsRecursively(id
, res
); 
 821   m_editorResourceTree
->ExpandItem(id
, wxTREE_EXPAND_EXPAND
); 
 822   m_editorResourceTree
->SetInvalid(FALSE
); 
 825 void wxResourceManager::AddItemsRecursively(long parent
, wxItemResource 
*resource
) 
 827   wxString 
theString(""); 
 828   theString 
= resource
->GetName(); 
 831   wxString 
resType(resource
->GetType()); 
 832   if (resType 
== "wxDialog" || resType 
== "wxDialogBox" || resType 
== "wxPanel") 
 837   long id 
= m_editorResourceTree
->InsertItem(parent
, theString
 
 843   m_editorResourceTree
->SetItemData(id
, (long) resource
); 
 845   if (strcmp(resource
->GetType(), "wxBitmap") != 0) 
 847     wxNode 
*node 
= resource
->GetChildren().First(); 
 850       wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
 851       AddItemsRecursively(id
, res
); 
 855   m_editorResourceTree
->ExpandItem(id
, wxTREE_EXPAND_EXPAND
); 
 858 bool wxResourceManager::EditSelectedResource() 
 860   int sel 
= m_editorResourceTree
->GetSelection(); 
 863     wxItemResource 
*res 
= (wxItemResource 
*)m_editorResourceTree
->GetItemData(sel
); 
 869 bool wxResourceManager::Edit(wxItemResource 
*res
) 
 871   ClearCurrentDialog(); 
 873   wxString 
resType(res
->GetType()); 
 874   wxPanel 
*panel 
= (wxPanel 
*)FindWindowForResource(res
); 
 878     wxMessageBox("Should not find panel in wxResourceManager::Edit"); 
 883         long style 
= res
->GetStyle(); 
 884         res
->SetStyle(style
|wxRAISED_BORDER
); 
 886         wxResourceEditorDialogHandler 
*handler 
= new wxResourceEditorDialogHandler(panel
, res
, panel
->GetEventHandler(), 
 889         panel
->LoadFromResource(m_editorPanel
, res
->GetName(), &m_resourceTable
); 
 891         panel
->PushEventHandler(handler
); 
 893         res
->SetStyle(style
); 
 894                 handler
->AddChildHandlers(); // Add event handlers for all controls 
 895         AssociateResource(res
, panel
); 
 897         m_editorPanel
->m_childWindow 
= panel
; 
 898         panel
->Move(m_editorPanel
->GetMarginX(), m_editorPanel
->GetMarginY()); 
 902         wxClientDC 
dc(m_editorPanel
); 
 903         m_editorPanel
->DrawTitle(dc
); 
 908 bool wxResourceManager::CreateNewPanel() 
 910   ClearCurrentDialog(); 
 913   MakeUniqueName("dialog", buf
); 
 915   wxItemResource 
*resource 
= new wxItemResource
; 
 916   resource
->SetType("wxDialog"); 
 917   resource
->SetName(buf
); 
 918   resource
->SetTitle(buf
); 
 921   int id 
= GenerateWindowId("ID_DIALOG", newIdName
); 
 924   // This is now guaranteed to be unique, so just add to symbol table 
 925   m_symbolTable
.AddSymbol(newIdName
, id
); 
 927   m_resourceTable
.AddResource(resource
); 
 929   wxPanel 
*panel 
= new wxPanel(m_editorPanel
, -1, 
 930      wxPoint(m_editorPanel
->GetMarginX(), m_editorPanel
->GetMarginY()), 
 931      wxSize(400, 300), wxRAISED_BORDER
|wxDEFAULT_DIALOG_STYLE
, buf
); 
 932   m_editorPanel
->m_childWindow 
= panel
; 
 934   resource
->SetStyle(panel
->GetWindowStyleFlag()); 
 935   resource
->SetSize(10, 10, 400, 300); 
 937   // For editing in situ we will need to use the hash table to ensure 
 938   // we don't dereference invalid pointers. 
 939 //  resourceWindowTable.Put((long)resource, panel); 
 941   wxResourceEditorDialogHandler 
*handler 
= new wxResourceEditorDialogHandler(panel
, resource
, panel
->GetEventHandler(), 
 943   panel
->PushEventHandler(handler
); 
 945   AssociateResource(resource
, panel
); 
 946   UpdateResourceList(); 
 949   m_editorPanel
->m_childWindow
->Refresh(); 
 953   wxClientDC 
dc(m_editorPanel
); 
 954   m_editorPanel
->DrawTitle(dc
); 
 959 bool wxResourceManager::CreatePanelItem(wxItemResource 
*panelResource
, wxPanel 
*panel
, char *iType
, int x
, int y
, bool isBitmap
) 
 962   if (!panel
->IsKindOf(CLASSINFO(wxPanel
)) && !panel
->IsKindOf(CLASSINFO(wxDialog
))) 
 967   wxItemResource 
*res 
= new wxItemResource
; 
 968   wxControl 
*newItem 
= NULL
; 
 969   res
->SetSize(x
, y
, -1, -1); 
 974   wxString 
itemType(iType
); 
 976   if (itemType 
== "wxButton") 
 978       prefix 
= "ID_BUTTON"; 
 979       MakeUniqueName("button", buf
); 
 982         newItem 
= new wxBitmapButton(panel
, -1, m_bitmapImage
, wxPoint(x
, y
), wxSize(-1, -1), 0, wxDefaultValidator
, buf
); 
 984         newItem 
= new wxButton(panel
, -1, "Button", wxPoint(x
, y
), wxSize(-1, -1), 0, wxDefaultValidator
, buf
); 
 986   if (itemType 
== "wxBitmapButton") 
 988       prefix 
= "ID_BITMAPBUTTON"; 
 989       MakeUniqueName("button", buf
); 
 991       newItem 
= new wxBitmapButton(panel
, -1, m_bitmapImage
, wxPoint(x
, y
), wxSize(-1, -1), 0, wxDefaultValidator
, buf
); 
 993   else if (itemType 
== "wxMessage" || itemType 
== "wxStaticText") 
 995       prefix 
= "ID_STATIC"; 
 996       MakeUniqueName("statictext", buf
); 
 999         newItem 
= new wxStaticBitmap(panel
, -1, m_bitmapImage
, wxPoint(x
, y
), wxSize(0, 0), 0, buf
); 
1001         newItem 
= new wxStaticText(panel
, -1, "Static", wxPoint(x
, y
), wxSize(-1, -1), 0, buf
); 
1003   else if (itemType 
== "wxStaticBitmap") 
1005       prefix 
= "ID_STATICBITMAP"; 
1006       MakeUniqueName("static", buf
); 
1008       newItem 
= new wxStaticBitmap(panel
, -1, m_bitmapImage
, wxPoint(x
, y
), wxSize(-1, -1), 0, buf
); 
1010   else if (itemType 
== "wxCheckBox") 
1012       prefix 
= "ID_CHECKBOX"; 
1013       MakeUniqueName("checkbox", buf
); 
1015       newItem 
= new wxCheckBox(panel
, -1, "Checkbox", wxPoint(x
, y
), wxSize(-1, -1), 0, wxDefaultValidator
, buf
); 
1017   else if (itemType 
== "wxListBox") 
1019       prefix 
= "ID_LISTBOX"; 
1020       MakeUniqueName("listbox", buf
); 
1022       newItem 
= new wxListBox(panel
, -1, wxPoint(x
, y
), wxSize(-1, -1), 0, NULL
, 0, wxDefaultValidator
, buf
); 
1024   else if (itemType 
== "wxRadioBox") 
1026       prefix 
= "ID_RADIOBOX"; 
1027       MakeUniqueName("radiobox", buf
); 
1029       wxString names
[] = { "One", "Two" }; 
1030       newItem 
= new wxRadioBox(panel
, -1, "Radiobox", wxPoint(x
, y
), wxSize(-1, -1), 2, names
, 2, 
1031              wxHORIZONTAL
, wxDefaultValidator
, buf
); 
1032       res
->SetStringValues(new wxStringList("One", "Two", NULL
)); 
1034   else if (itemType 
== "wxRadioButton") 
1036       prefix 
= "ID_RADIOBUTTON"; 
1037       MakeUniqueName("radiobutton", buf
); 
1039       wxString names
[] = { "One", "Two" }; 
1040       newItem 
= new wxRadioButton(panel
, -1, "Radiobutton", wxPoint(x
, y
), wxSize(-1, -1), 
1041              0, wxDefaultValidator
, buf
); 
1043   else if (itemType 
== "wxChoice") 
1045       prefix 
= "ID_CHOICE"; 
1046       MakeUniqueName("choice", buf
); 
1048       newItem 
= new wxChoice(panel
, -1, wxPoint(x
, y
), wxSize(-1, -1), 0, NULL
, 0, wxDefaultValidator
, buf
); 
1050   else if (itemType 
== "wxComboBox") 
1052       prefix 
= "ID_COMBOBOX"; 
1053       MakeUniqueName("combobox", buf
); 
1055       newItem 
= new wxComboBox(panel
, -1, "", wxPoint(x
, y
), wxSize(-1, -1), 0, NULL
, wxCB_DROPDOWN
, wxDefaultValidator
, buf
); 
1057   else if (itemType 
== "wxGroupBox" || itemType 
== "wxStaticBox") 
1059       prefix 
= "ID_STATICBOX"; 
1060       MakeUniqueName("staticbox", buf
); 
1062       newItem 
= new wxStaticBox(panel
, -1, "Static", wxPoint(x
, y
), wxSize(200, 200), 0, buf
); 
1064   else if (itemType 
== "wxGauge") 
1066       prefix 
= "ID_GAUGE"; 
1067       MakeUniqueName("gauge", buf
); 
1069       newItem 
= new wxGauge(panel
, -1, 10, wxPoint(x
, y
), wxSize(80, 30), wxHORIZONTAL
, wxDefaultValidator
, buf
); 
1071   else if (itemType 
== "wxSlider") 
1073       prefix 
= "ID_SLIDER"; 
1074       MakeUniqueName("slider", buf
); 
1076       newItem 
= new wxSlider(panel
, -1, 1, 1, 10, wxPoint(x
, y
), wxSize(120, -1), wxHORIZONTAL
, wxDefaultValidator
, buf
); 
1078   else if (itemType 
== "wxText" || itemType 
== "wxTextCtrl (single-line)") 
1080       prefix 
= "ID_TEXTCTRL"; 
1081       MakeUniqueName("textctrl", buf
); 
1083       res
->SetType("wxTextCtrl"); 
1084       newItem 
= new wxTextCtrl(panel
, -1, "", wxPoint(x
, y
), wxSize(120, -1), 0, wxDefaultValidator
, buf
); 
1086   else if (itemType 
== "wxMultiText" || itemType 
== "wxTextCtrl (multi-line)") 
1088       prefix 
= "ID_TEXTCTRL"; 
1089       MakeUniqueName("textctrl", buf
); 
1091       res
->SetType("wxTextCtrl"); 
1092       newItem 
= new wxTextCtrl(panel
, -1, "", wxPoint(x
, y
), wxSize(120, 100), wxTE_MULTILINE
, wxDefaultValidator
, buf
); 
1094   else if (itemType 
== "wxScrollBar") 
1096       prefix 
= "ID_SCROLLBAR"; 
1097       MakeUniqueName("scrollbar", buf
); 
1099       newItem 
= new wxScrollBar(panel
, -1, wxPoint(x
, y
), wxSize(140, -1), wxHORIZONTAL
, wxDefaultValidator
, buf
); 
1105   int id 
= GenerateWindowId(prefix
, newIdName
); 
1108   // This is now guaranteed to be unique, so just add to symbol table 
1109   m_symbolTable
.AddSymbol(newIdName
, id
); 
1111   newItem
->PushEventHandler(new wxResourceEditorControlHandler(newItem
, newItem
)); 
1113   res
->SetStyle(newItem
->GetWindowStyleFlag()); 
1114   AssociateResource(res
, newItem
); 
1115   panelResource
->GetChildren().Append(res
); 
1117   UpdateResourceList(); 
1122 void wxResourceManager::ClearCurrentDialog() 
1124   if (m_editorPanel
->m_childWindow
) 
1126     SaveInfoAndDeleteHandler(m_editorPanel
->m_childWindow
); 
1127     DisassociateResource(m_editorPanel
->m_childWindow
); 
1128     DeleteWindow(m_editorPanel
->m_childWindow
); 
1129     m_editorPanel
->m_childWindow 
= NULL
; 
1130     m_editorPanel
->Clear(); 
1134 bool wxResourceManager::TestCurrentDialog(wxWindow
* parent
) 
1136   if (m_editorPanel
->m_childWindow
) 
1138     wxItemResource
* item 
= FindResourceForWindow(m_editorPanel
->m_childWindow
); 
1142     // Make sure the resources are up-to-date w.r.t. the window 
1143     InstantiateResourceFromWindow(item
, m_editorPanel
->m_childWindow
, TRUE
); 
1145     wxDialog
* dialog 
= new wxDialog
; 
1146     long oldStyle 
= item
->GetStyle(); 
1147     bool success 
= FALSE
; 
1148 //    item->SetStyle(wxDEFAULT_DIALOG_STYLE); 
1149     if (dialog
->LoadFromResource(parent
, item
->GetName(), & m_resourceTable
)) 
1152         dialog
->ShowModal(); 
1155 //    item->SetStyle(oldStyle); 
1161 // Find the first dialog or panel for which 
1162 // there is a selected panel item. 
1163 wxWindow 
*wxResourceManager::FindParentOfSelection() 
1165   m_resourceTable
.BeginFind(); 
1167   while (node 
= m_resourceTable
.Next()) 
1169     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1170     wxWindow 
*win 
= FindWindowForResource(res
); 
1173       wxNode 
*node1 
= win
->GetChildren()->First(); 
1176         wxControl 
*item 
= (wxControl 
*)node1
->Data(); 
1177             wxResourceEditorControlHandler 
*childHandler 
= (wxResourceEditorControlHandler 
*)item
->GetEventHandler(); 
1178         if (item
->IsKindOf(CLASSINFO(wxControl
)) && childHandler
->IsSelected()) 
1180         node1 
= node1
->Next(); 
1187 // Format the panel items according to 'flag' 
1188 void wxResourceManager::AlignItems(int flag
) 
1190   wxWindow 
*win 
= FindParentOfSelection(); 
1194   wxNode 
*node 
= GetSelections().First(); 
1198   wxControl 
*firstSelection 
= (wxControl 
*)node
->Data(); 
1199   if (firstSelection
->GetParent() != win
) 
1204   firstSelection
->GetPosition(&firstX
, &firstY
); 
1205   firstSelection
->GetSize(&firstW
, &firstH
); 
1206   int centreX 
= (int)(firstX 
+ (firstW 
/ 2)); 
1207   int centreY 
= (int)(firstY 
+ (firstH 
/ 2)); 
1209   while (node 
= node
->Next()) 
1211     wxControl 
*item 
= (wxControl 
*)node
->Data(); 
1212     if (item
->GetParent() == win
) 
1215       item
->GetPosition(&x
, &y
); 
1216       item
->GetSize(&w
, &h
); 
1222         case TOOLBAR_FORMAT_HORIZ
: 
1225           newY 
= (int)(centreY 
- (h
/2.0)); 
1228         case TOOLBAR_FORMAT_VERT
: 
1230           newX 
= (int)(centreX 
- (w
/2.0)); 
1234         case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN
: 
1240         case TOOLBAR_FORMAT_VERT_TOP_ALIGN
: 
1246         case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN
: 
1248           newX 
= firstX 
+ firstW 
- w
; 
1252         case TOOLBAR_FORMAT_VERT_BOT_ALIGN
: 
1255           newY 
= firstY 
+ firstH 
- h
; 
1263       item
->SetSize(newX
, newY
, w
, h
); 
1269 // Copy the first image's size to subsequent images 
1270 void wxResourceManager::CopySize() 
1272   wxWindow 
*win 
= FindParentOfSelection(); 
1276   wxNode 
*node 
= GetSelections().First(); 
1280   wxControl 
*firstSelection 
= (wxControl 
*)node
->Data(); 
1281   if (firstSelection
->GetParent() != win
) 
1286   firstSelection
->GetPosition(&firstX
, &firstY
); 
1287   firstSelection
->GetSize(&firstW
, &firstH
); 
1288   int centreX 
= (int)(firstX 
+ (firstW 
/ 2)); 
1289   int centreY 
= (int)(firstY 
+ (firstH 
/ 2)); 
1291   while (node 
= node
->Next()) 
1293     wxControl 
*item 
= (wxControl 
*)node
->Data(); 
1294     if (item
->GetParent() == win
) 
1295       item
->SetSize(-1, -1, firstW
, firstH
); 
1300 void wxResourceManager::ToBackOrFront(bool toBack
) 
1302   wxWindow 
*win 
= FindParentOfSelection(); 
1305   wxItemResource 
*winResource 
= FindResourceForWindow(win
); 
1307   wxNode 
*node 
= GetSelections().First(); 
1310     wxControl 
*item 
= (wxControl 
*)node
->Data(); 
1311     wxItemResource 
*itemResource 
= FindResourceForWindow(item
); 
1312     if (item
->GetParent() == win
) 
1314       win
->GetChildren()->DeleteObject(item
); 
1316         winResource
->GetChildren().DeleteObject(itemResource
); 
1319         win
->GetChildren()->Insert(item
); 
1321           winResource
->GetChildren().Insert(itemResource
); 
1325         win
->GetChildren()->Append(item
); 
1327           winResource
->GetChildren().Append(itemResource
); 
1330     node 
= node
->Next(); 
1335 void wxResourceManager::AddSelection(wxWindow 
*win
) 
1337   if (!m_selections
.Member(win
)) 
1338     m_selections
.Append(win
); 
1341 void wxResourceManager::RemoveSelection(wxWindow 
*win
) 
1343   m_selections
.DeleteObject(win
); 
1346 // Need to search through resource table removing this from 
1347 // any resource which has this as a parent. 
1348 bool wxResourceManager::RemoveResourceFromParent(wxItemResource 
*res
) 
1350   m_resourceTable
.BeginFind(); 
1352   while (node 
= m_resourceTable
.Next()) 
1354     wxItemResource 
*thisRes 
= (wxItemResource 
*)node
->Data(); 
1355     if (thisRes
->GetChildren().Member(res
)) 
1357       thisRes
->GetChildren().DeleteObject(res
); 
1364 bool wxResourceManager::DeleteResource(wxItemResource 
*res
) 
1369   RemoveResourceFromParent(res
); 
1371   wxNode 
*node 
= res
->GetChildren().First(); 
1374     wxNode 
*next 
= node
->Next(); 
1375     wxItemResource 
*child 
= (wxItemResource 
*)node
->Data(); 
1376     DeleteResource(child
); 
1380   // If this is a button or message resource, delete the 
1381   // associate bitmap resource if not being used. 
1382   wxString 
resType(res
->GetType()); 
1384   if ((resType 
== "wxMessage" || resType 
== "wxStaticBitmap" || resType 
== "wxButton" || resType 
== "wxBitmapButton") && res
->GetValue4()) 
1386     PossiblyDeleteBitmapResource(res
->GetValue4()); 
1389   // Remove symbol from table if appropriate 
1390   if (!IsSymbolUsed(res
, res
->GetId())) 
1392     m_symbolTable
.RemoveSymbol(res
->GetId()); 
1395   m_resourceTable
.Delete(res
->GetName()); 
1401 bool wxResourceManager::DeleteResource(wxWindow 
*win
) 
1403   if (win
->IsKindOf(CLASSINFO(wxControl
))) 
1405     // Deselect and refresh window in case we leave selection 
1407     wxControl 
*item 
= (wxControl 
*)win
; 
1408     wxResourceEditorControlHandler 
*childHandler 
= (wxResourceEditorControlHandler 
*)item
->GetEventHandler(); 
1409     if (childHandler
->IsSelected()) 
1411       RemoveSelection(item
); 
1412       childHandler
->SelectItem(FALSE
); 
1413       item
->GetParent()->Refresh(); 
1417   wxItemResource 
*res 
= FindResourceForWindow(win
); 
1419   DisassociateResource(res
); 
1420   DeleteResource(res
); 
1421   UpdateResourceList(); 
1426 // Will eventually have bitmap type information, for different 
1428 char *wxResourceManager::AddBitmapResource(char *filename
) 
1430   wxItemResource 
*resource 
= FindBitmapResourceByFilename(filename
); 
1434     MakeUniqueName("bitmap", buf
); 
1435     resource 
= new wxItemResource
; 
1436     resource
->SetType("wxBitmap"); 
1437     resource
->SetName(buf
); 
1439     // A bitmap resource has one or more children, specifying 
1440     // alternative bitmaps. 
1441     wxItemResource 
*child 
= new wxItemResource
; 
1442     child
->SetType("wxBitmap"); 
1443     child
->SetName(filename
); 
1444     child
->SetValue1(wxBITMAP_TYPE_BMP
); 
1445     child
->SetValue2(RESOURCE_PLATFORM_ANY
); 
1446     child
->SetValue3(0); // Depth 
1447     child
->SetSize(0,0,0,0); 
1448     resource
->GetChildren().Append(child
); 
1450     m_resourceTable
.AddResource(resource
); 
1452     UpdateResourceList(); 
1455     return resource
->GetName(); 
1460  // Delete the bitmap resource if it isn't being used by another resource. 
1461 void wxResourceManager::PossiblyDeleteBitmapResource(char *resourceName
) 
1463   if (!IsBitmapResourceUsed(resourceName
)) 
1465     wxItemResource 
*res 
= m_resourceTable
.FindResource(resourceName
); 
1466     DeleteResource(res
); 
1467     UpdateResourceList(); 
1471 bool wxResourceManager::IsBitmapResourceUsed(char *resourceName
) 
1473   m_resourceTable
.BeginFind(); 
1475   while (node 
= m_resourceTable
.Next()) 
1477     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1478     wxString 
resType(res
->GetType()); 
1479     if (resType 
== "wxDialog") 
1481       wxNode 
*node1 
= res
->GetChildren().First(); 
1484         wxItemResource 
*child 
= (wxItemResource 
*)node1
->Data(); 
1485         wxString 
childResType(child
->GetType()); 
1487         if ((childResType 
== "wxMessage" || childResType 
== "wxButton") && 
1488              child
->GetValue4() && 
1489             (strcmp(child
->GetValue4(), resourceName
) == 0)) 
1491         node1 
= node1
->Next(); 
1498 // Given a wxButton or wxMessage, find the corresponding bitmap filename. 
1499 char *wxResourceManager::FindBitmapFilenameForResource(wxItemResource 
*resource
) 
1501   if (!resource 
|| !resource
->GetValue4()) 
1503   wxItemResource 
*bitmapResource 
= m_resourceTable
.FindResource(resource
->GetValue4()); 
1504   if (!bitmapResource
) 
1507   wxNode 
*node 
= bitmapResource
->GetChildren().First(); 
1510     // Eventually augment this to return a bitmap of the right kind or something... 
1511     // Maybe the root of the filename remains the same, so it doesn't matter which we 
1512     // pick up. Otherwise how do we specify multiple filenames... too boring... 
1513     wxItemResource 
*child 
= (wxItemResource 
*)node
->Data(); 
1514     return child
->GetName(); 
1516     node 
= node
->Next(); 
1521 wxItemResource 
*wxResourceManager::FindBitmapResourceByFilename(char *filename
) 
1523   m_resourceTable
.BeginFind(); 
1525   while (node 
= m_resourceTable
.Next()) 
1527     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1528     wxString 
resType(res
->GetType()); 
1529     if (resType 
== "wxBitmap") 
1531       wxNode 
*node1 
= res
->GetChildren().First(); 
1534         wxItemResource 
*child 
= (wxItemResource 
*)node1
->Data(); 
1535         if (child
->GetName() && (strcmp(child
->GetName(), filename
) == 0)) 
1537         node1 
= node1
->Next(); 
1544 // Is this window identifier symbol in use? 
1545 // Let's assume that we can't have 2 names for the same integer id. 
1546 // Therefore we can tell by the integer id whether the symbol is 
1548 bool wxResourceManager::IsSymbolUsed(wxItemResource
* thisResource
, wxWindowID id
) 
1550   m_resourceTable
.BeginFind(); 
1552   while (node 
= m_resourceTable
.Next()) 
1554     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1556     wxString 
resType(res
->GetType()); 
1557     if (resType 
== "wxDialog" || resType 
== "wxDialogBox" || resType 
== "wxPanel") 
1559       if ((res 
!= thisResource
) && (res
->GetId() == id
)) 
1562       wxNode 
*node1 
= res
->GetChildren().First(); 
1565         wxItemResource 
*child 
= (wxItemResource 
*)node1
->Data(); 
1566         if ((child 
!= thisResource
) && (child
->GetId() == id
)) 
1568         node1 
= node1
->Next(); 
1575 // Is this window identifier compatible with the given name? (i.e. 
1576 // does it already exist under a different name) 
1577 bool wxResourceManager::IsIdentifierOK(const wxString
& name
, wxWindowID id
) 
1579     if (m_symbolTable
.SymbolExists(name
)) 
1581         int foundId 
= m_symbolTable
.GetIdForSymbol(name
); 
1588 // Change all integer ids that match oldId, to newId. 
1589 // This is necessary if an id is changed for one resource - all resources 
1591 void wxResourceManager::ChangeIds(int oldId
, int newId
) 
1593   m_resourceTable
.BeginFind(); 
1595   while (node 
= m_resourceTable
.Next()) 
1597     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1599     wxString 
resType(res
->GetType()); 
1600     if (resType 
== "wxDialog" || resType 
== "wxDialogBox" || resType 
== "wxPanel") 
1602       if (res
->GetId() == oldId
) 
1605       wxNode 
*node1 
= res
->GetChildren().First(); 
1608         wxItemResource 
*child 
= (wxItemResource 
*)node1
->Data(); 
1609         if (child
->GetId() == oldId
) 
1610             child
->SetId(newId
); 
1612         node1 
= node1
->Next(); 
1618 // If any resource ids were missing (or their symbol was missing), 
1619 // repair them i.e. give them new ids. Returns TRUE if any resource 
1620 // needed repairing. 
1621 bool wxResourceManager::RepairResourceIds() 
1623   bool repaired 
= FALSE
; 
1625   m_resourceTable
.BeginFind(); 
1627   while (node 
= m_resourceTable
.Next()) 
1629     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1630     wxString 
resType(res
->GetType()); 
1631     if (resType 
== "wxDialog" || resType 
== "wxDialogBox" || resType 
== "wxPanel") 
1634       if ( (res
->GetId() == 0) || ((res
->GetId() > 0) && !m_symbolTable
.IdExists(res
->GetId())) ) 
1636           wxString newSymbolName
; 
1637           int newId 
= GenerateWindowId("ID_DIALOG", newSymbolName
) ; 
1639           if (res
->GetId() == 0) 
1642               m_symbolTable
.AddSymbol(newSymbolName
, newId
); 
1646               m_symbolTable
.AddSymbol(newSymbolName
, res
->GetId()); 
1652       wxNode 
*node1 
= res
->GetChildren().First(); 
1655         wxItemResource 
*child 
= (wxItemResource 
*)node1
->Data(); 
1657         if ( (child
->GetId() == 0) || ((child
->GetId() > 0) && !m_symbolTable
.IdExists(child
->GetId())) ) 
1659             wxString newSymbolName
; 
1660             int newId 
= GenerateWindowId("ID_CONTROL", newSymbolName
) ; 
1662             if (child
->GetId() == 0) 
1664                 child
->SetId(newId
); 
1665                 m_symbolTable
.AddSymbol(newSymbolName
, newId
); 
1669                 m_symbolTable
.AddSymbol(newSymbolName
, child
->GetId()); 
1675         node1 
= node1
->Next(); 
1683  // Deletes 'win' and creates a new window from the resource that 
1684  // was associated with it. E.g. if you can't change properties on the 
1685  // fly, you'll need to delete the window and create it again. 
1686 wxWindow 
*wxResourceManager::RecreateWindowFromResource(wxWindow 
*win
, wxWindowPropertyInfo 
*info
) 
1688   wxItemResource 
*resource 
= FindResourceForWindow(win
); 
1690   // Put the current window properties into the wxItemResource object 
1692   wxWindowPropertyInfo 
*newInfo 
= NULL
; 
1695     newInfo 
= CreatePropertyInfoForWindow(win
); 
1699   info
->InstantiateResource(resource
); 
1701   wxWindow 
*newWin 
= NULL
; 
1702   wxWindow 
*parent 
= win
->GetParent(); 
1704   if (win
->IsKindOf(CLASSINFO(wxPanel
))) 
1707     newWin 
= FindWindowForResource(resource
); 
1711     DisassociateResource(resource
); 
1712     if (win
->GetEventHandler() != win
) 
1713         win
->PopEventHandler(TRUE
); 
1716     newWin 
= m_resourceTable
.CreateItem((wxPanel 
*)parent
, resource
); 
1717     newWin
->PushEventHandler(new wxResourceEditorControlHandler((wxControl
*) newWin
, (wxControl
*) newWin
)); 
1718     AssociateResource(resource
, newWin
); 
1719     UpdateResourceList(); 
1723     info
->SetPropertyWindow(newWin
); 
1731 // Delete resource highlighted in the listbox 
1732 bool wxResourceManager::DeleteSelection() 
1734   int sel 
= m_editorResourceTree
->GetSelection(); 
1737     wxItemResource 
*res 
= (wxItemResource 
*)m_editorResourceTree
->GetItemData(sel
); 
1738     wxWindow 
*win 
= FindWindowForResource(res
); 
1741         DeleteResource(win
); 
1743         UpdateResourceList(); 
1752 // Delete resource highlighted in the listbox 
1753 bool wxResourceManager::RecreateSelection() 
1755   wxNode 
*node 
= GetSelections().First(); 
1758     wxControl 
*item 
= (wxControl 
*)node
->Data(); 
1759     wxResourceEditorControlHandler 
*childHandler 
= (wxResourceEditorControlHandler 
*)item
->GetEventHandler(); 
1760     wxNode 
*next 
= node
->Next(); 
1761     childHandler
->SelectItem(FALSE
); 
1763     RemoveSelection(item
); 
1765     RecreateWindowFromResource(item
); 
1772 bool wxResourceManager::EditDialog(wxDialog 
*dialog
, wxWindow 
*parent
) 
1777 // Ensures that all currently shown windows are saved to resources, 
1778 // e.g. just before writing to a .wxr file. 
1779 bool wxResourceManager::InstantiateAllResourcesFromWindows() 
1781   m_resourceTable
.BeginFind(); 
1783   while (node 
= m_resourceTable
.Next()) 
1785     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1786     wxString 
resType(res
->GetType()); 
1788     if (resType 
== "wxDialog") 
1790       wxWindow 
*win 
= (wxWindow 
*)FindWindowForResource(res
); 
1792         InstantiateResourceFromWindow(res
, win
, TRUE
); 
1794     else if (resType 
== "wxPanel") 
1796       wxWindow 
*win 
= (wxWindow 
*)FindWindowForResource(res
); 
1798         InstantiateResourceFromWindow(res
, win
, TRUE
); 
1804 bool wxResourceManager::InstantiateResourceFromWindow(wxItemResource 
*resource
, wxWindow 
*window
, bool recurse
) 
1806   wxWindowPropertyInfo 
*info 
= CreatePropertyInfoForWindow(window
); 
1807   info
->SetResource(resource
); 
1808   info
->InstantiateResource(resource
); 
1813     wxNode 
*node 
= resource
->GetChildren().First(); 
1816       wxItemResource 
*child 
= (wxItemResource 
*)node
->Data(); 
1817       wxWindow 
*childWindow 
= FindWindowForResource(child
); 
1822         sprintf(buf
, "Could not find window %s", child
->GetName()); 
1823         wxMessageBox(buf
, "Dialog Editor problem", wxOK
); 
1826         InstantiateResourceFromWindow(child
, childWindow
, recurse
); 
1827       node 
= node
->Next(); 
1834 // Create a window information object for the give window 
1835 wxWindowPropertyInfo 
*wxResourceManager::CreatePropertyInfoForWindow(wxWindow 
*win
) 
1837   wxWindowPropertyInfo 
*info 
= NULL
; 
1838   if (win
->IsKindOf(CLASSINFO(wxScrollBar
))) 
1840           info 
= new wxScrollBarPropertyInfo(win
); 
1842   else if (win
->IsKindOf(CLASSINFO(wxStaticBox
))) 
1844           info 
= new wxGroupBoxPropertyInfo(win
); 
1846   else if (win
->IsKindOf(CLASSINFO(wxCheckBox
))) 
1848           info 
= new wxCheckBoxPropertyInfo(win
); 
1850   else if (win
->IsKindOf(CLASSINFO(wxSlider
))) 
1852           info 
= new wxSliderPropertyInfo(win
); 
1854   else if (win
->IsKindOf(CLASSINFO(wxGauge
))) 
1856           info 
= new wxGaugePropertyInfo(win
); 
1858   else if (win
->IsKindOf(CLASSINFO(wxListBox
))) 
1860           info 
= new wxListBoxPropertyInfo(win
); 
1862   else if (win
->IsKindOf(CLASSINFO(wxRadioBox
))) 
1864           info 
= new wxRadioBoxPropertyInfo(win
); 
1866   else if (win
->IsKindOf(CLASSINFO(wxRadioButton
))) 
1868           info 
= new wxRadioButtonPropertyInfo(win
); 
1870   else if (win
->IsKindOf(CLASSINFO(wxChoice
))) 
1872           info 
= new wxChoicePropertyInfo(win
); 
1874   else if (win
->IsKindOf(CLASSINFO(wxComboBox
))) 
1876           info 
= new wxComboBoxPropertyInfo(win
); 
1878   else if (win
->IsKindOf(CLASSINFO(wxButton
))) 
1880           info 
= new wxButtonPropertyInfo(win
); 
1882   else if (win
->IsKindOf(CLASSINFO(wxBitmapButton
))) 
1884           info 
= new wxBitmapButtonPropertyInfo(win
); 
1886   else if (win
->IsKindOf(CLASSINFO(wxStaticText
))) 
1888           info 
= new wxStaticTextPropertyInfo(win
); 
1890   else if (win
->IsKindOf(CLASSINFO(wxStaticBitmap
))) 
1892           info 
= new wxStaticBitmapPropertyInfo(win
); 
1894   else if (win
->IsKindOf(CLASSINFO(wxTextCtrl
))) 
1896           info 
= new wxTextPropertyInfo(win
); 
1898   else if (win
->IsKindOf(CLASSINFO(wxPanel
))) 
1900           info 
= new wxPanelPropertyInfo(win
); 
1904           info 
= new wxWindowPropertyInfo(win
); 
1909 // Edit the given window 
1910 void wxResourceManager::EditWindow(wxWindow 
*win
) 
1912   wxWindowPropertyInfo 
*info 
= CreatePropertyInfoForWindow(win
); 
1915     info
->SetResource(FindResourceForWindow(win
)); 
1916     wxString 
str("Editing "); 
1917     str 
+= win
->GetClassInfo()->GetClassName(); 
1919     if (win
->GetName() != "") 
1920         str 
+= win
->GetName(); 
1922         str 
+= "properties"; 
1923     info
->Edit(NULL
, str
); 
1927 // Generate a window id and a first stab at a name 
1928 int wxResourceManager::GenerateWindowId(const wxString
& prefix
, wxString
& idName
) 
1930     m_symbolIdCounter 
++; 
1931     while (m_symbolTable
.IdExists(m_symbolIdCounter
)) 
1932         m_symbolIdCounter 
++; 
1934     int nameId 
= m_symbolIdCounter
; 
1937     str
.Printf("%d", nameId
); 
1938     idName 
= prefix 
+ str
; 
1940     while (m_symbolTable
.SymbolExists(idName
)) 
1943         str
.Printf("%d", nameId
); 
1944         idName 
= prefix 
+ str
; 
1947     return m_symbolIdCounter
; 
1952  * Resource editor frame 
1955 IMPLEMENT_CLASS(wxResourceEditorFrame
, wxFrame
) 
1957 BEGIN_EVENT_TABLE(wxResourceEditorFrame
, wxFrame
) 
1958     EVT_MENU(wxID_NEW
, wxResourceEditorFrame::OnNew
) 
1959     EVT_MENU(RESED_NEW_DIALOG
, wxResourceEditorFrame::OnNewDialog
) 
1960     EVT_MENU(wxID_OPEN
, wxResourceEditorFrame::OnOpen
) 
1961     EVT_MENU(RESED_CLEAR
, wxResourceEditorFrame::OnClear
) 
1962     EVT_MENU(wxID_SAVE
, wxResourceEditorFrame::OnSave
) 
1963     EVT_MENU(wxID_SAVEAS
, wxResourceEditorFrame::OnSaveAs
) 
1964     EVT_MENU(wxID_EXIT
, wxResourceEditorFrame::OnExit
) 
1965     EVT_MENU(wxID_ABOUT
, wxResourceEditorFrame::OnAbout
) 
1966     EVT_MENU(RESED_CONTENTS
, wxResourceEditorFrame::OnContents
) 
1967     EVT_MENU(RESED_DELETE
, wxResourceEditorFrame::OnDeleteSelection
) 
1968     EVT_MENU(RESED_RECREATE
, wxResourceEditorFrame::OnRecreateSelection
) 
1969     EVT_MENU(RESED_TEST
, wxResourceEditorFrame::OnTest
) 
1972 wxResourceEditorFrame::wxResourceEditorFrame(wxResourceManager 
*resMan
, wxFrame 
*parent
, const wxString
& title
, 
1973     const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
): 
1974   wxFrame(parent
, -1, title
, pos
, size
, style
, name
) 
1979 wxResourceEditorFrame::~wxResourceEditorFrame() 
1983 void wxResourceEditorFrame::OnNew(wxCommandEvent
& event
) 
1985       manager
->New(FALSE
); 
1988 void wxResourceEditorFrame::OnNewDialog(wxCommandEvent
& event
) 
1990       manager
->CreateNewPanel(); 
1993 void wxResourceEditorFrame::OnOpen(wxCommandEvent
& event
) 
1998 void wxResourceEditorFrame::OnClear(wxCommandEvent
& event
) 
2000       manager
->Clear(TRUE
, FALSE
); 
2003 void wxResourceEditorFrame::OnSave(wxCommandEvent
& event
) 
2008 void wxResourceEditorFrame::OnSaveAs(wxCommandEvent
& event
) 
2013 void wxResourceEditorFrame::OnExit(wxCommandEvent
& event
) 
2015           manager
->Clear(TRUE
, FALSE
) ; 
2019 void wxResourceEditorFrame::OnAbout(wxCommandEvent
& event
) 
2022       sprintf(buf
, "wxWindows Dialog Editor %.1f\nAuthor: Julian Smart J.Smart@ed.ac.uk\nJulian Smart (c) 1996", wxDIALOG_EDITOR_VERSION
); 
2023       wxMessageBox(buf
, "About Dialog Editor", wxOK
|wxCENTRE
); 
2026 void wxResourceEditorFrame::OnTest(wxCommandEvent
& event
) 
2028     manager
->TestCurrentDialog(this); 
2031 void wxResourceEditorFrame::OnContents(wxCommandEvent
& event
) 
2033       wxBeginBusyCursor(); 
2034       manager
->GetHelpController()->LoadFile(); 
2035       manager
->GetHelpController()->DisplayContents(); 
2039 void wxResourceEditorFrame::OnDeleteSelection(wxCommandEvent
& event
) 
2041       manager
->DeleteSelection(); 
2044 void wxResourceEditorFrame::OnRecreateSelection(wxCommandEvent
& event
) 
2046       manager
->RecreateSelection(); 
2049 bool wxResourceEditorFrame::OnClose() 
2051   if (manager
->Modified()) 
2053   if (!manager
->Clear(TRUE
, FALSE
)) 
2061     manager
->m_resourceEditorWindowSize
.width 
= w
; 
2062     manager
->m_resourceEditorWindowSize
.height 
= h
; 
2065     GetPosition(&x
, &y
); 
2067     manager
->m_resourceEditorWindowSize
.x 
= x
; 
2068     manager
->m_resourceEditorWindowSize
.y 
= y
; 
2070   manager
->SetEditorFrame(NULL
); 
2071   manager
->SetEditorToolBar(NULL
); 
2077  * Resource editor window that contains the dialog/panel being edited 
2080 BEGIN_EVENT_TABLE(wxResourceEditorScrolledWindow
, wxScrolledWindow
) 
2081     EVT_SCROLL(wxResourceEditorScrolledWindow::OnScroll
) 
2082     EVT_PAINT(wxResourceEditorScrolledWindow::OnPaint
) 
2085 wxResourceEditorScrolledWindow::wxResourceEditorScrolledWindow(wxWindow 
*parent
, const wxPoint
& pos
, const wxSize
& size
, 
2087   wxScrolledWindow(parent
, -1, pos
, size
, style
) 
2091     m_childWindow 
= NULL
; 
2094 wxResourceEditorScrolledWindow::~wxResourceEditorScrolledWindow() 
2098 void wxResourceEditorScrolledWindow::OnScroll(wxScrollEvent
& event
) 
2100     wxScrolledWindow::OnScroll(event
); 
2103     ViewStart(& x
, & y
); 
2106         m_childWindow
->Move(m_marginX 
+ (- x 
* 10), m_marginY 
+ (- y 
* 10)); 
2109 void wxResourceEditorScrolledWindow::OnPaint(wxPaintEvent
& event
) 
2116 void wxResourceEditorScrolledWindow::DrawTitle(wxDC
& dc
) 
2120         wxItemResource
* res 
= wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(m_childWindow
); 
2123             wxString 
str(res
->GetTitle()); 
2125             ViewStart(& x
, & y
); 
2127             wxFont 
font(10, wxSWISS
, wxNORMAL
, wxBOLD
); 
2129             dc
.SetBackgroundMode(wxTRANSPARENT
); 
2130             dc
.SetTextForeground(wxColour(0, 0, 0)); 
2133             dc
.GetTextExtent(str
, & w
, & h
); 
2135             dc
.DrawText(str
, m_marginX 
+ (- x 
* 10), m_marginY 
+ (- y 
* 10) - h 
- 5); 
2140 // Popup menu callback 
2141 void ObjectMenuProc(wxMenu
& menu
, wxCommandEvent
& event
) 
2143   wxWindow 
*data 
= (wxWindow 
*)menu
.GetClientData(); 
2147   switch (event
.GetInt()) 
2149     case OBJECT_MENU_EDIT
: 
2151       wxResourceManager::GetCurrentResourceManager()->EditWindow(data
); 
2154     case OBJECT_MENU_DELETE
: 
2156       wxResourceManager::GetCurrentResourceManager()->SaveInfoAndDeleteHandler(data
); 
2157       wxResourceManager::GetCurrentResourceManager()->DeleteResource(data
); 
2158       wxResourceManager::GetCurrentResourceManager()->DeleteWindow(data
); 
2171 BEGIN_EVENT_TABLE(EditorToolBar
, wxToolBar
) 
2172         EVT_PAINT(EditorToolBar::OnPaint
) 
2175 EditorToolBar::EditorToolBar(wxFrame 
*frame
, const wxPoint
& pos
, const wxSize
& size
, 
2177   wxToolBar(frame
, -1, pos
, size
, style
) 
2181 bool EditorToolBar::OnLeftClick(int toolIndex
, bool toggled
) 
2183   wxResourceManager 
*manager 
= wxResourceManager::GetCurrentResourceManager(); 
2187     case TOOLBAR_LOAD_FILE
: 
2194       manager
->CreateNewPanel(); 
2197     case TOOLBAR_SAVE_FILE
: 
2204       wxBeginBusyCursor(); 
2205       manager
->GetHelpController()->LoadFile(); 
2206       manager
->GetHelpController()->DisplayContents(); 
2210     case TOOLBAR_FORMAT_HORIZ
: 
2212       manager
->AlignItems(TOOLBAR_FORMAT_HORIZ
); 
2215     case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN
: 
2217       manager
->AlignItems(TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN
); 
2220     case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN
: 
2222       manager
->AlignItems(TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN
); 
2225     case TOOLBAR_FORMAT_VERT
: 
2227       manager
->AlignItems(TOOLBAR_FORMAT_VERT
); 
2230     case TOOLBAR_FORMAT_VERT_TOP_ALIGN
: 
2232       manager
->AlignItems(TOOLBAR_FORMAT_VERT_TOP_ALIGN
); 
2235     case TOOLBAR_FORMAT_VERT_BOT_ALIGN
: 
2237       manager
->AlignItems(TOOLBAR_FORMAT_VERT_BOT_ALIGN
); 
2240     case TOOLBAR_COPY_SIZE
: 
2242       manager
->CopySize(); 
2245     case TOOLBAR_TO_BACK
: 
2247       manager
->ToBackOrFront(TRUE
); 
2250     case TOOLBAR_TO_FRONT
: 
2252       manager
->ToBackOrFront(FALSE
); 
2261 void EditorToolBar::OnMouseEnter(int toolIndex
) 
2263   wxFrame 
*frame 
= (wxFrame 
*)GetParent(); 
2271         case TOOLBAR_LOAD_FILE
: 
2272           frame
->SetStatusText("Load project file"); 
2274         case TOOLBAR_SAVE_FILE
: 
2275           frame
->SetStatusText("Save project file"); 
2278           frame
->SetStatusText("Create a new resource"); 
2280         case TOOLBAR_FORMAT_HORIZ
: 
2281           frame
->SetStatusText("Align items horizontally"); 
2283         case TOOLBAR_FORMAT_VERT
: 
2284           frame
->SetStatusText("Align items vertically"); 
2286         case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN
: 
2287           frame
->SetStatusText("Left-align items"); 
2289         case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN
: 
2290           frame
->SetStatusText("Right-align items"); 
2292         case TOOLBAR_FORMAT_VERT_TOP_ALIGN
: 
2293           frame
->SetStatusText("Top-align items"); 
2295         case TOOLBAR_FORMAT_VERT_BOT_ALIGN
: 
2296           frame
->SetStatusText("Bottom-align items"); 
2298         case TOOLBAR_COPY_SIZE
: 
2299           frame
->SetStatusText("Copy size from first selection"); 
2301         case TOOLBAR_TO_FRONT
: 
2302           frame
->SetStatusText("Put image to front"); 
2304         case TOOLBAR_TO_BACK
: 
2305           frame
->SetStatusText("Put image to back"); 
2308           frame
->SetStatusText("Display help contents"); 
2314   else frame
->SetStatusText(""); 
2317 void EditorToolBar::OnPaint(wxPaintEvent
& event
) 
2319   wxToolBar::OnPaint(event
); 
2324   dc
.SetPen(wxBLACK_PEN
); 
2325   dc
.SetBrush(wxTRANSPARENT_BRUSH
); 
2326   dc
.DrawLine(0, h
-1, w
, h
-1);