Skip to content

Commit

Permalink
Added WindowScrollwheelHandler function
Browse files Browse the repository at this point in the history
  • Loading branch information
nickgammon committed Jun 16, 2010
1 parent 40eed91 commit 2341a43
Show file tree
Hide file tree
Showing 11 changed files with 147 additions and 17 deletions.
11 changes: 10 additions & 1 deletion OtherTypes.h
Expand Up @@ -1141,7 +1141,8 @@ class CHotspot
m_dispid_CancelMouseDown (DISPID_UNKNOWN),
m_dispid_MouseUp (DISPID_UNKNOWN),
m_dispid_MoveCallback (DISPID_UNKNOWN),
m_dispid_ReleaseCallback (DISPID_UNKNOWN)
m_dispid_ReleaseCallback (DISPID_UNKNOWN),
m_dispid_ScrollwheelCallback (DISPID_UNKNOWN)
{} // constructor

CRect m_rect; // where it is
Expand All @@ -1162,6 +1163,8 @@ class CHotspot
string m_sReleaseCallback; // callback when mouse released
long m_DragFlags; // drag-and-drop flags

string m_sScrollwheelCallback; // mouse-wheel (scroll wheel) moved over hotspot

// dispids for calling functions from NOT in a plugin (ignored in a plugin)
DISPID m_dispid_MouseOver; // function to call on mouseover
DISPID m_dispid_CancelMouseOver; // function to call when mouse moves away or is clicked
Expand All @@ -1170,6 +1173,7 @@ class CHotspot
DISPID m_dispid_MouseUp; // mouse up following a mouse-down in this hotspot
DISPID m_dispid_MoveCallback; // callback when mouse moves
DISPID m_dispid_ReleaseCallback; // callback when mouse released
DISPID m_dispid_ScrollwheelCallback; // callback when scroll wheel moved

}; // end of class CStringValuePair

Expand Down Expand Up @@ -1375,6 +1379,11 @@ class CMiniWindow
LPCTSTR ReleaseCallback,
long Flags);

long ScrollwheelHandler(CMUSHclientDoc * pDoc,
LPCTSTR HotspotId,
string sPluginID,
LPCTSTR MoveCallback);

long HotspotTooltip(LPCTSTR HotspotId,
LPCTSTR TooltipText);

Expand Down
1 change: 1 addition & 0 deletions doc.cpp
Expand Up @@ -609,6 +609,7 @@ BEGIN_DISPATCH_MAP(CMUSHclientDoc, CDocument)
DISP_FUNCTION(CMUSHclientDoc, "WindowHotspotTooltip", WindowHotspotTooltip, VT_I4, VTS_BSTR VTS_BSTR VTS_BSTR)
DISP_FUNCTION(CMUSHclientDoc, "WindowDrawImageAlpha", WindowDrawImageAlpha, VT_I4, VTS_BSTR VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_R8 VTS_I4 VTS_I4)
DISP_FUNCTION(CMUSHclientDoc, "WindowGetImageAlpha", WindowGetImageAlpha, VT_I4, VTS_BSTR VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_I4)
DISP_FUNCTION(CMUSHclientDoc, "WindowScrollwheelHandler", WindowScrollwheelHandler, VT_I4, VTS_BSTR VTS_BSTR VTS_BSTR)
DISP_PROPERTY_PARAM(CMUSHclientDoc, "NormalColour", GetNormalColour, SetNormalColour, VT_I4, VTS_I2)
DISP_PROPERTY_PARAM(CMUSHclientDoc, "BoldColour", GetBoldColour, SetBoldColour, VT_I4, VTS_I2)
DISP_PROPERTY_PARAM(CMUSHclientDoc, "CustomColourText", GetCustomColourText, SetCustomColourText, VT_I4, VTS_I2)
Expand Down
1 change: 1 addition & 0 deletions doc.h
Expand Up @@ -2618,6 +2618,7 @@ class CMUSHclientDoc : public CDocument
afx_msg long WindowHotspotTooltip(LPCTSTR Name, LPCTSTR HotspotId, LPCTSTR TooltipText);
afx_msg long WindowDrawImageAlpha(LPCTSTR Name, LPCTSTR ImageId, long Left, long Top, long Right, long Bottom, double Opacity, long SrcLeft, long SrcTop);
afx_msg long WindowGetImageAlpha(LPCTSTR Name, LPCTSTR ImageId, long Left, long Top, long Right, long Bottom, long SrcLeft, long SrcTop);
afx_msg long WindowScrollwheelHandler(LPCTSTR Name, LPCTSTR HotspotId, LPCTSTR MoveCallback);
afx_msg long GetNormalColour(short WhichColour);
afx_msg void SetNormalColour(short WhichColour, long nNewValue);
afx_msg long GetBoldColour(short WhichColour);
Expand Down
35 changes: 35 additions & 0 deletions miniwindow.cpp
Expand Up @@ -4070,3 +4070,38 @@ long CMiniWindow::GetImageAlpha(LPCTSTR ImageId,


} // end of CMiniWindow::GetImageAlpha


