long CMUSHclientDoc::SpellCheckCommand(long StartCol, long EndCol) { if (!App.m_bSpellCheckOK) return -1; CEdit * pEdit = NULL; CWnd * pWnd = NULL; // find command window for(POSITION pos = GetFirstViewPosition(); pos != NULL; ) { CView* pView = GetNextView(pos); if (pView->IsKindOf(RUNTIME_CLASS(CSendView))) { CSendView* pmyView = (CSendView*)pView; // what is the current selection? pWnd = pmyView; pEdit = & (pmyView->GetEditCtrl()); break; } // end of being a CSendView } // end of loop through views if (pEdit == NULL) return -1; // couldn't find it int nStartChar, nEndChar; // get current selection pEdit->GetSel (nStartChar, nEndChar); // make wanted selection 1-relative if (StartCol > 0) StartCol--; bool bHaveSelection = EndCol > StartCol && StartCol >= 0 && EndCol >= 0; // select what the scripter wanted if (bHaveSelection) pEdit->SetSel (StartCol, EndCol); if (App.m_SpellChecker_Lua) { lua_settop(App.m_SpellChecker_Lua, 0); // clear stack lua_getglobal (App.m_SpellChecker_Lua, SPELLCHECKFUNCTION); if (!lua_isfunction (App.m_SpellChecker_Lua, -1)) return true; // assume ok, what can we do? CString strText; bool bAll = GetSelection (pEdit, strText); lua_pushstring (App.m_SpellChecker_Lua, strText); // string to be checked lua_pushboolean (App.m_SpellChecker_Lua, bAll); // doing all? int narg = lua_gettop(App.m_SpellChecker_Lua) - 1; // all but the function int error = CallLuaWithTraceBack (App.m_SpellChecker_Lua, narg, 1); if (error) { LuaError (App.m_SpellChecker_Lua, "Run-time error", SPELLCHECKFUNCTION, "Command-line spell-check"); lua_close (App.m_SpellChecker_Lua); App.m_SpellChecker_Lua = NULL; App.m_bSpellCheckOK = false; return -1; } if (lua_isstring (App.m_SpellChecker_Lua, -1)) { const char * p = lua_tostring (App.m_SpellChecker_Lua, -1); if (bAll) pEdit->SetSel (0, -1, TRUE); pEdit->ReplaceSel (p, true); // put original selection back pEdit->SetSel (nStartChar, nEndChar); return 1; // spell checked ok } // put original selection back pEdit->SetSel (nStartChar, nEndChar); return 0; // they cancelled } return -1; } // end of CMUSHclientDoc::SpellCheckCommand
BSTR CMUSHclientDoc::Menu(LPCTSTR Items, LPCTSTR Default) { CString strResult; CSendView* pmyView = NULL; for(POSITION pos=GetFirstViewPosition();pos!=NULL;) { CView* pView = GetNextView(pos); if (pView->IsKindOf(RUNTIME_CLASS(CSendView))) { pmyView = (CSendView*)pView; break; } // end of being a CSendView } if (!pmyView) return strResult.AllocSysString(); CEdit * ctlEdit = & pmyView->GetEditCtrl(); int nStartChar, nEndChar; // find the selection range ctlEdit->GetSel(nStartChar, nEndChar); if (nEndChar < 0) nEndChar = nStartChar; vector<string> v; StringToVector (Items, v, "|"); int iCount = v.size (); // must have at least one item if (iCount < 1) return strResult.AllocSysString(); CCompleteWordDlg dlg; set<string> extraItems; for (vector<string>::const_iterator i = v.begin (); i != v.end (); i++) extraItems.insert (*i); dlg.m_extraItems = &extraItems; dlg.m_strDefault = Default; dlg.m_bFunctions = false; dlg.m_pt = ctlEdit->PosFromChar (nEndChar - 1); // strangely doesn't work at end of line ctlEdit->ClientToScreen(&dlg.m_pt); if (dlg.DoModal () == IDOK) strResult = dlg.m_strResult; return strResult.AllocSysString(); } // end of CMUSHclientDoc::Menu