123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- #include <precomp.h>
- #include "snappnt.h"
- #include <api/wndmgr/layout.h>
- #include <api/wnd/wndtrack.h>
- #include <api/config/items/cfgitem.h>
- SnapPoint::SnapPoint(Layout *l, Container *c)
- {
- points.addItem(this);
- setParentLayout(l);
- setParentContainer(c);
- }
- SnapPoint::~SnapPoint()
- {
- points.removeItem(this);
- }
- void SnapPoint::removeAll()
- {
- points.deleteAllSafe();
- }
- int SnapPoint::setXmlParam(const wchar_t *paramname, const wchar_t *strvalue)
- {
- if (!WCSICMP(paramname, L"id")) id = strvalue;
- else if (!WCSICMP(paramname, L"x")) x = WTOI(strvalue);
- else if (!WCSICMP(paramname, L"y")) y = WTOI(strvalue);
- else if (!WCSICMP(paramname, L"relatx")) relatx = WTOI(strvalue);
- else if (!WCSICMP(paramname, L"relaty")) relaty = WTOI(strvalue);
- else return 0;
- return 1;
- }
- void SnapPoint::setParentLayout(Layout *l)
- {
- playout = l;
- }
- void SnapPoint::setParentContainer(Container *c)
- {
- pcontainer = c;
- }
- Container *SnapPoint::getParentContainer()
- {
- return pcontainer;
- }
- Layout *SnapPoint::getParentLayout()
- {
- return playout;
- }
- const wchar_t *SnapPoint::getId()
- {
- return id;
- }
- int SnapPoint::getX()
- {
- if (getParentLayout())
- return (int)((double)x * getParentLayout()->getRenderRatio());
- return x;
- }
- int SnapPoint::getY()
- {
- if (getParentLayout())
- return (int)((double)y * getParentLayout()->getRenderRatio());
- return y;
- }
- PtrList<SnapPoint> SnapPoint::points;
- int SnapPoint::match(ifc_window *master, RECT *z, ifc_window *slave, int flag, int *donex, int *doney, int w, int h)
- {
- SnapPoint *pmast;
- SnapPoint *pslav;
- for (int i = 0;i < points.getNumItems();i++)
- if (points.enumItem(i)->getParentLayout() == master)
- {
- pmast = points.enumItem(i);
- for (int j = 0;j < points.getNumItems();j++)
- if (points.enumItem(j)->getParentLayout() == slave)
- {
- pslav = points.enumItem(j);
- int r = do_match(pmast, pslav, z, flag, donex, doney, w, h);
- if (r)
- return 1;
- }
- }
- return 0;
- }
- int SnapPoint::do_match(SnapPoint *pmast, SnapPoint *pslav, RECT *z, int mask, int *donex, int *doney, int w, int h)
- {
- //#if 0//BU> lone needs to make this work again
- //fg> maybe it would have been a good idea to tell me about it... especially since it *works fine*
- ASSERT(pmast);
- ASSERT(pslav);
- int f = 0;
- if (((mask & KEEPSIZE) == 0) && !z)
- {
- ASSERTPR(0, "match resize with no rect");
- }
- if (!z)
- { // just testing if docked
- if (!WCSICMP(pmast->getId(), pslav->getId()))
- {
- BaseWnd *wm = pmast->getParentLayout();
- BaseWnd *ws = pslav->getParentLayout();
- if (ws && ws)
- {
- RECT pmr, psr;
- wm->getWindowRect(&pmr);
- ws->getWindowRect(&psr);
- pmr.left += pmast->relatx ? pmast->getX() : (pmr.right - pmr.left + pmast->getX());
- pmr.top += pmast->relaty ? pmast->getY() : (pmr.bottom - pmr.top + pmast->getY());
- psr.left += pmast->relatx ? pslav->getX() : (psr.right - psr.left + pslav->getX());
- psr.top += pmast->relaty ? pslav->getY() : (psr.bottom - psr.top + pslav->getY());
- if (pmr.left == psr.left && pmr.top == psr.top)
- {
- if (donex) *donex = 1;
- if (doney) *doney = 1;
- return 1;
- }
- }
- }
- }
- else
- {
- ASSERT(donex);
- ASSERT(doney);
- if (!WCSICMP(pmast->getId(), pslav->getId()))
- {
- //CUT: BaseWnd *wm = pmast->getParentLayout();
- BaseWnd *ws = pslav->getParentLayout();
- if (ws && ws)
- {
- RECT pmr, psr, osr, omr;
- pmr = omr = *z;
- ws->getWindowRect(&psr);
- osr = psr;
- pmr.left += pmast->relatx ? pmast->getX() : (pmr.right - pmr.left + pmast->getX());
- pmr.top += pmast->relaty ? pmast->getY() : (pmr.bottom - pmr.top + pmast->getY());
- psr.left += pmast->relatx ? pslav->getX() : (psr.right - psr.left + pslav->getX());
- psr.top += pmast->relaty ? pslav->getY() : (psr.bottom - psr.top + pslav->getY());
- if (pmr.left > psr.left - 10 && pmr.left < psr.left + 10 && (mask & LEFT) && ! *donex)
- {
- *donex = 1;
- z->left = omr.left - (pmr.left - psr.left);
- if (mask & KEEPSIZE)
- z->right = z->left + w;
- f++;
- }
- if (pmr.top > psr.top - 10 && pmr.top < psr.top + 10 && (mask & TOP) && ! *doney)
- {
- z->top = omr.top - (pmr.top - psr.top);
- *doney = 1;
- if (mask & KEEPSIZE)
- z->bottom = z->top + h;
- f++;
- }
- }
- }
- return f > 0;
- }
- return 0;
- }
|