]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/dialoged/src/reseditr.cpp
Fixed drawing of the lines data, also ensure that only tuples are
[wxWidgets.git] / utils / dialoged / src / reseditr.cpp
index 1aa9fea3eaa8586221813a7aa71e7a197f000404..0b9968031ced66a60ba14a13b47df821124c0358 100644 (file)
 #include "wx/gauge.h"
 #include "wx/slider.h"
 #include "wx/textctrl.h"
+#include "wx/menu.h"
+#include "wx/toolbar.h"
 #endif
 
 #include "wx/scrolbar.h"
+#include "wx/config.h"
+#include "wx/dir.h"
+#include "wx/progdlg.h"
 
 #include <ctype.h>
 #include <stdlib.h>
 #include <math.h>
 #include <string.h>
 
-#if defined(__WINDOWS__) && !defined(__GNUWIN32__)
-#include <strstrea.h>
-#else
-#include <strstream.h>
-#endif
-
-#ifdef __WINDOWS__
-#include <windows.h>
-#endif
-
+#ifdef __WXMSW__
 #include "wx/help.h"
+#endif
 
 #include "reseditr.h"
 #include "winprop.h"
-#include "editrpal.h"
 #include "dlghndlr.h"
-
-static void ObjectMenuProc(wxMenu& menu, wxCommandEvent& event);
-void wxResourceEditWindow(wxWindow *win);
-wxWindowPropertyInfo *wxCreatePropertyInfoForWindow(wxWindow *win);
-wxResourceManager *wxResourceManager::currentResourceManager = NULL;
-
-// Bitmaps for toolbar
-wxBitmap *ToolbarLoadBitmap = NULL;
-wxBitmap *ToolbarSaveBitmap = NULL;
-wxBitmap *ToolbarNewBitmap = NULL;
-wxBitmap *ToolbarVertBitmap = NULL;
-wxBitmap *ToolbarAlignTBitmap = NULL;
-wxBitmap *ToolbarAlignBBitmap = NULL;
-wxBitmap *ToolbarHorizBitmap = NULL;
-wxBitmap *ToolbarAlignLBitmap = NULL;
-wxBitmap *ToolbarAlignRBitmap = NULL;
-wxBitmap *ToolbarCopySizeBitmap = NULL;
-wxBitmap *ToolbarToFrontBitmap = NULL;
-wxBitmap *ToolbarToBackBitmap = NULL;
-wxBitmap *ToolbarHelpBitmap = NULL;
-
-wxBitmap *wxWinBitmap = NULL;
-
-#ifdef __X__
-#include "bitmaps/load.xbm"
-#include "bitmaps/save.xbm"
-#include "bitmaps/new.xbm"
-#include "bitmaps/vert.xbm"
-#include "bitmaps/alignt.xbm"
-#include "bitmaps/alignb.xbm"
-#include "bitmaps/horiz.xbm"
-#include "bitmaps/alignl.xbm"
-#include "bitmaps/alignr.xbm"
-#include "bitmaps/copysize.xbm"
-#include "bitmaps/tofront.xbm"
-#include "bitmaps/toback.xbm"
-#include "bitmaps/help.xbm"
-#include "bitmaps/wxwin.xbm"
+#include "edtree.h"
+#include "edlist.h"
+
+wxResourceManager *wxResourceManager::sm_currentResourceManager = NULL;
+
+#if !defined(__WXMSW__)
+#include "bitmaps/load.xpm"
+#include "bitmaps/save.xpm"
+#include "bitmaps/new.xpm"
+#include "bitmaps/vert.xpm"
+#include "bitmaps/alignt.xpm"
+#include "bitmaps/alignb.xpm"
+#include "bitmaps/horiz.xpm"
+#include "bitmaps/alignl.xpm"
+#include "bitmaps/alignr.xpm"
+#include "bitmaps/copysize.xpm"
+#include "bitmaps/tofront.xpm"
+#include "bitmaps/toback.xpm"
+#include "bitmaps/help.xpm"
+#include "bitmaps/wxwin.xpm"
+#include "bitmaps/distvert.xpm"
+#include "bitmaps/disthor.xpm"
+#include "bitmaps/copywdth.xpm"
+#include "bitmaps/copyhght.xpm"
+
+#include "bitmaps/dialog.xpm"
+#include "bitmaps/folder1.xpm"
+#include "bitmaps/folder2.xpm"
+#include "bitmaps/buttonsm.xpm"
 #endif
 
 /*
- * Resource manager
- */
-
-
-wxResourceManager::wxResourceManager(void)
-{
-  currentResourceManager = this;
-  editorFrame = NULL;
-  editorPanel = NULL;
-  popupMenu = NULL;
-  editorResourceList = NULL;
-  editorPalette = NULL;
-  nameCounter = 1;
-  modified = FALSE;
-  currentFilename = "";
-  editMode = TRUE;
-  editorToolBar = NULL;
-  
-  // Default window positions
-  resourceEditorWindowSize.width = 470;
-  resourceEditorWindowSize.height = 300;
-
-  resourceEditorWindowSize.x = 0;
-  resourceEditorWindowSize.y = 0;
-  
-  propertyWindowSize.width = 300;
-  propertyWindowSize.height = 300;
+* Resource manager
+*/
 
-  helpInstance = NULL;
+wxResourceManager::wxResourceManager():
+m_imageList(16, 16, TRUE)
+{
+    sm_currentResourceManager = this;
+    m_editorFrame = NULL;
+    m_editorPanel = NULL;
+    m_popupMenu = NULL;
+    m_editorResourceTree = NULL;
+    m_editorControlList = NULL;
+    m_nameCounter = 1;
+    m_symbolIdCounter = 99;
+    m_modified = FALSE;
+    m_currentFilename = "";
+    m_symbolFilename = "";
+    m_editorToolBar = NULL;
+    
+    // Default window positions
+    m_resourceEditorWindowSize.width = 500;
+    m_resourceEditorWindowSize.height = 450;
+    
+    m_resourceEditorWindowSize.x = 0;
+    m_resourceEditorWindowSize.y = 0;
+    
+    m_propertyWindowSize.width = 300;
+    m_propertyWindowSize.height = 300;
+    
+#ifdef __WXMSW__
+    m_helpController = NULL;
+#endif
+    
+    m_bitmapImage = NULL;
+    m_rootDialogItem = 0;
 }
 
-wxResourceManager::~wxResourceManager(void)
+wxResourceManager::~wxResourceManager()
 {
-  currentResourceManager = NULL;
-  SaveOptions();
-
-  helpInstance->Quit();
-  delete helpInstance;
-  helpInstance = NULL;
+    sm_currentResourceManager = NULL;
+    SaveOptions();
+    
+#ifdef __WXMSW__
+    if (m_helpController)
+    {
+        m_helpController->Quit();
+        delete m_helpController;
+        m_helpController = NULL;
+    }
+#endif  
+    
+    delete m_bitmapImage;
+    delete m_popupMenu;
 }
 
-bool wxResourceManager::Initialize(void)
+bool wxResourceManager::Initialize()
 {
-  // Set up the resource filename for each platform.
-#ifdef __WINDOWS__
-  // dialoged.ini in the Windows directory
-  char buf[256];
-  GetWindowsDirectory(buf, 256);
-  strcat(buf, "\\dialoged.ini");
-  optionsResourceFilename = buf;
-#elif defined(__X__)
-  char buf[500];
-  (void)wxGetHomeDir(buf);
-  strcat(buf, "/.hardyrc");
-  optionsResourceFilename = buf;
+    // Set up the resource filename for each platform.
+    // TODO: This shold be replaced by wxConfig usage.
+#ifdef __WXMSW__
+    // dialoged.ini in the Windows directory
+    wxString windowsDir = wxGetOSDirectory();
+    windowsDir += "\\dialoged.ini" ;
+    
+    m_optionsResourceFilename = windowsDir;
 #else
-#error "Unsupported platform."
+    wxGetHomeDir( &m_optionsResourceFilename );
+    m_optionsResourceFilename += "/.dialogedrc";
 #endif
-
-  LoadOptions();
-
-  helpInstance = new wxHelpController;
-  helpInstance->Initialize("dialoged");
-
-  InitializeTools();
-  popupMenu = new wxMenu("", (wxFunction)ObjectMenuProc);
-  popupMenu->Append(OBJECT_MENU_EDIT, "Edit properties");
-  popupMenu->Append(OBJECT_MENU_DELETE, "Delete object");
-  
-  if (!wxWinBitmap)
-  {
-#ifdef __WINDOWS__
-    wxWinBitmap = new wxBitmap("WXWINBMP", wxBITMAP_TYPE_BMP_RESOURCE);
+    
+    LoadOptions();
+    
+#ifdef __WXMSW__
+    m_helpController = new wxHelpController;
+    m_helpController->Initialize("dialoged");
+#endif
+    
+    m_popupMenu = new wxMenu;
+    m_popupMenu->Append(OBJECT_MENU_TITLE, "WIDGET TYPE");
+    m_popupMenu->AppendSeparator();
+    m_popupMenu->Append(OBJECT_MENU_EDIT, "Edit properties");
+    m_popupMenu->Append(OBJECT_MENU_DELETE, "Delete object");
+    
+    if (!m_bitmapImage)
+    {
+#ifdef __WXMSW__
+        m_bitmapImage = new wxBitmap("WXWINBMP", wxBITMAP_TYPE_BMP_RESOURCE);
+#else
+        m_bitmapImage = new wxBitmap( wxwin_xpm );
 #endif
-#ifdef __X__
-    wxWinBitmap = new wxBitmap(wxwin_bits, wxwin_width, wxwin_height);
+    }
+    
+    // Initialize the image list icons
+#ifdef __WXMSW__
+    wxIcon icon1("DIALOG_ICON", wxBITMAP_TYPE_ICO_RESOURCE, 16, 16);
+    wxIcon icon2("FOLDER1_ICON", wxBITMAP_TYPE_ICO_RESOURCE, 16, 16);
+    wxIcon icon3("FOLDER2_ICON", wxBITMAP_TYPE_ICO_RESOURCE, 16, 16);
+    wxIcon icon4("BUTTONSM_ICON", wxBITMAP_TYPE_ICO_RESOURCE, 16, 16);
+#else
+    wxIcon icon1( dialog_xpm );    
+    wxIcon icon2( folder1_xpm );    
+    wxIcon icon3( folder2_xpm );    
+    wxIcon icon4( buttonsm_xpm );    
 #endif
-  }
-  return TRUE;
+    m_imageList.Add(icon1);
+    m_imageList.Add(icon2);
+    m_imageList.Add(icon3);
+    m_imageList.Add(icon4);
+    
+    m_symbolTable.AddStandardSymbols();
+    
+    return TRUE;
 }
 
-bool wxResourceManager::LoadOptions(void)
+bool wxResourceManager::LoadOptions()
 {
-  wxGetResource("DialogEd", "editorWindowX", &resourceEditorWindowSize.x, optionsResourceFilename.GetData());
-  wxGetResource("DialogEd", "editorWindowY", &resourceEditorWindowSize.y, optionsResourceFilename.GetData());
-  wxGetResource("DialogEd", "editorWindowWidth", &resourceEditorWindowSize.width, optionsResourceFilename.GetData());
-  wxGetResource("DialogEd", "editorWindowHeight", &resourceEditorWindowSize.height, optionsResourceFilename.GetData());
-  wxGetResource("DialogEd", "propertyWindowX", &propertyWindowSize.x, optionsResourceFilename.GetData());
-  wxGetResource("DialogEd", "propertyWindowY", &propertyWindowSize.y, optionsResourceFilename.GetData());
-  wxGetResource("DialogEd", "propertyWindowWidth", &propertyWindowSize.width, optionsResourceFilename.GetData());
-  wxGetResource("DialogEd", "propertyWindowHeight", &propertyWindowSize.height, optionsResourceFilename.GetData());
-  return TRUE;
+    wxConfig config("DialogEd", "wxWindows");
+    
+    config.Read("editorWindowX", &m_resourceEditorWindowSize.x);
+    config.Read("editorWindowY", &m_resourceEditorWindowSize.y);
+    config.Read("editorWindowWidth", &m_resourceEditorWindowSize.width);
+    config.Read("editorWindowHeight", &m_resourceEditorWindowSize.height);
+    config.Read("propertyWindowX", &m_propertyWindowSize.x);
+    config.Read("propertyWindowY", &m_propertyWindowSize.y);
+    config.Read("propertyWindowWidth", &m_propertyWindowSize.width);
+    config.Read("propertyWindowHeight", &m_propertyWindowSize.height);
+
+    return TRUE;
 }
 
-bool wxResourceManager::SaveOptions(void)
+bool wxResourceManager::SaveOptions()
 {
-  wxWriteResource("DialogEd", "editorWindowX", resourceEditorWindowSize.x, optionsResourceFilename.GetData());
-  wxWriteResource("DialogEd", "editorWindowY", resourceEditorWindowSize.y, optionsResourceFilename.GetData());
-  wxWriteResource("DialogEd", "editorWindowWidth", resourceEditorWindowSize.width, optionsResourceFilename.GetData());
-  wxWriteResource("DialogEd", "editorWindowHeight", resourceEditorWindowSize.height, optionsResourceFilename.GetData());
-
-  wxWriteResource("DialogEd", "propertyWindowX", propertyWindowSize.x, optionsResourceFilename.GetData());
-  wxWriteResource("DialogEd", "propertyWindowY", propertyWindowSize.y, optionsResourceFilename.GetData());
-  wxWriteResource("DialogEd", "propertyWindowWidth", propertyWindowSize.width, optionsResourceFilename.GetData());
-  wxWriteResource("DialogEd", "propertyWindowHeight", propertyWindowSize.height, optionsResourceFilename.GetData());
-  
-  return TRUE;
+    wxConfig config("DialogEd", "wxWindows");
+    
+    config.Write("editorWindowX", (long) m_resourceEditorWindowSize.x);
+    config.Write("editorWindowY", (long) m_resourceEditorWindowSize.y);
+    config.Write("editorWindowWidth", (long) m_resourceEditorWindowSize.width);
+    config.Write("editorWindowHeight", (long) m_resourceEditorWindowSize.height);
+    config.Write("propertyWindowX", (long) m_propertyWindowSize.x);
+    config.Write("propertyWindowY", (long) m_propertyWindowSize.y);
+    config.Write("propertyWindowWidth", (long) m_propertyWindowSize.width);
+    config.Write("propertyWindowHeight", (long) m_propertyWindowSize.height);
+    
+    return TRUE;
 }
 
 // Show or hide the resource editor frame, which displays a list
 // of resources with ability to edit them.
-bool wxResourceManager::ShowResourceEditor(bool show, wxWindow *parent, const char *title)
-{
-  if (show)
-  {
-    if (editorFrame)
-    {
-      editorFrame->Iconize(FALSE);
-      editorFrame->Show(TRUE);
-      return TRUE;
-    }
-    editorFrame = OnCreateEditorFrame(title);
-    SetFrameTitle("");
-    wxMenuBar *menuBar = OnCreateEditorMenuBar(editorFrame);
-    editorFrame->SetMenuBar(menuBar);
-    editorPanel = OnCreateEditorPanel(editorFrame);
-    editorToolBar = (EditorToolBar *)OnCreateToolBar(editorFrame);
-    editorPalette = OnCreatePalette(editorFrame);
-
-    // Constraints for toolbar
-    wxLayoutConstraints *c = new wxLayoutConstraints;
-    c->left.SameAs       (editorFrame, wxLeft, 0);
-    c->top.SameAs        (editorFrame, wxTop, 0);
-    c->right.SameAs      (editorFrame, wxRight, 0);
-    c->bottom.Unconstrained();    
-    c->width.Unconstrained();
-    c->height.Absolute(28);
-    editorToolBar->SetConstraints(c);
-
-    // Constraints for palette
-    c = new wxLayoutConstraints;
-    c->left.SameAs       (editorFrame, wxLeft, 0);
-    c->top.SameAs        (editorToolBar, wxBottom, 0);
-    c->right.SameAs      (editorFrame, wxRight, 0);
-    c->bottom.Unconstrained();    
-    c->width.Unconstrained();
-    c->height.Absolute(34);
-    editorPalette->SetConstraints(c);
-
-    // Constraints for panel
-    c = new wxLayoutConstraints;
-    c->left.SameAs       (editorFrame, wxLeft, 0);
-    c->top.SameAs        (editorPalette, wxBottom, 0);
-    c->right.SameAs      (editorFrame, wxRight, 0);
-    c->bottom.SameAs     (editorFrame, wxBottom, 0);    
-    c->width.Unconstrained();
-    c->height.Unconstrained();
-    editorPanel->SetConstraints(c);
-
-    editorFrame->SetAutoLayout(TRUE);
-
-    UpdateResourceList();
-    editorFrame->Show(TRUE);
-    return TRUE;
-  }
-  else
-  {
-    wxFrame *fr = editorFrame;
-    if (editorFrame->OnClose())
+bool wxResourceManager::ShowResourceEditor(bool show, wxWindow *WXUNUSED(parent), const char *title)
+{
+    if (show)
+    {
+        if (m_editorFrame)
+        {
+            m_editorFrame->Iconize(FALSE);
+            m_editorFrame->Show(TRUE);
+            return TRUE;
+        }
+        m_editorFrame = OnCreateEditorFrame(title);
+        SetFrameTitle("");
+        wxMenuBar *menuBar = OnCreateEditorMenuBar(m_editorFrame);
+        m_editorFrame->SetMenuBar(menuBar);
+        
+        m_editorToolBar = (EditorToolBar *)OnCreateToolBar(m_editorFrame);
+        m_editorControlList = new wxResourceEditorControlList(m_editorFrame, IDC_LISTCTRL, wxPoint(0, 0), wxSize(-1, -1));
+        m_editorResourceTree = new wxResourceEditorProjectTree(m_editorFrame, IDC_TREECTRL, wxPoint(0, 0), wxSize(-1, -1),
+            wxTR_HAS_BUTTONS);
+        m_editorPanel = OnCreateEditorPanel(m_editorFrame);
+        
+        m_editorResourceTree->SetImageList(& m_imageList);
+        
+        // Constraints for toolbar
+        wxLayoutConstraints *c = new wxLayoutConstraints;
+        c->left.SameAs       (m_editorFrame, wxLeft, 0);
+        c->top.SameAs        (m_editorFrame, wxTop, 0);
+        c->right.SameAs      (m_editorFrame, wxRight, 0);
+        c->bottom.Unconstrained();
+        c->width.Unconstrained();
+        c->height.Absolute(28);
+        m_editorToolBar->SetConstraints(c);
+        
+        // Constraints for listbox
+        c = new wxLayoutConstraints;
+        c->left.SameAs       (m_editorFrame, wxLeft, 0);
+        c->top.SameAs        (m_editorToolBar, wxBottom, 0);
+        c->right.Absolute    (150);
+        c->bottom.SameAs     (m_editorControlList, wxTop, 0);
+        c->width.Unconstrained();
+        c->height.Unconstrained();
+        m_editorResourceTree->SetConstraints(c);
+        
+        // Constraints for panel
+        c = new wxLayoutConstraints;
+        c->left.SameAs       (m_editorResourceTree, wxRight, 0);
+        c->top.SameAs        (m_editorToolBar, wxBottom, 0);
+        c->right.SameAs      (m_editorFrame, wxRight, 0);
+        c->bottom.SameAs     (m_editorControlList, wxTop, 0);
+        c->width.Unconstrained();
+        c->height.Unconstrained();
+        m_editorPanel->SetConstraints(c);
+        
+        // Constraints for control list (bottom window)
+        c = new wxLayoutConstraints;
+        c->left.SameAs       (m_editorFrame, wxLeft, 0);
+        c->right.SameAs      (m_editorFrame, wxRight, 0);
+        c->bottom.SameAs     (m_editorFrame, wxBottom, 0);
+        c->width.Unconstrained();
+#if defined(__WXGTK__) || defined(__WXMOTIF__)
+        c->height.Absolute(120);
+#else
+        c->height.Absolute(60);
+#endif
+        
+        m_editorControlList->SetConstraints(c);
+        
+        m_editorFrame->SetAutoLayout(TRUE);
+        
+        UpdateResourceList();
+        
+        m_editorFrame->Show(TRUE);
+        return TRUE;
+    }
+    else
     {
-      fr->Show(FALSE);
-      delete fr;
-      editorFrame = NULL;
-      editorPanel = NULL;
+        if (m_editorFrame->Close())
+        {
+            m_editorFrame = NULL;
+            m_editorPanel = NULL;
+        }
     }
-  }
-  return TRUE;
+    return TRUE;
 }
 
 void wxResourceManager::SetFrameTitle(const wxString& filename)
 {
-  if (editorFrame)
-  {
-    if (filename == wxString(""))
-      editorFrame->SetTitle("wxWindows Dialog Editor - untitled");
-    else
+    if (m_editorFrame)
     {
-      wxString str("wxWindows Dialog Editor - ");
-      wxString str2(wxFileNameFromPath(WXSTRINGCAST filename));
-      str += str2;
-      editorFrame->SetTitle(str);
+        if (filename == wxString(""))
+            m_editorFrame->SetTitle("wxWindows Dialog Editor - untitled");
+        else
+        {
+            wxString str("wxWindows Dialog Editor - ");
+            wxString str2(wxFileNameFromPath(WXSTRINGCAST filename));
+            str += str2;
+            m_editorFrame->SetTitle(str);
+        }
     }
-  }
 }
 
-bool wxResourceManager::Save(void)
+bool wxResourceManager::Save()
 {
-  if (currentFilename == wxString(""))
-    return SaveAs();
-  else
-    return Save(currentFilename);
+    if (m_currentFilename == wxString(""))
+        return SaveAs();
+    else
+        return Save(m_currentFilename);
 }
 
 bool wxResourceManager::Save(const wxString& filename)
 {
-  // Ensure all visible windows are saved to their resources
-  currentFilename = filename;
-  SetFrameTitle(currentFilename);
-  InstantiateAllResourcesFromWindows();
-  if (resourceTable.Save(filename))
-  {
-    Modify(FALSE);
-    return TRUE;
-  }
-  else
-    return FALSE;
+    // Ensure all visible windows are saved to their resources
+    m_currentFilename = filename;
+    SetFrameTitle(m_currentFilename);
+    InstantiateAllResourcesFromWindows();
+    if (m_resourceTable.Save(filename))
+    {
+        m_symbolTable.WriteIncludeFile(m_symbolFilename);
+        Modify(FALSE);
+        return TRUE;
+    }
+    else
+        return FALSE;
 }
 
-bool wxResourceManager::SaveAs(void)
+bool wxResourceManager::SaveAs()
 {
-  wxString s(wxFileSelector("Save resource file", wxPathOnly(WXSTRINGCAST currentFilename), wxFileNameFromPath(WXSTRINGCAST currentFilename),
-    "wxr", "*.wxr", wxSAVE | wxOVERWRITE_PROMPT));
+    wxString s(wxFileSelector("Save resource file", wxPathOnly(WXSTRINGCAST m_currentFilename), wxFileNameFromPath(WXSTRINGCAST m_currentFilename),
+        "wxr", "*.wxr", wxSAVE | wxOVERWRITE_PROMPT, wxTheApp->GetTopWindow()));
     
-  if (s.IsNull() || s == "")
-    return FALSE;
+    if (s.IsNull() || s == "")
+        return FALSE;
+    
+    m_currentFilename = s;
+    wxStripExtension(m_currentFilename);
+    m_currentFilename += ".wxr";
+    
+    // Construct include filename from this file
+    m_symbolFilename = m_currentFilename;
     
-  currentFilename = s;
-  Save(currentFilename);
-  return TRUE;
+    wxStripExtension(m_symbolFilename);
+    m_symbolFilename += ".h";
+    
+    Save(m_currentFilename);
+    return TRUE;
 }
 
-bool wxResourceManager::SaveIfModified(void)
+bool wxResourceManager::SaveIfModified()
 {
-  if (Modified())
-    return Save();
-  else return TRUE;
+    if (Modified())
+        return Save();
+    else return TRUE;
 }
 
 bool wxResourceManager::Load(const wxString& filename)
 {
-  return New(TRUE, filename);
+    return New(TRUE, filename);
 }
 
 bool wxResourceManager::New(bool loadFromFile, const wxString& filename)
 {
-  if (!Clear(TRUE, FALSE))
-    return FALSE;
+    if (!Clear(TRUE, FALSE))
+        return FALSE;
     
-  if (loadFromFile)
-  {
-    wxString str = filename;
-    if (str == wxString(""))
+    m_symbolTable.AddStandardSymbols();
+    
+    if (loadFromFile)
     {
-      wxString f(wxFileSelector("Open resource file", NULL, NULL, "wxr", "*.wxr", 0, NULL));
-      if (!f.IsNull() && f != "")
-        str = f;
-      else
-        return FALSE;
+        wxString str = filename;
+        if (str == wxString(""))
+        {
+            wxString f(wxFileSelector("Open resource file", wxGetCwd(), wxEmptyString, "wxr", "*.wxr", 0, wxTheApp->GetTopWindow()));
+            if (!f.IsNull() && f != "")
+                str = f;
+            else
+                return FALSE;
+        }
+        
+        if (!m_resourceTable.ParseResourceFile(str))
+        {
+            wxMessageBox("Could not read file.", "Resource file load error", wxOK | wxICON_EXCLAMATION);
+            return FALSE;
+        }
+        m_currentFilename = str;
+        
+        SetFrameTitle(m_currentFilename);
+        
+        UpdateResourceList();
+        
+        // Construct include filename from this file
+        m_symbolFilename = m_currentFilename;
+        
+        wxStripExtension(m_symbolFilename);
+        m_symbolFilename += ".h";
+        
+        if (!m_symbolTable.ReadIncludeFile(m_symbolFilename))
+        {
+            wxString str("Could not find include file ");
+            str += m_symbolFilename;
+            str += ".\nDialog Editor maintains a header file containing id symbols to be used in the application.\n";
+            str += "The next time this .wxr file is saved, a header file will be saved also.";
+            wxMessageBox(str, "Dialog Editor Warning", wxOK );
+            
+            m_symbolIdCounter = 99;
+        }
+        else
+        {
+            // Set the id counter to the last known id
+            m_symbolIdCounter = m_symbolTable.FindHighestId();
+        }
+        
+        // Now check in case some (or all) resources don't have resource ids, or they
+        // don't match the .h file, or something of that nature.
+        bool altered = RepairResourceIds();
+        if (altered)
+        {
+            wxMessageBox("Some resources have had new identifiers associated with them, since they were missing.", 
+                "Dialog Editor Warning", wxOK );
+            Modify(TRUE);
+        }
+        else
+            Modify(FALSE);
+        
+        return TRUE;
     }
+    else
+    {
+        SetFrameTitle("");
+        m_currentFilename = "";
+    }
+    Modify(FALSE);
+    
+    return TRUE;
+}
+
+bool wxResourceManager::Clear(bool WXUNUSED(deleteWindows), bool force)
+{
+    wxPropertyInfo::CloseWindow();
     
-    if (!resourceTable.ParseResourceFile(WXSTRINGCAST str))
+    if (!force && Modified())
     {
-      wxMessageBox("Could not read file.", "Resource file load error", wxOK | wxICON_EXCLAMATION);
-      return FALSE;
+        int ans = wxMessageBox("Save modified resource file?", "Dialog Editor", wxYES_NO | wxCANCEL);
+        if (ans == wxCANCEL)
+            return FALSE;
+        if (ans == wxYES)
+            if (!SaveIfModified())
+                return FALSE;
+            if (ans == wxNO)
+                Modify(FALSE);
     }
-    currentFilename = str;
     
-    SetFrameTitle(currentFilename);
+    ClearCurrentDialog();
+    DisassociateWindows();
     
+    m_symbolTable.Clear();
+    m_resourceTable.ClearTable();
     UpdateResourceList();
-  }
-  else
-  {
-    SetFrameTitle("");
-    currentFilename = "";
-  }
-  Modify(FALSE);
-  
-  return TRUE;
+    
+    return TRUE;
 }
 
-bool wxResourceManager::Clear(bool deleteWindows, bool force)
+bool wxResourceManager::DisassociateWindows()
 {
-  if (!force && Modified())
-  {
-    int ans = wxMessageBox("Save modified resource file?", "Dialog Editor", wxYES_NO | wxCANCEL);
-    if (ans == wxCANCEL)
-      return FALSE;
-    if (ans == wxYES)
-      if (!SaveIfModified())
-        return FALSE;
-    if (ans == wxNO)
-        Modify(FALSE);
-  }
-  
-  DisassociateWindows(deleteWindows);
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
+    {
+        wxItemResource *res = (wxItemResource *)node->Data();
+        DisassociateResource(res);
+    }
+    
+    return TRUE;
+}
 
-  resourceTable.ClearTable();
-  UpdateResourceList();
+void wxResourceManager::AssociateResource(wxItemResource *resource, wxWindow *win)
+{
+    if (!m_resourceAssociations.Get((long)resource))
+        m_resourceAssociations.Put((long)resource, win);
+    
+    wxNode *node = resource->GetChildren().First();
+    wxNode* node2 = win->GetChildren().First();
+    while (node && node2)
+    {
+        wxItemResource *child = (wxItemResource *)node->Data();
+        wxWindow* childWindow = (wxWindow*) node2->Data();
+        
+        if (child->GetId() != childWindow->GetId())
+        {
+            wxString msg;
+            msg.Printf("AssociateResource: error when associating child window %ld with resource %ld", child->GetId(), childWindow->GetId());
+            wxMessageBox(msg, "Dialog Editor problem", wxOK);
+        }
+        else if (childWindow->GetName() != child->GetName())
+        {
+            wxString msg;
+            msg.Printf("AssociateResource: error when associating child window with resource %s", child->GetName() ? (const char*) child->GetName() : "(unnamed)");
+            wxMessageBox(msg, "Dialog Editor problem", wxOK);
+        }
+        else
+        {
+            AssociateResource(child, childWindow);
+        }
+        
+        // New code to avoid the problem of duplicate ids and names. We simply
+        // traverse the child windows and child resources in parallel,
+        // checking for any mismatch.
+#if 0
+        wxWindow *childWindow = (wxWindow *)m_resourceAssociations.Get((long)child);
+        if (!childWindow)
+            // childWindow = win->FindWindow(child->GetName());
+            childWindow = win->FindWindow(child->GetId());
+        if (childWindow)
+            AssociateResource(child, childWindow);
+        else
+        {
+            wxString msg;
+            msg.Printf("AssociateResource: cannot find child window %s", child->GetName() ? (const char*) child->GetName() : "(unnamed)");
+            wxMessageBox(msg, "Dialog Editor problem", wxOK);
+        }
+#endif
+        node = node->Next();
+        node2 = node2->Next();
+    }
+}
 
-  return TRUE;
+bool wxResourceManager::DisassociateResource(wxItemResource *resource)
+{
+    wxWindow *win = FindWindowForResource(resource);
+    if (!win)
+        return FALSE;
+    
+    // Disassociate children of window
+    wxNode *node = win->GetChildren().First();
+    while (node)
+    {
+        wxWindow *child = (wxWindow *)node->Data();
+        if (child->IsKindOf(CLASSINFO(wxControl)))
+            DisassociateResource(child);
+        node = node->Next();
+    }
+    
+    RemoveSelection(win);
+    m_resourceAssociations.Delete((long)resource);
+    return TRUE;
 }
 
-bool wxResourceManager::DisassociateWindows(bool deleteWindows)
+bool wxResourceManager::DisassociateResource(wxWindow *win)
 {
-  resourceTable.BeginFind();
-  wxNode *node;
-  while (node = resourceTable.Next())
-  {
-    wxItemResource *res = (wxItemResource *)node->Data();
-    DisassociateResource(res, deleteWindows);
-  }
-  
-  return TRUE;
+    wxItemResource *res = FindResourceForWindow(win);
+    if (res)
+        return DisassociateResource(res);
+    else
+        return FALSE;
 }
 
-void wxResourceManager::AssociateResource(wxItemResource *resource, wxWindow *win)
+// Saves the window info into the resource, and deletes the
+// handler. Doesn't actually disassociate the window from
+// the resources. Replaces OnClose.
+bool wxResourceManager::SaveInfoAndDeleteHandler(wxWindow* win)
 {
-  if (!resourceAssociations.Get((long)resource))
-    resourceAssociations.Put((long)resource, win);
-    
-  wxNode *node = resource->GetChildren().First();
-  while (node)
-  {
-    wxItemResource *child = (wxItemResource *)node->Data();
-    wxWindow *childWindow = (wxWindow *)resourceAssociations.Get((long)child);
-    if (!childWindow)
-      childWindow = win->FindWindow(child->GetName());
-    if (childWindow)
-      AssociateResource(child, childWindow);
+    wxItemResource *res = FindResourceForWindow(win);
+    
+    if (win->IsKindOf(CLASSINFO(wxPanel)))
+    {
+        wxResourceEditorDialogHandler* handler = (wxResourceEditorDialogHandler*) win->GetEventHandler();
+        win->PopEventHandler();
+        
+        // Now reset all child event handlers
+        wxNode *node = win->GetChildren().First();
+        while ( node )
+        {
+            wxWindow *child = (wxWindow *)node->Data();
+            wxEvtHandler *childHandler = child->GetEventHandler();
+            if ( child->IsKindOf(CLASSINFO(wxControl)) && childHandler != child )
+            {
+                child->PopEventHandler(TRUE);
+            }
+            node = node->Next();
+        }
+        delete handler;
+    }
     else
     {
-      char buf[200];
-      sprintf(buf, "AssociateResource: cannot find child window %s", child->GetName() ? child->GetName() : "(unnamed)");
-      wxMessageBox(buf, "Dialog Editor problem", wxOK);
+        win->PopEventHandler(TRUE);
     }
-
-    node = node->Next();
-  }
+    
+    // Save the information
+    InstantiateResourceFromWindow(res, win, TRUE);
+    
+    //  DisassociateResource(win);
+    
+    return TRUE;
 }
 
-bool wxResourceManager::DisassociateResource(wxItemResource *resource, bool deleteWindow)
+// Destroys the window. If this is the 'current' panel, NULLs the
+// variable.
+bool wxResourceManager::DeleteWindow(wxWindow* win)
 {
-  wxWindow *win = FindWindowForResource(resource);
-  if (!win)
-    return FALSE;
-
-  // Disassociate children of window without deleting windows
-  // since they'll be deleted by parent.
-  if (win->GetChildren())
-  {
-    wxNode *node = win->GetChildren()->First();
-    while (node)
+    bool clearDisplay = FALSE;
+    if (m_editorPanel->m_childWindow == win)
     {
-      wxWindow *child = (wxWindow *)node->Data();
-      if (child->IsKindOf(CLASSINFO(wxControl)))
-       DisassociateResource(child, FALSE);
-      node = node->Next();
+        m_editorPanel->m_childWindow = NULL;
+        clearDisplay = TRUE;
     }
-  }
-  
-  if (deleteWindow)
-  {
-    if (win->IsKindOf(CLASSINFO(wxPanel)) && !win->IsKindOf(CLASSINFO(wxDialog)))
-      delete win->GetParent(); // Delete frame
-    else if ( win->IsKindOf(CLASSINFO(wxControl)) )
-       {
-         wxEvtHandler *childHandler = win->GetEventHandler();
-         if ( childHandler != win )
-         {
-               win->PopEventHandler();
-               delete childHandler;
-         }
-      delete win;
-       }
-       else
-         // Is this enough? What about event handler? TODO
-         delete win;
-  }
-  RemoveSelection(win);
-  resourceAssociations.Delete((long)resource);
-  return TRUE;
-}
-
-bool wxResourceManager::DisassociateResource(wxWindow *win, bool deleteWindow)
-{
-  wxItemResource *res = FindResourceForWindow(win);
-  if (res)
-    return DisassociateResource(res, deleteWindow);
-  return FALSE;
+    
+    win->Destroy();
+    
+    //if (clearDisplay)
+    //    m_editorPanel->Clear();
+    
+    return TRUE;
 }
 
 wxItemResource *wxResourceManager::FindResourceForWindow(wxWindow *win)
 {
-  resourceAssociations.BeginFind();
-  wxNode *node;
-  while (node = resourceAssociations.Next())
-  {
-    wxWindow *w = (wxWindow *)node->Data();
-    if (w == win)
+    m_resourceAssociations.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceAssociations.Next()))
     {
-      return (wxItemResource *)node->key.integer;
+        wxWindow *w = (wxWindow *)node->Data();
+        if (w == win)
+        {
+            return (wxItemResource *)node->GetKeyInteger();
+        }
     }
-  }
-  return NULL;
+    return NULL;
 }
 
 wxWindow *wxResourceManager::FindWindowForResource(wxItemResource *resource)
 {
-  return (wxWindow *)resourceAssociations.Get((long)resource);
+    return (wxWindow *)m_resourceAssociations.Get((long)resource);
 }
 
 
 void wxResourceManager::MakeUniqueName(char *prefix, char *buf)
 {
-  while (TRUE)
-  {
-    sprintf(buf, "%s%d", prefix, nameCounter);
-    nameCounter ++;
-    
-    if (!resourceTable.FindResource(buf))
-      return;
-  }
+    while (TRUE)
+    {
+        sprintf(buf, "%s%d", prefix, m_nameCounter);
+        m_nameCounter ++;
+        
+        if (!m_resourceTable.FindResource(buf))
+            return;
+    }
 }
 
 wxFrame *wxResourceManager::OnCreateEditorFrame(const char *title)
 {
-  int frameWidth = 420;
-  int frameHeight = 300;
-  
-  wxResourceEditorFrame *frame = new wxResourceEditorFrame(this, NULL, (char *)title,
-
-    resourceEditorWindowSize.x, resourceEditorWindowSize.y,
-    resourceEditorWindowSize.width, resourceEditorWindowSize.height,
-
-    wxDEFAULT_FRAME);
-
-  wxFrame::UseNativeStatusBar(FALSE);
-
-  frame->CreateStatusBar(2);
+    wxResourceEditorFrame *frame = new wxResourceEditorFrame(this, NULL, title,
+        wxPoint(m_resourceEditorWindowSize.x, m_resourceEditorWindowSize.y),
+        wxSize(m_resourceEditorWindowSize.width, m_resourceEditorWindowSize.height),
+        wxDEFAULT_FRAME_STYLE);
+    
+    frame->CreateStatusBar(1);
+    
+    frame->SetAutoLayout(TRUE);
+#ifdef __WXMSW__
+    frame->SetIcon(wxIcon("DIALOGEDICON"));
+#endif
+    return frame;
+}
 
