private static string SafeEval(HMSEditor activeEditor, string expression) { string value = ""; System.Windows.Forms.MethodInvoker action = delegate { value = activeEditor.EvalVariableValue(expression); }; if (activeEditor.InvokeRequired) activeEditor.Invoke(action); else action(); return value; }
/// <summary> /// Статическая процедура, вызываемая из MouseTimer_Task по срабатыванию MouseTimer для отображения подсказки при наведении мышкой на часть текста /// </summary> /// <param name="ActiveHMSEditor">Активный (вызвавший) элемент HMSEditor</param> public static void Task(HMSEditor ActiveHMSEditor) { if (ActiveHMSEditor.Locked) return; try { var Editor = ActiveHMSEditor.Editor; Point point = ActiveHMSEditor.MouseLocation; int iStartLine = ActiveHMSEditor.Editor.YtoLineIndex(0); int CharHeight = ActiveHMSEditor.Editor.CharHeight; int i = point.Y / CharHeight; int iLine = iStartLine + i; if ((iLine + 1) > ActiveHMSEditor.Editor.LinesCount) return; Place place = ActiveHMSEditor.PointToPlace(point); string line = Editor.Lines[iLine]; string value = ""; bool evalSelection = false; if (Editor.DebugMode && (Editor.SelectedText.Length > 2)) { Place selStart = Editor.Selection.Start; Place selEnd = Editor.Selection.End; // Если указатель мыши в области виделения, то будем вычислять выдиление evalSelection = (selStart.iLine == iLine) && (selStart.iChar >= place.iChar) && (selEnd.iChar <= iLine); } Range r = new Range(Editor, place, place); Range fragment = r.GetFragmentLookedLeft(); string text = fragment.Text.Replace("#", ""); if (text.Length == 0) return; HMSItem item = ActiveHMSEditor.GetHMSItemByText(text); // Поиск известного элемента HMSItem по части текста if (item != null && !string.IsNullOrEmpty(item.Text)) { point.Offset(0, Editor.CharHeight-4); // Если идёт отладка - проверяем, мы навели на переменную или свойство объекта? if (Editor.DebugMode && (evalSelection || OK4Evaluate(item)) ) { if (evalSelection) { text = Editor.SelectedText; } else { // проверяем, если это index свойство - то нудно вычислять значение с переданным индексом, поэтому дополняем значением [...] if (item.ImageIndex == Images.Enum) { Match m = Regex.Match(line, text + @"\[.*?\]"); if (m.Success) text = m.Value; } else if (item.ImageIndex == Images.Function) { Match m = Regex.Match(line, text + @"\(.*?\)"); if (m.Success) text = m.Value; } // Проверяем тип объекта класса, может быть удобней представить в виде текста? (TStrings или TJsonObject) text = CheckTypeForToStringRules(item.Type, text); } // Вычсиление выражения value = ActiveHMSEditor.EvalVariableValue(text); // Внедряемся в поток - показываем вплывающее окно со значением Editor.Invoke((System.Windows.Forms.MethodInvoker)delegate { ActiveHMSEditor.ValueHint.ShowValue(Editor, value, point); }); return; } // Показываем инофрмацию о функции или переменной через ToolTip Editor.Invoke((System.Windows.Forms.MethodInvoker)delegate { var tip = Editor.ToolTip; tip.ToolTipTitle = item.ToolTipTitle; tip.Help = item.Help; tip.Value = value; tip.Show(item.ToolTipText + " ", Editor, point, 10000); }); } } catch (Exception e) { HMS.LogError(e.ToString()); } }