Browse Source

Image run in Designer

pull/637/merge
Peter Forstmeier 11 years ago
parent
commit
b8ed1af02f
  1. 3
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/ICSharpCode.Reporting.Addin.csproj
  2. 229
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignableItems/BaseImageItem.cs
  3. 99
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Designer/ImageDesigner.cs
  4. 31
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Designer/LineDesigner.cs
  5. 41
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Toolbox/ToolboxProvider.cs
  6. 84
      src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/TypeProvider/ImageItemTypeProvider.cs

3
src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/ICSharpCode.Reporting.Addin.csproj

@ -109,6 +109,7 @@
<Compile Include="src\DesignableItems\AbstractItem.cs" /> <Compile Include="src\DesignableItems\AbstractItem.cs" />
<Compile Include="src\DesignableItems\BaseCircleItem.cs" /> <Compile Include="src\DesignableItems\BaseCircleItem.cs" />
<Compile Include="src\DesignableItems\BaseGroupHeader.cs" /> <Compile Include="src\DesignableItems\BaseGroupHeader.cs" />
<Compile Include="src\DesignableItems\BaseImageItem.cs" />
<Compile Include="src\DesignableItems\BaseLineItem.cs" /> <Compile Include="src\DesignableItems\BaseLineItem.cs" />
<Compile Include="src\DesignableItems\BaseRectangleItem.cs" /> <Compile Include="src\DesignableItems\BaseRectangleItem.cs" />
<Compile Include="src\DesignableItems\BaseRowItem.cs" /> <Compile Include="src\DesignableItems\BaseRowItem.cs" />
@ -126,6 +127,7 @@
<Compile Include="src\Designer\AbstractDesigner.cs" /> <Compile Include="src\Designer\AbstractDesigner.cs" />
<Compile Include="src\Designer\DataItemDesigner.cs" /> <Compile Include="src\Designer\DataItemDesigner.cs" />
<Compile Include="src\Designer\GroupedRowDesigner.cs" /> <Compile Include="src\Designer\GroupedRowDesigner.cs" />
<Compile Include="src\Designer\ImageDesigner.cs" />
<Compile Include="src\Designer\LineDesigner.cs" /> <Compile Include="src\Designer\LineDesigner.cs" />
<Compile Include="src\Designer\ContainerDesigner.cs" /> <Compile Include="src\Designer\ContainerDesigner.cs" />
<Compile Include="src\Designer\ReportRootDesigner.cs" /> <Compile Include="src\Designer\ReportRootDesigner.cs" />
@ -192,6 +194,7 @@
<Compile Include="src\TypeProvider\CircleItemTypeProvider.cs" /> <Compile Include="src\TypeProvider\CircleItemTypeProvider.cs" />
<Compile Include="src\TypeProvider\DataItemTypeProvider.cs" /> <Compile Include="src\TypeProvider\DataItemTypeProvider.cs" />
<Compile Include="src\TypeProvider\GroupedRowTypeProvider.cs" /> <Compile Include="src\TypeProvider\GroupedRowTypeProvider.cs" />
<Compile Include="src\TypeProvider\ImageItemTypeProvider.cs" />
<Compile Include="src\TypeProvider\LineItemTypeProvider.cs" /> <Compile Include="src\TypeProvider\LineItemTypeProvider.cs" />
<Compile Include="src\TypeProvider\RectangleItemTypeProvider.cs" /> <Compile Include="src\TypeProvider\RectangleItemTypeProvider.cs" />
<Compile Include="src\TypeProvider\RowItemTypeProvider.cs" /> <Compile Include="src\TypeProvider\RowItemTypeProvider.cs" />

229
src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignableItems/BaseImageItem.cs