-  wxFrame::UseNativeStatusBar(TRUE);
+wxMenuBar *wxResourceManager::OnCreateEditorMenuBar(wxFrame *WXUNUSED(parent))
+{
+    wxMenuBar *menuBar = new wxMenuBar;
+    
+    wxMenu *fileMenu = new wxMenu;
+    fileMenu->Append(RESED_NEW_DIALOG, "New &Dialog", "Create a new dialog");
+    fileMenu->AppendSeparator();
+    fileMenu->Append(wxID_NEW, "&New Project",           "Clear the current project");
+    fileMenu->Append(wxID_OPEN, "&Open...",         "Load a resource file");
+    fileMenu->Append(wxID_SAVE, "&Save",            "Save a resource file");
+    fileMenu->Append(wxID_SAVEAS, "Save &As...",   "Save a resource file as...");
+    fileMenu->Append(RESED_CLEAR, "&Clear",   "Clear current resources");
+    fileMenu->AppendSeparator();
+    fileMenu->Append(RESED_CONVERT_WXRS, "Convert Old &Resources...", "Convert old resources to new");
+    fileMenu->AppendSeparator();
+    fileMenu->Append(wxID_EXIT, "E&xit",            "Exit resource editor");
+    
+    wxMenu *editMenu = new wxMenu;
+    editMenu->Append(RESED_TEST, "&Test Dialog",  "Test dialog");
+    editMenu->Append(RESED_RECREATE, "&Recreate",  "Recreate the selected resource(s)");
+    editMenu->Append(RESED_DELETE, "&Delete",  "Delete the selected resource(s)");
+    
+    wxMenu *helpMenu = new wxMenu;
+    helpMenu->Append(RESED_CONTENTS, "&Help Topics",          "Invokes the on-line help");
+    helpMenu->AppendSeparator();
+    helpMenu->Append(wxID_ABOUT, "&About",          "About wxWindows Dialog Editor");
+    
+    menuBar->Append(fileMenu, "&File");
+    menuBar->Append(editMenu, "&Edit");
+    menuBar->Append(helpMenu, "&Help");
+    
+    return menuBar;
+}
 
