From: <mie...@us...> - 2012-11-19 01:09:18
|
Revision: 8601 http://sourceforge.net/p/oorexx/code-0/8601 Author: miesfeld Date: 2012-11-19 01:09:14 +0000 (Mon, 19 Nov 2012) Log Message: ----------- #419 Add Tooltip control See ticket [Feature-Requests:#419] Modified Paths: -------------- ooDialog/trunk/ooDialog/ooDialog.cpp ooDialog/trunk/ooDialog/ooDialog.hpp ooDialog/trunk/ooDialog/oodMessaging.cpp ooDialog/trunk/ooDialog/oodToolTip.cpp Modified: ooDialog/trunk/ooDialog/ooDialog.cpp =================================================================== --- ooDialog/trunk/ooDialog/ooDialog.cpp 2012-11-17 05:03:53 UTC (rev 8600) +++ ooDialog/trunk/ooDialog/ooDialog.cpp 2012-11-19 01:09:14 UTC (rev 8601) @@ -395,8 +395,9 @@ EnterCriticalSection(&crit_sec); #if 0 - printf("In delDialog() hDlg=%p tabIdx=%d allocate=%d isActive=%d onTop=%d prev=%p\n", - pcpbd->hDlg, pcpbd->tableIndex, pcpbd->dlgAllocated, pcpbd->isActive, pcpbd->onTheTop, pcpbd->previous); + printf("In delDialog() hDlg=%p tabIdx=%d allocate=%d isActive=%d onTop=%d prev=%p abnormalHalt=%d\n", + pcpbd->hDlg, pcpbd->tableIndex, pcpbd->dlgAllocated, pcpbd->isActive, pcpbd->onTheTop, pcpbd->previous, + pcpbd->abnormalHalt); #endif if ( ! pcpbd->dlgAllocated ) Modified: ooDialog/trunk/ooDialog/ooDialog.hpp =================================================================== --- ooDialog/trunk/ooDialog/ooDialog.hpp 2012-11-17 05:03:53 UTC (rev 8600) +++ ooDialog/trunk/ooDialog/ooDialog.hpp 2012-11-19 01:09:14 UTC (rev 8601) @@ -768,6 +768,7 @@ #define RE_SHOW_IDX 2 #define RE_POP_IDX 3 #define RE_LINKCLICK_IDX 4 +#define RE_NORELAY_IDX 5 // A specific structure used for subclassing controls to use with the tool tip // relay event. This structure is allocate and then set as the pData member of @@ -780,6 +781,7 @@ // Rexx methods to invoke, 1 for each possible event. char *methods[RE_COUNT_RELAYEVENTS]; bool doEvent[RE_COUNT_RELAYEVENTS]; + bool skipRelay; } RelayEventData; typedef RelayEventData *pRelayEventData; Modified: ooDialog/trunk/ooDialog/oodMessaging.cpp =================================================================== --- ooDialog/trunk/ooDialog/oodMessaging.cpp 2012-11-17 05:03:53 UTC (rev 8600) +++ ooDialog/trunk/ooDialog/oodMessaging.cpp 2012-11-19 01:09:14 UTC (rev 8601) @@ -595,7 +595,7 @@ * true. * * We only process the IDOK and IDCANCEL identifier when the high - * word is 0. The high work being 0 would indicate that it was a + * word is 0. The high word being 0 would indicate that it was a * button click (BN_CLICK is 0) or sent from a menu command. * * However, we should never actually get to process anything here Modified: ooDialog/trunk/ooDialog/oodToolTip.cpp =================================================================== --- ooDialog/trunk/ooDialog/oodToolTip.cpp 2012-11-17 05:03:53 UTC (rev 8600) +++ ooDialog/trunk/ooDialog/oodToolTip.cpp 2012-11-19 01:09:14 UTC (rev 8601) @@ -598,6 +598,11 @@ *mthName = "onLinkClick"; return RE_LINKCLICK_IDX; } + else if ( StrCmpI(evtName, "NORELAY") == 0 ) + { + *mthName = ""; + return RE_NORELAY_IDX; + } return OOD_ID_EXCEPTION; } @@ -707,7 +712,7 @@ pRelayEventData pred = (pRelayEventData)pData->pData; RexxThreadContext *c = pData->pcpbd->dlgProcContext; - if ( (msg >= WM_MOUSEFIRST && msg <= WM_MOUSELAST) || msg == WM_NCMOUSEMOVE) + if ( (msg >= WM_MOUSEFIRST && msg <= WM_MOUSELAST) || msg == WM_NCMOUSEMOVE && ! pred->skipRelay ) { MSG _msg; _msg.hwnd = hwnd; @@ -723,6 +728,7 @@ RexxArrayObject args = c->ArrayOfFour(pred->rxToolTip, rxPoint, rxMMsg, pData->pcdc->rexxSelf); RexxObjectPtr reply = c->SendMessage(pData->pcpbd->rexxSelf, method, args); + if ( msgReplyIsGood(c, pData->pcpbd, reply, method, false) ) { c->ReleaseLocalReference(reply); @@ -750,11 +756,13 @@ RexxArrayObject args = c->ArrayOfTwo(pred->rxToolTip, pData->pcdc->rexxSelf); RexxObjectPtr reply = c->SendMessage(pData->pcpbd->rexxSelf, method, args); + reply = checkForBoolean(c, pData->pcpbd, reply, method, false); if ( reply == NULLOBJECT ) { c->ReleaseLocalReference(args); SendMessage(pred->hToolTip, TTM_ACTIVATE, 0, 0); + endDialogPremature(pData->pcpbd, pData->pcpbd->hDlg, RexxConditionRaised); return FALSE; } @@ -770,6 +778,7 @@ } break; + case TTN_GETDISPINFOA : case TTN_GETDISPINFOW : { if ( pred->doEvent[RE_NEEDTEXT_IDX] ) @@ -788,6 +797,7 @@ c->ArrayPut(args, flags, 5); RexxObjectPtr reply = c->SendMessage(pData->pcpbd->rexxSelf, method, args); + reply = checkForBoolean(c, pData->pcpbd, reply, method, false); if ( reply == NULLOBJECT ) { @@ -816,11 +826,19 @@ if ( len > 0 ) { pCDialogControl pcdc = controlToCSelf(c, pred->rxToolTip); - safeLocalFree(pcdc->toolTipEntry->wcharBuf); - pcdc->toolTipEntry->wcharBuf = ansi2unicode(text); - nmtdi->lpszText = (LPSTR)pcdc->toolTipEntry->wcharBuf; + if ( code == TTN_GETDISPINFOW ) + { + safeLocalFree(pcdc->toolTipEntry->wcharBuf); + pcdc->toolTipEntry->wcharBuf = ansi2unicode(text); + nmtdi->lpszText = (LPSTR)pcdc->toolTipEntry->wcharBuf; + } + else + { + strcpy(pcdc->toolTipEntry->textBuf, text); + nmtdi->lpszText = pcdc->toolTipEntry->textBuf; + } } if ( reply == TheTrueObj ) { @@ -838,6 +856,57 @@ } break; + case TTN_POP : + { + if ( pred->doEvent[RE_POP_IDX] ) + { + CSTRING method = pred->methods[RE_POP_IDX]; + RexxArrayObject args = c->ArrayOfTwo(pred->rxToolTip, pData->pcdc->rexxSelf); + + RexxObjectPtr reply = c->SendMessage(pData->pcpbd->rexxSelf, method, args); + + if ( ! checkReplyIsGood(c, pData->pcpbd, reply, method, false) ) + { + c->ReleaseLocalReference(args); + SendMessage(pred->hToolTip, TTM_ACTIVATE, 0, 0); + + endDialogPremature(pData->pcpbd, pData->pcpbd->hDlg, RexxConditionRaised); + return 0; + } + + c->ReleaseLocalReference(args); + + return 0; + } + } + break; + + case TTN_LINKCLICK : + { + if ( pred->doEvent[RE_LINKCLICK_IDX] ) + { + CSTRING method = pred->methods[RE_LINKCLICK_IDX]; + RexxArrayObject args = c->ArrayOfTwo(pred->rxToolTip, pData->pcdc->rexxSelf); + + RexxObjectPtr reply = c->SendMessage(pData->pcpbd->rexxSelf, method, args); + + + if ( ! checkReplyIsGood(c, pData->pcpbd, reply, method, false) ) + { + c->ReleaseLocalReference(args); + SendMessage(pred->hToolTip, TTM_ACTIVATE, 0, 0); + + endDialogPremature(pData->pcpbd, pData->pcpbd->hDlg, RexxConditionRaised); + return 0; + } + + c->ReleaseLocalReference(args); + + return 0; + } + } + break; + default : break; } @@ -846,7 +915,6 @@ if ( msg == WM_DESTROY ) { SendMessage(pred->hToolTip, TTM_ACTIVATE, 0, 0); - //printf("Got WM_DESTROY for tool tip\n"); } if ( msg == WM_NCDESTROY ) { @@ -856,9 +924,7 @@ * done in the dialog control uninit() for those cases. So, we just * always do it from the uninit(). */ - BOOL success = RemoveWindowSubclass(hwnd, ManageAtypicalToolProc, id); - //printf("Got WM_NCDESTROY for tool tip success=%d\n", success); - return TRUE; + RemoveWindowSubclass(hwnd, ManageAtypicalToolProc, id); } return DefSubclassProc(hwnd, msg, wParam, lParam); @@ -2077,6 +2143,12 @@ goto err_out; } + if ( idx == RE_NORELAY_IDX ) + { + pred->skipRelay = true; + continue; + } + if ( argumentExists(3) ) { RexxObjectPtr rxName = context->ArrayAt(methods, i); |