#include "LayDes.h" void ItemProperty::Paint(Draw& w) { Size sz = GetSize(); w.DrawRect(sz, SColorLtFace); w.DrawRect(0, GetHeight() - 1, sz.cx, 1, SColorText); w.DrawText(2, (EditField::GetStdHeight() + 6 - GetTextSize(name, StdFont()).cy) / 2, name, GetData() == defval ? StdFont()() : StdFont().Bold()); } int ItemProperty::GetLabelWidth() const { return GetTextSize(name, StdFont().Bold()).cx + 2; } int ItemProperty::GetHeight() const { return EditField::GetStdHeight() + 5; } void ItemProperty::AdjustLabelWidth(int cx) { } bool ItemProperty::InlineEditor() const { return false; } bool ItemProperty::PlaceFocus(dword, int) { return false; } void ItemProperty::SetCharset(byte charset) { } void ItemProperty::Read(CParser& p) { } String ItemProperty::Save() const { return Null; } VectorMap& ItemProperty::Factory() { return Single< VectorMap >(); } void ItemProperty::Register(const char *name, ItemProperty *(*cr)()) { ASSERT(Factory().Find(name) < 0); Factory().Add(name, cr); } String ReadPropertyParam(CParser& p) { const char *b = p.GetPtr(); int level = 0; while(!p.IsEof()) { if(p.IsChar(';')) break; if(p.IsChar(')') && level == 0) break; if(p.Char(')')) { if(level == 0) break; level--; } else if(p.Char('(')) level++; else p.SkipTerm(); } return TrimLeft(TrimRight(String(b, p.GetPtr()))); } ItemProperty *ItemProperty::Create(const String& name) { int q = Factory().Find(name); if(q >= 0) return (*Factory()[q])(); return NULL; } void RawProperty::Read(CParser& p) { editor.SetData(ToUnicode(ReadPropertyParam(p), CHARSET_WIN1252)); } String RawProperty::Save() const { String s = ~editor; CParser p(s); int level = 0; try { while(!p.IsEof()) { if(p.Char('(')) level++; else if(p.Char(')')) level--; else p.SkipTerm(); } } catch(CParser::Error) {} if(level < 0) s = String('(', -level) + s; else s = String(')', level) + s; return s; } struct IntProperty : public EditorProperty { virtual void Read(CParser& p) { if(p.Id("Null")) editor.SetData(Null); else editor.SetData(p.ReadInt()); } virtual String Save() const { int q = ~editor; return IsNull(q) ? String("Null") : AsString(q); } static ItemProperty *Create() { return new IntProperty; } }; struct DoubleProperty : public EditorProperty { virtual void Read(CParser& p) { if(p.Id("Null")) editor.SetData(Null); else editor.SetData(p.ReadDouble()); } virtual String Save() const { return FormatDouble(~editor, 10); } static ItemProperty *Create() { return new DoubleProperty; } }; struct StringProperty : public EditorProperty { virtual void Read(CParser& p) { if(p.Id("Null")) editor.SetData(Null); else editor.SetData(p.ReadString()); } virtual String Save() const { return AsCString(~editor); } static ItemProperty *Create() { return new StringProperty; } }; struct BoolProperty : public EditorProperty