-  frame->SetStatusText(editMode ? "Edit mode" : "Test mode", 1);
-  frame->SetAutoLayout(TRUE);
-#ifdef __WINDOWS__
-  wxIcon *icon = new wxIcon("DIALOGEDICON");
-  frame->SetIcon(icon);
-#endif
-  return frame;
-}
-
-wxMenuBar *wxResourceManager::OnCreateEditorMenuBar(wxFrame *parent)
-{
-  wxMenuBar *menuBar = new wxMenuBar;
-
-  wxMenu *fileMenu = new wxMenu;
-  fileMenu->Append(RESED_NEW_DIALOG, "New &dialog", "Create a new dialog");
-  fileMenu->Append(RESED_NEW_PANEL, "New &panel", "Create a new panel");
-  fileMenu->AppendSeparator();
-  fileMenu->Append(wxID_NEW, "&New project",           "Clear the current project");
-  fileMenu->Append(wxID_OPEN, "&Open...",         "Load a resource file");
-  fileMenu->Append(wxID_SAVE, "&Save",            "Save a resource file");
-  fileMenu->Append(wxID_SAVEAS, "Save &As...",   "Save a resource file as...");
-  fileMenu->Append(RESED_CLEAR, "&Clear",   "Clear current resources");
-  fileMenu->AppendSeparator();
-  fileMenu->Append(wxID_EXIT, "E&xit",            "Exit resource editor");
-
-  wxMenu *editMenu = new wxMenu;
-  editMenu->Append(RESED_RECREATE, "&Recreate",  "Recreate the selected resource(s)");
-  editMenu->Append(RESED_DELETE, "&Delete",  "Delete the selected resource(s)");
-  editMenu->AppendSeparator();
-  editMenu->Append(RESED_TOGGLE_TEST_MODE, "&Toggle edit/test mode",  "Toggle edit/test mode");
-
-  wxMenu *helpMenu = new wxMenu;
-  helpMenu->Append(RESED_CONTENTS, "&Help topics",          "Invokes the on-line help");
-  helpMenu->AppendSeparator();
-  helpMenu->Append(wxID_ABOUT, "&About",          "About wxWindows Dialog Editor");
-
-  menuBar->Append(fileMenu, "&File");
-  menuBar->Append(editMenu, "&Edit");
-  menuBar->Append(helpMenu, "&Help");
-
-  return menuBar;
-}
-
-wxPanel *wxResourceManager::OnCreateEditorPanel(wxFrame *parent)
-{
-  wxResourceEditorPanel *panel = new wxResourceEditorPanel(parent);
-
-  editorResourceList = new wxListBox(panel, -1, wxPoint(0, 0), wxSize(-1, -1));
-
-  wxLayoutConstraints *c = new wxLayoutConstraints;
-  c->left.SameAs       (panel, wxLeft, 5);
-  c->top.SameAs        (panel, wxTop, 5);
-  c->right.SameAs      (panel, wxRight, 5);
-  c->bottom.SameAs     (panel, wxBottom, 5);
-  c->width.Unconstrained();
-  c->height.Unconstrained();
-  editorResourceList->SetConstraints(c);
-
-  return panel;
-}
-
-wxToolBarBase *wxResourceManager::OnCreateToolBar(wxFrame *parent)
-{
-  // Load palette bitmaps
-#ifdef __WINDOWS__
-  ToolbarLoadBitmap = new wxBitmap("LOADTOOL");
-  ToolbarSaveBitmap = new wxBitmap("SAVETOOL");
-  ToolbarNewBitmap = new wxBitmap("NEWTOOL");
-  ToolbarVertBitmap = new wxBitmap("VERTTOOL");
-  ToolbarAlignTBitmap = new wxBitmap("ALIGNTTOOL");
-  ToolbarAlignBBitmap = new wxBitmap("ALIGNBTOOL");
-  ToolbarHorizBitmap = new wxBitmap("HORIZTOOL");
-  ToolbarAlignLBitmap = new wxBitmap("ALIGNLTOOL");
-  ToolbarAlignRBitmap = new wxBitmap("ALIGNRTOOL");
-  ToolbarCopySizeBitmap = new wxBitmap("COPYSIZETOOL");
-  ToolbarToBackBitmap = new wxBitmap("TOBACKTOOL");
-  ToolbarToFrontBitmap = new wxBitmap("TOFRONTTOOL");
-  ToolbarHelpBitmap = new wxBitmap("HELPTOOL");
+wxResourceEditorScrolledWindow *wxResourceManager::OnCreateEditorPanel(wxFrame *parent)
+{
+    wxResourceEditorScrolledWindow *panel = new wxResourceEditorScrolledWindow(parent, wxDefaultPosition, wxDefaultSize,
+        //    wxSUNKEN_BORDER|wxCLIP_CHILDREN);
+#ifdef __WXMOTIF__
+        wxBORDER);
+#else
+    wxSUNKEN_BORDER);
 #endif
-#ifdef __X__
-  ToolbarLoadBitmap = new wxBitmap(load_bits, load_width, load_height);
-  ToolbarSaveBitmap = new wxBitmap(save_bits, save_width, save_height);
-  ToolbarNewBitmap = new wxBitmap(new_bits, save_width, save_height);
-  ToolbarVertBitmap = new wxBitmap(vert_bits, vert_width, vert_height);
-  ToolbarAlignTBitmap = new wxBitmap(alignt_bits, alignt_width, alignt_height);
-  ToolbarAlignBBitmap = new wxBitmap(alignb_bits, alignb_width, alignb_height);
-  ToolbarHorizBitmap = new wxBitmap(horiz_bits, horiz_width, horiz_height);
-  ToolbarAlignLBitmap = new wxBitmap(alignl_bits, alignl_width, alignl_height);
-  ToolbarAlignRBitmap = new wxBitmap(alignr_bits, alignr_width, alignr_height);
-  ToolbarCopySizeBitmap = new wxBitmap(copysize_bits, copysize_width, copysize_height);
-  ToolbarToBackBitmap = new wxBitmap(toback_bits, toback_width, toback_height);
-  ToolbarToFrontBitmap = new wxBitmap(tofront_bits, tofront_width, tofront_height);
-//  ToolbarCPPBitmap = new wxBitmap(cpp_bits, cpp_width, cpp_height);
-//  ToolbarTreeBitmap = new wxBitmap(tree_bits, tree_width, tree_height);
-  ToolbarHelpBitmap = new wxBitmap(help_bits, help_width, help_height);
+    
+    panel->SetScrollbars(10, 10, 100, 100);
+    
+    return panel;
+}
+
+wxToolBar *wxResourceManager::OnCreateToolBar(wxFrame *parent)
+{
+    // Load palette bitmaps
+#ifdef __WXMSW__
+    wxBitmap ToolbarLoadBitmap("LOADTOOL");
+    wxBitmap ToolbarSaveBitmap("SAVETOOL");
+    wxBitmap ToolbarNewBitmap("NEWTOOL");
+    wxBitmap ToolbarVertBitmap("VERTTOOL");
+    wxBitmap ToolbarAlignTBitmap("ALIGNTTOOL");
+    wxBitmap ToolbarAlignBBitmap("ALIGNBTOOL");
+    wxBitmap ToolbarHorizBitmap("HORIZTOOL");
+    wxBitmap ToolbarAlignLBitmap("ALIGNLTOOL");
+    wxBitmap ToolbarAlignRBitmap("ALIGNRTOOL");
+    wxBitmap ToolbarCopySizeBitmap("COPYSIZETOOL");
+    wxBitmap ToolbarToBackBitmap("TOBACKTOOL");
+    wxBitmap ToolbarToFrontBitmap("TOFRONTTOOL");
+    wxBitmap ToolbarHelpBitmap("HELPTOOL");
+    wxBitmap ToolbarCopyWidthBitmap("COPYWIDTHTOOL");
+    wxBitmap ToolbarCopyHeightBitmap("COPYHEIGHTTOOL");
+    wxBitmap ToolbarDistributeHorizBitmap("DISTHORIZTOOL");
+    wxBitmap ToolbarDistributeVertBitmap("DISTVERTTOOL");
+#else
+    wxBitmap ToolbarLoadBitmap( load_xpm );
+    wxBitmap ToolbarSaveBitmap( save_xpm);
+    wxBitmap ToolbarNewBitmap( new_xpm );
+    wxBitmap ToolbarVertBitmap( vert_xpm );
+    wxBitmap ToolbarAlignTBitmap( alignt_xpm );
+    wxBitmap ToolbarAlignBBitmap( alignb_xpm );
+    wxBitmap ToolbarHorizBitmap( horiz_xpm );
+    wxBitmap ToolbarAlignLBitmap( alignl_xpm );
+    wxBitmap ToolbarAlignRBitmap( alignr_xpm );
+    wxBitmap ToolbarCopySizeBitmap( copysize_xpm );
+    wxBitmap ToolbarToBackBitmap( toback_xpm );
+    wxBitmap ToolbarToFrontBitmap( tofront_xpm );
+    wxBitmap ToolbarHelpBitmap( help_xpm );
+    wxBitmap ToolbarCopyWidthBitmap(copywdth_xpm);
+    wxBitmap ToolbarCopyHeightBitmap(copyhght_xpm);
+    wxBitmap ToolbarDistributeHorizBitmap(disthor_xpm);
+    wxBitmap ToolbarDistributeVertBitmap(distvert_xpm);
 #endif
-
-  // Create the toolbar
-  EditorToolBar *toolbar = new EditorToolBar(parent, 0, 0, -1, -1, wxNO_BORDER,
-                                        wxVERTICAL, 1);
-  toolbar->SetMargins(2, 2);
-//  toolbar->GetDC()->SetBackground(wxLIGHT_GREY_BRUSH);
-
-#ifdef __WINDOWS__
-  int width = 24;
-  int dx = 2;
-  int gap = 6;
+    
+    // Create the toolbar
+    EditorToolBar *toolbar = new EditorToolBar(parent, wxPoint(0, 0), wxSize(-1, -1), wxNO_BORDER|wxTB_HORIZONTAL|wxTB_FLAT);
+    toolbar->SetMargins(2, 2);
+    
+#ifdef __WXMSW__
+    int width = 24;
+    int dx = 2;
+    int gap = 6;
 #else
-  int width = ToolbarLoadBitmap->GetWidth();
-  int dx = 2;
-  int gap = 6;
+    int width = 24; // ToolbarLoadBitmap->GetWidth();  ???
+    int dx = 2;
+    int gap = 6;
 #endif
-  int currentX = gap;
-  toolbar->AddSeparator();
-  toolbar->AddTool(TOOLBAR_NEW, ToolbarNewBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "New dialog");
-  currentX += width + dx;
-  toolbar->AddTool(TOOLBAR_LOAD_FILE, ToolbarLoadBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "Load");
-  currentX += width + dx;
-  toolbar->AddTool(TOOLBAR_SAVE_FILE, ToolbarSaveBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "Save");
-  currentX += width + dx + gap;
-  toolbar->AddSeparator();
-  toolbar->AddTool(TOOLBAR_FORMAT_HORIZ, ToolbarVertBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "Horizontal align");
-  currentX += width + dx;
-  toolbar->AddTool(TOOLBAR_FORMAT_VERT_TOP_ALIGN, ToolbarAlignTBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "Top align");
-  currentX += width + dx;
-  toolbar->AddTool(TOOLBAR_FORMAT_VERT_BOT_ALIGN, ToolbarAlignBBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "Bottom align");
-  currentX += width + dx;
-  toolbar->AddTool(TOOLBAR_FORMAT_VERT, ToolbarHorizBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "Vertical align");
-  currentX += width + dx;
-  toolbar->AddTool(TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN, ToolbarAlignLBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "Left align");
-  currentX += width + dx;
-  toolbar->AddTool(TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN, ToolbarAlignRBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "Right align");
-  currentX += width + dx;
-  toolbar->AddTool(TOOLBAR_COPY_SIZE, ToolbarCopySizeBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "Copy size");
-  currentX += width + dx + gap;
-  toolbar->AddSeparator();
-  toolbar->AddTool(TOOLBAR_TO_FRONT, ToolbarToFrontBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "To front");
-  currentX += width + dx;
-  toolbar->AddTool(TOOLBAR_TO_BACK, ToolbarToBackBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "To back");
-  currentX += width + dx + gap;
-/*
-  toolbar->AddTool(TOOLBAR_GEN_CPP, ToolbarCPPBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL);
-  currentX += width + dx;
-
-  toolbar->AddTool(TOOLBAR_TREE, ToolbarTreeBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL);
-  currentX += width + dx;
-*/
-  toolbar->AddSeparator();
-  toolbar->AddTool(TOOLBAR_HELP, ToolbarHelpBitmap, (wxBitmap *)NULL,
-                   FALSE, (float)currentX, -1, NULL, "Help");
-  currentX += width + dx;
-  
-  toolbar->CreateTools();
-
-  return toolbar;
-
-//  parent->OnSize(-1, -1);
+    int currentX = gap;
+    //toolbar->AddSeparator();
+    toolbar->AddTool(TOOLBAR_NEW, ToolbarNewBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "New dialog");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_LOAD_FILE, ToolbarLoadBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Load");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_SAVE_FILE, ToolbarSaveBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Save");
+    currentX += width + dx + gap;
+    toolbar->AddSeparator();
+    toolbar->AddTool(TOOLBAR_FORMAT_HORIZ, ToolbarVertBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Horizontal align");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_FORMAT_VERT_TOP_ALIGN, ToolbarAlignTBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Top align");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_FORMAT_VERT_BOT_ALIGN, ToolbarAlignBBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Bottom align");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_FORMAT_VERT, ToolbarHorizBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Vertical align");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN, ToolbarAlignLBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Left align");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN, ToolbarAlignRBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Right align");
+    currentX += width + dx + gap;
+    toolbar->AddSeparator();
+    toolbar->AddTool(TOOLBAR_COPY_SIZE, ToolbarCopySizeBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Copy size");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_COPY_WIDTH, ToolbarCopyWidthBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Copy width");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_COPY_HEIGHT, ToolbarCopyHeightBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Copy height");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_DISTRIBUTE_HORIZ, ToolbarDistributeHorizBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Distribute horizontally");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_DISTRIBUTE_VERT, ToolbarDistributeVertBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Distribute vertically");
+    currentX += width + dx + gap;
+    toolbar->AddSeparator();
+    toolbar->AddTool(TOOLBAR_TO_FRONT, ToolbarToFrontBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "To front");
+    currentX += width + dx;
+    toolbar->AddTool(TOOLBAR_TO_BACK, ToolbarToBackBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "To back");
+    currentX += width + dx + gap;
+    
+    toolbar->AddSeparator();
+    toolbar->AddTool(TOOLBAR_HELP, ToolbarHelpBitmap, wxNullBitmap,
+        FALSE, currentX, -1, NULL, "Help");
+    currentX += width + dx;
+    
+    toolbar->Realize();
+    
+    return toolbar;
 }
 
-void wxResourceManager::UpdateResourceList(void)
+void wxResourceManager::UpdateResourceList()
 {
-  editorResourceList->Clear();
-  resourceTable.BeginFind();
-  wxNode *node;
-  while (node = resourceTable.Next())
-  {
-    wxItemResource *res = (wxItemResource *)node->Data();
-    wxString resType(res->GetType());
-//    if (res->GetType() == wxTYPE_DIALOG_BOX || res->GetType() == wxTYPE_FRAME || res->GetType() == wxTYPE_BITMAP)
-    if (resType == "wxDialog" || resType == "wxDialogBox" || resType == "wxPanel" || resType == "wxBitmap")
+    if (!m_editorResourceTree)
+        return;
+    
+    m_editorResourceTree->SetInvalid(TRUE);
+    m_editorResourceTree->DeleteAllItems();
+    
+    long id = m_editorResourceTree->AddRoot("Dialogs", 1, 2);
+    
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
     {
-      AddItemsRecursively(0, res);
+        wxItemResource *res = (wxItemResource *)node->Data();
+        wxString resType(res->GetType());
+        if (resType == "wxDialog" || resType == "wxDialogBox" || resType == "wxPanel" || resType == "wxBitmap")
+        {
+            AddItemsRecursively(id, res);
+        }
     }
-  }
+    m_editorResourceTree->Expand(id);
+    m_editorResourceTree->SetInvalid(FALSE);
 }
 
-void wxResourceManager::AddItemsRecursively(int level, wxItemResource *resource)
+void wxResourceManager::AddItemsRecursively(long parent, wxItemResource *resource)
 {
-  int padWidth = level*4;
-  
-  wxString theString("");
-  theString.Append(' ', padWidth);
-  theString += resource->GetName();
-  
-  editorResourceList->Append(theString.GetData(), (char *)resource);
-
-  if (strcmp(resource->GetType(), "wxBitmap") != 0)
-  {
-    wxNode *node = resource->GetChildren().First();
-    while (node)
+    wxString theString("");
+    theString = resource->GetName();
+    
+    int imageId = 0;
+    wxString resType(resource->GetType());
+    if (resType == "wxDialog" || resType == "wxDialogBox" || resType == "wxPanel")
+        imageId = 0;
+    else
+        imageId = 3;
+    
+    long id = m_editorResourceTree->AppendItem(parent, theString, imageId );
+    
+    m_editorResourceTree->SetItemData(id, new wxResourceTreeData(resource));
+    
+    if (strcmp(resource->GetType(), "wxBitmap") != 0)
     {
-      wxItemResource *res = (wxItemResource *)node->Data();
-      AddItemsRecursively(level+1, res);
-      node = node->Next();
+        wxNode *node = resource->GetChildren().First();
+        while (node)
+        {
+            wxItemResource *res = (wxItemResource *)node->Data();
+            AddItemsRecursively(id, res);
+            node = node->Next();
+        }
     }
-  }
+    //  m_editorResourceTree->ExpandItem(id, wxTREE_EXPAND_EXPAND);
 }
 
-bool wxResourceManager::EditSelectedResource(void)
+bool wxResourceManager::EditSelectedResource()
 {
-  int sel = editorResourceList->GetSelection();
-  if (sel > -1)
-  {
-    wxItemResource *res = (wxItemResource *)editorResourceList->wxListBox::GetClientData(sel);
-    return Edit(res);
-  }
-  return FALSE;
+    int sel = m_editorResourceTree->GetSelection();
+    if (sel != 0)
+    {
+        wxResourceTreeData *data = (wxResourceTreeData *)m_editorResourceTree->GetItemData(sel);
+        wxItemResource *res = data->GetResource();
+        return Edit(res);
+    }
+    return FALSE;
 }
 
 bool wxResourceManager::Edit(wxItemResource *res)
 {
-  wxString resType(res->GetType());
-  if (resType == "wxDialog" || resType == "wxDialogBox")
-    {
-      wxDialog *dialog = (wxDialog *)FindWindowForResource(res);
-      if (dialog)
-        dialog->Show(TRUE);
-      else
-      {
-        dialog = new wxDialog;
-        wxResourceEditorDialogHandler *handler = new wxResourceEditorDialogHandler(dialog, res, dialog->GetEventHandler(),
-           this);
-        dialog->PushEventHandler(handler);
-
-//        dialog->SetUserEditMode(TRUE);
-          
-        dialog->LoadFromResource(GetEditorFrame(), res->GetName(), &resourceTable);
-               handler->AddChildHandlers(); // Add event handlers for all controls
-        dialog->SetModal(FALSE);
-        AssociateResource(res, dialog);
-        dialog->Show(TRUE);
-      }
-    }
-  else if (resType == "wxPanel")
-    {
-      wxPanel *panel = (wxPanel *)FindWindowForResource(res);
-      if (panel)
-        panel->GetParent()->Show(TRUE);
-      else
-      {
-        DialogEditorPanelFrame *frame = new DialogEditorPanelFrame(GetEditorFrame(), res->GetName(), 10, 10, 400, 300, wxDEFAULT_FRAME_STYLE, res->GetName());
+    wxPropertyInfo::CloseWindow();
+    
+    ClearCurrentDialog();
+    
+    wxString resType(res->GetType());
+    wxPanel *panel = (wxPanel *)FindWindowForResource(res);
+    
+    if (panel)
+    {
+        wxMessageBox("Should not find panel in wxResourceManager::Edit");
+        return FALSE;
+    }
+    else
+    {
+        //        long style = res->GetStyle();
+        //        res->SetStyle(style|wxRAISED_BORDER);
         panel = new wxPanel;
         wxResourceEditorDialogHandler *handler = new wxResourceEditorDialogHandler(panel, res, panel->GetEventHandler(),
-           this);
+            this);
+        
+        wxLoadFromResource(panel, m_editorPanel, res->GetName(), &m_resourceTable);
+        
         panel->PushEventHandler(handler);
-//        panel->SetUserEditMode(TRUE);
-          
-        panel->LoadFromResource(frame, res->GetName(), &resourceTable);
-               handler->AddChildHandlers(); // Add event handlers for all controls
+        
+        //        res->SetStyle(style);
+        handler->AddChildHandlers(); // Add event handlers for all controls
         AssociateResource(res, panel);
-        frame->SetClientSize(res->GetWidth(), res->GetHeight());
-        frame->Show(TRUE);
-      }
+        
+        m_editorPanel->m_childWindow = panel;
+        panel->Move(m_editorPanel->GetMarginX(), m_editorPanel->GetMarginY());
+        panel->Show(TRUE);
+        panel->Refresh();
+        
+        wxClientDC dc(m_editorPanel);
+        m_editorPanel->DrawTitle(dc);
     }
-  return FALSE;
-}
-
-bool wxResourceManager::CreateNewDialog(void)
-{
-  char buf[256];
-  MakeUniqueName("dialog", buf);
-  
-  wxItemResource *resource = new wxItemResource;
-//  resource->SetType(wxTYPE_DIALOG_BOX);
-  resource->SetType("wxDialog");
-  resource->SetName(buf);
-  resource->SetTitle(buf);
-  resourceTable.AddResource(resource);
-
-#ifdef __MOTIF__
-  wxDialog *dialog = new wxDialog(GetEditorFrame(), -1, buf, wxPoint(10, 10), wxSize(400, 300), wxDEFAULT_DIALOG_STYLE, buf);
-/*
-  dialog->SetBackgroundColour(*wxLIGHT_GREY);
-  dialog->GetDC()->SetBackground(wxLIGHT_GREY_BRUSH);
-  dialog->SetButtonColour(*wxBLACK);
-  dialog->SetLabelColour(*wxBLACK);
-*/
-#else
-  wxDialog *dialog = new wxDialog(GetEditorFrame(), -1, buf, wxPoint(10, 10), wxSize(400, 300), wxDEFAULT_DIALOG_STYLE, buf);
-#endif
-  
-  resource->SetValue1(FALSE); // Modeless to start with
-  resource->SetStyle(dialog->GetWindowStyleFlag());
-
-  // For editing in situ we will need to use the hash table to ensure
-  // we don't dereference invalid pointers.
-//  resourceWindowTable.Put((long)resource, dialog);
-
-  wxResourceEditorDialogHandler *handler = new wxResourceEditorDialogHandler(dialog, resource, dialog->GetEventHandler(),
-   this);
-
-  dialog->PushEventHandler(handler);
-  
-  dialog->Centre(wxBOTH);
-//  dialog->SetUserEditMode(TRUE);
-  dialog->Show(TRUE);
-
-  SetEditMode(TRUE, FALSE);
-
-  AssociateResource(resource, dialog);
-//  SetCurrentResource(resource);
-//  SetCurrentResourceWindow(dialog);
-  UpdateResourceList();
-  
-  Modify(TRUE);
-  
-  return TRUE;
+    return FALSE;
 }
 
