/// <summary> /// Occurs when the mouse is hovered over an <c>EditorView</c></summary> private void EditorViewMouseHover(object sender, EditorViewMouseEventArgs e) { var editor = sender as ActiproSoftware.SyntaxEditor.SyntaxEditor; if (e.HitTestResult.Token == null || MouseHoveringOverToken == null || e.HitTestResult.Token.Language.Key.ToLower() == "plain text") return; var lang = Languages.Text; switch (e.HitTestResult.Token.Language.Key.ToLower()) { case "c#": lang = Languages.Csharp; break; case "lua": lang = Languages.Lua; break; case "python": lang = Languages.Python; break; case "xml": lang = Languages.Xml; break; } if (editor == null) return; var itok = e.HitTestResult.Token; var t = new Token( itok.StartOffset, itok.EndOffset, itok.ID, itok.Key, editor.Document.GetTokenText(itok)); var arg = new MouseHoverOverTokenEventArgs( lang, t, e.HitTestResult.DocumentLine.Index + 1); MouseHoveringOverToken(this, arg); if (!string.IsNullOrEmpty(arg.TooltipText)) e.ToolTipText = arg.TooltipText; }
private static string FindAndConcatTokens(Token hoverToken, Token[] lineTokens) { string szFullToken = null; // Check if the token the mouse is hovering over is valid or not if (IsInvalidToken(hoverToken)) return null; // Ignore whitespace the mouse is on if (hoverToken.TokenType == "WhitespaceToken") return null; var iIndex = -1; // Find the actual token the mouse is hovering over on the line for (var i = 0; (i < lineTokens.Length) && (iIndex == -1); i++) { if ((lineTokens[i].StartOffset == hoverToken.StartOffset) && (lineTokens[i].EndOffset == hoverToken.EndOffset)) iIndex = i; } // Concatenate together valid tokens if (iIndex != -1) { szFullToken = lineTokens[iIndex].Lexeme; //OutDevice.OutLine(MessageType.Info, "- [Index: " + iIndex.ToString() + "] of [Total: " + lineTokens.Length + "] [" + lineTokens[iIndex].Lexeme + "] [" + lineTokens[iIndex].TokenType + "]"); var bStop = false; for (var i = iIndex + 1; (i < lineTokens.Length) && !bStop; i++) { if (!IsInvalidToken(lineTokens[i])) szFullToken = szFullToken + lineTokens[i].Lexeme; else bStop = true; } bStop = false; for (var i = iIndex - 1; (i >= 0) && !bStop; i--) { if (!IsInvalidToken(lineTokens[i])) szFullToken = lineTokens[i].Lexeme + szFullToken; else bStop = true; } // Remove spaces szFullToken = szFullToken.Trim(); // Convert [ to . szFullToken = szFullToken.Replace('[', '.'); // Remove ] szFullToken = szFullToken.Replace("]", String.Empty); } return szFullToken; }
/// <summary> /// Returns true or false if the token is valid or not (ie. it can /// be part of a Lua variable) /// <remarks>This isn't 100% accurate but returns a good enough /// result since the returned concatenated result still has to /// be looked up as a valid variable anyways.</remarks> /// </summary> /// <param name="token"></param> /// <returns></returns> private static bool IsInvalidToken(Token token) { var iHashCode = token.TokenType.GetHashCode(); // Special case for PunctuationToken if (iHashCode == -1613044712) { if (token.Lexeme != ".") return true; } return s_syntaxEditorTokenHashes.ContainsKey(iHashCode); }
/// <summary> /// Construct a new MouseHoverOverTokenEventArgs with the specified arguments /// </summary> /// <param name="language">language</param> /// <param name="token">Token type</param> /// <param name="lineNumber">the line number of the token</param> public MouseHoverOverTokenEventArgs(Languages language,Token token, int lineNumber) { Language = language; Token = token; LineNumber = lineNumber; }