| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 | using System;using System.Collections.Generic;using System.Data;using System.Diagnostics;using System.Drawing;using System.IO;using System.Linq;using System.Windows;using System.Windows.Media.Imaging;using InABox.Clients;using InABox.Core;using InABox.WPF;using Microsoft.Win32;using Syncfusion.Pdf.Interactive;using Syncfusion.Pdf.Parsing;using Syncfusion.Pdf;namespace InABox.DynamicGrid{    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 DynamicDocumentGrid()        {            Options.Add(DynamicGridOption.DragTarget);            MultiSelect = false;            HiddenColumns.Add(x => x.DocumentLink.ID);            HiddenColumns.Add(x => x.Superceded);            HiddenColumns.Add(x => x.DocumentLink.FileName);            ActionColumns.Add(new DynamicImageColumn(DocumentImage, ViewDocument) { Position = DynamicActionColumnPosition.Start });            ActionColumns.Add(new DynamicImageColumn(DiskImage, SaveDocument) { Position = DynamicActionColumnPosition.Start });            supercedecolumn = new DynamicImageColumn(SupercededImage, SupercedeDocument);            ActionColumns.Add(supercedecolumn);        }        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 Properties.Resources.disk.AsBitmapImage();        }        public override int Order()        {            return int.MaxValue;        }        private BitmapImage SupercededImage(CoreRow? row)        {            if (row == null)                return Properties.Resources.tick.AsBitmapImage();            if (row.Get<TDocument, DateTime>(x => x.Superceded) != DateTime.MinValue)                return Properties.Resources.warning.AsBitmapImage();            return Properties.Resources.tick.AsBitmapImage();        }        private bool SupercedeDocument(CoreRow? row)        {            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;        }        private BitmapImage DocumentImage(CoreRow? arg)        {            return Properties.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)        {            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);            }        }        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);                        }                    }                }                Refresh(false, true);            }        }    }}
 |