-bool wxResourceManager::CreateNewPanel(void)
+bool wxResourceManager::CreateNewPanel()
 {
-  char buf[256];
-  MakeUniqueName("panel", buf);
-  
-  wxItemResource *resource = new wxItemResource;
-//  resource->SetType(wxTYPE_PANEL);
-  resource->SetType("wxPanel");
-  resource->SetName(buf);
-  resource->SetTitle(buf);
-  resourceTable.AddResource(resource);
-  
-  DialogEditorPanelFrame *frame = new DialogEditorPanelFrame(GetEditorFrame(), buf, 10, 10, 400, 300, wxDEFAULT_FRAME_STYLE, buf);
-
-#ifdef __MOTIF__
-  wxPanel *panel = new wxPanel(frame, -1, wxPoint(0, 0), wxSize(400, 300), 0, buf);
-/*
-  panel->SetBackgroundColour(*wxLIGHT_GREY);
-  panel->GetDC()->SetBackground(wxLIGHT_GREY_BRUSH);
-  panel->SetButtonColour(*wxBLACK);
-  panel->SetLabelColour(*wxBLACK);
-*/
-
-#else
-  wxPanel *panel = new wxPanel(frame, -1, wxPoint(0, 0), wxSize(400, 300), 0, buf);
-#endif
-  
-  resource->SetStyle(panel->GetWindowStyleFlag());
-
-  // For editing in situ we will need to use the hash table to ensure
-  // we don't dereference invalid pointers.
-//  resourceWindowTable.Put((long)resource, panel);
-
-  wxResourceEditorDialogHandler *handler = new wxResourceEditorDialogHandler(panel, resource, panel->GetEventHandler(),
-   this);
-  panel->PushEventHandler(handler);
-  
-  panel->Centre(wxBOTH);
-//  panel->SetUserEditMode(TRUE);
-  frame->Show(TRUE);
-
-  SetEditMode(TRUE, FALSE);
-
-  AssociateResource(resource, panel);
-//  SetCurrentResource(resource);
-//  SetCurrentResourceWindow(panel);
-  UpdateResourceList();
-  
-  Modify(TRUE);
-  
-  return TRUE;
+    wxPropertyInfo::CloseWindow();
+    
+    ClearCurrentDialog();
+    
+    char buf[256];
+    MakeUniqueName("dialog", buf);
+    
+    wxItemResource *resource = new wxItemResource;
+    resource->SetType("wxDialog");
+    resource->SetName(buf);
+    resource->SetTitle(buf);
+    resource->SetResourceStyle(wxRESOURCE_USE_DEFAULTS);
+    resource->SetResourceStyle(wxRESOURCE_DIALOG_UNITS);
+    
+    wxString newIdName;
+    int id = GenerateWindowId("ID_DIALOG", newIdName);
+    resource->SetId(id);
+    
+    // This is now guaranteed to be unique, so just add to symbol table
+    m_symbolTable.AddSymbol(newIdName, id);
+    
+    m_resourceTable.AddResource(resource);
+    
+    wxSize size(400, 300);
+    
+    wxPanel *panel = new wxPanel(m_editorPanel, -1,
+        wxPoint(m_editorPanel->GetMarginX(), m_editorPanel->GetMarginY()),
+        size, wxRAISED_BORDER|wxDEFAULT_DIALOG_STYLE, buf);
+    m_editorPanel->m_childWindow = panel;
+    
+    resource->SetStyle(panel->GetWindowStyleFlag());
+    
+    // Store dialog units in resource
+    size = panel->ConvertPixelsToDialog(size);
+    
+    resource->SetSize(10, 10, size.x, size.y);
+    
+    // For editing in situ we will need to use the hash table to ensure
+    // we don't dereference invalid pointers.
+    //  resourceWindowTable.Put((long)resource, panel);
+    
+    wxResourceEditorDialogHandler *handler = new wxResourceEditorDialogHandler(panel, resource, panel->GetEventHandler(),
+        this);
+    panel->PushEventHandler(handler);
+    
+    AssociateResource(resource, panel);
+    UpdateResourceList();
+    
+    Modify(TRUE);
+    m_editorPanel->m_childWindow->Refresh();
+    
+    //  panel->Refresh();
+    
+    wxClientDC dc(m_editorPanel);
+    m_editorPanel->DrawTitle(dc);
+    
+    return TRUE;
 }
 
 bool wxResourceManager::CreatePanelItem(wxItemResource *panelResource, wxPanel *panel, char *iType, int x, int y, bool isBitmap)
 {
-  char buf[256];
-  if (!panel->IsKindOf(CLASSINFO(wxPanel)) && !panel->IsKindOf(CLASSINFO(wxDialog)))
-    return FALSE;
-
-  Modify(TRUE);
-  
-  wxItemResource *res = new wxItemResource;
-  wxControl *newItem = NULL;
-  res->SetSize(x, y, -1, -1);
-  res->SetType(iType);
-  
-  wxString itemType(iType);
-
-  if (itemType == "wxButton")
+    char buf[256];
+    if (!panel->IsKindOf(CLASSINFO(wxPanel)) && !panel->IsKindOf(CLASSINFO(wxDialog)))
+        return FALSE;
+    
+    Modify(TRUE);
+    
+    wxItemResource *res = new wxItemResource;
+    wxControl *newItem = NULL;
+    
+    if ((panelResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) != 0)
     {
-      MakeUniqueName("button", buf);
-      res->SetName(buf);
-      if (isBitmap)
-        newItem = new wxBitmapButton(panel, -1, wxWinBitmap, wxPoint(x, y), wxSize(-1, -1), 0, wxDefaultValidator, buf);
-      else
-        newItem = new wxButton(panel, -1, "Button", wxPoint(x, y), wxSize(-1, -1), 0, wxDefaultValidator, buf);
+        wxPoint pt = panel->ConvertPixelsToDialog(wxPoint(x, y));
+        res->SetSize(pt.x, pt.y, -1, -1);
     }
-  if (itemType == "wxBitmapButton")
+    else res->SetSize(x, y, -1, -1);
+    
+    res->SetType(iType);
+    
+    wxString prefix;
+    
+    wxString itemType(iType);
+    
+    if (itemType == "wxButton")
     {
-      MakeUniqueName("button", buf);
-      res->SetName(buf);
-      newItem = new wxBitmapButton(panel, -1, wxWinBitmap, wxPoint(x, y), wxSize(-1, -1), 0, wxDefaultValidator, buf);
+        prefix = "ID_BUTTON";
+        MakeUniqueName("button", buf);
+        res->SetName(buf);
+        if (isBitmap)
+            newItem = new wxBitmapButton(panel, -1, * m_bitmapImage, wxPoint(x, y), wxSize(-1, -1), wxBU_AUTODRAW, wxDefaultValidator, buf);
+        else
+            newItem = new wxButton(panel, -1, "Button", wxPoint(x, y), wxSize(-1, -1), 0, wxDefaultValidator, buf);
     }
-  else if (itemType == "wxMessage" || itemType == "wxStaticText")
+    if (itemType == "wxBitmapButton")
     {
-      MakeUniqueName("message", buf);
-      res->SetName(buf);
-      if (isBitmap)
-        newItem = new wxStaticBitmap(panel, -1, wxWinBitmap, wxPoint(x, y), wxSize(0, 0), 0, buf);
-      else
-        newItem = new wxStaticText(panel, -1, "Message", wxPoint(x, y), wxSize(-1, -1), 0, buf);
+        prefix = "ID_BITMAPBUTTON";
+        MakeUniqueName("button", buf);
+        res->SetName(buf);
+        newItem = new wxBitmapButton(panel, -1, * m_bitmapImage, wxPoint(x, y), wxSize(-1, -1), wxBU_AUTODRAW, wxDefaultValidator, buf);
     }
-  else if (itemType == "wxStaticBitmap")
+    else if (itemType == "wxMessage" || itemType == "wxStaticText")
     {
-      MakeUniqueName("message", buf);
-      res->SetName(buf);
-      newItem = new wxStaticBitmap(panel, -1, wxWinBitmap, wxPoint(x, y), wxSize(-1, -1), 0, buf);
+        prefix = "ID_STATIC";
+        MakeUniqueName("statictext", buf);
+        res->SetName(buf);
+        if (isBitmap)
+            newItem = new wxStaticBitmap(panel, -1, * m_bitmapImage, wxPoint(x, y), wxSize(0, 0), 0, buf);
+        else
+            newItem = new wxStaticText(panel, -1, "Static", wxPoint(x, y), wxSize(-1, -1), 0, buf);
     }
-  else if (itemType == "wxCheckBox")
+    else if (itemType == "wxStaticBitmap")
     {
-      MakeUniqueName("checkbox", buf);
-      res->SetName(buf);
-      newItem = new wxCheckBox(panel, -1, "Checkbox", wxPoint(x, y), wxSize(-1, -1), 0, wxDefaultValidator, buf);
+        prefix = "ID_STATICBITMAP";
+        MakeUniqueName("static", buf);
+        res->SetName(buf);
+        newItem = new wxStaticBitmap(panel, -1, * m_bitmapImage, wxPoint(x, y), wxSize(-1, -1), 0, buf);
     }
-  else if (itemType == "wxListBox")
+    else if (itemType == "wxCheckBox")
     {
-      MakeUniqueName("listbox", buf);
-      res->SetName(buf);
-      newItem = new wxListBox(panel, -1, wxPoint(x, y), wxSize(-1, -1), 0, NULL, 0, wxDefaultValidator, buf);
+        prefix = "ID_CHECKBOX";
+        MakeUniqueName("checkbox", buf);
+        res->SetName(buf);
+        newItem = new wxCheckBox(panel, -1, "Checkbox", wxPoint(x, y), wxSize(-1, -1), 0, wxDefaultValidator, buf);
     }
-  else if (itemType == "wxRadioBox")
+    else if (itemType == "wxListBox")
     {
-      MakeUniqueName("radiobox", buf);
-      res->SetName(buf);
-      wxString names[] = { "One", "Two" };
-      newItem = new wxRadioBox(panel, -1, "Radiobox", wxPoint(x, y), wxSize(-1, -1), 2, names, 2,
-            wxHORIZONTAL, wxDefaultValidator, buf);
-      res->SetStringValues(new wxStringList("One", "Two", NULL));
+        prefix = "ID_LISTBOX";
+        MakeUniqueName("listbox", buf);
+        res->SetName(buf);
+        newItem = new wxListBox(panel, -1, wxPoint(x, y), wxSize(-1, -1), 0, NULL, 0, wxDefaultValidator, buf);
     }
-  else if (itemType == "wxChoice")
+    else if (itemType == "wxRadioBox")
     {
-      MakeUniqueName("choice", buf);
-      res->SetName(buf);
-      newItem = new wxChoice(panel, -1, wxPoint(x, y), wxSize(-1, -1), 0, NULL, 0, wxDefaultValidator, buf);
+        prefix = "ID_RADIOBOX";
+        MakeUniqueName("radiobox", buf);
+        res->SetName(buf);
+        wxString names[] = { "One", "Two" };
+        newItem = new wxRadioBox(panel, -1, "Radiobox", wxPoint(x, y), wxSize(-1, -1), 2, names, 2,
+            wxHORIZONTAL, wxDefaultValidator, buf);
+        res->SetStringValues(wxStringList("One", "Two", NULL));
     }
-  else if (itemType == "wxGroupBox" || itemType == "wxStaticBox")
+    else if (itemType == "wxRadioButton")
     {
-      MakeUniqueName("group", buf);
-      res->SetName(buf);
-      newItem = new wxStaticBox(panel, -1, "Groupbox", wxPoint(x, y), wxSize(200, 200), 0, buf);
+        prefix = "ID_RADIOBUTTON";
+        MakeUniqueName("radiobutton", buf);
+        res->SetName(buf);
+        wxString names[] = { "One", "Two" };
+        newItem = new wxRadioButton(panel, -1, "Radiobutton", wxPoint(x, y), wxSize(-1, -1),
+            0, wxDefaultValidator, buf);
     }
-  else if (itemType == "wxGauge")
+    else if (itemType == "wxChoice")
     {
-      MakeUniqueName("gauge", buf);
-      res->SetName(buf);
-      newItem = new wxGauge(panel, -1, 10, wxPoint(x, y), wxSize(80, 30), wxHORIZONTAL, wxDefaultValidator, buf);
+        prefix = "ID_CHOICE";
+        MakeUniqueName("choice", buf);
+        res->SetName(buf);
+        newItem = new wxChoice(panel, -1, wxPoint(x, y), wxSize(-1, -1), 0, NULL, 0, wxDefaultValidator, buf);
     }
-  else if (itemType == "wxSlider")
+    else if (itemType == "wxComboBox")
     {
-      MakeUniqueName("slider", buf);
-      res->SetName(buf);
-      newItem = new wxSlider(panel, -1, 1, 1, 10, wxPoint(x, y), wxSize(120, -1), wxHORIZONTAL, wxDefaultValidator, buf);
+        prefix = "ID_COMBOBOX";
+        MakeUniqueName("combobox", buf);
+        res->SetName(buf);
+        newItem = new wxComboBox(panel, -1, "", wxPoint(x, y), wxSize(-1, -1), 0, NULL, wxCB_DROPDOWN, wxDefaultValidator, buf);
     }
-  else if (itemType == "wxText" || itemType == "wxTextCtrl")
+    else if (itemType == "wxGroupBox" || itemType == "wxStaticBox")
     {
-      MakeUniqueName("text", buf);
-      res->SetName(buf);
-      newItem = new wxTextCtrl(panel, -1, "", wxPoint(x, y), wxSize(120, -1), 0, wxDefaultValidator, buf);
+        prefix = "ID_STATICBOX";
+        MakeUniqueName("staticbox", buf);
+        res->SetName(buf);
+        newItem = new wxStaticBox(panel, -1, "Static", wxPoint(x, y), wxSize(200, 200), 0, buf);
     }
-/*
-  else if (itemType == "wxMultiText")
+    else if (itemType == "wxGauge")
     {
-      MakeUniqueName("multitext", buf);
-      res->SetName(buf);
-      newItem = new wxMultiText(panel, (wxFunction)NULL, "Multitext", "", x, y, -1, -1, 0, wxDefaultValidator, buf);
+        prefix = "ID_GAUGE";
+        MakeUniqueName("gauge", buf);
+        res->SetName(buf);
+        newItem = new wxGauge(panel, -1, 10, wxPoint(x, y), wxSize(80, 30), wxHORIZONTAL, wxDefaultValidator, buf);
     }
-*/
-  else if (itemType == "wxScrollBar")
+    else if (itemType == "wxSlider")
     {
-      MakeUniqueName("scrollbar", buf);
-      res->SetName(buf);
-      newItem = new wxScrollBar(panel, -1, wxPoint(x, y), wxSize(140, -1), wxHORIZONTAL, wxDefaultValidator, buf);
+        prefix = "ID_SLIDER";
+        MakeUniqueName("slider", buf);
+        res->SetName(buf);
+        newItem = new wxSlider(panel, -1, 1, 1, 10, wxPoint(x, y), wxSize(120, -1), wxHORIZONTAL, wxDefaultValidator, buf);
     }
-  if (!newItem)
-    return FALSE;
-
-  newItem->PushEventHandler(new wxResourceEditorControlHandler(newItem, newItem));
+    else if (itemType == "wxText" || itemType == "wxTextCtrl (single-line)")
+    {
+        prefix = "ID_TEXTCTRL";
+        MakeUniqueName("textctrl", buf);
+        res->SetName(buf);
+        res->SetType("wxTextCtrl");
+        newItem = new wxTextCtrl(panel, -1, "", wxPoint(x, y), wxSize(120, -1), 0, wxDefaultValidator, buf);
+    }
+    else if (itemType == "wxMultiText" || itemType == "wxTextCtrl (multi-line)")
+    {
+        prefix = "ID_TEXTCTRL";
+        MakeUniqueName("textctrl", buf);
+        res->SetName(buf);
+        res->SetType("wxTextCtrl");
+        newItem = new wxTextCtrl(panel, -1, "", wxPoint(x, y), wxSize(120, 100), wxTE_MULTILINE, wxDefaultValidator, buf);
+    }
+    else if (itemType == "wxScrollBar")
+    {
+        prefix = "ID_SCROLLBAR";
+        MakeUniqueName("scrollbar", buf);
+        res->SetName(buf);
+        newItem = new wxScrollBar(panel, -1, wxPoint(x, y), wxSize(140, -1), wxHORIZONTAL, wxDefaultValidator, buf);
+    }
+    if (!newItem)
+        return FALSE;
+    
+    int actualW, actualH;
+    newItem->GetSize(&actualW, &actualH);
+    wxSize actualSize(actualW, actualH);
+    
+    if ((panelResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) != 0)
+    {
+        actualSize = panel->ConvertPixelsToDialog(actualSize);
+    }
+    res->SetSize(res->GetX(), res->GetY(), actualSize.x, actualSize.y);
+    
+    wxString newIdName;
+    int id = GenerateWindowId(prefix, newIdName);
+    res->SetId(id);
+    
+    // This is now guaranteed to be unique, so just add to symbol table
+    m_symbolTable.AddSymbol(newIdName, id);
+    
+    newItem->PushEventHandler(new wxResourceEditorControlHandler(newItem, newItem));
+    
+    res->SetStyle(newItem->GetWindowStyleFlag());
+    AssociateResource(res, newItem);
+    panelResource->GetChildren().Append(res);
+    
+    UpdateResourceList();
+    
+    return TRUE;
+}
 
