Interaction logic for PrintTemplate.XAML
Exemplo n.º 1
0
        /// <summary>The internal print.</summary>
        /// <param name="automaticPrint">if set to <c>true</c> [automatic print].</param>
        private void InternalPrint(bool automaticPrint)
        {
            var data = this.GetData(this.config.PrintUrl);
            var printTemplateViewModel = JsonConvert.DeserializeObject<PrintTemplateViewModel>(data);
            if (printTemplateViewModel == null || printTemplateViewModel.EinsatzData == null)
            {
                return;
            }

            PrintQueue printQueue = null;
            try
            {
                printQueue = LocalPrintServer.GetDefaultPrintQueue();
                if (printQueue == null)
                {
                    // No printer exist, return null PrintTicket
                    Logger.Info("No printer exists");
                    return;
                }

                // Get default PrintTicket from printer
                var printTicket = printQueue.DefaultPrintTicket;
                printTicket.CopyCount = automaticPrint
                                            ? this.config.NumberOfPagesOnEmergency
                                            : this.config.NumberOfPagesPerClick;

                var printCapabilites = printQueue.GetPrintCapabilities();

                // Modify PrintTicket
                if (printCapabilites.PageMediaSizeCapability.Any(x => x.PageMediaSizeName.Equals(PageMediaSizeName.ISOA4)))
                {
                    printTicket.PageMediaSize = printCapabilites.PageMediaSizeCapability.First(x => x.PageMediaSizeName.Equals(PageMediaSizeName.ISOA4));
                }

                if (printCapabilites.PageOrientationCapability.Contains(PageOrientation.Portrait))
                {
                    printTicket.PageOrientation = PageOrientation.Portrait;
                }

                if (printCapabilites.PageBorderlessCapability.Contains(PageBorderless.Borderless))
                {
                    printTicket.PageBorderless = PageBorderless.Borderless;
                }

                if (printCapabilites.CollationCapability.Contains(Collation.Collated))
                {
                    printTicket.Collation = Collation.Collated;
                }

                var doc = new FixedDocument();
                foreach (var emergencyData in printTemplateViewModel.EinsatzData)
                {
                    var item = emergencyData;
                    lock (this.printedMissionsLockObject)
                    {
                        if (automaticPrint && this.printedMissions.Any(x => x.EinsatzID.Equals(item.EinsatzID)))
                        {
                            continue;
                        }

                        var tempItem = this.printedMissions.FirstOrDefault(x => x.EinsatzID.Equals(item.EinsatzID));
                        if (tempItem != null
                            && tempItem.PublicInstancePropertiesEqual(
                                item, "Dispositionen", "MapUrl", "MapImage", "Area"))
                        {
                            tempItem.Dispositionen = item.Dispositionen; // Always update dispositions because of missing deep value comparison
                            item = tempItem;
                            Logger.DebugFormat(
                                "Using cached version of emergency ID '{0}'",
                                item.EinsatzID);
                        }
                        else
                        {
                            if (tempItem != null)
                            {
                                Logger.DebugFormat(
                                    "Removing emergency ID '{0}' from cache",
                                    tempItem.EinsatzID);
                                this.printedMissions.Remove(tempItem);
                            }

                            Logger.DebugFormat("Adding emergency ID '{0}' to cache", item.EinsatzID);
                            this.printedMissions.Add(item);
                        }
                    }

                    Logger.DebugFormat(
                        "Printing '{0}', # of copies={1}",
                        item.EinsatzID,
                        printTicket.CopyCount);

                    if (string.IsNullOrWhiteSpace(item.MapUrl))
                    {
                        var mapData =
                            this.GetData(
                                string.Format(
                                    "https://secure.florian10.info/ows/infoscreen/geo/staticmap.ashx?address={0}{1},%20{2}%20{3}",
                                    item.Strasse,
                                    string.IsNullOrWhiteSpace(item.Nummer1) ? string.Empty : "%20" + item.Nummer1,
                                    item.Plz,
                                    item.Ort));
                        if (!string.IsNullOrWhiteSpace(mapData))
                        {
                            var mapUrl =
                                mapData.Remove(mapData.Length - 2, 2)
                                    .Remove(0, 8)
                                    .Replace("&size=800x400&", "&size=640x640&scale=2&")
                                    .Replace("2.png", ".png")
                                    .Replace("&markers=icon:http://", "&markers=scale:2|icon:http://");
                            item.MapUrl = string.Format("{0}&maptype={1}", mapUrl, this.config.MapType.ToString().ToLowerInvariant());
                            var latLng =
                                mapData.Split('&')
                                    .First(x => x.StartsWith("center="))
                                    .Split(',')
                                    .Select(x => x.Replace("center=", string.Empty))
                                    .ToList();

                            if (latLng.Count() >= 2)
                            {
                                var areaJson =
                                    this.GetData(
                                        string.Format(
                                            "https://secure.florian10.info/ows/infoscreen/geo/umkreis.ashx?lat={0}&lng={1}",
                                            latLng[0],
                                            latLng[1]));
                                item.Area = JsonConvert.DeserializeObject<Area>(areaJson);
                            }
                        }
                    }

                    var fixedPage = new FixedPage();
                    var template = new PrintTemplate { DataContext = item };
                    if (printCapabilites.PageImageableArea != null)
                    {
                        template.Width = printCapabilites.PageImageableArea.ExtentWidth;
                        template.Height = printCapabilites.PageImageableArea.ExtentHeight;
                        FixedPage.SetLeft(template, printCapabilites.PageImageableArea.OriginWidth);
                        FixedPage.SetTop(template, printCapabilites.PageImageableArea.OriginHeight);
                    }

                    fixedPage.Children.Add(template);
                    var pageContent = new PageContent();
                    ((IAddChild)pageContent).AddChild(fixedPage);
                    doc.Pages.Add(pageContent);
                }

                if (doc.Pages.Any())
                {
                    Logger.Debug("Printing now");
                    PrintQueue.CreateXpsDocumentWriter(printQueue).Write(doc, printTicket);
                }
            }
            finally
            {
                if (printQueue != null)
                {
                    printQueue.Dispose();
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>The internal print.</summary>
        /// <param name="automaticPrint">if set to <c>true</c> [automatic print].</param>
        private void InternalPrint(bool automaticPrint)
        {
            var data = this.GetData(this.config.PrintUrl);
            var printTemplateViewModel = JsonConvert.DeserializeObject<PrintTemplateViewModel>(data);
            if (printTemplateViewModel?.EinsatzData == null)
            {
                return;
            }

            PrintQueue printQueue = null;
            try
            {
                printQueue = LocalPrintServer.GetDefaultPrintQueue();
                if (printQueue == null)
                {
                    // No printer exist, return null PrintTicket
                    // ReSharper disable once InconsistentlySynchronizedField
                    Logger.Info("No printer exists");
                    return;
                }

                // Get default PrintTicket from printer
                var printTicket = printQueue.DefaultPrintTicket;
                printTicket.CopyCount = automaticPrint
                                            ? this.config.NumberOfPagesOnEmergency
                                            : this.config.NumberOfPagesPerClick;

                var printCapabilites = printQueue.GetPrintCapabilities();

                // Modify PrintTicket
                if (printCapabilites.PageMediaSizeCapability.Any(x => x.PageMediaSizeName.Equals(PageMediaSizeName.ISOA4)))
                {
                    printTicket.PageMediaSize = printCapabilites.PageMediaSizeCapability.First(x => x.PageMediaSizeName.Equals(PageMediaSizeName.ISOA4));
                }

                if (printCapabilites.PageOrientationCapability.Contains(PageOrientation.Portrait))
                {
                    printTicket.PageOrientation = PageOrientation.Portrait;
                }

                if (printCapabilites.PageBorderlessCapability.Contains(PageBorderless.Borderless))
                {
                    printTicket.PageBorderless = PageBorderless.Borderless;
                }

                if (printCapabilites.CollationCapability.Contains(Collation.Collated))
                {
                    printTicket.Collation = Collation.Collated;
                }

                var doc = new FixedDocument();
                foreach (var emergencyData in printTemplateViewModel.EinsatzData)
                {
                    var item = emergencyData;
                    lock (this.printedMissionsLockObject)
                    {
                        if (automaticPrint && this.printedMissions.Any(x => x.EinsatzID.Equals(item.EinsatzID)))
                        {
                            continue;
                        }

                        var tempItem = this.printedMissions.FirstOrDefault(x => x.EinsatzID.Equals(item.EinsatzID));
                        if (tempItem != null
                            && tempItem.PublicInstancePropertiesEqual(
                                item, "Dispositionen", "MapUrl", "MapImage", "Area"))
                        {
                            tempItem.Dispositionen = item.Dispositionen; // Always update dispositions because of missing deep value comparison
                            item = tempItem;
                            Logger.DebugFormat(
                                "Using cached version of emergency ID '{0}'",
                                item.EinsatzID);
                        }
                        else
                        {
                            if (tempItem != null)
                            {
                                Logger.DebugFormat(
                                    "Removing emergency ID '{0}' from cache",
                                    tempItem.EinsatzID);
                                this.printedMissions.Remove(tempItem);
                            }

                            Logger.DebugFormat("Adding emergency ID '{0}' to cache", item.EinsatzID);
                            this.printedMissions.Add(item);
                        }
                    }

                    // ReSharper disable once InconsistentlySynchronizedField
                    Logger.DebugFormat(
                        "Printing '{0}', # of copies={1}",
                        item.EinsatzID,
                        printTicket.CopyCount);

                    if (string.IsNullOrWhiteSpace(item.MapUrl))
                    {
                        // Google Static Maps Developer Guide: https://developers.google.com/maps/documentation/static-maps/intro
                        // #if DEBUG
                        //                        var greyMap = new StaticMapRequest(new List<Marker>(), new ImageSize(640, 640));
                        //                        greyMap.Style = new List<MapStyle>
                        //                                             {
                        //                                                 new MapStyle
                        //                                                     {
                        //                                                         MapFeature = MapFeature.Landscape,
                        //                                                         Saturation = -100,
                        //                                                         Lightness = 65
                        //                                                     },
                        //                                                 new MapStyle
                        //                                                     {
                        //                                                         MapFeature = MapFeature.Poi,
                        //                                                         Saturation = -100,
                        //                                                         Lightness = 51,
                        //                                                         Visibility = MapVisibility.Simplified
                        //                                                     },
                        //                                                 new MapStyle
                        //                                                     {
                        //                                                         MapFeature = MapFeature.RoadHighway,
                        //                                                         Saturation = -100,
                        //                                                         Visibility = MapVisibility.Simplified
                        //                                                     },
                        //                                                 new MapStyle
                        //                                                     {
                        //                                                         MapFeature = MapFeature.RoadArterial,
                        //                                                         Saturation = -100,
                        //                                                         Lightness = 30
                        //                                                     },
                        //                                                 new MapStyle
                        //                                                     {
                        //                                                         MapFeature = MapFeature.RoadLocal,
                        //                                                         Saturation = -100,
                        //                                                         Lightness = 40
                        //                                                     },
                        //                                                 new MapStyle
                        //                                                     {
                        //                                                         MapFeature = MapFeature.Transit,
                        //                                                         Saturation = -100,
                        //                                                         Visibility = MapVisibility.Simplified
                        //                                                     },
                        //                                                 new MapStyle
                        //                                                     {
                        //                                                         MapFeature =
                        //                                                             MapFeature.AdministrativeProvince,
                        //                                                         Visibility = MapVisibility.Off
                        //                                                     },
                        //                                                 new MapStyle
                        //                                                     {
                        //                                                         MapFeature = MapFeature.Water,
                        //                                                         MapElement = MapElement.Labels,
                        //                                                         Saturation = -100,
                        //                                                         Lightness = -25
                        //                                                     },
                        //                                                 new MapStyle
                        //                                                     {
                        //                                                         MapFeature = MapFeature.Water,
                        //                                                         MapElement = MapElement.Geometry,
                        //                                                         Saturation = -97,
                        //                                                         Lightness = -25,
                        //                                                         HUE = Color.FromArgb(255, 255, 0)
                        //                                                     }
                        //                                             };
                        //                        var engine = new StaticMapsEngine();
                        //                        var url = engine.GenerateStaticMapUrl(greyMap);
                        // #endif
                        var mapData =
                            this.GetData(
                                $"https://secure.florian10.info/ows/infoscreen/geo/staticmap.ashx?address={item.Strasse}{(string.IsNullOrWhiteSpace(item.Nummer1) ? string.Empty : "%20" + item.Nummer1)},%20{item.Plz}%20{item.Ort}");
                        if (!string.IsNullOrWhiteSpace(mapData))
                        {
                            var mapUrl =
                                mapData.Remove(mapData.Length - 2, 2)
                                    .Remove(0, 8)
                                    .Replace("&size=800x400&", "&size=640x640&scale=2&")
                                    .Replace("2.png", ".png")
                                    .Replace("&markers=icon:http://", "&markers=scale:2|icon:http://");
                            item.MapUrl = $"{mapUrl}&maptype={this.config.MapType.ToString().ToLowerInvariant()}";
                            var latLng =
                                mapData.Split('&')
                                    .First(x => x.StartsWith("center="))
                                    .Split(',')
                                    .Select(x => x.Replace("center=", string.Empty))
                                    .ToList();

                            if (latLng.Count >= 2)
                            {
                                var areaJson =
                                    this.GetData(
                                        $"https://secure.florian10.info/ows/infoscreen/geo/umkreis.ashx?lat={latLng[0]}&lng={latLng[1]}");
                                item.Area = JsonConvert.DeserializeObject<Area>(areaJson);
                                item.Area.PointLimit = this.config.MaxHydrants;
                            }
                        }
                    }

                    var fixedPage = new FixedPage();
                    var template = new PrintTemplate { DataContext = item };
                    if (printCapabilites.PageImageableArea != null)
                    {
                        template.Width = printCapabilites.PageImageableArea.ExtentWidth;
                        template.Height = printCapabilites.PageImageableArea.ExtentHeight;
                        FixedPage.SetLeft(template, printCapabilites.PageImageableArea.OriginWidth);
                        FixedPage.SetTop(template, printCapabilites.PageImageableArea.OriginHeight);
                    }

                    fixedPage.Children.Add(template);
                    var pageContent = new PageContent();
                    ((IAddChild)pageContent).AddChild(fixedPage);
                    doc.Pages.Add(pageContent);
                }

                if (doc.Pages.Any())
                {
                    // ReSharper disable once InconsistentlySynchronizedField
                    Logger.Debug("Printing now");
                    PrintQueue.CreateXpsDocumentWriter(printQueue).Write(doc, printTicket);
                }
            }
            finally
            {
                printQueue?.Dispose();
            }
        }