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" 
  36 #include "wx/toolbar.h" 
  39 #include "wx/scrolbar.h" 
  40 #include "wx/config.h" 
  48 #if defined(__WXMSW__) && !defined(__GNUWIN32__) 
  51 #include <strstream.h> 
  71 static void ObjectMenuProc(wxMenu
& menu
, wxCommandEvent
& event
); 
  72 wxResourceManager 
*wxResourceManager::sm_currentResourceManager 
= NULL
; 
  75 #include "bitmaps/load.xpm" 
  76 #include "bitmaps/save.xpm" 
  77 #include "bitmaps/new.xpm" 
  78 #include "bitmaps/vert.xpm" 
  79 #include "bitmaps/alignt.xpm" 
  80 #include "bitmaps/alignb.xpm" 
  81 #include "bitmaps/horiz.xpm" 
  82 #include "bitmaps/alignl.xpm" 
  83 #include "bitmaps/alignr.xpm" 
  84 #include "bitmaps/copysize.xpm" 
  85 #include "bitmaps/tofront.xpm" 
  86 #include "bitmaps/toback.xpm" 
  87 #include "bitmaps/help.xpm" 
  88 #include "bitmaps/wxwin.xpm" 
  95 wxResourceManager::wxResourceManager(): 
  96   m_imageList(16, 16, TRUE
) 
  98   sm_currentResourceManager 
= this; 
 100   m_editorPanel 
= NULL
; 
 102   m_editorResourceTree 
= NULL
; 
 103   m_editorControlList 
= NULL
; 
 105   m_symbolIdCounter 
= 99; 
 107   m_currentFilename 
= ""; 
 108   m_symbolFilename 
= ""; 
 109   m_editorToolBar 
= NULL
; 
 111   // Default window positions 
 112   m_resourceEditorWindowSize
.width 
= 500; 
 113   m_resourceEditorWindowSize
.height 
= 450; 
 115   m_resourceEditorWindowSize
.x 
= 0; 
 116   m_resourceEditorWindowSize
.y 
= 0; 
 118   m_propertyWindowSize
.width 
= 300; 
 119   m_propertyWindowSize
.height 
= 300; 
 122   m_helpController 
= NULL
; 
 125   m_bitmapImage 
= NULL
; 
 126   m_rootDialogItem 
= 0; 
 129 wxResourceManager::~wxResourceManager() 
 131   sm_currentResourceManager 
= NULL
; 
 135   if (m_helpController
) 
 137     m_helpController
->Quit(); 
 138     delete m_helpController
; 
 139     m_helpController 
= NULL
; 
 143   delete m_bitmapImage
; 
 147 bool wxResourceManager::Initialize() 
 149   // Set up the resource filename for each platform. 
 151   // dialoged.ini in the Windows directory 
 153   GetWindowsDirectory(buf
, 256); 
 154   strcat(buf
, "\\dialoged.ini"); 
 155   m_optionsResourceFilename 
= buf
; 
 156 #elif defined(__WXGTK__) 
 157   wxGetHomeDir( &m_optionsResourceFilename 
); 
 158   m_optionsResourceFilename 
+= "/.dialogedrc"; 
 160 #error "Unsupported platform." 
 166   m_helpController 
= new wxHelpController
; 
 167   m_helpController
->Initialize("dialoged"); 
 170   m_popupMenu 
= new wxMenu("", (wxFunction
)ObjectMenuProc
); 
 171   m_popupMenu
->Append(OBJECT_MENU_EDIT
, "Edit properties"); 
 172   m_popupMenu
->Append(OBJECT_MENU_DELETE
, "Delete object"); 
 177     m_bitmapImage 
= new wxBitmap("WXWINBMP", wxBITMAP_TYPE_BMP_RESOURCE
); 
 180     m_bitmapImage 
= new wxBitmap( wxwin_xpm 
); 
 184   // Initialize the image list icons 
 186   wxIcon 
icon1("DIALOG_ICON", wxBITMAP_TYPE_ICO_RESOURCE
, 16, 16); 
 187   wxIcon 
icon2("FOLDER1_ICON", wxBITMAP_TYPE_ICO_RESOURCE
, 16, 16); 
 188   wxIcon 
icon3("FOLDER2_ICON", wxBITMAP_TYPE_ICO_RESOURCE
, 16, 16); 
 189   wxIcon 
icon4("BUTTONSM_ICON", wxBITMAP_TYPE_ICO_RESOURCE
, 16, 16); 
 190   m_imageList
.Add(icon1
); 
 191   m_imageList
.Add(icon2
); 
 192   m_imageList
.Add(icon3
); 
 193   m_imageList
.Add(icon4
); 
 196   m_symbolTable
.AddStandardSymbols(); 
 201 bool wxResourceManager::LoadOptions() 
 203   wxConfig 
config("DialogEd", "wxWindows"); 
 205   config
.Read("editorWindowX", &m_resourceEditorWindowSize
.x
); 
 206   config
.Read("editorWindowY", &m_resourceEditorWindowSize
.y
); 
 207   config
.Read("editorWindowWidth", &m_resourceEditorWindowSize
.width
); 
 208   config
.Read("editorWindowHeight", &m_resourceEditorWindowSize
.height
); 
 209   config
.Read("propertyWindowX", &m_propertyWindowSize
.x
); 
 210   config
.Read("propertyWindowY", &m_propertyWindowSize
.y
); 
 211   config
.Read("propertyWindowWidth", &m_propertyWindowSize
.width
); 
 212   config
.Read("propertyWindowHeight", &m_propertyWindowSize
.height
); 
 215   wxGetResource("DialogEd", "editorWindowX", &m_resourceEditorWindowSize.x, m_optionsResourceFilename.GetData()); 
 216   wxGetResource("DialogEd", "editorWindowY", &m_resourceEditorWindowSize.y, m_optionsResourceFilename.GetData()); 
 217   wxGetResource("DialogEd", "editorWindowWidth", &m_resourceEditorWindowSize.width, m_optionsResourceFilename.GetData()); 
 218   wxGetResource("DialogEd", "editorWindowHeight", &m_resourceEditorWindowSize.height, m_optionsResourceFilename.GetData()); 
 219   wxGetResource("DialogEd", "propertyWindowX", &m_propertyWindowSize.x, m_optionsResourceFilename.GetData()); 
 220   wxGetResource("DialogEd", "propertyWindowY", &m_propertyWindowSize.y, m_optionsResourceFilename.GetData()); 
 221   wxGetResource("DialogEd", "propertyWindowWidth", &m_propertyWindowSize.width, m_optionsResourceFilename.GetData()); 
 222   wxGetResource("DialogEd", "propertyWindowHeight", &m_propertyWindowSize.height, m_optionsResourceFilename.GetData()); 
 227 bool wxResourceManager::SaveOptions() 
 229   wxConfig 
config("DialogEd", "wxWindows"); 
 231   config
.Write("editorWindowX", m_resourceEditorWindowSize
.x
); 
 232   config
.Write("editorWindowY", m_resourceEditorWindowSize
.y
); 
 233   config
.Write("editorWindowWidth", m_resourceEditorWindowSize
.width
); 
 234   config
.Write("editorWindowHeight", m_resourceEditorWindowSize
.height
); 
 235   config
.Write("propertyWindowX", m_propertyWindowSize
.x
); 
 236   config
.Write("propertyWindowY", m_propertyWindowSize
.y
); 
 237   config
.Write("propertyWindowWidth", m_propertyWindowSize
.width
); 
 238   config
.Write("propertyWindowHeight", m_propertyWindowSize
.height
); 
 240   wxWriteResource("DialogEd", "editorWindowX", m_resourceEditorWindowSize.x, m_optionsResourceFilename.GetData()); 
 241   wxWriteResource("DialogEd", "editorWindowY", m_resourceEditorWindowSize.y, m_optionsResourceFilename.GetData()); 
 242   wxWriteResource("DialogEd", "editorWindowWidth", m_resourceEditorWindowSize.width, m_optionsResourceFilename.GetData()); 
 243   wxWriteResource("DialogEd", "editorWindowHeight", m_resourceEditorWindowSize.height, m_optionsResourceFilename.GetData()); 
 245   wxWriteResource("DialogEd", "propertyWindowX", m_propertyWindowSize.x, m_optionsResourceFilename.GetData()); 
 246   wxWriteResource("DialogEd", "propertyWindowY", m_propertyWindowSize.y, m_optionsResourceFilename.GetData()); 
 247   wxWriteResource("DialogEd", "propertyWindowWidth", m_propertyWindowSize.width, m_optionsResourceFilename.GetData()); 
 248   wxWriteResource("DialogEd", "propertyWindowHeight", m_propertyWindowSize.height, m_optionsResourceFilename.GetData()); 
 254 // Show or hide the resource editor frame, which displays a list 
 255 // of resources with ability to edit them. 
 256 bool wxResourceManager::ShowResourceEditor(bool show
, wxWindow 
*WXUNUSED(parent
), const char *title
) 
 262       m_editorFrame
->Iconize(FALSE
); 
 263       m_editorFrame
->Show(TRUE
); 
 266     m_editorFrame 
= OnCreateEditorFrame(title
); 
 268     wxMenuBar 
*menuBar 
= OnCreateEditorMenuBar(m_editorFrame
); 
 269     m_editorFrame
->SetMenuBar(menuBar
); 
 271     m_editorToolBar 
= (EditorToolBar 
*)OnCreateToolBar(m_editorFrame
); 
 272     m_editorControlList 
= new wxResourceEditorControlList(m_editorFrame
, IDC_LISTCTRL
, wxPoint(0, 0), wxSize(-1, -1)); 
 273     m_editorResourceTree 