-  res->SetStyle(newItem->GetWindowStyleFlag());
-  AssociateResource(res, newItem);
-  panelResource->GetChildren().Append(res);
+void wxResourceManager::ClearCurrentDialog()
+{
+    if (m_editorPanel->m_childWindow)
+    {
+        SaveInfoAndDeleteHandler(m_editorPanel->m_childWindow);
+        DisassociateResource(m_editorPanel->m_childWindow);
+        DeleteWindow(m_editorPanel->m_childWindow);
+        m_editorPanel->m_childWindow = NULL;
+        //m_editorPanel->Clear();
+    }
+}
 
-  UpdateResourceList();
-  
-  return TRUE;
+bool wxResourceManager::TestCurrentDialog(wxWindow* parent)
+{
+    if (m_editorPanel->m_childWindow)
+    {
+        wxItemResource* item = FindResourceForWindow(m_editorPanel->m_childWindow);
+        if (!item)
+            return FALSE;
+        
+        // Make sure the resources are up-to-date w.r.t. the window
+        InstantiateResourceFromWindow(item, m_editorPanel->m_childWindow, TRUE);
+        
+        ResourceEditorDialogTester* dialog = new ResourceEditorDialogTester;
+        bool success = FALSE;
+        if (wxLoadFromResource(dialog, parent, item->GetName(), & m_resourceTable))
+        {
+            dialog->Centre();
+            dialog->ShowModal();
+            success = TRUE;
+        }
+        return success;
+    }
+    return FALSE;
 }
 
 // Find the first dialog or panel for which
 // there is a selected panel item.
