// // // // // $Revision: 915 $ // using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace ICSharpCode.TextEditor.Util { class TipPainterTools { const int SpacerSize = 4; private TipPainterTools() { } public static Size GetDrawingSizeHelpTipFromCombinedDescription(Control control, Graphics graphics, Font font, string countMessage, string description, int param_num, int paramsCount, bool addit_info) { GetToolipParts(description, param_num, paramsCount, out var basicDescription, out var documentation, out var bold_beg, out var bold_len); return GetDrawingSizeDrawHelpTip(control, graphics, font, countMessage, basicDescription, documentation, bold_beg, bold_len, param_num, addit_info); } public static Size DrawHelpTipFromCombinedDescription(Control control, Graphics graphics, Font font, string countMessage, string description, int param_num, int paramsCount, bool addit_info) { GetToolipParts(description, param_num, paramsCount, out var basicDescription, out var documentation, out var bold_beg, out var bold_len); return DrawHelpTip(control, graphics, font, countMessage, basicDescription, documentation, bold_beg, bold_len, param_num, addit_info); } private static void GetToolipParts(string description, int param_num, int paramsCount, out string basicDescription, out string documentation, out int bold_beg, out int bold_len) { basicDescription = null; documentation = null; bold_beg = 0; bold_len = 0; if (IsVisibleText(description)) { string[] splitDescription = description.Split(new char[] { '\n' }, 2); if (splitDescription.Length > 0) { if (splitDescription.Length > 1) { documentation = splitDescription[1].Trim(); } basicDescription = splitDescription[0]; if (param_num == -1) return; var languageIntellisenseSupport = CodeCompletion.CodeCompletionController.CurrentLanguage.LanguageIntellisenseSupport; int startIndex = basicDescription.IndexOf("(", basicDescription.IndexOf("(" + PascalABCCompiler.StringResources.Get("CODE_COMPLETION_EXTENSION")) + 1) + 1; int paranthesisIndex = languageIntellisenseSupport.FindClosingParenthesis(basicDescription.Substring(startIndex), ')'); if (paranthesisIndex == -1) return; int end_sk = paranthesisIndex + startIndex; if (param_num == 1) { bold_beg = startIndex; if (bold_beg != 0) { int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(bold_beg), 1); if (paramDelimIndex == -1) { bold_len = end_sk - bold_beg; } else { bold_len = paramDelimIndex; } } } else { // Здесь учтется случай последнего параметра типа params EVA if (param_num > paramsCount) { if (paramsCount == 1) { string paramDescription = basicDescription.Substring(startIndex, paranthesisIndex); if (languageIntellisenseSupport.IsParams(paramDescription)) { bold_beg = startIndex; bold_len = paranthesisIndex; } } else { string descriptionAfterBracket = basicDescription.Substring(startIndex); int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(descriptionAfterBracket, paramsCount - 1); if (paramDelimIndex != -1) { int paramDelimLength = languageIntellisenseSupport.ParameterDelimiter.Length; string paramDescription = descriptionAfterBracket.Substring(paramDelimIndex + paramDelimLength, paranthesisIndex - paramDelimIndex - paramDelimLength); if (languageIntellisenseSupport.IsParams(paramDescription)) { bold_beg = paramDelimIndex + startIndex + paramDelimLength; bold_len = end_sk - bold_beg; } } } } else { int paramDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num - 1); if (paramDelimIndex != -1) { bold_beg = paramDelimIndex + startIndex + languageIntellisenseSupport.ParameterDelimiter.Length; int secondParamDelimIndex = languageIntellisenseSupport.FindParamDelim(basicDescription.Substring(startIndex), param_num); if (secondParamDelimIndex == -1) { bold_len = end_sk - bold_beg; } else { bold_len = secondParamDelimIndex + startIndex - bold_beg; } } } } } } } // btw. I know it's ugly. public static Rectangle DrawingRectangle1; public static Rectangle DrawingRectangle2; public static Size GetDrawingSizeDrawHelpTip(Control control, Graphics graphics, Font font, string countMessage, string basicDescription, string documentation, int beg_bold, int bold_len, int param_num, bool addit_info) { if (IsVisibleText(countMessage) || IsVisibleText(basicDescription) || IsVisibleText(documentation)) { // Create all the TipSection objects. CountTipText countMessageTip = new CountTipText(graphics, font, countMessage); TipSpacer countSpacer = new TipSpacer(graphics, new SizeF(IsVisibleText(countMessage) ? 4 : 0, 0)); TipText descriptionTip = new TipText(graphics, font, basicDescription); descriptionTip.insight_wnd = control is ICSharpCode.TextEditor.Gui.InsightWindow.PABCNETInsightWindow; descriptionTip.beg_bold = beg_bold; descriptionTip.len_bold = bold_len; TipText descriptionTip1 = new TipText(graphics, font, basicDescription.Substring(0, beg_bold)); TipText descriptionTip2 = new TipText(graphics, new Font(font, FontStyle.Bold), basicDescription.Substring(beg_bold, bold_len)); TipText descriptionTip3 = new TipText(graphics, font, basicDescription.Substring(beg_bold + bold_len)); descriptionTip.desc1 = descriptionTip1; descriptionTip.desc2 = descriptionTip2; descriptionTip.desc3 = descriptionTip3; TipSpacer docSpacer = new TipSpacer(graphics, new SizeF(0, IsVisibleText(documentation) ? 4 : 0)); List sections = new List(); if (documentation != null) { try { int params_ind = documentation.IndexOf(""); TipText paramsTextTipHeader = null; TipText paramsTextTip = null; if (params_ind != -1 && addit_info) { paramsTextTipHeader = new TipText(graphics, new Font(font, FontStyle.Bold), PascalABCCompiler.StringResources.Get("CODE_COMPLETION_PARAMETERS")); paramsTextTipHeader.is_head = true; int end_param = documentation.IndexOf("", params_ind); string params_text; if (end_param == -1) { params_text = documentation.Substring(params_ind + 8).Trim(' ', '\n', '\r', '\t'); //paramsTextTip = new TipText(graphics,font,params_text); } else { params_text = documentation.Substring(params_ind + 8, end_param - params_ind - 8).Trim(' ', '\n', '\r', '\t'); //paramsTextTip = new TipText(graphics,font,documentation.Substring(params_ind+8,end_param-params_ind-8).Trim(' ','\n','\r','\t')); } List prms_list = new List(); int ind = params_text.IndexOf("", 0); while (ind != -1) { int end_ind = params_text.IndexOf("", ind + 1); prms_list.Add(params_text.Substring(ind + 7, end_ind - ind - 7).Trim(' ', '\n', '\t', '\r')); ind = params_text.IndexOf("", end_ind); if (ind != -1) { if (ind - end_ind - 7 > 0) prms_list.Add(params_text.Substring(end_ind + 8, ind - end_ind - 8).Trim(' ', '\n', '\t', '\r')); else prms_list.Add(""); } else { prms_list.Add(params_text.Substring(end_ind + 8).Trim(' ', '\n', '\t', '\r')); } } List prm_sections = new List(); int i = 0; while (i < prms_list.Count) { TipText prm_name_sect = new TipText(graphics, font, prms_list[i]); prm_name_sect.param_name = true; TipText desc_param_sect = new TipText(graphics, font, prms_list[i + 1]); desc_param_sect.need_tab = true; desc_param_sect.param_desc = true; //TipSplitter spltr = new TipSplitter(graphics,true,prm_name_sect,desc_param_sect); if (!string.IsNullOrEmpty(prms_list[i + 1])) { prm_sections.Add(prm_name_sect); prm_sections.Add(desc_param_sect); } i += 2; } if (prm_sections.Count > 0) { sections.Add(new TipText(graphics, new Font(font.FontFamily, 3), " ")); sections.Add(paramsTextTipHeader); sections.AddRange(prm_sections); } } int return_ind = documentation.IndexOf(""); /*TipText returnTextTipHeader = null; TipText returnTextTip = null; if (return_ind != -1 && addit_info) { returnTextTipHeader = new TipText(graphics,new Font(font, FontStyle.Bold),PascalABCCompiler.StringResources.Get("CODE_COMPLETION_RETURN")); returnTextTipHeader.is_head = true; int end_return = documentation.IndexOf("",return_ind); string return_text; if (end_return == -1) return_text = documentation.Substring(return_ind+9).Trim(' ','\n','\r','\t'); else return_text = documentation.Substring(return_ind+9,end_return-return_ind-9).Trim(' ','\n','\r','\t'); if (!string.IsNullOrEmpty(return_text)) { returnTextTip = new TipText(graphics,font,return_text); sections.Add(new TipText(graphics,new Font(font.FontFamily,3)," ")); sections.Add(returnTextTipHeader); sections.Add(returnTextTip); returnTextTip.need_tab = true; } }*/ if (params_ind != -1 && return_ind != -1) documentation = documentation.Substring(0, Math.Min(params_ind, return_ind)).Trim(' ', '\n', '\t', '\r'); else if (params_ind != -1) documentation = documentation.Substring(0, params_ind).Trim(' ', '\n', '\t', '\r'); else if (return_ind != -1) documentation = documentation.Substring(0, return_ind).Trim(' ', '\n', '\t', '\r'); } catch { } } TipText docTip = new TipText(graphics, font, documentation); //docTip.is_doc = true; docTip.need_tab = true; sections.Insert(0, docTip); if (!string.IsNullOrEmpty(documentation)) { TipText descr_head = new TipText(graphics, new Font(font, FontStyle.Bold), PascalABCCompiler.StringResources.Get("CODE_COMPLETION_DESCRIPTION")); descr_head.is_head = true; sections.Insert(0, descr_head); sections.Insert(0, new TipText(graphics, new Font(font.FontFamily, 1), " ")); } //docTip.is_doc = true; docTip.need_tab = true; TipSplitter descSplitter = new TipSplitter(graphics, true, descriptionTip, docSpacer ); // Now put them together. /*TipSplitter descSplitter = new TipSplitter(graphics, true, //descriptionTip, descriptionTip1, descriptionTip2, descriptionTip3, docSpacer );*/ descSplitter.is_desc = true; /*TipSplitter descSplitter1 = new TipSplitter(graphics, false, //descriptionTip, descriptionTip1 ); TipSplitter descSplitter2 = new TipSplitter(graphics, false, //descriptionTip, descriptionTip2 ); TipSplitter descSplitter3 = new TipSplitter(graphics, false, //descriptionTip, descriptionTip3, docSpacer );*/ TipSplitter mainSplitter = new TipSplitter(graphics, true, countMessageTip, countSpacer, descSplitter); sections.Insert(0, mainSplitter); TipSplitter mainSplitter2 = new TipSplitter(graphics, false, sections.ToArray()); // Show it. Size size = TipPainter.GetTipSize(control, graphics, mainSplitter2); DrawingRectangle1 = countMessageTip.DrawingRectangle1; DrawingRectangle2 = countMessageTip.DrawingRectangle2; return size; } return Size.Empty; } public static Size DrawHelpTip(Control control, Graphics graphics, Font font, string countMessage, string basicDescription, string documentation, int beg_bold, int bold_len, int param_num, bool addit_info) { if (IsVisibleText(countMessage) || IsVisibleText(basicDescription) || IsVisibleText(documentation)) { // Create all the TipSection objects. CountTipText countMessageTip = new CountTipText(graphics, font, countMessage); TipSpacer countSpacer = new TipSpacer(graphics, new SizeF(IsVisibleText(countMessage) ? 4 : 0, 0)); if (basicDescription.Length < 30) basicDescription = basicDescription.PadRight(30); TipText descriptionTip = new TipText(graphics, font, basicDescription); descriptionTip.insight_wnd = control is ICSharpCode.TextEditor.Gui.InsightWindow.PABCNETInsightWindow; descriptionTip.beg_bold = beg_bold; descriptionTip.len_bold = bold_len; TipText descriptionTip1 = new TipText(graphics, font, basicDescription.Substring(0, beg_bold)); TipText descriptionTip2 = new TipText(graphics, new Font(font, FontStyle.Bold), basicDescription.Substring(beg_bold, bold_len)); TipText descriptionTip3 = new TipText(graphics, font, basicDescription.Substring(beg_bold + bold_len)); descriptionTip.desc1 = descriptionTip1; descriptionTip.desc2 = descriptionTip2; descriptionTip.desc3 = descriptionTip3; TipSpacer docSpacer = new TipSpacer(graphics, new SizeF(0, IsVisibleText(documentation) ? 4 : 0)); List sections = new List(); if (documentation != null) { try { int params_ind = documentation.IndexOf(""); TipText paramsTextTipHeader = null; TipText paramsTextTip = null; if (params_ind != -1 && addit_info) { paramsTextTipHeader = new TipText(graphics, new Font(font, FontStyle.Bold), PascalABCCompiler.StringResources.Get("CODE_COMPLETION_PARAMETERS")); paramsTextTipHeader.is_head = true; int end_param = documentation.IndexOf("", params_ind); string params_text; if (end_param == -1) { params_text = documentation.Substring(params_ind + 8).Trim(' ', '\n', '\r', '\t'); //paramsTextTip = new TipText(graphics,font,params_text); } else { params_text = documentation.Substring(params_ind + 8, end_param - params_ind - 8).Trim(' ', '\n', '\r', '\t'); //paramsTextTip = new TipText(graphics,font,documentation.Substring(params_ind+8,end_param-params_ind-8).Trim(' ','\n','\r','\t')); } List prms_list = new List(); int ind = params_text.IndexOf("", 0); while (ind != -1) { int end_ind = params_text.IndexOf("", ind + 1); prms_list.Add(params_text.Substring(ind + 7, end_ind - ind - 7).Trim(' ', '\n', '\t', '\r')); ind = params_text.IndexOf("", end_ind); if (ind != -1) { if (ind - end_ind - 7 > 0) prms_list.Add(params_text.Substring(end_ind + 8, ind - end_ind - 8).Trim(' ', '\n', '\t', '\r')); else prms_list.Add(""); } else { prms_list.Add(params_text.Substring(end_ind + 8).Trim(' ', '\n', '\t', '\r')); } } List prm_sections = new List(); int i = 0; while (i < prms_list.Count) { TipText prm_name_sect = new TipText(graphics, font, prms_list[i]); prm_name_sect.param_name = true; TipText desc_param_sect = new TipText(graphics, font, prms_list[i + 1]); desc_param_sect.need_tab = true; desc_param_sect.param_desc = true; //TipSplitter spltr = new TipSplitter(graphics,true,prm_name_sect,desc_param_sect); if (!string.IsNullOrEmpty(prms_list[i + 1])) { prm_sections.Add(prm_name_sect); prm_sections.Add(desc_param_sect); } i += 2; } if (prm_sections.Count > 0) { sections.Add(new TipText(graphics, new Font(font.FontFamily, 3), " ")); sections.Add(paramsTextTipHeader); sections.AddRange(prm_sections); } } int return_ind = documentation.IndexOf(""); /*TipText returnTextTipHeader = null; TipText returnTextTip = null; if (return_ind != -1 && addit_info) { returnTextTipHeader = new TipText(graphics,new Font(font, FontStyle.Bold),PascalABCCompiler.StringResources.Get("CODE_COMPLETION_RETURN")); returnTextTipHeader.is_head = true; int end_return = documentation.IndexOf("",return_ind); string return_text; if (end_return == -1) return_text = documentation.Substring(return_ind+9).Trim(' ','\n','\r','\t'); else return_text = documentation.Substring(return_ind+9,end_return-return_ind-9).Trim(' ','\n','\r','\t'); if (!string.IsNullOrEmpty(return_text)) { returnTextTip = new TipText(graphics,font,return_text); sections.Add(new TipText(graphics,new Font(font.FontFamily,3)," ")); sections.Add(returnTextTipHeader); sections.Add(returnTextTip); returnTextTip.need_tab = true; } }*/ if (params_ind != -1 && return_ind != -1) documentation = documentation.Substring(0, Math.Min(params_ind, return_ind)).Trim(' ', '\n', '\t', '\r'); else if (params_ind != -1) documentation = documentation.Substring(0, params_ind).Trim(' ', '\n', '\t', '\r'); else if (return_ind != -1) documentation = documentation.Substring(0, return_ind).Trim(' ', '\n', '\t', '\r'); } catch { } } TipText docTip = new TipText(graphics, font, documentation); //docTip.is_doc = true; docTip.need_tab = true; sections.Insert(0, docTip); if (!string.IsNullOrEmpty(documentation)) { TipText descr_head = new TipText(graphics, new Font(font, FontStyle.Bold), PascalABCCompiler.StringResources.Get("CODE_COMPLETION_DESCRIPTION")); descr_head.is_head = true; sections.Insert(0, descr_head); sections.Insert(0, new TipText(graphics, new Font(font.FontFamily, 1), " ")); } TipSplitter descSplitter = new TipSplitter(graphics, true, descriptionTip, docSpacer ); // Now put them together. /*TipSplitter descSplitter = new TipSplitter(graphics,true, descriptionTip1, descriptionTip2, descriptionTip3, docSpacer );*/ descSplitter.is_desc = true; /*TipSplitter descSplitter1 = new TipSplitter(graphics, false, //descriptionTip, descriptionTip1 ); TipSplitter descSplitter2 = new TipSplitter(graphics, false, //descriptionTip, descriptionTip2 ); TipSplitter descSplitter3 = new TipSplitter(graphics, false, //descriptionTip, descriptionTip3, docSpacer );*/ TipSplitter mainSplitter = new TipSplitter(graphics, true, countMessageTip, countSpacer, descSplitter); sections.Insert(0, mainSplitter); TipSplitter mainSplitter2 = new TipSplitter(graphics, false, sections.ToArray()); // Show it. Size size = TipPainter.DrawTip(control, graphics, mainSplitter2); DrawingRectangle1 = countMessageTip.DrawingRectangle1; DrawingRectangle2 = countMessageTip.DrawingRectangle2; return size; } return Size.Empty; } static bool IsVisibleText(string text) { return text != null && text.Length > 0; } } }