long CMiniWindow::ScrollwheelHandler(CMUSHclientDoc * pDoc, LPCTSTR HotspotId, string sPluginID, LPCTSTR MoveCallback)
{

if (strlen (MoveCallback) > 0 && CheckLabel (MoveCallback, true))
return eInvalidObjectLabel;

// can't switch plugins here :)
if (!m_sCallbackPlugin.empty () && m_sCallbackPlugin != sPluginID)
return eHotspotPluginChanged;

HotspotMapIterator it = m_Hotspots.find (HotspotId);

if (it == m_Hotspots.end ())
return eHotspotNotInstalled; // no such hotspot

CHotspot * pHotspot = it->second;

pHotspot->m_sScrollwheelCallback = MoveCallback;


// if not in a plugin, look in main world for hotspot callbacks, and remember the dispatch ID
if (sPluginID.empty ())
{

CString strErrorMessage;

pHotspot->m_dispid_ScrollwheelCallback = pDoc->GetProcedureDispid (MoveCallback, "scroll wheel", "", strErrorMessage);
}

return eOK;


} // end of CMiniWindow::ScrollwheelHandler
1 change: 1 addition & 0 deletions mushclient.cnt
Expand Up @@ -550,6 +550,7 @@
3 WindowPolygon=FNC_WindowPolygon
3 WindowPosition=FNC_WindowPosition
3 WindowRectOp=FNC_WindowRectOp
3 WindowScrollwheelHandler=FNC_WindowScrollwheelHandler
3 WindowSetPixel=FNC_WindowSetPixel
3 WindowShow=FNC_WindowShow
3 WindowText=FNC_WindowText
Expand Down
17 changes: 9 additions & 8 deletions mushclient.odl
Expand Up @@ -70,14 +70,14 @@ library MUSHclient
[id(44)] long SetCommand(BSTR Message);
[id(45)] BSTR GetNotes();
[id(46)] void SetNotes(BSTR Message);
[id(399), propget] long NormalColour(short WhichColour);
[id(399), propput] void NormalColour(short WhichColour, long nNewValue);
[id(400), propget] long BoldColour(short WhichColour);
[id(400), propput] void BoldColour(short WhichColour, long nNewValue);
[id(401), propget] long CustomColourText(short WhichColour);
[id(401), propput] void CustomColourText(short WhichColour, long nNewValue);
[id(402), propget] long CustomColourBackground(short WhichColour);
[id(402), propput] void CustomColourBackground(short WhichColour, long nNewValue);
[id(400), propget] long NormalColour(short WhichColour);
[id(400), propput] void NormalColour(short WhichColour, long nNewValue);
[id(401), propget] long BoldColour(short WhichColour);
[id(401), propput] void BoldColour(short WhichColour, long nNewValue);
[id(402), propget] long CustomColourText(short WhichColour);
[id(402), propput] void CustomColourText(short WhichColour, long nNewValue);
[id(403), propget] long CustomColourBackground(short WhichColour);
[id(403), propput] void CustomColourBackground(short WhichColour, long nNewValue);
[id(47)] void Redraw();
[id(48)] long ResetTimer(BSTR TimerName);
[id(49)] void SetOutputFont(BSTR FontName, short PointSize);
Expand Down Expand Up @@ -430,6 +430,7 @@ library MUSHclient
[id(396)] long WindowHotspotTooltip(BSTR Name, BSTR HotspotId, BSTR TooltipText);
[id(397)] long WindowDrawImageAlpha(BSTR Name, BSTR ImageId, long Left, long Top, long Right, long Bottom, double Opacity, long SrcLeft, long SrcTop);
[id(398)] long WindowGetImageAlpha(BSTR Name, BSTR ImageId, long Left, long Top, long Right, long Bottom, long SrcLeft, long SrcTop);
[id(399)] long WindowScrollwheelHandler(BSTR Name, BSTR HotspotId, BSTR MoveCallback);
//}}AFX_ODL_METHOD

};
Expand Down
62 changes: 55 additions & 7 deletions mushview.cpp
Expand Up @@ -4902,6 +4902,20 @@ unsigned int iScrollLines;
if (iScrollLines == 0)
return 0; // scrolling not enabled

