MatrixObject.DesignExt.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. using System;
  2. using System.ComponentModel;
  3. using System.Windows.Forms;
  4. using System.Drawing;
  5. using System.Drawing.Drawing2D;
  6. using FastReport.Table;
  7. using FastReport.Data;
  8. using FastReport.Utils;
  9. using FastReport.Forms;
  10. namespace FastReport.Matrix
  11. {
  12. internal enum MatrixElement
  13. {
  14. None,
  15. Column,
  16. Row,
  17. Cell
  18. }
  19. partial class MatrixObject
  20. {
  21. #region Fields
  22. internal TableCell selectedCell;
  23. private bool dragSelectedCell;
  24. internal DragInfo dragInfo;
  25. #endregion
  26. #region Properties
  27. /// <summary>
  28. /// This property is not relevant to this class.
  29. /// </summary>
  30. [Browsable(false)]
  31. public override int ColumnCount
  32. {
  33. get { return base.ColumnCount; }
  34. set { base.ColumnCount = value; }
  35. }
  36. /// <summary>
  37. /// This property is not relevant to this class.
  38. /// </summary>
  39. [Browsable(false)]
  40. public override int RowCount
  41. {
  42. get { return base.RowCount; }
  43. set { base.RowCount = value; }
  44. }
  45. /// <summary>
  46. /// This property is not relevant to this class.
  47. /// </summary>
  48. [Browsable(false)]
  49. public new int FixedRows
  50. {
  51. get { return base.FixedRows; }
  52. set { base.FixedRows = value; }
  53. }
  54. /// <summary>
  55. /// This property is not relevant to this class.
  56. /// </summary>
  57. [Browsable(false)]
  58. public new int FixedColumns
  59. {
  60. get { return base.FixedColumns; }
  61. set { base.FixedColumns = value; }
  62. }
  63. /// <summary>
  64. /// This property is not relevant to this class.
  65. /// </summary>
  66. [Browsable(false)]
  67. public new bool CanBreak
  68. {
  69. get { return base.CanBreak; }
  70. set { base.CanBreak = value; }
  71. }
  72. /// <summary>
  73. /// This property is not relevant to this class.
  74. /// </summary>
  75. [Browsable(false)]
  76. public new bool GrowToBottom
  77. {
  78. get { return base.GrowToBottom; }
  79. set { base.GrowToBottom = value; }
  80. }
  81. private bool DragCellMode
  82. {
  83. get { return selectedCell != null && dragSelectedCell; }
  84. }
  85. #endregion
  86. #region Private Methods
  87. internal void RefreshTemplate(bool reset)
  88. {
  89. Helper.UpdateDescriptors();
  90. for (int x = 0; x < Helper.BodyWidth; x++)
  91. {
  92. for (int y = 0; y < Helper.BodyHeight; y++)
  93. {
  94. TableCell cell = this[x + FixedColumns, y + FixedRows];
  95. if (reset)
  96. cell.Text = "";
  97. else
  98. cell.SetFlags(Flags.CanEdit, false);
  99. }
  100. }
  101. MatrixElement element;
  102. MatrixDescriptor descriptor;
  103. bool isTotal;
  104. for (int x = 0; x < ColumnCount; x++)
  105. {
  106. for (int y = 0; y < RowCount; y++)
  107. {
  108. TableCell cell = this[x, y];
  109. GetMatrixElement(cell, out element, out descriptor, out isTotal);
  110. bool enableSmartTag = descriptor != null && !isTotal;
  111. cell.SetFlags(Flags.HasSmartTag, enableSmartTag);
  112. }
  113. }
  114. }
  115. internal void DrawSelectedCellFrame(FRPaintEventArgs e, TableCell cell)
  116. {
  117. Pen p = e.Cache.GetPen(Color.Black, 3, System.Drawing.Drawing2D.DashStyle.Solid);
  118. e.Graphics.DrawRectangle(p, cell.AbsLeft * e.ScaleX, cell.AbsTop * e.ScaleY,
  119. cell.Width * e.ScaleX, cell.Height * e.ScaleY);
  120. }
  121. internal void DrawDragIndicator(FRPaintEventArgs e)
  122. {
  123. dragInfo.targetCell.DrawDragAcceptFrame(e, Color.Red);
  124. if (dragInfo.indicator.Width > 0 || dragInfo.indicator.Height > 0)
  125. {
  126. IGraphics g = e.Graphics;
  127. int left = (int)Math.Round((dragInfo.indicator.Left + AbsLeft) * e.ScaleX);
  128. int top = (int)Math.Round((dragInfo.indicator.Top + AbsTop) * e.ScaleY);
  129. int right = (int)Math.Round(dragInfo.indicator.Width * e.ScaleX) + left;
  130. int bottom = (int)Math.Round(dragInfo.indicator.Height * e.ScaleY) + top;
  131. Pen p = e.Cache.GetPen(Color.Red, 1, DashStyle.Solid);
  132. g.DrawLine(p, left, top, right, bottom);
  133. p = Pens.Red;
  134. Brush b = Brushes.Red;
  135. if (dragInfo.indicator.Width == 0)
  136. {
  137. Point[] poly = new Point[] {
  138. new Point(left, top),
  139. new Point(left - 4, top - 4),
  140. new Point(left + 4, top - 4),
  141. new Point(left, top) };
  142. g.FillPolygon(b, poly);
  143. g.DrawPolygon(p, poly);
  144. poly = new Point[] {
  145. new Point(left, bottom),
  146. new Point(left - 4, bottom + 4),
  147. new Point(left + 4, bottom + 4),
  148. new Point(left, bottom) };
  149. g.FillPolygon(b, poly);
  150. g.DrawPolygon(p, poly);
  151. }
  152. else
  153. {
  154. Point[] poly = new Point[] {
  155. new Point(left, top),
  156. new Point(left - 4, top - 4),
  157. new Point(left - 4, top + 4),
  158. new Point(left, top) };
  159. g.FillPolygon(b, poly);
  160. g.DrawPolygon(p, poly);
  161. poly = new Point[] {
  162. new Point(right, top),
  163. new Point(right + 4, top - 4),
  164. new Point(right + 4, top + 4),
  165. new Point(right, top) };
  166. g.FillPolygon(b, poly);
  167. g.DrawPolygon(p, poly);
  168. }
  169. }
  170. }
  171. private void GetMatrixElement(TableCell cell, out MatrixElement element, out MatrixDescriptor descriptor,
  172. out bool isTotal)
  173. {
  174. element = MatrixElement.None;
  175. descriptor = null;
  176. isTotal = false;
  177. bool noColumns = Data.Columns.Count == 0;
  178. bool noRows = Data.Rows.Count == 0;
  179. bool noCells = Data.Cells.Count == 0;
  180. // create temporary descriptors
  181. if (noColumns)
  182. Data.Columns.Add(new MatrixHeaderDescriptor("", false));
  183. if (noRows)
  184. Data.Rows.Add(new MatrixHeaderDescriptor("", false));
  185. if (noCells)
  186. Data.Cells.Add(new MatrixCellDescriptor());
  187. Helper.UpdateDescriptors();
  188. foreach (MatrixHeaderDescriptor descr in Data.Columns)
  189. {
  190. if (descr.TemplateCell == cell || descr.TemplateTotalCell == cell)
  191. {
  192. element = MatrixElement.Column;
  193. if (!noColumns)
  194. descriptor = descr;
  195. isTotal = descr.TemplateTotalCell == cell;
  196. }
  197. }
  198. foreach (MatrixHeaderDescriptor descr in Data.Rows)
  199. {
  200. if (descr.TemplateCell == cell || descr.TemplateTotalCell == cell)
  201. {
  202. element = MatrixElement.Row;
  203. if (!noRows)
  204. descriptor = descr;
  205. isTotal = descr.TemplateTotalCell == cell;
  206. }
  207. }
  208. foreach (MatrixCellDescriptor descr in Data.Cells)
  209. {
  210. if (descr.TemplateCell == cell)
  211. {
  212. element = MatrixElement.Cell;
  213. if (!noCells)
  214. descriptor = descr;
  215. }
  216. }
  217. if (cell.Address.X >= FixedColumns && cell.Address.Y >= FixedRows)
  218. element = MatrixElement.Cell;
  219. if (noColumns)
  220. Data.Columns.Clear();
  221. if (noRows)
  222. Data.Rows.Clear();
  223. if (noCells)
  224. Data.Cells.Clear();
  225. }
  226. #endregion
  227. #region Protected Methods
  228. /// <inheritdoc/>
  229. protected override SelectionPoint[] GetSelectionPoints()
  230. {
  231. if (AutoSize)
  232. return new SelectionPoint[] { new SelectionPoint(AbsLeft, AbsTop, SizingPoint.LeftTop) };
  233. return base.GetSelectionPoints();
  234. }
  235. #endregion
  236. #region Public Methods
  237. /// <inheritdoc/>
  238. public override void Draw(FRPaintEventArgs e)
  239. {
  240. if (IsDesigning && AutoSize)
  241. {
  242. AutoSize = true;
  243. CalcHeight();
  244. }
  245. base.Draw(e);
  246. if (selectedCell != null)
  247. DrawSelectedCellFrame(e, selectedCell);
  248. if (dragInfo.target != MatrixElement.None)
  249. DrawDragIndicator(e);
  250. if (!IsResultMatrix)
  251. RefreshTemplate(false);
  252. }
  253. /// <inheritdoc/>
  254. public override void SelectionChanged()
  255. {
  256. base.SelectionChanged();
  257. this.selectedCell = null;
  258. dragInfo.source = MatrixElement.None;
  259. dragInfo.sourceDescriptor = null;
  260. if (!IsSelected || Report.Designer.SelectedObjects.Count != 1)
  261. return;
  262. TableCell selectedCell = Report.Designer.SelectedObjects[0] as TableCell;
  263. if (selectedCell == null)
  264. return;
  265. bool isTotal;
  266. GetMatrixElement(selectedCell, out dragInfo.source, out dragInfo.sourceDescriptor, out isTotal);
  267. if (dragInfo.sourceDescriptor == null || isTotal)
  268. {
  269. dragInfo.source = MatrixElement.None;
  270. dragInfo.sourceDescriptor = null;
  271. }
  272. else
  273. this.selectedCell = selectedCell;
  274. }
  275. /// <inheritdoc/>
  276. public override void HandleMouseDown(FRMouseEventArgs e)
  277. {
  278. if (DragCellMode)
  279. {
  280. e.handled = true;
  281. e.mode = WorkspaceMode2.Custom;
  282. e.activeObject = this;
  283. }
  284. else
  285. base.HandleMouseDown(e);
  286. }
  287. /// <inheritdoc/>
  288. public override void HandleMouseMove(FRMouseEventArgs e)
  289. {
  290. if (DragCellMode && e.button == MouseButtons.Left)
  291. {
  292. e.DragSource = selectedCell;
  293. HandleDragOver(e);
  294. }
  295. else
  296. {
  297. base.HandleMouseMove(e);
  298. if (AutoSize && (MouseMode == MouseMode.ResizeColumn || MouseMode == MouseMode.ResizeRow))
  299. {
  300. MouseMode = MouseMode.None;
  301. e.handled = false;
  302. e.mode = WorkspaceMode2.None;
  303. e.cursor = Cursors.Default;
  304. }
  305. if (selectedCell != null && e.button == MouseButtons.None)
  306. {
  307. PointF point = new PointF(e.x, e.y);
  308. RectangleF innerRect = selectedCell.AbsBounds;
  309. RectangleF outerRect = innerRect;
  310. innerRect.Inflate(-3, -3);
  311. outerRect.Inflate(3, 3);
  312. dragSelectedCell = outerRect.Contains(point) && !innerRect.Contains(point);
  313. if (dragSelectedCell)
  314. {
  315. e.handled = true;
  316. e.cursor = Cursors.SizeAll;
  317. }
  318. }
  319. }
  320. }
  321. /// <inheritdoc/>
  322. public override void HandleMouseUp(FRMouseEventArgs e)
  323. {
  324. if (DragCellMode)
  325. {
  326. HandleDragDrop(e);
  327. Report.Designer.SetModified(this, "Change");
  328. selectedCell = null;
  329. dragSelectedCell = false;
  330. }
  331. else
  332. base.HandleMouseUp(e);
  333. }
  334. /// <inheritdoc/>
  335. public override void HandleDragOver(FRMouseEventArgs e)
  336. {
  337. // matrix that is defined in the base report cannot be configured such way.
  338. if (IsAncestor)
  339. return;
  340. dragInfo.target = MatrixElement.None;
  341. dragInfo.indicator = Rectangle.Empty;
  342. if (!(e.DragSource is TextObject))
  343. return;
  344. bool noColumns = Data.Columns.Count == 0;
  345. bool noRows = Data.Rows.Count == 0;
  346. bool noCells = Data.Cells.Count == 0;
  347. // create temporary descriptors
  348. if (noColumns)
  349. Data.Columns.Add(new MatrixHeaderDescriptor("", false));
  350. if (noRows)
  351. Data.Rows.Add(new MatrixHeaderDescriptor("", false));
  352. if (noCells)
  353. Data.Cells.Add(new MatrixCellDescriptor());
  354. Helper.UpdateDescriptors();
  355. PointF point = new PointF(e.x, e.y);
  356. // determine the location where to insert a new item: column, row or cell
  357. foreach (MatrixHeaderDescriptor descr in Data.Columns)
  358. {
  359. TableCell cell = descr.TemplateCell;
  360. if (cell != e.DragSource && cell.PointInObject(point))
  361. {
  362. dragInfo.target = MatrixElement.Column;
  363. dragInfo.targetIndex = Data.Columns.IndexOf(descr) + 1;
  364. dragInfo.targetCell = cell;
  365. float top = cell.Bottom;
  366. float width = cell.Width;
  367. if (noColumns || point.Y < cell.AbsTop + cell.Height / 2)
  368. {
  369. if (descr.TemplateTotalCell != null)
  370. width += descr.TemplateTotalCell.Width;
  371. top = cell.Top;
  372. dragInfo.targetIndex--;
  373. }
  374. dragInfo.indicator = new RectangleF(cell.Left, top, noColumns ? 0 : width, 0);
  375. e.dragMessage = Res.Get("ComponentsMisc,Matrix,NewColumn");
  376. }
  377. }
  378. foreach (MatrixHeaderDescriptor descr in Data.Rows)
  379. {
  380. TableCell cell = descr.TemplateCell;
  381. if (cell != e.DragSource && cell.PointInObject(point))
  382. {
  383. dragInfo.target = MatrixElement.Row;
  384. dragInfo.targetIndex = Data.Rows.IndexOf(descr) + 1;
  385. dragInfo.targetCell = cell;
  386. float left = cell.Right;
  387. float height = cell.Height;
  388. if (noRows || point.X < cell.AbsLeft + cell.Width / 2)
  389. {
  390. if (descr.TemplateTotalCell != null)
  391. height += descr.TemplateTotalCell.Height;
  392. left = cell.Left;
  393. dragInfo.targetIndex--;
  394. }
  395. dragInfo.indicator = new RectangleF(left, cell.Top, 0, noRows ? 0 : height);
  396. e.dragMessage = Res.Get("ComponentsMisc,Matrix,NewRow");
  397. }
  398. }
  399. foreach (MatrixCellDescriptor descr in Data.Cells)
  400. {
  401. TableCell cell = descr.TemplateCell;
  402. if (cell != e.DragSource && cell.PointInObject(point))
  403. {
  404. dragInfo.target = MatrixElement.Cell;
  405. dragInfo.targetCell = cell;
  406. bool preferLeftRight = Math.Min(point.X - cell.AbsLeft, cell.AbsRight - point.X) < 10;
  407. if (Data.Cells.Count < 2 || CellsSideBySide)
  408. {
  409. dragInfo.targetIndex = Data.Cells.IndexOf(descr) + 1;
  410. dragInfo.cellsSideBySide = true;
  411. float left = cell.Right;
  412. if (point.X < cell.AbsLeft + cell.Width / 2)
  413. {
  414. left = cell.Left;
  415. dragInfo.targetIndex--;
  416. }
  417. dragInfo.indicator = new RectangleF(left, cell.Top, 0, cell.Height);
  418. }
  419. if ((Data.Cells.Count < 2 && !preferLeftRight) || (Data.Cells.Count >= 2 && !CellsSideBySide))
  420. {
  421. dragInfo.targetIndex = Data.Cells.IndexOf(descr) + 1;
  422. dragInfo.cellsSideBySide = false;
  423. float top = cell.Bottom;
  424. if (point.Y < cell.AbsTop + cell.Height / 2)
  425. {
  426. top = cell.Top;
  427. dragInfo.targetIndex--;
  428. }
  429. dragInfo.indicator = new RectangleF(cell.Left, top, cell.Width, 0);
  430. }
  431. if (noCells)
  432. {
  433. dragInfo.targetIndex = 0;
  434. dragInfo.indicator = RectangleF.Empty;
  435. }
  436. e.dragMessage = Res.Get("ComponentsMisc,Matrix,NewCell");
  437. }
  438. }
  439. if (noColumns)
  440. Data.Columns.Clear();
  441. if (noRows)
  442. Data.Rows.Clear();
  443. if (noCells)
  444. Data.Cells.Clear();
  445. e.handled = PointInObject(point);
  446. }
  447. /// <inheritdoc/>
  448. public override void HandleDragDrop(FRMouseEventArgs e)
  449. {
  450. if (dragInfo.target != MatrixElement.None)
  451. {
  452. string draggedText = (e.DragSource as TextObject).Text;
  453. MatrixDescriptor sourceDescr = dragInfo.sourceDescriptor;
  454. MatrixDescriptor targetDescr = null;
  455. // insert new item.
  456. switch (dragInfo.target)
  457. {
  458. case MatrixElement.Column:
  459. targetDescr = new MatrixHeaderDescriptor(draggedText);
  460. if (sourceDescr != null)
  461. targetDescr.Assign(sourceDescr);
  462. if (dragInfo.source == MatrixElement.Cell)
  463. targetDescr.TemplateCell = null;
  464. Data.Columns.Insert(dragInfo.targetIndex, targetDescr as MatrixHeaderDescriptor);
  465. break;
  466. case MatrixElement.Row:
  467. targetDescr = new MatrixHeaderDescriptor(draggedText);
  468. if (sourceDescr != null)
  469. targetDescr.Assign(sourceDescr);
  470. if (dragInfo.source == MatrixElement.Cell)
  471. targetDescr.TemplateCell = null;
  472. Data.Rows.Insert(dragInfo.targetIndex, targetDescr as MatrixHeaderDescriptor);
  473. break;
  474. case MatrixElement.Cell:
  475. targetDescr = new MatrixCellDescriptor(draggedText);
  476. if (sourceDescr != null)
  477. targetDescr.Assign(sourceDescr);
  478. if (dragInfo.source != MatrixElement.Cell)
  479. targetDescr.TemplateCell = null;
  480. CellsSideBySide = dragInfo.cellsSideBySide;
  481. Data.Cells.Insert(dragInfo.targetIndex, targetDescr as MatrixCellDescriptor);
  482. break;
  483. }
  484. // remove source item
  485. switch (dragInfo.source)
  486. {
  487. case MatrixElement.Column:
  488. Data.Columns.Remove(sourceDescr as MatrixHeaderDescriptor);
  489. break;
  490. case MatrixElement.Row:
  491. Data.Rows.Remove(sourceDescr as MatrixHeaderDescriptor);
  492. break;
  493. case MatrixElement.Cell:
  494. Data.Cells.Remove(sourceDescr as MatrixCellDescriptor);
  495. break;
  496. }
  497. if (DataSource == null)
  498. {
  499. if (draggedText.StartsWith("[") && draggedText.EndsWith("]"))
  500. draggedText = draggedText.Substring(1, draggedText.Length - 2);
  501. DataSource = DataHelper.GetDataSource(Report.Dictionary, draggedText);
  502. }
  503. Helper.BuildTemplate();
  504. if (targetDescr != null)
  505. {
  506. Report.Designer.SelectedObjects.Clear();
  507. Report.Designer.SelectedObjects.Add(targetDescr.TemplateCell);
  508. }
  509. }
  510. dragInfo.target = MatrixElement.None;
  511. dragInfo.source = MatrixElement.None;
  512. }
  513. /// <inheritdoc/>
  514. public override void OnBeforeInsert(int flags)
  515. {
  516. BuildTemplate();
  517. }
  518. /// <inheritdoc/>
  519. public override ContextMenuBase GetContextMenu()
  520. {
  521. return new MatrixObjectMenu(Report.Designer);
  522. }
  523. internal override ContextMenuBase GetCellContextMenu(TableCell cell)
  524. {
  525. if (Report.Designer.SelectedObjects.Count == 1)
  526. {
  527. MatrixElement element;
  528. MatrixDescriptor descriptor;
  529. bool isTotal;
  530. GetMatrixElement(cell, out element, out descriptor, out isTotal);
  531. switch (element)
  532. {
  533. case MatrixElement.Column:
  534. case MatrixElement.Row:
  535. if (isTotal)
  536. return new MatrixTotalMenu(this, element, descriptor);
  537. else if (descriptor != null)
  538. return new MatrixHeaderMenu(this, element, descriptor);
  539. break;
  540. case MatrixElement.Cell:
  541. if (descriptor != null)
  542. return new MatrixCellMenu(this, element, descriptor);
  543. break;
  544. }
  545. }
  546. return new MatrixCellMenuBase(this, MatrixElement.None, null);
  547. }
  548. internal override SmartTagBase GetCellSmartTag(TableCell cell)
  549. {
  550. MatrixElement element;
  551. MatrixDescriptor descriptor;
  552. bool isTotal;
  553. GetMatrixElement(cell, out element, out descriptor, out isTotal);
  554. if (descriptor != null && !isTotal)
  555. return new MatrixCellSmartTag(this, descriptor);
  556. return null;
  557. }
  558. internal override void HandleCellDoubleClick(TableCell cell)
  559. {
  560. MatrixElement element;
  561. MatrixDescriptor descriptor;
  562. bool isTotal;
  563. GetMatrixElement(cell, out element, out descriptor, out isTotal);
  564. if (descriptor != null && !isTotal)
  565. {
  566. using (ExpressionEditorForm form = new ExpressionEditorForm(Report))
  567. {
  568. form.ExpressionText = descriptor.Expression;
  569. if (form.ShowDialog() == DialogResult.OK)
  570. {
  571. descriptor.Expression = form.ExpressionText;
  572. BuildTemplate();
  573. Report.Designer.SetModified(cell, "Change");
  574. }
  575. }
  576. }
  577. else
  578. {
  579. if (cell.HasFlag(Flags.CanEdit) && !cell.HasRestriction(Restrictions.DontEdit) && cell.InvokeEditor())
  580. Report.Designer.SetModified(cell, "Change");
  581. }
  582. }
  583. /// <inheritdoc/>
  584. public override void HandleKeyDown(Control sender, KeyEventArgs e)
  585. {
  586. bool myKey = false;
  587. SelectedObjectCollection selection = Report.Designer.SelectedObjects;
  588. if (!IsSelected || !(selection[0] is TableCell))
  589. return;
  590. TableCell cell = selection[0] as TableCell;
  591. MatrixElement element;
  592. MatrixDescriptor descriptor;
  593. bool isTotal;
  594. GetMatrixElement(cell, out element, out descriptor, out isTotal);
  595. switch (e.KeyCode)
  596. {
  597. case Keys.Delete:
  598. if (element != MatrixElement.None)
  599. {
  600. if (descriptor != null && !IsAncestor)
  601. {
  602. if (isTotal)
  603. (descriptor as MatrixHeaderDescriptor).Totals = false;
  604. else
  605. {
  606. switch (element)
  607. {
  608. case MatrixElement.Column:
  609. Data.Columns.Remove(descriptor as MatrixHeaderDescriptor);
  610. break;
  611. case MatrixElement.Row:
  612. Data.Rows.Remove(descriptor as MatrixHeaderDescriptor);
  613. break;
  614. case MatrixElement.Cell:
  615. Data.Cells.Remove(descriptor as MatrixCellDescriptor);
  616. break;
  617. }
  618. }
  619. }
  620. myKey = true;
  621. }
  622. break;
  623. case Keys.Enter:
  624. if (descriptor != null && !isTotal)
  625. {
  626. HandleCellDoubleClick(cell);
  627. myKey = true;
  628. }
  629. break;
  630. }
  631. if (myKey)
  632. {
  633. e.Handled = true;
  634. BuildTemplate();
  635. Report.Designer.SetModified(this, "Change");
  636. }
  637. else
  638. base.HandleKeyDown(sender, e);
  639. }
  640. #endregion
  641. private void InitDesign()
  642. {
  643. dragInfo = new DragInfo();
  644. }
  645. internal class DragInfo
  646. {
  647. public MatrixElement source;
  648. public MatrixElement target;
  649. public MatrixDescriptor sourceDescriptor;
  650. public int targetIndex;
  651. public RectangleF indicator;
  652. public bool cellsSideBySide;
  653. public TableCell targetCell;
  654. }
  655. }
  656. }