diff --git a/uppsrc/Common/TreeTypes.txt b/uppsrc/Common/TreeTypes.txt index e69de29bb..622490f47 100644 --- a/uppsrc/Common/TreeTypes.txt +++ b/uppsrc/Common/TreeTypes.txt @@ -0,0 +1,2 @@ +sockaddr_in +0 0 -1 diff --git a/uppsrc/Core/BlockStream.cpp b/uppsrc/Core/BlockStream.cpp index d12e709ef..d679b5a39 100644 --- a/uppsrc/Core/BlockStream.cpp +++ b/uppsrc/Core/BlockStream.cpp @@ -469,7 +469,7 @@ bool FileStream::Open(const char *name, dword mode, mode_t tmode) { int iomode = mode & ~SHAREMASK; handle = open(ToSystemCharset(name), iomode == READ ? O_RDONLY : iomode == CREATE ? O_CREAT|O_RDWR|O_TRUNC : - O_RDWR, + O_RDWR|O_CREAT, tmode); if(handle >= 0) { int64 fsz = LSEEK64_(handle, 0, SEEK_END); diff --git a/uppsrc/CtrlCore/DHCtrl.cpp b/uppsrc/CtrlCore/DHCtrl.cpp index 95e39f141..847d275b6 100644 --- a/uppsrc/CtrlCore/DHCtrl.cpp +++ b/uppsrc/CtrlCore/DHCtrl.cpp @@ -60,7 +60,7 @@ void DHCtrl::State(int reason) SyncHWND(); break; case CLOSE: - hwnd = NULL; + CloseHWND(); } } diff --git a/uppsrc/CtrlCore/Win32Wnd.cpp b/uppsrc/CtrlCore/Win32Wnd.cpp index 52cc9cda1..335d12d45 100644 --- a/uppsrc/CtrlCore/Win32Wnd.cpp +++ b/uppsrc/CtrlCore/Win32Wnd.cpp @@ -8,7 +8,7 @@ NAMESPACE_UPP #define LOGTIMING 0 #ifdef _DEBUG -#define LOGMESSAGES 0 +#define LOGMESSAGES 1 #endif #define ELOG(x) // RLOG(GetSysTime() << ": " << x) @@ -566,7 +566,7 @@ LRESULT CALLBACK Ctrl::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lP RLOG(m->name << ' ' << UPP::Name(w) << Sprintf(", wParam = %d (0x%x), lParam = %d (0x%x)", wParam, wParam, lParam, lParam)); - VppLog().Begin(); + VppLog() << LOG_BEGIN; logblk = true; break; } @@ -605,7 +605,7 @@ LRESULT CALLBACK Ctrl::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lP l = DefWindowProc(hWnd, message, wParam, lParam); #if LOGMESSAGES if(logblk) - VppLog().End(); + VppLog() << LOG_END; #endif return l; } diff --git a/uppsrc/CtrlLib/DateTimeCtrl.cpp b/uppsrc/CtrlLib/DateTimeCtrl.cpp index e8a9a6297..8202a6c06 100644 --- a/uppsrc/CtrlLib/DateTimeCtrl.cpp +++ b/uppsrc/CtrlLib/DateTimeCtrl.cpp @@ -276,6 +276,8 @@ void Calendar::LeftDown(Point p, dword keyflags) else RefreshDay(newday); } + + WhenSelect(); } void Calendar::MouseMove(Point p, dword keyflags) @@ -335,7 +337,7 @@ void Calendar::RefreshDay(Point p) col = p.x; row = p.y; - int y0 = 2 + (int)((p.y + 2) * rowh); + int y0 = 2 + (int)((p.y + 1) * rowh + hs); int x0 = bs + 2 + (int)((p.x + 1) * colw); Refresh(x0, y0, cw, rh); @@ -357,7 +359,7 @@ Point Calendar::GetDay(Point p) { for(int i = 0; i < rows; i++) { - int y0 = 2 + (int)((i + 2) * rowh); + int y0 = 2 + (int)((i + 1) * rowh + hs); int y1 = y0 + rh; if(p.y >= y0 && p.y < y1) @@ -380,6 +382,17 @@ Size Calendar::ComputeSize() spin_month.SetFont(fnt); spin_year.SetFont(fnt); + spin_all.SetLeftImage(st.spinleftimg); + spin_all.SetRightImage(st.spinrightimg); + spin_month.SetLeftImage(st.spinleftimg); + spin_month.SetRightImage(st.spinrightimg); + spin_year.SetLeftImage(st.spinleftimg); + spin_year.SetRightImage(st.spinrightimg); + + spin_all.SetHighlight(st.spinhighlight); + spin_month.SetHighlight(st.spinhighlight); + spin_year.SetHighlight(st.spinhighlight); + Size sz = IsPopUp() ? Size(-1, -1) : GetSize(); Size tsz = GetTextSize("WW", fnt.NoBold().NoUnderline()); Size rsz; @@ -388,10 +401,10 @@ Size Calendar::ComputeSize() colw = (float)(tsz.cx + 6); rowh = (float)(tsz.cy + 4); - hs = tsz.cy + 4; + hs = spin_all.GetHeight() + 4; rsz.cx = bs * 2 + 2 + (int)(colw * (cols + 1)); - rsz.cy = 4 + (int)(rowh * (rows + 3)); + rsz.cy = (int)(rowh * (rows + 2) + hs); if(sz.cx > rsz.cx) { @@ -400,7 +413,7 @@ Size Calendar::ComputeSize() } if(sz.cy > rsz.cy) { - rowh = (sz.cy - 4) / (float) (rows + 3); + rowh = (sz.cy - hs) / (float) (rows + 2); rsz.cy = sz.cy; } @@ -434,7 +447,7 @@ void Calendar::Paint(Draw &w) if(w.IsPainting(0, hs, sz.cx, rh)) { - int y = (int) (rowh + (rowh - fh) / 2.0); + int y = (int) (hs + (rowh - fh) / 2.0); fnt.NoBold().NoUnderline(); tsz = GetTextSize(t_("Wk"), fnt); w.DrawText(bs + (cw - tsz.cx) / 2, y, t_("Wk"), fnt, st.week); @@ -468,7 +481,7 @@ void Calendar::Paint(Draw &w) for(int i = 0; i < rows; i++) { - int yp = 2 + (int) ((i + 2) * rowh); + int yp = 2 + (int) ((i + 1) * rowh + hs); int yc = (rh - fh) / 2; str = AsString(WeekOfYear(d, m, y)); @@ -566,7 +579,7 @@ void Calendar::Paint(Draw &w) } } - w.DrawRect(bs, (int) (rowh * 2) + 1, sz.cx - bs * 2, 1, st.line); + w.DrawRect(bs, (int) (hs + rowh) + 1, sz.cx - bs * 2, 1, st.line); w.DrawRect(bs + cw + 1, hs + bs, 1, sz.cy - hs - ts - bs * 1, st.line); lastrow = row; @@ -1321,6 +1334,7 @@ FlatButton::FlatButton() bg = Blend(SColorHighlight, White, 50); fg = SColorPaper; left = true; + highlight = true; Transparent(); } @@ -1339,7 +1353,13 @@ void FlatButton::Paint(Draw &w) int dx = IsPush() * (left ? -1 : 1); int dy = IsPush(); - w.DrawImage((sz.cx - isz.cx) / 2 + dx, (sz.cy - isz.cy) / 2 + dy, img, HasMouse() ? SColorHighlightText() : Black); + + Point p((sz.cx - isz.cx) / 2 + dx, (sz.cy - isz.cy) / 2 + dy); + + if(highlight) + w.DrawImage(p.x, p.y, img, HasMouse() ? SColorHighlightText() : Black); + else + w.DrawImage(p.x, p.y, img); } FlatSpin::FlatSpin() @@ -1371,7 +1391,20 @@ void FlatSpin::SetFont(const Font& fnt) int FlatSpin::GetWidth(const String& s, bool with_buttons) { - return (with_buttons ? (CtrlImg::smallleft().GetSize().cx + 8) * 2 : 0) + GetTextSize(s, font).cx; + Size sl = left.GetImage().GetSize(); + Size sr = right.GetImage().GetSize(); + int width = GetTextSize(s, font).cx; + + if(with_buttons) + width += sl.cx + max(8, sl.cx / 2) + sr.cx + max(8, sr.cx / 2); + + return width; +} + +int FlatSpin::GetHeight() +{ + int ih = max(left.GetImage().GetSize().cy + 8, right.GetImage().GetSize().cy + 8); + return max(font.GetHeight(), ih); } void FlatSpin::SetText(const String& s) @@ -1396,9 +1429,8 @@ void FlatSpin::SetCallbacks(const Callback &cbl, const Callback& cbr) void FlatSpin::Layout() { Size sz = GetSize(); - Size isz = CtrlImg::smallleft().GetSize(); - left.LeftPos(0, isz.cx + 8).TopPos(0, sz.cy); - right.RightPos(0, isz.cx + 8).TopPos(0, sz.cy); + left.LeftPos(0, left.GetImage().GetSize().cx + 8).VSizePos(); + right.RightPos(0, right.GetImage().GetSize().cx + 8).VSizePos(); } void FlatSpin::Paint(Draw& w) @@ -1473,6 +1505,9 @@ CH_STYLE(Calendar, Style, StyleDefault) dayname = SColorText; week = SColorText; font = StdFont(); + spinleftimg = CtrlImg::smallleft(); + spinrightimg = CtrlImg::smallright(); + spinhighlight = true; } END_UPP_NAMESPACE diff --git a/uppsrc/CtrlLib/DateTimeCtrl.h b/uppsrc/CtrlLib/DateTimeCtrl.h index 1d555c2d2..88c87de59 100644 --- a/uppsrc/CtrlLib/DateTimeCtrl.h +++ b/uppsrc/CtrlLib/DateTimeCtrl.h @@ -15,6 +15,7 @@ public: Color fg, bg, hl; bool left; bool drawedge; + bool highlight; FlatButton(); @@ -29,6 +30,8 @@ public: Pusher::MouseLeave(); } + const Image& GetImage() { return img; } + FlatButton& SetImage(const Image &_img) { img = _img; Refresh(); @@ -38,6 +41,7 @@ public: FlatButton& SetLeft() { left = true; return *this; } FlatButton& SetRight() { left = false; return *this; } FlatButton& DrawEdge(bool b) { drawedge = b; return *this; } + FlatButton& Highlight(bool b) { highlight = b;return *this; } }; class FlatSpin : public Ctrl @@ -59,7 +63,11 @@ public: FlatSpin& Selectable(bool b = true); int GetWidth(const String& s, bool with_buttons = true); + int GetHeight(); void SetFont(const Font& fnt); + void SetLeftImage(const Image &img) { left.SetImage(img); } + void SetRightImage(const Image &img) { right.SetImage(img); } + void SetHighlight(bool b) { left.Highlight(b); right.Highlight(b); } virtual void MouseMove(Point p, dword keyflags); virtual void MouseLeave(); @@ -113,7 +121,10 @@ public: Color line; Color dayname; Color week; - Font font; + Font font; + Image spinleftimg; + Image spinrightimg; + bool spinhighlight; }; protected: @@ -233,6 +244,8 @@ public: Calendar& NoOneButton() { one_button = false; return *this; } void PopUp(Ctrl *owner, Rect &rt); + + Callback WhenSelect; }; struct LineCtrl : Ctrl @@ -483,6 +496,7 @@ public: cc.calendar <<= THISBACK(OnCalendarChoice); cc.clock <<= THISBACK(OnClockChoice); cc.WhenPopDown = THISBACK(OnClose); + cc.calendar.WhenSelect = Proxy(WhenSelect); } virtual void GotFocus() { drop.RefreshFrame(); } @@ -501,6 +515,8 @@ public: DateTimeCtrl& SwapMonthYear(bool b = true) { cc.calendar.SwapMonthYear(b); return *this; } DateTimeCtrl& OneButton(bool b = true) { cc.calendar.OneButton(true); return *this; } DateTimeCtrl& NoOneButton() { cc.calendar.OneButton(false); return *this; } + + Callback WhenSelect; }; class DropDate : public DateTimeCtrl diff --git a/uppsrc/CtrlLib/TabCtrl.cpp b/uppsrc/CtrlLib/TabCtrl.cpp index 9c415068e..90b7caa70 100644 --- a/uppsrc/CtrlLib/TabCtrl.cpp +++ b/uppsrc/CtrlLib/TabCtrl.cpp @@ -302,6 +302,15 @@ void TabCtrl::Set(int i) ScrollInto(sel); } +void TabCtrl::Set(Ctrl& slave) +{ + for(int i = 0; i < tab.GetCount(); i++) + if(tab[i].slave == &slave) { + Set(i); + return; + } +} + void TabCtrl::SetData(const Value& data) { Set(data); diff --git a/uppsrc/CtrlLib/TabCtrl.h b/uppsrc/CtrlLib/TabCtrl.h index a029b97d7..6472077fd 100644 --- a/uppsrc/CtrlLib/TabCtrl.h +++ b/uppsrc/CtrlLib/TabCtrl.h @@ -117,6 +117,7 @@ public: const Item& GetItem(int i) const { return tab[i]; } void Set(int i); + void Set(Ctrl& slave); int Get() const { return sel; } void GoNext() { Go(1); } diff --git a/uppsrc/Draw/ImageBlit.cpp b/uppsrc/Draw/ImageBlit.cpp index 0c9e95f33..b1cbe897a 100644 --- a/uppsrc/Draw/ImageBlit.cpp +++ b/uppsrc/Draw/ImageBlit.cpp @@ -259,8 +259,12 @@ void AlphaBlendStraightOpaque(RGBA *t, const RGBA *s, int len) void AlphaBlendStraightOpaque(RGBA *t, const RGBA *s, int len, int alpha) { + if(alpha >= 256) { + AlphaBlendStraightOpaque(t, s, len); + return; + } const RGBA *e = s + len; - alpha *= 0x101; + alpha *= 0x102; while(s < e) { int a = (s->a * alpha) >> 16; t->r += a * (s->r - t->r) >> 8; diff --git a/uppsrc/GLCtrl/Win32GlCtrl.cpp b/uppsrc/GLCtrl/Win32GlCtrl.cpp index 5b50b369e..de35c0c00 100644 --- a/uppsrc/GLCtrl/Win32GlCtrl.cpp +++ b/uppsrc/GLCtrl/Win32GlCtrl.cpp @@ -91,6 +91,7 @@ void GLCtrl::StdView() LRESULT GLCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { + DDUMP(message); if(message == WM_PAINT && hDC && hRC) { wglMakeCurrent(hDC, hRC); GLPaint(); diff --git a/uppsrc/MySql/MySql.cpp b/uppsrc/MySql/MySql.cpp index 4f5f2fc69..0a36e15cb 100644 --- a/uppsrc/MySql/MySql.cpp +++ b/uppsrc/MySql/MySql.cpp @@ -239,10 +239,10 @@ bool MySqlConnection::Execute() { s++; } Cancel(); - Stream *trace = session.GetTrace(); +/* Stream *trace = session.GetTrace(); dword time; if(session.IsTraceTime()) - time = GetTickCount(); + time = GetTickCount();*/ if(mysql_query(mysql, query)) { session.SetError(mysql_error(mysql), query); return false; diff --git a/uppsrc/Sql/SqlBool.cpp b/uppsrc/Sql/SqlBool.cpp index 9541cee01..773af901d 100644 --- a/uppsrc/Sql/SqlBool.cpp +++ b/uppsrc/Sql/SqlBool.cpp @@ -85,16 +85,22 @@ SqlBool SqlFirstRow() { return SqlCol("ROWNUM") == 1; } -SqlBool Like(const SqlVal& a, const SqlVal& b) { - return SqlBool(a, SqlCase(MY_SQL, " like binary ")(" like "), b, SqlS::COMP); +SqlBool Like(const SqlVal& a, const SqlVal& b, bool cs) { + + return SqlBool(a, SqlCase + (MY_SQL, " like binary ") + (PGSQL, cs ? " like " : " ilike ") + (" like "), b, SqlS::COMP); } SqlBool LikeUpperAscii(const SqlVal& a, const SqlVal& b) { return Like(UpperAscii(a), UpperAscii(b)); } -SqlBool NotLike(const SqlVal& a, const SqlVal& b) { - return SqlBool(a, " not like ", b, SqlS::COMP); +SqlBool NotLike(const SqlVal& a, const SqlVal& b, bool cs) { + return SqlBool(a, SqlCase + (PGSQL, cs ? "not like " : " not ilike ") + (" not like "), b, SqlS::COMP); } SqlBool Between(const SqlVal& a, const SqlVal& l, const SqlVal& h) { diff --git a/uppsrc/Sql/SqlVal.cpp b/uppsrc/Sql/SqlVal.cpp index 22331a987..8063415d0 100644 --- a/uppsrc/Sql/SqlVal.cpp +++ b/uppsrc/Sql/SqlVal.cpp @@ -47,6 +47,16 @@ SqlS::SqlS(const SqlS& a, const char *o, const SqlS& b, int pr) { priority = pr; } +SqlVal SqlVal::As(const char *as) const { + SqlVal v; + v.SetHigh(text + ~SqlCase(MSSQL | PGSQL, " as ")(" ") + as); + return v; +} + +SqlVal SqlVal::As(const SqlId& id) const { + return As(~~id); +} + SqlVal::SqlVal(const String& x) { if(UPP::IsNull(x)) SetNull(); @@ -120,6 +130,18 @@ SqlVal::SqlVal(SqlCol id) { SetHigh(id.ToString()); } +SqlVal::SqlVal(const SqlSelect& x) { + SetHigh('(' + ((SqlStatement) x).GetText() + ')'); +} + +SqlVal::SqlVal(const SqlBool& x) { + SetHigh(~x); +} + +SqlVal::SqlVal(const Case& x) { + SetHigh(~x); +} + SqlVal operator-(const SqlVal& a) { return SqlVal('-' + a(SqlS::UNARY), SqlS::UNARY); } diff --git a/uppsrc/Sql/Sqlexp.h b/uppsrc/Sql/Sqlexp.h index ae8bc8646..2645b232e 100644 --- a/uppsrc/Sql/Sqlexp.h +++ b/uppsrc/Sql/Sqlexp.h @@ -11,6 +11,8 @@ enum { class SqlBool; class SqlVal; class SqlSet; +class SqlSelect; +class Case; // ---------- @@ -157,6 +159,9 @@ public: void SetHigh(const String& s) { text = s; priority = HIGH; } bool IsNull() const { return priority == NULLVAL; } + SqlVal As(const char *as) const; + SqlVal As(const SqlId& id) const; + SqlVal() {} SqlVal(const String& s, int pr) : SqlS(s, pr) {} SqlVal(const SqlS& a, const char *o, const SqlS& b, int pa, int pb) @@ -176,6 +181,9 @@ public: SqlVal(SqlId id); SqlVal(const SqlId& (*id)()); SqlVal(SqlCol id); + SqlVal(const SqlSelect& x); + SqlVal(const SqlBool& x); + SqlVal(const Case& x); }; SqlVal operator-(const SqlVal& a); @@ -313,8 +321,8 @@ inline SqlBool IsNull(const SqlId& a) { return SqlIsNull(a); } inline SqlBool IsNull(const SqlVal& a) { return SqlIsNull(a); } inline SqlBool IsNull(const SqlCol& a) { return SqlIsNull(a); } -SqlBool Like(const SqlVal& a, const SqlVal& b); -SqlBool NotLike(const SqlVal& a, const SqlVal& b); +SqlBool Like(const SqlVal& a, const SqlVal& b, bool cs = false); +SqlBool NotLike(const SqlVal& a, const SqlVal& b, bool cs = false); SqlBool Between(const SqlVal& a, const SqlVal& low, const SqlVal& high); SqlBool NotBetween(const SqlVal&a, const SqlVal& low, const SqlVal& high); @@ -340,7 +348,23 @@ inline SqlBool operator!=(const SqlVal& a, const SqlSet& b) { return NotIn(a, b) inline const SqlVal& operator+(const SqlVal& a) { return a; } -////////////////////////////////////////////////////////////////////// +class Case : public SqlS, Moveable { +public: + Case(const SqlBool& cond, const SqlVal& val) + { + text = "case when " + ~cond + " then " + ~val + " end"; + } + Case& operator()(const SqlBool& cond, const SqlVal& val) + { + text.Insert(text.GetLength() - 4, " when " + ~cond + " then " + ~val); + return *this; + } + Case& operator()(const SqlVal& val) + { + text.Insert(text.GetLength() - 4, " else " + ~val); + return *this; + } +}; class Sql; diff --git a/uppsrc/Web/socket.cpp b/uppsrc/Web/socket.cpp index 2aaa53880..fd3762c95 100644 --- a/uppsrc/Web/socket.cpp +++ b/uppsrc/Web/socket.cpp @@ -135,7 +135,7 @@ bool Socket::Data::Open(bool block) return true; } -bool Socket::Data::OpenServer(int port, bool nodelay, int listen_count, bool block) +bool Socket::Data::OpenServer(int port, bool nodelay, int listen_count, bool block, bool reuse) { if(!Open(block)) return false; @@ -146,6 +146,10 @@ bool Socket::Data::OpenServer(int port, bool nodelay, int listen_count, bool blo sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = htonl(INADDR_ANY); + if(reuse) { + int optval = 1; + setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (const char *)&optval, sizeof(optval)); + } if(bind(socket, (const sockaddr *)&sin, sizeof(sin))) { SetSockError(NFormat("bind(port=%d)", port)); return false; @@ -405,12 +409,6 @@ void Socket::Data::Block(bool b) is_blocking = b; } -void Socket::Data::Reuse() -{ - int optval = 1; - setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (const char *)&optval, sizeof(optval)); -} - /* void Socket::Data::WriteTimeout(int msecs) { @@ -815,10 +813,10 @@ void Socket::SetSockError(SOCKET socket, const char *context, const char *errord SetErrorText(err); } -bool ServerSocket(Socket& socket, int port, bool nodelay, int listen_count, bool blocking) +bool ServerSocket(Socket& socket, int port, bool nodelay, int listen_count, bool blocking, bool reuse) { One data = new Socket::Data; - if(!data->OpenServer(port, nodelay, listen_count, blocking)) + if(!data->OpenServer(port, nodelay, listen_count, blocking, reuse)) return false; socket.Attach(data); return true; diff --git a/uppsrc/Web/socket.h b/uppsrc/Web/socket.h index 6166aa6f4..1aceecbcf 100644 --- a/uppsrc/Web/socket.h +++ b/uppsrc/Web/socket.h @@ -14,7 +14,7 @@ public: virtual ~Data() { CloseRaw(0); } bool Open(bool is_blocking); - bool OpenServer(int port, bool nodelay, int listen_count, bool is_blocking); + bool OpenServer(int port, bool nodelay, int listen_count, bool is_blocking, bool reuse = true); bool OpenClient(const char *host, int port, bool nodelay, dword *my_addr, int timeout, bool is_blocking); bool IsOpen() const { return socket != INVALID_SOCKET; } bool CloseRaw(int timeout_msec); @@ -148,5 +148,5 @@ public: }; #endif -bool ServerSocket(Socket& socket, int port, bool nodelay = true, int listen_count = 5, bool is_blocking = true); +bool ServerSocket(Socket& socket, int port, bool nodelay = true, int listen_count = 5, bool is_blocking = true, bool reuse = true); bool ClientSocket(Socket& socket, const char *host, int port, bool nodelay = true, dword *my_addr = NULL, int timeout = DEFAULT_CONNECT_TIMEOUT, bool is_blocking = true);