@ -0,0 +1,229 @@
/*
* Created by SharpDevelop.
* User: Peter Forstmeier
* Date: 21.06.2015
* Time: 10:35
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.ComponentModel;
using System.Drawing;
using System.Xml.Serialization;
using ICSharpCode.Reporting.Addin.Globals;
using ICSharpCode.Reports.Addin.TypeProviders;
namespace ICSharpCode.Reporting.Addin.DesignableItems
{
[Designer(typeof(ICSharpCode.Reporting.Addin.Designer.ImageDesigner))]
public class BaseImageItem:AbstractItem
{
// string imageFileName;
Image image;
// GlobalEnums.ImageSource imageSource;
// string reportFileName;
public BaseImageItem(){
TypeDescriptor.AddProvider(new ImageItemTypeProvider(), typeof(BaseImageItem));
Size = new Size(300,40);
BackColor = Color.LightGray;
}
[EditorBrowsableAttribute()]
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e){
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
base.OnPaint(e);
Draw(e.Graphics);
}
public override void Draw(Graphics graphics){
if (graphics == null) {
throw new ArgumentNullException("graphics");
}
var rect = new Rectangle(ClientRectangle.Left,ClientRectangle.Top,
ClientRectangle.Right -1,
ClientRectangle.Bottom -1);
DrawControl(graphics,rect);
if (ScaleImageToSize) {
graphics.DrawImageUnscaled(Image, Location.X, Location.Y);
} else {
graphics.DrawImage(Image, ClientRectangle);
}
}
#region Property's
// [Category("Image")]
// [EditorAttribute ( typeof(FileNameEditor), typeof(UITypeEditor) ) ]
// public string ImageFileName {
// get { return imageFileName; }
// set { imageFileName = value;
// if (!String.IsNullOrEmpty(reportFileName)) {
//// this.RelativeFileName = FileUtility.GetRelativePath(Path.GetFullPath(this.reportFileName),Path.GetFullPath(this.ImageFileName));
// }
// }
// }
static Bitmap ErrorBitmap(Size size){
var b = new Bitmap (size.Width,size.Height);
using (Graphics g = Graphics.FromImage (b)){
g.DrawRectangle (new Pen(Color.Black, 1),
1,1,size.Width -2,size.Height -2);
g.DrawString("Image",new Font("Microsoft Sans Serif", 8),
new SolidBrush(Color.Gray),
new RectangleF(1,1,size.Width,size.Height) );
}
return b;
}
static Bitmap FakeImage(Size size, string text){
var b = new Bitmap (size.Width,size.Height);
using (Graphics g = Graphics.FromImage (b)){
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
g.DrawRectangle (new Pen(Color.Black, 1),
1,1,size.Width -2,size.Height -2);
g.DrawString(text,new Font("Microsoft Sans Serif",
16,
FontStyle.Regular,
GraphicsUnit.Point),
new SolidBrush(Color.Gray),
new RectangleF(2,2,size.Width,size.Height) );
}
return b;
}
/*
Image LoadImage (){
try {
// Image im = null;
// var im = FakeImage(new Size(200,20),"DummyDesignImage");
// string absFileName = this.AbsoluteFileName;
// if (!String.IsNullOrEmpty(absFileName) && File.Exists(absFileName)){
// im = Image.FromFile (absFileName);
// } else {
// im = BaseImageItem.ErrorBitmap(base.Size);
// }
return (Image)im;
} catch (System.OutOfMemoryException) {
throw;
} catch (System.IO.FileNotFoundException) {
throw;
}
}
*/
[XmlIgnoreAttribute]
public Image Image {
get {
string text = "<Dummy Design Image>";
// if (this.imageSource == GlobalEnums.ImageSource.Database ) {
// text = "<Database>";
// }
// if (!String.IsNullOrEmpty(imageFileName)) {
// this.image = this.LoadImage();
// return this.image;
// } else
// {
// this.image = FakeImage(base.Size,text);
// }
this.image = FakeImage(Size, text);
return this.image;
}
set {
this.image = value;
// this.imageSource = GlobalEnums.ImageSource.External;
}
}
[Category("Layout")]
public bool ScaleImageToSize {get;set;}
// [Category("Image")]
// public GlobalEnums.ImageSource ImageSource {
// get { return imageSource; }
// set { imageSource = value; }
// }
// [Category("DataBinding")]
// public string ColumnName {get;set;}
//
//
// [Category("DataBinding")]
// public string BaseTableName {get;set;}
//
//
// [Category("DataBinding")]
// public string DataType {get;set;}
/*
[XmlIgnoreAttribute]
[Category("Image")]
public string ReportFileName {
get { return Path.GetFullPath(reportFileName); }
set { reportFileName = value;}
}
[Category("Image")]
[Browsable(false)]
public string RelativeFileName {get;set;}
[XmlIgnoreAttribute]
[Category("Image")]
[Browsable(false)]
public string AbsoluteFileName
{
get {
if (!string.IsNullOrEmpty(RelativeFileName)) {
Console.WriteLine("");
string testFileName = String.Empty;
if (! String.IsNullOrEmpty(reportFileName)) {
// testFileName = FileUtility.NormalizePath(Path.Combine(Path.GetDirectoryName(this.reportFileName),this.RelativeFileName));
}
if (File.Exists(testFileName)){
Console.WriteLine("Image found with Relative Filename");
return testFileName;
} else {
Console.WriteLine("AbsoluteFileName can't load image");
Console.WriteLine("Report Filename {0}",this.reportFileName);
Console.WriteLine("Relative Filename {0}",this.RelativeFileName);
Console.WriteLine("Image Filename {0}",this.ImageFileName);
}
}
return this.ImageFileName;
}
}
*/
// public new string Name {get;set;}
#endregion
}
}