CPoint point (pt);
CClientDC dc(this);
// CView changes the viewport origin and mapping mode.
// It's necessary to convert the point from device coordinates
// to logical coordinates, such as are stored in the document.
OnPrepareDC(&dc);

dc.DPtoLP(&point);

// if over miniwindow, don't keep going

if (Mouse_Wheel_MiniWindow (pDoc, point, zDelta < 0 ? -1 : 1))
return 1;

if (iScrollLines == WHEEL_PAGESCROLL)
{
if (zDelta < 0) // page down
Expand Down Expand Up @@ -6213,7 +6227,8 @@ void CMUSHView::Send_Mouse_Event_To_Plugin (DISPID iDispatchID,
const string m_sPluginID,
const string sRoutineName,
const string HotspotId,
long Flags)
long Flags,
bool dont_modify_flags)
{

// only if they have a routine
Expand All @@ -6230,14 +6245,17 @@ ASSERT_VALID(pDoc);
// 0x40 - double-click
// 0x80 - mouse-over not first time

if (GetKeyState (VK_SHIFT) < 0) // shift+click
Flags |= 1;
if (!dont_modify_flags)
{
if (GetKeyState (VK_SHIFT) < 0) // shift+click
Flags |= 1;

if (GetKeyState (VK_CONTROL) < 0) // ctrl+click
Flags |= 2;
if (GetKeyState (VK_CONTROL) < 0) // ctrl+click
Flags |= 2;

if (GetKeyState (VK_MENU) < 0) // alt+click
Flags |= 4;
if (GetKeyState (VK_MENU) < 0) // alt+click
Flags |= 4;
} // can modify flags


if (m_sPluginID.empty ())
Expand Down Expand Up @@ -7202,3 +7220,33 @@ LRESULT CMUSHView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
// cannot get here

}


bool CMUSHView::Mouse_Wheel_MiniWindow (CMUSHclientDoc* pDoc, CPoint point, long delta)
{
// see if we moused over one of our miniwindows

CMiniWindow * mw = NULL;
CHotspot * pHotspot = NULL;
string sHotspotId;
string sMiniWindowId;

ScreenToClient(&point);

mw = Mouse_Over_Miniwindow (pDoc, point, sHotspotId, pHotspot, sMiniWindowId);

if (!mw)
return false;

// now, are we now over a hotspot?
if (pHotspot)
Send_Mouse_Event_To_Plugin (pHotspot->m_dispid_ScrollwheelCallback,
mw->m_sCallbackPlugin,
pHotspot->m_sScrollwheelCallback,
sHotspotId,
delta, true);

return true; // we are over mini-window - don't scroll underlying text

} // end of CMUSHView::Mouse_Wheel_MiniWindow

