using FastReport.Design; using FastReport.Forms; using FastReport.Utils; using System; using System.Drawing; using System.Windows.Forms; namespace FastReport.Table { internal class TableCellMenu : TableMenuBase { #region Fields private SelectedObjectCollection selection; private TableBase table; private TableCell topCell; private ContextMenuItem miFormat; private ContextMenuItem miMergeSplit; private ContextMenuItem miClear; private ContextMenuItem miCut; private ContextMenuItem miCopy; private ContextMenuItem miPaste; private ContextMenuItem miInsert; private ContextMenuItem miRemove; private ContextMenuItem miAddColumnLeft; private ContextMenuItem miAddColumnRight; private ContextMenuItem miAddRowTop; private ContextMenuItem miAddRowBottom; private ContextMenuItem miRemoveRow; private ContextMenuItem miRemoveColumn; private ContextMenuItem miStyle; #endregion #region Private Methods private void miFormat_Click(object sender, EventArgs e) { using (FormatEditorForm form = new FormatEditorForm()) { form.TextObject = topCell; if (form.ShowDialog() == DialogResult.OK) { SelectedTextBaseObjects components = new SelectedTextBaseObjects(Designer); components.Update(); components.SetFormat(form.Formats); Change(); } } } private void miMergeSplit_Click(object sender, EventArgs e) { if (miMergeSplit.Checked) { Rectangle rect = table.GetSelectionRect(); // reset spans inside selection for (int x = 0; x < rect.Width; x++) { for (int y = 0; y < rect.Height; y++) { TableCell cell = table[x + rect.X, y + rect.Y]; cell.ColSpan = 1; cell.RowSpan = 1; if (cell != topCell) cell.Text = ""; } } topCell.ColSpan = rect.Width; topCell.RowSpan = rect.Height; selection.Clear(); selection.Add(topCell); } else { topCell.ColSpan = 1; topCell.RowSpan = 1; } Change(); } private void miClear_Click(object sender, EventArgs e) { foreach (Base c in selection) { if (c is TableCell) (c as TableCell).Text = ""; } Change(); } private void miCut_Click(object sender, EventArgs e) { table.Clipboard.CutCells(table.GetSelectionRect()); table.CreateUniqueNames(); Change(); } private void miCopy_Click(object sender, EventArgs e) { table.Clipboard.CopyCells(table.GetSelectionRect()); } private void miPaste_Click(object sender, EventArgs e) { table.Clipboard.PasteCells(topCell.Address); table.CreateUniqueNames(); selection.Clear(); selection.Add(table); Change(); } private void miAddColumnLeft_Click(object sender, EventArgs e) { Rectangle rect = table.GetSelectionRect(); int pos = rect.Left; int countNewColumns = rect.Width; selection.Clear(); for (int i = 0; i < countNewColumns; i++) { TableColumn column = new TableColumn(); table.Columns.Insert(pos, column); table.CreateUniqueNames(); selection.Add(column); } Change(); } private void miAddColumnRight_Click(object sender, EventArgs e) { Rectangle rect = table.GetSelectionRect(); int pos = rect.Right; int countNewColumns = rect.Width; selection.Clear(); for (int i = 0; i < countNewColumns; i++) { TableColumn column = new TableColumn(); table.Columns.Insert(pos, column); table.CreateUniqueNames(); selection.Add(column); } Change(); } private void miAddRowTop_Click(object sender, EventArgs e) { Rectangle rect = table.GetSelectionRect(); int pos = rect.Top; int countNewRows = rect.Height; selection.Clear(); for (int i = 0; i < countNewRows; i++) { TableRow row = new TableRow(); table.Rows.Insert(pos, row); table.CreateUniqueNames(); selection.Add(row); } Change(); } private void miAddRowBottom_Click(object sender, EventArgs e) { Rectangle rect = table.GetSelectionRect(); int pos = rect.Bottom; int countNewRows = rect.Height; selection.Clear(); for (int i = 0; i < countNewRows; i++) { TableRow row = new TableRow(); table.Rows.Insert(pos, row); table.CreateUniqueNames(); selection.Add(row); } Change(); } private void miRemoveColumn_Click(object sender, EventArgs e) { Rectangle rect = table.GetSelectionRect(); int pos = rect.Left; for (int i = 0; i < rect.Width; i++) { if (table.Columns[pos].IsAncestor) { FRMessageBox.Error(String.Format(Res.Get("Messages,DeleteAncestor"), table.Columns[pos].Name)); break; } else table.Columns.RemoveAt(pos); } selection.Clear(); selection.Add(table); Change(); } private void miRemoveRow_Click(object sender, EventArgs e) { Rectangle rect = table.GetSelectionRect(); int pos = rect.Top; for (int i = 0; i < rect.Height; i++) { if (table.Rows[pos].IsAncestor) { FRMessageBox.Error(String.Format(Res.Get("Messages,DeleteAncestor"), table.Rows[pos].Name)); break; } else table.Rows.RemoveAt(pos); } selection.Clear(); selection.Add(table); Change(); } private void miStyle_Click(object sender, EventArgs e) { if (sender is ContextMenuItem menuItem) Designer.SelectedReportComponents.SetStyle(menuItem.Text); } #endregion public TableCellMenu(Designer designer) : base(designer) { selection = Designer.SelectedObjects; topCell = selection[0] as TableCell; table = topCell.Parent.Parent as TableBase; miFormat = CreateMenuItem(168, Res.Get("ComponentMenu,TextObject,Format"), new EventHandler(miFormat_Click)); miMergeSplit = CreateMenuItem(217, Res.Get("ComponentMenu,TableCell,Merge"), new EventHandler(miMergeSplit_Click)); miMergeSplit.CheckOnClick = true; miClear = CreateMenuItem(82, Res.Get("ComponentMenu,TextObject,Clear"), new EventHandler(miClear_Click)); miCut = CreateMenuItem(5, Res.Get("Designer,Menu,Edit,Cut"), new EventHandler(miCut_Click)); miCut.BeginGroup = true; miCopy = CreateMenuItem(6, Res.Get("Designer,Menu,Edit,Copy"), new EventHandler(miCopy_Click)); miPaste = CreateMenuItem(7, Res.Get("Designer,Menu,Edit,Paste"), new EventHandler(miPaste_Click)); miAddColumnLeft = CreateMenuItem(220, Res.Get("ComponentMenu,TableColumn,InsertToLeft"), new EventHandler(miAddColumnLeft_Click)); miAddColumnRight = CreateMenuItem(221, Res.Get("ComponentMenu,TableColumn,InsertToRight"), new EventHandler(miAddColumnRight_Click)); miAddRowTop = CreateMenuItem(218, Res.Get("ComponentMenu,TableRow,InsertAbove"), new EventHandler(miAddRowTop_Click)); miAddRowBottom = CreateMenuItem(219, Res.Get("ComponentMenu,TableRow,InsertBelow"), new EventHandler(miAddRowBottom_Click)); miInsert = CreateMenuItem(Res.Get("ComponentMenu,TableCell,Insert")); miInsert.DropDownItems.AddRange(new ContextMenuItem[] { miAddColumnLeft, miAddColumnRight, miAddRowTop, miAddRowBottom }); miRemoveRow = CreateMenuItem(Res.Get("ComponentMenu,TableCell,RemoveRow"), new EventHandler(miRemoveRow_Click)); miRemoveColumn = CreateMenuItem(Res.Get("ComponentMenu,TableCell,RemoveColumn"), new EventHandler(miRemoveColumn_Click)); miRemove = CreateMenuItem(51, Res.Get("ComponentMenu,TableCell,Remove"), null); miRemove.DropDownItems.AddRange(new ContextMenuItem[] { miRemoveRow, miRemoveColumn }); miStyle = CreateMenuItem(87, Res.Get("ComponentMenu,TableCell,Styles"), null); miStyle.Visible = table.Report.Styles.Count > 0; miStyle.BeginGroup = true; foreach (Style style in table.Report.Styles) { miStyle.DropDownItems.Add(CreateMenuItem(style.Name, new EventHandler(miStyle_Click))); } // QAT items miCut.QatItem = miCopy.QatItem = miPaste.QatItem = true; bool canJoin = selection.Count > 1; bool canSplit = selection.Count == 1 && topCell != null && (topCell.ColSpan > 1 || topCell.RowSpan > 1); miMergeSplit.Enabled = canJoin || canSplit; miMergeSplit.Checked = canSplit; if (miMergeSplit.Checked) miMergeSplit.Text = Res.Get("ComponentMenu,TableCell,Split"); miPaste.Enabled = table.Clipboard.CanPasteCells; Items.AddRange(new ContextMenuItem[] { miFormat, miMergeSplit, miClear, miInsert, miRemove, miStyle, miCut, miCopy, miPaste }); } } }