-wxWindow *wxResourceManager::FindParentOfSelection(void)
-{
-  resourceTable.BeginFind();
-  wxNode *node;
-  while (node = resourceTable.Next())
-  {
-    wxItemResource *res = (wxItemResource *)node->Data();
-    wxWindow *win = FindWindowForResource(res);
-    if (win)
-    {
-      wxNode *node1 = win->GetChildren()->First();
-      while (node1)
-      {
-        wxControl *item = (wxControl *)node1->Data();
-           wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
-        if (item->IsKindOf(CLASSINFO(wxControl)) && childHandler->IsSelected())
-          return win;
-        node1 = node1->Next();
-      }
-    }
-  }
-  return NULL;
+wxWindow *wxResourceManager::FindParentOfSelection()
+{
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
+    {
+        wxItemResource *res = (wxItemResource *)node->Data();
+        wxWindow *win = FindWindowForResource(res);
+        if (win)
+        {
+            wxNode *node1 = win->GetChildren().First();
+            while (node1)
+            {
+                wxControl *item = (wxControl *)node1->Data();
+                wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
+                if (item->IsKindOf(CLASSINFO(wxControl)) && childHandler->IsSelected())
+                    return win;
+                node1 = node1->Next();
+            }
+        }
+    }
+    return NULL;
 }
 
 // Format the panel items according to 'flag'
 void wxResourceManager::AlignItems(int flag)
 {
-  wxWindow *win = FindParentOfSelection();
-  if (!win)
-    return;
-
-  wxNode *node = GetSelections().First();
-  if (!node)
-    return;
+    wxWindow *win = FindParentOfSelection();
+    if (!win)
+        return;
     
-  wxControl *firstSelection = (wxControl *)node->Data();
-  if (firstSelection->GetParent() != win)
-    return;
+    wxNode *node = GetSelections().First();
+    if (!node)
+        return;
     
-  int firstX, firstY;
-  int firstW, firstH;
-  firstSelection->GetPosition(&firstX, &firstY);
-  firstSelection->GetSize(&firstW, &firstH);
-  int centreX = (int)(firstX + (firstW / 2));
-  int centreY = (int)(firstY + (firstH / 2));
-
-  while (node = node->Next())
-  {
-    wxControl *item = (wxControl *)node->Data();
-    if (item->GetParent() == win)
+    wxControl *firstSelection = (wxControl *)node->Data();
+    if (firstSelection->GetParent() != win)
+        return;
+    
+    int firstX, firstY;
+    int firstW, firstH;
+    firstSelection->GetPosition(&firstX, &firstY);
+    firstSelection->GetSize(&firstW, &firstH);
+    int centreX = (int)(firstX + (firstW / 2));
+    int centreY = (int)(firstY + (firstH / 2));
+    
+    while ((node = node->Next()))
     {
-      int x, y, w, h;
-      item->GetPosition(&x, &y);
-      item->GetSize(&w, &h);
-
-      int newX, newY;
-
-      switch (flag)
-      {
-        case TOOLBAR_FORMAT_HORIZ:
-        {
-          newX = x;
-          newY = (int)(centreY - (h/2.0));
-          break;
-        }
-        case TOOLBAR_FORMAT_VERT:
-        {
-          newX = (int)(centreX - (w/2.0));
-          newY = y;
-          break;
-        }
-        case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN:
+        wxControl *item = (wxControl *)node->Data();
+        if (item->GetParent() == win)
         {
-          newX = firstX;
-          newY = y;
-          break;
+            int x, y, w, h;
+            item->GetPosition(&x, &y);
+            item->GetSize(&w, &h);
+            
+            int newX, newY;
+            
+            switch (flag)
+            {
+            case TOOLBAR_FORMAT_HORIZ:
+                {
+                    newX = x;
+                    newY = (int)(centreY - (h/2.0));
+                    break;
+                }
+            case TOOLBAR_FORMAT_VERT:
+                {
+                    newX = (int)(centreX - (w/2.0));
+                    newY = y;
+                    break;
+                }
+            case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN:
+                {
+                    newX = firstX;
+                    newY = y;
+                    break;
+                }
+            case TOOLBAR_FORMAT_VERT_TOP_ALIGN:
+                {
+                    newX = x;
+                    newY = firstY;
+                    break;
+                }
+            case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN:
+                {
+                    newX = firstX + firstW - w;
+                    newY = y;
+                    break;
+                }
+            case TOOLBAR_FORMAT_VERT_BOT_ALIGN:
+                {
+                    newX = x;
+                    newY = firstY + firstH - h;
+                    break;
+                }
+            default:
+                newX = x; newY = y;
+                break;
+            }
+            
+            wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(item);
+            wxItemResource* parentResource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(item->GetParent());
+            
+            item->SetSize(newX, newY, w, h);
+            
+            // Also update the associated resource
+            // We need to convert to dialog units if this is not a dialog or panel, but
+            // the parent resource specifies dialog units.
+            if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
+            {
+                wxPoint pt = item->GetParent()->ConvertPixelsToDialog(wxPoint(newX, newY));
+                newX = pt.x; newY = pt.y;
+                wxSize sz = item->GetParent()->ConvertPixelsToDialog(wxSize(w, h));
+                w = sz.x; h = sz.y;
+            }
+            resource->SetSize(newX, newY, w, h);
         }
-        case TOOLBAR_FORMAT_VERT_TOP_ALIGN:
-        {
-          newX = x;
-          newY = firstY;
-          break;
-        }
-        case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN:
+    }
+    win->Refresh();
+}
+
+// Copy the first image's size to subsequent images
+void wxResourceManager::CopySize(int command)
+{
+    bool copyWidth = (command == TOOLBAR_COPY_SIZE || command == TOOLBAR_COPY_WIDTH) ;
+    bool copyHeight = (command == TOOLBAR_COPY_SIZE || command == TOOLBAR_COPY_HEIGHT) ;
+    
+    wxWindow *win = FindParentOfSelection();
+    if (!win)
+        return;
+    
+    wxNode *node = GetSelections().First();
+    if (!node)
+        return;
+    
+    wxControl *firstSelection = (wxControl *)node->Data();
+    if (firstSelection->GetParent() != win)
+        return;
+    
+    int firstX, firstY;
+    int firstW, firstH;
+    firstSelection->GetPosition(&firstX, &firstY);
+    firstSelection->GetSize(&firstW, &firstH);
+    
+    while ((node = node->Next()))
+    {
+        wxControl *item = (wxControl *)node->Data();
+        if (item->GetParent() == win)
         {
-          newX = firstX + firstW - w;
-          newY = y;
-          break;
+            wxSize sz = item->GetSize();
+            int widthToSet = (copyWidth ? firstW : sz.x);
+            int heightToSet = (copyHeight ? firstH : sz.y);
+            
+            item->SetSize(-1, -1, widthToSet, heightToSet);
+            
+            wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(item);
+            wxItemResource* parentResource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(item->GetParent());
+            
+            widthToSet = resource->GetWidth();
+            heightToSet = resource->GetHeight();
+            
+            // Also update the associated resource
+            // We need to convert to dialog units if this is not a dialog or panel, but
+            // the parent resource specifies dialog units.
+            if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
+            {
+                wxSize convertedSize = item->GetParent()->ConvertPixelsToDialog(wxSize(firstW, firstH));
+                if (copyWidth)
+                    widthToSet = convertedSize.x;
+                if (copyHeight)
+                    heightToSet = convertedSize.y;
+            }
+            resource->SetSize(resource->GetX(), resource->GetY(), widthToSet, heightToSet);
         }
-        case TOOLBAR_FORMAT_VERT_BOT_ALIGN:
+    }
+    win->Refresh();
+}
+
+void wxResourceManager::ToBackOrFront(bool toBack)
+{
+    wxWindow *win = FindParentOfSelection();
+    if (!win)
+        return;
+    wxItemResource *winResource = FindResourceForWindow(win);
+    
+    wxNode *node = GetSelections().First();
+    while (node)
+    {
+        wxControl *item = (wxControl *)node->Data();
+        wxItemResource *itemResource = FindResourceForWindow(item);
+        if (item->GetParent() == win)
         {
-          newX = x;
-          newY = firstY + firstH - h;
-          break;
+            win->GetChildren().DeleteObject(item);
+            if (winResource)
+                winResource->GetChildren().DeleteObject(itemResource);
+            if (toBack)
+            {
+                win->GetChildren().Insert(item);
+                if (winResource)
+                    winResource->GetChildren().Insert(itemResource);
+            }
+            else
+            {
+                win->GetChildren().Append(item);
+                if (winResource)
+                    winResource->GetChildren().Append(itemResource);
+            }
         }
-        default:
-          newX = x; newY = y;
-          break;
-      }
-
-      item->SetSize(newX, newY, w, h);
+        node = node->Next();
     }
-  }
-  win->Refresh();
+    //  win->Refresh();
 }
 
-// Copy the first image's size to subsequent images
-void wxResourceManager::CopySize(void)
+// Distribute controls evenly between first and last
+void wxResourceManager::DistributePositions(int command)
 {
-  wxWindow *win = FindParentOfSelection();
-  if (!win)
-    return;
+    bool horizontal = (command == TOOLBAR_DISTRIBUTE_HORIZ) ;
 
-  wxNode *node = GetSelections().First();
-  if (!node)
-    return;
+    wxWindow *win = FindParentOfSelection();
+    if (!win)
+        return;
+    
+    if (GetSelections().Number() < 3)
+    {
+        wxMessageBox(wxT("Sorry, distributing less than three controls does not make sense."));
+        return;
+    }
     
-  wxControl *firstSelection = (wxControl *)node->Data();
-  if (firstSelection->GetParent() != win)
-    return;
+    wxControl *firstSelection = (wxControl*) GetSelections().First()->Data();
+    wxControl *lastSelection = (wxControl*) GetSelections().Last()->Data();
+
+    // For now, assume the ordering is correct (the user selected the controls in order).
+    // TODO: explicitly order the selections in terms of increading x or y position.
+
+    // Find the total amount of space between all controls
+    int totalControlSpace = 0; // How much space the controls take up
+
+    wxNode* node = GetSelections().First();
+    while (node)
+    {
+        wxControl* control = (wxControl*) node->Data();
+
+        int x, y;
+        int w, h;
+        control->GetPosition(&x, &y);
+        control->GetSize(&w, &h);
+
+        // Don't include the space taken up by the first and last controls.
+        if (control != firstSelection && control != lastSelection)
+        {
+            if (horizontal)
+                totalControlSpace += w;
+            else
+                totalControlSpace += h;
+        }
+
+        node = node->Next();
+    }
+
     
-  int firstX, firstY;
-  int firstW, firstH;
-  firstSelection->GetPosition(&firstX, &firstY);
-  firstSelection->GetSize(&firstW, &firstH);
-  int centreX = (int)(firstX + (firstW / 2));
-  int centreY = (int)(firstY + (firstH / 2));
+    int firstX, firstY, lastX, lastY;
+    int firstW, firstH, lastW, lastH;
+    firstSelection->GetPosition(&firstX, &firstY);
+    firstSelection->GetSize(&firstW, &firstH);
 
-  while (node = node->Next())
-  {
-    wxControl *item = (wxControl *)node->Data();
-    if (item->GetParent() == win)
-      item->SetSize(-1, -1, firstW, firstH);
-  }
-  win->Refresh();
-}
+    lastSelection->GetPosition(&lastX, &lastY);
+    lastSelection->GetSize(&lastW, &lastH);
 
-void wxResourceManager::ToBackOrFront(bool toBack)
-{
-  wxWindow *win = FindParentOfSelection();
-  if (!win)
-    return;
-  wxItemResource *winResource = FindResourceForWindow(win);
-
-  wxNode *node = GetSelections().First();
-  while (node)
-  {
-    wxControl *item = (wxControl *)node->Data();
-    wxItemResource *itemResource = FindResourceForWindow(item);
-    if (item->GetParent() == win)
-    {
-      win->GetChildren()->DeleteObject(item);
-      if (winResource)
-        winResource->GetChildren().DeleteObject(itemResource);
-      if (toBack)
-      {
-        win->GetChildren()->Insert(item);
-        if (winResource)
-          winResource->GetChildren().Insert(itemResource);
-      }
-      else
-      {
-        win->GetChildren()->Append(item);
-        if (winResource)
-          winResource->GetChildren().Append(itemResource);
-      }
-    }
-    node = node->Next();
-  }
-//  win->Refresh();
+    /*
+
+  firstX                  lastX
+    |===| |====| |======| |==|
+
+    */
+
+    int spacing, currentPos;
+    if (horizontal)
+    {
+        spacing = ((lastX - (firstX + firstW)) - totalControlSpace) / (GetSelections().Number() - 1);
+        currentPos = firstX + firstW + spacing;
+    }
+    else
+    {
+        spacing = ((lastY - (firstY + firstH)) - totalControlSpace) / (GetSelections().Number() - 1);
+        currentPos = firstY + firstH + spacing;
+    }
+
+    node = GetSelections().First();
+
+    while ((node = node->Next()))
+    {
+        wxControl *item = (wxControl *)node->Data();
+        wxSize sz = item->GetSize();
+        wxPoint pos = item->GetPosition();
+        wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(item);
+        wxItemResource* parentResource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(item->GetParent());
+        
+        int controlX = (horizontal ? currentPos : pos.x);
+        int controlY = (horizontal ? pos.y : currentPos);
+        
+        item->Move(controlX, controlY);
+        
+        int resX = controlX;
+        int resY = controlY;
+        
+        // Also update the associated resource
+        // We need to convert to dialog units if this is not a dialog or panel, but
+        // the parent resource specifies dialog units.
+        if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
+        {
+            wxPoint convertedPos = item->GetParent()->ConvertPixelsToDialog(wxPoint(resX, resY));
+            resX = convertedPos.x;
+            resY = convertedPos.y;
+        }
+        resource->SetSize(resX, resY, resource->GetWidth(), resource->GetHeight());
+        
+        currentPos += (horizontal ? (sz.x + spacing) : (sz.y + spacing));
+    }
+    win->Refresh();
 }
 
 void wxResourceManager::AddSelection(wxWindow *win)
 {
-  if (!selections.Member(win))
-    selections.Append(win);
+    if (!m_selections.Member(win))
+        m_selections.Append(win);
 }
 
 void wxResourceManager::RemoveSelection(wxWindow *win)
 {
-  selections.DeleteObject(win);
+    m_selections.DeleteObject(win);
+}
+
+void wxResourceManager::DeselectItemIfNecessary(wxWindow *win)
+{
+    if (win->IsKindOf(CLASSINFO(wxControl)) && (win->GetEventHandler() != win))
+    {
+        // Deselect and refresh window in case we leave selection
+        // handles behind
+        wxControl *item = (wxControl *)win;
+        wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
+        if (childHandler->IsSelected())
+        {
+            wxResourceManager::GetCurrentResourceManager()->RemoveSelection(item);
+            childHandler->SelectItem(FALSE);
+#ifndef __WXGTK__
+            item->GetParent()->Refresh();
+#endif
+        }
+    } 
 }
 
 // Need to search through resource table removing this from
 // any resource which has this as a parent.
 bool wxResourceManager::RemoveResourceFromParent(wxItemResource *res)
 {
-  resourceTable.BeginFind();
-  wxNode *node;
-  while (node = resourceTable.Next())
-  {
-    wxItemResource *thisRes = (wxItemResource *)node->Data();
-    if (thisRes->GetChildren().Member(res))
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
     {
-      thisRes->GetChildren().DeleteObject(res);
-      return TRUE;
+        wxItemResource *thisRes = (wxItemResource *)node->Data();
+        if (thisRes->GetChildren().Member(res))
+        {
+            thisRes->GetChildren().DeleteObject(res);
+            return TRUE;
+        }
     }
-  }
-  return FALSE;
+    return FALSE;
 }
 
 bool wxResourceManager::DeleteResource(wxItemResource *res)
 {
-  if (!res)
-    return FALSE;
-
-  RemoveResourceFromParent(res);
-
-  wxNode *node = res->GetChildren().First();
-  while (node)
-  {
-    wxNode *next = node->Next();
-    wxItemResource *child = (wxItemResource *)node->Data();
-    DeleteResource(child);
-    node = next;
-  }
-  
-  // If this is a button or message resource, delete the
-  // associate bitmap resource if not being used.
-  wxString resType(res->GetType());
-  
-  if ((resType == "wxMessage" || resType == "wxButton") && res->GetValue4())
-  {
+    if (!res)
+        return FALSE;
+    
+    RemoveResourceFromParent(res);
+    
+    wxNode *node = res->GetChildren().First();
+    while (node)
+    {
+        wxNode *next = node->Next();
+        wxItemResource *child = (wxItemResource *)node->Data();
+        DeleteResource(child);
+        node = next;
+    }
+    
+    // If this is a button or message resource, delete the
+    // associate bitmap resource if not being used.
+    wxString resType(res->GetType());
+    
+    /* shouldn't have to do this now bitmaps are ref-counted
+    if ((resType == "wxMessage" || resType == "wxStaticBitmap" || resType == "wxButton" || resType == "wxBitmapButton") && res->GetValue4())
+    {
     PossiblyDeleteBitmapResource(res->GetValue4());
-  }
-
-  resourceTable.Delete(res->GetName());
-  delete res;
-  Modify(TRUE);
-  return TRUE;
-}
-
-bool wxResourceManager::DeleteResource(wxWindow *win, bool deleteWindow)
-{
-  if (win->IsKindOf(CLASSINFO(wxControl)))
-  {
-    // Deselect and refresh window in case we leave selection
-    // handles behind
-    wxControl *item = (wxControl *)win;
-    wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
-    if (childHandler->IsSelected())
+    }
+    */
+    
+    // Remove symbol from table if appropriate
+    if (!IsSymbolUsed(res, res->GetId()))
     {
-      RemoveSelection(item);
-      childHandler->SelectItem(FALSE);
-      item->GetParent()->Refresh();
+        m_symbolTable.RemoveSymbol(res->GetId());
     }
-  }
-  
-  wxItemResource *res = FindResourceForWindow(win);
-  
-  DisassociateResource(res, deleteWindow);
-  DeleteResource(res);
-  UpdateResourceList();
-
-  // What about associated event handler? Must clean up! BUGBUG
-//  if (win && deleteWindow)
-//    delete win;
-  return TRUE;
-}
-
-// Will eventually have bitmap type information, for different
-// kinds of bitmap.
-char *wxResourceManager::AddBitmapResource(char *filename)
-{
-  wxItemResource *resource = FindBitmapResourceByFilename(filename);
-  if (!resource)
-  {
-    char buf[256];
-    MakeUniqueName("bitmap", buf);
-    resource = new wxItemResource;
-    resource->SetType("wxBitmap");
-    resource->SetName(buf);
     
-    // A bitmap resource has one or more children, specifying
-    // alternative bitmaps.
-    wxItemResource *child = new wxItemResource;
-    child->SetType("wxBitmap");
-    child->SetName(filename);
-    child->SetValue1(wxBITMAP_TYPE_BMP);
-    child->SetValue2(RESOURCE_PLATFORM_ANY);
-    child->SetValue3(0); // Depth
-    child->SetSize(0,0,0,0);
-    resource->GetChildren().Append(child);
-
-    resourceTable.AddResource(resource);
-
-    UpdateResourceList();
-  }
-  if (resource)
-    return resource->GetName();
-  else
-    return NULL;
+    m_resourceTable.Delete(res->GetName());
+    delete res;
+    Modify(TRUE);
+    return TRUE;
 }
 
- // Delete the bitmap resource if it isn't being used by another resource.
-void wxResourceManager::PossiblyDeleteBitmapResource(char *resourceName)
+bool wxResourceManager::DeleteResource(wxWindow *win)
 {
-  if (!IsBitmapResourceUsed(resourceName))
-  {
-    wxItemResource *res = resourceTable.FindResource(resourceName);
+    DeselectItemIfNecessary(win);
+    
+    wxItemResource *res = FindResourceForWindow(win);
+    
+    DisassociateResource(res);
     DeleteResource(res);
     UpdateResourceList();
-  }
+    
+    return TRUE;
 }
 
-bool wxResourceManager::IsBitmapResourceUsed(char *resourceName)
+// Will eventually have bitmap type information, for different
+// kinds of bitmap.
+wxString wxResourceManager::AddBitmapResource(const wxString& filename)
 {
-  resourceTable.BeginFind();
-  wxNode *node;
-  while (node = resourceTable.Next())
-  {
-    wxItemResource *res = (wxItemResource *)node->Data();
-    wxString resType(res->GetType());
-    if (resType == "wxDialog")
+    wxItemResource *resource = FindBitmapResourceByFilename(filename);
+    if (!resource)
     {
-      wxNode *node1 = res->GetChildren().First();
-      while (node1)
-      {
-        wxItemResource *child = (wxItemResource *)node1->Data();
-        wxString childResType(child->GetType());
+        char buf[256];
+        MakeUniqueName("bitmap", buf);
+        resource = new wxItemResource;
+        resource->SetType("wxBitmap");
+        resource->SetName(buf);
+        
+        // A bitmap resource has one or more children, specifying
+        // alternative bitmaps.
+        wxItemResource *child = new wxItemResource;
+        child->SetType("wxBitmap");
+        child->SetName(filename);
+        child->SetValue1(wxBITMAP_TYPE_BMP);
+        child->SetValue2(RESOURCE_PLATFORM_ANY);
+        child->SetValue3(0); // Depth
+        child->SetSize(0,0,0,0);
+        resource->GetChildren().Append(child);
+        
+        m_resourceTable.AddResource(resource);
         
-        if ((childResType == "wxMessage" || childResType == "wxButton") &&
-             child->GetValue4() &&
-            (strcmp(child->GetValue4(), resourceName) == 0))
-          return TRUE;
-        node1 = node1->Next();
-      }
+        UpdateResourceList();
     }
-  }
-  return FALSE;
+    if (resource)
+        return resource->GetName();
+    else
+        return wxEmptyString;
 }
 
-// Given a wxButton or wxMessage, find the corresponding bitmap filename.
-char *wxResourceManager::FindBitmapFilenameForResource(wxItemResource *resource)
+// Delete the bitmap resource if it isn't being used by another resource.
+void wxResourceManager::PossiblyDeleteBitmapResource(const wxString& resourceName)
 {
-  if (!resource || !resource->GetValue4())
-    return NULL;
-  wxItemResource *bitmapResource = resourceTable.FindResource(resource->GetValue4());
-  if (!bitmapResource)
-    return NULL;
-
-  wxNode *node = bitmapResource->GetChildren().First();
-  while (node)
-  {
-    // Eventually augment this to return a bitmap of the right kind or something...
-    // Maybe the root of the filename remains the same, so it doesn't matter which we
-    // pick up. Otherwise how do we specify multiple filenames... too boring...
-    wxItemResource *child = (wxItemResource *)node->Data();
-    return child->GetName();
-    
-    node = node->Next();
-  }
-  return NULL;
+    if (!IsBitmapResourceUsed(resourceName))
+    {
+        wxItemResource *res = m_resourceTable.FindResource(resourceName);
+        DeleteResource(res);
+        UpdateResourceList();
+    }
 }
 
-wxItemResource *wxResourceManager::FindBitmapResourceByFilename(char *filename)
+bool wxResourceManager::IsBitmapResourceUsed(const wxString& resourceName)
 {
-  resourceTable.BeginFind();
-  wxNode *node;
-  while (node = resourceTable.Next())
-  {
-    wxItemResource *res = (wxItemResource *)node->Data();
-    wxString resType(res->GetType());
-    if (resType == "wxBitmap")
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
     {
-      wxNode *node1 = res->GetChildren().First();
-      while (node1)
-      {
-        wxItemResource *child = (wxItemResource *)node1->Data();
-        if (child->GetName() && (strcmp(child->GetName(), filename) == 0))
-          return res;
-        node1 = node1->Next();
-      }
+        wxItemResource *res = (wxItemResource *)node->Data();
+        wxString resType(res->GetType());
+        if (resType == "wxDialog")
+        {
+            wxNode *node1 = res->GetChildren().First();
+            while (node1)
+            {
+                wxItemResource *child = (wxItemResource *)node1->Data();
+                wxString childResType(child->GetType());
+                
+                if ((childResType == "wxMessage" || childResType == "wxButton") &&
+                    child->GetValue4() &&
+                    (strcmp(child->GetValue4(), resourceName) == 0))
+                    return TRUE;
+                node1 = node1->Next();
+            }
+        }
     }
-  }
-  return NULL;
+    return FALSE;
 }
 
- // Deletes 'win' and creates a new window from the resource that
- // was associated with it. E.g. if you can't change properties on the
- // fly, you'll need to delete the window and create it again.
-wxWindow *wxResourceManager::RecreateWindowFromResource(wxWindow *win, wxWindowPropertyInfo *info)
+// Given a wxButton or wxMessage, find the corresponding bitmap filename.
+wxString wxResourceManager::FindBitmapFilenameForResource(wxItemResource *resource)
 {
-  wxItemResource *resource = FindResourceForWindow(win);
-
-  // Put the current window properties into the wxItemResource object
-  
-  wxWindowPropertyInfo *newInfo = NULL;
-  if (!info)
-  {
-    newInfo = wxCreatePropertyInfoForWindow(win);
-    info = newInfo;
-  }
-
-  info->InstantiateResource(resource);
-
-  wxWindow *newWin = NULL;
-  wxWindow *parent = win->GetParent();
-  
-  if (win->IsKindOf(CLASSINFO(wxPanel)))
-  {
-    bool isDialog = win->IsKindOf(CLASSINFO(wxDialog));
-    wxWindow *parent = win->GetParent();
-    
-    win->GetEventHandler()->OnClose();
+    if (!resource || (resource->GetValue4() == ""))
+        return wxEmptyString;
+    wxItemResource *bitmapResource = m_resourceTable.FindResource(resource->GetValue4());
+    if (!bitmapResource)
+        return wxEmptyString;
     
-    if (!isDialog && parent)
+    wxNode *node = bitmapResource->GetChildren().First();
+    while (node)
     {
-      // Delete frame parent of panel if this is not a dialog box
-      parent->Close(TRUE);
+        // Eventually augment this to return a bitmap of the right kind or something...
+        // Maybe the root of the filename remains the same, so it doesn't matter which we
+        // pick up. Otherwise how do we specify multiple filenames... too boring...
+        wxItemResource *child = (wxItemResource *)node->Data();
+        return child->GetName();
+        
+        //node = node->Next();
     }
-
-    Edit(resource);
-    newWin = FindWindowForResource(resource);
-  }
-  else
-  {
-    DisassociateResource(resource, FALSE);
-    delete win;
-    newWin = resourceTable.CreateItem((wxPanel *)parent, resource);
-    AssociateResource(resource, newWin);
-    UpdateResourceList();
-  }
-
-  if (info)
-    info->SetPropertyWindow(newWin);
-    
-  if (newInfo)
-    delete newInfo;
-  
-  return newWin;
+    return wxEmptyString;
 }
 
-// Delete resource highlighted in the listbox
-bool wxResourceManager::DeleteSelection(bool deleteWindow)
+wxItemResource *wxResourceManager::FindBitmapResourceByFilename(const wxString& filename)
 {
-  int sel = editorResourceList->GetSelection();
-  if (sel > -1)
-  {
-    wxItemResource *res = (wxItemResource *)editorResourceList->wxListBox::GetClientData(sel);
-    wxWindow *win = FindWindowForResource(res);
-/*
-    if (res == currentResource)
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
     {
-      currentResource = NULL;
-      currentResourceWindow = NULL;
+        wxItemResource *res = (wxItemResource *)node->Data();
+        wxString resType(res->GetType());
+        if (resType == "wxBitmap")
+        {
+            wxNode *node1 = res->GetChildren().First();
+            while (node1)
+            {
+                wxItemResource *child = (wxItemResource *)node1->Data();
+                if (child->GetName() && (strcmp(child->GetName(), filename) == 0))
+                    return res;
+                node1 = node1->Next();
+            }
+        }
     }
-*/
-
-    DisassociateResource(res, deleteWindow);
-    DeleteResource(res);
-    UpdateResourceList();
-
-/*
-    // What about associated event handler? Must clean up! BUGBUG
-    if (win && deleteWindow)
-      delete win;
-*/
-
-    Modify(TRUE);
-  }
-
-  return FALSE;
+    return NULL;
 }
 
-// Delete resource highlighted in the listbox
-bool wxResourceManager::RecreateSelection(void)
+// Is this window identifier symbol in use?
+// Let's assume that we can't have 2 names for the same integer id.
+// Therefore we can tell by the integer id whether the symbol is
+// in use.
+bool wxResourceManager::IsSymbolUsed(wxItemResource* thisResource, wxWindowID id)
 {
-  wxNode *node = GetSelections().First();
-  while (node)
-  {
-    wxControl *item = (wxControl *)node->Data();
-    wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
-    wxNode *next = node->Next();
-    childHandler->SelectItem(FALSE);
-
-    RemoveSelection(item);
-    
-    RecreateWindowFromResource(item);
-    
-    node = next;
-  }
-  return TRUE;
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
+    {
+        wxItemResource *res = (wxItemResource *)node->Data();
+        
+        wxString resType(res->GetType());
+        if (resType == "wxDialog" || resType == "wxDialogBox" || resType == "wxPanel")
+        {
+            if ((res != thisResource) && (res->GetId() == id))
+                return TRUE;
+            
+            wxNode *node1 = res->GetChildren().First();
+            while (node1)
+            {
+                wxItemResource *child = (wxItemResource *)node1->Data();
+                if ((child != thisResource) && (child->GetId() == id))
+                    return TRUE;
+                node1 = node1->Next();
+            }
+        }
+    }
+    return FALSE;
 }
 
-bool wxResourceManager::EditDialog(wxDialog *dialog, wxWindow *parent)
+// Is this window identifier compatible with the given name? (i.e.
+// does it already exist under a different name)
+bool wxResourceManager::IsIdentifierOK(const wxString& name, wxWindowID id)
 {
-  return FALSE;
+    if (m_symbolTable.SymbolExists(name))
+    {
+        int foundId = m_symbolTable.GetIdForSymbol(name);
+        if (foundId != id)
+            return FALSE;
+    }
+    return TRUE;
 }
 
-void wxResourceManager::SetEditMode(bool flag, bool changeCurrentResource)
+// Change all integer ids that match oldId, to newId.
+// This is necessary if an id is changed for one resource - all resources
+// must be changed.
+void wxResourceManager::ChangeIds(int oldId, int newId)
 {
-  editMode = flag;
-  if (editorFrame)
-    editorFrame->SetStatusText(editMode ? "Edit mode" : "Test mode", 1);
-
-  // Switch mode for each dialog in the resource list
-  resourceTable.BeginFind();
-  wxNode *node = resourceTable.Next();
-  while (node)
-  {
-    wxItemResource *resource = (wxItemResource *)node->Data();
-    wxWindow *currentResourceWindow = FindWindowForResource(resource);
-  
-    if (changeCurrentResource && currentResourceWindow && (currentResourceWindow->IsKindOf(CLASSINFO(wxPanel))))
-    {
-      wxPanel *panel = (wxPanel *)currentResourceWindow;
-      if (editMode)
-      {
-        // If we have already installed our own handler, don't bother editing.
-        // This test will need to be changed eventually because for in-situ editing,
-        // the user might have installed a different one anyway.
-        wxEvtHandler *handler = panel->GetEventHandler();
-           handler->SetEvtHandlerEnabled(TRUE);
-        // Enable all children
-        wxNode *node = panel->GetChildren()->First();
-        while (node)
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
+    {
+        wxItemResource *res = (wxItemResource *)node->Data();
+        
+        wxString resType(res->GetType());
+        if (resType == "wxDialog" || resType == "wxDialogBox" || resType == "wxPanel")
         {
-          wxControl *item = (wxControl *)node->Data();
-                 if ( item->IsKindOf(CLASSINFO(wxControl)) )
-                 {
-               wxEvtHandler *childHandler = item->GetEventHandler();
-                       childHandler->SetEvtHandlerEnabled(TRUE);
-                 }
-          node = node->Next();
+            if (res->GetId() == oldId)
+                res->SetId(newId);
+            
+            wxNode *node1 = res->GetChildren().First();
+            while (node1)
+            {
+                wxItemResource *child = (wxItemResource *)node1->Data();
+                if (child->GetId() == oldId)
+                    child->SetId(newId);
+                
+                node1 = node1->Next();
+            }
         }
-      }
-      else
-      {
-        wxEvtHandler *handler = panel->GetEventHandler();
-               handler->SetEvtHandlerEnabled(FALSE);
-        // Deselect all items on the dialog and refresh.
-        wxNode *node = panel->GetChildren()->First();
-        while (node)
+    }
+}
+
+// If any resource ids were missing (or their symbol was missing),
+// repair them i.e. give them new ids. Returns TRUE if any resource
+// needed repairing.
+bool wxResourceManager::RepairResourceIds()
+{
+    bool repaired = FALSE;
+    
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
+    {
+        wxItemResource *res = (wxItemResource *)node->Data();
+        wxString resType(res->GetType());
+        if (resType == "wxDialog" || resType == "wxDialogBox" || resType == "wxPanel")
         {
-          wxControl *item = (wxControl *)node->Data();
-          if (item->IsKindOf(CLASSINFO(wxControl)))
-             {
-                    wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
-                    childHandler->SetEvtHandlerEnabled(FALSE);
-             childHandler->SelectItem(FALSE);
-                 }
-          node = node->Next();
+            
+            if ( (res->GetId() == 0) || ((res->GetId() > 0) && !m_symbolTable.IdExists(res->GetId())) )
+            {
+                wxString newSymbolName;
+                int newId = GenerateWindowId("ID_DIALOG", newSymbolName) ;
+                
+                if (res->GetId() == 0)
+                {
+                    res->SetId(newId);
+                    m_symbolTable.AddSymbol(newSymbolName, newId);
+                }
+                else
+                {
+                    m_symbolTable.AddSymbol(newSymbolName, res->GetId());
+                }
+                
+                repaired = TRUE;
+            }
+            
+            wxNode *node1 = res->GetChildren().First();
+            while (node1)
+            {
+                wxItemResource *child = (wxItemResource *)node1->Data();
+                
+                if ( (child->GetId() == 0) || ((child->GetId() > 0) && !m_symbolTable.IdExists(child->GetId())) )
+                {
+                    wxString newSymbolName;
+                    int newId = GenerateWindowId("ID_CONTROL", newSymbolName) ;
+                    
+                    if (child->GetId() == 0)
+                    {
+                        child->SetId(newId);
+                        m_symbolTable.AddSymbol(newSymbolName, newId);
+                    }
+                    else
+                    {
+                        m_symbolTable.AddSymbol(newSymbolName, child->GetId());
+                    }
+                    
+                    repaired = TRUE;
+                }
+                
+                node1 = node1->Next();
+            }
         }
-        panel->Refresh();
-      }
     }
-    node = resourceTable.Next();
-  }
+    return repaired;
 }
 
-// Ensures that all currently shown windows are saved to resources,
-// e.g. just before writing to a .wxr file.
-bool wxResourceManager::InstantiateAllResourcesFromWindows(void)
+
+// Deletes 'win' and creates a new window from the resource that
+// was associated with it. E.g. if you can't change properties on the
+// fly, you'll need to delete the window and create it again.
+wxWindow *wxResourceManager::RecreateWindowFromResource(wxWindow *win, wxWindowPropertyInfo *info, bool instantiateFirst)
 {
-  resourceTable.BeginFind();
-  wxNode *node;
-  while (node = resourceTable.Next())
-  {
-    wxItemResource *res = (wxItemResource *)node->Data();
-    wxString resType(res->GetType());
+    wxItemResource *resource = FindResourceForWindow(win);
+    
+    // Put the current window properties into the wxItemResource object
     
-    if (resType == "wxDialog")
+    wxWindowPropertyInfo *newInfo = NULL;
+    if (!info)
     {
-      wxWindow *win = (wxWindow *)FindWindowForResource(res);
-      if (win)
-        InstantiateResourceFromWindow(res, win, TRUE);
+        newInfo = CreatePropertyInfoForWindow(win);
+        info = newInfo;
     }
-    else if (resType == "wxPanel")
+    
+    // May not always want to copy values back from the resource
+    if (instantiateFirst)
+        info->InstantiateResource(resource);
+    
+    wxWindow *newWin = NULL;
+    wxWindow *parent = win->GetParent();
+    wxItemResource* parentResource = NULL;
+    if (parent)
+        parentResource = FindResourceForWindow(parent);
+    
+    if (win->IsKindOf(CLASSINFO(wxPanel)))
+    {
+        Edit(resource);
+        newWin = FindWindowForResource(resource);
+    }
+    else
     {
-      wxWindow *win = (wxWindow *)FindWindowForResource(res);
-      if (win)
-        InstantiateResourceFromWindow(res, win, TRUE);
+        DisassociateResource(resource);
+        if (win->GetEventHandler() != win)
+            win->PopEventHandler(TRUE);
+        
+        DeleteWindow(win);
+        newWin = m_resourceTable.CreateItem((wxPanel *)parent, resource, parentResource);
+        newWin->PushEventHandler(new wxResourceEditorControlHandler((wxControl*) newWin, (wxControl*) newWin));
+        AssociateResource(resource, newWin);
+        UpdateResourceList();
     }
-  }
-  return TRUE;  
+    
+    if (info)
+        info->SetPropertyWindow(newWin);
+    
+    if (newInfo)
+        delete newInfo;
+    
+    return newWin;
 }
 
-bool wxResourceManager::InstantiateResourceFromWindow(wxItemResource *resource, wxWindow *window, bool recurse)
+// Delete resource highlighted in the listbox
+bool wxResourceManager::DeleteSelection()
 {
-  wxWindowPropertyInfo *info = wxCreatePropertyInfoForWindow(window);
-  info->SetResource(resource);
-  info->InstantiateResource(resource);
-  delete info;
-  
-  if (recurse)
-  {
-    wxNode *node = resource->GetChildren().First();
+    int sel = m_editorResourceTree->GetSelection();
+    if (sel != 0)
+    {
+        wxResourceTreeData *data = (wxResourceTreeData *)m_editorResourceTree->GetItemData(sel);
+        wxItemResource *res = data->GetResource();
+        wxWindow *win = FindWindowForResource(res);
+        if (win)
+        {
+            DeleteResource(win);
+            DeleteWindow(win);
+            UpdateResourceList();
+            Modify(TRUE);
+        }
+        return TRUE;
+    }
+    
+    return FALSE;
+}
+
+// Delete resource highlighted in the listbox
+bool wxResourceManager::RecreateSelection()
+{
+    wxNode *node = GetSelections().First();
     while (node)
     {
-      wxItemResource *child = (wxItemResource *)node->Data();
-      wxWindow *childWindow = FindWindowForResource(child);
-      
-      if (!childWindow)
-      {
-        char buf[200];
-        sprintf(buf, "Could not find window %s", child->GetName());
-        wxMessageBox(buf, "Dialog Editor problem", wxOK);
-      }
-      else
-        InstantiateResourceFromWindow(child, childWindow, recurse);
-      node = node->Next();
-    }
-  }
-  
-  return TRUE;
+        wxControl *item = (wxControl *)node->Data();
+        wxResourceEditorControlHandler *childHandler = (wxResourceEditorControlHandler *)item->GetEventHandler();
+        wxNode *next = node->Next();
+        childHandler->SelectItem(FALSE);
+        
+        RemoveSelection(item);
+        
+        RecreateWindowFromResource(item);
+        
+        node = next;
+    }
+    return TRUE;
 }
 
+bool wxResourceManager::EditDialog(wxDialog *WXUNUSED(dialog), wxWindow *WXUNUSED(parent))
+{
+    return FALSE;
+}
 
-/*
- * Resource editor frame
- */
-wxResourceEditorFrame::wxResourceEditorFrame(wxResourceManager *resMan, wxFrame *parent, char *title,
-    int x, int y, int width, int height, long style, char *name):
-  wxFrame(parent, -1, title, wxPoint(x, y), wxSize(width, height), style, name)
+// Ensures that all currently shown windows are saved to resources,
+// e.g. just before writing to a .wxr file.
+bool wxResourceManager::InstantiateAllResourcesFromWindows()
 {
-  manager = resMan;
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
+    {
+        wxItemResource *res = (wxItemResource *)node->Data();
+        wxString resType(res->GetType());
+        
+        if (resType == "wxDialog")
+        {
+            wxWindow *win = (wxWindow *)FindWindowForResource(res);
+            if (win)
+                InstantiateResourceFromWindow(res, win, TRUE);
+        }
+        else if (resType == "wxPanel")
+        {
+            wxWindow *win = (wxWindow *)FindWindowForResource(res);
+            if (win)
+                InstantiateResourceFromWindow(res, win, TRUE);
+        }
+    }
+    return TRUE;  
 }
 
-wxResourceEditorFrame::~wxResourceEditorFrame(void)
+bool wxResourceManager::InstantiateResourceFromWindow(wxItemResource *resource, wxWindow *window, bool recurse)
 {
+    wxWindowPropertyInfo *info = CreatePropertyInfoForWindow(window);
+    info->SetResource(resource);
+    info->InstantiateResource(resource);
+    delete info;
+    
+    if (recurse)
+    {
+        wxNode *node = resource->GetChildren().First();
+        while (node)
+        {
+            wxItemResource *child = (wxItemResource *)node->Data();
+            wxWindow *childWindow = FindWindowForResource(child);
+            
+            if (!childWindow)
+            {
+                char buf[200];
+                sprintf(buf, "Could not find window %s", (const char*) child->GetName());
+                wxMessageBox(buf, "Dialog Editor problem", wxOK);
+            }
+            else
+                InstantiateResourceFromWindow(child, childWindow, recurse);
+            node = node->Next();
+        }
+    }
+    
+    return TRUE;
 }
 
-void wxResourceEditorFrame::OldOnMenuCommand(int cmd)
+// Create a window information object for the give window
+wxWindowPropertyInfo *wxResourceManager::CreatePropertyInfoForWindow(wxWindow *win)
 {
-  switch (cmd)
-  {
-    case wxID_NEW:
+    wxWindowPropertyInfo *info = NULL;
+    if (win->IsKindOf(CLASSINFO(wxScrollBar)))
     {
-      manager->New(FALSE);
-      break;
+        info = new wxScrollBarPropertyInfo(win);
     }
-    case RESED_NEW_DIALOG:
+    else if (win->IsKindOf(CLASSINFO(wxStaticBox)))
     {
-      manager->CreateNewDialog();
-      break;
+        info = new wxGroupBoxPropertyInfo(win);
     }
-    case RESED_NEW_PANEL:
+    else if (win->IsKindOf(CLASSINFO(wxCheckBox)))
     {
-      manager->CreateNewPanel();
-      break;
+        info = new wxCheckBoxPropertyInfo(win);
     }
-    case wxID_OPEN:
+    else if (win->IsKindOf(CLASSINFO(wxSlider)))
     {
-      manager->New(TRUE);
-      break;
+        info = new wxSliderPropertyInfo(win);
     }
-    case RESED_CLEAR:
+    else if (win->IsKindOf(CLASSINFO(wxGauge)))
     {
-      manager->Clear(TRUE, FALSE);
-      break;
+        info = new wxGaugePropertyInfo(win);
     }
-    case wxID_SAVE:
+    else if (win->IsKindOf(CLASSINFO(wxListBox)))
     {
-      manager->Save();
-      break;
+        info = new wxListBoxPropertyInfo(win);
     }
-    case wxID_SAVEAS:
+    else if (win->IsKindOf(CLASSINFO(wxRadioBox)))
     {
-      manager->SaveAs();
-      break;
+        info = new wxRadioBoxPropertyInfo(win);
     }
-    case wxID_EXIT:
+    else if (win->IsKindOf(CLASSINFO(wxRadioButton)))
     {
-         manager->Clear(TRUE, FALSE) ;
-      this->Close();
-      break;
+        info = new wxRadioButtonPropertyInfo(win);
     }
-    case wxID_ABOUT:
+    else if (win->IsKindOf(CLASSINFO(wxComboBox)))
     {
-      char buf[300];
-      sprintf(buf, "wxWindows Dialog Editor %.1f\nAuthor: Julian Smart J.Smart@ed.ac.uk\nJulian Smart (c) 1996", wxDIALOG_EDITOR_VERSION);
-      (void)wxMessageBox(buf, "About Dialog Editor", wxOK|wxCENTRE);
-      break;
+        info = new wxComboBoxPropertyInfo(win);
     }
-    case RESED_CONTENTS:
+    else if (win->IsKindOf(CLASSINFO(wxChoice)))
     {
-      wxBeginBusyCursor();
-      manager->GetHelpInstance()->LoadFile();
-      manager->GetHelpInstance()->DisplayContents();
-      wxEndBusyCursor();
-      break;
+        info = new wxChoicePropertyInfo(win);
     }
-    case RESED_DELETE:
+    else if (win->IsKindOf(CLASSINFO(wxBitmapButton)))
     {
-      manager->DeleteSelection();
-      break;
+        info = new wxBitmapButtonPropertyInfo(win);
     }
-    case RESED_RECREATE:
+    else if (win->IsKindOf(CLASSINFO(wxButton)))
     {
-      manager->RecreateSelection();
-      break;
+        info = new wxButtonPropertyInfo(win);
     }
-    case RESED_TOGGLE_TEST_MODE:
+    else if (win->IsKindOf(CLASSINFO(wxStaticBitmap)))
     {
-      manager->SetEditMode(!manager->GetEditMode());
-      break;
+        info = new wxStaticBitmapPropertyInfo(win);
+    }
+    else if (win->IsKindOf(CLASSINFO(wxStaticText)))
+    {
+        info = new wxStaticTextPropertyInfo(win);
+    }
+    else if (win->IsKindOf(CLASSINFO(wxTextCtrl)))
+    {
+        info = new wxTextPropertyInfo(win);
+    }
+    else if (win->IsKindOf(CLASSINFO(wxPanel)))
+    {
+        info = new wxPanelPropertyInfo(win);
+    }
+    else
+    {
+        info = new wxWindowPropertyInfo(win);
+    }
+    return info;
+}
+
+// Edit the given window
+void wxResourceManager::EditWindow(wxWindow *win)
+{
+    wxWindowPropertyInfo *info = CreatePropertyInfoForWindow(win);
+    if (info)
+    {
+        info->SetResource(FindResourceForWindow(win));
+        wxString str("Editing ");
+        str += win->GetClassInfo()->GetClassName();
+        str += ": ";
+        if (win->GetName() != "")
+            str += win->GetName();
+        else
+            str += "properties";
+        info->Edit(NULL, str);
     }
-    default:
-      break;
-  }
 }
 
-bool wxResourceEditorFrame::OnClose(void)
+// Generate a window id and a first stab at a name
+int wxResourceManager::GenerateWindowId(const wxString& prefix, wxString& idName)
 {
-  if (manager->Modified())
-  {
+    m_symbolIdCounter ++;
+    while (m_symbolTable.IdExists(m_symbolIdCounter))
+        m_symbolIdCounter ++;
+    
+    int nameId = m_symbolIdCounter;
+    
+    wxString str;
+    str.Printf("%d", nameId);
+    idName = prefix + str;
+    
+    while (m_symbolTable.SymbolExists(idName))
+    {
+        nameId ++;
+        str.Printf("%d", nameId);
+        idName = prefix + str;
+    }
+    
+    return m_symbolIdCounter;
+}
+
+
 /*
-    int ans = wxMessageBox("Save modified resource file?", "Dialog Editor", wxYES_NO | wxCANCEL);
-    if (ans == wxCANCEL)
-      return FALSE;
-    if (ans == wxYES)
-      if (!manager->SaveIfModified())
-        return FALSE;
+* Resource editor frame
 */
-  if (!manager->Clear(TRUE, FALSE))
-     return FALSE;
-  }
-    
-  if (!Iconized())
-  {
-    int w, h;
-    GetSize(&w, &h);
-    manager->resourceEditorWindowSize.width = w;
-    manager->resourceEditorWindowSize.height = h;
 
-    int x, y;
-    GetPosition(&x, &y);
+IMPLEMENT_CLASS(wxResourceEditorFrame, wxFrame)
+
+BEGIN_EVENT_TABLE(wxResourceEditorFrame, wxFrame)
+EVT_MENU(wxID_NEW, wxResourceEditorFrame::OnNew)
+EVT_MENU(RESED_NEW_DIALOG, wxResourceEditorFrame::OnNewDialog)
+EVT_MENU(wxID_OPEN, wxResourceEditorFrame::OnOpen)
+EVT_MENU(RESED_CLEAR, wxResourceEditorFrame::OnClear)
+EVT_MENU(wxID_SAVE, wxResourceEditorFrame::OnSave)
+EVT_MENU(wxID_SAVEAS, wxResourceEditorFrame::OnSaveAs)
+EVT_MENU(wxID_EXIT, wxResourceEditorFrame::OnExit)
+EVT_MENU(wxID_ABOUT, wxResourceEditorFrame::OnAbout)
+EVT_MENU(RESED_CONTENTS, wxResourceEditorFrame::OnContents)
+EVT_MENU(RESED_DELETE, wxResourceEditorFrame::OnDeleteSelection)
+EVT_MENU(RESED_RECREATE, wxResourceEditorFrame::OnRecreateSelection)
+EVT_MENU(RESED_TEST, wxResourceEditorFrame::OnTest)
+EVT_MENU(RESED_CONVERT_WXRS, wxResourceEditorFrame::OnConvertWXRs)
+EVT_CLOSE(wxResourceEditorFrame::OnCloseWindow)
+END_EVENT_TABLE()
 
-    manager->resourceEditorWindowSize.x = x;
-    manager->resourceEditorWindowSize.y = y;
-  }
-  manager->SetEditorFrame(NULL);
-  manager->SetEditorToolBar(NULL);
-  manager->SetEditorPalette(NULL);
+wxResourceEditorFrame::wxResourceEditorFrame(wxResourceManager *resMan, wxFrame *parent, const wxString& title,
+                                             const wxPoint& pos, const wxSize& size, long style, const wxString& name):
+wxFrame(parent, -1, title, pos, size, style, name)
+{
+    manager = resMan;
+}
 
-  return TRUE;
+wxResourceEditorFrame::~wxResourceEditorFrame()
+{
 }
 
-/*
- * Resource editor panel
- */
-wxResourceEditorPanel::wxResourceEditorPanel(wxWindow *parent, int x, int y, int width, int height,
-    long style, char *name):
-  wxPanel(parent, -1, wxPoint(x, y), wxSize(width, height), style, name)
+void wxResourceEditorFrame::OnConvertWXRs(wxCommandEvent& WXUNUSED(event))
 {
+      manager->ConvertWXRs();
 }
 
-wxResourceEditorPanel::~wxResourceEditorPanel(void)
+void wxResourceEditorFrame::OnNew(wxCommandEvent& WXUNUSED(event))
 {
+    manager->New(FALSE);
 }
 
-void wxResourceEditorPanel::OnDefaultAction(wxControl *item)
+void wxResourceEditorFrame::OnNewDialog(wxCommandEvent& WXUNUSED(event))
 {
-  wxResourceEditorFrame *frame = (wxResourceEditorFrame *)GetParent();
-  wxResourceManager *manager = frame->manager;
+    manager->CreateNewPanel();
+}
 
-  if (item == manager->GetEditorResourceList())
-  {
-    manager->EditSelectedResource();
-  }
+void wxResourceEditorFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
+{
+    manager->New(TRUE);
 }
 
-// Popup menu callback
-void ObjectMenuProc(wxMenu& menu, wxCommandEvent& event)
+void wxResourceEditorFrame::OnClear(wxCommandEvent& WXUNUSED(event))
 {
-  wxWindow *data = (wxWindow *)menu.GetClientData();
-  if (!data)
-    return;
+    manager->Clear(TRUE, FALSE);
+}
 
-  switch (event.GetInt())
-  {
-    case OBJECT_MENU_EDIT:
+void wxResourceEditorFrame::OnSave(wxCommandEvent& WXUNUSED(event))
+{
+    manager->Save();
+}
+
+void wxResourceEditorFrame::OnSaveAs(wxCommandEvent& WXUNUSED(event))
+{
+    manager->SaveAs();
+}
+
+void wxResourceEditorFrame::OnExit(wxCommandEvent& WXUNUSED(event))
+{
+    manager->Clear(TRUE, FALSE) ;
+    this->Destroy();
+}
+
+void wxResourceEditorFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
+{
+    char buf[300];
+    sprintf(buf, "wxWindows Dialog Editor %.1f\n(c) Julian Smart 1996-1999", wxDIALOG_EDITOR_VERSION);
+    wxMessageBox(buf, "About Dialog Editor", wxOK|wxCENTRE);
+}
+
+void wxResourceEditorFrame::OnTest(wxCommandEvent& WXUNUSED(event))
+{
+    manager->TestCurrentDialog(this);
+}
+
+void wxResourceEditorFrame::OnContents(wxCommandEvent& WXUNUSED(event))
+{
+#ifdef __WXMSW__
+    wxBeginBusyCursor();
+    manager->GetHelpController()->LoadFile();
+    manager->GetHelpController()->DisplayContents();
+    wxEndBusyCursor();
+#endif
+}
+
+void wxResourceEditorFrame::OnDeleteSelection(wxCommandEvent& WXUNUSED(event))
+{
+    manager->DeleteSelection();
+}
+
+void wxResourceEditorFrame::OnRecreateSelection(wxCommandEvent& WXUNUSED(event))
+{
+    manager->RecreateSelection();
+}
+
+void wxResourceEditorFrame::OnCloseWindow(wxCloseEvent& event)
+{
+    wxPropertyInfo::CloseWindow();
+    manager->ClearCurrentDialog();
+    if (manager->Modified())
     {
-      wxResourceEditWindow(data);
-      break;
+        if (!manager->Clear(TRUE, FALSE))
+        {
+            event.Veto();
+            return;
+        }
     }
-    case OBJECT_MENU_DELETE:
+    
+    if (!IsIconized())
     {
-      wxResourceManager::currentResourceManager->DeleteResource(data);
-      break;
+        int w, h;
+        GetSize(&w, &h);
+        manager->m_resourceEditorWindowSize.width = w;
+        manager->m_resourceEditorWindowSize.height = h;
+        
+        int x, y;
+        GetPosition(&x, &y);
+        
+        manager->m_resourceEditorWindowSize.x = x;
+        manager->m_resourceEditorWindowSize.y = y;
     }
-    default:
-      break;
-  }
+    manager->SetEditorFrame(NULL);
+    manager->SetEditorToolBar(NULL);
+    
+    this->Destroy();
+}
+
+/*
+* Resource editor window that contains the dialog/panel being edited
+*/
+
+BEGIN_EVENT_TABLE(wxResourceEditorScrolledWindow, wxScrolledWindow)
+EVT_PAINT(wxResourceEditorScrolledWindow::OnPaint)
+END_EVENT_TABLE()
+
+wxResourceEditorScrolledWindow::wxResourceEditorScrolledWindow(wxWindow *parent, const wxPoint& pos, const wxSize& size,
+                                                               long style):
+wxScrolledWindow(parent, -1, pos, size, style)
+{
+    m_marginX = 10;
+    m_marginY = 40;
+    m_childWindow = NULL;
+    
+    SetBackgroundColour(* wxWHITE);
+}
+
+wxResourceEditorScrolledWindow::~wxResourceEditorScrolledWindow()
+{
+}
+
+void wxResourceEditorScrolledWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
+{
+    wxPaintDC dc(this);
+    
+    DrawTitle(dc);
+}
+
+void wxResourceEditorScrolledWindow::DrawTitle(wxDC& dc)
+{
+    if (m_childWindow)
+    {
+        wxItemResource* res = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(m_childWindow);
+        if (res)
+        {
+            wxString str(res->GetTitle());
+            int x, y;
+            GetViewStart(& x, & y);
+            
+            wxFont font(10, wxSWISS, wxNORMAL, wxBOLD);
+            dc.SetFont(font);
+            dc.SetBackgroundMode(wxTRANSPARENT);
+            dc.SetTextForeground(wxColour(0, 0, 0));
+            
+            long w, h;
+            dc.GetTextExtent(str, & w, & h);
+            
+            dc.DrawText(str, m_marginX + (- x * 10), m_marginY + (- y * 10) - h - 5);
+        }
+    }
+}
+
+/*
+* Main toolbar
+*
+*/
+
+BEGIN_EVENT_TABLE(EditorToolBar, wxToolBar)
+//     EVT_PAINT(EditorToolBar::OnPaint)
+END_EVENT_TABLE()
+
+EditorToolBar::EditorToolBar(wxFrame *frame, const wxPoint& pos, const wxSize& size,
+                             long style):
+wxToolBar(frame, -1, pos, size, style)
+{
 }
 
-wxWindowPropertyInfo *wxCreatePropertyInfoForWindow(wxWindow *win)
+bool EditorToolBar::OnLeftClick(int toolIndex, bool WXUNUSED(toggled))
 {
-  wxWindowPropertyInfo *info = NULL;
-  if (win->IsKindOf(CLASSINFO(wxScrollBar)))
+    wxResourceManager *manager = wxResourceManager::GetCurrentResourceManager();
+    
+    switch (toolIndex)
+    {
+    case TOOLBAR_LOAD_FILE:
+        {
+            manager->New(TRUE);
+            break;
+        }
+    case TOOLBAR_NEW:
+        {
+            manager->CreateNewPanel();
+            break;
+        }
+    case TOOLBAR_SAVE_FILE:
+        {
+            manager->Save();
+            break;
+        }
+    case TOOLBAR_HELP:
         {
-          info = new wxScrollBarPropertyInfo(win);
+#ifdef __WXMSW__
+            wxBeginBusyCursor();
+            manager->GetHelpController()->DisplayContents();
+            wxEndBusyCursor();
+#endif
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxStaticBox)))
+    case TOOLBAR_FORMAT_HORIZ:
         {
-          info = new wxGroupBoxPropertyInfo(win);
+            manager->AlignItems(TOOLBAR_FORMAT_HORIZ);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxCheckBox)))
+    case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN:
         {
-          info = new wxCheckBoxPropertyInfo(win);
+            manager->AlignItems(TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxSlider)))
+    case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN:
         {
-          info = new wxSliderPropertyInfo(win);
+            manager->AlignItems(TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxGauge)))
+    case TOOLBAR_FORMAT_VERT:
         {
-          info = new wxGaugePropertyInfo(win);
+            manager->AlignItems(TOOLBAR_FORMAT_VERT);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxListBox)))
+    case TOOLBAR_FORMAT_VERT_TOP_ALIGN:
         {
-          info = new wxListBoxPropertyInfo(win);
+            manager->AlignItems(TOOLBAR_FORMAT_VERT_TOP_ALIGN);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxRadioBox)))
+    case TOOLBAR_FORMAT_VERT_BOT_ALIGN:
         {
-          info = new wxRadioBoxPropertyInfo(win);
+            manager->AlignItems(TOOLBAR_FORMAT_VERT_BOT_ALIGN);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxChoice)))
+    case TOOLBAR_COPY_SIZE:
         {
-          info = new wxChoicePropertyInfo(win);
+            manager->CopySize(TOOLBAR_COPY_SIZE);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxButton)))
+    case TOOLBAR_COPY_WIDTH:
         {
-          info = new wxButtonPropertyInfo(win);
-/*
-          if (((wxButton *)win)->IsBitmap())
-            ((wxButtonPropertyInfo *)info)->isBitmapButton = TRUE;
-*/
+            manager->CopySize(TOOLBAR_COPY_WIDTH);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxStaticText)))
+    case TOOLBAR_COPY_HEIGHT:
         {
-          info = new wxStaticTextPropertyInfo(win);
-/*
-          if (((wxMessage *)win)->IsBitmap())
-            ((wxMessagePropertyInfo *)info)->isBitmapMessage = TRUE;
-*/
+            manager->CopySize(TOOLBAR_COPY_HEIGHT);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxTextCtrl)))
+    case TOOLBAR_DISTRIBUTE_HORIZ:
         {
-          info = new wxTextPropertyInfo(win);
+            manager->DistributePositions(TOOLBAR_DISTRIBUTE_HORIZ);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxDialog)))
+    case TOOLBAR_DISTRIBUTE_VERT:
         {
-          info = new wxDialogPropertyInfo(win);
+            manager->DistributePositions(TOOLBAR_DISTRIBUTE_VERT);
+            break;
         }
