NAMESPACE_UPP #define ASSERT_INDEX(arrayctrl, index) ASSERT(arrayctrl.GetIndexCount() == index) #define TOOL(x) \ void COMBINE(Tool, x)(Bar& bar); \ void COMBINE(On, x)(); \ static void COMBINE(Help, x)(); #define TOOL_LOCAL(x) \ void COMBINE(Tool, x)(Bar& bar, bool local); \ void COMBINE(On, x)(); \ static void COMBINE(Help, x)(); class Pump { public: struct Item { virtual ~Item() {} virtual void Run(bool write) = 0; }; Pump() {} void Run(bool write) { for(int i = 0; i < items.GetCount(); i++) items[i].Run(write); } void Read() { Run(false); } void Write() { Run(true); } bool IsEmpty() const { return items.IsEmpty(); } Pump& Add(Item *item) { items.Add(item); return *this; } Pump& operator << (One item) { Add(-item); return *this; } Pump& operator << (Item *item) { Add(item); return *this; } void operator << (bool write) { Run(write); } void Clear() { items.Clear(); } public: Array items; }; inline Pump WithPump() { return Pump(); } template struct PumpItemSet : public Pump::Item { PumpItemSet(A& a, B& b) : a(a), b(b) {} virtual void Run(bool write) { if(write) a = b; else b = a; } A& a; B& b; }; template inline One PumpSet(A& a, B& b) { return new PumpItemSet(a, b); } template struct PumpItemData : public Pump::Item { PumpItemData(A& a, B& b) : a(a), b(b) {} virtual void Run(bool write) { if(write) a = ~b; else b <<= a; } A& a; B& b; }; template inline One PumpData(A& a, B& b) { return new PumpItemData(a, b); } template struct PumpItemDataRef : public Pump::Item { PumpItemDataRef(Ref ref, B& b) : ref(ref), b(b) {} virtual void Run(bool write) { if(write) ref.SetValue(~b); else b <<= Value(ref); } Ref ref; B& b; }; template inline One PumpDataRef(Ref ref, B& b) { return new PumpItemDataRef(ref, b); } template struct PumpItemEnumData : public Pump::Item { PumpItemEnumData(A& a, B& b) : a(a), b(b) {} virtual void Run(bool write) { if(write) a = A(int(~b)); else b <<= (int)a; } A& a; B& b; }; template inline One PumpEnumData(A& a, B& b) { return new PumpItemEnumData(a, b); } template struct PumpItemArray : public Pump::Item { PumpItemArray(A& a, ArrayCtrl& array, int row, int column) : a(a), array(array), row(row), column(column) {} virtual void Run(bool write) { if(write) { a = array.Get(row, column); } else { array.Set(row, column, a); } } A& a; ArrayCtrl& array; int row; int column; }; template struct PumpItemScaledData : public Pump::Item { PumpItemScaledData(A& a, B& b, double scale) : a(a), b(b), scale(scale) {} virtual void Run(bool write) { if(write) { double d = ~b; a = (IsNull(d) ? d : d * scale); } else { b <<= (IsNull(a) ? double(Null) : (double)a / scale); } } A& a; B& b; double scale; }; template struct PumpItemIntScaledData : public Pump::Item { PumpItemIntScaledData(A& a, B& b, double scale) : a(a), b(b), scale(scale) {} virtual void Run(bool write) { if(write) { double d = ~b; a = (IsNull(d) ? (int)Null : fround(d * scale)); } else { b <<= (IsNull(a) ? double(Null) : (double)a / scale); } } A& a; B& b; double scale; }; template One PumpScaledData(A& a, B& b, double scale) { return new PumpItemScaledData(a, b, scale); } template One PumpAngleData(A& a, B& b) { return PumpScaledData(a, b, M_PI / 180.0); } template One PumpIntScaledData(A& a, B& b, double scale) { return new PumpItemIntScaledData(a, b, scale); } template One PumpIntAngleData(A& a, B& b) { return PumpIntScaledData(a, b, M_PI / 180.0); } template inline One PumpArray(A& a, ArrayCtrl& array, int row, int column) { return new PumpItemArray(a, array, row, column); } template inline One PumpArray(A& a, ArrayCtrl& array, int row, Id column) { return new PumpItemArray(a, array, row, array.GetPos(column)); } template struct PumpItemArrayCast : public Pump::Item { PumpItemArrayCast(A& a, ArrayCtrl& array, int row, int column) : a(a), array(array), row(row), column(column) {} virtual void Run(bool write) { if(write) { a = A(C(array.Get(row, column))); } else { array.Set(row, column, (C)a); } } A& a; ArrayCtrl& array; int row; int column; }; template inline One PumpArrayCast(A& a, ArrayCtrl& array, int row, int column) { return new PumpItemArrayCast(a, array, row, column); } template inline One PumpArrayCast(A& a, ArrayCtrl& array, int row, Id column) { return new PumpItemArrayCast(a, array, row, array.GetPos(column)); } struct PumpItemArrayRef : public Pump::Item { PumpItemArrayRef(Ref ref, ArrayCtrl& array, int row, int column) : ref(ref), array(array), row(row), column(column) {} virtual void Run(bool write) { if(write) { ref.SetValue(array.Get(row, column)); } else { array.Set(row, column, Value(ref)); } } Ref ref; ArrayCtrl& array; int row; int column; }; inline One PumpArrayRef(Ref ref, ArrayCtrl& array, int row, int column) { return new PumpItemArrayRef(ref, array, row, column); } inline One PumpArrayRef(Ref ref, ArrayCtrl& array, int row, Id column) { return new PumpItemArrayRef(ref, array, row, array.GetPos(column)); } bool IsUnique(const ArrayCtrl& table, int column); bool IsUnique(const ArrayCtrl& table, Id column); int SwapRows(ArrayCtrl& table, int row1, int row2); void SetColumn(ArrayCtrl& table, int index, const Value& value); void SetColumn(ArrayCtrl& table, Id column, const Value& value); Index GetSelIndex(const ArrayCtrl& table); BorderFrame& TopJoinFrame(); BorderFrame& BottomJoinFrame(); class TabPageCtrl : public StaticRect { public: TabPageCtrl() { Transparent(); Color(Null); /*Blend(SColorFace(), SColorPaper()));*/ } }; class DropListAll : public DropList { public: DropListAll() { DisplayAll(); } }; class DropButton : public FrameRight