diff options
Diffstat (limited to 'Src/Wasabi/api/wnd/wndclass/framewnd.cpp')
-rw-r--r-- | Src/Wasabi/api/wnd/wndclass/framewnd.cpp | 777 |
1 files changed, 777 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wnd/wndclass/framewnd.cpp b/Src/Wasabi/api/wnd/wndclass/framewnd.cpp new file mode 100644 index 00000000..26e56537 --- /dev/null +++ b/Src/Wasabi/api/wnd/wndclass/framewnd.cpp @@ -0,0 +1,777 @@ +#include <precomp.h> + +#include "framewnd.h" +#include <api/wnd/notifmsg.h> +#include <bfc/bfc_assert.h> +#include <tataki/canvas/canvas.h> +#include <api/wnd/PaintCanvas.h> +#include <bfc/wasabi_std_wnd.h> + +#define DC_FWFOCUS 0x5122 + +FrameWnd::FrameWnd() +{ +// sizer = NULL; + SNAP=1; + snapoffsety=0; + snapoffsetx=0; + nchild = 0; + for (int i = 0; i < MAXCHILD; i++) { + children[i] = NULL; + rwchildren[i] = NULL; + hidey[i] = 0; + windowshaded[i] = 0; + } + vert = DIVIDER_UNDEFINED; + divideside = SDP_FROMLEFT; + pullbarpos = PULLBAR_HALF; + minwidth = PULLBAR_QUARTER-PULLBAR_EIGHTH; + maxwidth = PULLBAR_HALF; + resizeable = 0; + slidemode = FRAMEWND_SQUISH; + prevpullbarpos = -1; + maxpixels=0; + minpixels=0; + noMaxRestriction = false; + ZERO(sizerRect); + + h_bitmap = L"wasabi.framewnd.horizontaldivider"; + v_bitmap = L"wasabi.framewnd.verticaldivider"; + h_grabber = L"wasabi.framewnd.horizontalgrabber"; + v_grabber = L"wasabi.framewnd.verticalgrabber"; + ws_bitmap = L"wasabi.framewnd.windowshade"; + resizing = 0; +} + +void FrameWnd::Set_v_bitmap(const wchar_t *new_v_bitmap) +{ + v_bitmap=new_v_bitmap; + if (isInited()) + { + invalidate(); + onResize(); + } +} + +void FrameWnd::Set_v_grabber(const wchar_t *new_v_grabber) + { + v_grabber=new_v_grabber; + if (isInited()) + { + invalidate(); + onResize(); + } +} + +FrameWnd::~FrameWnd() { +#ifdef WASABI_COMPILE_CONFIG + if (getId() != NULL) { + StringPrintfW buf(L"FrameWnd/ws,%s", getId()); + WASABI_API_CONFIG->setIntPrivate(buf, windowshaded[0]); + } +#endif + + if (children[0]) // do we have any basewnd ? + for (int i = 0; i < nchild; i++) delete children[i]; +} + +int FrameWnd::onInit() { + int i; + + FRAMEWND_PARENT::onInit(); + + ASSERT(vert != DIVIDER_UNDEFINED || nchild == 0); + + // have to set children for frame windows + + // fill in members + nchild = 0; + + // make children create their windows + for (i = 0; i < MAXCHILD; i++) { + if (rwchildren[i] != NULL) { + if (rwchildren[i]->init(this) != 0) { + rwchildren[i]->setParent(this); + nchild++; + } + } + } + prevpullbarpos = pullbarpos; + + if (nchild >= MAXCHILD) { + int which = (divideside == SDP_FROMLEFT) ? 0 : 1; + rwchildren[which]->bringToFront(); + } + +#ifdef WASABI_COMPILE_CONFIG + if (getId() != NULL) { + StringPrintfW buf(L"FrameWnd/ws,%s", getId()); + int ws = WASABI_API_CONFIG->getIntPrivate(buf, /*rwchildren[0] && rwchildren[0]->childNotify(NULL, CHILD_WINDOWSHADE_CAPABLE)*/ 0); + if (ws) { + windowshade(0, !ws); + windowshade(0, ws); + pullbarpos = 0; + } + } +#endif + + return 1; +} + +int FrameWnd::getCursorType(int x, int y) { + RECT r; + getClientRect(&r); + POINT pt={x,y}; + if (y > r.top + getLabelHeight() && Wasabi::Std::pointInRect(sizerRect, pt)) { + if (vert == DIVIDER_HORIZONTAL) return BASEWND_CURSOR_NORTHSOUTH; + else return BASEWND_CURSOR_EASTWEST; + } + return BASEWND_CURSOR_POINTER; +} + +int FrameWnd::setChildren(BaseWnd *newchild1, BaseWnd *newchild2) { + return _setChildren(newchild1, newchild2, newchild1, newchild2); +} + +int FrameWnd::setChildrenRootWnd(ifc_window *child1, ifc_window *child2/* =NULL */) { + return _setChildren(child1, child2, NULL, NULL); +} + +int FrameWnd::_setChildren(ifc_window *child1, ifc_window *child2, BaseWnd *child1b, BaseWnd *child2b) { + if (child1b) { // we can delete them later + children[0] = child1b; + children[1] = child2b; + } + rwchildren[0] = child1; + rwchildren[1] = child2; + nchild = 0; + if (rwchildren[0] != NULL) nchild++; + if (rwchildren[1] != NULL) nchild++; + + ASSERTPR(nchild >= 1, "framewnd must have one or more children"); + + if (isInited()) { + invalidate(); + onResize(); + } + return nchild; +} + +ifc_window *FrameWnd::enumChild(int which) { + if (which < 0 || which >= MAXCHILD) return NULL; + return rwchildren[which]; +} + +int FrameWnd::childNotify(ifc_window *which, int msg, intptr_t param1, intptr_t param2) { +// ASSERT(which == rwchildren[0] || which == rwchildren[1] || which == NULL); + switch (msg) { + case ChildNotify::FRAMEWND_SETTITLEWIDTH: + if (pullbarpos == param1) return 0; + ASSERT(param1 >= 0); + if (which == rwchildren[0]) { + // rwchildren[1]->invalidate(); //FG> removed due to change in redraw layout + // rwchildren[1]->repaint(); + ASSERT(divideside == SDP_FROMLEFT); + } else { + // rwchildren[0]->invalidate(); + // rwchildren[0]->repaint(); + ASSERT(divideside == SDP_FROMRIGHT); + } + pullbarpos = param1; + // do it + onResize(); + return 1; + + case ChildNotify::HIDEYHIDEY: + if (which == rwchildren[0]) hidey[0] = 1; + else if (which == rwchildren[1]) hidey[1] = 1; + which->setVisible(FALSE); + onResize(); + return 1; + + case ChildNotify::UNHIDEYHIDEY: + if (which == rwchildren[0]) hidey[0] = 0; + else if (which == rwchildren[1]) hidey[1] = 0; + which->setVisible(TRUE); + onResize(); + return 1; + + case ChildNotify::FRAMEWND_QUERY_SLIDE_MODE: + return getSlideMode(); + + case ChildNotify::FRAMEWND_SET_SLIDE_MODE: + setSlideMode((FrameWndSlideMode)param1); + break; + case ChildNotify::GOTFOCUS: + case ChildNotify::KILLFOCUS: + invalidateLabel(); + break; + } + + return FRAMEWND_PARENT::childNotify(which, msg, param1, param2); +} + +/*int FrameWnd::forceFocus() { + if (!canShowFocus()) return 0; // we aren't showing a label + int v = 0; + if (nchild > 0 && rwchildren[0] != NULL) { + if (!rwchildren[0]->canShowFocus()) v |= rwchildren[0]->gotFocus(); + } + if (nchild > 1 && rwchildren[1] != NULL) { + if (!rwchildren[1]->canShowFocus()) v |= rwchildren[1]->gotFocus(); + } + return v; +}*/ + +void FrameWnd::setDividerType(FrameWndDividerType type) { + vert = type; + ASSERT(vert == DIVIDER_VERTICAL || vert == DIVIDER_HORIZONTAL); + if (isInited()) + onResize(); +} + +FrameWndDividerType FrameWnd::getDividerType() { + return vert; +} + +int FrameWnd::ConvertPixToProp() { + RECT r; + int w; + getClientRect(&r); + if(vert == DIVIDER_VERTICAL) { + w = r.right-r.left; + } else { + w = r.bottom-r.top; + } + w = (pullbarpos * PULLBAR_FULL) / w; + return w; +} + +int FrameWnd::convertPropToPix(int prop) { + RECT r; + int w; + + getClientRect(&r); + if(vert == DIVIDER_VERTICAL) { + w = r.right-r.left; + } else { + w = r.bottom-r.top; + } + return (w * prop) / PULLBAR_FULL; +} + +int FrameWnd::setDividerPosNoCfg(int from, int pos) { + divideside = from; + + ASSERT(pos >= 0); + pullbarpos = pos; + if (isInited()) + onResize(); + + StringPrintfW buf(L"FrameWnd/%s,p", getId()); + WASABI_API_CONFIG->setIntPrivate(buf, pullbarpos); + + return 1; +} + +int FrameWnd::setDividerPos(int from, int pos) { +#ifdef WASABI_COMPILE_CONFIG + if (getId() != NULL) { + StringPrintfW buf(L"FrameWnd/%s,p", getId()); + pos = WASABI_API_CONFIG->getIntPrivate(buf, pos); + if (pos <= 0) pos = 0; + else if (pos >= PULLBAR_FULL) pos = PULLBAR_FULL; + } +#endif + return setDividerPosNoCfg(from, pos); +} + +void FrameWnd::getDividerPos(int *from, int *pos) { + if (from != NULL) *from = divideside; + if (pos != NULL) *pos = pullbarpos; +} + +int FrameWnd::setResizeable(int is) { + int prev = resizeable; + resizeable = is; + return prev; +} + +void FrameWnd::setMinWidth(int min) { + //ASSERT(min >= 0); + minpixels = min; +} + +void FrameWnd::setMaxWidth(int max) +{ + //ASSERT(max >= 0); + maxpixels=max; + noMaxRestriction = (max == 0); + //maxwidth = max; +} + +void FrameWnd::setSlideMode(FrameWndSlideMode mode) { + slidemode = mode; + if (isInited()) + onResize(); +} + +FrameWndSlideMode FrameWnd::getSlideMode() { + return slidemode; +} + +int FrameWnd::dragEnter(ifc_window *sourceWnd) { + ifc_window *ch = getWindowShadedChild(); + if (ch == NULL) return FRAMEWND_PARENT::dragEnter(sourceWnd); + return ch->getDragInterface()->dragEnter(sourceWnd); +} + +int FrameWnd::dragOver(int x, int y, ifc_window *sourceWnd) { + ifc_window *ch = getWindowShadedChild(); + if (ch == NULL) return FRAMEWND_PARENT::dragOver(x, y, sourceWnd); + return ch->getDragInterface()->dragOver(-1, -1, sourceWnd); +} + +int FrameWnd::dragLeave(ifc_window *sourceWnd) { + ifc_window *ch = getWindowShadedChild(); + if (ch == NULL) return FRAMEWND_PARENT::dragLeave(sourceWnd); + return ch->getDragInterface()->dragLeave(sourceWnd); +} + +int FrameWnd::dragDrop(ifc_window *sourceWnd, int x, int y) { + ifc_window *ch = getWindowShadedChild(); + if (ch == NULL) return FRAMEWND_PARENT::dragDrop(sourceWnd, x, y); + return ch->getDragInterface()->dragDrop(sourceWnd, x, y); +} + +int FrameWnd::onResize() +{ + int rt = FRAMEWND_PARENT::onResize(); + if (!isInited()) return rt; + RECT r; + int sizerwidth = SIZERWIDTH; + + if (!isInited()) { + prevpullbarpos = pullbarpos; + return 1; // no window to resize + } + + getClientRect(&r); + + ASSERT(nchild >= 0); + if (nchild == 0) { + prevpullbarpos = pullbarpos; + return 1; + } + + if (hidey[0] && hidey[1]) return 0; // both windows are hiding + + // if we have only one child, it takes up all the room + if (hidey[0]) { + rwchildren[1]->resize(r.left, r.top, r.right-r.left, r.bottom-r.top); + return 1; + } else if (hidey[1]) { + rwchildren[0]->resize(r.left, r.top, r.right-r.left, r.bottom-r.top); + return 1; + } + + if (nchild == 1) { + if (rwchildren[0] != NULL) rwchildren[0]->resize(r.left, r.top, r.right-r.left, r.bottom-r.top); + else if (rwchildren[1] != NULL) rwchildren[1]->resize(r.left, r.top, r.right-r.left, r.bottom-r.top); + return 1; + } + +#ifdef ASSERTS_ENABLED + for (int i = 0; i < nchild; i++) { + ASSERT(rwchildren[i] != NULL); + } +#endif + + if (!resizeable) sizerwidth = 0; + + // resize the subwindows + + int w; + if (vert == DIVIDER_VERTICAL) { + w = r.right-r.left; + } else { + w = r.bottom-r.top; + } + int clientwidth = w; // the logical width + + switch (pullbarpos) { + case PULLBAR_FULL: /*w = w;*/ break; + case PULLBAR_HALF: w = w/2; break; + case PULLBAR_QUARTER: w = w/4; break; + case PULLBAR_THREEQUARTER: w = w - w/4; break; + case PULLBAR_EIGHTH: w = w/8; break; + default: w = pullbarpos; break; + } + + // maxpixels holds normally a negative or zero value! + if (divideside == SDP_FROMRIGHT) + { + w = (clientwidth - w); + if (maxpixels < 1 && w < -maxpixels) w = -maxpixels; // Martin> This fixes an ugly drawing overlap + // TODO: check non-relative width as well, imoh we should rewrite this function from scrap. + } + else // FROMLEFT + { + if (maxpixels < 1 && w > clientwidth + maxpixels) + w = clientwidth + maxpixels; + if (w < minpixels) + w = minpixels; + } + + RECT r1, r2; + + if (slidemode == FRAMEWND_COVER) { // cover mode + + ASSERTPR(vert == DIVIDER_VERTICAL, "finish implementing"); + + if (divideside == SDP_FROMRIGHT) { + Wasabi::Std::setRect(&r1, r.left, r.top, r.right-r.left, r.bottom-r.top); //FG> delay resize + Wasabi::Std::setRect(&r2, r.left+w, r.top, r.left+clientwidth - w, r.bottom-r.top); + } else { + Wasabi::Std::setRect(&r1, r.left, r.top, r.left+w, r.bottom-r.top); //FG> delay resize + Wasabi::Std::setRect(&r2, r.left, r.top, r.right-r.left, r.bottom-r.top); + } + + sizerRect.top = r.top; + sizerRect.bottom = r.bottom; + sizerRect.left = r.left + w; + sizerRect.right = r.left + w + sizerwidth; + + } else { // squish mode + // left-right + if (vert == DIVIDER_VERTICAL) { + sizerRect.top = r.top; + sizerRect.bottom = r.bottom; + if (divideside == SDP_FROMLEFT) { // from left + + //FG> Warning, this is using a rect for x,y,W,H and NOT l,r,t,b + Wasabi::Std::setRect(&r1, r.left, r.top, w, r.bottom-r.top); + Wasabi::Std::setRect(&r2, r.left+w+sizerwidth, r.top, (r.right-r.left)-(w+sizerwidth), r.bottom-r.top); + + sizerRect.left = r.left+w; + sizerRect.right = sizerRect.left + sizerwidth; + } + else { // from right + + //FG> Warning, this is using a rect for x,y,W,H and NOT l,r,t,b + Wasabi::Std::setRect(&r1, r.left, r.top, w-sizerwidth, r.bottom-r.top); + Wasabi::Std::setRect(&r2, r.left+w, r.top, (r.right-r.left)-w, r.bottom-r.top); + + sizerRect.left = r.left+w-sizerwidth; + sizerRect.right = r.left+w; + } + } else { + // top-bottom + + //FG> Warning, this is using a rect for x,y,W,H and NOT l,r,t,b + Wasabi::Std::setRect(&r1, r.left, r.top, r.right-r.left, w); + Wasabi::Std::setRect(&r2, r.left, r.top+w+sizerwidth, r.right-r.left, (r.bottom-r.top)-(w+sizerwidth)); + + sizerRect.top = r.top+w; + sizerRect.bottom = r.top+w+sizerwidth; + sizerRect.left = r.left; + sizerRect.right = r.right; + } + } + + //FG> Choose resizing order. optimizes redraw by avoiding temporary overlap of rwchildren + bool reverse = false; + if (vert == DIVIDER_VERTICAL) { + RECT o; + rwchildren[0]->getNonClientRect(&o); + reverse = (r1.right > o.right); + } else { + RECT o; + rwchildren[0]->getNonClientRect(&o); + reverse = (r1.bottom > o.bottom); + } + + //FG> actually resize rwchildren + //FG> Warning, this is using a rect for x,y,W,H and NOT l,r,t,b + if (reverse) { + rwchildren[1]->resize(r2.left, r2.top, r2.right, r2.bottom); + rwchildren[0]->resize(r1.left, r1.top, r1.right, r1.bottom); + } else { + rwchildren[0]->resize(r1.left, r1.top, r1.right, r1.bottom); + rwchildren[1]->resize(r2.left, r2.top, r2.right, r2.bottom); + } + + onResizeChildren(r1, r2); + +// RECT ri = sizerRect; +#if 0 + if (vert == DIVIDER_HORIZONTAL) { + ri.left -= 2; + ri.right += 2; + } else { + ri.top -= 2; + ri.bottom += 2; + } +#endif +// invalidateRect(&ri); + invalidate(); + repaint(); + + prevpullbarpos = pullbarpos; + + return 1; +} + +void FrameWnd::onResizeChildren(RECT leftr, RECT rightr) { +} + +int FrameWnd::onPaint(Canvas *canvas) { + + RECT d; + getClientRect(&d); + if ((d.left >= d.right) || (d.top >= d.bottom)) { + return FRAMEWND_PARENT::onPaint(canvas); + } + + RECT cr; +// PaintBltCanvas paintcanvas; + PaintCanvas paintcanvas; + + // if only 1 child, we don't paint anything + if (nchild <= 1) return FRAMEWND_PARENT::onPaint(canvas); + + if (canvas == NULL) { + if (!paintcanvas.beginPaint(this)) return 0; + canvas = &paintcanvas; + } + FRAMEWND_PARENT::onPaint(canvas); + + getClientRect(&cr); + + if (wantRenderBaseTexture() || !isVirtual()) + renderBaseTexture(canvas, cr); + + if (resizeable) { + RECT r = sizerRect; + if (vert == DIVIDER_HORIZONTAL) { + r.left -= 2; + r.right += 2; + } else { + r.top -= 2; + r.bottom += 2; + } + + AutoSkinBitmap &bitmap = (vert == DIVIDER_VERTICAL) ? v_bitmap : h_bitmap; + bitmap.stretchToRectAlpha(canvas, &r); + + if (vert == DIVIDER_VERTICAL) { + int h = sizerRect.bottom - sizerRect.top; + int gh = v_grabber.getHeight(); + if (h > gh) { + RECT rr = sizerRect; + rr.top += (h - gh) / 2; + rr.bottom -= (h - gh) / 2; + v_grabber.stretchToRectAlpha(canvas, &rr); + } + } else { + int w = sizerRect.right - sizerRect.left; + int gw = h_grabber.getWidth(); + if (w > gw) { + RECT rr = sizerRect; + rr.left += (w - gw) / 2; + rr.right -= (w - gw) / 2; + h_grabber.stretchToRectAlpha(canvas, &rr); + } + } + + if (windowshaded[0]) { + RECT wr = cr; + if (vert == DIVIDER_VERTICAL) { + wr.right = r.left; + } else if (vert == DIVIDER_HORIZONTAL) { + wr.bottom = r.top; + } + + ws_bitmap.stretchToRect(canvas, &wr); + } + + } + + return 1; +} + +int FrameWnd::onLeftButtonDown(int x, int y) { + FRAMEWND_PARENT::onLeftButtonDown(x, y); + if (!resizeable) return 1; + POINT p = { x, y }; + if (Wasabi::Std::pointInRect(sizerRect, p)) { + beginCapture(); + RECT r; + getClientRect(&r); + x -= r.left; + y -= r.top; + snapoffsety= y - (y % SNAP); + snapoffsetx= x - (x % SNAP); + resizing = 1; + return 1; + } + return 0; +} + +int FrameWnd::onMouseMove(int x, int y) { + int pos, mpos; + RECT r; + + if (!resizing) return 1; + + FRAMEWND_PARENT::onMouseMove(x,y); + + prevpullbarpos = pullbarpos; + + getClientRect(&r); + x -= r.left; + y -= r.top; + + if (vert == DIVIDER_VERTICAL) { + pos = r.right - r.left; + if ((x - (x % SNAP)) == snapoffsetx) + return 1; + mpos=x; + snapoffsetx=(x - (x % SNAP)); + } else { + pos = r.bottom - r.top; + if ((y - (y % SNAP)) == snapoffsety) + return 1; + mpos=y; + snapoffsety=y - (y % SNAP); + } + ASSERT(pos != 0); + if (mpos < 0) mpos = 0; + if (mpos > pos) mpos = pos; + + if(divideside == SDP_FROMLEFT) { + pullbarpos = mpos; + } else { + pullbarpos = pos-mpos; + } + + int realMinPixels; + if (minpixels) + { + realMinPixels=minpixels; + if (minpixels<0) + realMinPixels = (r.bottom - r.top) + minpixels; + } + else + realMinPixels = convertPropToPix(minwidth); + + if (divideside == SDP_FROMLEFT) + { + if (pullbarpos < realMinPixels) + { + if (rwchildren[0] != NULL && rwchildren[0]->childNotify(NULL, ChildNotify::FRAMEWND_WINDOWSHADE_CAPABLE, 0, 0)) { + pullbarpos = 0; + windowshade(0, TRUE); + } else { + pullbarpos = realMinPixels; + } + } else { + windowshade(0, FALSE); + } + } else if (divideside == SDP_FROMRIGHT) { + if (pullbarpos < realMinPixels) { + if (rwchildren[1] != NULL /* && rwchildren[1]->childNotify(NULL, CHILD_WINDOWSHADE_CAPABLE) */) { + pullbarpos = /*convertPropToPix(PULLBAR_FULL)-*/0; + windowshade(1, TRUE); + } else { + pullbarpos = realMinPixels; + } + } else { + windowshade(1, FALSE); + } + } + + if (!windowshaded[0] && !windowshaded[1]) { +// if (pullbarpos > pos-convertPropToPix(minwidth)) +// pullbarpos = pos-convertPropToPix(minwidth); + int realMaxPixels; + if (maxpixels || noMaxRestriction) + { + realMaxPixels=maxpixels; + if (maxpixels<0 || noMaxRestriction) + { + if (vert == DIVIDER_VERTICAL) + realMaxPixels = (r.right - r.left) + maxpixels; + else + realMaxPixels = (r.bottom - r.top) + maxpixels; + } + + } + else + realMaxPixels=convertPropToPix(maxwidth); + + if (pullbarpos > realMaxPixels) + pullbarpos = realMaxPixels; + } + + ASSERT(pullbarpos >= 0); + + if (pullbarpos != prevpullbarpos && isInited()) + onResize(); + + return 1; +} + +int FrameWnd::onLeftButtonUp(int x, int y) { + FRAMEWND_PARENT::onLeftButtonUp(x, y); + if (resizing) { + endCapture(); + resizing = 0; +#ifdef WASABI_COMPILE_CONFIG + if (getId() != NULL) { + StringPrintfW buf(L"FrameWnd/%s,p", getId()); + WASABI_API_CONFIG->setIntPrivate(buf, pullbarpos); + } +#endif + return 1; + } + return 0; +} + +void FrameWnd::windowshade(int which, int shaded) { + ASSERT(which == 0 || which == 1); + if (!!windowshaded[which] == !!shaded) return; + if (rwchildren[which] == NULL) return; + rwchildren[which]->childNotify(NULL, ChildNotify::FRAMEWND_WINDOWSHADE_ENABLE, shaded, 0); + windowshaded[which] = shaded; + rwchildren[which]->setVisible(!shaded); +} + +ifc_window *FrameWnd::getWindowShadedChild() { + if (nchild != 2) return NULL; + if (!(windowshaded[0] | windowshaded[1])) return NULL; + return windowshaded[0] ? rwchildren[0] : rwchildren[1]; +} + +int FrameWnd::onGetFocus() { + postDeferredCallback(DC_FWFOCUS, 0); + return 1; +} + +int FrameWnd::onDeferredCallback(intptr_t p1, intptr_t p2) { + switch (p1) { + case DC_FWFOCUS: + if (rwchildren[0]) rwchildren[0]->setFocus(); + break; + default: + return FRAMEWND_PARENT::onDeferredCallback(p1, p2); + } + return 1; +} + + +void FrameWnd::setSnap(int snap) +{ + if (snap>0) + SNAP=snap; +}
\ No newline at end of file |