+ _startX = x;
+ _startY = y;
+
+ // check and prepare for resizing
+ static const int cursor[] = {
+ MOUSE_CURSOR_POINTER, MOUSE_CURSOR_LEFTSIDE, MOUSE_CURSOR_RIGHTSIDE, 0,
+ MOUSE_CURSOR_TOPSIDE, MOUSE_CURSOR_TOPLEFT, MOUSE_CURSOR_TOPRIGHT, 0,
+ MOUSE_CURSOR_BOTTOMSIDE, MOUSE_CURSOR_BOTTOMLEFT, MOUSE_CURSOR_BOTTOMRIGHT, 0,
+ };
+
+ _resizing = 0;
+ if (!global_drag && _resizable) {
+ int hmargin = global_resize ? _dlgW / 3 : RESIZE_MARGIN;
+ int vmargin = global_resize ? _dlgH / 3 : RESIZE_MARGIN;
+
+ if (y - _dlgY < vmargin)
+ _resizing |= BOTTOM;
+ else if (_dlgY + _dlgH - y < vmargin)
+ _resizing |= TOP;
+
+ if (x - _dlgX < hmargin)
+ _resizing |= LEFT;
+ else if (_dlgX + _dlgW - x < hmargin)
+ _resizing |= RIGHT;
+
+ if (!_resizing && global_resize)
+ _resizing = BOTTOM|RIGHT;
+
+ _cursor = cursor[_resizing];
+ if (_resizing && _resizable)
+ fgSetMouseCursor(_cursor);
+ }
+
+ } else if (updown == PU_DRAG && _dragging) {
+ if (_resizing) {
+ GUIInfo *info = (GUIInfo *)getUserData();
+ if (_resizable && info && info->node) {
+ int w = _dlgW;
+ int h = _dlgH;
+ if (_resizing & LEFT)
+ w += _startX - x;
+ if (_resizing & RIGHT)
+ w += x - _startX;
+ if (_resizing & TOP)
+ h += y - _startY;
+ if (_resizing & BOTTOM)
+ h += _startY - y;
+
+ int prefw, prefh;
+ LayoutWidget wid(info->node);
+ wid.calcPrefSize(&prefw, &prefh);
+ if (w < prefw)
+ w = prefw;
+ if (h < prefh)
+ h = prefh;
+
+ int x = _dlgX;
+ int y = _dlgY;
+ if (_resizing & LEFT)
+ x += _dlgW - w;
+ if (_resizing & BOTTOM)
+ y += _dlgH - h;
+
+ wid.layout(x, y, w, h);
+ setSize(w, h);
+ setPosition(x, y);
+ applySize(static_cast<puObject *>(this));
+ getFirstChild()->setSize(w, h); // dialog background puFrame
+ }
+ } else {
+ setPosition(x + _dlgX - _startX, y + _dlgY - _startY);
+ }
+
+ } else if (_dragging) {
+ fgSetMouseCursor(_start_cursor);