using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Comal.Classes;
using InABox.Clients;
using InABox.Core;
using InABox.DynamicGrid;
using InABox.WPF;
using Syncfusion.UI.Xaml.Diagram;
using Syncfusion.UI.Xaml.Diagram.Stencil;
namespace PRSDesktop
{
public class CustomDiagram : SfDiagram
{
public Selector SFSelector = new();
// Customising the grab handles for nodes added to the diagram
public CustomDiagram()
{
SFSelector.Style = Application.Current.MainWindow.Resources["CustomSelectorStyle"] as Style;
}
protected override Selector GetSelectorForItemOverride(object item)
{
return SFSelector;
}
// Preventing Auto Connector creation when dragging from a port
protected override void SetTool(SetToolArgs args)
{
if (args.Source is IPort)
args.Action = ActiveTool.None;
else
base.SetTool(args);
}
}
///
/// Interaction logic for QuoteDiagram.xaml
///
public partial class QuoteDiagramControl : UserControl
{
private QuoteDiagram _diagram;
private bool _disablesave;
private BitmapImage _image;
public QuoteDiagramControl()
{
InitializeComponent();
(diagram.PageSettings.Unit as LengthUnit).Unit = LengthUnits.Centimeters;
}
public QuoteDiagram Diagram
{
get => _diagram;
set
{
_diagram = value;
areas.SymbolSource = QuoteDiagramSymbolCache.Areas;
symbols.SymbolSource = QuoteDiagramSymbolCache.Symbols;
connectors.SymbolSource = QuoteDiagramSymbolCache.Connectors;
diagram.Nodes = new NodeCollection();
diagram.Connectors = new ConnectorCollection();
//diagram.Page.Background = new SolidColorBrush(Colors.Yellow);
diagram.SelectedItems = new SelectorViewModel
{
SelectorConstraints = SelectorConstraints.Resizer | SelectorConstraints.Rotator
};
LoadDiagram();
}
}
public BitmapImage Image
{
get => _image;
set
{
_image = value;
diagram.PageSettings.PageHeight = _image != null ? _image.Height / LengthUnit.Centimeters : 29.7;
diagram.PageSettings.PageWidth = _image != null ? _image.Width / LengthUnit.Centimeters : 21.0;
diagram.PageSettings.PageBackground = new ImageBrush(value);
}
}
private static void LoadAreaContent(QuoteDiagramAreaModel area, string id)
{
var cache = QuoteDiagramSymbolCache.Areas.FirstOrDefault(x => Equals(x.ID, area.Key));
if (cache != null)
{
area.Key = cache.ID;
area.ContentTemplate = cache.ContentTemplate;
}
}
private static void LoadSymbolContent(QuoteDiagramSymbolModel symbol, string id)
{
var cache = QuoteDiagramSymbolCache.Symbols.FirstOrDefault(x => Equals(x.ID, symbol.Key));
if (symbol != null)
{
symbol.Key = cache.ID;
symbol.ContentTemplate = cache.ContentTemplate;
}
}
private static void LoadConnectorContent(QuoteDiagramConnectorModel connector, string id)
{
var cache = QuoteDiagramSymbolCache.Connectors.FirstOrDefault(x => Equals(id, x.ID));
if (cache != null)
{
connector.Key = cache.ID;
connector.ConnectorGeometryStyle = cache.ConnectorGeometryStyle;
connector.CornerRadius = cache.CornerRadius;
}
}
private void SaveDiagram()
{
if (_disablesave)
return;
using (var ms = new MemoryStream())
{
var background = diagram.PageSettings.PageBackground;
diagram.PageSettings.PageBackground = new SolidColorBrush(Colors.White);
(diagram.Info as IGraphInfo).Save(ms);
diagram.PageSettings.PageBackground = background;
Diagram.Data = Encoding.UTF8.GetString(ms.ToArray());
new Client().Save(Diagram, "", (d, err) => { });
}
}
private void DoLoadDiagram()
{
var connectors = diagram.Connectors as ConnectorCollection;
connectors.Clear();
var nodes = diagram.Nodes as NodeCollection;
nodes.Clear();
if (Diagram != null && !string.IsNullOrWhiteSpace(Diagram.Data))
{
var bytes = Encoding.UTF8.GetBytes(Diagram.Data);
try
{
using (var ms = new MemoryStream(bytes))
{
(diagram.Info as IGraphInfo).Load(ms);
}
foreach (var node in nodes)
if (node is QuoteDiagramSymbolModel)
LoadSymbolContent(node as QuoteDiagramSymbolModel, node.Key.ToString());
else if (node is QuoteDiagramAreaModel)
LoadAreaContent(node as QuoteDiagramAreaModel, node.Key.ToString());
}
catch (Exception e)
{
MessageBox.Show("Error Loading Diagram");
}
}
}
private void LoadDiagram()
{
(diagram.Info as IGraphInfo).ItemAdded -= ItemAddedEvent;
(diagram.Info as IGraphInfo).ItemTappedEvent -= Diagram_ItemTappedEvent;
(diagram.Info as IGraphInfo).ConnectorSourceChangedEvent -= QuoteDiagramControl_ConnectorSourceChangedEvent;
(diagram.Info as IGraphInfo).ConnectorTargetChangedEvent -= QuoteDiagramControl_ConnectorTargetChangedEvent;
(diagram.Info as IGraphInfo).ItemSelectedEvent -= QuoteDiagramControl_ItemSelectedEvent;
(diagram.Info as IGraphInfo).ItemUnSelectedEvent -= QuoteDiagramControl_ItemUnSelectedEvent;
(diagram.Info as IGraphInfo).HistoryChangedEvent -= Diagram_HistoryChangedEvent;
diagram.Constraints = GraphConstraints.Default;
DoLoadDiagram();
CheckScalers();
(diagram.Info as IGraphInfo).ItemAdded += ItemAddedEvent;
(diagram.Info as IGraphInfo).ItemTappedEvent += Diagram_ItemTappedEvent;
(diagram.Info as IGraphInfo).HistoryChangedEvent += Diagram_HistoryChangedEvent;
(diagram.Info as IGraphInfo).ConnectorSourceChangedEvent += QuoteDiagramControl_ConnectorSourceChangedEvent;
(diagram.Info as IGraphInfo).ConnectorTargetChangedEvent += QuoteDiagramControl_ConnectorTargetChangedEvent;
(diagram.Info as IGraphInfo).ItemSelectedEvent += QuoteDiagramControl_ItemSelectedEvent;
(diagram.Info as IGraphInfo).ItemUnSelectedEvent += QuoteDiagramControl_ItemUnSelectedEvent;
(diagram.Info as IGraphInfo).AnnotationChanged += QuoteDiagramControl_AnnotationChanged;
diagram.Constraints = GraphConstraints.Default | (GraphConstraints.Undoable & ~GraphConstraints.DrawingTool);
(diagram.Info as IGraphInfo).Commands.Zoom.Execute(new ZoomPositionParameter
{
ZoomCommand = ZoomCommand.Zoom,
ZoomTo = 1
});
}
private void QuoteDiagramControl_AnnotationChanged(object sender, ChangeEventArgs