123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616 |
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Diagnostics;
- using System.Drawing;
- using System.Drawing.Printing;
- using System.IO;
- using System.Linq;
- using System.Text.RegularExpressions;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using FastReport;
- using InABox.Clients;
- using InABox.Core;
- using InABox.WPF;
- using Microsoft.Win32;
- using Microsoft.Xaml.Behaviors.Core;
- using RoslynPad.Editor;
- using Syncfusion.Pdf.Interactive;
- using Syncfusion.Pdf.Parsing;
- using Syncfusion.Pdf;
- using Syncfusion.Windows.PdfViewer;
- using Border = System.Windows.Controls.Border;
- using Color = System.Windows.Media.Color;
- using Image = System.Windows.Controls.Image;
- namespace InABox.DynamicGrid
- {
- public class DocumentConverter : UtilityConverter<object, object>
- {
- public override object Convert(object value)
- {
- return value;
- }
- }
-
- public class TimeStampToBrushConverter : UtilityConverter<DateTime, System.Windows.Media.Brush?>
- {
- public System.Windows.Media.Brush? Empty { get; init; }
- public System.Windows.Media.Brush? Set { get; init; }
-
- public override System.Windows.Media.Brush? Convert(DateTime value)
- {
- return value.IsEmpty()
- ? Empty
- : Set;
- }
- }
-
- public delegate String OnGetWatermark(CoreRow row);
- public class DynamicDocumentGrid<TDocument, TEntity, TEntityLink> : DynamicManyToManyGrid<TDocument, TEntity>
- where TEntity : Entity, IPersistent, IRemotable, new()
- where TDocument : Entity, IEntityDocument<TEntityLink>, IPersistent, IRemotable, new() // Entity, IPersistent, IRemotable, IManyToMany<TEntity, Document>, new()
- where TEntityLink : EntityLink<TEntity>, new()
- {
- // private DynamicActionColumn supercedecolumn;
- //
- // public bool ShowSupercededColumn
- // {
- // get
- // {
- // return supercedecolumn.Position != DynamicActionColumnPosition.Hidden;
- // }
- // set
- // {
- // supercedecolumn.Position = value ? DynamicActionColumnPosition.End : DynamicActionColumnPosition.Hidden;
- // }
- // }
-
- public bool ShowSupercededColumn { get; set; }
- private DynamicTemplateColumn _template;
- public DynamicDocumentGrid()
- {
- MultiSelect = false;
- HiddenColumns.Add(x => x.DocumentLink.ID);
- HiddenColumns.Add(x => x.Superceded);
- HiddenColumns.Add(x => x.DocumentLink.FileName);
- HiddenColumns.Add(x => x.Thumbnail);
- HiddenColumns.Add(x => x.Notes);
- //ActionColumns.Add(new DynamicImageColumn(DocumentImage, ViewDocument) { Position = DynamicActionColumnPosition.Start });
- //ActionColumns.Add(new DynamicImageColumn(DiskImage, SaveDocument) { Position = DynamicActionColumnPosition.Start });
- _template = new DynamicTemplateColumn(DocumentTemplate)
- {
- Position = DynamicActionColumnPosition.Start,
- Width = 0,
- HeaderText = "Attached Documents"
- };
- ActionColumns.Add(_template);
- //supercedecolumn = new DynamicImageColumn(SupercededImage, SupercedeDocument);
- //ActionColumns.Add(supercedecolumn);
- }
- protected override void DoDoubleClick(object sender)
- {
- var doc = SelectedRows.FirstOrDefault()?.ToObject<TDocument>();
- if (doc != null)
- {
- var editor = new DocumentEditor(new IEntityDocument[] { doc });
- //editor.PrintAllowed = Security.IsAllowed<CanPrintFactoryFloorDrawings>();
- editor.SaveAllowed = false;
- editor.ShowDialog();
- }
- }
- private FrameworkElement DocumentTemplate()
- {
- Border border = new Border()
- {
- CornerRadius = new CornerRadius(5),
- Background = new SolidColorBrush(Colors.WhiteSmoke),
- BorderBrush = new SolidColorBrush(Colors.Gray),
- BorderThickness = new Thickness(0.75),
- Margin = new Thickness(2),
- Height = 100,
- ContextMenu = new ContextMenu()
- };
- border.ContextMenu.Items.Add(new MenuItem()
- {
- Header = "View Documents",
- Command = new ActionCommand(ViewDocuments)
- });
- border.ContextMenu.Items.Add(new MenuItem()
- {
- Header = "Copy To Clipboard",
- Command = new ActionCommand(CopyDocuments)
- });
- border.ContextMenu.Items.Add(new MenuItem()
- {
- Header = "Save Documents",
- Command = new ActionCommand(SaveDocuments)
- });
-
- border.SetBinding(
- Border.BackgroundProperty,
- new Binding("Superceded")
- {
- Converter = new TimeStampToBrushConverter()
- {
- Empty = new SolidColorBrush(Colors.LightYellow),
- Set = new SolidColorBrush(Colors.Silver)
- }
- }
- );
- Grid grid = new Grid()
- {
- RowDefinitions =
- {
- new RowDefinition() { Height = new GridLength(1, GridUnitType.Auto) },
- new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) },
- },
- ColumnDefinitions =
- {
- new ColumnDefinition() { Width = new GridLength(100) },
- new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) },
- new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) },
- }
- };
- border.Child = grid;
-
- Image thumbnail = new Image()
- {
- Stretch = Stretch.Uniform,
- Margin = new Thickness(2,2,5,2),
-
- };
-
- var ttImage = new Image();
- ttImage.SetBinding(Image.SourceProperty,
- new Binding("Thumbnail") { Converter = new BytesToBitmapImageConverter() });
- thumbnail.ToolTip = new ToolTip()
- {
- Content = ttImage
- };
-
- thumbnail.SetBinding(Image.SourceProperty, new Binding("Thumbnail") { Converter = new BytesToBitmapImageConverter() });
- thumbnail.SetValue(Grid.RowProperty,0);
- thumbnail.SetValue(Grid.RowSpanProperty,2);
- thumbnail.SetValue(Grid.ColumnProperty,0);
- grid.Children.Add(thumbnail);
-
- var filename = new Label()
- {
- FontWeight = FontWeights.Bold
- };
- filename.SetBinding(Label.ContentProperty, new Binding("DocumentLink_FileName"));
- filename.SetValue(Grid.RowProperty,0);
- filename.SetValue(Grid.ColumnProperty,1);
- grid.Children.Add(filename);
- var buttons = new StackPanel()
- {
- Orientation = Orientation.Horizontal
- };
- buttons.SetValue(Grid.RowProperty,0);
- buttons.SetValue(Grid.ColumnProperty,2);
- grid.Children.Add(buttons);
- var view = new Button()
- {
- Content = new Image() { Source = Wpf.Resources.multi_image.AsBitmapImage() },
- BorderBrush = new SolidColorBrush(Colors.Transparent),
- Background = new SolidColorBrush(Colors.Transparent),
- Height = 32,
- Width = 32,
- Command = new ActionCommand(ViewDocuments)
- };
- buttons.Children.Add(view);
-
-
- var copy = new Button()
- {
- Content = new Image() { Source = Wpf.Resources.copy.AsBitmapImage() },
- BorderBrush = new SolidColorBrush(Colors.Transparent),
- Background = new SolidColorBrush(Colors.Transparent),
- Height = 32,
- Width = 32,
- Command = new ActionCommand(CopyDocuments)
- };
- buttons.Children.Add(copy);
-
- var save = new Button()
- {
- Content = new Image() { Source = Wpf.Resources.download.AsBitmapImage() },
- BorderBrush = new SolidColorBrush(Colors.Transparent),
- Background = new SolidColorBrush(Colors.Transparent),
- Height = 32,
- Width = 32,
- Command = new ActionCommand(SaveDocuments)
- };
- buttons.Children.Add(save);
- var print = new Button()
- {
- Content = new Image() { Source = Wpf.Resources.print.AsBitmapImage() },
- BorderBrush = new SolidColorBrush(Colors.Transparent),
- Background = new SolidColorBrush(Colors.Transparent),
- Height = 32,
- Width = 32,
- Command = new ActionCommand(PrintDocuments)
- };
- buttons.Children.Add(print);
-
- var notes = new Label()
- {
- };
- notes.SetBinding(Label.ContentProperty, new Binding("Notes"));
- notes.SetValue(Grid.RowProperty,1);
- notes.SetValue(Grid.ColumnProperty,1);
- notes.SetValue(Grid.ColumnSpanProperty,2);
- grid.Children.Add(notes);
-
- return border;
- }
- private void GetDocuments(Action<Dictionary<string,byte[]>> action)
- {
- var ids = SelectedRows.Select(r => r.Get<IEntityDocument, Guid>(c => c.DocumentLink.ID)).ToArray();
- var files = new Client<Document>().Query(
- new Filter<Document>(x => x.ID).InList(ids),
- new Columns<Document>(x => x.FileName).Add(x => x.Data)
- ).ToDictionary<Document, String, byte[]>(x => x.FileName, x => x.Data);
- action?.Invoke(files);
- }
- private String SanitiseFileName(string filename)
- {
- var basefilename = Path.GetFileNameWithoutExtension(filename);
- var extension = Path.GetExtension(filename);
- return Path.ChangeExtension(string.Join("_", basefilename.Split(Path.GetInvalidFileNameChars())), extension);
- }
- private void ViewDocuments()
- {
- GetDocuments((files) =>
- {
-
- foreach (var file in files)
- {
- Task.Run(() =>
- {
- var tempfile = Path.Combine(System.IO.Path.GetTempPath(), SanitiseFileName(file.Key));
- File.WriteAllBytes(tempfile, file.Value);
- var info = new System.Diagnostics.ProcessStartInfo(tempfile);
- info.UseShellExecute = true;
- info.Verb = "Open";
- Process.Start(info);
- });
- }
- });
- }
- private void CopyDocuments()
- {
- if (SelectedRows?.Any() != true)
- return;
- GetDocuments((files) =>
- {
- System.Collections.Specialized.StringCollection FileCollection = new System.Collections.Specialized.StringCollection();
- foreach(var file in files)
- {
- var tempfile = Path.Combine(System.IO.Path.GetTempPath(), SanitiseFileName(file.Key));
- File.WriteAllBytes(tempfile, file.Value);
- FileCollection.Add(tempfile);
- }
- Clipboard.SetFileDropList(FileCollection);
- });
- }
- private void SaveDocuments()
- {
- if (SelectedRows?.Any() != true)
- return;
-
- using(var fbd = new System.Windows.Forms.FolderBrowserDialog())
- {
- var result = fbd.ShowDialog();
- if (result == System.Windows.Forms.DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
- {
- var path = fbd.SelectedPath;
- GetDocuments(files =>
- {
- foreach (var file in files)
- File.WriteAllBytes(Path.Combine(path, SanitiseFileName(file.Key)), file.Value);
- });
- }
- }
- }
- private void PrintDocuments()
- {
- if (SelectedRows?.Any() != true)
- return;
- GetDocuments(files =>
- {
- Task.Run(() =>
- {
- foreach (var file in files)
- {
- var tempfile = Path.Combine(System.IO.Path.GetTempPath(), SanitiseFileName(file.Key));
- File.WriteAllBytes(tempfile, file.Value);
- var info = new System.Diagnostics.ProcessStartInfo(tempfile);
- info.CreateNoWindow = true;
- info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
- info.UseShellExecute = true;
- info.Verb = "print";
- Process.Start(info);
- }
- });
- });
- }
- protected override DynamicGridColumns LoadColumns()
- {
- return new DynamicGridColumns();
- }
-
- protected override void DoReconfigure(FluentList<DynamicGridOption> options)
- {
- base.DoReconfigure(options);
- options.Remove(DynamicGridOption.SelectColumns);
- options.Add(DynamicGridOption.DragTarget);
- }
-
- // private bool SaveDocument(CoreRow? row)
- // {
- // var filename = row.Get<TDocument, string>(x => x.DocumentLink.FileName);
- // if (Path.GetExtension(filename).ToUpper().Equals(".PDF"))
- // {
- // var dlg = new SaveFileDialog();
- // dlg.Filter = "PDF Files (*.pdf)|*.pdf";
- // dlg.FileName = Path.ChangeExtension(filename, ".pdf");
- // if (dlg.ShowDialog() == true)
- // {
- // var imageid = row.Get<TDocument, Guid>(x => x.DocumentLink.ID);
- // var data = new Client<Document>().Query(new Filter<Document>(x => x.ID).IsEqualTo(imageid)).Rows.FirstOrDefault().Get<Document, byte[]>(x => x.Data);
- // var name = dlg.FileName;
- // File.WriteAllBytes(name, data);
- //
- // var gsProcessInfo = new ProcessStartInfo();
- // gsProcessInfo.Verb = "open";
- // gsProcessInfo.WindowStyle = ProcessWindowStyle.Normal;
- // gsProcessInfo.FileName = name;
- // gsProcessInfo.UseShellExecute = true;
- //
- // Process.Start(gsProcessInfo);
- // }
- //
- // }
- // else if (Path.GetExtension(filename).ToUpper().Equals(".PNG") || Path.GetExtension(filename).ToUpper().Equals(".JPG") || Path.GetExtension(filename).ToUpper().Equals(".GIF"))
- // {
- // var imageid = row.Get<TDocument, Guid>(x => x.DocumentLink.ID);
- // if (imageid == Guid.Empty)
- // return false;
- //
- // var dlg = new SaveFileDialog();
- // dlg.Filter = "Image Files (*.png)|*.png";
- // dlg.FileName = filename;
- // if (dlg.ShowDialog() == true)
- // {
- // var bmp = LoadBitmapFromDatabase(imageid);
- // bmp?.Save(dlg.FileName);
- // }
- // }
- //
- // return false;
- // }
- //
- // private Bitmap LoadBitmapFromDatabase(Guid imageid)
- // {
- // if (imageid == Guid.Empty)
- // return null;
- // Bitmap result = null;
- // var image = new Client<Document>().Query(
- // new Filter<Document>(x => x.ID).IsEqualTo(imageid),
- // new Columns<Document>(x => x.ID, x => x.Data)
- // ).Rows.FirstOrDefault();
- // if (image != null)
- // {
- // var ms = new MemoryStream(image.Get<Document, byte[]>(x => x.Data));
- // result = new Bitmap(ms);
- // }
- //
- // return result;
- // }
- // private BitmapImage? DiskImage(CoreRow? arg)
- // {
- // return Wpf.Resources.disk.AsBitmapImage();
- // }
- public override int Order()
- {
- return int.MaxValue;
- }
- // private BitmapImage SupercededImage(CoreRow? row)
- // {
- // if (row == null)
- // return Wpf.Resources.tick.AsBitmapImage();
- // if (row.Get<TDocument, DateTime>(x => x.Superceded) != DateTime.MinValue)
- // return Wpf.Resources.warning.AsBitmapImage();
- // return Wpf.Resources.tick.AsBitmapImage();
- // }
- //
- // private bool SupercedeDocument(CoreRow? row)
- // {
- // if (!ReadOnly)
- // {
- // var id = row.Get<TDocument, Guid>(x => x.ID);
- // var document = WorkingList.FirstOrDefault(x => x.ID.Equals(id));
- // if (document != null)
- // document.Superceded = document.Superceded == DateTime.MinValue ? DateTime.Now : DateTime.MinValue;
- // return true;
- // }
- // else
- // {
- // return false;
- // }
- // }
- //
- // private BitmapImage DocumentImage(CoreRow? arg)
- // {
- // return Wpf.Resources.view.AsBitmapImage();
- // }
- //
- // private bool ViewDocument(CoreRow? row)
- // {
- // var filename = row.Get<TDocument, string>(x => x.DocumentLink.FileName);
- // if (Path.GetExtension(filename).ToUpper().Equals(".PDF"))
- // {
- // var viewer = new DocumentEditor(row.ToObject<TDocument>());
- // viewer.Watermark = OnGetWaterMark?.Invoke(row);
- // //viewer.PrintAllowed = true;
- // viewer.SaveAllowed = true;
- // viewer.ShowDialog();
- // }
- // else
- // {
- // var id = row.Get<TDocument, Guid>(x => x.DocumentLink.ID);
- // var docrow = new Client<Document>().Query(new Filter<Document>(x => x.ID).IsEqualTo(id)).Rows.FirstOrDefault();
- // if (docrow != null)
- // {
- // var tmpfile = Path.ChangeExtension(Path.GetTempFileName(), Path.GetExtension(filename));
- // File.WriteAllBytes(tmpfile, docrow.Get<Document, byte[]>(x => x.Data));
- // var gsProcessInfo = new ProcessStartInfo();
- // gsProcessInfo.Verb = "open";
- // gsProcessInfo.WindowStyle = ProcessWindowStyle.Normal;
- // gsProcessInfo.FileName = tmpfile;
- // gsProcessInfo.UseShellExecute = true;
- //
- // Process.Start(gsProcessInfo);
- // }
- // else
- // {
- // MessageBox.Show(string.Format("Unable to retrieve {0}!", filename));
- // }
- // }
- //
- // //Document doc = new Client<Document>().Load(new Filter<Document>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
- // //if (doc != null)
- // //{
- // // if (System.IO.Path.GetExtension(doc.FileName).ToUpper().Equals(".PDF"))
- // // {
- // // PDFViewer viewer = new PDFViewer(doc);
- // // viewer.ShowDialog();
- // // }
- // // else
- // // {
- // // String filename = System.IO.Path.ChangeExtension(System.IO.Path.GetTempFileName(), System.IO.Path.GetExtension(doc.FileName));
- // // System.IO.File.WriteAllBytes(filename, doc.Data);
- // // ProcessStartInfo gsProcessInfo = new ProcessStartInfo();
- // // gsProcessInfo.Verb = "open";
- // // gsProcessInfo.WindowStyle = ProcessWindowStyle.Normal;
- // // gsProcessInfo.UseShellExecute = true;
- // // gsProcessInfo.FileName = filename;
- // // Process.Start(gsProcessInfo);
- // // }
- // //}
- // //else
- // // MessageBox.Show("Document does nto exist!");
- // return false;
- // }
- public event OnGetWatermark OnGetWaterMark;
- protected override void OnDragEnd(Type entity, CoreTable table, DragEventArgs e)
- {
- if (entity == typeof(Document))
- {
- var refresh = false;
- var docIDS = table.Rows.Select(x => x.Get<Document, Guid>(x => x.ID)).ToArray();
- var columns = new Columns<Document>(x => x.ID);
- foreach (var column in VisibleColumns)
- {
- if (column.ColumnName.StartsWith("DocumentLink."))
- {
- columns.Add(string.Join('.', column.ColumnName.Split('.').Skip(1)));
- }
- }
- var docs = new Client<Document>()
- .Query(
- new Filter<Document>(x => x.ID).InList(docIDS),
- columns);
- foreach (var doc in docs.ToObjects<Document>())
- {
- var entityDocument = new TDocument();
- entityDocument.EntityLink.ID = Item.ID;
- entityDocument.DocumentLink.ID = doc.ID;
- entityDocument.DocumentLink.Synchronise(doc);
- SaveItem(entityDocument);
- refresh = true;
- }
- if (refresh)
- {
- Refresh(false, true);
- }
- }
- else
- {
- base.OnDragEnd(entity, table, e);
- }
- }
- protected override void DoAdd(bool OpenEditorOnDirectEdit = false)
- {
- var dlg = new OpenFileDialog();
- dlg.Multiselect = true;
- if (dlg.ShowDialog() == true)
- {
- using (new WaitCursor())
- {
- var docs = new List<Document>();
- foreach (var filename in dlg.FileNames)
- {
- // Create a Document
- var doc = new Document();
- doc.FileName = Path.GetFileName(filename).ToLower();
- doc.TimeStamp = new FileInfo(dlg.FileName).LastWriteTime;
- doc.Data = File.ReadAllBytes(filename);
- doc.CRC = CoreUtils.CalculateCRC(doc.Data);
- docs.Add(doc);
- }
- if (docs.Any())
- {
- new Client<Document>().Save(docs, "Initial Upload");
- foreach (var doc in docs)
- {
- var newitem = CreateItem();
- var prop = (IEntityLink)otherproperty.GetValue(newitem);
- prop.ID = doc.ID;
- prop.Synchronise(doc);
- SaveItem(newitem);
- }
- DoChanged();
- }
- }
- Refresh(false, true);
- }
- }
- }
- }
|