4 changes: 3 additions & 1 deletion mushview.h
Expand Up @@ -96,7 +96,8 @@ void Send_Mouse_Event_To_Plugin (DISPID iDispatchID,
const string m_sPluginID,
const string sRoutineName,
const string HotspotId,
long Flags = 0);
long Flags = 0,
bool dont_modify_flags = false);

CMiniWindow * Mouse_Over_Miniwindow (CMUSHclientDoc* pDoc,
CPoint point,
Expand All @@ -108,6 +109,7 @@ bool Mouse_Move_MiniWindow (CMUSHclientDoc* pDoc, CPoint point);
bool Mouse_Down_MiniWindow (CMUSHclientDoc* pDoc, CPoint point, long flags);
bool Mouse_Up_MiniWindow (CMUSHclientDoc* pDoc, CPoint point, long flags);
bool Mouse_Tooltip_MiniWindow (CMUSHclientDoc* pDoc, CPoint point, NMHDR * pNMHDR);
bool Mouse_Wheel_MiniWindow (CMUSHclientDoc* pDoc, CPoint point, long delta);

void Calculate_MiniWindow_Rectangles (CMUSHclientDoc* pDoc, const bool bUnderneath);

Expand Down
1 change: 1 addition & 0 deletions scripting/functionlist.cpp
Expand Up @@ -405,6 +405,7 @@ const char * sFunctions [] = {
"WindowPolygon",
"WindowPosition",
"WindowRectOp",
"ScrollwheelHandler",
"WindowSetPixel",
"WindowShow",
"WindowText",
Expand Down
15 changes: 15 additions & 0 deletions scripting/lua_methods.cpp
Expand Up @@ -5916,6 +5916,20 @@ static int L_WindowRectOp (lua_State *L)
return 1; // number of result fields
} // end of L_WindowRectOp

//----------------------------------------
// world.WindowScrollwheelHandler
//----------------------------------------
static int L_WindowScrollwheelHandler (lua_State *L)
{
CMUSHclientDoc *pDoc = doc (L);
lua_pushnumber (L, pDoc->WindowScrollwheelHandler (
my_checkstring (L, 1), // Name
my_checkstring (L, 2), // HotspotId
my_optstring (L, 3, "") // MoveCallback
));
return 1; // number of result fields
} // end of L_WindowScrollwheelHandler

//----------------------------------------
// world.WindowSetPixel
//----------------------------------------
Expand Down Expand Up @@ -6450,6 +6464,7 @@ static const struct luaL_reg worldlib [] =
{"WindowPolygon", L_WindowPolygon},
{"WindowPosition", L_WindowPosition},
{"WindowRectOp", L_WindowRectOp},
{"WindowScrollwheelHandler", L_WindowScrollwheelHandler},
{"WindowSetPixel", L_WindowSetPixel},
{"WindowShow", L_WindowShow},
{"WindowText", L_WindowText},
Expand Down
16 changes: 16 additions & 0 deletions scripting/methods.cpp
Expand Up @@ -14037,6 +14037,22 @@ long CMUSHclientDoc::WindowDragHandler(LPCTSTR Name, LPCTSTR HotspotId, LPCTSTR
} // end of CMUSHclientDoc::WindowDragHandler


long CMUSHclientDoc::WindowScrollwheelHandler(LPCTSTR Name, LPCTSTR HotspotId, LPCTSTR MoveCallback)
{
MiniWindowMapIterator it = m_MiniWindows.find (Name);

if (it == m_MiniWindows.end ())
return eNoSuchWindow;

string sPluginID;

if (m_CurrentPlugin)
sPluginID = m_CurrentPlugin->m_strID;

return it->second->ScrollwheelHandler (this, HotspotId, sPluginID, MoveCallback);
} // end of CMUSHclientDoc::WindowScrollwheelHandler


long CMUSHclientDoc::SetCursor(long Cursor)
{
switch (Cursor)
Expand Down

0 comments on commit 2341a43

Please sign in to comment.