You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/UCDraw/SigmaDrawerStyle/PropertyEditorSymbol.cs

118 lines
5.1 KiB
C#

1 month ago
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Design;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using GeoSigmaDrawLib;
using SymbolLibInterface;
namespace GeoSigma.SigmaDrawerStyle
{
1 month ago
//[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
1 month ago
public class PropertyEditorSymbol : UITypeEditor
{
/// <summary>
/// Initializes a new instance of the <see cref="PropertyEditorSymbol"/> class.
/// </summary>
public PropertyEditorSymbol()
{
}
// Indicates whether the UITypeEditor provides a form-based (modal) dialog,
// drop down dialog, or no UI outside of the properties window.
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
// Displays the UI for value selection.
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
// Uses the IWindowsFormsEditorService to display a
// drop-down UI in the Properties window.
IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc != null)
{
// Display an angle selection control and retrieve the value.
SymbolNameWrapper wrapper = value as SymbolNameWrapper;
GeoSigmaXY geo = wrapper.DrawerGeo as GeoSigmaXY;
//SymbolLibManager.FrmSymbolSelect frm = new SymbolLibManager.FrmSymbolSelect(geo);
string strLibraryPath = string.Empty;
geo.GetLibraryPath(ref strLibraryPath);
Form frmSymbol = SymbolHelp.CreateSymbolSelectForm(geo, strLibraryPath, AcceptSymbolName);
System.Windows.Forms.DialogResult result = edSvc.ShowDialog(frmSymbol);
if (result == System.Windows.Forms.DialogResult.OK)
{
// Return the value in the data format.
SymbolNameWrapper wrapperNew = new SymbolNameWrapper();
wrapperNew.DrawerGeo = geo;
//wrapperNew.SymbolName = frm.SelectedSymbolName;
wrapperNew.SymbolName = selectedSymbol;
//context.PropertyDescriptor.SetValue(context.Instance, wrapperNew);
//// Notify container that value has been changed
//context.OnComponentChanged();
return wrapperNew;
}
else
{
return value;
}
}
return value;
}
string selectedSymbol = string.Empty;
private string AcceptSymbolName(string symbolName)
{
return selectedSymbol = symbolName;
}
// Draws a representation of the property's value.
public override void PaintValue(PaintValueEventArgs e)
{
if (!(e.Value is SymbolNameWrapper))
{
base.PaintValue(e);
return;
}
SymbolNameWrapper symbolWrapper = e.Value as SymbolNameWrapper;
if (symbolWrapper == null || string.IsNullOrEmpty(symbolWrapper.SymbolName) || symbolWrapper.DrawerGeo == null)
{
base.PaintValue(e);
return;
}
//// remove the lines (you cannot draw on these lines anymore)
// e.Graphics.ExcludeClip(
// new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, 1));
// e.Graphics.ExcludeClip(
// new Rectangle(e.Bounds.X, e.Bounds.Y, 1, e.Bounds.Height));
// e.Graphics.ExcludeClip(
// new Rectangle(e.Bounds.Width, e.Bounds.Y, 1, e.Bounds.Height));
// e.Graphics.ExcludeClip(
// new Rectangle(e.Bounds.X, e.Bounds.Height, e.Bounds.Width, 1));
int nWidth = Math.Min(e.Bounds.Width, e.Bounds.Height);
int nX = e.Bounds.X + ((e.Bounds.Width - nWidth) / 2);
int nY = e.Bounds.Y + ((e.Bounds.Height - nWidth) / 2);
string strName = symbolWrapper.SymbolName;
Bitmap bmp = new Bitmap(nWidth, nWidth);
Graphics gBmp = Graphics.FromImage(bmp);
IntPtr pBmpDC = gBmp.GetHdc();
IntPtr pXy = IntPtr.Zero;
((GeoSigmaXY)(symbolWrapper.DrawerGeo)).DrawerDrawSymbolFill(strName, pBmpDC, nWidth, nWidth, ref pXy);
gBmp.ReleaseHdc();
e.Graphics.DrawImage(bmp, nX, nY, nWidth, nWidth);
bmp.Dispose();
}
// Indicates whether the UITypeEditor supports painting a
// representation of a property's value.
public override bool GetPaintValueSupported(System.ComponentModel.ITypeDescriptorContext context)
{
return true;
}
}
}