1///////////////////////////////////////////////////////////////////////////// 2// Name: src/xrc/xh_propdlg.cpp 3// Purpose: XRC resource handler for wxPropertySheetDialog 4// Author: Sander Berents 5// Created: 2007/07/12 6// RCS-ID: $Id: xh_propdlg.cpp 48088 2007-08-15 11:43:32Z VZ $ 7// Copyright: (c) 2007 Sander Berents 8// Licence: wxWindows licence 9///////////////////////////////////////////////////////////////////////////// 10 11// For compilers that support precompilation, includes "wx.h". 12#include "wx/wxprec.h" 13 14#ifdef __BORLANDC__ 15 #pragma hdrstop 16#endif 17 18#if wxUSE_XRC && wxUSE_BOOKCTRL 19 20#include "wx/xrc/xh_propdlg.h" 21 22#ifndef WX_PRECOMP 23 #include "wx/log.h" 24 #include "wx/sizer.h" 25 #include "wx/frame.h" 26#endif 27 28#include "wx/bookctrl.h" 29#include "wx/propdlg.h" 30#include "wx/imaglist.h" 31 32IMPLEMENT_DYNAMIC_CLASS(wxPropertySheetDialogXmlHandler, wxXmlResourceHandler) 33 34wxPropertySheetDialogXmlHandler::wxPropertySheetDialogXmlHandler() 35 :wxXmlResourceHandler(), 36 m_isInside(false), 37 m_dialog(NULL) 38{ 39 XRC_ADD_STYLE(wxSTAY_ON_TOP); 40 XRC_ADD_STYLE(wxCAPTION); 41 XRC_ADD_STYLE(wxDEFAULT_DIALOG_STYLE); 42 XRC_ADD_STYLE(wxSYSTEM_MENU); 43 XRC_ADD_STYLE(wxRESIZE_BORDER); 44 XRC_ADD_STYLE(wxCLOSE_BOX); 45 XRC_ADD_STYLE(wxDIALOG_NO_PARENT); 46 47 XRC_ADD_STYLE(wxTAB_TRAVERSAL); 48 XRC_ADD_STYLE(wxWS_EX_VALIDATE_RECURSIVELY); 49 XRC_ADD_STYLE(wxDIALOG_EX_METAL); 50 XRC_ADD_STYLE(wxMAXIMIZE_BOX); 51 XRC_ADD_STYLE(wxMINIMIZE_BOX); 52 XRC_ADD_STYLE(wxFRAME_SHAPED); 53 XRC_ADD_STYLE(wxDIALOG_EX_CONTEXTHELP); 54 55 AddWindowStyles(); 56} 57 58wxObject *wxPropertySheetDialogXmlHandler::DoCreateResource() 59{ 60 if (m_class == wxT("propertysheetpage")) 61 { 62 wxXmlNode *n = GetParamNode(wxT("object")); 63 64 if (!n) n = GetParamNode(wxT("object_ref")); 65 66 if (n) 67 { 68 wxBookCtrlBase *bookctrl = m_dialog->GetBookCtrl(); 69 bool old_ins = m_isInside; 70 m_isInside = false; 71 wxObject *item = CreateResFromNode(n, bookctrl, NULL); 72 m_isInside = old_ins; 73 wxWindow *wnd = wxDynamicCast(item, wxWindow); 74 75 if (wnd) 76 { 77 bookctrl->AddPage(wnd, GetText(wxT("label")), GetBool(wxT("selected"))); 78 if (HasParam(wxT("bitmap"))) 79 { 80 wxBitmap bmp = GetBitmap(wxT("bitmap"), wxART_OTHER); 81 wxImageList *imgList = bookctrl->GetImageList(); 82 if (imgList == NULL) 83 { 84 imgList = new wxImageList(bmp.GetWidth(), bmp.GetHeight()); 85 bookctrl->AssignImageList(imgList); 86 } 87 int imgIndex = imgList->Add(bmp); 88 bookctrl->SetPageImage(bookctrl->GetPageCount()-1, imgIndex); 89 } 90 } 91 else 92 wxLogError(wxT("Error in resource.")); 93 return wnd; 94 } 95 else 96 { 97 wxLogError(wxT("Error in resource: no control within wxPropertySheetDialog's <page> tag.")); 98 return NULL; 99 } 100 } 101 102 else 103 { 104 XRC_MAKE_INSTANCE(dlg, wxPropertySheetDialog) 105 106 dlg->Create(m_parentAsWindow, 107 GetID(), 108 GetText(wxT("title")), 109 GetPosition(), 110 GetSize(), 111 GetStyle(), 112 GetName()); 113 114 if (HasParam(wxT("icon"))) dlg->SetIcon(GetIcon(wxT("icon"), wxART_FRAME_ICON)); 115 116 SetupWindow(dlg); 117 118 wxPropertySheetDialog *old_par = m_dialog; 119 m_dialog = dlg; 120 bool old_ins = m_isInside; 121 m_isInside = true; 122 CreateChildren(m_dialog, true/*only this handler*/); 123 m_isInside = old_ins; 124 m_dialog = old_par; 125 126 if (GetBool(wxT("centered"), false)) dlg->Centre(); 127 wxString buttons = GetText(wxT("buttons")); 128 if (!buttons.IsEmpty()) 129 { 130 int flags = 0; 131 if (buttons.Find(wxT("wxOK")) != wxNOT_FOUND) flags |= wxOK; 132 if (buttons.Find(wxT("wxCANCEL")) != wxNOT_FOUND) flags |= wxCANCEL; 133 if (buttons.Find(wxT("wxYES")) != wxNOT_FOUND) flags |= wxYES; 134 if (buttons.Find(wxT("wxNO")) != wxNOT_FOUND) flags |= wxNO; 135 if (buttons.Find(wxT("wxHELP")) != wxNOT_FOUND) flags |= wxHELP; 136 if (buttons.Find(wxT("wxNO_DEFAULT")) != wxNOT_FOUND) flags |= wxNO_DEFAULT; 137 dlg->CreateButtons(flags); 138 } 139 140 return dlg; 141 } 142} 143 144bool wxPropertySheetDialogXmlHandler::CanHandle(wxXmlNode *node) 145{ 146 return ((!m_isInside && IsOfClass(node, wxT("wxPropertySheetDialog"))) || 147 (m_isInside && IsOfClass(node, wxT("propertysheetpage")))); 148} 149 150#endif // wxUSE_XRC && wxUSE_BOOKCTRL 151