= new wxResourceEditorProjectTree(m_editorFrame
, IDC_TREECTRL
, wxPoint(0, 0), wxSize(-1, -1), 
 275     m_editorPanel 
= OnCreateEditorPanel(m_editorFrame
); 
 277     m_editorResourceTree
->SetImageList(& m_imageList
); 
 279     // Constraints for toolbar 
 280     wxLayoutConstraints 
*c 
= new wxLayoutConstraints
; 
 281     c
->left
.SameAs       (m_editorFrame
, wxLeft
, 0); 
 282     c
->top
.SameAs        (m_editorFrame
, wxTop
, 0); 
 283     c
->right
.SameAs      (m_editorFrame
, wxRight
, 0); 
 284     c
->bottom
.Unconstrained(); 
 285     c
->width
.Unconstrained(); 
 286     c
->height
.Absolute(28); 
 287     m_editorToolBar
->SetConstraints(c
); 
 289     // Constraints for listbox 
 290     c 
= new wxLayoutConstraints
; 
 291     c
->left
.SameAs       (m_editorFrame
, wxLeft
, 0); 
 292     c
->top
.SameAs        (m_editorToolBar
, wxBottom
, 0); 
 293     c
->right
.Absolute    (150); 
 294     c
->bottom
.SameAs     (m_editorControlList
, wxTop
, 0); 
 295     c
->width
.Unconstrained(); 
 296     c
->height
.Unconstrained(); 
 297     m_editorResourceTree
->SetConstraints(c
); 
 299     // Constraints for panel 
 300     c 
= new wxLayoutConstraints
; 
 301     c
->left
.SameAs       (m_editorResourceTree
, wxRight
, 0); 
 302     c
->top
.SameAs        (m_editorToolBar
, wxBottom
, 0); 
 303     c
->right
.SameAs      (m_editorFrame
, wxRight
, 0); 
 304     c
->bottom
.SameAs     (m_editorControlList
, wxTop
, 0); 
 305     c
->width
.Unconstrained(); 
 306     c
->height
.Unconstrained(); 
 307     m_editorPanel
->SetConstraints(c
); 
 309     // Constraints for control list (bottom window) 
 310     c 
= new wxLayoutConstraints
; 
 311     c
->left
.SameAs       (m_editorFrame
, wxLeft
, 0); 
 312     c
->right
.SameAs      (m_editorFrame
, wxRight
, 0); 
 313     c
->bottom
.SameAs     (m_editorFrame
, wxBottom
, 0); 
 314     c
->width
.Unconstrained(); 
 316     c
->height
.Absolute(140); 
 318     c
->height
.Absolute(60); 
 321     m_editorControlList
->SetConstraints(c
); 
 323     m_editorFrame
->SetAutoLayout(TRUE
); 
 325     UpdateResourceList(); 
 327     m_editorFrame
->Show(TRUE
); 
 332     wxFrame 
*fr 
= m_editorFrame
; 
 333     if (m_editorFrame
->OnClose()) 
 337       m_editorFrame 
= NULL
; 
 338       m_editorPanel 
= NULL
; 
 344 void wxResourceManager::SetFrameTitle(const wxString
& filename
) 
 348     if (filename 
== wxString("")) 
 349       m_editorFrame
->SetTitle("wxWindows Dialog Editor - untitled"); 
 352       wxString 
str("wxWindows Dialog Editor - "); 
 353       wxString 
str2(wxFileNameFromPath(WXSTRINGCAST filename
)); 
 355       m_editorFrame
->SetTitle(str
); 
 360 bool wxResourceManager::Save() 
 362   if (m_currentFilename 
== wxString("")) 
 365     return Save(m_currentFilename
); 
 368 bool wxResourceManager::Save(const wxString
& filename
) 
 370   // Ensure all visible windows are saved to their resources 
 371   m_currentFilename 
= filename
; 
 372   SetFrameTitle(m_currentFilename
); 
 373   InstantiateAllResourcesFromWindows(); 
 374   if (m_resourceTable
.Save(filename
)) 
 376     m_symbolTable
.WriteIncludeFile(m_symbolFilename
); 
 384 bool wxResourceManager::SaveAs() 
 386   wxString 
s(wxFileSelector("Save resource file", wxPathOnly(WXSTRINGCAST m_currentFilename
), wxFileNameFromPath(WXSTRINGCAST m_currentFilename
), 
 387     "wxr", "*.wxr", wxSAVE 
| wxOVERWRITE_PROMPT
)); 
 389   if (s
.IsNull() || s 
== "") 
 392   m_currentFilename 
= s
; 
 393   wxStripExtension(m_currentFilename
); 
 394   m_currentFilename 
+= ".wxr"; 
 396   // Construct include filename from this file 
 397   m_symbolFilename 
= m_currentFilename
; 
 399   wxStripExtension(m_symbolFilename
); 
 400   m_symbolFilename 
+= ".h"; 
 402   Save(m_currentFilename
); 
 406 bool wxResourceManager::SaveIfModified() 
 413 bool wxResourceManager::Load(const wxString
& filename
) 
 415   return New(TRUE
, filename
); 
 418 bool wxResourceManager::New(bool loadFromFile
, const wxString
& filename
) 
 420   if (!Clear(TRUE
, FALSE
)) 
 423   m_symbolTable
.AddStandardSymbols(); 
 427     wxString str 
= filename
; 
 428     if (str 
== wxString("")) 
 430       wxString 
f(wxFileSelector("Open resource file", NULL
, NULL
, "wxr", "*.wxr", 0, NULL
)); 
 431       if (!f
.IsNull() && f 
!= "") 
 437     if (!m_resourceTable
.ParseResourceFile(WXSTRINGCAST str
)) 
 439       wxMessageBox("Could not read file.", "Resource file load error", wxOK 
| wxICON_EXCLAMATION
); 
 442     m_currentFilename 
= str
; 
 444     SetFrameTitle(m_currentFilename
); 
 446     UpdateResourceList(); 
 448     // Construct include filename from this file 
 449     m_symbolFilename 
= m_currentFilename
; 
 451     wxStripExtension(m_symbolFilename
); 
 452     m_symbolFilename 
+= ".h"; 
 454     if (!m_symbolTable
.ReadIncludeFile(m_symbolFilename
)) 
 456         wxString 
str("Could not find include file "); 
 457         str 
+= m_symbolFilename
; 
 458         str 
+= ".\nDialog Editor maintains a header file containing id symbols to be used in the application.\n"; 
 459         str 
+= "The next time this .wxr file is saved, a header file will be saved also."; 
 460         wxMessageBox(str
, "Dialog Editor Warning", wxOK 
); 
 462         m_symbolIdCounter 
= 99; 
 466         // Set the id counter to the last known id 
 467         m_symbolIdCounter 
= m_symbolTable
.FindHighestId(); 
 470     // Now check in case some (or all) resources don't have resource ids, or they 
 471     // don't match the .h file, or something of that nature. 
 472     bool altered 
= RepairResourceIds(); 
 475         wxMessageBox("Some resources have had new identifiers associated with them, since they were missing.",  
 476                      "Dialog Editor Warning", wxOK 
); 
 487     m_currentFilename 
= ""; 
 494 bool wxResourceManager::Clear(bool WXUNUSED(deleteWindows
), bool force
) 
 496   if (!force 
&& Modified()) 
 498     int ans 
= wxMessageBox("Save modified resource file?", "Dialog Editor", wxYES_NO 
| wxCANCEL
); 
 502       if (!SaveIfModified()) 
 508   ClearCurrentDialog(); 
 509   DisassociateWindows(); 
 511   m_symbolTable
.Clear(); 
 512   m_resourceTable
.ClearTable(); 
 513   UpdateResourceList(); 
 518 bool wxResourceManager::DisassociateWindows() 
 520   m_resourceTable
.BeginFind(); 
 522   while ((node 
= m_resourceTable
.Next())) 
 524     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
 525     DisassociateResource(res
); 
 531 void wxResourceManager::AssociateResource(wxItemResource 
*resource
, wxWindow 
*win
) 
 533   if (!m_resourceAssociations
.Get((long)resource
)) 
 534     m_resourceAssociations
.Put((long)resource
, win
); 
 536   wxNode 
*node 
= resource
->GetChildren().First(); 
 539     wxItemResource 
*child 
= (wxItemResource 
*)node
->Data(); 
 540     wxWindow 
*childWindow 
= (wxWindow 
*)m_resourceAssociations
.Get((long)child
); 
 542       childWindow 
= win
->FindWindow(child
->GetName()); 
 544       AssociateResource(child
, childWindow
); 
 548       sprintf(buf
, "AssociateResource: cannot find child window %s", child
->GetName() ? (const char*) child
->GetName() : "(unnamed)"); 
 549       wxMessageBox(buf
, "Dialog Editor problem", wxOK
); 
 556 bool wxResourceManager::DisassociateResource(wxItemResource 
*resource
) 
 558   wxWindow 
*win 
= FindWindowForResource(resource
); 
 562   // Disassociate children of window 
 563   if (win
->GetChildren()) 
 565     wxNode 
*node 
= win
->GetChildren()->First(); 
 568       wxWindow 
*child 
= (wxWindow 
*)node
->Data(); 
 569       if (child
->IsKindOf(CLASSINFO(wxControl
))) 
 570         DisassociateResource(child
); 
 575   RemoveSelection(win
); 
 576   m_resourceAssociations
.Delete((long)resource
); 
 580 bool wxResourceManager::DisassociateResource(wxWindow 
*win
) 
 582   wxItemResource 
*res 
= FindResourceForWindow(win
); 
 584     return DisassociateResource(res
); 
 589 // Saves the window info into the resource, and deletes the 
 590 // handler. Doesn't actually disassociate the window from 
 591 // the resources. Replaces OnClose. 
 592 bool wxResourceManager::SaveInfoAndDeleteHandler(wxWindow
* win
) 
 594     wxItemResource 
*res 
= FindResourceForWindow(win
); 
 596     if (win
->IsKindOf(CLASSINFO(wxPanel
))) 
 598         wxResourceEditorDialogHandler
* handler 
= (wxResourceEditorDialogHandler
*) win
->GetEventHandler(); 
 599         win
->PopEventHandler(); 
 601         // Now reset all child event handlers 
 602         wxNode 
*node 
= win
->GetChildren()->First(); 
 605                 wxWindow 
*child 
= (wxWindow 
*)node
->Data(); 
 606                 wxEvtHandler 
*childHandler 
= child
->GetEventHandler(); 
 607                 if ( child
->IsKindOf(CLASSINFO(wxControl
)) && childHandler 
!= child 
) 
 609                         child
->PopEventHandler(TRUE
); 
 617         win
->PopEventHandler(TRUE
); 
 620     // Save the information 
 621     InstantiateResourceFromWindow(res
, win
, TRUE
); 
 623 //  DisassociateResource(win); 
 628 // Destroys the window. If this is the 'current' panel, NULLs the 
 630 bool wxResourceManager::DeleteWindow(wxWindow
* win
) 
 632     bool clearDisplay 
= FALSE
; 
 633     if (m_editorPanel
->m_childWindow 
== win
) 
 635         m_editorPanel
->m_childWindow 
= NULL
; 
 642         m_editorPanel
->Clear(); 
 647 wxItemResource 
*wxResourceManager::FindResourceForWindow(wxWindow 
*win
) 
 649   m_resourceAssociations
.BeginFind(); 
 651   while ((node 
= m_resourceAssociations
.Next())) 
 653     wxWindow 
*w 
= (wxWindow 
*)node
->Data(); 
 656       return (wxItemResource 
*)node
->GetKeyInteger(); 
 662 wxWindow 
*wxResourceManager::FindWindowForResource(wxItemResource 
*resource
) 
 664   return (wxWindow 
*)m_resourceAssociations
.Get((long)resource
); 
 668 void wxResourceManager::MakeUniqueName(char *prefix
, char *buf
) 
 672     sprintf(buf
, "%s%d", prefix
, m_nameCounter
); 
 675     if (!m_resourceTable
.FindResource(buf
)) 
 680 wxFrame 
*wxResourceManager::OnCreateEditorFrame(const char *title
) 
 683   int frameWidth = 420; 
 684   int frameHeight = 300; 
 687   wxResourceEditorFrame 
*frame 
= new wxResourceEditorFrame(this, NULL
, title
, 
 688     wxPoint(m_resourceEditorWindowSize
.x
, m_resourceEditorWindowSize
.y
), 
 689     wxSize(m_resourceEditorWindowSize
.width
, m_resourceEditorWindowSize
.height
), 
 690     wxDEFAULT_FRAME_STYLE
); 
 692   frame
->CreateStatusBar(1); 
 694   frame
->SetAutoLayout(TRUE
); 
 696   frame
->SetIcon(wxIcon("DIALOGEDICON")); 
 701 wxMenuBar 
*wxResourceManager::OnCreateEditorMenuBar(wxFrame 
*WXUNUSED(parent
)) 
 703   wxMenuBar 
*menuBar 
= new wxMenuBar
; 
 705   wxMenu 
*fileMenu 
= new wxMenu
; 
 706   fileMenu
->Append(RESED_NEW_DIALOG
, "New &dialog", "Create a new dialog"); 
 707   fileMenu
->AppendSeparator(); 
 708   fileMenu
->Append(wxID_NEW
, "&New project",           "Clear the current project"); 
 709   fileMenu
->Append(wxID_OPEN
, "&Open...",         "Load a resource file"); 
 710   fileMenu
->Append(wxID_SAVE
, "&Save",            "Save a resource file"); 
 711   fileMenu
->Append(wxID_SAVEAS
, "Save &As...",   "Save a resource file as..."); 
 712   fileMenu
->Append(RESED_CLEAR
, "&Clear",   "Clear current resources"); 
 713   fileMenu
->AppendSeparator(); 
 714   fileMenu
->Append(wxID_EXIT
, "E&xit",            "Exit resource editor"); 
 716   wxMenu 
*editMenu 
= new wxMenu
; 
 717   editMenu
->Append(RESED_TEST
, "&Test Dialog",  "Test dialog"); 
 718   editMenu
->Append(RESED_RECREATE
, "&Recreate",  "Recreate the selected resource(s)"); 
 719   editMenu
->Append(RESED_DELETE
, "&Delete",  "Delete the selected resource(s)"); 
 721   wxMenu 
*helpMenu 
= new wxMenu
; 
 722   helpMenu
->Append(RESED_CONTENTS
, "&Help topics",          "Invokes the on-line help"); 
 723   helpMenu
->AppendSeparator(); 
 724   helpMenu
->Append(wxID_ABOUT
, "&About",          "About wxWindows Dialog Editor"); 
 726   menuBar
->Append(fileMenu
, "&File"); 
 727   menuBar
->Append(editMenu
, "&Edit"); 
 728   menuBar
->Append(helpMenu
, "&Help"); 
 733 wxResourceEditorScrolledWindow 
*wxResourceManager::OnCreateEditorPanel(wxFrame 
*parent
) 
 735   wxResourceEditorScrolledWindow 
*panel 
= new wxResourceEditorScrolledWindow(parent
, wxDefaultPosition
, wxDefaultSize
, 
 736 //    wxSUNKEN_BORDER|wxCLIP_CHILDREN); 
 739   panel
->SetScrollbars(10, 10, 100, 100); 
 744 wxToolBar 
*wxResourceManager::OnCreateToolBar(wxFrame 
*parent
) 
 746   // Load palette bitmaps 
 748   wxBitmap 
ToolbarLoadBitmap("LOADTOOL"); 
 749   wxBitmap 
ToolbarSaveBitmap("SAVETOOL"); 
 750   wxBitmap 
ToolbarNewBitmap("NEWTOOL"); 
 751   wxBitmap 
ToolbarVertBitmap("VERTTOOL"); 
 752   wxBitmap 
ToolbarAlignTBitmap("ALIGNTTOOL"); 
 753   wxBitmap 
ToolbarAlignBBitmap("ALIGNBTOOL"); 
 754   wxBitmap 
ToolbarHorizBitmap("HORIZTOOL"); 
 755   wxBitmap 
ToolbarAlignLBitmap("ALIGNLTOOL"); 
 756   wxBitmap 
ToolbarAlignRBitmap("ALIGNRTOOL"); 
 757   wxBitmap 
ToolbarCopySizeBitmap("COPYSIZETOOL"); 
 758   wxBitmap 
ToolbarToBackBitmap("TOBACKTOOL"); 
 759   wxBitmap 
ToolbarToFrontBitmap("TOFRONTTOOL"); 
 760   wxBitmap 
ToolbarHelpBitmap("HELPTOOL"); 
 763   wxBitmap 
ToolbarLoadBitmap( load_xpm 
); 
 764   wxBitmap 
ToolbarSaveBitmap( save_xpm
); 
 765   wxBitmap 
ToolbarNewBitmap( new_xpm 
); 
 766   wxBitmap 
ToolbarVertBitmap( vert_xpm 
); 
 767   wxBitmap 
ToolbarAlignTBitmap( alignt_xpm 
); 
 768   wxBitmap 
ToolbarAlignBBitmap( alignb_xpm 
); 
 769   wxBitmap 
ToolbarHorizBitmap( horiz_xpm 
); 
 770   wxBitmap 
ToolbarAlignLBitmap( alignl_xpm 
); 
 771   wxBitmap 
ToolbarAlignRBitmap( alignr_xpm 
); 
 772   wxBitmap 
ToolbarCopySizeBitmap( copysize_xpm 
); 
 773   wxBitmap 
ToolbarToBackBitmap( toback_xpm 
); 
 774   wxBitmap 
ToolbarToFrontBitmap( tofront_xpm 
); 
 775   wxBitmap 
ToolbarHelpBitmap( help_xpm 
); 
 778   // Create the toolbar 
 779   EditorToolBar 
*toolbar 
= new EditorToolBar(parent
, wxPoint(0, 0), wxSize(-1, -1), wxNO_BORDER
|wxTB_HORIZONTAL
); 
 780   toolbar
->SetMargins(2, 2); 
 787   int width 
= 24; // ToolbarLoadBitmap->GetWidth();  ??? 
 792   toolbar
->AddSeparator(); 
 793   toolbar
->AddTool(TOOLBAR_NEW
, ToolbarNewBitmap
, (wxBitmap 
*)NULL
, 
 794                    FALSE
, (float)currentX
, -1, NULL
, "New dialog"); 
 795   currentX 
+= width 
+ dx
; 
 796   toolbar
->AddTool(TOOLBAR_LOAD_FILE
, ToolbarLoadBitmap
, (wxBitmap 
*)NULL
, 
 797                    FALSE
, (float)currentX
, -1, NULL
, "Load"); 
 798   currentX 
+= width 
+ dx
; 
 799   toolbar
->AddTool(TOOLBAR_SAVE_FILE
, ToolbarSaveBitmap
, (wxBitmap 
*)NULL
, 
 800                    FALSE
, (float)currentX
, -1, NULL
, "Save"); 
 801   currentX 
+= width 
+ dx 
+ gap
; 
 802   toolbar
->AddSeparator(); 
 803   toolbar
->AddTool(TOOLBAR_FORMAT_HORIZ
, ToolbarVertBitmap
, (wxBitmap 
*)NULL
, 
 804                    FALSE
, (float)currentX
, -1, NULL
, "Horizontal align"); 
 805   currentX 
+= width 
+ dx
; 
 806   toolbar
->AddTool(TOOLBAR_FORMAT_VERT_TOP_ALIGN
, ToolbarAlignTBitmap
, (wxBitmap 
*)NULL
, 
 807                    FALSE
, (float)currentX
, -1, NULL
, "Top align"); 
 808   currentX 
+= width 
+ dx
; 
 809   toolbar
->AddTool(TOOLBAR_FORMAT_VERT_BOT_ALIGN
, ToolbarAlignBBitmap
, (wxBitmap 
*)NULL
, 
 810                    FALSE
, (float)currentX
, -1, NULL
, "Bottom align"); 
 811   currentX 
+= width 
+ dx
; 
 812   toolbar
->AddTool(TOOLBAR_FORMAT_VERT
, ToolbarHorizBitmap
, (wxBitmap 
*)NULL
, 
 813                    FALSE
, (float)currentX
, -1, NULL
, "Vertical align"); 
 814   currentX 
+= width 
+ dx
; 
 815   toolbar
->AddTool(TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN
, ToolbarAlignLBitmap
, (wxBitmap 
*)NULL
, 
 816                    FALSE
, (float)currentX
, -1, NULL
, "Left align"); 
 817   currentX 
+= width 
+ dx
; 
 818   toolbar
->AddTool(TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN
, ToolbarAlignRBitmap
, (wxBitmap 
*)NULL
, 
 819                    FALSE
, (float)currentX
, -1, NULL
, "Right align"); 
 820   currentX 
+= width 
+ dx
; 
 821   toolbar
->AddTool(TOOLBAR_COPY_SIZE
, ToolbarCopySizeBitmap
, (wxBitmap 
*)NULL
, 
 822                    FALSE
, (float)currentX
, -1, NULL
, "Copy size"); 
 823   currentX 
+= width 
+ dx 
+ gap
; 
 824   toolbar
->AddSeparator(); 
 825   toolbar
->AddTool(TOOLBAR_TO_FRONT
, ToolbarToFrontBitmap
, (wxBitmap 
*)NULL
, 
 826                    FALSE
, (float)currentX
, -1, NULL
, "To front"); 
 827   currentX 
+= width 
+ dx
; 
 828   toolbar
->AddTool(TOOLBAR_TO_BACK
, ToolbarToBackBitmap
, (wxBitmap 
*)NULL
, 
 829                    FALSE
, (float)currentX
, -1, NULL
, "To back"); 
 830   currentX 
+= width 
+ dx 
+ gap
; 
 832   toolbar
->AddSeparator(); 
 833   toolbar
->AddTool(TOOLBAR_HELP
, ToolbarHelpBitmap
, (wxBitmap 
*)NULL
, 
 834                    FALSE
, (float)currentX
, -1, NULL
, "Help"); 
 835   currentX 
+= width 
+ dx
; 
 842 void wxResourceManager::UpdateResourceList() 
 844   if (!m_editorResourceTree
) 
 847   m_editorResourceTree
->SetInvalid(TRUE
); 
 848   m_editorResourceTree
->DeleteAllItems(); 
 850   long id 
= m_editorResourceTree
->AddRoot("Dialogs", 1, 2); 
 852   m_resourceTable
.BeginFind(); 
 854   while ((node 
= m_resourceTable
.Next())) 
 856     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
 857     wxString 
resType(res
->GetType()); 
 858     if (resType 
== "wxDialog" || resType 
== "wxDialogBox" || resType 
== "wxPanel" || resType 
== "wxBitmap") 
 860       AddItemsRecursively(id
, res
); 
 863   m_editorResourceTree
->Expand(id
); 
 864   m_editorResourceTree
->SetInvalid(FALSE
); 
 867 void wxResourceManager::AddItemsRecursively(long parent
, wxItemResource 
*resource
) 
 869   wxString 
theString(""); 
 870   theString 
= resource
->GetName(); 
 873   wxString 
resType(resource
->GetType()); 
 874   if (resType 
== "wxDialog" || resType 
== "wxDialogBox" || resType 
== "wxPanel") 
 879   long id 
= m_editorResourceTree
->InsertItem(parent
, theString
 
 885   m_editorResourceTree
->SetItemData(id
, new wxResourceTreeData(resource
)); 
 887   if (strcmp(resource
->GetType(), "wxBitmap") != 0) 
 889     wxNode 
*node 
= resource
->GetChildren().First(); 
 892       wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
 893       AddItemsRecursively(id
, res
); 
 897 //  m_editorResourceTree->ExpandItem(id, wxTREE_EXPAND_EXPAND); 
 900 bool wxResourceManager::EditSelectedResource() 
 902   int sel 
= m_editorResourceTree
->GetSelection(); 
 905     wxResourceTreeData 
*data 
= (wxResourceTreeData 
*)m_editorResourceTree
->GetItemData(sel
); 
 906     wxItemResource 
*res 
= data
->GetResource(); 
 912 bool wxResourceManager::Edit(wxItemResource 
*res
) 
 914   ClearCurrentDialog(); 
 916   wxString 
resType(res
->GetType()); 
 917   wxPanel 
*panel 
= (wxPanel 
*)FindWindowForResource(res
); 
 921     wxMessageBox("Should not find panel in wxResourceManager::Edit"); 
 926 //        long style = res->GetStyle(); 
 927 //        res->SetStyle(style|wxRAISED_BORDER); 
 929         wxResourceEditorDialogHandler 
*handler 
= new wxResourceEditorDialogHandler(panel
, res
, panel
->GetEventHandler(), 
 932         panel
->LoadFromResource(m_editorPanel
, res
->GetName(), &m_resourceTable
); 
 934         panel
->PushEventHandler(handler
); 
 936 //        res->SetStyle(style); 
 937                 handler
->AddChildHandlers(); // Add event handlers for all controls 
 938         AssociateResource(res
, panel
); 
 940         m_editorPanel
->m_childWindow 
= panel
; 
 941         panel
->Move(m_editorPanel
->GetMarginX(), m_editorPanel
->GetMarginY()); 
 945         wxClientDC 
dc(m_editorPanel
); 
 946         m_editorPanel
->DrawTitle(dc
); 
 951 bool wxResourceManager::CreateNewPanel() 
 953   ClearCurrentDialog(); 
 956   MakeUniqueName("dialog", buf
); 
 958   wxItemResource 
*resource 
= new wxItemResource
; 
 959   resource
->SetType("wxDialog"); 
 960   resource
->SetName(buf
); 
 961   resource
->SetTitle(buf
); 
 962   resource
->SetResourceStyle(wxRESOURCE_USE_DEFAULTS
); 
 963   resource
->SetResourceStyle(wxRESOURCE_DIALOG_UNITS
); 
 966   int id 
= GenerateWindowId("ID_DIALOG", newIdName
); 
 969   // This is now guaranteed to be unique, so just add to symbol table 
 970   m_symbolTable
.AddSymbol(newIdName
, id
); 
 972   m_resourceTable
.AddResource(resource
); 
 974   wxSize 
size(400, 300); 
 976   wxPanel 
*panel 
= new wxPanel(m_editorPanel
, -1, 
 977      wxPoint(m_editorPanel
->GetMarginX(), m_editorPanel
->GetMarginY()), 
 978      size
, wxRAISED_BORDER
|wxDEFAULT_DIALOG_STYLE
, buf
); 
 979   m_editorPanel
->m_childWindow 
= panel
; 
 981   resource
->SetStyle(panel
->GetWindowStyleFlag()); 
 983   // Store dialog units in resource 
 984   size 
= panel
->ConvertPixelsToDialog(size
); 
 986   resource
->SetSize(10, 10, size
.x
, size
.y
); 
 988   // For editing in situ we will need to use the hash table to ensure 
 989   // we don't dereference invalid pointers. 
 990 //  resourceWindowTable.Put((long)resource, panel); 
 992   wxResourceEditorDialogHandler 
*handler 
= new wxResourceEditorDialogHandler(panel
, resource
, panel
->GetEventHandler(), 
 994   panel
->PushEventHandler(handler
); 
 996   AssociateResource(resource
, panel
); 
 997   UpdateResourceList(); 
1000   m_editorPanel
->m_childWindow
->Refresh(); 
1002 //  panel->Refresh(); 
1004   wxClientDC 
dc(m_editorPanel
); 
1005   m_editorPanel
->DrawTitle(dc
); 
1010 bool wxResourceManager::CreatePanelItem(wxItemResource 
*panelResource
, wxPanel 
*panel
, char *iType
, int x
, int y
, bool isBitmap
) 
1013   if (!panel
->IsKindOf(CLASSINFO(wxPanel
)) && !panel
->IsKindOf(CLASSINFO(wxDialog
))) 
1018   wxItemResource 
*res 
= new wxItemResource
; 
1019   wxControl 
*newItem 
= NULL
; 
1021   if ((panelResource
->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS
) != 0) 
1023     wxPoint pt 
= panel
->ConvertPixelsToDialog(wxPoint(x
, y
)); 
1024     res
->SetSize(pt
.x
, pt
.y
, -1, -1); 
1026   else res
->SetSize(x
, y
, -1, -1); 
1028   res
->SetType(iType
); 
1032   wxString 
itemType(iType
); 
1034   if (itemType 
== "wxButton") 
1036       prefix 
= "ID_BUTTON"; 
1037       MakeUniqueName("button", buf
); 
1040         newItem 
= new wxBitmapButton(panel
, -1, m_bitmapImage
, wxPoint(x
, y
), wxSize(-1, -1), 0, wxDefaultValidator
, buf
); 
1042         newItem 
= new wxButton(panel
, -1, "Button", wxPoint(x
, y
), wxSize(-1, -1), 0, wxDefaultValidator
, buf
); 
1044   if (itemType 
== "wxBitmapButton") 
1046       prefix 
= "ID_BITMAPBUTTON"; 
1047       MakeUniqueName("button", buf
); 
1049       newItem 
= new wxBitmapButton(panel
, -1, m_bitmapImage
, wxPoint(x
, y
), wxSize(-1, -1), 0, wxDefaultValidator
, buf
); 
1051   else if (itemType 
== "wxMessage" || itemType 
== "wxStaticText") 
1053       prefix 
= "ID_STATIC"; 
1054       MakeUniqueName("statictext", buf
); 
1057         newItem 
= new wxStaticBitmap(panel
, -1, m_bitmapImage
, wxPoint(x
, y
), wxSize(0, 0), 0, buf
); 
1059         newItem 
= new wxStaticText(panel
, -1, "Static", wxPoint(x
, y
), wxSize(-1, -1), 0, buf
); 
1061   else if (itemType 
== "wxStaticBitmap") 
1063       prefix 
= "ID_STATICBITMAP"; 
1064       MakeUniqueName("static", buf
); 
1066       newItem 
= new wxStaticBitmap(panel
, -1, m_bitmapImage
, wxPoint(x
, y
), wxSize(-1, -1), 0, buf
); 
1068   else if (itemType 
== "wxCheckBox") 
1070       prefix 
= "ID_CHECKBOX"; 
1071       MakeUniqueName("checkbox", buf
); 
1073       newItem 
= new wxCheckBox(panel
, -1, "Checkbox", wxPoint(x
, y
), wxSize(-1, -1), 0, wxDefaultValidator
, buf
); 
1075   else if (itemType 
== "wxListBox") 
1077       prefix 
= "ID_LISTBOX"; 
1078       MakeUniqueName("listbox", buf
); 
1080       newItem 
= new wxListBox(panel
, -1, wxPoint(x
, y
), wxSize(-1, -1), 0, NULL
, 0, wxDefaultValidator
, buf
); 
1082   else if (itemType 
== "wxRadioBox") 
1084       prefix 
= "ID_RADIOBOX"; 
1085       MakeUniqueName("radiobox", buf
); 
1087       wxString names
[] = { "One", "Two" }; 
1088       newItem 
= new wxRadioBox(panel
, -1, "Radiobox", wxPoint(x
, y
), wxSize(-1, -1), 2, names
, 2, 
1089              wxHORIZONTAL
, wxDefaultValidator
, buf
); 
1090       res
->SetStringValues(wxStringList("One", "Two", NULL
)); 
1092   else if (itemType 
== "wxRadioButton") 
1094       prefix 
= "ID_RADIOBUTTON"; 
1095       MakeUniqueName("radiobutton", buf
); 
1097       wxString names
[] = { "One", "Two" }; 
1098       newItem 
= new wxRadioButton(panel
, -1, "Radiobutton", wxPoint(x
, y
), wxSize(-1, -1), 
1099              0, wxDefaultValidator
, buf
); 
1101   else if (itemType 
== "wxChoice") 
1103       prefix 
= "ID_CHOICE"; 
1104       MakeUniqueName("choice", buf
); 
1106       newItem 
= new wxChoice(panel
, -1, wxPoint(x
, y
), wxSize(-1, -1), 0, NULL
, 0, wxDefaultValidator
, buf
); 
1108   else if (itemType 
== "wxComboBox") 
1110       prefix 
= "ID_COMBOBOX"; 
1111       MakeUniqueName("combobox", buf
); 
1113       newItem 
= new wxComboBox(panel
, -1, "", wxPoint(x
, y
), wxSize(-1, -1), 0, NULL
, wxCB_DROPDOWN
, wxDefaultValidator
, buf
); 
1115   else if (itemType 
== "wxGroupBox" || itemType 
== "wxStaticBox") 
1117       prefix 
= "ID_STATICBOX"; 
1118       MakeUniqueName("staticbox", buf
); 
1120       newItem 
= new wxStaticBox(panel
, -1, "Static", wxPoint(x
, y
), wxSize(200, 200), 0, buf
); 
1122   else if (itemType 
== "wxGauge") 
1124       prefix 
= "ID_GAUGE"; 
1125       MakeUniqueName("gauge", buf
); 
1127       newItem 
= new wxGauge(panel
, -1, 10, wxPoint(x
, y
), wxSize(80, 30), wxHORIZONTAL
, wxDefaultValidator
, buf
); 
1129   else if (itemType 
== "wxSlider") 
1131       prefix 
= "ID_SLIDER"; 
1132       MakeUniqueName("slider", buf
); 
1134       newItem 
= new wxSlider(panel
, -1, 1, 1, 10, wxPoint(x
, y
), wxSize(120, -1), wxHORIZONTAL
, wxDefaultValidator
, buf
); 
1136   else if (itemType 
== "wxText" || itemType 
== "wxTextCtrl (single-line)") 
1138       prefix 
= "ID_TEXTCTRL"; 
1139       MakeUniqueName("textctrl", buf
); 
1141       res
->SetType("wxTextCtrl"); 
1142       newItem 
= new wxTextCtrl(panel
, -1, "", wxPoint(x
, y
), wxSize(120, -1), 0, wxDefaultValidator
, buf
); 
1144   else if (itemType 
== "wxMultiText" || itemType 
== "wxTextCtrl (multi-line)") 
1146       prefix 
= "ID_TEXTCTRL"; 
1147       MakeUniqueName("textctrl", buf
); 
1149       res
->SetType("wxTextCtrl"); 
1150       newItem 
= new wxTextCtrl(panel
, -1, "", wxPoint(x
, y
), wxSize(120, 100), wxTE_MULTILINE
, wxDefaultValidator
, buf
); 
1152   else if (itemType 
== "wxScrollBar") 
1154       prefix 
= "ID_SCROLLBAR"; 
1155       MakeUniqueName("scrollbar", buf
); 
1157       newItem 
= new wxScrollBar(panel
, -1, wxPoint(x
, y
), wxSize(140, -1), wxHORIZONTAL
, wxDefaultValidator
, buf
); 
1162   int actualW
, actualH
; 
1163   newItem
->GetSize(&actualW
, &actualH
); 
1164   wxSize 
actualSize(actualW
, actualH
); 
1166   if ((panelResource
->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS
) != 0) 
1168     actualSize 
= panel
->ConvertPixelsToDialog(actualSize
); 
1170   res
->SetSize(res
->GetX(), res
->GetY(), actualSize
.x
, actualSize
.y
); 
1173   int id 
= GenerateWindowId(prefix
, newIdName
); 
1176   // This is now guaranteed to be unique, so just add to symbol table 
1177   m_symbolTable
.AddSymbol(newIdName
, id
); 
1179   newItem
->PushEventHandler(new wxResourceEditorControlHandler(newItem
, newItem
)); 
1181   res
->SetStyle(newItem
->GetWindowStyleFlag()); 
1182   AssociateResource(res
, newItem
); 
1183   panelResource
->GetChildren().Append(res
); 
1185   UpdateResourceList(); 
1190 void wxResourceManager::ClearCurrentDialog() 
1192   if (m_editorPanel
->m_childWindow
) 
1194     SaveInfoAndDeleteHandler(m_editorPanel
->m_childWindow
); 
1195     DisassociateResource(m_editorPanel
->m_childWindow
); 
1196     DeleteWindow(m_editorPanel
->m_childWindow
); 
1197     m_editorPanel
->m_childWindow 
= NULL
; 
1198     m_editorPanel
->Clear(); 
1202 bool wxResourceManager::TestCurrentDialog(wxWindow
* parent
) 
1204   if (m_editorPanel
->m_childWindow
) 
1206     wxItemResource
* item 
= FindResourceForWindow(m_editorPanel
->m_childWindow
); 
1210     // Make sure the resources are up-to-date w.r.t. the window 
1211     InstantiateResourceFromWindow(item
, m_editorPanel
->m_childWindow
, TRUE
); 
1213     wxDialog
* dialog 
= new wxDialog
; 
1214     bool success 
= FALSE
; 
1215     if (dialog
->LoadFromResource(parent
, item
->GetName(), & m_resourceTable
)) 
1218         dialog
->ShowModal(); 
1226 // Find the first dialog or panel for which 
1227 // there is a selected panel item. 
1228 wxWindow 
*wxResourceManager::FindParentOfSelection() 
1230   m_resourceTable
.BeginFind(); 
1232   while ((node 
= m_resourceTable
.Next())) 
1234     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1235     wxWindow 
*win 
= FindWindowForResource(res
); 
1238       wxNode 
*node1 
= win
->GetChildren()->First(); 
1241         wxControl 
*item 
= (wxControl 
*)node1
->Data(); 
1242             wxResourceEditorControlHandler 
*childHandler 
= (wxResourceEditorControlHandler 
*)item
->GetEventHandler(); 
1243         if (item
->IsKindOf(CLASSINFO(wxControl
)) && childHandler
->IsSelected()) 
1245         node1 
= node1
->Next(); 
1252 // Format the panel items according to 'flag' 
1253 void wxResourceManager::AlignItems(int flag
) 
1255   wxWindow 
*win 
= FindParentOfSelection(); 
1259   wxNode 
*node 
= GetSelections().First(); 
1263   wxControl 
*firstSelection 
= (wxControl 
*)node
->Data(); 
1264   if (firstSelection
->GetParent() != win
) 
1269   firstSelection
->GetPosition(&firstX
, &firstY
); 
1270   firstSelection
->GetSize(&firstW
, &firstH
); 
1271   int centreX 
= (int)(firstX 
+ (firstW 
/ 2)); 
1272   int centreY 
= (int)(firstY 
+ (firstH 
/ 2)); 
1274   while ((node 
= node
->Next())) 
1276     wxControl 
*item 
= (wxControl 
*)node
->Data(); 
1277     if (item
->GetParent() == win
) 
1280       item
->GetPosition(&x
, &y
); 
1281       item
->GetSize(&w
, &h
); 
1287         case TOOLBAR_FORMAT_HORIZ
: 
1290           newY 
= (int)(centreY 
- (h
/2.0)); 
1293         case TOOLBAR_FORMAT_VERT
: 
1295           newX 
= (int)(centreX 
- (w
/2.0)); 
1299         case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN
: 
1305         case TOOLBAR_FORMAT_VERT_TOP_ALIGN
: 
1311         case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN
: 
1313           newX 
= firstX 
+ firstW 
- w
; 
1317         case TOOLBAR_FORMAT_VERT_BOT_ALIGN
: 
1320           newY 
= firstY 
+ firstH 
- h
; 
1328       item
->SetSize(newX
, newY
, w
, h
); 
1334 // Copy the first image's size to subsequent images 
1335 void wxResourceManager::CopySize() 
1337   wxWindow 
*win 
= FindParentOfSelection(); 
1341   wxNode 
*node 
= GetSelections().First(); 
1345   wxControl 
*firstSelection 
= (wxControl 
*)node
->Data(); 
1346   if (firstSelection
->GetParent() != win
) 
1351   firstSelection
->GetPosition(&firstX
, &firstY
); 
1352   firstSelection
->GetSize(&firstW
, &firstH
); 
1354   while ((node 
= node
->Next())) 
1356     wxControl 
*item 
= (wxControl 
*)node
->Data(); 
1357     if (item
->GetParent() == win
) 
1358       item
->SetSize(-1, -1, firstW
, firstH
); 
1363 void wxResourceManager::ToBackOrFront(bool toBack
) 
1365   wxWindow 
*win 
= FindParentOfSelection(); 
1368   wxItemResource 
*winResource 
= FindResourceForWindow(win
); 
1370   wxNode 
*node 
= GetSelections().First(); 
1373     wxControl 
*item 
= (wxControl 
*)node
->Data(); 
1374     wxItemResource 
*itemResource 
= FindResourceForWindow(item
); 
1375     if (item
->GetParent() == win
) 
1377       win
->GetChildren()->DeleteObject(item
); 
1379         winResource
->GetChildren().DeleteObject(itemResource
); 
1382         win
->GetChildren()->Insert(item
); 
1384           winResource
->GetChildren().Insert(itemResource
); 
1388         win
->GetChildren()->Append(item
); 
1390           winResource
->GetChildren().Append(itemResource
); 
1393     node 
= node
->Next(); 
1398 void wxResourceManager::AddSelection(wxWindow 
*win
) 
1400   if (!m_selections
.Member(win
)) 
1401     m_selections
.Append(win
); 
1404 void wxResourceManager::RemoveSelection(wxWindow 
*win
) 
1406   m_selections
.DeleteObject(win
); 
1409 // Need to search through resource table removing this from 
1410 // any resource which has this as a parent. 
1411 bool wxResourceManager::RemoveResourceFromParent(wxItemResource 
*res
) 
1413   m_resourceTable
.BeginFind(); 
1415   while ((node 
= m_resourceTable
.Next())) 
1417     wxItemResource 
*thisRes 
= (wxItemResource 
*)node
->Data(); 
1418     if (thisRes
->GetChildren().Member(res
)) 
1420       thisRes
->GetChildren().DeleteObject(res
); 
1427 bool wxResourceManager::DeleteResource(wxItemResource 
*res
) 
1432   RemoveResourceFromParent(res
); 
1434   wxNode 
*node 
= res
->GetChildren().First(); 
1437     wxNode 
*next 
= node
->Next(); 
1438     wxItemResource 
*child 
= (wxItemResource 
*)node
->Data(); 
1439     DeleteResource(child
); 
1443   // If this is a button or message resource, delete the 
1444   // associate bitmap resource if not being used. 
1445   wxString 
resType(res
->GetType()); 
1447 /* shouldn't have to do this now bitmaps are ref-counted 
1448   if ((resType == "wxMessage" || resType == "wxStaticBitmap" || resType == "wxButton" || resType == "wxBitmapButton") && res->GetValue4()) 
1450     PossiblyDeleteBitmapResource(res->GetValue4()); 
1454   // Remove symbol from table if appropriate 
1455   if (!IsSymbolUsed(res
, res
->GetId())) 
1457     m_symbolTable
.RemoveSymbol(res
->GetId()); 
1460   m_resourceTable
.Delete(res
->GetName()); 
1466 bool wxResourceManager::DeleteResource(wxWindow 
*win
) 
1468   if (win
->IsKindOf(CLASSINFO(wxControl
))) 
1470     // Deselect and refresh window in case we leave selection 
1472     wxControl 
*item 
= (wxControl 
*)win
; 
1473     wxResourceEditorControlHandler 
*childHandler 
= (wxResourceEditorControlHandler 
*)item
->GetEventHandler(); 
1474     if (childHandler
->IsSelected()) 
1476       RemoveSelection(item
); 
1477       childHandler
->SelectItem(FALSE
); 
1479       item
->GetParent()->Refresh(); 
1484   wxItemResource 
*res 
= FindResourceForWindow(win
); 
1486   DisassociateResource(res
); 
1487   DeleteResource(res
); 
1488   UpdateResourceList(); 
1493 // Will eventually have bitmap type information, for different 
1495 wxString 
wxResourceManager::AddBitmapResource(const wxString
& filename
) 
1497   wxItemResource 
*resource 
= FindBitmapResourceByFilename(filename
); 
1501     MakeUniqueName("bitmap", buf
); 
1502     resource 
= new wxItemResource
; 
1503     resource
->SetType("wxBitmap"); 
1504     resource
->SetName(buf
); 
1506     // A bitmap resource has one or more children, specifying 
1507     // alternative bitmaps. 
1508     wxItemResource 
*child 
= new wxItemResource
; 
1509     child
->SetType("wxBitmap"); 
1510     child
->SetName(filename
); 
1511     child
->SetValue1(wxBITMAP_TYPE_BMP
); 
1512     child
->SetValue2(RESOURCE_PLATFORM_ANY
); 
1513     child
->SetValue3(0); // Depth 
1514     child
->SetSize(0,0,0,0); 
1515     resource
->GetChildren().Append(child
); 
1517     m_resourceTable
.AddResource(resource
); 
1519     UpdateResourceList(); 
1522     return resource
->GetName(); 
1524     return wxEmptyString
; 
1527  // Delete the bitmap resource if it isn't being used by another resource. 
1528 void wxResourceManager::PossiblyDeleteBitmapResource(const wxString
& resourceName
) 
1530   if (!IsBitmapResourceUsed(resourceName
)) 
1532     wxItemResource 
*res 
= m_resourceTable
.FindResource(resourceName
); 
1533     DeleteResource(res
); 
1534     UpdateResourceList(); 
1538 bool wxResourceManager::IsBitmapResourceUsed(const wxString
& resourceName
) 
1540   m_resourceTable
.BeginFind(); 
1542   while ((node 
= m_resourceTable
.Next())) 
1544     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1545     wxString 
resType(res
->GetType()); 
1546     if (resType 
== "wxDialog") 
1548       wxNode 
*node1 
= res
->GetChildren().First(); 
1551         wxItemResource 
*child 
= (wxItemResource 
*)node1
->Data(); 
1552         wxString 
childResType(child
->GetType()); 
1554         if ((childResType 
== "wxMessage" || childResType 
== "wxButton") && 
1555              child
->GetValue4() && 
1556             (strcmp(child
->GetValue4(), resourceName
) == 0)) 
1558         node1 
= node1
->Next(); 
1565 // Given a wxButton or wxMessage, find the corresponding bitmap filename. 
1566 wxString 
wxResourceManager::FindBitmapFilenameForResource(wxItemResource 
*resource
) 
1568   if (!resource 
|| (resource
->GetValue4() == "")) 
1569     return wxEmptyString
; 
1570   wxItemResource 
*bitmapResource 
= m_resourceTable
.FindResource(resource
->GetValue4()); 
1571   if (!bitmapResource
) 
1572     return wxEmptyString
; 
1574   wxNode 
*node 
= bitmapResource
->GetChildren().First(); 
1577     // Eventually augment this to return a bitmap of the right kind or something... 
1578     // Maybe the root of the filename remains the same, so it doesn't matter which we 
1579     // pick up. Otherwise how do we specify multiple filenames... too boring... 
1580     wxItemResource 
*child 
= (wxItemResource 
*)node
->Data(); 
1581     return child
->GetName(); 
1583     node 
= node
->Next(); 
1585   return wxEmptyString
; 
1588 wxItemResource 
*wxResourceManager::FindBitmapResourceByFilename(const wxString
& filename
) 
1590   m_resourceTable
.BeginFind(); 
1592   while ((node 
= m_resourceTable
.Next())) 
1594     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1595     wxString 
resType(res
->GetType()); 
1596     if (resType 
== "wxBitmap") 
1598       wxNode 
*node1 
= res
->GetChildren().First(); 
1601         wxItemResource 
*child 
= (wxItemResource 
*)node1
->Data(); 
1602         if (child
->GetName() && (strcmp(child
->GetName(), filename
) == 0)) 
1604         node1 
= node1
->Next(); 
1611 // Is this window identifier symbol in use? 
1612 // Let's assume that we can't have 2 names for the same integer id. 
1613 // Therefore we can tell by the integer id whether the symbol is 
1615 bool wxResourceManager::IsSymbolUsed(wxItemResource
* thisResource
, wxWindowID id
) 
1617   m_resourceTable
.BeginFind(); 
1619   while ((node 
= m_resourceTable
.Next())) 
1621     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1623     wxString 
resType(res
->GetType()); 
1624     if (resType 
== "wxDialog" || resType 
== "wxDialogBox" || resType 
== "wxPanel") 
1626       if ((res 
!= thisResource
) && (res
->GetId() == id
)) 
1629       wxNode 
*node1 
= res
->GetChildren().First(); 
1632         wxItemResource 
*child 
= (wxItemResource 
*)node1
->Data(); 
1633         if ((child 
!= thisResource
) && (child
->GetId() == id
)) 
1635         node1 
= node1
->Next(); 
1642 // Is this window identifier compatible with the given name? (i.e. 
1643 // does it already exist under a different name) 
1644 bool wxResourceManager::IsIdentifierOK(const wxString
& name
, wxWindowID id
) 
1646     if (m_symbolTable
.SymbolExists(name
)) 
1648         int foundId 
= m_symbolTable
.GetIdForSymbol(name
); 
1655 // Change all integer ids that match oldId, to newId. 
1656 // This is necessary if an id is changed for one resource - all resources 
1658 void wxResourceManager::ChangeIds(int oldId
, int newId
) 
1660   m_resourceTable
.BeginFind(); 
1662   while ((node 
= m_resourceTable
.Next())) 
1664     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1666     wxString 
resType(res
->GetType()); 
1667     if (resType 
== "wxDialog" || resType 
== "wxDialogBox" || resType 
== "wxPanel") 
1669       if (res
->GetId() == oldId
) 
1672       wxNode 
*node1 
= res
->GetChildren().First(); 
1675         wxItemResource 
*child 
= (wxItemResource 
*)node1
->Data(); 
1676         if (child
->GetId() == oldId
) 
1677             child
->SetId(newId
); 
1679         node1 
= node1
->Next(); 
1685 // If any resource ids were missing (or their symbol was missing), 
1686 // repair them i.e. give them new ids. Returns TRUE if any resource 
1687 // needed repairing. 
1688 bool wxResourceManager::RepairResourceIds() 
1690   bool repaired 
= FALSE
; 
1692   m_resourceTable
.BeginFind(); 
1694   while ((node 
= m_resourceTable
.Next())) 
1696     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1697     wxString 
resType(res
->GetType()); 
1698     if (resType 
== "wxDialog" || resType 
== "wxDialogBox" || resType 
== "wxPanel") 
1701       if ( (res
->GetId() == 0) || ((res
->GetId() > 0) && !m_symbolTable
.IdExists(res
->GetId())) ) 
1703           wxString newSymbolName
; 
1704           int newId 
= GenerateWindowId("ID_DIALOG", newSymbolName
) ; 
1706           if (res
->GetId() == 0) 
1709               m_symbolTable
.AddSymbol(newSymbolName
, newId
); 
1713               m_symbolTable
.AddSymbol(newSymbolName
, res
->GetId()); 
1719       wxNode 
*node1 
= res
->GetChildren().First(); 
1722         wxItemResource 
*child 
= (wxItemResource 
*)node1
->Data(); 
1724         if ( (child
->GetId() == 0) || ((child
->GetId() > 0) && !m_symbolTable
.IdExists(child
->GetId())) ) 
1726             wxString newSymbolName
; 
1727             int newId 
= GenerateWindowId("ID_CONTROL", newSymbolName
) ; 
1729             if (child
->GetId() == 0) 
1731                 child
->SetId(newId
); 
1732                 m_symbolTable
.AddSymbol(newSymbolName
, newId
); 
1736                 m_symbolTable
.AddSymbol(newSymbolName
, child
->GetId()); 
1742         node1 
= node1
->Next(); 
1750  // Deletes 'win' and creates a new window from the resource that 
1751  // was associated with it. E.g. if you can't change properties on the 
1752  // fly, you'll need to delete the window and create it again. 
1753 wxWindow 
*wxResourceManager::RecreateWindowFromResource(wxWindow 
*win
, wxWindowPropertyInfo 
*info
) 
1755   wxItemResource 
*resource 
= FindResourceForWindow(win
); 
1757   // Put the current window properties into the wxItemResource object 
1759   wxWindowPropertyInfo 
*newInfo 
= NULL
; 
1762     newInfo 
= CreatePropertyInfoForWindow(win
); 
1766   info
->InstantiateResource(resource
); 
1768   wxWindow 
*newWin 
= NULL
; 
1769   wxWindow 
*parent 
= win
->GetParent(); 
1770   wxItemResource
* parentResource 
= NULL
; 
1772     parentResource 
= FindResourceForWindow(parent
); 
1774   if (win
->IsKindOf(CLASSINFO(wxPanel
))) 
1777     newWin 
= FindWindowForResource(resource
); 
1781     DisassociateResource(resource
); 
1782     if (win
->GetEventHandler() != win
) 
1783         win
->PopEventHandler(TRUE
); 
1786     newWin 
= m_resourceTable
.CreateItem((wxPanel 
*)parent
, resource
, parentResource
); 
1787     newWin
->PushEventHandler(new wxResourceEditorControlHandler((wxControl
*) newWin
, (wxControl
*) newWin
)); 
1788     AssociateResource(resource
, newWin
); 
1789     UpdateResourceList(); 
1793     info
->SetPropertyWindow(newWin
); 
1801 // Delete resource highlighted in the listbox 
1802 bool wxResourceManager::DeleteSelection() 
1804   int sel 
= m_editorResourceTree
->GetSelection(); 
1807     wxResourceTreeData 
*data 
= (wxResourceTreeData 
*)m_editorResourceTree
->GetItemData(sel
); 
1808     wxItemResource 
*res 
= data
->GetResource(); 
1809     wxWindow 
*win 
= FindWindowForResource(res
); 
1812         DeleteResource(win
); 
1814         UpdateResourceList(); 
1823 // Delete resource highlighted in the listbox 
1824 bool wxResourceManager::RecreateSelection() 
1826   wxNode 
*node 
= GetSelections().First(); 
1829     wxControl 
*item 
= (wxControl 
*)node
->Data(); 
1830     wxResourceEditorControlHandler 
*childHandler 
= (wxResourceEditorControlHandler 
*)item
->GetEventHandler(); 
1831     wxNode 
*next 
= node
->Next(); 
1832     childHandler
->SelectItem(FALSE
); 
1834     RemoveSelection(item
); 
1836     RecreateWindowFromResource(item
); 
1843 bool wxResourceManager::EditDialog(wxDialog 
*WXUNUSED(dialog
), wxWindow 
*WXUNUSED(parent
)) 
1848 // Ensures that all currently shown windows are saved to resources, 
1849 // e.g. just before writing to a .wxr file. 
1850 bool wxResourceManager::InstantiateAllResourcesFromWindows() 
1852   m_resourceTable
.BeginFind(); 
1854   while ((node 
= m_resourceTable
.Next())) 
1856     wxItemResource 
*res 
= (wxItemResource 
*)node
->Data(); 
1857     wxString 
resType(res
->GetType()); 
1859     if (resType 
== "wxDialog") 
1861       wxWindow 
*win 
= (wxWindow 
*)FindWindowForResource(res
); 
1863         InstantiateResourceFromWindow(res
, win
, TRUE
); 
1865     else if (resType 
== "wxPanel") 
1867       wxWindow 
*win 
= (wxWindow 
*)FindWindowForResource(res
); 
1869         InstantiateResourceFromWindow(res
, win
, TRUE
); 
1875 bool wxResourceManager::InstantiateResourceFromWindow(wxItemResource 
*resource
, wxWindow 
*window
, bool recurse
) 
1877   wxWindowPropertyInfo 
*info 
= CreatePropertyInfoForWindow(window
); 
1878   info
->SetResource(resource
); 
1879   info
->InstantiateResource(resource
); 
1884     wxNode 
*node 
= resource
->GetChildren().First(); 
1887       wxItemResource 
*child 
= (wxItemResource 
*)node
->Data(); 
1888       wxWindow 
*childWindow 
= FindWindowForResource(child
); 
1893         sprintf(buf
, "Could not find window %s", (const char*) child
->GetName()); 
1894         wxMessageBox(buf
, "Dialog Editor problem", wxOK
); 
1897         InstantiateResourceFromWindow(child
, childWindow
, recurse
); 
1898       node 
= node
->Next(); 
1905 // Create a window information object for the give window 
1906 wxWindowPropertyInfo 
*wxResourceManager::CreatePropertyInfoForWindow(wxWindow 
*win
) 
1908   wxWindowPropertyInfo 
*info 
= NULL
; 
1909   if (win
->IsKindOf(CLASSINFO(wxScrollBar
))) 
1911           info 
= new wxScrollBarPropertyInfo(win
); 
1913   else if (win
->IsKindOf(CLASSINFO(wxStaticBox
))) 
1915           info 
= new wxGroupBoxPropertyInfo(win
); 
1917   else if (win
->IsKindOf(CLASSINFO(wxCheckBox
))) 
1919           info 
= new wxCheckBoxPropertyInfo(win
); 
1921   else if (win
->IsKindOf(CLASSINFO(wxSlider
))) 
1923           info 
= new wxSliderPropertyInfo(win
); 
1925   else if (win
->IsKindOf(CLASSINFO(wxGauge
))) 
1927           info 
= new wxGaugePropertyInfo(win
); 
1929   else if (win
->IsKindOf(CLASSINFO(wxListBox
))) 
1931           info 
= new wxListBoxPropertyInfo(win
); 
1933   else if (win
->IsKindOf(CLASSINFO(wxRadioBox
))) 
1935           info 
= new wxRadioBoxPropertyInfo(win
); 
1937   else if (win
->IsKindOf(CLASSINFO(wxRadioButton
))) 
1939           info 
= new wxRadioButtonPropertyInfo(win
); 
1941   else if (win
->IsKindOf(CLASSINFO(wxChoice
))) 
1943           info 
= new wxChoicePropertyInfo(win
); 
1945   else if (win
->IsKindOf(CLASSINFO(wxComboBox
))) 
1947           info 
= new wxComboBoxPropertyInfo(win
); 
1949   else if (win
->IsKindOf(CLASSINFO(wxButton
))) 
1951           info 
= new wxButtonPropertyInfo(win
); 
1953   else if (win
->IsKindOf(CLASSINFO(wxBitmapButton
))) 
1955           info 
= new wxBitmapButtonPropertyInfo(win
); 
1957   else if (win
->IsKindOf(CLASSINFO(wxStaticText
))) 
1959           info 
= new wxStaticTextPropertyInfo(win
); 
1961   else if (win
->IsKindOf(CLASSINFO(wxStaticBitmap
))) 
1963           info 
= new wxStaticBitmapPropertyInfo(win
); 
1965   else if (win
->IsKindOf(CLASSINFO(wxTextCtrl
))) 
1967           info 
= new wxTextPropertyInfo(win
); 
1969   else if (win
->IsKindOf(CLASSINFO(wxPanel
))) 
1971           info 
= new wxPanelPropertyInfo(win
); 
1975           info 
= new wxWindowPropertyInfo(win
); 
1980 // Edit the given window 
1981 void wxResourceManager::EditWindow(wxWindow 
*win
) 
1983   wxWindowPropertyInfo 
*info 
= CreatePropertyInfoForWindow(win
); 
1986     info
->SetResource(FindResourceForWindow(win
)); 
1987     wxString 
str("Editing "); 
1988     str 
+= win
->GetClassInfo()->GetClassName(); 
1990     if (win
->GetName() != "") 
1991         str 
+= win
->GetName(); 
1993         str 
+= "properties"; 
1994     info
->Edit(NULL
, str
); 
1998 // Generate a window id and a first stab at a name 
1999 int wxResourceManager::GenerateWindowId(const wxString
& prefix
, wxString
& idName
) 
2001     m_symbolIdCounter 
++; 
2002     while (m_symbolTable
.IdExists(m_symbolIdCounter
)) 
2003         m_symbolIdCounter 
++; 
2005     int nameId 
= m_symbolIdCounter
; 
2008     str
.Printf("%d", nameId
); 
2009     idName 
= prefix 
+ str
; 
2011     while (m_symbolTable
.SymbolExists(idName
)) 
2014         str
.Printf("%d", nameId
); 
2015         idName 
= prefix 
+ str
; 
2018     return m_symbolIdCounter
; 
2023  * Resource editor frame 
2026 IMPLEMENT_CLASS(wxResourceEditorFrame
, wxFrame
) 
2028 BEGIN_EVENT_TABLE(wxResourceEditorFrame
, wxFrame
) 
2029     EVT_MENU(wxID_NEW
, wxResourceEditorFrame::OnNew
) 
2030     EVT_MENU(RESED_NEW_DIALOG
, wxResourceEditorFrame::OnNewDialog
) 
2031     EVT_MENU(wxID_OPEN
, wxResourceEditorFrame::OnOpen
) 
2032     EVT_MENU(RESED_CLEAR
, wxResourceEditorFrame::OnClear
) 
2033     EVT_MENU(wxID_SAVE
, wxResourceEditorFrame::OnSave
) 
2034     EVT_MENU(wxID_SAVEAS
, wxResourceEditorFrame::OnSaveAs
) 
2035     EVT_MENU(wxID_EXIT
, wxResourceEditorFrame::OnExit
) 
2036     EVT_MENU(wxID_ABOUT
, wxResourceEditorFrame::OnAbout
) 
2037     EVT_MENU(RESED_CONTENTS
, wxResourceEditorFrame::OnContents
) 
2038     EVT_MENU(RESED_DELETE
, wxResourceEditorFrame::OnDeleteSelection
) 
2039     EVT_MENU(RESED_RECREATE
, wxResourceEditorFrame::OnRecreateSelection
) 
2040     EVT_MENU(RESED_TEST
, wxResourceEditorFrame::OnTest
) 
2043 wxResourceEditorFrame::wxResourceEditorFrame(wxResourceManager 
*resMan
, wxFrame 
*parent
, const wxString
& title
, 
2044     const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
): 
2045   wxFrame(parent
, -1, title
, pos
, size
, style
, name
) 
2050 wxResourceEditorFrame::~wxResourceEditorFrame() 
2054 void wxResourceEditorFrame::OnNew(wxCommandEvent
& WXUNUSED(event
)) 
2056       manager
->New(FALSE
); 
2059 void wxResourceEditorFrame::OnNewDialog(wxCommandEvent
& WXUNUSED(event
)) 
2061       manager
->CreateNewPanel(); 
2064 void wxResourceEditorFrame::OnOpen(wxCommandEvent
& WXUNUSED(event
)) 
2069 void wxResourceEditorFrame::OnClear(wxCommandEvent
& WXUNUSED(event
)) 
2071       manager
->Clear(TRUE
, FALSE
); 
2074 void wxResourceEditorFrame::OnSave(wxCommandEvent
& WXUNUSED(event
)) 
2079 void wxResourceEditorFrame::OnSaveAs(wxCommandEvent
& WXUNUSED(event
)) 
2084 void wxResourceEditorFrame::OnExit(wxCommandEvent
& WXUNUSED(event
)) 
2086           manager
->Clear(TRUE
, FALSE
) ; 
2090 void wxResourceEditorFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
)) 
2093       sprintf(buf
, "wxWindows Dialog Editor %.1f\nAuthor: Julian Smart J.Smart@ed.ac.uk\nJulian Smart (c) 1996", wxDIALOG_EDITOR_VERSION
); 
2094       wxMessageBox(buf
, "About Dialog Editor", wxOK
|wxCENTRE
); 
2097 void wxResourceEditorFrame::OnTest(wxCommandEvent
& WXUNUSED(event
)) 
2099     manager
->TestCurrentDialog(this); 
2102 void wxResourceEditorFrame::OnContents(wxCommandEvent
& WXUNUSED(event
)) 
2105       wxBeginBusyCursor(); 
2106       manager
->GetHelpController()->LoadFile(); 
2107       manager
->GetHelpController()->DisplayContents(); 
2112 void wxResourceEditorFrame::OnDeleteSelection(wxCommandEvent
& WXUNUSED(event
)) 
2114       manager
->DeleteSelection(); 
2117 void wxResourceEditorFrame::OnRecreateSelection(wxCommandEvent
& WXUNUSED(event
)) 
2119       manager
->RecreateSelection(); 
2122 bool wxResourceEditorFrame::OnClose() 
2124   if (manager
->Modified()) 
2126   if (!manager
->Clear(TRUE
, FALSE
)) 
2134     manager
->m_resourceEditorWindowSize
.width 
= w
; 
2135     manager
->m_resourceEditorWindowSize
.height 
= h
; 
2138     GetPosition(&x
, &y
); 
2140     manager
->m_resourceEditorWindowSize
.x 
= x
; 
2141     manager
->m_resourceEditorWindowSize
.y 
= y
; 
2143   manager
->SetEditorFrame(NULL
); 
2144   manager
->SetEditorToolBar(NULL
); 
2150  * Resource editor window that contains the dialog/panel being edited 
2153 BEGIN_EVENT_TABLE(wxResourceEditorScrolledWindow
, wxScrolledWindow
) 
2154     EVT_SCROLL(wxResourceEditorScrolledWindow::OnScroll
) 
2155     EVT_PAINT(wxResourceEditorScrolledWindow::OnPaint
) 
2158 wxResourceEditorScrolledWindow::wxResourceEditorScrolledWindow(wxWindow 
*parent
, const wxPoint
& pos
, const wxSize
& size
, 
2160   wxScrolledWindow(parent
, -1, pos
, size
, style
) 
2164     m_childWindow 
= NULL
; 
2167 wxResourceEditorScrolledWindow::~wxResourceEditorScrolledWindow() 
2171 void wxResourceEditorScrolledWindow::OnScroll(wxScrollEvent
& event
) 
2173     wxScrolledWindow::OnScroll(event
); 
2176     ViewStart(& x
, & y
); 
2179         m_childWindow
->Move(m_marginX 
+ (- x 
* 10), m_marginY 
+ (- y 
* 10)); 
2182 void wxResourceEditorScrolledWindow::OnPaint(wxPaintEvent
& WXUNUSED(event
)) 
2189 void wxResourceEditorScrolledWindow::DrawTitle(wxDC
& dc
) 
2193         wxItemResource
* res 
= wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(m_childWindow
); 
2196             wxString 
str(res
->GetTitle()); 
2198             ViewStart(& x
, & y
); 
2200             wxFont 
font(10, wxSWISS
, wxNORMAL
, wxBOLD
); 
2202             dc
.SetBackgroundMode(wxTRANSPARENT
); 
2203             dc
.SetTextForeground(wxColour(0, 0, 0)); 
2206             dc
.GetTextExtent(str
, & w
, & h
); 
2208             dc
.DrawText(str
, m_marginX 
+ (- x 
* 10), m_marginY 
+ (- y 
* 10) - h 
- 5); 
2213 // Popup menu callback 
2214 void ObjectMenuProc(wxMenu
& menu
, wxCommandEvent
& event
) 
2216   wxWindow 
*data 
= (wxWindow 
*)menu
.GetClientData(); 
2220   switch (event
.GetInt()) 
2222     case OBJECT_MENU_EDIT
: 
2224       wxResourceManager::GetCurrentResourceManager()->EditWindow(data
); 
2227     case OBJECT_MENU_DELETE
: 
2229       wxResourceManager::GetCurrentResourceManager()->SaveInfoAndDeleteHandler(data
); 
2230       wxResourceManager::GetCurrentResourceManager()->DeleteResource(data
); 
2231       wxResourceManager::GetCurrentResourceManager()->DeleteWindow(data
); 
2244 #ifdef __WXGTK__   // I don't dare to delete it... 
2246 BEGIN_EVENT_TABLE(EditorToolBar
, wxToolBar
) 
2251 BEGIN_EVENT_TABLE(EditorToolBar
, wxToolBar
) 
2252         EVT_PAINT(EditorToolBar::OnPaint
) 
2257 EditorToolBar::EditorToolBar(wxFrame 
*frame
, const wxPoint
& pos
, const wxSize
& size
, 
2259   wxToolBar(frame
, -1, pos
, size
, style
) 
2263 bool EditorToolBar::OnLeftClick(int toolIndex
, bool WXUNUSED(toggled
)) 
2265   wxResourceManager 
*manager 
= wxResourceManager::GetCurrentResourceManager(); 
2269     case TOOLBAR_LOAD_FILE
: 
2276       manager
->CreateNewPanel(); 
2279     case TOOLBAR_SAVE_FILE
: 
2287       wxBeginBusyCursor(); 
2288       manager
->GetHelpController()->LoadFile(); 
2289       manager
->GetHelpController()->DisplayContents(); 
2294     case TOOLBAR_FORMAT_HORIZ
: 
2296       manager
->AlignItems(TOOLBAR_FORMAT_HORIZ
); 
2299     case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN
: 
2301       manager
->AlignItems(TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN
); 
2304     case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN
: 
2306       manager
->AlignItems(TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN
); 
2309     case TOOLBAR_FORMAT_VERT
: 
2311       manager
->AlignItems(TOOLBAR_FORMAT_VERT
); 
2314     case TOOLBAR_FORMAT_VERT_TOP_ALIGN
: 
2316       manager
->AlignItems(TOOLBAR_FORMAT_VERT_TOP_ALIGN
); 
2319     case TOOLBAR_FORMAT_VERT_BOT_ALIGN
: 
2321       manager
->AlignItems(TOOLBAR_FORMAT_VERT_BOT_ALIGN
); 
2324     case TOOLBAR_COPY_SIZE
: 
2326       manager
->CopySize(); 
2329     case TOOLBAR_TO_BACK
: 
2331       manager
->ToBackOrFront(TRUE
); 
2334     case TOOLBAR_TO_FRONT
: 
2336       manager
->ToBackOrFront(FALSE
); 
2345 void EditorToolBar::OnMouseEnter(int toolIndex
) 
2347   wxFrame 
*frame 
= (wxFrame 
*)GetParent(); 
2355         case TOOLBAR_LOAD_FILE
: 
2356           frame
->SetStatusText("Load project file"); 
2358         case TOOLBAR_SAVE_FILE
: 
2359           frame
->SetStatusText("Save project file"); 
2362           frame
->SetStatusText("Create a new resource"); 
2364         case TOOLBAR_FORMAT_HORIZ
: 
2365           frame
->SetStatusText("Align items horizontally"); 
2367         case TOOLBAR_FORMAT_VERT
: 
2368           frame
->SetStatusText("Align items vertically"); 
2370         case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN
: 
2371           frame
->SetStatusText("Left-align items"); 
2373         case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN
: 
2374           frame
->SetStatusText("Right-align items"); 
2376         case TOOLBAR_FORMAT_VERT_TOP_ALIGN
: 
2377           frame
->SetStatusText("Top-align items"); 
2379         case TOOLBAR_FORMAT_VERT_BOT_ALIGN
: 
2380           frame
->SetStatusText("Bottom-align items"); 
2382         case TOOLBAR_COPY_SIZE
: 
2383           frame
->SetStatusText("Copy size from first selection"); 
2385         case TOOLBAR_TO_FRONT
: 
2386           frame
->SetStatusText("Put image to front"); 
2388         case TOOLBAR_TO_BACK
: 
2389           frame
->SetStatusText("Put image to back"); 
2392           frame
->SetStatusText("Display help contents"); 
2398   else frame
->SetStatusText("");