using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Tango.BL.Entities;
using Tango.Integration.Operation;
using Tango.Logging;
namespace Tango.PPC.UI.Controls
{
///
/// Interaction logic for RunningJobViewerEureka.xaml
///
public partial class RunningJobViewerEureka : UserControl
{
List _segments;
List _lastsegments;
private double _prevOffset;
private double _addOffset;
private int _prevUnit;
private double _controlWidth;
public double ControlWidth
{
get { return _controlWidth; }
set {
_controlWidth = value;//for debug
}
}
///
/// Maybe not necessary!
///
public bool IsActive
{
get { return (bool)GetValue(IsActiveProperty); }
set { SetValue(IsActiveProperty, value); }
}
public static readonly DependencyProperty IsActiveProperty =
DependencyProperty.Register("IsActive", typeof(bool), typeof(RunningJobViewerEureka), new PropertyMetadata(false));
///
/// Gets or sets a value indicating whether summary markers.
///
public bool DisplayMarkers
{
get { return (bool)GetValue(DisplayMarkersProperty); }
set { SetValue(DisplayMarkersProperty, value); }
}
public static readonly DependencyProperty DisplayMarkersProperty =
DependencyProperty.Register("DisplayMarkers", typeof(bool), typeof(RunningJobViewerEureka), new PropertyMetadata(true));
///
/// Gets or sets the job.
///
public Job Job
{
get { return (Job)GetValue(JobProperty); }
set { SetValue(JobProperty, value); }
}
public static readonly DependencyProperty JobProperty =
DependencyProperty.Register("Job", typeof(Job), typeof(RunningJobViewerEureka), new PropertyMetadata(null, (d, e) => (d as RunningJobViewerEureka).OnUpdateJob()));
private void OnUpdateJob()
{
if(Job != null)
{
JobUnitLength = Job.Length;
_segments = Job.EffectiveSegments.ToList();
if (Job.NumberOfUnits > 1 && _segments.Count > 0
&& (_segments.Count > 1 || _segments[0].BrushStops.Count > 1))
{
if (Job.EnableInterSegment && Job.InterSegmentLength > 0)
{
_segments.Add(Job.CreateInterSegment(Job.InterSegmentLength));
}
_segments.AddRange(Job.EffectiveSegments.ToList());
if(Job.NumberOfUnits > 2 && Job.EnableInterSegment && Job.InterSegmentLength > 0)
{
_segments.Add(Job.CreateInterSegment(Job.InterSegmentLength));
JobUnitLength += Job.InterSegmentLength;
//_segments.AddRange(Job.EffectiveSegments.ToList());//third set to use in end printing without intersegment
}
_lastsegments = Job.EffectiveSegments.ToList();;
IsHasMultipleColorsSegments = true;
}
else
{
IsHasMultipleColorsSegments = false;
}
SegmentsItemsControl.ItemsSource = _segments;
SegmentsItemsControl.InvalidateVisual();
LastSegmentsItemsControl.ItemsSource = _lastsegments;
LastSegmentsItemsControl.InvalidateVisual();
_prevOffset = _addOffset = 0.0;
_prevUnit = 0;
ItemsBorder.SetValue(Canvas.LeftProperty, 0.0);
ItemsBorder.InvalidateVisual();
}
}
///
/// Gets or sets the running job status.
///
public RunningJobStatus RunningJobStatus
{
get { return (RunningJobStatus)GetValue(RunningJobStatusProperty); }
set { SetValue(RunningJobStatusProperty, value); }
}
public static readonly DependencyProperty RunningJobStatusProperty =
DependencyProperty.Register("RunningJobStatus", typeof(RunningJobStatus), typeof(RunningJobViewerEureka), new PropertyMetadata(null));
public double MinimumValue
{
get { return (double)GetValue(MinimumValueProperty); }
set { SetValue(MinimumValueProperty, value); }
}
///
/// The minimum value property
///
public static readonly DependencyProperty MinimumValueProperty =
DependencyProperty.RegisterAttached("MinimumValue", typeof(double), typeof(RunningJobViewerEureka),
new FrameworkPropertyMetadata(0.0));
public double MaximumValue
{
get { return (double)GetValue(MaximumValueProperty); }
set
{
SetValue(MaximumValueProperty, value);
}
}
///
/// The maximum value property
///
public static readonly DependencyProperty MaximumValueProperty =
DependencyProperty.RegisterAttached("MaximumValue", typeof(double), typeof(RunningJobViewerEureka),
new FrameworkPropertyMetadata(100.0, 0));
public double SliderValue
{
get { return (double)GetValue(SliderValueProperty); }
set { SetValue(SliderValueProperty, value); }
}
// Using a DependencyProperty as the backing store for SliderValue. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SliderValueProperty =
DependencyProperty.Register("SliderValue", typeof(double), typeof(RunningJobViewerEureka), new FrameworkPropertyMetadata((double)0.0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, (d, e) => (d as RunningJobViewerEureka).OnSliderValueChanged()));
public double HeightSlider
{
get { return (double)GetValue(HeightSliderProperty); }
set { SetValue(HeightSliderProperty, value); }
}
// Using a DependencyProperty as the backing store for HeightSlider. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HeightSliderProperty =
DependencyProperty.Register("HeightSlider", typeof(double), typeof(RunningJobViewerEureka), new FrameworkPropertyMetadata(0.0));
public double ThumbHeight
{
get { return (double)GetValue(ThumbHeightProperty); }
set { SetValue(ThumbHeightProperty, value); }
}
// Using a DependencyProperty as the backing store for ThumbHeight. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ThumbHeightProperty =
DependencyProperty.Register("ThumbHeight", typeof(double), typeof(RunningJobViewerEureka), new FrameworkPropertyMetadata(0.0));
public bool IsHasMultipleColorsSegments
{
get { return (bool)GetValue(IsHasMultipleColorsSegmentsProperty); }
set { SetValue(IsHasMultipleColorsSegmentsProperty, value); }
}
// Using a DependencyProperty as the backing store for IsHasMultipleColorsSegments. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsHasMultipleColorsSegmentsProperty =
DependencyProperty.Register("IsHasMultipleColorsSegments", typeof(bool), typeof(RunningJobViewerEureka), new PropertyMetadata(false));
public double JobUnitLength
{
get { return (double)GetValue(JobUnitLengthProperty); }
set { SetValue(JobUnitLengthProperty, value); }
}
// Using a DependencyProperty as the backing store for JobUnitLength. This enables animation, styling, binding, etc...
public static readonly DependencyProperty JobUnitLengthProperty =
DependencyProperty.Register("JobUnitLength", typeof(double), typeof(RunningJobViewerEureka), new FrameworkPropertyMetadata(0.0));
///
/// Initializes a new instance of the class.
///
public RunningJobViewerEureka()
{
InitializeComponent();
}
private void SliderContentControl_MouseDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}
private void SliderContentControl_TouchDown(object sender, TouchEventArgs e)
{
e.Handled = true;
}
private void OnSliderValueChanged()
{
if(slider_control != null)
{
slider_control.Value = SliderValue;
if(RunningJobStatus != null && RunningJobStatus.IsSettingUp == false && IsHasMultipleColorsSegments && ColorCanvas != null && ControlWidth > 0 && RunningJobStatus.CurrentUnitProgress > 0.01 && RunningJobStatus.CurrentUnitTotalProgress > 0)
{
double progress = RunningJobStatus.CurrentUnitProgress;
double total = RunningJobStatus.CurrentUnitTotalProgress;
int currentUnit = RunningJobStatus.CurrentUnit;
int totalUnits = RunningJobStatus.RemainingUnits + RunningJobStatus.CurrentUnit;//Job.NumberOfUnits;
double simpleoffset = ((progress / total) * ControlWidth) ;
double multiplier = (((double)(totalUnits - 1)) / (double)totalUnits);
double offset = simpleoffset * multiplier;
if(_prevUnit < currentUnit)
{
if(_prevOffset == 0)//resume
{
_prevOffset = ControlWidth * (1-multiplier) * currentUnit;
}
_addOffset = _prevOffset;
}
// Debug.WriteLine($"OnSliderValueChanged Offset: '{offset}' CurrentUnitProgress = {RunningJobStatus.CurrentUnitProgress} progress= {progress} currentUnit = {currentUnit}, total:{total}");
offset += _addOffset;
if (offset >= ControlWidth && currentUnit < (Job.NumberOfUnits - 2))
{
offset -= ControlWidth;//round
// Debug.WriteLine($"OnSliderValueChanged round!!! offset: '{offset}' currentUnit = {currentUnit}, total:{total}");
}
//if(currentUnit == (Job.NumberOfUnits - 1))
//{
// Debug.WriteLine($"OnSliderValueChanged offset: '{offset}' currentUnit = {currentUnit}. ControlWidth = {ControlWidth} total:{total}");
//}
_prevOffset = offset;
_prevUnit = currentUnit;
ItemsBorder.SetValue(Canvas.LeftProperty, (-1) * offset);
ItemsBorder.InvalidateVisual();
}
}
}
private void Slider_control_SizeChanged(object sender, SizeChangedEventArgs e)
{
ControlWidth = e.NewSize.Width;
}
}
}