-  else if (win->IsKindOf(CLASSINFO(wxPanel)))
+    case TOOLBAR_TO_BACK:
         {
-          info = new wxPanelPropertyInfo(win);
+            manager->ToBackOrFront(TRUE);
+            break;
         }
-  else
+    case TOOLBAR_TO_FRONT:
         {
-          info = new wxWindowPropertyInfo(win);
+            manager->ToBackOrFront(FALSE);
+            break;
         }
-  return info;
+    default:
+        break;
+    }
+    return TRUE;
+}
+
+void EditorToolBar::OnMouseEnter(int toolIndex)
+{
+    wxFrame *frame = (wxFrame *)GetParent();
+    
+    if (!frame) return;
+    
+    if (toolIndex > -1)
+    {
+        switch (toolIndex)
+        {
+        case TOOLBAR_LOAD_FILE:
+            frame->SetStatusText("Load project file");
+            break;
+        case TOOLBAR_SAVE_FILE:
+            frame->SetStatusText("Save project file");
+            break;
+        case TOOLBAR_NEW:
+            frame->SetStatusText("Create a new resource");
+            break;
+        case TOOLBAR_FORMAT_HORIZ:
+            frame->SetStatusText("Align items horizontally");
+            break;
+        case TOOLBAR_FORMAT_VERT:
+            frame->SetStatusText("Align items vertically");
+            break;
+        case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN:
+            frame->SetStatusText("Left-align items");
+            break;
+        case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN:
+            frame->SetStatusText("Right-align items");
+            break;
+        case TOOLBAR_FORMAT_VERT_TOP_ALIGN:
+            frame->SetStatusText("Top-align items");
+            break;
+        case TOOLBAR_FORMAT_VERT_BOT_ALIGN:
+            frame->SetStatusText("Bottom-align items");
+            break;
+        case TOOLBAR_COPY_SIZE:
+            frame->SetStatusText("Copy size from first selection");
+            break;
+        case TOOLBAR_TO_FRONT:
+            frame->SetStatusText("Put image to front");
+            break;
+        case TOOLBAR_TO_BACK:
+            frame->SetStatusText("Put image to back");
+            break;
+        case TOOLBAR_HELP:
+            frame->SetStatusText("Display help contents");
+            break;
+        default:
+            break;
+        }
+    }
+    else frame->SetStatusText("");
 }
 
