Files
BeWoPlaner/BeWo/View/Detail/MailMergeWindow.xaml.cs
2018-02-19 10:52:48 +01:00

408 lines
15 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using BS.Shared.Extensions;
using BeWo.Annotations;
using BeWo.Core;
using BeWo.Office;
using BeWo.Office.TableModels;
using BeWo.ServiceProxy;
using BeWo.View.Navigation.Filter;
namespace BeWo.View.Detail
{
public partial class MailMergeWindow : INotifyPropertyChanged
{
internal CustomFilter _CustomFilter;
private bool _AutomatedUncheck;
public string TemplateTypeString { get; set; }
public BeWoView ParentView { get; set; }
private readonly List<IFilterableDC> _AllObjects;
public IEnumerable<IFilterableDC> AllObjects { get { return _AllObjects; } }
private readonly FileAttachmentType fileType = FileAttachmentType.NotSpecified;
private AbstractSorter mSorter;
public AbstractSorter Sorter
{
get
{
return mSorter;
}
set
{
mSorter = value;
SortCombo.Items.Clear();
if (mSorter == null) return;
SortPanel.Visibility = mSorter.SortItems.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
foreach (var item in mSorter.SortItems)
SortCombo.Items.Add(item);
SortCombo.SelectedIndex = 0;
}
}
private List<FileAttachmentDC> _WordTemplates;
public List<FileAttachmentDC> WordTemplates
{
get { return _WordTemplates; }
set
{
_WordTemplates = value;
OnPropertyChanged("WordTemplates");
}
}
private ObservableCollection<IFilterableDC> _SelectedForPrinting;
public ObservableCollection<IFilterableDC> SelectedForPrinting
{
get { return _SelectedForPrinting; }
set
{
_SelectedForPrinting = value;
OnPropertyChanged("SelectedForPrinting");
}
}
public CustomFilter CustomFilter
{
get
{
return _CustomFilter;
}
set
{
_CustomFilter = value;
OnPropertyChanged("CustomFilter");
}
}
public IEnumerable<IFilterableDC> AllListObjects
{
get
{
return ObjectListBox.Items.Cast<IFilterableDC>().ToList();
}
}
public MailMergeWindow(BeWoView parentView, Type templateType, List<IFilterableDC> allObjects, IFilterableDC selectedObject)
{
CommandBindings.Add(new CommandBinding(ApplicationCommands.Close, (s, e) => Close()));
_SelectedForPrinting = new ObservableCollection<IFilterableDC>();
InitializeComponent();
ParentView = parentView;
_AllObjects = allObjects;
Owner = parentView == null ? BeWoApp.CurrentBeWo.MainWindow : GetWindow(parentView);
if (BeWoApp.MainControl.ModalPopupBackGround == null)
BeWoApp.MainControl.ShowModalBackground();
DataContext = this;
if (templateType == typeof (SupportConceptDC))
{
TemplateTypeString = "Hilfepläne";
ObjectListBox.Background = BeWoApp.CurrentBeWo.Resources["SupportConceptListBrush"] as Brush;
fileType = FileAttachmentType.SupportConceptTemplate;
ChkShowOnlyMyObjects.Content = "Nur meine Hilfepläne anzeigen";
ChkShowArchived.Content = "Archivierte Hilfepläne anzeigen";
}
else if (templateType == typeof (CustomerDC))
{
TemplateTypeString = "Klienten";
ObjectListBox.Background = BeWoApp.CurrentBeWo.Resources["CustomerContentBrush"] as Brush;
fileType = FileAttachmentType.CustomerTemplate;
ChkShowOnlyMyObjects.Content = "Nur meine Klienten anzeigen";
ChkShowArchived.Content = "Archivierte Klienten anzeigen";
}
else if (templateType == typeof(PersonDC))
{
ObjectListBox.Background = BeWoApp.CurrentBeWo.Resources["PersonContentBrush"] as Brush;
fileType = FileAttachmentType.PersonTemplate;
ChkShowOnlyMyObjects.Visibility = Visibility.Collapsed;
ChkShowArchived.Content = "Archivierte Personen anzeigen";
}
else if (templateType == typeof(OrganisationDC))
{
ObjectListBox.Background = BeWoApp.CurrentBeWo.Resources["OrganisationContentBrush"] as Brush;
fileType = FileAttachmentType.OrganisationTemplate;
ChkShowOnlyMyObjects.Visibility = Visibility.Collapsed;
ChkShowArchived.Content = "Archivierte Organisationen anzeigen";
}
Closing += delegate { BeWoApp.MainControl.CloseCurrentPopUp(); };
ServiceFacade.DoOperationsServiceAsync(s => s.GetFileAttachmentInfoByType(fileType), cb => { WordTemplates = cb; });
ObjectListBox.DataContext = AllObjects.ToObservableSortCollection();
CreateNewCustomFilter();
}
private void CreateNewCustomFilter()
{
var filter = new CustomFilter();
switch (fileType)
{
case FileAttachmentType.CustomerTemplate:
//filter = new CustomerNavigationFilter { ShowOnlyMyCustomers = ChkShowOnlyMyObjects.IsChecked != null && ChkShowOnlyMyObjects.IsChecked.Value };
break;
case FileAttachmentType.SupportConceptTemplate:
//filter = new SupportConceptNavigationFilter { ShowOnlyMySupportConcepts = ChkShowOnlyMyObjects.IsChecked != null && ChkShowOnlyMyObjects.IsChecked.Value };
break;
}
CustomFilter = filter;
}
private void PrintBtnClick(object sender, RoutedEventArgs e)
{
DownloadFileAttachment("Drucken");
}
private void PreviewBtnClick(object sender, RoutedEventArgs e)
{
DownloadFileAttachment("Vorschau");
}
private void DownloadFileAttachment(string action)
{
var file = new FileAttachmentDC();
var fobj = (FileAttachmentDC) VorlagenComboBox.SelectedItem;
if (!fobj.FileAttachmentOid.HasValue) return;
var fid = fobj.FileAttachmentOid.Value;
var extension = Path.GetExtension(((FileAttachmentDC) VorlagenComboBox.SelectedItem).FileName);
if (extension != null && (!extension.Equals(".docx") && !extension.Equals(".doc")))
{
MessageBox.Show("Dieses Dateiformat wird leider nicht unterstützt. Bitte benutzen Sie nur .docx oder .doc Dateien.", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
ServiceFacade.DoDownloadServiceAsync(f => file = f.GetFileAttachment(fid), cb =>
{
var tmp = Path.GetTempPath() + Path.GetFileName(file.URL);
using (var uFileStream = File.Create(tmp))
{
uFileStream.Write(file.BinaryData, 0, file.BinaryData.Length);
uFileStream.Close();
switch (action)
{
case "Drucken":
PrintMailMerge(tmp, ViewDestination.Printer);
break;
case "Vorschau":
PrintMailMerge(tmp, ViewDestination.Preview);
break;
}
uFileStream.Dispose();
}
});
}
private void PrintMailMerge(string path, ViewDestination viewDestination)
{
var wordProcessor = new WordProcessor
{
DocumentPath = path,
CreateFormLetter = true
};
List<CustomerDC> customers = null;
List<PersonDC> persons = null;
List<OrganisationDC> organisations = null;
List<SupportConceptDC> supportConcepts = null;
var contractIds = new List<long>();
if (fileType == FileAttachmentType.CustomerTemplate)
{
contractIds.AddRange(SelectedForPrinting.Select(customer => ((CompactCustomerDC)customer).CustomerOid));
ServiceFacade.DoCustomerServiceSync(cs => customers = cs.GetCustomersById(contractIds));
if (customers != null)
wordProcessor.TableModel = new CustomerTableModel {Customers = customers};
}
else if (fileType == FileAttachmentType.PersonTemplate)
{
contractIds.AddRange(SelectedForPrinting.Select(person => ((CompactPersonDC)person).PersonOid));
ServiceFacade.DoCustomerServiceSync(p => persons = p.GetPersonsById(contractIds));
if (persons != null)
wordProcessor.TableModel = new PersonTableModel { Persons = persons };
}
else if (fileType == FileAttachmentType.SupportConceptTemplate)
{
contractIds.AddRange(SelectedForPrinting.Select(supportConcept => ((CompactSupportConceptDC)supportConcept).SupportConceptOid));
ServiceFacade.DoCustomerServiceSync(s => supportConcepts = s.GetSupportConceptsById(contractIds));
if (supportConcepts != null)
wordProcessor.TableModel = new SupportConceptTableModel { SupportConcepts = supportConcepts };
}
else if (fileType == FileAttachmentType.OrganisationTemplate)
{
contractIds.AddRange(SelectedForPrinting.Select(organistation => ((CompactOrganisationDC)organistation).OrganisationOid));
ServiceFacade.DoCustomerServiceSync(o => organisations = o.GetOrganisationsById(contractIds));
if (organisations != null)
wordProcessor.TableModel = new OrganisationTableModel { Organisations = organisations };
}
wordProcessor.CreateReport(viewDestination, null, null);
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
if (!e.Cancel && Owner != null) Owner.Focus();
}
private void CheckBoxChecked(object checkBox, RoutedEventArgs e)
{
var checkedDC = (IFilterableDC) ((CheckBox) checkBox).Tag;
if(!SelectedForPrinting.Contains(checkedDC))
SelectedForPrinting.Add(checkedDC);
}
private void CheckBoxUnChecked(object checkBox, RoutedEventArgs e)
{
var checkedDC = (IFilterableDC)((CheckBox)checkBox).Tag;
if (SelectedForPrinting.Contains(checkedDC))
SelectedForPrinting.Remove(checkedDC);
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
private void ChkShowOnlyMyObjects_OnClick(object sender, RoutedEventArgs e)
{
CreateNewCustomFilter();
OnPropertyChanged("SelectedForPrinting");
}
private void SortDirectionToggleButton_Click(object sender, RoutedEventArgs e)
{
SortSearchResult(ObjectListBox.ItemsSource as IEnumerable<IFilterableDC>);
}
private void SortCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0)
SortSearchResult(e.AddedItems[0] as SortItem, ObjectListBox.ItemsSource as IEnumerable<IFilterableDC>);
}
public void SortSearchResult(IEnumerable<IFilterableDC> result)
{
if (mSorter == null)
{
ObjectListBox.DataContext = result.ToObservableSortCollection();
}
else
{
var item = SortCombo.SelectedItem as SortItem;
if (item != null)
SortSearchResult(item, result);
}
}
public void SortSearchResult(SortItem item, IEnumerable<IFilterableDC> result)
{
if (mSorter == null || item == null) return;
var items = result;
if (items == null) return;
var dir = AbstractSorter.SortDirection.Ascending;
if (SortDirectionToggleButton.IsChecked != null && SortDirectionToggleButton.IsChecked.Value)
dir = AbstractSorter.SortDirection.Descending;
ObjectListBox.DataContext = items.ToObservableSortCollection(mSorter.GetComparison(item, dir));
}
private void AlleWaehlenCheckBox_OnChecked(object sender, RoutedEventArgs e)
{
SelectedForPrinting.Clear();
SelectedForPrinting.AddRange(AllListObjects);
OnPropertyChanged("SelectedForPrinting");
}
private void AlleWehlenCheckBox_OnUnchecked(object sender, RoutedEventArgs e)
{
if (_AutomatedUncheck)
{
_AutomatedUncheck = false;
return;
}
SelectedForPrinting.Clear();
OnPropertyChanged("SelectedForPrinting");
}
private void ChkShowArchived_OnUnchecked(object sender, RoutedEventArgs e)
{
_AutomatedUncheck = true;
AlleWaehlenCheckBox.IsChecked = false;
}
}
public class ListBoxItemStyleSelector : StyleSelector
{
public Style SupportConceptStyle { get; set; }
public Style PersonStyle { get; set; }
public Style OrganisationStyle { get; set; }
public Style CustomerStyle { get; set; }
public override Style SelectStyle(object item, DependencyObject container)
{
var itemType = item.GetType();
if (itemType == typeof (CompactSupportConceptDC))
{
return SupportConceptStyle;
}
if (itemType == typeof(CompactPersonDC))
{
return PersonStyle;
}
return itemType == typeof(CompactOrganisationDC) ? OrganisationStyle : CustomerStyle;
}
}
}