public VisualizeData GetVisualizeData(
			NodeDataProvider dataProvider,
			GraphicsInfo     graphicsInfo
		)
		{
			XmlDocument          xmlData       = dataProvider.XmlDocument;
			MultyQueryResultInfo queriesResult = dataProvider.QueryResult;

			VisualizeData result = new VisualizeData
			{
				NodeLastUpdated        = queriesResult.NodeLastUpdated,
				NodeLastUpdateDuration = queriesResult.NodeLastUpdateDuration
			};

			if (xmlData != null && xmlData.DocumentElement != null)
			{
				result.SourceXml = xmlData.FormatXml();
			}

			ConcreteTemplateNodeDefinition nodeDefinition = dataProvider.NodeDefinition;

			string xslFileName = GetXslFileName(nodeDefinition);

			if (xslFileName != null && File.Exists(xslFileName))
			{
				XmlDocument xslDoc = new XmlDocument();

				xslDoc.Load(xslFileName);

				ConnectionGroupInfo connectionGroup = nodeDefinition.Connection;

				if (AppVersionHelper.IsNotDebug() && !connectionGroup.IsExternal)
				{
					CryptoProcessor cryptoProcessor = new CryptoProcessor(
						this._model.Settings.SystemSettings.PublicKeyXmlSign,
						this._model.Settings.SystemSettings.PrivateKeyXmlDecrypt
					);

					cryptoProcessor.DecryptXmlDocument(xslDoc);
				}

				try
				{
					XslPreprocessManager preprocessManager = GetManager(
						dataProvider,
						graphicsInfo
					);

					List<PreprocessorAreaData> datas;

					using (preprocessManager.ExecuteXslPreprocessing(xslDoc, out datas))
					{
					}

					foreach (PreprocessorAreaData preprocessorAreaData in datas)
					{
						preprocessorAreaData.CheckPreprocessors();
					}

					result.PreprocessorAreas = datas.ToList();
				}
				catch (Exception ex)
				{
					log.ErrorFormat(
						"nodeDefinition.TemplateNode.Queries(.Name)='{0}';xslFileName='{1}';Exception:'{2}'",
						nodeDefinition.TemplateNode.Queries.Select(q => q.QueryName).Join(", "),
						xslFileName,
						ex
					);
				}
			}

			return result;
		}
		private void RenderVisualizeData(ConcreteTemplateNodeDefinition definition, VisualizeData visualizeData, int selectTabIndex)
		{
			string additionalXml = string.Empty;
			int    tabIndex      = tcBrowse.TabCount - 1;

			TemplateNodeInfo nodeInfo = definition.TemplateNode;
			tcBrowse.ShowSingleTab    = !nodeInfo.IsHideTabs;

			if (visualizeData.PreprocessorAreas != null)
			{
				List<PreprocessorDataDescriptor> dialogObjects =
					visualizeData.PreprocessorAreas.SelectMany(
						a => a.NoSplitter || a.Preprocessors.Count == 0 || (a.Columns.Length == 1 && a.Rows.Length == 1)
							? a.Preprocessors.SelectMany(
								data => new[]
								{
									new PreprocessorDataDescriptor(a, data)
								}
							)
							: new[]
							{
								new PreprocessorDataDescriptor(a)
							}
					).ToList();

				// create tab pages with empty content first
				// to avoid flickering and extra reports loading
				List<TabPage> newPages    = new List<TabPage>();
				int           bufferIndex = 0;

				foreach (PreprocessorDataDescriptor dialogObj in dialogObjects)
				{
					TabPage page = this._pageBuffer.GetPage(bufferIndex++);
					PreprocessorAreaData dialogArea = dialogObj.AreaData;
					page.Text = dialogArea != null
						? dialogArea.Name
						: string.Empty;

					page.DisposeChildControls();
					newPages.Add(page);
					tcBrowse.TabPages.Add(page);
					tabIndex++;

					if (selectTabIndex == tabIndex)
					{
						tcBrowse.SelectedIndex = selectTabIndex;
					}
				}

				// release extra pages in buffer
				this._pageBuffer.Resize(bufferIndex);

				// fill tab pages with report controls
				IEnumerator<TabPage> pageEnum = newPages.GetEnumerator();

				foreach (PreprocessorDataDescriptor dialogObj in dialogObjects)
				{
					pageEnum.MoveNext();
					TabPage page = pageEnum.Current;

					PreprocessorAreaData dialogArea = dialogObj.AreaData;

					if (dialogArea != null)
					{
						ConnectionTabArea ctrl = new ConnectionTabArea
						{
							Dock = DockStyle.Fill
						};

						ctrl.Init(this, dialogArea, definition, this._model);

						page.Controls.Add(ctrl);
					}
					else
					{
						PreprocessorData dialogPreproc = dialogObj.Data;

						if (dialogPreproc != null)
						{
							Control control = dialogPreproc.ContentFactory.CreateControl();

							if (control is WebBrowser || control is ReportViewrControl)
							{
								control.PreviewKeyDown += (s, e) =>
								{
									if (e.KeyCode == Keys.F5)
									{
										F5RefreshView();
									}
								};

								if (control is ReportViewrControl && tcBrowse.Visible)
								{
									if ((control as ReportViewrControl).ReportXML != string.Empty)
									{
										using (MemoryStream xmlWriterStream = new MemoryStream())
										{
											XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
											{
												CheckCharacters     = false,
												ConformanceLevel    = ConformanceLevel.Auto,
												Encoding            = Encoding.UTF8,
												Indent              = true,
												IndentChars         = " ",
												NewLineChars        = Environment.NewLine,
												NewLineHandling     = NewLineHandling.Replace,
												NewLineOnAttributes = false,
												OmitXmlDeclaration  = false
											};

											using (var xmlWriter = XmlWriter.Create(xmlWriterStream, xmlWriterSettings))
											{
												XmlDocument doc = new XmlDocument();
												doc.LoadXml((control as ReportViewrControl).ReportXML);
												doc.Save(xmlWriter);
												xmlWriter.Flush();
											}

											additionalXml = Encoding.UTF8.GetString(xmlWriterStream.ToArray());
										}
									}
								}
							}

							if (dialogPreproc.VerticalTextAlign != null)
							{
								TitleFrame titleFrame = new TitleFrame(
									dialogPreproc.VerticalTextAlign,
									dialogPreproc.TextAlign,
									control
								);

								titleFrame.Title = dialogPreproc.Name;

								control = titleFrame;
							}

							control.Dock = DockStyle.Fill;
							page.Controls.Add(control);
						}
					}
				}
			}

			txtXml.Text = visualizeData.SourceXml + Environment.NewLine + additionalXml;

			txtXml.SelectionStart  = 0;
			txtXml.SelectionLength = 0;
			txtXml.ReadOnly        = true;
			txtXml.BackColor       = Color.White;

			lblLastRefreshDate.Text = !visualizeData.NodeLastUpdated.HasValue
				? ComposeBlankDateTimeString()
				: visualizeData.NodeLastUpdated.Value.ToString();

			lblSpendTime.Text = visualizeData.NodeLastUpdateDuration.HasValue
				? String.Format(
					"   {0:00}:{1:00}:{2:00}",
					visualizeData.NodeLastUpdateDuration.Value.Hour,
					visualizeData.NodeLastUpdateDuration.Value.Minute,
					visualizeData.NodeLastUpdateDuration.Value.Second
				)
				: String.Format(
					"   {0:00}:{1:00}:{2:00}",
					0,
					0,
					0
				);

			UpdateScheduledDate(nodeInfo);
		}