ultimatepp/uppdev/Circles/CircleDoc.cpp
cxl 351994a6cc Adding uppdev....
git-svn-id: svn://ultimatepp.org/upp/trunk@328 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-08-15 08:36:24 +00:00

142 lines
2.6 KiB
C++

#include "Circles.h"
void CircleDoc::Update(const Rect& r)
{
bound.Clear();
for(int i = 0; i < data.GetCount(); i++)
bound.Union(data[i].GetRect());
for(int i = 0; i < view.GetCount(); i++)
view[i].UpdateView(r);
}
void CircleDoc::UpdateFull()
{
Rect r(-INT_MAX, -INT_MAX, INT_MAX, INT_MAX);
Update(r);
}
void CircleDoc::AddCircle(Point p, int radius)
{
redo.Clear();
CircleUndo& u = undo.Add();
u.insert = false;
u.index = data.GetCount();
CircleShape& c = data.Add();
c.point = p;
c.radius = radius;
Update(c.GetRect());
}
void CircleDoc::RemoveCircle(int i)
{
redo.Clear();
CircleUndo& u = undo.Add();
u.insert = true;
u.index = i;
u.shape = data[i];
data.Remove(i);
Update(u.shape.GetRect());
}
void CircleDoc::UndoRedo(Array<CircleUndo>& src, Array<CircleUndo>& dst)
{
if(src.GetCount() == 0)
return;
CircleUndo& u = src.Top();
CircleUndo& r = dst.Add();
r.index = u.index;
Rect ur;
if(u.insert) {
r.insert = false;
data.Insert(u.index, u.shape);
ur = u.shape.GetRect();
}
else {
r.insert = true;
r.shape = data[u.index];
data.Remove(u.index);
ur = r.shape.GetRect();
}
src.Drop();
Update(ur);
}
void CircleDoc::NewView()
{
view.Add(new CircleView(*this)).OpenMain();
}
void CircleDoc::RemoveView(CircleView *v)
{
view.Remove(view.GetIndex(*v));
if(view.GetCount() == 0)
delete this;
}
void CircleDoc::Clear()
{
data.Clear();
undo.Clear();
redo.Clear();
UpdateFull();
AddCircle(Point(100, 20), 10 );
AddCircle(Point(20, 120), 10 );
AddCircle(Point(160, 120), 10 );
}
bool CircleDoc::LoadText(const char *text)
{
CParser p(text);
Clear();
try {
p.PassId("circle");
CircleShape& c = data.Add();
c.point.x = p.ReadNumber();
p.PassChar(',');
c.point.y = p.ReadNumber();
p.PassChar(',');
c.radius = p.ReadNumber();
p.PassChar(';');
}
catch(...) {
Clear();
return false;
}
return true;
}
String CircleDoc::SaveText() const
{
String r;
for(int i = 0; i < data.GetCount(); i++) {
const CircleShape& c = data[i];
r << "circle " << c.point.x << ", " << c.point.y << ", " << c.radius << ";";
}
return r;
}
void CircleDoc::Serialize(Stream& s)
{
int version = 0;
s / version;
for(int i = 0; i < data.GetCount(); i++) {
CircleShape& c = data[i];
s % c.point.x % c.point.y % c.radius;
}
}
bool CircleDoc::LoadBinary(const String& data)
{
StringStream ss(data);
if(Load(*this, ss))
return true;
Clear();
return false;
}
String CircleDoc::SaveBinary() const
{
StringStream ss;
Store(*this, ss);
return ss.GetResult();
}