using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Imaging;
using Comal.Classes;
using InABox.Clients;
using InABox.Core;
using InABox.Dxf;
using InABox.WPF;
using Microsoft.Win32;
namespace PRSDesktop
{
///
/// Interaction logic for ProductLookup.xaml
///
public partial class ProductLookupDock : UserControl, IDockPanel
{
private ProductHoldingControl _holdings;
public ProductLookupDock()
{
InitializeComponent();
}
public void Setup()
{
if (!Security.CanView())
return;
if (_holdings == null)
{
_holdings = new ProductHoldingControl();
HoldingsTab.Content = _holdings;
HoldingsTab.Visibility = Visibility.Visible;
}
_holdings.Refresh(true, false);
}
public void Refresh()
{
}
private void Search_TextChanged(object sender, TextChangedEventArgs e)
{
}
private void Search_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
var search = Search.Text;
if (!string.IsNullOrEmpty(search))
{
using (new WaitCursor())
{
var products = new Client().Query(
new Filter(x => x.Code).Contains(Search.Text).Or(x => x.Name)
.Contains(search), //.And(x => x.Image.ID).IsNotEqualTo(Guid.Empty),
new Columns(x => x.ID, x => x.Code, x => x.Name, x => x.Image.ID, x => x.Image.FileName),
new SortOrder(x => x.Code)
);
var items = new List();
foreach (var row in products.Rows)
{
var item = new PDI
{
ID = row.Get(x => x.ID),
Code = row.Get(x => x.Code),
Name = row.Get(x => x.Name),
ImageID = row.Get(x => x.Image.ID),
ImageName = row.Get(x => x.Image.FileName)
};
items.Add(item);
}
Items.ItemsSource = items;
if (items.Any())
{
Items.Focus();
Items.SelectedIndex = 0;
var listBoxItem = (ListBoxItem)Items.ItemContainerGenerator.ContainerFromItem(Items.SelectedItem);
if (listBoxItem != null)
listBoxItem.Focus();
}
;
}
}
else
{
Items.ItemsSource = null;
Image.Source = null;
}
}
else if (e.Key == Key.Down)
{
if (Items.ItemsSource != null)
{
var items = Items.ItemsSource as List;
if (items.Any())
{
Items.Focus();
//Items.SelectedValue = items.First();
Items.SelectedIndex = 0;
var listBoxItem = (ListBoxItem)Items.ItemContainerGenerator.ContainerFromItem(Items.SelectedItem);
listBoxItem.Focus();
}
}
}
}
private void Items_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Image.Source = null;
var productid = Guid.Empty;
if (e.AddedItems.Count > 0)
{
var item = e.AddedItems[0] as PDI;
productid = item.ID;
if (!item.ImageID.Equals(Guid.Empty))
new Client().Query(
new Filter(x => x.ID).IsEqualTo(item.ImageID),
new Columns(x => x.ID, x => x.Data),
null,
(docs, error) =>
{
var row = docs.Rows.FirstOrDefault();
if (row != null)
{
var id = row.Get(x => x.ID);
var ms = new MemoryStream(row.Get(x => x.Data));
var bmp = new Bitmap(ms);
Dispatcher.BeginInvoke(
new Action(o =>
{
if (Items.SelectedValue != null)
{
var sel = (PDI)Items.SelectedValue;
if (sel.ImageID == o)
Image.Source = bmp.AsBitmapImage(false);
}
}), id
);
}
}
);
else
Image.Source = null;
}
else
{
Image.Source = null;
}
if (Security.CanView())
{
_holdings.ParentID = productid;
_holdings.Refresh(false, true);
}
}
private void Items_KeyUp(object sender, KeyEventArgs e)
{
}
private void Items_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Up)
if (Items.SelectedIndex == 0)
Search.Focus();
}
private void ImageMenu_Opened(object sender, RoutedEventArgs e)
{
var pdi = Items.SelectedItem as PDI;
var anyproducts = pdi != null;
var validimage = pdi != null && pdi.ImageID != Guid.Empty;
LoadImageFromFile.IsEnabled = anyproducts;
SaveImageToFile.IsEnabled = validimage;
CopyImageToClipboard.IsEnabled = validimage;
PasteImageFromClipboard.IsEnabled = anyproducts && (Clipboard.ContainsData("ProductImage") || Clipboard.ContainsImage());
ClearImage.IsEnabled = anyproducts;
}
private string SelectedProducts()
{
var pdi = Items.SelectedItem as PDI;
return pdi != null ? pdi.Code : "";
}
private void UpdateProductImages(Guid id, string filename, Bitmap bitmap)
{
var pdi = Items.SelectedItem as PDI;
if (pdi == null)
return;
var docid = id;
if (bitmap != null && docid == Guid.Empty)
{
byte[] data = null;
using (var ms = new MemoryStream())
{
bitmap.Save(ms, ImageFormat.Png);
data = ms.GetBuffer();
}
var crc = CoreUtils.CalculateCRC(data);
var doc = new Client().Query(
new Filter(x => x.FileName).IsEqualTo(Path.GetFileName(filename)).And(x => x.CRC).IsEqualTo(crc),
new Columns(x => x.ID)
).Rows.FirstOrDefault()?.ToObject();
if (doc == null)
{
doc = new Document
{
FileName = Path.GetFileName(filename),
CRC = crc,
TimeStamp = DateTime.Now,
Data = data
};
new Client().Save(doc, "");
}
docid = doc.ID;
}
var product = new Product { ID = pdi.ID };
product.Image.ID = CoreUtils.FullGuid;
product.CommitChanges();
product.Image.ID = docid;
product.Image.FileName = Path.GetFileName(filename);
new Client().Save(product, "Cleared Product Image", (p, err) => { });
pdi.ImageID = docid;
pdi.ImageName = Path.GetFileName(filename);
Image.Source = bitmap?.AsBitmapImage();
}
private Bitmap ConvertDXFFile(string filename)
{
Bitmap result = null;
using (var stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
//String newfile = Path.ChangeExtension(Path.GetFileName(filename), "png");
try
{
result = DxfUtils.ProcessImage(stream, Path.GetFileNameWithoutExtension(filename));
}
catch (Exception e)
{
MessageBox.Show(e.Message);
result = null;
}
}
return result;
}
private void LoadImageFromFile_Click(object sender, RoutedEventArgs e)
{
var pdi = Items.SelectedItem as PDI;
if (pdi == null)
return;
var dlg = new OpenFileDialog();
dlg.Filter = "Image Files (*.png;*.jpg;*.jpeg;*.bmp)|*.png;*.jpg;*.jpeg;*.bmp|DXF Files (*.dxf)|*.dxf";
if (dlg.ShowDialog() == true)
{
var filename = dlg.FileName.ToLower();
Progress.Show("Updating Images: " + Path.GetFileName(filename));
Bitmap bmp = null;
if (Path.GetExtension(filename).ToLower().Equals(".dxf"))
bmp = ConvertDXFFile(filename);
else
bmp = System.Drawing.Image.FromFile(filename) as Bitmap;
UpdateProductImages(Guid.Empty, filename, bmp);
Progress.Close();
MessageBox.Show(string.Format("Imported [{0}] into [{1}]", Path.GetFileName(dlg.FileName), SelectedProducts()));
}
}
private void SaveImageToFile_Click(object sender, RoutedEventArgs e)
{
var pdi = Items.SelectedItem as PDI;
if (pdi == null)
return;
var bmp = (Image.Source as BitmapImage).AsBitmap();
var dlg = new SaveFileDialog();
dlg.Filter = "Image Files (*.png)|*.png";
dlg.FileName = pdi.ImageName;
if (dlg.ShowDialog() == true)
bmp.Save(dlg.FileName);
}
private void CopyImageToClipboard_Click(object sender, RoutedEventArgs e)
{
var pdi = Items.SelectedItem as PDI;
if (pdi == null)
return;
var bmp = (Image.Source as BitmapImage).AsBitmap();
var data = new Tuple(
pdi.ImageID,
pdi.ImageName,
bmp
);
Clipboard.SetData("ProductImage", data);
}
private void PasteImageFromClipboard_Click(object sender, RoutedEventArgs e)
{
var pdi = Items.SelectedItem as PDI;
if (pdi == null)
return;
if (MessageBox.Show("Are you sure you wish to update the image for the selected product?", "Update Image", MessageBoxButton.YesNo,
MessageBoxImage.Question) != MessageBoxResult.Yes)
return;
Progress.Show("Updating Images");
var id = Guid.Empty;
var filename = "";
Bitmap bitmap = null;
if (Clipboard.ContainsData("ProductImage"))
{
var data = Clipboard.GetData("ProductImage") as Tuple;
id = data.Item1;
filename = data.Item2;
bitmap = data.Item3;
}
else if (Clipboard.ContainsImage())
{
var data = Clipboard.GetImage();
bitmap = data.AsBitmap2();
filename = string.Format("clip{0:yyyyMMddhhmmss}.png", DateTime.Now);
if (Clipboard.ContainsFileDropList())
{
var list = Clipboard.GetFileDropList();
if (list.Count > 0)
filename = Path.ChangeExtension(Path.GetFileName(list[0]), ".png");
}
//filename = String.Format("clip{0:yyyyMMddhhmmss}.png",DateTime.Now);
//bitmap.Save(filename);
id = Guid.Empty;
}
if (bitmap == null)
{
MessageBox.Show("Unable to paste data from clipboard");
return;
}
Progress.Show("");
UpdateProductImages(id, filename, bitmap);
Progress.Close();
MessageBox.Show(string.Format("Pasted [{0}] into [{1}]", Path.GetFileName(filename), SelectedProducts()));
}
private void ClearImage_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show("Are you sure you wish to clear the image for the selected product?", "Clear Image", MessageBoxButton.YesNo,
MessageBoxImage.Question) != MessageBoxResult.Yes)
return;
Progress.Show("Clearing Image");
UpdateProductImages(Guid.Empty, "", null);
Progress.Close();
MessageBox.Show(string.Format("Cleared image from [{0}]", string.Join(", ", SelectedProducts())));
}
private class PDI
{
public string Code { get; set; }
public string Name { get; set; }
public Guid ImageID { get; set; }
public string ImageName { get; set; }
public Guid ID { get; set; }
}
}
}