OutlineControl.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using System.Windows.Forms;
  2. using System.Drawing;
  3. using System.ComponentModel;
  4. using FastReport.Utils;
  5. using FastReport.DevComponents.AdvTree;
  6. using FastReport.DevComponents.DotNetBar;
  7. namespace FastReport.Preview
  8. {
  9. internal class OutlineControl : UserControl
  10. {
  11. private AdvTree tree;
  12. private NodeConnector nodeConnector1;
  13. private ElementStyle elementStyle1;
  14. private PreviewControl preview;
  15. private PreparedPages preparedPages;
  16. private UIStyle style;
  17. internal PreparedPages PreparedPages
  18. {
  19. get { return preparedPages; }
  20. set
  21. {
  22. preparedPages = value;
  23. UpdateContent();
  24. }
  25. }
  26. internal UIStyle Style
  27. {
  28. get { return style; }
  29. set
  30. {
  31. style = value;
  32. eScrollBarAppearance appearance = eScrollBarAppearance.Default;
  33. if (tree.ColorSchemeStyle == eColorSchemeStyle.Office2007)
  34. appearance = eScrollBarAppearance.ApplicationScroll;
  35. if (tree.HScrollBar != null)
  36. tree.HScrollBar.Appearance = appearance;
  37. if (tree.VScrollBar != null)
  38. tree.VScrollBar.Appearance = appearance;
  39. tree.Refresh();
  40. }
  41. }
  42. private void EnumNodes(XmlItem rootItem, NodeCollection rootNode)
  43. {
  44. // skip root xml item
  45. if (rootItem.Parent != null)
  46. {
  47. string text = rootItem.GetProp("Text");
  48. Node node = new Node();
  49. node.Text = text;
  50. node.Tag = rootItem;
  51. rootNode.Add(node);
  52. rootNode = node.Nodes;
  53. }
  54. for (int i = 0; i < rootItem.Count; i++)
  55. {
  56. EnumNodes(rootItem[i], rootNode);
  57. }
  58. }
  59. private void UpdateContent()
  60. {
  61. tree.Nodes.Clear();
  62. if (PreparedPages == null)
  63. return;
  64. Outline outline = PreparedPages.Outline;
  65. tree.BeginUpdate();
  66. EnumNodes(outline.Xml, tree.Nodes);
  67. if (tree.Nodes.Count == 1)
  68. tree.Nodes[0].Expand();
  69. tree.EndUpdate();
  70. // to update tree's scrollbars
  71. Style = Style;
  72. }
  73. private void FTree_AfterNodeSelect(object sender, AdvTreeNodeEventArgs e)
  74. {
  75. // avoid bug when closing the preview
  76. if (!Visible)
  77. return;
  78. if (e.Node == null)
  79. return;
  80. XmlItem item = e.Node.Tag as XmlItem;
  81. string s = item.GetProp("Page");
  82. if (s != "")
  83. {
  84. int pageNo = int.Parse(s);
  85. s = item.GetProp("Offset");
  86. if (s != "")
  87. {
  88. float offset = (float)Converter.FromString(typeof(float), s);
  89. preview.PositionTo(pageNo + 1, new PointF(0, offset));
  90. }
  91. }
  92. }
  93. internal void SetPreview(PreviewControl preview)
  94. {
  95. this.preview = preview;
  96. }
  97. public void UpdateDpiDependencies()
  98. {
  99. tree.Font = Font;
  100. }
  101. /// <summary>
  102. /// Initializes a new instance of the <b>OutlineControl</b> class with default settings.
  103. /// </summary>
  104. public OutlineControl()
  105. {
  106. nodeConnector1 = new NodeConnector();
  107. nodeConnector1.LineColor = SystemColors.ControlText;
  108. elementStyle1 = new ElementStyle();
  109. elementStyle1.TextColor = SystemColors.ControlText;
  110. tree = new AdvTree();
  111. tree.LicenseKey = "F962CEC7-CD8F-4911-A9E9-CAB39962FC1F";
  112. tree.AntiAlias = false;
  113. tree.Font = DrawUtils.DefaultFont;
  114. tree.BackColor = SystemColors.Window;
  115. tree.Dock = DockStyle.Fill;
  116. tree.HideSelection = false;
  117. tree.HotTracking = true;
  118. tree.NodesConnector = nodeConnector1;
  119. tree.NodeStyle = elementStyle1;
  120. tree.Styles.Add(elementStyle1);
  121. tree.AfterNodeSelect += new AdvTreeNodeEventHandler(FTree_AfterNodeSelect);
  122. Controls.Add(tree);
  123. }
  124. }
  125. }