856d2e527d
* zstream.h doesn't anymore include zlib.h * updated static data * made wxClassInfo::GetFirst() static * added user/password support in the URL parser * fixed bugs git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@746 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
499 lines
13 KiB
C++
499 lines
13 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: serwnd.cpp
|
|
// Purpose: Serialization: wxWindow classes
|
|
// Author: Guilhem Lavaux
|
|
// Modified by:
|
|
// Created: July 1998
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 1998 Guilhem Lavaux
|
|
// Licence: wxWindows license
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef __GNUG__
|
|
#pragma implementation "serwnd.h"
|
|
#endif
|
|
|
|
#include <wx/window.h>
|
|
#include <wx/layout.h>
|
|
#include <wx/stream.h>
|
|
#include <wx/datstrm.h>
|
|
#include <wx/objstrm.h>
|
|
#include <wx/utils.h>
|
|
#include <wx/frame.h>
|
|
#include <wx/panel.h>
|
|
#include <wx/menu.h>
|
|
#include <wx/dialog.h>
|
|
#include <wx/serbase.h>
|
|
#include <wx/statusbr.h>
|
|
#include <wx/mdi.h>
|
|
#include "wx/log.h"
|
|
#include "serwnd.h"
|
|
|
|
|
|
IMPLEMENT_SERIAL_CLASS(wxWindow, wxObject)
|
|
IMPLEMENT_SERIAL_CLASS(wxIndividualLayoutConstraint, wxObject)
|
|
IMPLEMENT_SERIAL_CLASS(wxLayoutConstraints, wxObject)
|
|
IMPLEMENT_ALIAS_SERIAL_CLASS(wxValidator, wxObject)
|
|
IMPLEMENT_SERIAL_CLASS(wxFrame, wxWindow)
|
|
IMPLEMENT_SERIAL_CLASS(wxPanel, wxWindow)
|
|
IMPLEMENT_SERIAL_CLASS(wxDialog, wxWindow)
|
|
IMPLEMENT_SERIAL_CLASS(wxMenuBar, wxWindow)
|
|
IMPLEMENT_SERIAL_CLASS(wxMenuItem, wxObject)
|
|
IMPLEMENT_SERIAL_CLASS(wxMenu, wxObject)
|
|
|
|
IMPLEMENT_SERIAL_CLASS(wxMDIParentFrame, wxFrame)
|
|
IMPLEMENT_SERIAL_CLASS(wxMDIChildFrame, wxFrame)
|
|
IMPLEMENT_SERIAL_CLASS(wxMDIClientWindow, wxWindow)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxWindow)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
wxWindow *win_object = (wxWindow *)Object();
|
|
|
|
if (s.FirstStage()) {
|
|
wxNode *node = win_object->GetChildren()->First();
|
|
|
|
s.AddChild(win_object->GetConstraints());
|
|
s.AddChild(win_object->GetValidator());
|
|
|
|
// BAD HACK, but I don't have access to the internal variable of wxWindow.
|
|
m_bg_colour = win_object->GetBackgroundColour();
|
|
m_fg_colour = win_object->GetForegroundColour();
|
|
s.AddChild(&m_bg_colour);
|
|
s.AddChild(&m_fg_colour);
|
|
s.AddChild(win_object->GetFont());
|
|
while (node) {
|
|
s.AddChild(node->Data());
|
|
node = node->Next();
|
|
}
|
|
return;
|
|
}
|
|
|
|
wxDataOutputStream data(s);
|
|
int x,y,w,h;
|
|
|
|
data.WriteString( win_object->GetName() );
|
|
data.WriteString( win_object->GetLabel() );
|
|
data.WriteString( win_object->GetTitle() );
|
|
|
|
data.Write8( win_object->GetAutoLayout() );
|
|
data.Write8( win_object->IsShown() );
|
|
data.Write32( win_object->GetWindowStyleFlag() );
|
|
data.Write32( win_object->GetId() );
|
|
wxLogDebug( "Number = %d", win_object->GetChildren()->Number() );
|
|
data.Write8( win_object->GetChildren()->Number() );
|
|
|
|
win_object->GetSize(&w, &h);
|
|
win_object->GetPosition(&x, &y);
|
|
data.Write16(x);
|
|
data.Write16(y);
|
|
data.Write16(w);
|
|
data.Write16(h);
|
|
}
|
|
|
|
void WXSERIAL(wxWindow)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
wxDataInputStream data_s(s);
|
|
wxWindow *win_object = (wxWindow *)Object();
|
|
wxColour *colour;
|
|
wxFont *font;
|
|
|
|
if (s.SecondCall()) {
|
|
/* I assume we will never create raw wxWindow object */
|
|
(void)s.GetChild(); // We pass wxLayoutConstraints.
|
|
(void)s.GetChild(); // We pass wxValidator.
|
|
|
|
colour = (wxColour *)s.GetChild();
|
|
if (colour)
|
|
win_object->SetBackgroundColour(*colour);
|
|
colour = (wxColour *)s.GetChild();
|
|
if (colour)
|
|
win_object->SetForegroundColour(*colour);
|
|
font = (wxFont *)s.GetChild();
|
|
if (font)
|
|
win_object->SetFont(*font);
|
|
s.RemoveChildren(m_number);
|
|
return;
|
|
}
|
|
|
|
m_parent = (wxWindow *)s.GetParent();
|
|
|
|
m_name = data_s.ReadString();
|
|
m_label = data_s.ReadString();
|
|
m_title = data_s.ReadString();
|
|
|
|
m_auto_layout = data_s.Read8();
|
|
m_shown = data_s.Read8();
|
|
m_style = data_s.Read32();
|
|
m_id = data_s.Read32();
|
|
m_number = data_s.Read8();
|
|
|
|
m_x = data_s.Read16();
|
|
m_y = data_s.Read16();
|
|
m_w = data_s.Read16();
|
|
m_h = data_s.Read16();
|
|
|
|
(void)s.GetChild(); // We pass wxLayoutConstraints.
|
|
|
|
m_validator = (wxValidator *)s.GetChild();
|
|
if (!m_validator)
|
|
m_validator = (wxValidator *)&wxDefaultValidator;
|
|
|
|
s.RemoveChildren(m_number+3);
|
|
|
|
s.Recall();
|
|
|
|
return;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxIndividualLayoutConstraint)::StoreObject
|
|
(wxObjectOutputStream& s)
|
|
{
|
|
wxIndividualLayoutConstraint *lay_object =
|
|
(wxIndividualLayoutConstraint *)Object();
|
|
if (s.FirstStage())
|
|
return;
|
|
|
|
wxDataOutputStream data_s(s);
|
|
|
|
data_s.WriteString(s.GetObjectName(lay_object->GetOtherWindow()));
|
|
data_s.Write8(lay_object->GetMyEdge());
|
|
data_s.Write8(lay_object->GetRelationship());
|
|
data_s.Write16(lay_object->GetMargin());
|
|
data_s.Write16(lay_object->GetValue());
|
|
data_s.Write8(lay_object->GetPercent());
|
|
data_s.Write8(lay_object->GetOtherEdge());
|
|
}
|
|
|
|
void WXSERIAL(wxIndividualLayoutConstraint)::
|
|
LoadObject(wxObjectInputStream& s)
|
|
{
|
|
wxIndividualLayoutConstraint *lay_object =
|
|
(wxIndividualLayoutConstraint *)Object();
|
|
wxDataInputStream data_s(s);
|
|
wxString win_name;
|
|
|
|
win_name = data_s.ReadString();
|
|
lay_object->otherWin = (wxWindow *)s.SolveName(win_name);
|
|
lay_object->myEdge = (wxEdge)data_s.Read8();
|
|
lay_object->relationship = (wxRelationship)data_s.Read8();
|
|
lay_object->margin = data_s.Read16();
|
|
lay_object->value = data_s.Read16();
|
|
lay_object->percent = data_s.Read8();
|
|
lay_object->otherEdge = (wxEdge)data_s.Read8();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxLayoutConstraints)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
wxLayoutConstraints *lay_object = (wxLayoutConstraints *)Object();
|
|
WXSERIAL(wxIndividualLayoutConstraint) c;
|
|
|
|
#define STORE(obj) c.SetObject(&(lay_object->obj)); c.StoreObject(s);
|
|
|
|
// I simplify the process for this object
|
|
STORE(left);
|
|
STORE(right);
|
|
STORE(bottom);
|
|
STORE(top);
|
|
|
|
STORE(width);
|
|
STORE(height);
|
|
|
|
STORE(centreX);
|
|
STORE(centreY);
|
|
|
|
#undef STORE
|
|
}
|
|
|
|
void WXSERIAL(wxLayoutConstraints)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
wxLayoutConstraints *lay_object = (wxLayoutConstraints *)Object();
|
|
WXSERIAL(wxIndividualLayoutConstraint) c;
|
|
|
|
#define LOAD(obj) c.SetObject(&(lay_object->obj)); c.LoadObject(s);
|
|
|
|
// I simplify the process for this object
|
|
LOAD(left);
|
|
LOAD(right);
|
|
LOAD(bottom);
|
|
LOAD(top);
|
|
|
|
LOAD(width);
|
|
LOAD(height);
|
|
|
|
LOAD(centreX);
|
|
LOAD(centreY);
|
|
|
|
#undef LOAD
|
|
|
|
// Initialize constraints
|
|
((wxWindow *)s.GetParent())->SetConstraints(lay_object);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxFrame)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
wxFrame *frame = (wxFrame *)Object();
|
|
|
|
if (s.FirstStage()) {
|
|
s.AddChild(frame->GetMenuBar());
|
|
WXSERIAL(wxWindow)::StoreObject(s);
|
|
return;
|
|
}
|
|
|
|
WXSERIAL(wxWindow)::StoreObject(s);
|
|
|
|
wxDataOutputStream data_s(s);
|
|
wxStatusBar *statbar = frame->GetStatusBar();
|
|
|
|
// AAARGH !! I absolutely need to be able to modify internal fields of
|
|
// wxFrame (wxToolBar and wxStatusBar)
|
|
|
|
if (statbar)
|
|
data_s.Write8(statbar->GetFieldsCount());
|
|
else
|
|
data_s.Write8(0);
|
|
// HOW CAN I ACCESS TO THIS FIELD ?
|
|
// for (...) { data_s.Write8(statbar->m_statusWidths[i]); }
|
|
}
|
|
|
|
void WXSERIAL(wxFrame)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
wxFrame *frame = (wxFrame *)Object();
|
|
wxMenuBar *mbar = (wxMenuBar *)s.GetChild();
|
|
|
|
WXSERIAL(wxWindow)::LoadObject(s);
|
|
|
|
if (s.SecondCall())
|
|
return;
|
|
|
|
wxDataInputStream data_s(s);
|
|
|
|
if (frame->GetClassInfo() == CLASSINFO(wxFrame))
|
|
frame->Create(m_parent, m_id, m_title, wxPoint(m_x, m_y),
|
|
wxSize(m_w, m_h), m_style, m_name);
|
|
frame->SetMenuBar(mbar);
|
|
|
|
frame->CreateStatusBar(data_s.Read8());
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxMenuBar)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
wxMenuBar *mbar = (wxMenuBar *)Object();
|
|
int i, mcount = mbar->GetMenuCount();
|
|
|
|
if (s.FirstStage()) {
|
|
for (i=0;i<mcount;i++)
|
|
s.AddChild( mbar->GetMenu(i) );
|
|
WXSERIAL(wxWindow)::StoreObject(s);
|
|
return;
|
|
}
|
|
|
|
wxDataOutputStream data_s(s);
|
|
data_s.Write8( mcount );
|
|
|
|
// It isn't necessary for this object.
|
|
// WXSERIAL(wxWindow)::StoreObject(s);
|
|
}
|
|
|
|
void WXSERIAL(wxMenuBar)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
wxMenuBar *mbar = (wxMenuBar *)Object();
|
|
int i, mcount;
|
|
wxDataInputStream data_s(s);
|
|
|
|
mcount = data_s.Read8();
|
|
for (i=0;i<mcount;i++) {
|
|
wxMenu *menu = (wxMenu *)s.GetChild();
|
|
mbar->Append( menu, menu->GetTitle() );
|
|
}
|
|
|
|
// It isn't necessary for this object.
|
|
// WXSERIAL(wxWindow)::LoadObject(s);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxMenu)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
wxMenu *menu = (wxMenu *)Object();
|
|
|
|
if (s.FirstStage()) {
|
|
s.AddChild( &menu->GetItems() );
|
|
return;
|
|
}
|
|
|
|
wxDataOutputStream data_s(s);
|
|
data_s.WriteString( menu->GetTitle() );
|
|
}
|
|
|
|
void WXSERIAL(wxMenu)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
wxMenu *menu = (wxMenu *)Object();
|
|
wxList *items = (wxList *)s.GetChild();
|
|
wxNode *node = items->First();
|
|
|
|
wxDataInputStream data_s(s);
|
|
|
|
menu->SetTitle( data_s.ReadString() );
|
|
|
|
while (node) {
|
|
// NOT IMPLEMENTED in wxGTK
|
|
// menu->Append( (wxMenuItem *)node->Data() );
|
|
node = node->Next();
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxMenuItem)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
wxMenuItem *item = (wxMenuItem *)Object();
|
|
|
|
if (s.FirstStage()) {
|
|
#ifdef __WXGTK__
|
|
s.AddChild(item->GetSubMenu());
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
wxDataOutputStream data_s(s);
|
|
|
|
#ifdef __WXGTK__
|
|
data_s.Write8( item->GetId() );
|
|
data_s.WriteString( item->GetText() );
|
|
data_s.Write8( item->IsCheckable() );
|
|
data_s.Write8( item->IsEnabled() );
|
|
data_s.Write8( item->IsChecked() );
|
|
#endif
|
|
}
|
|
|
|
void WXSERIAL(wxMenuItem)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
wxMenuItem *item = (wxMenuItem *)Object();
|
|
wxDataInputStream data_s(s);
|
|
|
|
#ifdef __WXGTK__
|
|
item->SetId( data_s.Read8() );
|
|
item->SetText( data_s.ReadString() );
|
|
item->SetCheckable( data_s.Read8() );
|
|
item->Enable( data_s.Read8() );
|
|
item->Check( data_s.Read8() );
|
|
item->SetSubMenu( (wxMenu *)s.GetChild() );
|
|
#endif
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxPanel)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
WXSERIAL(wxWindow)::StoreObject(s);
|
|
}
|
|
|
|
void WXSERIAL(wxPanel)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
WXSERIAL(wxWindow)::LoadObject(s);
|
|
|
|
if (s.SecondCall())
|
|
return;
|
|
|
|
((wxPanel *)Object())->Create(m_parent, m_id, wxPoint(m_x, m_y),
|
|
wxSize(m_w, m_h), m_style, m_name);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxDialog)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
WXSERIAL(wxWindow)::StoreObject(s);
|
|
}
|
|
|
|
void WXSERIAL(wxDialog)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
WXSERIAL(wxWindow)::LoadObject(s);
|
|
|
|
if (s.SecondCall())
|
|
return;
|
|
|
|
((wxDialog *)Object())->Create(m_parent, m_id, m_title, wxPoint(m_x, m_y),
|
|
wxSize(m_w, m_h), m_style, m_name);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxMDIParentFrame)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
wxMDIParentFrame *frame = (wxMDIParentFrame *)Object();
|
|
|
|
if (s.FirstStage()) {
|
|
s.AddChild(frame->GetClientWindow());
|
|
WXSERIAL(wxMDIParentFrame)::StoreObject(s);
|
|
return;
|
|
}
|
|
|
|
WXSERIAL(wxMDIParentFrame)::StoreObject(s);
|
|
}
|
|
|
|
void WXSERIAL(wxMDIParentFrame)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
wxMDIParentFrame *frame = (wxMDIParentFrame *)Object();
|
|
wxMDIClientWindow *client;
|
|
|
|
if (s.SecondCall()) {
|
|
WXSERIAL(wxFrame)::LoadObject(s);
|
|
return;
|
|
}
|
|
|
|
client = (wxMDIClientWindow *) s.GetChild();
|
|
|
|
frame->Create(m_parent, m_id, m_title, wxPoint(m_x, m_y),
|
|
wxSize(m_w, m_h), m_style, m_name);
|
|
|
|
WXSERIAL(wxFrame)::LoadObject(s);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxMDIChildFrame)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
WXSERIAL(wxFrame)::StoreObject(s);
|
|
}
|
|
|
|
void WXSERIAL(wxMDIChildFrame)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
WXSERIAL(wxFrame)::LoadObject(s);
|
|
|
|
if (s.SecondCall())
|
|
return;
|
|
|
|
((wxMDIChildFrame *)Object())->Create((wxMDIParentFrame *)m_parent,
|
|
m_id, m_title,
|
|
wxPoint(m_x, m_y), wxSize(m_w, m_h),
|
|
m_style, m_name);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
void WXSERIAL(wxMDIClientWindow)::StoreObject(wxObjectOutputStream& s)
|
|
{
|
|
WXSERIAL(wxWindow)::StoreObject(s);
|
|
}
|
|
|
|
void WXSERIAL(wxMDIClientWindow)::LoadObject(wxObjectInputStream& s)
|
|
{
|
|
WXSERIAL(wxWindow)::LoadObject(s);
|
|
|
|
if (s.SecondCall())
|
|
return;
|
|
|
|
((wxMDIClientWindow *)Object())->CreateClient((wxMDIParentFrame *)m_parent, m_style);
|
|
}
|