aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/wnd/wndclass/clickwnd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/wnd/wndclass/clickwnd.cpp')
-rw-r--r--Src/Wasabi/api/wnd/wndclass/clickwnd.cpp319
1 files changed, 319 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wnd/wndclass/clickwnd.cpp b/Src/Wasabi/api/wnd/wndclass/clickwnd.cpp
new file mode 100644
index 00000000..054915a2
--- /dev/null
+++ b/Src/Wasabi/api/wnd/wndclass/clickwnd.cpp
@@ -0,0 +1,319 @@
+#include "precomp.h"
+#include <api/wnd/api_wnd.h>
+
+#include "clickwnd.h"
+#include <api/wnd/notifmsg.h>
+#include <api/wnd/wndclass/guiobjwnd.h>
+
+
+enum
+{
+ CLICKWND_LBUTTONDOWN = 0,
+ CLICKWND_LBUTTONUP,
+ CLICKWND_RBUTTONDOWN,
+ CLICKWND_RBUTTONUP,
+};
+
+ClickWnd::ClickWnd()
+{
+ handleRight = TRUE;
+ button = -1;
+ mousedown = 0;
+ mcaptured = 0;
+ hilite = 0;
+ down = 0;
+ areacheck = 0;
+}
+
+ClickWnd::~ClickWnd()
+{
+ BaseWnd::hintDestroying(); // so basewnd doesn't call onCancelCapture
+ if (getCapture()) endCapture();
+}
+
+void ClickWnd::setHandleRightClick(int tf)
+{
+ handleRight=tf;
+}
+
+int ClickWnd::getHandleRightClick()
+{
+ return handleRight;
+}
+
+int ClickWnd::onLeftButtonDown(int x, int y)
+{
+ notifyParent(ChildNotify::CLICKWND_LEFTDOWN, x, y);
+ CLICKWND_PARENT::onLeftButtonDown(x, y);
+ abortTip();
+#ifdef _WIN32
+ ifc_window *dp = getDesktopParent();
+ if (dp != NULL)
+ {
+ if (dp->wantActivation())
+ {
+ SetActiveWindow(getRootParent()->gethWnd());
+ SetFocus(getRootParent()->gethWnd());
+ }
+ else
+ {
+ HWND w = dp->gethWnd();
+ HWND owner = GetWindow(w, GW_OWNER);
+ if (owner != NULL) {
+ SetActiveWindow(owner);
+ SetFocus(owner);
+ }
+ }
+ }
+ else
+ {
+ SetActiveWindow(getRootParent()->gethWnd());
+ }
+#else
+#warning port me or remove me
+#endif
+ if (ptInRegion(x, y))
+ return onButtonDown(CLICKWND_LBUTTONDOWN, x, y);
+ else
+ return 1;
+}
+
+int ClickWnd::onRightButtonDown(int x, int y)
+{
+ notifyParent(ChildNotify::CLICKWND_RIGHTDOWN, x, y);
+ CLICKWND_PARENT::onRightButtonDown(x, y);
+ abortTip();
+ if (!handleRight) return 1;
+ if (ptInRegion(x, y))
+ return onButtonDown(CLICKWND_RBUTTONDOWN, x, y);
+ else
+ return 1;
+}
+
+int ClickWnd::onLeftButtonUp(int x, int y)
+{
+ notifyParent(ChildNotify::CLICKWND_LEFTUP, x, y);
+ CLICKWND_PARENT::onLeftButtonUp(x, y);
+//jf
+// if (ptInRegion())
+ return onButtonUp(CLICKWND_LBUTTONUP, x, y);
+// else
+// return 1;
+}
+
+int ClickWnd::onRightButtonUp(int x, int y)
+{
+ notifyParent(ChildNotify::CLICKWND_RIGHTUP, x, y);
+ CLICKWND_PARENT::onRightButtonUp(x, y);
+ //jf
+ //if (ptInRegion())
+ if (!handleRight) {
+ onRightPush(x, y);
+ return 1;
+ }
+ return onButtonUp(CLICKWND_RBUTTONUP, x, y);
+// else
+// return 1;
+}
+
+int ClickWnd::onMouseMove(int x, int y)
+{
+ POINT pos, rpos={x,y};
+ int mouseover;
+
+ CLICKWND_PARENT::onMouseMove(x, y);
+
+ pos=rpos;
+ clientToScreen(&pos);
+
+ int lasthilite = hilite;
+
+ mouseover = (WASABI_API_WND->rootWndFromPoint(&pos) == static_cast<ifc_window *>(this) && ptInRegion(x, y));
+ if (!mouseover && (!mousedown
+#ifdef _WIN32
+ || !Std::keyDown(button?MK_RBUTTON:MK_LBUTTON)
+#else
+#warning port me
+#endif
+ )) {
+ if (mcaptured || getCapture()) {
+ endCapture();
+ mcaptured = 0;
+ }
+ mousedown = 0;
+ down = 0;
+ if (wantClickWndAutoInvalidate()) invalidate();
+ if (hilite) _onLeaveArea();
+ hilite = 0;
+ return 1;
+ } else if (!mouseover && hilite) {
+ hilite = 0;
+ _onLeaveArea();
+ } else if (mouseover && !hilite) {
+ hilite = 1;
+ _onEnterArea();
+ }
+
+ if (!getCapture() && mouseover) { // capture to see when leave
+ _enterCapture();
+ }
+
+ int lastdown = down;
+ hilite = mouseover;
+#ifdef WASABI_COMPILE_WNDMGR
+ int m = getGuiObject() ? getGuiObject()->guiobject_getMover() : 0;
+#else
+ int m = 0;
+#endif
+ if (!m) {
+ down = userDown() || (mouseover && mousedown);
+ } else
+ down = userDown() || mousedown;
+
+ // FG> note to self now that i finally fixed this... :
+ // there is a potential bottleneck here, if for some reason this test is always true when moving the windows around like crazy.
+ if (down != lastdown || (hilite != lasthilite && !m)) {
+ if (wantClickWndAutoInvalidate()) invalidate();
+ }
+
+//invalidate();
+ return 1;
+}
+
+void ClickWnd::_enterCapture()
+{
+ //gee!! if (!hilite) _onEnterArea();
+ if (!getCapture()) beginCapture();
+ mcaptured = 1;
+}
+
+int ClickWnd::onButtonDown(int which, int x, int y)
+{
+ if (!wantClicks()) return 1;
+
+ if (!getCapture()) {
+ _enterCapture();
+ }
+ mousedown = 1;
+ down = 1;
+ button = -1;
+ if (which == CLICKWND_LBUTTONDOWN) button = 0;
+ else if (which == CLICKWND_RBUTTONDOWN) button = 1;
+ if (wantClickWndAutoInvalidate()) invalidate();
+
+ return 1;
+}
+
+int ClickWnd::onButtonUp(int which, int x, int y)
+{
+ // make sure same button
+ if (button == 0 && which == CLICKWND_RBUTTONUP) return 1;
+ if (button == 1 && which == CLICKWND_LBUTTONUP) return 1;
+
+ if (!down) {
+ if (mcaptured) {
+ endCapture();
+ mcaptured = 0;
+ }
+ if (hilite) _onLeaveArea();
+ hilite = 0;
+ mousedown = 0;
+ return 1;
+ }
+
+ POINT pos={x,y};
+ clientToScreen(&pos);
+
+ int mouseover = (WASABI_API_WND->rootWndFromPoint(&pos) == (ifc_window *)this && ptInRegion(x, y));
+ if (!mouseover) {
+ if (mcaptured) {
+ endCapture();
+ mcaptured = 0;
+ }
+ if (hilite) _onLeaveArea();
+ hilite = 0;
+ }
+
+ // it was down, process the event
+ int a = down;
+ down = 0;
+ mousedown = 0;
+ if (wantClickWndAutoInvalidate()) invalidate();
+
+ if (a) {
+ if (button == 0) onLeftPush(x, y);
+ else if (button == 1) onRightPush(x, y);
+ }
+
+ // we need to do this again (and get the new mouse pos) because onLeft/RightPush may have called a
+ // message loop and let the mouse leave without us being aware of it
+ Wasabi::Std::getMousePos(&x, &y);
+ pos.x = x;
+ pos.y = y;
+ screenToClient(&x, &y);
+ mouseover = (WASABI_API_WND->rootWndFromPoint(&pos) == (ifc_window *)this && ptInRegion(x, y));
+ if (!mouseover && hilite) _onLeaveArea();
+ else if (mouseover && !hilite) _onEnterArea();
+ hilite = mouseover;
+
+ return 1;
+}
+
+void ClickWnd::onSetVisible( int show )
+{
+ CLICKWND_PARENT::onSetVisible( show );
+ if ( !show )
+ {
+ if ( getCapture() )
+ {
+ mcaptured = 0;
+ endCapture();
+ }
+ down = 0;
+ mousedown = 0;
+
+ if ( hilite )
+ _onLeaveArea();
+
+ hilite = 0;
+ }
+}
+
+void ClickWnd::_onEnterArea()
+{
+ if (areacheck == 0) {
+ areacheck++;
+ onEnterArea();
+ } else
+ DebugString("onEnterArea check failed %08X \n", this);
+}
+
+void ClickWnd::_onLeaveArea()
+{
+ if (areacheck == 1) {
+ areacheck--;
+ onLeaveArea();
+ } else
+ DebugString("onLeaveArea check failed %08X\n", this);
+}
+
+void ClickWnd::onEnterArea()
+{
+// DebugString("onEnterArea %08X\n", this);
+}
+
+void ClickWnd::onLeaveArea()
+{
+// DebugString("onLeaveArea %08X\n", this);
+}
+
+void ClickWnd::onCancelCapture()
+{
+ CLICKWND_PARENT::onCancelCapture();
+ mcaptured=0;
+ down = 0;
+ mousedown = 0;
+ if (hilite) _onLeaveArea();
+ hilite = 0;
+}
+