OutLineControl.xaml.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. using ComPDFKit.PDFDocument;
  2. using PDF_Office.CustomControl;
  3. using PDF_Office.Helper;
  4. using PDF_Office.Model.BOTA;
  5. using PDF_Office.ViewModels.BOTA;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Collections.ObjectModel;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows;
  13. using System.Windows.Controls;
  14. using System.Windows.Controls.Primitives;
  15. using System.Windows.Data;
  16. using System.Windows.Documents;
  17. using System.Windows.Input;
  18. using System.Windows.Media;
  19. using System.Windows.Media.Imaging;
  20. using System.Windows.Navigation;
  21. using System.Windows.Shapes;
  22. using static Dropbox.Api.Files.WriteMode;
  23. using MenuItem = System.Windows.Controls.MenuItem;
  24. namespace PDF_Office.Views.BOTA
  25. {
  26. /// <summary>
  27. /// OutLineControl.xaml 的交互逻辑
  28. /// </summary>
  29. public partial class OutLineControl : UserControl
  30. {
  31. /// <summary>
  32. /// 当前显示了线段的Item
  33. /// </summary>
  34. private TreeViewItem Treeviewitem = null;
  35. /// <summary>
  36. /// 需要跳转页面的Item
  37. /// </summary>
  38. private TreeViewItem GotoPageItem = null;
  39. /// <summary>
  40. /// 需要重命名的Item的DataContext
  41. /// </summary>
  42. public OutlineNode ReNameOutlineNode = null;
  43. /// <summary>
  44. /// 正在拖拽
  45. /// </summary>
  46. private bool onDrop = false;
  47. public bool IsReName = false;
  48. public OutLineControl()
  49. {
  50. InitializeComponent();
  51. }
  52. private void BtnMore_Click(object sender, RoutedEventArgs e)
  53. {
  54. MenuMore.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
  55. MenuMore.PlacementTarget = BtnMore;
  56. MenuMore.IsOpen = true;
  57. }
  58. private void OutlineView_PreviewMouseMove(object sender, MouseEventArgs e)
  59. {
  60. if (e.LeftButton == MouseButtonState.Pressed && !IsReName)
  61. {
  62. var pos = e.GetPosition(OutlineView);
  63. HitTestResult result = VisualTreeHelper.HitTest(OutlineView, pos);
  64. if (result == null)
  65. {
  66. return;
  67. }
  68. var treeViewItem = CommonHelper.FindVisualParent<TreeViewItem>(result.VisualHit);
  69. if (treeViewItem == null)
  70. {
  71. return;
  72. }
  73. DataObject dataObj = new DataObject(treeViewItem);
  74. DragDrop.DoDragDrop(OutlineView, dataObj, DragDropEffects.Move);
  75. return;
  76. }
  77. }
  78. /// <summary>
  79. /// 拖拽判断区域以及显示什么线
  80. /// </summary>
  81. /// <param name="sender"></param>
  82. /// <param name="e"></param>
  83. private void Grid_DragOver(object sender, DragEventArgs e)
  84. {
  85. (DataContext as OutLineControlViewModel).IsOnDrop = true;
  86. TreeViewItem sourceitem = e.Data.GetData(typeof(TreeViewItem)) as TreeViewItem;
  87. if (sourceitem == null)
  88. {
  89. return;
  90. }
  91. Point pos = e.GetPosition(OutlineView);
  92. HitTestResult result = VisualTreeHelper.HitTest(OutlineView, pos);
  93. if (result != null)
  94. {
  95. TreeViewItem treeviewitem = CommonHelper.FindVisualParent<TreeViewItem>(result.VisualHit);
  96. if (treeviewitem != null)
  97. {
  98. //控制最顶端的线
  99. if (pos.Y <= 9)
  100. {
  101. if (Treeviewitem == null)
  102. {
  103. Treeviewitem = treeviewitem;
  104. }
  105. (DataContext as OutLineControlViewModel).IsInsertHead = true;
  106. (Treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = false;
  107. (Treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = false;
  108. }
  109. else
  110. {
  111. (DataContext as OutLineControlViewModel).IsInsertHead = false;
  112. if (Treeviewitem == null)
  113. {
  114. Treeviewitem = treeviewitem;
  115. }
  116. else if (!Treeviewitem.Equals(treeviewitem))
  117. {
  118. (Treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = false;
  119. (Treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = false;
  120. Treeviewitem = treeviewitem;
  121. }
  122. else
  123. {
  124. (Treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = false;
  125. (Treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = false;
  126. }
  127. if (Treeviewitem.Equals(sourceitem))
  128. {
  129. return;
  130. }
  131. //鼠标位于上半部分显示实线,下半部分显示虚线
  132. Point p = treeviewitem.TranslatePoint(new Point(0, 0), OutlineView);
  133. if (pos.Y < p.Y + 16)
  134. {
  135. (treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = true;
  136. }
  137. else
  138. {
  139. (treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = true;
  140. }
  141. }
  142. }
  143. }
  144. }
  145. private void Grid_DragLeave(object sender, DragEventArgs e)
  146. {
  147. HiddenaAllLine();
  148. }
  149. private void OutlineView_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
  150. {
  151. TextBlock text = e.OriginalSource as TextBlock;
  152. if (text == null || text.Name == "PageIndex")
  153. {
  154. return;
  155. }
  156. TreeView tree = sender as TreeView;
  157. if (tree == null)
  158. {
  159. return;
  160. }
  161. OutlineNode viewitem = tree.SelectedItem as OutlineNode;
  162. if (viewitem == null)
  163. {
  164. return;
  165. }
  166. ReNameOutlineNode = viewitem;
  167. ReNameOutlineNode.IsReName = Visibility.Collapsed;
  168. e.Handled = true;
  169. }
  170. private void OutlineView_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  171. {
  172. (DataContext as OutLineControlViewModel).IsInsertHead = false;
  173. if (Treeviewitem != null)
  174. {
  175. (Treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = false;
  176. (Treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = false;
  177. Treeviewitem = null;
  178. }
  179. }
  180. private void OutlineView_Drop(object sender, DragEventArgs e)
  181. {
  182. onDrop = false;
  183. TreeViewItem souredata = e.Data.GetData(typeof(TreeViewItem)) as TreeViewItem;
  184. if (souredata == null)
  185. {
  186. return;
  187. }
  188. OutlineNode soureoutlineNode = souredata.DataContext as OutlineNode;
  189. Point pos = e.GetPosition(OutlineView);
  190. HitTestResult result = VisualTreeHelper.HitTest(OutlineView, pos);
  191. if (result == null)
  192. {
  193. HiddenaAllLine();
  194. return;
  195. }
  196. TreeViewItem targetitem = CommonHelper.FindVisualParent<TreeViewItem>(result.VisualHit);
  197. if (targetitem == null)
  198. {
  199. HiddenaAllLine();
  200. return;
  201. }
  202. OutlineNode targetoutlineNode = targetitem.DataContext as OutlineNode;
  203. if (soureoutlineNode.Equals(targetoutlineNode))
  204. {
  205. HiddenaAllLine();
  206. return;
  207. }
  208. (DataContext as OutLineControlViewModel).MoveOutLine(targetoutlineNode, soureoutlineNode);
  209. HiddenaAllLine();
  210. (DataContext as OutLineControlViewModel).Updata(true);
  211. }
  212. /// <summary>
  213. /// 清理线条显示,以及相关缓存对象
  214. /// </summary>
  215. private void HiddenaAllLine()
  216. {
  217. (DataContext as OutLineControlViewModel).IsOnDrop = false;
  218. (DataContext as OutLineControlViewModel).IsInsertHead = false;
  219. if (Treeviewitem != null)
  220. {
  221. (Treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = false;
  222. (Treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = false;
  223. Treeviewitem = null;
  224. }
  225. }
  226. private void ReName_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
  227. {
  228. TextBox ReNameText = sender as TextBox;
  229. if (ReNameText == null)
  230. {
  231. return;
  232. }
  233. if (ReNameText.Visibility == Visibility.Visible)
  234. {
  235. if (ReNameOutlineNode != null)
  236. {
  237. ReNameText.Text = ReNameOutlineNode.Outline.Title;
  238. }
  239. ReNameText.Focus();
  240. ReNameText.SelectAll();
  241. IsReName = true;
  242. }
  243. }
  244. private void RenameGrid_LostFocus(object sender, RoutedEventArgs e)
  245. {
  246. TextBox newdto = e.OriginalSource as TextBox;
  247. if (newdto == null)
  248. {
  249. IsReName = false;
  250. return;
  251. }
  252. string newtitle = string.IsNullOrEmpty(newdto.Text) ? "" : newdto.Text;
  253. Grid senderdto = sender as Grid;
  254. if (senderdto == null)
  255. {
  256. IsReName = false;
  257. return;
  258. }
  259. senderdto.Visibility = Visibility.Collapsed;
  260. if (ReNameOutlineNode != null)
  261. {
  262. CPDFOutline result = ReNameOutlineNode.Outline;
  263. if (result != null)
  264. {
  265. if (newtitle == result.Title)
  266. {
  267. IsReName = false;
  268. return;
  269. }
  270. (DataContext as OutLineControlViewModel).SetTitle(result, newtitle);
  271. }
  272. (DataContext as OutLineControlViewModel).Updata(false);
  273. }
  274. IsReName = false;
  275. }
  276. private void ToolTip_Opened(object sender, RoutedEventArgs e)
  277. {
  278. CustomImageControl imageControl = CommonHelper.FindVisualChild<CustomImageControl>(sender as ToolTip);
  279. OutlineNode outline = imageControl.DataContext as OutlineNode;
  280. if (outline == null || string.IsNullOrEmpty(outline.PageIndex))
  281. {
  282. return;
  283. }
  284. //开始绘制
  285. DrawingContext drawDc = imageControl.OpenDraw();
  286. WriteableBitmap imageData = (DataContext as OutLineControlViewModel).LoadPreview(outline, (int)imageControl.ActualWidth, (int)imageControl.ActualHeight);
  287. if (imageData == null)
  288. {
  289. imageControl.CloseDraw();
  290. return;
  291. }
  292. drawDc.DrawImage(imageData, new Rect(0, 0, imageControl.ActualWidth, imageControl.ActualHeight));
  293. imageControl.CloseDraw();
  294. }
  295. private void ToolTip_Closed(object sender, RoutedEventArgs e)
  296. {
  297. CustomImageControl imageControl = CommonHelper.FindVisualChild<CustomImageControl>(sender as ToolTip);
  298. //清空绘制上下文数据
  299. imageControl.OpenDraw();
  300. imageControl.CloseDraw();
  301. }
  302. private void TreeViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  303. {
  304. if (e.ClickCount == 1)
  305. {
  306. TreeViewItem content = sender as TreeViewItem;
  307. if (content == null)
  308. return;
  309. Point p = e.GetPosition(OutlineView);
  310. HitTestResult result = VisualTreeHelper.HitTest(OutlineView, p);
  311. if (result != null)
  312. {
  313. //点击部位为箭头时,不跳转
  314. ToggleButton button = CommonHelper.FindVisualParent<ToggleButton>(result.VisualHit);
  315. if (button != null)
  316. return;
  317. Button btn = CommonHelper.FindVisualParent<Button>(result.VisualHit);
  318. if (btn != null)
  319. return;
  320. GotoPageItem = content;
  321. }
  322. }
  323. }
  324. private void TreeViewItem_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  325. {
  326. if (!onDrop)
  327. {
  328. //因为点击按下事件是按照层级传递下来的,所以取到最后一次按下的对象进行跳转,以免跳转到父级
  329. if (GotoPageItem != null)
  330. {
  331. (DataContext as OutLineControlViewModel).GoToPage(GotoPageItem);
  332. }
  333. }
  334. }
  335. private void MenuCollapseAll_Click(object sender, RoutedEventArgs e)
  336. {
  337. (DataContext as OutLineControlViewModel).CollapseAll(OutlineView.ItemsSource as ObservableCollection<OutlineNode>);
  338. }
  339. private void MenuExpandAll_Click(object sender, RoutedEventArgs e)
  340. {
  341. (DataContext as OutLineControlViewModel).ExpandAll(OutlineView.ItemsSource as ObservableCollection<OutlineNode>);
  342. }
  343. private void MenuDeleteAll_Click(object sender, RoutedEventArgs e)
  344. {
  345. (DataContext as OutLineControlViewModel).DeleteAll();
  346. }
  347. private void DowngradeMenu_Click(object sender, RoutedEventArgs e)
  348. {
  349. (DataContext as OutLineControlViewModel).Downgrade((sender as MenuItem).DataContext as OutlineNode);
  350. }
  351. private void UpgradeMenu_Click(object sender, RoutedEventArgs e)
  352. {
  353. (DataContext as OutLineControlViewModel).Upgrade((sender as MenuItem).DataContext as OutlineNode);
  354. }
  355. private void DeleteMenu_Click(object sender, RoutedEventArgs e)
  356. {
  357. (DataContext as OutLineControlViewModel).RemoveOutline((sender as MenuItem).DataContext as OutlineNode);
  358. }
  359. private void RenameMenu_Click(object sender, RoutedEventArgs e)
  360. {
  361. ReNameOutlineNode = (sender as MenuItem).DataContext as OutlineNode;
  362. ReNameOutlineNode.IsReName = Visibility.Collapsed;
  363. }
  364. private void ChangeDestinationMenu_Click(object sender, RoutedEventArgs e)
  365. {
  366. AlertsMessage alertsMessage = new AlertsMessage();
  367. alertsMessage.ShowDialog("提示", "确定要将选定大纲的目标位置设置为当前位置吗?", "Cancel", "OK");
  368. if (alertsMessage.result == ContentResult.Ok)
  369. {
  370. (DataContext as OutLineControlViewModel).ChangeOutLineDestination((sender as MenuItem).DataContext as OutlineNode);
  371. }
  372. }
  373. private void BtnAdd_Click(object sender, RoutedEventArgs e)
  374. {
  375. AddOutlineNode();
  376. }
  377. public OutlineNode AddOutlineNode(string str = null)
  378. {
  379. int ItemIndex = (DataContext as OutLineControlViewModel).AddOutLine(OutlineView.SelectedItem as OutlineNode);
  380. OutlineView.UpdateLayout();
  381. OutlineNode node = (DataContext as OutLineControlViewModel).FindOutlineFromList((DataContext as OutLineControlViewModel).Outlinelist, OutlineView.SelectedItem as OutlineNode, ItemIndex);
  382. //if (!string.IsNullOrEmpty(str))
  383. //{
  384. // CPDFOutline result = node.Outline;
  385. // (DataContext as OutLineControlViewModel).SetTitle(result, str);
  386. // (DataContext as OutLineControlViewModel).Updata(false);
  387. //}
  388. node.IsSelected = true;
  389. ReNameOutlineNode = node;
  390. node.IsReName = Visibility.Collapsed;
  391. return node;
  392. }
  393. private void AddMenu_Click(object sender, RoutedEventArgs e)
  394. {
  395. ((sender as MenuItem).DataContext as OutlineNode).IsSelected = true;
  396. int ItemIndex = (DataContext as OutLineControlViewModel).AddOutLine((sender as MenuItem).DataContext as OutlineNode);
  397. OutlineView.UpdateLayout();
  398. OutlineNode node = (DataContext as OutLineControlViewModel).FindOutlineFromList((DataContext as OutLineControlViewModel).Outlinelist, OutlineView.SelectedItem as OutlineNode, ItemIndex);
  399. node.IsSelected = true;
  400. ReNameOutlineNode = node;
  401. node.IsReName = Visibility.Collapsed;
  402. }
  403. private void AddParentMenu_Click(object sender, RoutedEventArgs e)
  404. {
  405. ((sender as MenuItem).DataContext as OutlineNode).IsSelected = true;
  406. int ItemIndex = (DataContext as OutLineControlViewModel).InsertParentOutline((sender as MenuItem).DataContext as OutlineNode);
  407. OutlineView.UpdateLayout();
  408. OutlineNode node = (DataContext as OutLineControlViewModel).FindOutlineFromList((DataContext as OutLineControlViewModel).Outlinelist, (OutlineView.SelectedItem as OutlineNode).Parent, ItemIndex);
  409. node.IsSelected = true;
  410. ReNameOutlineNode = node;
  411. node.IsReName = Visibility.Collapsed;
  412. }
  413. private void AddChlidMenu_Click(object sender, RoutedEventArgs e)
  414. {
  415. ((sender as MenuItem).DataContext as OutlineNode).IsExpanded = true;
  416. ((sender as MenuItem).DataContext as OutlineNode).IsSelected = true;
  417. int ItemIndex = (DataContext as OutLineControlViewModel).InsertChlidOutline((sender as MenuItem).DataContext as OutlineNode);
  418. OutlineView.UpdateLayout();
  419. OutlineNode node = (DataContext as OutLineControlViewModel).FindOutlineFromList((DataContext as OutLineControlViewModel).Outlinelist, (OutlineView.SelectedItem as OutlineNode).Chlidlist[ItemIndex], ItemIndex);
  420. node.IsSelected = true;
  421. ReNameOutlineNode = node;
  422. node.IsReName = Visibility.Collapsed;
  423. }
  424. private void OutlineView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
  425. {
  426. onDrop = false;
  427. }
  428. }
  429. }