diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.cs b/PROMS/Volian.Controls.Library/StepTabRibbon.cs index 00a2630f..859dac63 100644 --- a/PROMS/Volian.Controls.Library/StepTabRibbon.cs +++ b/PROMS/Volian.Controls.Library/StepTabRibbon.cs @@ -125,6 +125,7 @@ namespace Volian.Controls.Library if (_MyEditItem != null) _MyEditItem.Leave += new EventHandler(_MyEditItem_Leave); //_MyStepRTB.Leave += new EventHandler(_MyStepRTB_Leave); _MyStepRTB.LinkChanged += new StepRTBLinkEvent(_MyStepRTB_LinkChanged); + if (MyFlexGrid != null) MyFlexGrid.CopyOptionChanged += new VlnFlexGridEvent(MyFlexGrid_CopyOptionChanged); // Add symbols into the tab ribbon based on format selection. For now, only add symbols once // because all symbols are same!!! If we start defining different symbols in different formats // this will have to change, i.e. remove the second part of 'if' statement. @@ -163,6 +164,36 @@ namespace Volian.Controls.Library _MyEditItem.Leave += new EventHandler(_MyEditItem_Leave); //_MyStepRTB.Leave -= new EventHandler(_MyStepRTB_Leave); _MyStepRTB.LinkChanged -= new StepRTBLinkEvent(_MyStepRTB_LinkChanged); + if (MyFlexGrid != null) MyFlexGrid.CopyOptionChanged -= new VlnFlexGridEvent(MyFlexGrid_CopyOptionChanged); + } + + void MyFlexGrid_CopyOptionChanged(object sender, EventArgs args) + { + btnTblDgnPaste.Enabled = true; + btnCmGridPaste.Enabled = true; + switch (VlnFlexGrid.MyCopyInfo.MyCopyOption) + { + case GridCopyOption.Row: + btnTblDgnPasteRow.Visible = true; + btnCmGridPasteRow.Visible = true; + btnTblDgnPasteColumn.Visible = false; + btnCmGridPasteCol.Visible = false; + break; + case GridCopyOption.Column: + btnTblDgnPasteRow.Visible = false; + btnCmGridPasteRow.Visible = false; + btnTblDgnPasteColumn.Visible = true; + btnCmGridPasteCol.Visible = true; + break; + case GridCopyOption.Selection: + btnTblDgnPasteRow.Visible = false; + btnCmGridPasteRow.Visible = false; + btnTblDgnPasteColumn.Visible = false; + btnCmGridPasteCol.Visible = false; + break; + default: + break; + } } void _MyStepRTB_SelectionChanged(object sender, EventArgs e) @@ -1501,23 +1532,23 @@ namespace Volian.Controls.Library #region Table Grid Copy/Paste private void btnTblDgnCopyRow_Click(object sender, EventArgs e) { - MyFlexGrid.ClipBoardCopyRow(); + MyFlexGrid.CopyRow(); } private void btnTblDgnCopyColumn_Click(object sender, EventArgs e) { - MyFlexGrid.ClipBoardCopyColumn(); + MyFlexGrid.CopyColumn(); } private void btnTblDgnCopySelection_Click(object sender, EventArgs e) { - MyFlexGrid.ClipBoardCopySelection(); + MyFlexGrid.CopyCellSelection(); } private void btnTblDgnPasteRowAbove_Click(object sender, EventArgs e) { // create new rows before current position and copy clipboard data - MyFlexGrid.ClipBoardPasteRows(VlnFlexGrid.enmPastePos.Before); + MyFlexGrid.PasteRows(VlnFlexGrid.enmPastePos.Before); GridItem tmp = MyEditItem as GridItem; if (tmp!=null) tmp.SavePastedCellRoTran(); } @@ -1525,7 +1556,7 @@ namespace Volian.Controls.Library private void btnTblDgnPasteRowBelow_Click(object sender, EventArgs e) { // create new rows after current position and copy clipboard data - MyFlexGrid.ClipBoardPasteRows(VlnFlexGrid.enmPastePos.After); + MyFlexGrid.PasteRows(VlnFlexGrid.enmPastePos.After); GridItem tmp = MyEditItem as GridItem; if (tmp != null) tmp.SavePastedCellRoTran(); } @@ -1533,35 +1564,35 @@ namespace Volian.Controls.Library private void btnTblDgnPasteReplaceRow_Click(object sender, EventArgs e) { // replace rows with current clipboard data starting as current row - MyFlexGrid.ClipBoardPasteRows(VlnFlexGrid.enmPastePos.Replace); + MyFlexGrid.PasteRows(VlnFlexGrid.enmPastePos.Replace); GridItem tmp = MyEditItem as GridItem; if (tmp != null) tmp.SavePastedCellRoTran(); } private void btnTblDgnPasteColumnLeft_Click(object sender, EventArgs e) { - MyFlexGrid.ClipBoardPasteColumns(VlnFlexGrid.enmPastePos.Before); + MyFlexGrid.PasteColumns(VlnFlexGrid.enmPastePos.Before); GridItem tmp = MyEditItem as GridItem; if (tmp != null) tmp.SavePastedCellRoTran(); } private void btnTblDgnPasteColumnRight_Click(object sender, EventArgs e) { - MyFlexGrid.ClipBoardPasteColumns(VlnFlexGrid.enmPastePos.After); + MyFlexGrid.PasteColumns(VlnFlexGrid.enmPastePos.After); GridItem tmp = MyEditItem as GridItem; if (tmp != null) tmp.SavePastedCellRoTran(); } private void btnTblDgnPasteColumnReplace_Click(object sender, EventArgs e) { - MyFlexGrid.ClipBoardPasteColumns(VlnFlexGrid.enmPastePos.Replace); + MyFlexGrid.PasteColumns(VlnFlexGrid.enmPastePos.Replace); GridItem tmp = MyEditItem as GridItem; if (tmp != null) tmp.SavePastedCellRoTran(); } private void btnTblDgnPasteIntoSelection_Click(object sender, EventArgs e) { - MyFlexGrid.ClipBoardPasteIntoSelection(); + MyFlexGrid.PasteCopiedCells(); GridItem tmp = MyEditItem as GridItem; if (tmp != null) tmp.SavePastedCellRoTran(); } @@ -1641,20 +1672,6 @@ namespace Volian.Controls.Library MyFlexGrid.RTFTextAlignment(MyFlexGrid.Selection, HorizontalAlignment.Right); } - //private void btnTblDgnAlignLeft_Click(object sender, EventArgs e) - //{ - // MyFlexGrid.RTFTextAlignment(MyFlexGrid.Selection, HorizontalAlignment.Left); - //} - - //private void btnTblDgnAlignCentered_Click(object sender, EventArgs e) - //{ - // MyFlexGrid.RTFTextAlignment(MyFlexGrid.Selection, HorizontalAlignment.Center); - //} - - //private void btnTblDgnAlignRight_Click(object sender, EventArgs e) - //{ - // MyFlexGrid.RTFTextAlignment(MyFlexGrid.Selection, HorizontalAlignment.Right); - //} #endregion #region Table Grid Merge/Split private void btnTblDgnSplitCells_ToRows_Click(object sender, EventArgs e) @@ -1703,7 +1720,8 @@ namespace Volian.Controls.Library btnTblDgnInsertColumn.Enabled = enable; btnTblDgnInsertRow.Enabled = enable; btnTblDgnMergeCells.Enabled = enable; - btnTblDgnPaste.Enabled = enable; + btnCmGridPaste.Enabled = + btnTblDgnPaste.Enabled = ((VlnFlexGrid.MyCopyInfo.MyCopiedFlexGrid != null) && enable); btnTblDgnSplitCells.Enabled = enable; } public void SetRibbonForGrid() diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.designer.cs b/PROMS/Volian.Controls.Library/StepTabRibbon.designer.cs index 0367117f..57788a34 100644 Binary files a/PROMS/Volian.Controls.Library/StepTabRibbon.designer.cs and b/PROMS/Volian.Controls.Library/StepTabRibbon.designer.cs differ diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.resx b/PROMS/Volian.Controls.Library/StepTabRibbon.resx index 1c4c4c33..7cbbb8e7 100644 --- a/PROMS/Volian.Controls.Library/StepTabRibbon.resx +++ b/PROMS/Volian.Controls.Library/StepTabRibbon.resx @@ -257,198 +257,6 @@ When selected, the entire table will turn gray. You can then click and drag the 7SkYuUaR2F9nvuNLhOn8IQTPmwBcw++QnlMEPmPes+8AUnfuAtVwoQTBB/mMeSk+dS/CWOtCeJspyJgz s7G5BFeYBI22fvQOesnKavvGdaAuVhaTC8JNmVulzMBmd77nek3M9jtudDieJAF42ooTzA0TQiLiIXP3 NkJmp82emes210oSzPdQDjHTZjf8S/MC/vYCZ//7AfBonUoF0toVAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA - CvsBy58dkAAAArRJREFUOE99kntIU1Ecx6//9Fd/9kd/FSU9rD+0hxIoPcjcyppBRJZIiqlDA7HIFohl - mr0081Gr+aD5mI/Kx3TO1po5zbmcaahIiKBkOvGBqTnndu+3cw45kmYHvpx7Lvf3Oed87s8DAFep7SYT - OJ53kghrZ4Hn4sNEHhwZ1wqsYjJpn0RvZms2aGFFkwUCeFd4gceyQ8C8TYDvySgGT1RMiElwIX2QrVfD - HlSaLlasNvThdXMvytVdKH5jQv/QOAOsFpcZlxGXM4Tw7GlEvVjZSmsZoKzR7Np9xcnjl13AzKKA7sFx - BJy7TgF4rl2Aqt2BB/UORObOQpTUS+PHACVqk4WeoKTuMwqrO5BfZkRWkQGdfROrJzhwQjaMq0V2HIs3 - YE+IAv6xevhF1GcwgLL2k9RJ7m1b4TG3xGPyp4DRKYC6odcrVZtwu+BLuveVHuw8/RJxd6sTvSRyfl9o - hYU7FKbccUSqG7U5eOQoP+JRgR7pz5qR8lTDAH/LHbHa4B3dx+TuPy/XeUkU4LafrbsvSahNm5l3YHpB - wI9ZAcOTAgbHBLb7enL3im7GbgvMBLdJ3FB547E6bpZIe1VjRmGVCUkP65B4rwb/k7s7KKWVAMzcRnGH - 6nJqa/volBMSmRkV+u9432WFttMKIpedwJ1cujvJQW5D8Le0XRc/fPUJll06k9wPv0gNDofeiSL/30Lk - wp3cth4r/TtS1gcRmWOWrIYlhGcMQNmyBFm5nUFO3RqIKX7bBndyWywMUMoAPqGVAYEJRuRpFpFSZUeE - nEdI6giD5JB+WLDx/8jVmRmAtTTrAwI57h3+Dv4xOlbsGZSNowndvooqA6jc1HwtkrMaXXKpnzUACiFC - tniKcqkYmgD6Tq7SwzonkI4ch7FnwiW3yeQG8AfiKqbrvBIt22m90G9+AzC/1ToF8MxHAAAAAElFTkSu - QmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAScQAA - EnEB89x6jgAAAIBJREFUOE/FU9ESgCAIy///aAMU0DDYSxecV6KOObB1squRs3VyNY1Z4OWHATYTFHI1 - gp0RXdm+vlGoLC5zPowCHDeiAGkmhMHnAEFpDwwRjcFKV++/6xyLVgEk2UfhnuVTNsVBa5Njk8xV6c1k - hNwGBmaHAP5n4G8q6gFdoZLjBpE7j5KJdaRlAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAASdAAA - EnQB3mYfeAAAASxJREFUOE9j/P//PwNVAchAamKEYQxAg7HAu0+//m9Z9ur/5XufQVbjhlCH4TUQZtiy - w7//J3ddw28oIQORDZuw8f3/9Ckv/oc33f5///l37C4lZCDImwbhK/9bJ23637Ds/X/X4nP/NYOW/5d3 - n0megbDQciq5+j+1985/abt2ysMQZKhe2qX/Su6T/0tZN5JmYFZh5f+M/Mr/6XkV/1Nyyv4nZZf+T8wo - +R+XXvQ/JqXwf2RS/v/whLz/IXE5/4Nisv8HRGX+943I+O8Tnv7fMzQVmPIgyY9gssGbVJATEc0NzCiA - eDc1t/x/Msi7mSX/4zOK/semFv2PSi74H5ZY9D80Pu9/cCzIu1n//SIh3vUKTfvvGZyCxctUyoJUzceo - kTLqQnLLyMEfKQBWOvF3m6dboAAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAASdAAA - EnQB3mYfeAAAASlJREFUOE9j/P//PwNFAGQAJZgizWDXU2L7IDEgq7Dyf0Z+5f/0vIr/KTll/5OyS/8n - ZpT8j0sv+h+TUvg/Min/f3hC3v+QuJz/QTHZ/wOiMv/7RmT89wlP/+8ZmgqMAQohhdqBsZBRAHF+am75 - /2SQ8zNL/sdnFP2PTS36H5Vc8D8sseh/aHze/+BYkPOz/vtFQpzvFZr23zM4BbcHKmc/+B9Rdfi/f9Fu - UFLDCXFKtCx79X/hvu//HVPXk2aAQ9Kq/5ndF/+DDJi5/ct/38Id/81jV/xX9ZiA1SAMF1y7++a/pv+c - /80L7/5vXPrqf0TTjf9GofP/n7v2lDgDQL69cf/tf7OoRf89iw7/1/ab8X//ybs4vYEzDG7cf/NfzrHr - //x1Z/CGAQCjS0wEhVWp7QAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA - CvsBy58dkAAAAM9JREFUOE9j/P//PwNFAGRAeMMjHZ/SU0DmfwZSMVhDSNP9/x75B1AMALoK5DS8GOx6 - EBFYdlnTIXn1f8ekVX5kucA1e8d/i/Dp/439O0j2Bsl+Rnch2ICg+hv/A6qv/HfJ3t5FlhfAhtRdT7eJ - XQD3AqEABMnDAzGk4aGPa9b2/7aJS/3JcoFnwYH/lhEz/hv5tgxQIPpXXfzvW37uv0PKavJd4Fdx7r9j - +qY0WBiQFIggTR5FR2abBU8gzwUehQfBgWgTvTCQrFggVROyegA1/oH1CRXf9wAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA - CvsBy58dkAAAAHxJREFUOE9j/P//PwNFAGRAQfehAiD+D6JBfFIwWDFIc2jLk/+y1lVALsQAFiaW//gw - TB3MgAKQZiAmzwWkOBldLUn+xWYR3AujgUha4kEOTHAgJlYsLwDi/yCa1CiFGfDfs+jof0njTPJSIshm - kGYgJs8FpDobIwwoMQAAEuaJ1nndlB8AAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAASdAAA - EnQB3mYfeAAAADpJREFUOE9j/P//PwNFAGQAJRismZmZ+T86RjaUhYnlPzoGqQe7nhLbR5oBo4GIO7WS - lJCQA3IYpUQA76epNf0QgmEAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA - CvsBy58dkAAAAl5JREFUOE+l019MUlEcB/B67M2HtrZ66aGHarW2/sxy5tJa2J8l2YNzMmuxjNWkEomu - AgJXvECJWCpMjH/ZkrKlzeyvLV5aWPNfw0BrJRVDrEAqWZT32720WtbVHjrbeTj3nu/n3Ps758wHMO+/ - Ggtw9d6H91bZrVpBq1UHQipefqv7WhrXPM5wbbVsq9tOgQnTn1+RtKOJfOl2UOh0W4k/EU7gQjNFT42R - LABETHBaSCTGtKnxgLcn43eEE7A3qD/R43VMgPoBNGrAjl2WGlhq5XBajXk/EU6gpV7JBIxwmdXAuAm2 - egVoBrI3qsH8Esy1RM+cgElTmlrRdpYAHTbBYijHNAOa9VIkgzpoZQcDMwBGVtga1GD7zevO05R0PxM0 - ornuBJKvDWjSipB8o8eZikOYGqtGmXDP8C+AKcwCl0WL2HOSeUnisk0FuYiPbyED7rQdRzyggKe9FB9f - VKHtXAni/kocLdo+NOMLGERTVrQFE8MqTI7KYVbxkQhSiI5qEBuRI+on8MEvRSxAINR3BML8zMd/1eCi - VS9NIUMSRPrFiD5TIT6iwaS/Cu98lQgPyhDuO4bA7QIIdqV7OItorVdcYpG3XhFCvWJEmNB7XwUmnp5C - 8FEJBq7y8OB8Fl24c/19TqDdbUqTHeCRLDLYtQ/9HXza151PD3XsxhN3DrytmdCJM79IinnmWbfRUaNe - qBDtrWKRK8Zt9N3mbNpjy8KNho3ThHDd1x2bV+Jkce7iOc+B8jBvmVJcIBHkZXRuWr0ksWHFIuSkLx0W - 5K5tKS/MXvPPozzbDeV6/h15lKF3GQZi4gAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA - CvsBy58dkAAAAeFJREFUOE+l019IU1EcwPFJz9JbD/Vgj5Kr9CGikDCitIxIqJeiMHQ5kdU2wyXan7mc - FmqQQURQFiG0RmgjGSbZcC6wMZz/bmqaTRcGpijOhNn9dibl3RLiUhc+3N85B7735Z4kQPNfTywg+Rr5 - 04D3DsGuBnrfNhB4U0/P6zo8LjvtDhvuZ9ZVqx//HSA6Ika/4FWl0pCnBIa6G4lG3okNh2oVhuNKwPeq - huW5l2LjvmrlJceUQFfrDb6HH0HktmqW4qNKwNNiY368jpU5+xpma/kbiz5XCXS+sDITLIPpKtUsRUeU - QPtzK5878liaLIepa4qwmL/ErePOynSHlYBbBD66Mgl79jHu3sOoaweBpk0s9uuQJ69C6Mo6l3Q5cQGH - la/dJxlq2sCCX8uMN5XAPQ2hjmzkiQoYu7yOuSA7MRAJ6Bl1bkNq3ogc3MWyL5Xgwy1Eh0tBMgnmBMb8 - g3EB8VvKAwZ5yZ/PRGs67+8mE3qgYUz45ExDlozQfxEGxfuXC2cOJAZW+op/xA6jvXrCbXv58GQrg083 - 01OfhPQ4hSlnJt/aclnoPMG8UHJqf2KgypSDzXSIGnMWt4y7uWnIwF6kpfp8GrZCLdcLtFSe247l7E5K - T6djEtYuU2z4Vz8BC8XpB/oFsiMAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA - CvsBy58dkAAAAdBJREFUOE+lk90rQ2Ecx/mL5MKFG7lSXLiUa3IjKS4okpS4UFJelmnY2GbeLcPYbOZt - mKERQmFnmMyFmdnOtq/ndzizJ1zg1K/O83Q+35fn6aQDSPvXQwJto/dInRbdPRrVftT03aGi6xYl7Tco - bvWhsElAXr2AnBovsquvGcrMZQGNAxiwJ6C0xtFjjqHDJKJtOormsQga9K+o1bygShVCeW8IZd1BZJbt - 8gJygmatH3UDflQq3p2LWnwoaPAi98OVnGkySpyfAvo5FxKJRHLW3RfcemHtUFpHxTiC4ThGTE5k5Zd+ - CgwZnRyw4jrj1rP2A0QY/MzgQDAGrXGdF+ifXMX+iQByXnGdw7Z1CsvmMciZ4BmrG+PmHRiYM8GDkw5e - QGlY5hyXGCxXotgEB4IifIEozm+jUI3ZeIEe7SInYF47SnZ+DsdgmHNCeBQl2HMdgXLEygt0auax7bmE - ZYPFXj2EKTU2gym2esoB1bgNSoMVCt3iV4HUW5i2uKXTfniKsdgi1Kyz5yqC7bMw7EchdA+bfxagzhPU - mcECg+XO7/AL5vdCoMTcNdKGY+dUOm2C5dMm536KzTordEuSM337rQAp/naS/wK9/HX+DMqGb0lL76AI - wx7nAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA - CvsBy58dkAAAAklJREFUOE+lk11I02EUxusuIogugqALIyK6iJpEEIUZIQWSK8kLQ/pAqUApKbEsl4kL - srQwQYeOVmp+VGamlo1lMUVJ+9DmdCbNBVqkzvyiD9vmr51/rP8IoqgXzuXzO88553nnAnP+6wmg8FY7 - wZVf0UbO9WbOFTehy39ISk4difpq4tMriUstJSbZxK4ko1/qbx4AeLzwu/r0FcamZxkam6X/vY9Ol49V - 2zP/DuC2O3AcCMW+X4Ot1a6IyxoHWLnt7J8B0lnEDJmZeXycZ7uX0eLwca3+NSsiggAy86/2A7bt+zQ/ - xLkRtEWHYO7yUnzHxvKtGaoDWVgwIHhmsS2dRXz33itqO7wUVHYQsuWMCpBtBwB9A8McyzIq1d77UZlZ - bEtnEVe1esgraWZpmE4FyKkE4BwcU4TOoXFs/aNsjkrAWPOS8J0HlSqq7aPU6iHXaGHJpnQVIHcOiN+N - TDL44TNPu91UmXuIjE2k7lEnjdZuSRxFD9ycL2xg8YbTKkBCIp2H3VNMTs9gc05gqnvDTYsLg39ebdwR - Sm4/Ie9qvQLRX6lh0fpTKkAS9s3jY3Ryhl7XFGX3nVwu7yHb9IIcUxvJ+ko04TEk6/JJTLukQBauS1MB - Es+R8S8873VT3fT2pzizwErqxXqSMsqJjtcrkMg9RwnXJrAg9KQKkGw7XBNUNHSRZWhBl2chNbvWL7xB - fIqB2MMX0O7VEbbjEKs3Rik1f20QQD6GZFviKQmTkMid5VSybVmYzCy2pbOI5605oTqQD/Wv9R1FPMYf - N743kwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA - CvsBy58dkAAAActJREFUOE+NklkvA1EUx+ubeCJii6WNh0oQsb/ggQSJhK/gU+iLiHhQS6wJotFa0lJb - EWpLGUwbbVFLFbFVqp2Z/s29MhNpZpKe5OR/5845vzPnnEkBoCFmcbj/Dv+M53kNx3EaLhYjt4aWOl1X - YoyGAIibt1hRlM04swFdTSfGLfvdUrykMsC0fq4K6Bu3wrbDSBDDf4gMmFlxqQKGZtdosuSKgKmlQ8QT - EPF4nN7xvIDBaTt6R5ehre4gUXJh+TC54IQgCDi99FL1+ALgxETXhReRaAwnF9eYs+6pAwxGM3y3D2QT - YDzXVFlvgOqBi24IY3Or6oDE6Sb7LLdgsR/SKv7AE1WP/57queeGqsPJUC0sa1SewcS8Awwr9i8OLvTy - BjJAhvUhHIni4NSHu+AnDAMmpGurlAFGccocz8t7IAN8//rBfegLrP8Vx5dB9IwsIre0WRnQP2GTk0n1 - 70gMT6/fuAq8weUOYfvkjq4xq1ilBfJSMrL3j/APHp/DFLB/9gC784YCMorqlL9AAuweubG0cYxR0yaG - Z9fRP2mjiZKnFVaqA8hfVlDRjvzyNuSVtyKnpIl6lr4Bmfp6sXotUrOLlQHJ7j0x7hcSwu53ww+AbQAA - AABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAASdAAA - EnQB3mYfeAAAAHlJREFUOE/llI0KwCAIhB2+/zO7GQhmLQ2OYCyQ/uzjrqRLRAjaFIgMKKy5Rar7CJCZ - yYU8Yw2/NhtbXuwpJleBei7mtvkbcEelMQagQaoqZ7Y7y8N9JHe5tBwtVlSeA3qr/vVWKstlk9Vfup8m - uHorPdofPwf0f3gD43NpwwQa5WcAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA - CvsBy58dkAAAAf1JREFUOE9j/P//PwNFAGQAJRiu2ansDqdr9V1F1/ZXWc69b2utp3/dYj7r10WzqV/3 - mXS+7zaueJplmH/DSivurBiyhWADfGofcLk2PC+ya3+7yTvpwkW/8ANrfMIP53tFHk13iT492aLwzknN - nk/PFauf3VEOPlapZrWHB2YI2ACXqrv2ti2vHwUF7LsdE7rFH5uXzLMuT1RNvX5F2mnfPS3z5ZEoBtg0 - vdhpmn//u5/zug584aGacmGbjNvezzrmC9eiGGBa/XS5bszVb86Wq7PxGaCcfn69nNfur4aW85egGGBR - fMtfw+/MDTXDbZfxGaBUcvWNisPG11Y2c2JQDDCLu6ys6n7igLz1ga/q9ls8sBmim302Ubn8yh8T60XX - rKwXaKIYAOJo+h2xEI+49Fra4+AubAbo5F+6rBay77O17QI3jGiECcgmX5ktmXD2qYbdZntkRUaZp5w0 - iy990Pbdth7dcHA0ivd//qiWfM5ZJeSgqrTLzvdalis3Iis0yDl9RCf79Hd9/23Gmp7rk+R8Vv9E8YJ4 - /fP34tmXv8harn+iYzbvjYH1vHuoBpx6oRe+97O2y+r36k5Lf6o6zf+GYoB80JETisarb+uaz/+kaT3n - h4bTwr/IBhgmHfht7L3hh5H3ih86rove6zjMe4gRiORmKIpyIshSAKemayZYZb7LAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAASdAAA - EnQB3mYfeAAAAKBJREFUOE9j/P//PwNFAGQAJRisGQ+wxyaHbCEhA+pJNUAfqGE/FMcjsWFiYBqnC7gC - F/oDMT+SrSAvYGB8BuwHGnAfZBDUEFAAYWAMA4AaQBr/o2GQF9BtB7uOEheAY4WSMMDvAqDh6LFAXBgg - hTrIBpi/5aFskKEoAF9CAmkCJR4QBhkEokGBSbQB6GpBhiCnC7A8qUkZ5Cr8LqAkNwIABOc40fsHWwUA - AAAASUVORK5CYII= @@ -764,6 +572,198 @@ When selected, the entire table will turn gray. You can then click and drag the crkcMpkMUqkUuOMgzKM+JUCSJFQqFZTLZZRKJdjZCAqFAlYOoljaf8Pi7isYNgTG/QyP71oJ6B9h0De8 AOuQHdbBefQOzFFd0lUQBCSTSSQSCfA8T6MA6H1pM1uPVJlhX+DYeVKkLcD05gM+f9Lg/De0ozryDvQM bBv3dNPmMT+dVyv0LRj9LEbPOwb8Af/j3yagcYeqAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA + CvsBy58dkAAAArRJREFUOE99kntIU1Ecx6//9Fd/9kd/FSU9rD+0hxIoPcjcyppBRJZIiqlDA7HIFohl + mr0081Gr+aD5mI/Kx3TO1po5zbmcaahIiKBkOvGBqTnndu+3cw45kmYHvpx7Lvf3Oed87s8DAFep7SYT + OJ53kghrZ4Hn4sNEHhwZ1wqsYjJpn0RvZms2aGFFkwUCeFd4gceyQ8C8TYDvySgGT1RMiElwIX2QrVfD + HlSaLlasNvThdXMvytVdKH5jQv/QOAOsFpcZlxGXM4Tw7GlEvVjZSmsZoKzR7Np9xcnjl13AzKKA7sFx + BJy7TgF4rl2Aqt2BB/UORObOQpTUS+PHACVqk4WeoKTuMwqrO5BfZkRWkQGdfROrJzhwQjaMq0V2HIs3 + YE+IAv6xevhF1GcwgLL2k9RJ7m1b4TG3xGPyp4DRKYC6odcrVZtwu+BLuveVHuw8/RJxd6sTvSRyfl9o + hYU7FKbccUSqG7U5eOQoP+JRgR7pz5qR8lTDAH/LHbHa4B3dx+TuPy/XeUkU4LafrbsvSahNm5l3YHpB + wI9ZAcOTAgbHBLb7enL3im7GbgvMBLdJ3FB547E6bpZIe1VjRmGVCUkP65B4rwb/k7s7KKWVAMzcRnGH + 6nJqa/volBMSmRkV+u9432WFttMKIpedwJ1cujvJQW5D8Le0XRc/fPUJll06k9wPv0gNDofeiSL/30Lk + wp3cth4r/TtS1gcRmWOWrIYlhGcMQNmyBFm5nUFO3RqIKX7bBndyWywMUMoAPqGVAYEJRuRpFpFSZUeE + nEdI6giD5JB+WLDx/8jVmRmAtTTrAwI57h3+Dv4xOlbsGZSNowndvooqA6jc1HwtkrMaXXKpnzUACiFC + tniKcqkYmgD6Tq7SwzonkI4ch7FnwiW3yeQG8AfiKqbrvBIt22m90G9+AzC/1ToF8MxHAAAAAElFTkSu + QmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAScQAA + EnEB89x6jgAAAIBJREFUOE/FU9ESgCAIy///aAMU0DDYSxecV6KOObB1squRs3VyNY1Z4OWHATYTFHI1 + gp0RXdm+vlGoLC5zPowCHDeiAGkmhMHnAEFpDwwRjcFKV++/6xyLVgEk2UfhnuVTNsVBa5Njk8xV6c1k + hNwGBmaHAP5n4G8q6gFdoZLjBpE7j5KJdaRlAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAASdAAA + EnQB3mYfeAAAASxJREFUOE9j/P//PwNVAchAamKEYQxAg7HAu0+//m9Z9ur/5XufQVbjhlCH4TUQZtiy + w7//J3ddw28oIQORDZuw8f3/9Ckv/oc33f5///l37C4lZCDImwbhK/9bJ23637Ds/X/X4nP/NYOW/5d3 + n0megbDQciq5+j+1985/abt2ysMQZKhe2qX/Su6T/0tZN5JmYFZh5f+M/Mr/6XkV/1Nyyv4nZZf+T8wo + +R+XXvQ/JqXwf2RS/v/whLz/IXE5/4Nisv8HRGX+943I+O8Tnv7fMzQVmPIgyY9gssGbVJATEc0NzCiA + eDc1t/x/Msi7mSX/4zOK/semFv2PSi74H5ZY9D80Pu9/cCzIu1n//SIh3vUKTfvvGZyCxctUyoJUzceo + kTLqQnLLyMEfKQBWOvF3m6dboAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAASdAAA + EnQB3mYfeAAAASlJREFUOE9j/P//PwNFAGQAJZgizWDXU2L7IDEgq7Dyf0Z+5f/0vIr/KTll/5OyS/8n + ZpT8j0sv+h+TUvg/Min/f3hC3v+QuJz/QTHZ/wOiMv/7RmT89wlP/+8ZmgqMAQohhdqBsZBRAHF+am75 + /2SQ8zNL/sdnFP2PTS36H5Vc8D8sseh/aHze/+BYkPOz/vtFQpzvFZr23zM4BbcHKmc/+B9Rdfi/f9Fu + UFLDCXFKtCx79X/hvu//HVPXk2aAQ9Kq/5ndF/+DDJi5/ct/38Id/81jV/xX9ZiA1SAMF1y7++a/pv+c + /80L7/5vXPrqf0TTjf9GofP/n7v2lDgDQL69cf/tf7OoRf89iw7/1/ab8X//ybs4vYEzDG7cf/NfzrHr + //x1Z/CGAQCjS0wEhVWp7QAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA + CvsBy58dkAAAAM9JREFUOE9j/P//PwNFAGRAeMMjHZ/SU0DmfwZSMVhDSNP9/x75B1AMALoK5DS8GOx6 + EBFYdlnTIXn1f8ekVX5kucA1e8d/i/Dp/439O0j2Bsl+Rnch2ICg+hv/A6qv/HfJ3t5FlhfAhtRdT7eJ + XQD3AqEABMnDAzGk4aGPa9b2/7aJS/3JcoFnwYH/lhEz/hv5tgxQIPpXXfzvW37uv0PKavJd4Fdx7r9j + +qY0WBiQFIggTR5FR2abBU8gzwUehQfBgWgTvTCQrFggVROyegA1/oH1CRXf9wAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA + CvsBy58dkAAAAHxJREFUOE9j/P//PwNFAGRAQfehAiD+D6JBfFIwWDFIc2jLk/+y1lVALsQAFiaW//gw + TB3MgAKQZiAmzwWkOBldLUn+xWYR3AujgUha4kEOTHAgJlYsLwDi/yCa1CiFGfDfs+jof0njTPJSIshm + kGYgJs8FpDobIwwoMQAAEuaJ1nndlB8AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAASdAAA + EnQB3mYfeAAAADpJREFUOE9j/P//PwNFAGQAJRismZmZ+T86RjaUhYnlPzoGqQe7nhLbR5oBo4GIO7WS + lJCQA3IYpUQA76epNf0QgmEAAAAASUVORK5CYII= + + + + + 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 + wx7nAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA + CvsBy58dkAAAAklJREFUOE+lk11I02EUxusuIogugqALIyK6iJpEEIUZIQWSK8kLQ/pAqUApKbEsl4kL + srQwQYeOVmp+VGamlo1lMUVJ+9DmdCbNBVqkzvyiD9vmr51/rP8IoqgXzuXzO88553nnAnP+6wmg8FY7 + wZVf0UbO9WbOFTehy39ISk4difpq4tMriUstJSbZxK4ko1/qbx4AeLzwu/r0FcamZxkam6X/vY9Ol49V + 2zP/DuC2O3AcCMW+X4Ot1a6IyxoHWLnt7J8B0lnEDJmZeXycZ7uX0eLwca3+NSsiggAy86/2A7bt+zQ/ + xLkRtEWHYO7yUnzHxvKtGaoDWVgwIHhmsS2dRXz33itqO7wUVHYQsuWMCpBtBwB9A8McyzIq1d77UZlZ + bEtnEVe1esgraWZpmE4FyKkE4BwcU4TOoXFs/aNsjkrAWPOS8J0HlSqq7aPU6iHXaGHJpnQVIHcOiN+N + TDL44TNPu91UmXuIjE2k7lEnjdZuSRxFD9ycL2xg8YbTKkBCIp2H3VNMTs9gc05gqnvDTYsLg39ebdwR + Sm4/Ie9qvQLRX6lh0fpTKkAS9s3jY3Ryhl7XFGX3nVwu7yHb9IIcUxvJ+ko04TEk6/JJTLukQBauS1MB + Es+R8S8873VT3fT2pzizwErqxXqSMsqJjtcrkMg9RwnXJrAg9KQKkGw7XBNUNHSRZWhBl2chNbvWL7xB + fIqB2MMX0O7VEbbjEKs3Rik1f20QQD6GZFviKQmTkMid5VSybVmYzCy2pbOI5605oTqQD/Wv9R1FPMYf + N743kwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA + CvsBy58dkAAAActJREFUOE+NklkvA1EUx+ubeCJii6WNh0oQsb/ggQSJhK/gU+iLiHhQS6wJotFa0lJb + EWpLGUwbbVFLFbFVqp2Z/s29MhNpZpKe5OR/5845vzPnnEkBoCFmcbj/Dv+M53kNx3EaLhYjt4aWOl1X + YoyGAIibt1hRlM04swFdTSfGLfvdUrykMsC0fq4K6Bu3wrbDSBDDf4gMmFlxqQKGZtdosuSKgKmlQ8QT + EPF4nN7xvIDBaTt6R5ehre4gUXJh+TC54IQgCDi99FL1+ALgxETXhReRaAwnF9eYs+6pAwxGM3y3D2QT + YDzXVFlvgOqBi24IY3Or6oDE6Sb7LLdgsR/SKv7AE1WP/57queeGqsPJUC0sa1SewcS8Awwr9i8OLvTy + BjJAhvUhHIni4NSHu+AnDAMmpGurlAFGccocz8t7IAN8//rBfegLrP8Vx5dB9IwsIre0WRnQP2GTk0n1 + 70gMT6/fuAq8weUOYfvkjq4xq1ilBfJSMrL3j/APHp/DFLB/9gC784YCMorqlL9AAuweubG0cYxR0yaG + Z9fRP2mjiZKnFVaqA8hfVlDRjvzyNuSVtyKnpIl6lr4Bmfp6sXotUrOLlQHJ7j0x7hcSwu53ww+AbQAA + AABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAASdAAA + EnQB3mYfeAAAAHlJREFUOE/llI0KwCAIhB2+/zO7GQhmLQ2OYCyQ/uzjrqRLRAjaFIgMKKy5Rar7CJCZ + yYU8Yw2/NhtbXuwpJleBei7mtvkbcEelMQagQaoqZ7Y7y8N9JHe5tBwtVlSeA3qr/vVWKstlk9Vfup8m + uHorPdofPwf0f3gD43NpwwQa5WcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK+wAA + CvsBy58dkAAAAf1JREFUOE9j/P//PwNFAGQAJRiu2ansDqdr9V1F1/ZXWc69b2utp3/dYj7r10WzqV/3 + mXS+7zaueJplmH/DSivurBiyhWADfGofcLk2PC+ya3+7yTvpwkW/8ANrfMIP53tFHk13iT492aLwzknN + nk/PFauf3VEOPlapZrWHB2YI2ACXqrv2ti2vHwUF7LsdE7rFH5uXzLMuT1RNvX5F2mnfPS3z5ZEoBtg0 + vdhpmn//u5/zug584aGacmGbjNvezzrmC9eiGGBa/XS5bszVb86Wq7PxGaCcfn69nNfur4aW85egGGBR + fMtfw+/MDTXDbZfxGaBUcvWNisPG11Y2c2JQDDCLu6ys6n7igLz1ga/q9ls8sBmim302Ubn8yh8T60XX + rKwXaKIYAOJo+h2xEI+49Fra4+AubAbo5F+6rBay77O17QI3jGiECcgmX5ktmXD2qYbdZntkRUaZp5w0 + iy990Pbdth7dcHA0ivd//qiWfM5ZJeSgqrTLzvdalis3Iis0yDl9RCf79Hd9/23Gmp7rk+R8Vv9E8YJ4 + /fP34tmXv8harn+iYzbvjYH1vHuoBpx6oRe+97O2y+r36k5Lf6o6zf+GYoB80JETisarb+uaz/+kaT3n + h4bTwr/IBhgmHfht7L3hh5H3ih86rove6zjMe4gRiORmKIpyIshSAKemayZYZb7LAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAASdAAA + EnQB3mYfeAAAAKBJREFUOE9j/P//PwNFAGQAJRisGQ+wxyaHbCEhA+pJNUAfqGE/FMcjsWFiYBqnC7gC + F/oDMT+SrSAvYGB8BuwHGnAfZBDUEFAAYWAMA4AaQBr/o2GQF9BtB7uOEheAY4WSMMDvAqDh6LFAXBgg + hTrIBpi/5aFskKEoAF9CAmkCJR4QBhkEokGBSbQB6GpBhiCnC7A8qUkZ5Cr8LqAkNwIABOc40fsHWwUA + AAAASUVORK5CYII= diff --git a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs index 7b6fabea..ac8f6889 100644 --- a/PROMS/Volian.Controls.Library/VlnFlexGrid.cs +++ b/PROMS/Volian.Controls.Library/VlnFlexGrid.cs @@ -22,6 +22,39 @@ namespace Volian.Controls.Library public delegate string VlnFlexGridPasteEvent(object sender, VlnFlexGridPasteEventArgs args); public partial class VlnFlexGrid : C1.Win.C1FlexGrid.C1FlexGrid { + public static GridCopyInfo MyCopyInfo = new GridCopyInfo(); + + public void CopyToCopiedFlexGrid(GridCopyOption myCopyOption) + { + MyCopyInfo.MyCopiedFlexGrid = new VlnFlexGrid(); //make a copy of the grid being copied + using (StringReader sr = new StringReader(this.GetXMLData())) + { + MyCopyInfo.MyCopiedFlexGrid.ReadXml(sr); + sr.Close(); + } + //FlipCopied(); // create a flipped version of the grid + MyCopyInfo.MyCopyOption = myCopyOption; + OnCopyOptionChanged(this, new EventArgs()); + switch (MyCopyInfo.MyCopyOption) + { + case GridCopyOption.Row: + MyCopyInfo.MyCopiedCellRange = MyCopyInfo.MyCopiedFlexGrid.GetCellRange(Selection.r1, 0, Selection.r2, Cols.Count - 1); + break; + case GridCopyOption.Column: + MyCopyInfo.MyCopiedCellRange = MyCopyInfo.MyCopiedFlexGrid.GetCellRange(0, Selection.c1, Rows.Count - 1, Selection.c2); + break; + case GridCopyOption.Selection: + MyCopyInfo.MyCopiedCellRange = MyCopyInfo.MyCopiedFlexGrid.GetCellRange(Selection.r1, Selection.c1, Selection.r2, Selection.c2); + break; + default: + break; + } + } + public event VlnFlexGridEvent CopyOptionChanged; + public void OnCopyOptionChanged(object sender, EventArgs args) + { + if (CopyOptionChanged != null) CopyOptionChanged(sender, args); + } //[XmlElement("MyBorders")] //[Browsable(false)] //[EditorBrowsable(EditorBrowsableState.Never)] @@ -627,7 +660,7 @@ namespace Volian.Controls.Library // draw the RTF text if (e.Bounds.Width > 0 && e.Bounds.Height > 0) { - _rtf.Width = e.Bounds.Width - 3; + _rtf.Width = e.Bounds.Width - 1; _rtf.Rtf = rtfText; CellRange cr = GetMergedRange(e.Row, e.Col); cr.UserData = _rtf.Height; @@ -635,6 +668,7 @@ namespace Volian.Controls.Library int hDiff = e.Bounds.Height - _rtf.Height; if (hDiff < 0) { + Console.WriteLine("{0}, {1}, {2}, {3}, {4}", hDiff, e.Bounds.Height, _rtf.Height, e.Row, e.Col); Rows[e.Row].Height = _rtf.Height + 4; AdjustGridControlSize(); hDiff = 0; @@ -896,6 +930,8 @@ namespace Volian.Controls.Library /// public void AdjustGridControlSize() { + //Console.WriteLine("AdjustGridControlSize"); + //Volian.Base.Library.vlnStackTrace.ShowStackLocal("AdjustGridControlSize", 3); if (Parent is GridItem ? (Parent as GridItem).Initializing : false ) return; int difW = this.Width - this.ClientSize.Width; int difH = this.Height - this.ClientSize.Height; @@ -1041,6 +1077,7 @@ namespace Volian.Controls.Library } private void AdjustCellHeightWidth(int r, int c) { + Console.WriteLine("AdjustCellHeightWidth"); StepRTB trtb = new StepRTB(); string tstr = null; bool dummyCharWidth = false; @@ -2167,144 +2204,266 @@ namespace Volian.Controls.Library #endregion //Grid Add and Remove Row / Column - #region Clipboard + #region Copy/Paste - public void ClipBoardCopyRow() + public void CopyRow() { - this.SelectionMode = SelectionModeEnum.Row; - this.Select(this.Selection.r1, 0, this.Selection.r2, this.Cols.Count - 1, true); - DialogResult dr = MessageBox.Show("Copy these Rows?", "Copy Rows", MessageBoxButtons.YesNo); - if (dr == DialogResult.Yes) - _clpbrdCpyPste.Put(this.Selection); - this.SelectionMode = SelectionModeEnum.Default; - } - - public void ClipBoardCopyColumn() - { - this.SelectionMode = SelectionModeEnum.Column; - this.Select(0, this.Selection.c1, this.Rows.Count - 1, this.Selection.c2, true); - DialogResult dr = MessageBox.Show("Copy these columns?", "Copy Columns", MessageBoxButtons.YesNo); - if (dr == DialogResult.Yes) - _clpbrdCpyPste.Put(this.Selection); - this.SelectionMode = SelectionModeEnum.Default; - } - - public void ClipBoardCopySelection() - { - this.Select(this.Selection.r1, this.Selection.c1, this.Selection.r2, this.Selection.c2); - DialogResult dr = MessageBox.Show("Copy Selected Cells?", "Copy Selection", MessageBoxButtons.YesNo); - if (dr == DialogResult.Yes) - _clpbrdCpyPste.Put(this.Selection); - } - - - private void CopyTextFromCellRange(ArrayList arylst, int srow, int scol, int erow, int ecol) - { - StepRTB trtb = new StepRTB(); - int aryidx = 0; - for (int r = srow; r <= erow; r++) + DialogResult dr = DialogResult.Yes; + SelectRow(); + if (Selection.r1 != Selection.r2) { - for (int c = scol; c <= ecol; c++) - { - if (aryidx >= arylst.Count) - trtb.Text = ""; - else - { - trtb.Rtf = OnAdjustPastedText(this, new VlnFlexGridPasteEventArgs((string)(arylst[aryidx++]))); - trtb.AdjustWidthForContent(); - } - this[r, c] = trtb.Rtf; - //this.ConvertTextCellToRTF(r, c); - this.AdjustCellHeightWidth(r, c); - } + //dr = MessageBox.Show("You selected a row that includes merged cells.\n\nThese additional rows must be included.\n\nCopy these rows?", "Copy Rows", MessageBoxButtons.YesNo); + dr = MessageBox.Show("Your selection was expanded due to merged cell regions.\n\nContinue with the copy?", "Copy Rows", MessageBoxButtons.YesNo); } - FixTableCellsHeightWidth(); + if (dr == DialogResult.Yes) + CopyToCopiedFlexGrid(GridCopyOption.Row); } + public void CopyColumn() + { + SelectCol(); + DialogResult dr = DialogResult.Yes; + if (Selection.c1 != Selection.c2) + { + //dr = MessageBox.Show("You selected a column that includes merged cells.\n\nThese additional columns must be included.\n\nCopy these columns?", "Copy Columns", MessageBoxButtons.YesNo); + dr = MessageBox.Show("Your selection was expanded due to merged cell regions.\n\nContinue with the copy?", "Copy Columns", MessageBoxButtons.YesNo); + } + if (dr == DialogResult.Yes) + CopyToCopiedFlexGrid(GridCopyOption.Column); + } + + public void CopyCellSelection() + { + DialogResult dr = DialogResult.Yes; + CellRange cr = Selection; + MakeSelectionEven(); + if (!cr.Equals(Selection)) + { + dr = MessageBox.Show("Your selection was expanded due to merged cell regions.\n\nContinue with the copy?", "Copy Selection", MessageBoxButtons.YesNo); + } + if (dr == DialogResult.Yes) + CopyToCopiedFlexGrid(GridCopyOption.Selection); + } public enum enmPastePos : int { Before = 1, Replace = 0, After = -1 } - public void ClipBoardPasteRows(enmPastePos pp) + public void PasteRows(enmPastePos pp) { - // Get a list of strings representing the text (rtf text) in each cell - // that was saved to the clipboard (row/column order) - ArrayList aryCellList = _clpbrdCpyPste.Get(); + if (MyCopyInfo.MyCopiedFlexGrid == null || MyCopyInfo.MyCopyOption != GridCopyOption.Row) return; + int rowsToAdd = MyCopyInfo.MyCopiedCellRange.r2 - MyCopyInfo.MyCopiedCellRange.r1 + 1; + int colsToAdd = Math.Max((MyCopyInfo.MyCopiedCellRange.c2 - MyCopyInfo.MyCopiedCellRange.c1 + 1) - Cols.Count, 0); + int rowOffset = Selection.r1 + (pp == enmPastePos.After ? 1 : 0) - MyCopyInfo.MyCopiedCellRange.r1; + int selR1 = Selection.r1; - if (aryCellList != null && aryCellList.Count > 0) + // If the rows we are copying has more columns than the current table, then append then needed columns to the grid + if (colsToAdd > 0) { - // Since we're pasting an entire row, make sure the current selection includes - // all the columns to ensure proper logic path when inserting a new (empty) row - this.SelectionMode = SelectionModeEnum.Row; - this.Select(this.Selection.r1, 0, this.Selection.r2, this.Cols.Count - 1, true); - this.SelectionMode = SelectionModeEnum.Default; - // get row/column starting position in which new rows will be added - int startrow = this.Selection.r1 + ((pp == enmPastePos.After) ? 1 : 0); - int startcol = this.Selection.c1; - // get the number of rows needed based on what was save to the clipboard - int numrows = Math.Max(1, (aryCellList.Count / this.Cols.Count)); - // insert that number of new rows. - if (pp != enmPastePos.Replace) // insert new rows before or after - for (int r = 0; r < numrows; r++) - if (pp == enmPastePos.After) // create new rows after - this.InsertRowAfter(); - else - this.InsertRowBefore(); - // copy each grid cell text (aryCellList) into the newly inserted rows - CopyTextFromCellRange(aryCellList, startrow, startcol, startrow + numrows - 1, startcol + this.Cols.Count - 1); - this.AdjustGridControlSize(); + Cols.Add(colsToAdd); + AdjustMergedColumns(Cols.Count - 1, false, false); } + + switch (pp) + { + case enmPastePos.Before: + //this.Rows.InsertRange(Selection.r1,rowsToAdd); + this.Rows.InsertRange(selR1, rowsToAdd); + AdjustMergedRows(selR1, true, false); + break; + case enmPastePos.After: + if (selR1 < Rows.Count - 1) + { + //this.Rows.InsertRange(Selection.r1 + 1, rowsToAdd); + this.Rows.InsertRange(selR1 + 1, rowsToAdd); + } + else + this.Rows.Add(rowsToAdd); + AdjustMergedRows(selR1 + 1, false, false); + break; + case enmPastePos.Replace: + if (rowsToAdd > Rows.Count - Selection.r1) + { + this.Rows.Add(rowsToAdd - (Rows.Count - Selection.r1)); + AdjustMergedRows(selR1, false, false); + } + break; + } + + RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1 + rowOffset, MyCopyInfo.MyCopiedCellRange.c1, MyCopyInfo.MyCopiedCellRange.r2 + rowOffset, MyCopyInfo.MyCopiedCellRange.c2); + + for (int r = MyCopyInfo.MyCopiedCellRange.r1; r <= MyCopyInfo.MyCopiedCellRange.r2; r++) + { + Rows[r + rowOffset].Height = MyCopyInfo.MyCopiedFlexGrid.Rows[r].Height; + for (int c = MyCopyInfo.MyCopiedCellRange.c1; c <= Math.Min(MyCopyInfo.MyCopiedCellRange.c2 + colsToAdd, Cols.Count - 1); c++) + { + CellRange crm = MyCopyInfo.MyCopiedFlexGrid.GetMergedRange(r, c); + if (r == crm.r1 && c == crm.c1) + { + Cols[c].Width = Math.Max(Cols[c].Width, MyCopyInfo.MyCopiedFlexGrid.Cols[c].Width); + CellRange cr = GetCellRange(crm.r1 + rowOffset, crm.c1, crm.r2 + rowOffset, crm.c2); + if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1)) + MergedRanges.Add(cr); + this[r + rowOffset, c] = MyCopyInfo.MyCopiedFlexGrid[r, c]; + MatchStyle(crm, cr); + } + } + } + this.AdjustGridControlSize(); } - public void ClipBoardPasteColumns(enmPastePos pp) - { - // Get a list of strings representing the text (rtf text) in each cell - // that was saved to the clipboard (row/column order) - ArrayList aryCellList = _clpbrdCpyPste.Get(); + private void MatchStyle(CellRange crm, CellRange cr) + { + if (crm.Style != null) + { + ChangeCellAlign(cr, crm.Style.TextAlign); + ChangeCellBorder(cr, crm.Style.Border.Style); + } + //else + //{ + // cr.Style = null; // - didn't like the null + //} + } - if (aryCellList != null && aryCellList.Count > 0) + private void RemoveMergedRanges(int r1, int c1, int r2, int c2) + { + for (int r = r1; r <= r2; r++) + for (int c = c1; c <= c2; c++) + { + CellRange cr = GetMergedRange(r, c); + if (cr.r1 < cr.r2 || cr.c1 < cr.c2) + MergedRanges.Remove(cr); + } + } + + public void PasteColumns(enmPastePos pp) + { + if (MyCopyInfo.MyCopiedFlexGrid == null || MyCopyInfo.MyCopyOption != GridCopyOption.Column) return; + + int colsToAdd = MyCopyInfo.MyCopiedCellRange.c2 - MyCopyInfo.MyCopiedCellRange.c1 + 1; + int rowsToAdd = Math.Max((MyCopyInfo.MyCopiedCellRange.r2 - MyCopyInfo.MyCopiedCellRange.r1 + 1) - Rows.Count, 0); + int colOffset = Selection.c1 + (pp == enmPastePos.After ? 1 : 0) - MyCopyInfo.MyCopiedCellRange.c1; + int selC1 = Selection.c1; + + // If the columns we are copying has more rows than the current table, then append the needed rows to the grid + if (rowsToAdd > 0) { - // Since we're pasting an entire column, make sure the current selection includes - // all the rows to ensure proper logic path when inserting a new (empty) column - this.SelectionMode = SelectionModeEnum.Column; - this.Select(0, this.Selection.c1, this.Rows.Count - 1, this.Selection.c2, true); - this.SelectionMode = SelectionModeEnum.Default; - // get row/column starting position in which new rows will be added - int startrow = 0;//grd.Selection.r1+((pp == enmPastePos.After) ? 1 : 0); - int startcol = this.Selection.c1 + ((pp == enmPastePos.After) ? 1 : 0); - // get the number of columns needed based on what was save to the clipboard - int numcols = Math.Max(1, (aryCellList.Count / this.Rows.Count)); - // insert that number of new columns. - if (pp != enmPastePos.Replace) // insert new columns before or after - for (int c = 0; c < numcols; c++) - if (pp == enmPastePos.After) // create new columns after - this.InsertColumnAfter(); - else - this.InsertColumnBefore(); - // copy each grid cell text (aryCellList) into the newly inserted colmns - this.CopyTextFromCellRange(aryCellList, startrow, startcol, startrow + this.Rows.Count - 1, startcol + numcols - 1); - this.AdjustGridControlSize(); + Rows.Add(rowsToAdd); + AdjustMergedRows(Rows.Count, false, false); } + + switch (pp) + { + case enmPastePos.Before: + //this.Cols.InsertRange(Selection.c1, colsToAdd); + this.Cols.InsertRange(selC1, colsToAdd); + AdjustMergedColumns(selC1, true, false); + break; + case enmPastePos.After: + //if (Selection.c1 < Cols.Count - 1) + // this.Cols.InsertRange(Selection.c1 + 1, colsToAdd); + if (selC1 < Cols.Count - 1) + this.Cols.InsertRange(selC1 + 1, colsToAdd); + else + this.Cols.Add(colsToAdd); + AdjustMergedColumns(selC1 + 1, false, false); + break; + case enmPastePos.Replace: + //if (colsToAdd > Cols.Count - Selection.c1) + // this.Cols.Add(colsToAdd - (Cols.Count - Selection.c1)); + if (colsToAdd > Cols.Count - selC1) + { + this.Cols.Add(colsToAdd - (Cols.Count - selC1)); + AdjustMergedColumns(selC1, true, false); + } + break; + } + + RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1, MyCopyInfo.MyCopiedCellRange.c1 + colOffset, MyCopyInfo.MyCopiedCellRange.r2, MyCopyInfo.MyCopiedCellRange.c2 + colOffset); + + for (int c = MyCopyInfo.MyCopiedCellRange.c1; c <= MyCopyInfo.MyCopiedCellRange.c2; c++) + { + Cols[c + colOffset].Width = MyCopyInfo.MyCopiedFlexGrid.Cols[c].Width; + for (int r = MyCopyInfo.MyCopiedCellRange.r1; r <= Math.Min(MyCopyInfo.MyCopiedCellRange.r2 + rowsToAdd, Rows.Count - 1); r++) + { + CellRange crm = MyCopyInfo.MyCopiedFlexGrid.GetMergedRange(r, c); + if (r == crm.r1 && c == crm.c1) + { + Rows[r].Height = Math.Max(Rows[r].Height, MyCopyInfo.MyCopiedFlexGrid.Rows[r].Height); + CellRange cr = GetCellRange(crm.r1, crm.c1 + colOffset, crm.r2, crm.c2 + colOffset); + if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1)) + MergedRanges.Add(cr); + this[r, c + colOffset] = MyCopyInfo.MyCopiedFlexGrid[r, c]; + MatchStyle(crm, cr); + } + } + } + this.AdjustGridControlSize(); } - public void ClipBoardPasteIntoSelection() - { - // Get a list of strings representing the text (rtf text) in each cell - // that was saved to the clipboard (row/column order) - ArrayList aryCellList = _clpbrdCpyPste.Get(); + public void PasteCopiedCells() + { + // Warn the user that this type of paste will replace the currently selected (highlighted) table cells and give the option to abort. + DialogResult dr = MessageBox.Show("This will replace the cells that are currently selected (highlighted). \n\nContinue with the paste?","Paste Table Cells",MessageBoxButtons.YesNo,MessageBoxIcon.Question); + if (dr == DialogResult.No) return; - if (aryCellList != null && aryCellList.Count > 0) - { - // copy each grid cell text (aryCellList) into the selected cells - this.CopyTextFromCellRange(aryCellList, this.Selection.r1, this.Selection.c1, this.Selection.r2, this.Selection.c2); - this.AdjustGridControlSize(); - } - } + int nSelRows = Selection.r2 - Selection.r1 + 1; + int nSelCols = Selection.c2 - Selection.c1 + 1; + int nCpyRows = MyCopyInfo.MyCopiedCellRange.r2 - MyCopyInfo.MyCopiedCellRange.r1 + 1; + int nCpyCols = MyCopyInfo.MyCopiedCellRange.c2 - MyCopyInfo.MyCopiedCellRange.c1 + 1; + int colsToAdd = Math.Max(nCpyCols - nSelCols, 0); + int rowsToAdd = Math.Max(nCpyRows - nSelRows, 0); + int rowOffset = Selection.r1 - MyCopyInfo.MyCopiedCellRange.r1; + int colOffset = Selection.c1 - MyCopyInfo.MyCopiedCellRange.c1; + int selR2 = Selection.r2; + int selC2 = Selection.c2; + // If there are more cells to copy than what is seleceted in the target table + // Add extra rows and columns as needed + if (rowsToAdd > 0) + { + if (selR2 < Rows.Count - 1) + this.Rows.InsertRange(selR2 + 1, rowsToAdd); + else + this.Rows.Add(rowsToAdd); + AdjustMergedRows(selR2 + 1, false, false); + } - #endregion //Clipboard - #region Selection + if (colsToAdd > 0) + { + if (selC2 < Cols.Count - 1) + this.Cols.InsertRange(selC2 + 1, colsToAdd); + else + this.Cols.Add(colsToAdd); + AdjustMergedColumns(selC2 + 1, false, false); + } + + RemoveMergedRanges(MyCopyInfo.MyCopiedCellRange.r1 + rowOffset, MyCopyInfo.MyCopiedCellRange.c1 + colOffset, MyCopyInfo.MyCopiedCellRange.r2 + rowOffset, MyCopyInfo.MyCopiedCellRange.c2 + colOffset); + + for (int c = MyCopyInfo.MyCopiedCellRange.c1; c <= Math.Min(MyCopyInfo.MyCopiedCellRange.c2, Cols.Count - 1 - colOffset); c++) + Cols[c + colOffset].Width = Math.Max(MyCopyInfo.MyCopiedFlexGrid.Cols[c].Width, Cols[c + colOffset].Width); + + for (int r = MyCopyInfo.MyCopiedCellRange.r1; r <= Math.Min(MyCopyInfo.MyCopiedCellRange.r2, Rows.Count - 1 - rowOffset); r++) + { + Rows[r + rowOffset].Height = Math.Max(MyCopyInfo.MyCopiedFlexGrid.Rows[r].Height, Rows[r + rowOffset].Height); + for (int c = MyCopyInfo.MyCopiedCellRange.c1; c <= Math.Min(MyCopyInfo.MyCopiedCellRange.c2, Cols.Count - 1 - colOffset); c++) + { + CellRange crm = MyCopyInfo.MyCopiedFlexGrid.GetMergedRange(r, c); + if (r == crm.r1 && c == crm.c1) + { + CellRange cr = GetCellRange(crm.r1 + rowOffset, crm.c1 + colOffset, crm.r2 + rowOffset, crm.c2 + colOffset); + if ((crm.r2 > crm.r1) || (crm.c2 > crm.c1)) + MergedRanges.Add(cr); + this[r + rowOffset, c + colOffset] = MyCopyInfo.MyCopiedFlexGrid[r, c]; + MatchStyle(crm, cr); + } + } + } + this.AdjustGridControlSize(); + } + + #endregion // Copy/Paste + #region Selection public bool SelectNextCell() { int r = this.Row; @@ -3331,8 +3490,29 @@ namespace Volian.Controls.Library } } + public void ShowMySelection() + { + int r1 = MySelection[0].r1; + int r2 = MySelection[0].r2; + int c1 = MySelection[0].c1; + int c2 = MySelection[0].c2; + foreach (CellRange cr in MySelection) + { + r1 = Math.Min(r1, cr.r1); + c1 = Math.Min(c1, cr.c1); + r2 = Math.Max(r2, cr.r2); + c2 = Math.Max(c2, cr.c2); + } + Select(r1,c1,r2,c2); + } + #endregion - } + } + /// + /// This is used for storing the grid selection for copy/past Row/Column + /// + public enum GridCopyOption { Row, Column, Selection }; + #region RTF Class for Cell rendering class RTF : StepRTB //RichTextBox { @@ -3741,7 +3921,8 @@ namespace Volian.Controls.Library class TableClipBoardFuncts { DataFormats.Format dfmtTableCellRange = DataFormats.GetFormat("TableCellRange"); - + private SelectedTableCells mySeldTableCellsObject; + private DataObject myDataObject; public TableClipBoardFuncts() { //mySeldTableCellsObject = new DataObject(dfmtTableCellRange.Name, seldTableCells); @@ -3754,6 +3935,18 @@ namespace Volian.Controls.Library // This is saved as one RTF string. Clipboard.SetDataObject(cr.Clip, true); // the "true" make the copy persistent //Console.WriteLine("\nClip: '{0}' \n'{1}'", cr.Clip,cr.DataDisplay); + //mySeldTableCellsObject = new SelectedTableCells(); + //mySeldTableCellsObject.CpbrdCellRange = cr; + // myDataObject = new DataObject(dfmtTableCellRange.Name, mySeldTableCellsObject); + // try + // { + // Clipboard.SetDataObject(myDataObject); //,true); + // } + // catch (Exception ex) + // { + // Console.WriteLine(ex.Message); + // } + } public ArrayList Get() @@ -3764,6 +3957,27 @@ namespace Volian.Controls.Library return GetCellStrings(jj); } + //public CellRange get_cr_Paste() + //{ + // mySeldTableCellsObject = new SelectedTableCells(); + // CellRange cr = new CellRange(); + // SelectedTableCells sc; + // IDataObject myRetrievedObject = Clipboard.GetDataObject(); + // try + // { + // //object obj = myRetrievedObject.GetData(dfmtTableCellRange.Name); + // object obj = myRetrievedObject.GetData("TableCellRange"); + // //sc = (SelectedTableCells)myRetrievedObject.GetData(dfmtTableCellRange.Name); + // sc = (SelectedTableCells)obj; + // cr = sc.CpbrdCellRange; + // } + // catch (Exception ex) + // { + // Console.WriteLine(ex.Message); + // } + // return cr; + //} + private ArrayList GetCellStrings(string instr) { // The table cells placed on the clipboard is saved as one long RTF string. @@ -3886,4 +4100,43 @@ namespace Volian.Controls.Library _Text = text; } } + public class GridCopyInfo + { + private int _Bozo = 5; + [XmlIgnore] + public int Bozo + { + get { return _Bozo; } + set { _Bozo = value; } + } + + private GridCopyOption _MyCopyOption = GridCopyOption.Selection; + + public GridCopyOption MyCopyOption + { + get { return _MyCopyOption; } + set + { + Console.WriteLine("MyCopyOption = {0}", _MyCopyOption); + if (_MyCopyOption != value) + Console.WriteLine("Changed Option to {0}", value); + _MyCopyOption = value; + } + } + private VlnFlexGrid _MyCopiedFlexGrid = null; + + public VlnFlexGrid MyCopiedFlexGrid + { + get { return _MyCopiedFlexGrid; } + set { _MyCopiedFlexGrid = value; } + } + private CellRange _MyCopiedCellRange; + + public CellRange MyCopiedCellRange + { + get { return _MyCopiedCellRange; } + set { _MyCopiedCellRange = value; } + } + + } }