99
src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Designer/ImageDesigner.cs

@ -0,0 +1,99 @@
/*
* Created by SharpDevelop.
* User: Peter Forstmeier
* Date: 21.06.2015
* Time: 10:37
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms.Design;
using ICSharpCode.Reporting.Addin.Globals;
using ICSharpCode.Reporting.Addin.TypeProvider;
namespace ICSharpCode.Reporting.Addin.Designer
{
/// <summary>
/// Description of ShapeDesigner.
/// </summary>
public class ImageDesigner:ControlDesigner
{
ISelectionService selectionService;
IComponentChangeService componentChangeService;
public ImageDesigner()
{
}
public override void Initialize(IComponent component){
if (component == null) {
throw new ArgumentNullException("component");
}
base.Initialize(component);
this.componentChangeService = (IComponentChangeService)component.Site.GetService(typeof(IComponentChangeService));
if (componentChangeService != null) {
componentChangeService.ComponentChanging += OnComponentChanging;
componentChangeService.ComponentChanged += OnComponentChanged;
componentChangeService.ComponentRename += new ComponentRenameEventHandler(OnComponentRename);
}
selectionService = GetService(typeof(ISelectionService)) as ISelectionService;
if (selectionService != null)
{
selectionService.SelectionChanged += OnSelectionChanged;
}
}
protected override void PostFilterProperties(System.Collections.IDictionary properties){
TypeProviderHelper.RemoveProperties(properties);
base.PostFilterProperties(properties);
}
void OnComponentChanging (object sender,ComponentChangingEventArgs e){
// System.Console.WriteLine("changing");
// System.Console.WriteLine("{0}",this.baseLine.ClientRectangle);
}
void OnComponentChanged(object sender,ComponentChangedEventArgs e){
// System.Console.WriteLine("changed");
// System.Console.WriteLine("{0}",this.baseLine.ClientRectangle);
}
void OnComponentRename(object sender,ComponentRenameEventArgs e) {
if (e.Component == Component) {
Control.Name = e.NewName;
Control.Invalidate();
}
}
void OnSelectionChanged(object sender, EventArgs e){
Control.Invalidate( );
}
protected override void Dispose(bool disposing){
if (this.componentChangeService != null) {
componentChangeService.ComponentChanging -= OnComponentChanging;
componentChangeService.ComponentChanged -= OnComponentChanged;
componentChangeService.ComponentRename -= OnComponentRename;
}
if (selectionService != null) {
selectionService.SelectionChanged -= OnSelectionChanged;
}
base.Dispose(disposing);
}
}
}

31
src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Designer/LineDesigner.cs

@ -26,8 +26,7 @@ namespace ICSharpCode.Reporting.Addin.Designer
bool overFromPoint; bool overFromPoint;
public override void Initialize(IComponent component) public override void Initialize(IComponent component){
{
if (component == null) { if (component == null) {
throw new ArgumentNullException("component"); throw new ArgumentNullException("component");
} }
@ -36,15 +35,13 @@ namespace ICSharpCode.Reporting.Addin.Designer
} }
protected override void PostFilterProperties(System.Collections.IDictionary properties) protected override void PostFilterProperties(System.Collections.IDictionary properties){
{
TypeProviderHelper.RemoveProperties(properties); TypeProviderHelper.RemoveProperties(properties);
base.PostFilterProperties(properties); base.PostFilterProperties(properties);
} }
protected override void OnPaintAdornments(PaintEventArgs pe) protected override void OnPaintAdornments(PaintEventArgs pe){
{
var label = Control as BaseLineItem; var label = Control as BaseLineItem;
if (SelectionService != null) if (SelectionService != null)
@ -62,16 +59,14 @@ namespace ICSharpCode.Reporting.Addin.Designer
} }
static Rectangle GetHandle(Point pt) static Rectangle GetHandle(Point pt){
{
var handle = new Rectangle(pt, new Size(7, 7)); var handle = new Rectangle(pt, new Size(7, 7));
handle.Offset(-3, -3); handle.Offset(-3, -3);
return handle; return handle;
} }
protected override void OnSetCursor( ) protected override void OnSetCursor(){
{
// Get mouse cursor position relative to // Get mouse cursor position relative to
// the control's coordinate space. // the control's coordinate space.
@ -95,11 +90,10 @@ namespace ICSharpCode.Reporting.Addin.Designer
#region Drag handling state and methods #region Drag handling state and methods
protected override void OnMouseDragBegin(int x, int y) protected override void OnMouseDragBegin(int x, int y){
{ var point = this.baseLine.PointToClient(new Point(x, y));
Point p = this.baseLine.PointToClient(new Point(x, y)); overFromPoint = GetHandle(baseLine.FromPoint).Contains(point);
overFromPoint = GetHandle(baseLine.FromPoint).Contains(p); overToPoint = GetHandle(baseLine.ToPoint).Contains(point);
overToPoint = GetHandle(baseLine.ToPoint).Contains(p);
if (overFromPoint || overToPoint ) if (overFromPoint || overToPoint )
{ {
dragging = true; dragging = true;
@ -112,8 +106,7 @@ namespace ICSharpCode.Reporting.Addin.Designer
} }
protected override void OnMouseDragMove(int x, int y) protected override void OnMouseDragMove(int x, int y){
{
if (dragging) if (dragging)
{ {
Point p = baseLine.PointToClient(new Point(x, y)); Point p = baseLine.PointToClient(new Point(x, y));
@ -133,8 +126,7 @@ namespace ICSharpCode.Reporting.Addin.Designer
} }
protected override void OnMouseDragEnd(bool cancel) protected override void OnMouseDragEnd(bool cancel){
{
if (dragging) if (dragging)
{ {
// Update property via PropertyDescriptor to // Update property via PropertyDescriptor to
@ -170,6 +162,5 @@ namespace ICSharpCode.Reporting.Addin.Designer
} }
#endregion #endregion
} }
} }

41
src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Toolbox/ToolboxProvider.cs

@ -27,8 +27,7 @@ namespace ICSharpCode.Reporting.Addin.Toolbox
static int viewCount; static int viewCount;
static bool initialised; static bool initialised;
public static void AddViewContent(IViewContent viewContent) public static void AddViewContent(IViewContent viewContent){
{
if (viewContent == null) if (viewContent == null)
throw new ArgumentNullException("viewContent"); throw new ArgumentNullException("viewContent");
@ -43,8 +42,7 @@ namespace ICSharpCode.Reporting.Addin.Toolbox
ViewCount++; ViewCount++;
} }
static void Initialise() static void Initialise(){
{
initialised = true; initialised = true;
} }
@ -65,7 +63,6 @@ namespace ICSharpCode.Reporting.Addin.Toolbox
//DataItem //DataItem
toolboxItem = new ToolboxItem(typeof(BaseDataItem)) { toolboxItem = new ToolboxItem(typeof(BaseDataItem)) {
DisplayName = ResourceService.GetString("SharpReport.Toolbar.DataField"), DisplayName = ResourceService.GetString("SharpReport.Toolbar.DataField"),
// tb.Bitmap = WinFormsResourceService.GetBitmap("Icons.16x16.SharpQuery.Column");
Bitmap = IconService.GetBitmap("Icons.16x16.SharpQuery.Column") Bitmap = IconService.GetBitmap("Icons.16x16.SharpQuery.Column")
}; };
sideTab.Items.Add(new SideTabItemDesigner(toolboxItem)); sideTab.Items.Add(new SideTabItemDesigner(toolboxItem));
@ -98,7 +95,6 @@ namespace ICSharpCode.Reporting.Addin.Toolbox
toolboxItem = new ToolboxItem(typeof(GroupHeader)); toolboxItem = new ToolboxItem(typeof(GroupHeader));
toolboxItem.Bitmap = IconService.GetBitmap("Icons.16x16.NameSpace"); toolboxItem.Bitmap = IconService.GetBitmap("Icons.16x16.NameSpace");
toolboxItem.DisplayName = ResourceService.GetString("SharpReport.Toolbar.GroupHeader"); toolboxItem.DisplayName = ResourceService.GetString("SharpReport.Toolbar.GroupHeader");
sideTab.Items.Add(new SideTabItemDesigner(toolboxItem)); sideTab.Items.Add(new SideTabItemDesigner(toolboxItem));
@ -107,6 +103,13 @@ namespace ICSharpCode.Reporting.Addin.Toolbox
toolboxItem.Bitmap = IconService.GetBitmap("Icons.16x16.SharpQuery.Table"); toolboxItem.Bitmap = IconService.GetBitmap("Icons.16x16.SharpQuery.Table");
toolboxItem.DisplayName = ResourceService.GetString("SharpReport.Toolbar.DataRow"); toolboxItem.DisplayName = ResourceService.GetString("SharpReport.Toolbar.DataRow");
sideTab.Items.Add(new SideTabItemDesigner(toolboxItem)); sideTab.Items.Add(new SideTabItemDesigner(toolboxItem));
// Image
toolboxItem = new ToolboxItem(typeof(BaseImageItem));
toolboxItem.DisplayName = ResourceService.GetString("SharpReport.Toolbar.Image");
toolboxItem.Bitmap = IconService.GetBitmap("Icons.16x16.ResourceEditor.bmp");
sideTab.Items.Add(new SideTabItemDesigner(toolboxItem));
/* /*
//GroupFooter //GroupFooter
@ -127,27 +130,17 @@ namespace ICSharpCode.Reporting.Addin.Toolbox
tb = new ToolboxItem(typeof(ICSharpCode.Reports.Addin.BaseTableItem)); tb = new ToolboxItem(typeof(ICSharpCode.Reports.Addin.BaseTableItem));
tb.DisplayName = ResourceService.GetString("SharpReport.Toolbar.Table"); tb.DisplayName = ResourceService.GetString("SharpReport.Toolbar.Table");
sideTab.Items.Add(new SideTabItemDesigner(tb)); sideTab.Items.Add(new SideTabItemDesigner(tb));
*/
//Grahics
// Image
tb = new ToolboxItem(typeof(ICSharpCode.Reports.Addin.BaseImageItem));
tb.DisplayName = ResourceService.GetString("SharpReport.Toolbar.Image");
tb.Bitmap = WinFormsResourceService.GetIcon("Icons.16x16.ResourceEditor.bmp").ToBitmap();
sideTab.Items.Add(new SideTabItemDesigner(tb));
*/
return sideTab; return sideTab;
} }
static Bitmap RectangleBitmap() static Bitmap RectangleBitmap(){
{ var bitMap = new Bitmap (16,16);
Bitmap b = new Bitmap (16,16); using (Graphics g = Graphics.FromImage (bitMap)){
using (Graphics g = Graphics.FromImage (b)){
g.DrawRectangle (new Pen(Color.Black, 1), g.DrawRectangle (new Pen(Color.Black, 1),
1,1,14,14); 1,1,14,14);
} }
return b; return bitMap;
} }
@ -155,8 +148,7 @@ namespace ICSharpCode.Reporting.Addin.Toolbox
/// ToolboxIcon for ReportCircle /// ToolboxIcon for ReportCircle
/// </summary> /// </summary>
/// <returns>Bitmap</returns> /// <returns>Bitmap</returns>
static Bitmap CircleBitmap() static Bitmap CircleBitmap(){
{
var bmp = new Bitmap (19,19); var bmp = new Bitmap (19,19);
using (var g = Graphics.FromImage (bmp)){ using (var g = Graphics.FromImage (bmp)){
g.DrawEllipse (new Pen(Color.Black, 1), g.DrawEllipse (new Pen(Color.Black, 1),
@ -167,8 +159,7 @@ namespace ICSharpCode.Reporting.Addin.Toolbox
} }
static SideTabItem CreateToolboxPointer(SideTab sideTab) static SideTabItem CreateToolboxPointer(SideTab sideTab){
{
var pointer = new SharpDevelopSideTabItem("Pointer") { var pointer = new SharpDevelopSideTabItem("Pointer") {
CanBeRenamed = false, CanBeRenamed = false,
CanBeDeleted = false, CanBeDeleted = false,

84
src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/TypeProvider/ImageItemTypeProvider.cs

@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using ICSharpCode.Reporting.Addin.DesignableItems;
using ICSharpCode.Reporting.Addin.Globals;
using ICSharpCode.Reporting.Addin.TypeProvider;
namespace ICSharpCode.Reports.Addin.TypeProviders
{
class ImageItemTypeProvider : TypeDescriptionProvider
{
public ImageItemTypeProvider() : base(TypeDescriptor.GetProvider(typeof(AbstractItem)))
{
}
public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
{
ICustomTypeDescriptor td = base.GetTypeDescriptor(objectType,instance);
return new ImageItemTypeDescriptor(td, instance);
}
}
class ImageItemTypeDescriptor : CustomTypeDescriptor{
public ImageItemTypeDescriptor(ICustomTypeDescriptor parent, object instance)
: base(parent)
{
// instance = instance as BaseTextItem;
}
public override PropertyDescriptorCollection GetProperties(){
return GetProperties(null);
}
public override PropertyDescriptorCollection GetProperties(Attribute[] attributes){
PropertyDescriptorCollection props = base.GetProperties(attributes);
List<PropertyDescriptor> allProperties = new List<PropertyDescriptor>();
TypeProviderHelper.AddDefaultProperties(allProperties,props);
// PropertyDescriptor prop = prop = props.Find("imageFileName",true);
// allProperties.Add(prop);
PropertyDescriptor prop = prop = props.Find("Image",true);
prop = props.Find("Image",true);
allProperties.Add(prop);
prop = props.Find("ScaleImageToSize",true);
allProperties.Add(prop);
// prop = props.Find("ImageSource",true);
// allProperties.Add(prop);
// prop = props.Find("ReportFileName",true);
// allProperties.Add(prop);
// prop = props.Find("RelativeFileName",true);
// allProperties.Add(prop);
// prop = props.Find("AbsoluteFileName",true);
// allProperties.Add(prop);
// prop = props.Find("ColumnName",true);
// allProperties.Add(prop);
//
// prop = props.Find("BaseTableName",true);
// allProperties.Add(prop);
prop = props.Find("Name",true);
allProperties.Add(prop);
// prop = props.Find("DataType",true);
// allProperties.Add(prop);
return new PropertyDescriptorCollection(allProperties.ToArray());
}
}
}
Loading…
Cancel
Save