-// Popup menu callback
-void wxResourceEditWindow(wxWindow *win)
+bool ResourceEditorDialogTester::ProcessEvent(wxEvent& event)
 {
-  wxWindowPropertyInfo *info = wxCreatePropertyInfoForWindow(win);
-  if (info)
-  {
-    info->SetResource(wxResourceManager::currentResourceManager->FindResourceForWindow(win));
-    wxString str("Editing ");
-    str += win->GetClassInfo()->GetClassName();
-    str += ": ";
-    if (win->GetName() != "")
-        str += win->GetName();
+    if (event.IsCommandEvent() && event.GetId() != wxID_OK && event.GetId() != wxID_CANCEL)
+    {
+        // Do nothing
+        return TRUE;
+    }
     else
-        str += "properties";
-    info->Edit(NULL, WXSTRINGCAST str);
-    delete info;
-  }
+        return wxDialog::ProcessEvent(event);
 }
 
-/*
- * Main toolbar
- *
- */
-
-#if defined(__WINDOWS__) && defined(__WIN95__)
-BEGIN_EVENT_TABLE(EditorToolBar, wxToolBar95)
-#elif defined(__WINDOWS__)
-BEGIN_EVENT_TABLE(EditorToolBar, wxToolBarMSW)
-#else
-BEGIN_EVENT_TABLE(EditorToolBar, wxToolBarSimple)
-#endif
-       EVT_PAINT(EditorToolBar::OnPaint)
-END_EVENT_TABLE()
+static int gs_LabelInsertionCount = 0;
 
-EditorToolBar::EditorToolBar(wxFrame *frame, int x, int y, int w, int h,
-            long style, int direction, int RowsOrColumns):
-#if defined(__WINDOWS__) && defined(__WIN95__)
-  wxToolBar95(frame, -1, wxPoint(x, y), wxSize(w, h), style, direction, RowsOrColumns)
-#elif defined(__WINDOWS__)
-  wxToolBarMSW(frame, -1, wxPoint(x, y), wxSize(w, h), style, direction, RowsOrColumns)
-#else
-  wxToolBarSimple(frame, -1, wxPoint(x, y), wxSize(w, h), style, direction, RowsOrColumns)
-#endif
+// Convert old WXRs to new
+bool wxResourceManager::ConvertWXRs()
 {
+    gs_LabelInsertionCount = 0;
+    m_symbolIdCounter = 20000;
+
+    wxString currentPath = wxGetCwd();
+    wxString oldWXRPath, newWXRPath;
+
+    wxDirDialog dialog(NULL, wxT("Choose directory for old WXRs"), currentPath);
+
+    if (dialog.ShowModal() == wxID_OK)
+    {
+        oldWXRPath = dialog.GetPath();
+    }
+    else
+        return FALSE;
+
+    wxDirDialog dialog2(NULL, wxT("Choose directory for new WXRs"), oldWXRPath);
+
+    if (dialog2.ShowModal() == wxID_OK)
+    {
+        newWXRPath = dialog2.GetPath();
+    }
+    else
+        return FALSE;
+
+    if (newWXRPath == oldWXRPath)
+    {
+        wxMessageBox(wxT("Sorry, the directories must be different."));
+        return FALSE;
+    }
+
+    wxDir dir(oldWXRPath);
+    if (!dir.IsOpened())
+        return FALSE;
+
+    wxArrayString stringArray;
+
+    wxString filename;
+    bool ok = dir.GetFirst(& filename, wxT("*.wxr"));
+    while (ok)
+    {
+        stringArray.Add(filename);
+
+        ok = dir.GetNext(& filename);
+    }
+
+    // Pop up a progress dialog
+    wxProgressDialog progressDialog(wxT("Converting WXR files"), wxT("Converting files..."));
+
+    size_t i;
+    for (i = 0; i < stringArray.Count(); i++)
+    {
+        progressDialog.Update((int) (100.0 * ((double) i / (double) stringArray.Count())));
+
+        filename = stringArray[i];
+        wxString oldPath = oldWXRPath + wxString(wxFILE_SEP_PATH) + filename;
+        wxString newPath = newWXRPath + wxString(wxFILE_SEP_PATH) + filename;
+
+        DoConvertWXR(oldPath, newPath);
+    }
+
+    wxString msg;
+    msg.Printf(wxT("Dialog Editor inserted %d labels."), gs_LabelInsertionCount);
+    wxMessageBox(msg);
+
+    return TRUE;
 }
 
-bool EditorToolBar::OnLeftClick(int toolIndex, bool toggled)
+bool wxResourceManager::DoConvertWXR(const wxString& oldPath, const wxString& newPath)
 {
-  wxResourceManager *manager = wxResourceManager::currentResourceManager;
+
+    if (!Clear(TRUE, FALSE))
+        return FALSE;
+    
+    m_symbolTable.AddStandardSymbols();
+
+    if (!m_resourceTable.ParseResourceFile(oldPath))
+    {
+        wxString msg;
+        msg.Printf(wxT("Could not read file %s"), (const char*) oldPath);
+        wxMessageBox(msg, "Resource file load error", wxOK | wxICON_EXCLAMATION);
+        return FALSE;
+    }
+    m_currentFilename = oldPath;
+
+    //SetFrameTitle(m_currentFilename);
+
+    //UpdateResourceList();
+
+    // Construct include filename from this file
+    m_symbolFilename = m_currentFilename;
+
+    wxStripExtension(m_symbolFilename);
+    m_symbolFilename += wxT(".h");
+
+    if (!m_symbolTable.ReadIncludeFile(m_symbolFilename))
+    {
+    }
+    else
+    {
+        // Set the id counter to the last known id
+        m_symbolIdCounter = m_symbolTable.FindHighestId();
+    }
+
+    // Now check in case some (or all) resources don't have resource ids, or they
+    // don't match the .h file, or something of that nature.
+    bool altered = RepairResourceIds();
+
+    // Do any necessary changes to the resources
+    m_resourceTable.BeginFind();
+    wxNode *node;
+    while ((node = m_resourceTable.Next()))
+    {
+        wxItemResource *res = (wxItemResource *)node->Data();
+        ChangeOldToNewResource(NULL, res);
+    }
+
+    // Change the filename before saving
+
+    m_currentFilename = newPath;
+    m_symbolFilename = m_currentFilename;
+    wxStripExtension(m_symbolFilename);
+    m_symbolFilename += wxT(".h");
+
+    Modify(TRUE);
+
+    Save();
+
+    Clear(TRUE, TRUE);
+
+    return TRUE;
+
+}
+
+bool wxResourceManager::ChangeOldToNewResource(wxItemResource* parent, wxItemResource* res)
+{
+    // Change these according to your needs
+
+    // Change all fonts to use system defaults for fonts, colours etc.
+    static bool s_useSystemDefaultsAlways = FALSE; // TRUE;
+
+    // Increase dialog height by this amount (wxWin 2 uses dialog client size now)
+    static int s_increaseDialogSize = -18;
+
+    // How many points to decrease the font sizes by, since
+    // wxWin 2 fonts are larger in Windows
+    static int s_decreaseFontSize = 3;
+
+    wxString itemType(res->GetType());
+
+    wxFont font = res->GetFont();
+
+    if ((s_decreaseFontSize) > 0 && font.Ok())
+    {
+        wxFont newFont = wxFont(font.GetPointSize() - s_decreaseFontSize,
+                        font.GetFamily(), font.GetStyle(), font.GetWeight(),
+                        font.GetUnderlined(), font.GetFaceName());
+        res->SetFont(newFont);
+    }
   
-  switch (toolIndex)
-  {
-    case TOOLBAR_LOAD_FILE:
+    if (itemType == wxT("wxDialogBox") || itemType == wxT("wxDialog") || itemType == wxT("wxPanel"))
     {
-      manager->New(TRUE);
-      break;
+        if (itemType == wxT("wxDialogBox"))
+            res->SetType(wxT("wxDialog"));
+
+        if (itemType == wxT("wxDialogBox") || itemType == wxT("wxDialog"))
+        {
+            // Only change the height if it has a caption, i.e. it's going to be
+            // used as a proper dialog and not a panel
+            if (res->GetStyle() & wxCAPTION)
+                res->SetSize(res->GetX(), res->GetY(), res->GetWidth(), res->GetHeight() + s_increaseDialogSize );
+        }
+
+        if (s_useSystemDefaultsAlways)
+            res->SetResourceStyle(res->GetResourceStyle() | wxRESOURCE_USE_DEFAULTS);
+
+        if (res->GetValue1())
+            res->SetStyle(res->GetStyle() | wxDIALOG_MODAL);
+
+        wxNode *node = res->GetChildren().First();
+        while (node)
+        {
+            wxItemResource *child = (wxItemResource *)node->Data();
+        
+            ChangeOldToNewResource(res, child);
+            node = node->Next();
+        }
     }
-    case TOOLBAR_NEW:
+    else if (itemType == wxT("wxMessage"))
     {
-      manager->New(FALSE);
-      break;
+        // Figure out if this is a bitmap or text message
+        if (res->GetValue4().IsEmpty())
+            res->SetType(wxT("wxStaticText"));
+        else
+            res->SetType(wxT("wxStaticBitmap"));
     }
-    case TOOLBAR_SAVE_FILE:
+    else if (itemType == wxT("wxButton"))
     {
-      manager->Save();
-      break;
+        // Figure out if this is a bitmap or text message
+        if (res->GetValue4().IsEmpty())
+        {
+        }
+        else
+            res->SetType(wxT("wxBitmapButton"));
     }
-    case TOOLBAR_HELP:
+    else if (itemType == wxT("wxGroupBox"))
     {
-      wxBeginBusyCursor();
-      manager->GetHelpInstance()->LoadFile();
-      manager->GetHelpInstance()->DisplayContents();
-      wxEndBusyCursor();
-      break;
+        res->SetType(wxT("wxStaticBox"));
     }
-    case TOOLBAR_FORMAT_HORIZ:
+    else if (itemType == wxT("wxText"))
     {
-      manager->AlignItems(TOOLBAR_FORMAT_HORIZ);
-      break;
+        res->SetType(wxT("wxTextCtrl"));
     }
-    case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN:
+    else if (itemType == wxT("wxMultiText"))
     {
-      manager->AlignItems(TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN);
-      break;
+        res->SetType(wxT("wxTextCtrl"));
+        res->SetStyle(res->GetStyle() | wxTE_MULTILINE);
     }
-    case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN:
+
+    itemType = res->GetType();
+
+    if (!res->GetTitle().IsEmpty() &&
+        (itemType == wxT("wxTextCtrl") || itemType == wxT("wxChoice") ||
+         itemType == wxT("wxComboBox") || itemType == wxT("wxGauge") ||
+         itemType == wxT("wxListBox")))
     {
-      manager->AlignItems(TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN);
-      break;
+        // Insert a label control resource, adjusting the size of this
+        // resource accordingly.
+        InsertLabelResource(parent, res);
     }
-    case TOOLBAR_FORMAT_VERT:
+
+    return TRUE;
+}
+
+// Insert a label control resource, adjusting the size of this
+// resource accordingly.
+bool wxResourceManager::InsertLabelResource(wxItemResource* parent, wxItemResource* res)
+{
+    gs_LabelInsertionCount ++;
+
+    bool isHorizontal = TRUE;
+
+    // Determine panel orientation
+    if (parent->GetResourceStyle() & wxRESOURCE_VERTICAL_LABEL)
     {
-      manager->AlignItems(TOOLBAR_FORMAT_VERT);
-      break;
+        isHorizontal = FALSE;
     }
-    case TOOLBAR_FORMAT_VERT_TOP_ALIGN:
+    else if (parent->GetResourceStyle() & wxRESOURCE_HORIZONTAL_LABEL)
     {
-      manager->AlignItems(TOOLBAR_FORMAT_VERT_TOP_ALIGN);
-      break;
+        isHorizontal = TRUE;
     }
-    case TOOLBAR_FORMAT_VERT_BOT_ALIGN:
+
+    // Now override
+    if (res->GetResourceStyle() & wxRESOURCE_VERTICAL_LABEL)
     {
-      manager->AlignItems(TOOLBAR_FORMAT_VERT_BOT_ALIGN);
-      break;
+        isHorizontal = FALSE;
     }
-    case TOOLBAR_COPY_SIZE:
+    else if (res->GetResourceStyle() & wxRESOURCE_HORIZONTAL_LABEL)
     {
-      manager->CopySize();
-      break;
+        isHorizontal = TRUE;
     }
-    case TOOLBAR_TO_BACK:
+
+    int x = res->GetX();
+    int y = res->GetY();
+    int width = res->GetWidth();
+    int height = res->GetHeight();
+
+    // Find the font specified
+    wxFont font;
+    if (res->GetFont().Ok())
+        font = res->GetFont();
+    else
+        font = parent->GetFont();
+
+    if (!font.Ok() || (parent->GetResourceStyle() & wxRESOURCE_USE_DEFAULTS))
+        font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+
+    int labelX, labelY;
+    wxCoord labelWidth, labelHeight;
+    wxScreenDC dc;
+    dc.SetFont(font);
+    dc.GetTextExtent(res->GetTitle(), & labelWidth, & labelHeight);
+
+    // Vert/horizontal margin between controls
+    int margin = 3;
+
+    labelX = x;
+    labelY = y;
+    //labelWidth += 1;
+    //labelHeight += 1;
+
+    if (isHorizontal)
     {
-      manager->ToBackOrFront(TRUE);
-      break;
+        x += labelWidth + margin;
+        width -= (labelWidth + margin);
     }
-    case TOOLBAR_TO_FRONT:
+    else
     {
-      manager->ToBackOrFront(FALSE);
-      break;
+        y += labelHeight + margin;
+        height -= (labelHeight + margin);
+
+        // Fudge factors
+        if (res->GetType() == wxT("wxTextCtrl"))
+        {
+            height += 3;
+        }
+        else if (res->GetType() == wxT("wxChoice") || res->GetType() == wxT("wxComboBox"))
+        {
+            height -= 4;
+        }
     }
-    default:
-      break;
-  }
-  return TRUE;
-}
 
-void EditorToolBar::OnMouseEnter(int toolIndex)
-{
-  wxFrame *frame = (wxFrame *)GetParent();
-  
-  if (!frame) return;
-  
-  if (toolIndex > -1)
-  {
-      switch (toolIndex)
-      {
-        case TOOLBAR_LOAD_FILE:
-          frame->SetStatusText("Load project file");
-          break;
-        case TOOLBAR_SAVE_FILE:
-          frame->SetStatusText("Save project file");
-          break;
-        case TOOLBAR_NEW:
-          frame->SetStatusText("Create a new resource");
-          break;
-        case TOOLBAR_FORMAT_HORIZ:
-          frame->SetStatusText("Align items horizontally");
-          break;
-        case TOOLBAR_FORMAT_VERT:
-          frame->SetStatusText("Align items vertically");
-          break;
-        case TOOLBAR_FORMAT_HORIZ_LEFT_ALIGN:
-          frame->SetStatusText("Left-align items");
-          break;
-        case TOOLBAR_FORMAT_HORIZ_RIGHT_ALIGN:
-          frame->SetStatusText("Right-align items");
-          break;
-        case TOOLBAR_FORMAT_VERT_TOP_ALIGN:
-          frame->SetStatusText("Top-align items");
-          break;
-        case TOOLBAR_FORMAT_VERT_BOT_ALIGN:
-          frame->SetStatusText("Bottom-align items");
-          break;
-        case TOOLBAR_COPY_SIZE:
-          frame->SetStatusText("Copy size from first selection");
-          break;
-        case TOOLBAR_TO_FRONT:
-          frame->SetStatusText("Put image to front");
-          break;
-        case TOOLBAR_TO_BACK:
-          frame->SetStatusText("Put image to back");
-          break;
-        case TOOLBAR_HELP:
-          frame->SetStatusText("Display help contents");
-          break;
-        default:
-          break;
-      }
-  }
-  else frame->SetStatusText("");
-}
+    res->SetSize(x, y, width, height);
 
-void EditorToolBar::OnPaint(wxPaintEvent& event)
-{
-#if defined(__WINDOWS__) && defined(__WIN95__)
-  wxToolBar95::OnPaint(event);
-#elif defined(__WINDOWS__)
-  wxToolBarMSW::OnPaint(event);
-#else
-  wxToolBarSimple::OnPaint(event);
-#endif
+    wxItemResource* staticItem = new wxItemResource;
+    staticItem->SetSize(labelX, labelY, labelWidth, labelHeight);
+    staticItem->SetTitle(res->GetTitle());
+    staticItem->SetFont(font);
+    staticItem->SetStyle(0);
+    staticItem->SetType(wxT("wxStaticText"));
 
-  wxPaintDC dc(this);
-  int w, h;
-  GetSize(&w, &h);
-  dc.SetPen(wxBLACK_PEN);
-  dc.SetBrush(wxTRANSPARENT_BRUSH);
-  dc.DrawLine(0, h-1, w, h-1);
-}
+    wxString newSymbolName;
+    int newId = GenerateWindowId(wxT("ID_STATICTEXT"), newSymbolName) ;
+    staticItem->SetId(newId);
 
-/*
- * Frame for editing a panel in
- */
-bool DialogEditorPanelFrame::OnClose(void)
-{
-  wxWindow *child = (wxWindow *)GetChildren()->First()->Data();
-  wxEvtHandler *handler = child->GetEventHandler();
-  return handler->OnClose();
+    newSymbolName = res->GetName() + wxT("_Label");
+    staticItem->SetName(newSymbolName);
+    m_symbolTable.AddSymbol(newSymbolName, newId);
+
+    wxNode* node = parent->GetChildren().Member(res);
+
+    wxASSERT( (node != NULL) );
+
+    parent->GetChildren().Insert(node, staticItem);
+
+    // Remove the title from this resource since we've replaced it
+    // with a static text control
+    res->SetTitle(wxEmptyString);
+
+    return TRUE;
 }