aboutsummaryrefslogtreecommitdiffstats
path: root/plugin/50-extmarks.lua
blob: 1324da0a884f1dda2f4997b3a3a036ff0d332dba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
--
-- TODO highlighting (treesitter-aware extmarks)
--
-- The `dotfiles.Todo` highlight group and the storage namespace are owned by
-- 40-colors.lua, because the same per-window namespaces also drive the
-- focused/unfocused cursor line. That file is numbered 40- so it is sourced
-- before this one and `vim.g.dotfiles.todo_ns` / `.todo_hl` exist below. Here
-- we only place the extmarks.

-- Returns an iterator over the ascendants of `node`, starting at the root node
local function node_ascendants(node)
	local root = node:tree():root()
	local current = root
	return function()
		if current:equal(node) then
			return nil
		end
		current = assert(current:child_with_descendant(node))
		return current
	end
end

-- Returns true if `node` or any of its parent has the type `type`
local function node_within_type(node, type)
	local next_ascendant = node_ascendants(node)
	local next = next_ascendant()
	while next do
		if next:type() == type then
			return true
		end
		next = next_ascendant()
	end
	return false
end

-- Returns an iterator over the positions (`{ col1, col2, row }`) of matches of pattern in lines
local function pmatches(lines, pattern)
	local col1, col2, row = nil, nil, 1
	return function()
		while row <= #lines do
			col1, col2 = string.find(lines[row], pattern, (col2 or 0) + 1)
			if col1 then
				return { col1 = col1, col2 = col2, row = row }
			else
				col1, col2, row = 0, 0, row + 1
			end
		end
		return nil
	end
end

-- Set extmarks are the positions (`{ col1, col2, row }`) given by `next_pos()`
-- `opts`: {
--     ns: highlight namespace
--     predicate: is passed row and col, if true then set the mark
--     hl_group: highlight group
--  }
local function set_extmarks(buf, next_pos, opts)
	for pos in next_pos do
		local marks = vim.api.nvim_buf_get_extmarks(
			buf,
			opts.ns,
			{ pos.row - 1, pos.col1 - 1 },
			{ pos.row - 1, pos.col2 - 1 },
			{}
		)
		if #marks == 0 and opts.predicate(buf, pos.row - 1, pos.col1 - 1) then
			vim.api.nvim_buf_set_extmark(
				buf,
				opts.ns,
				pos.row - 1,
				pos.col1 - 1,
				{ end_col = pos.col2, hl_group = opts.hl_group }
			)
		end
	end
end

-- TODO a better way to do this:
-- For code, only check in "comment" node ranges
-- For non-code, do it per type. For Markdown, only check "paragraph" nodes
local function hl_todo_predicate(buf, row, col)
	if vim.bo[buf].filetype == "markdown" or vim.treesitter.get_parser(buf) == nil then
		return true
	end
	local node = assert(vim.treesitter.get_node({ bufnr = buf, pos = { row, col } }))
	return node_within_type(node, "comment")
end

local patterns = { todo = "TODO" }
local extmarks_todo_opts = {
	ns = vim.g.dotfiles.todo_ns,
	hl_group = vim.g.dotfiles.todo_hl,
	predicate = hl_todo_predicate,
}

local function scan(buf, first, last)
	local lines = vim.api.nvim_buf_get_lines(buf, first, last, false)
	local iter = pmatches(lines, patterns.todo)
	set_extmarks(buf, function()
		local pos = iter()
		if pos then
			pos.row = pos.row + first
		end
		return pos
	end, extmarks_todo_opts)
end

vim.api.nvim_create_autocmd("FileType", {
	desc = "Initialize and watch TODO extmarks",
	group = vim.g.dotfiles.augroup,
	callback = function(args)
		local buf = args.buf
		scan(buf, 0, -1)
		if vim.b[buf].dotfiles_todo_attached then
			return
		end
		vim.b[buf].dotfiles_todo_attached = true
		vim.api.nvim_buf_attach(buf, false, {
			on_lines = function(_, b, _, first, _, last_new)
				vim.schedule(function()
					if vim.api.nvim_buf_is_valid(b) then
						scan(b, first, last_new)
					end
				end)
			end,
		})
	end,
})
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Tango Observables Generator
// 
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. Do not modify!
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Xml.Serialization;
using Newtonsoft.Json;
using System.Linq;
using Tango.DAL.Remote.DB;
using Tango.Core;
using System.ComponentModel;
using Tango.Core.CustomAttributes;

namespace Tango.BL.Entities
{
    [Table("JOB_RUNS")]
    public abstract class JobRunBase : ObservableEntity<JobRun>
    {

        public event EventHandler<String> JobNameChanged;

        public event EventHandler<Int32> JobDesignationChanged;

        public event EventHandler<Int32> JobSourceChanged;

        public event EventHandler<String> JobStringChanged;

        public event EventHandler<DateTime> StartDateChanged;

        public event EventHandler<Nullable<DateTime>> UploadingStartDateChanged;

        public event EventHandler<Nullable<DateTime>> HeatingStartDateChanged;

        public event EventHandler<Nullable<DateTime>> ActualStartDateChanged;

        public event EventHandler<DateTime> EndDateChanged;

        public event EventHandler<Int32> StatusChanged;

        public event EventHandler<Double> JobLengthChanged;

        public event EventHandler<Boolean> IsGradientChanged;

        public event EventHandler<Int32> GradientResolutionCmChanged;

        public event EventHandler<String> LiquidQuantityStringChanged;

        public event EventHandler<Int32> CyanQuantityChanged;

        public event EventHandler<Int32> MagentaQuantityChanged;

        public event EventHandler<Int32> YellowQuantityChanged;

        public event EventHandler<Int32> BlackQuantityChanged;

        public event EventHandler<Int32> TransparentQuantityChanged;

        public event EventHandler<Int32> LubricantQuantityChanged;

        public event EventHandler<Int32> CleanerQuantityChanged;

        public event EventHandler<Double> EndPositionChanged;

        public event EventHandler<String> FailedMessageChanged;

        public event EventHandler<Boolean> IsSynchronizedChanged;

        protected String _machineguid;

        /// <summary>
        /// Gets or sets the jobrunbase machine guid.
        /// </summary>

        [Column("MACHINE_GUID")]

        public  String MachineGuid
        {
            get 
            {
                return _machineguid; 
            }

            set 
            {
                if (_machineguid != value)
                {
                    _machineguid = value;

                }
            }
        }

        protected String _jobguid;

        /// <summary>
        /// Gets or sets the jobrunbase job guid.
        /// </summary>

        [Column("JOB_GUID")]

        public  String JobGuid
        {
            get 
            {
                return _jobguid; 
            }

            set 
            {
                if (_jobguid != value)
                {
                    _jobguid = value;

                }
            }
        }

        protected String _rmlguid;

        /// <summary>
        /// Gets or sets the jobrunbase rml guid.
        /// </summary>

        [Column("RML_GUID")]

        public  String RmlGuid
        {
            get 
            {
                return _rmlguid; 
            }

            set 
            {
                if (_rmlguid != value)
                {
                    _rmlguid = value;

                }
            }
        }

        protected String _userguid;

        /// <summary>
        /// Gets or sets the jobrunbase user guid.
        /// </summary>

        [Column("USER_GUID")]

        public  String UserGuid
        {
            get 
            {
                return _userguid; 
            }

            set 
            {
                if (_userguid != value)
                {
                    _userguid = value;

                }
            }
        }

        protected String _jobname;

        /// <summary>
        /// Gets or sets the jobrunbase job name.
        /// </summary>

        [Column("JOB_NAME")]

        public  String JobName
        {
            get 
            {
                return _jobname; 
            }

            set 
            {
                if (_jobname != value)
                {
                    _jobname = value;

                    OnJobNameChanged(value);

                }
            }
        }

        protected Int32 _jobdesignation;

        /// <summary>
        /// Gets or sets the jobrunbase job designation.
        /// </summary>

        [Column("JOB_DESIGNATION")]

        public  Int32 JobDesignation
        {
            get 
            {
                return _jobdesignation; 
            }

            set 
            {
                if (_jobdesignation != value)
                {
                    _jobdesignation = value;

                    OnJobDesignationChanged(value);

                }
            }
        }

        protected Int32 _jobsource;

        /// <summary>
        /// Gets or sets the jobrunbase job source.
        /// </summary>

        [Column("JOB_SOURCE")]

        public  Int32 JobSource
        {
            get 
            {
                return _jobsource; 
            }

            set 
            {
                if (_jobsource != value)
                {
                    _jobsource = value;

                    OnJobSourceChanged(value);

                }
            }
        }

        protected String _jobstring;

        /// <summary>
        /// Gets or sets the jobrunbase job string.
        /// </summary>

        [Column("JOB_STRING")]

        public  String JobString
        {
            get 
            {
                return _jobstring; 
            }

            set 
            {
                if (_jobstring != value)
                {
                    _jobstring = value;

                    OnJobStringChanged(value);

                }
            }
        }

        protected DateTime _startdate;

        /// <summary>
        /// Gets or sets the jobrunbase start date.
        /// </summary>

        [Column("START_DATE")]

        public  DateTime StartDate
        {
            get 
            {
                return _startdate; 
            }

            set 
            {
                if (_startdate != value)
                {
                    _startdate = value;

                    OnStartDateChanged(value);

                }
            }
        }

        protected Nullable<DateTime> _uploadingstartdate;

        /// <summary>
        /// Gets or sets the jobrunbase uploading start date.
        /// </summary>

        [Column("UPLOADING_START_DATE")]

        public  Nullable<DateTime> UploadingStartDate
        {
            get 
            {
                return _uploadingstartdate; 
            }

            set 
            {
                if (_uploadingstartdate != value)
                {
                    _uploadingstartdate = value;

                    OnUploadingStartDateChanged(value);

                }
            }
        }

        protected Nullable<DateTime> _heatingstartdate;

        /// <summary>
        /// Gets or sets the jobrunbase heating start date.
        /// </summary>

        [Column("HEATING_START_DATE")]

        public  Nullable<DateTime> HeatingStartDate
        {
            get 
            {
                return _heatingstartdate; 
            }

            set 
            {
                if (_heatingstartdate != value)
                {
                    _heatingstartdate = value;

                    OnHeatingStartDateChanged(value);

                }
            }
        }

        protected Nullable<DateTime> _actualstartdate;

        /// <summary>
        /// Gets or sets the jobrunbase actual start date.
        /// </summary>

        [Column("ACTUAL_START_DATE")]

        public  Nullable<DateTime> ActualStartDate
        {
            get 
            {
                return _actualstartdate; 
            }

            set 
            {
                if (_actualstartdate != value)
                {
                    _actualstartdate = value;

                    OnActualStartDateChanged(value);

                }
            }
        }

        protected DateTime _enddate;

        /// <summary>
        /// Gets or sets the jobrunbase end date.
        /// </summary>

        [Column("END_DATE")]

        public  DateTime EndDate
        {
            get 
            {
                return _enddate; 
            }

            set 
            {
                if (_enddate != value)
                {
                    _enddate = value;

                    OnEndDateChanged(value);

                }
            }
        }

        protected Int32 _status;

        /// <summary>
        /// 0 = COMPLETED
        /// 1 = ABORTED
        /// 2 = FAILED
        /// </summary>

        [Column("STATUS")]

        public  Int32 Status
        {
            get 
            {
                return _status; 
            }

            set 
            {
                if (_status != value)
                {
                    _status = value;

                    OnStatusChanged(value);

                }
            }
        }

        protected Double _joblength;

        /// <summary>
        /// Gets or sets the jobrunbase job length.
        /// </summary>

        [Column("JOB_LENGTH")]

        public  Double JobLength
        {
            get 
            {
                return _joblength; 
            }

            set 
            {
                if (_joblength != value)
                {
                    _joblength = value;

                    OnJobLengthChanged(value);

                }
            }
        }

        protected Boolean _isgradient;

        /// <summary>
        /// Gets or sets the jobrunbase is gradient.
        /// </summary>

        [Column("IS_GRADIENT")]

        public  Boolean IsGradient
        {
            get 
            {
                return _isgradient; 
            }

            set 
            {
                if (_isgradient != value)
                {
                    _isgradient = value;

                    OnIsGradientChanged(value);

                }
            }
        }

        protected Int32 _gradientresolutioncm;

        /// <summary>
        /// Gets or sets the jobrunbase gradient resolution cm.
        /// </summary>

        [Column("GRADIENT_RESOLUTION_CM")]

        public  Int32 GradientResolutionCm
        {
            get 
            {
                return _gradientresolutioncm; 
            }

            set 
            {
                if (_gradientresolutioncm != value)
                {
                    _gradientresolutioncm = value;

                    OnGradientResolutionCmChanged(value);

                }
            }
        }

        protected String _liquidquantitystring;

        /// <summary>
        /// Gets or sets the jobrunbase liquid quantity string.
        /// </summary>

        [Column("LIQUID_QUANTITY_STRING")]

        public  String LiquidQuantityString
        {
            get 
            {
                return _liquidquantitystring; 
            }

            set 
            {
                if (_liquidquantitystring != value)
                {
                    _liquidquantitystring = value;

                    OnLiquidQuantityStringChanged(value);

                }
            }
        }

        protected Int32 _cyanquantity;

        /// <summary>
        /// Gets or sets the jobrunbase cyan quantity.
        /// </summary>

        [Column("CYAN_QUANTITY")]

        public  Int32 CyanQuantity
        {
            get 
            {
                return _cyanquantity; 
            }

            set 
            {
                if (_cyanquantity != value)
                {
                    _cyanquantity = value;

                    OnCyanQuantityChanged(value);

                }
            }
        }

        protected Int32 _magentaquantity;

        /// <summary>
        /// Gets or sets the jobrunbase magenta quantity.
        /// </summary>

        [Column("MAGENTA_QUANTITY")]

        public  Int32 MagentaQuantity
        {
            get 
            {
                return _magentaquantity; 
            }

            set 
            {
                if (_magentaquantity != value)
                {
                    _magentaquantity = value;

                    OnMagentaQuantityChanged(value);

                }
            }
        }

        protected Int32 _yellowquantity;

        /// <summary>
        /// Gets or sets the jobrunbase yellow quantity.
        /// </summary>

        [Column("YELLOW_QUANTITY")]

        public  Int32 YellowQuantity
        {
            get 
            {
                return _yellowquantity; 
            }

            set 
            {
                if (_yellowquantity != value)
                {
                    _yellowquantity = value;

                    OnYellowQuantityChanged(value);

                }
            }
        }

        protected Int32 _blackquantity;

        /// <summary>
        /// Gets or sets the jobrunbase black quantity.
        /// </summary>

        [Column("BLACK_QUANTITY")]

        public  Int32 BlackQuantity
        {
            get 
            {
                return _blackquantity; 
            }

            set 
            {
                if (_blackquantity != value)
                {
                    _blackquantity = value;

                    OnBlackQuantityChanged(value);

                }
            }
        }

        protected Int32 _transparentquantity;

        /// <summary>
        /// Gets or sets the jobrunbase transparent quantity.
        /// </summary>

        [Column("TRANSPARENT_QUANTITY")]

        public  Int32 TransparentQuantity
        {
            get 
            {
                return _transparentquantity; 
            }

            set 
            {
                if (_transparentquantity != value)
                {
                    _transparentquantity = value;

                    OnTransparentQuantityChanged(value);

                }
            }
        }

        protected Int32 _lubricantquantity;

        /// <summary>
        /// Gets or sets the jobrunbase lubricant quantity.
        /// </summary>

        [Column("LUBRICANT_QUANTITY")]

        public  Int32 LubricantQuantity
        {
            get 
            {
                return _lubricantquantity; 
            }

            set 
            {
                if (_lubricantquantity != value)
                {
                    _lubricantquantity = value;

                    OnLubricantQuantityChanged(value);

                }
            }
        }

        protected Int32 _cleanerquantity;

        /// <summary>
        /// Gets or sets the jobrunbase cleaner quantity.
        /// </summary>

        [Column("CLEANER_QUANTITY")]

        public  Int32 CleanerQuantity
        {
            get 
            {
                return _cleanerquantity; 
            }

            set 
            {
                if (_cleanerquantity != value)
                {
                    _cleanerquantity = value;

                    OnCleanerQuantityChanged(value);

                }
            }
        }

        protected Double _endposition;

        /// <summary>
        /// Gets or sets the jobrunbase end position.
        /// </summary>

        [Column("END_POSITION")]

        public  Double EndPosition
        {
            get 
            {
                return _endposition; 
            }

            set 
            {
                if (_endposition != value)
                {
                    _endposition = value;

                    OnEndPositionChanged(value);

                }
            }
        }

        protected String _failedmessage;

        /// <summary>
        /// Gets or sets the jobrunbase failed message.
        /// </summary>

        [Column("FAILED_MESSAGE")]

        public  String FailedMessage
        {
            get 
            {
                return _failedmessage; 
            }

            set 
            {
                if (_failedmessage != value)
                {
                    _failedmessage = value;

                    OnFailedMessageChanged(value);

                }
            }
        }

        protected Boolean _issynchronized;

        /// <summary>
        /// Gets or sets the jobrunbase is synchronized.
        /// </summary>

        [Column("IS_SYNCHRONIZED")]

        public  Boolean IsSynchronized
        {
            get 
            {
                return _issynchronized; 
            }

            set 
            {
                if (_issynchronized != value)
                {
                    _issynchronized = value;

                    OnIsSynchronizedChanged(value);

                }
            }
        }

        /// <summary>
        /// Called when the JobName has changed.
        /// </summary>
        protected virtual void OnJobNameChanged(String jobname)
        {
            JobNameChanged?.Invoke(this, jobname);
            RaisePropertyChanged(nameof(JobName));
        }

        /// <summary>
        /// Called when the JobDesignation has changed.
        /// </summary>
        protected virtual void OnJobDesignationChanged(Int32 jobdesignation)
        {
            JobDesignationChanged?.Invoke(this, jobdesignation);
            RaisePropertyChanged(nameof(JobDesignation));
        }

        /// <summary>
        /// Called when the JobSource has changed.
        /// </summary>
        protected virtual void OnJobSourceChanged(Int32 jobsource)
        {
            JobSourceChanged?.Invoke(this, jobsource);
            RaisePropertyChanged(nameof(JobSource));
        }

        /// <summary>
        /// Called when the JobString has changed.
        /// </summary>
        protected virtual void OnJobStringChanged(String jobstring)
        {
            JobStringChanged?.Invoke(this, jobstring);
            RaisePropertyChanged(nameof(JobString));
        }

        /// <summary>
        /// Called when the StartDate has changed.
        /// </summary>
        protected virtual void OnStartDateChanged(DateTime startdate)
        {
            StartDateChanged?.Invoke(this, startdate);
            RaisePropertyChanged(nameof(StartDate));
        }

        /// <summary>
        /// Called when the UploadingStartDate has changed.
        /// </summary>
        protected virtual void OnUploadingStartDateChanged(Nullable<DateTime> uploadingstartdate)
        {
            UploadingStartDateChanged?.Invoke(this, uploadingstartdate);
            RaisePropertyChanged(nameof(UploadingStartDate));
        }

        /// <summary>
        /// Called when the HeatingStartDate has changed.
        /// </summary>
        protected virtual void OnHeatingStartDateChanged(Nullable<DateTime> heatingstartdate)
        {
            HeatingStartDateChanged?.Invoke(this, heatingstartdate);
            RaisePropertyChanged(nameof(HeatingStartDate));
        }

        /// <summary>
        /// Called when the ActualStartDate has changed.
        /// </summary>
        protected virtual void OnActualStartDateChanged(Nullable<DateTime> actualstartdate)
        {
            ActualStartDateChanged?.Invoke(this, actualstartdate);
            RaisePropertyChanged(nameof(ActualStartDate));
        }

        /// <summary>
        /// Called when the EndDate has changed.
        /// </summary>
        protected virtual void OnEndDateChanged(DateTime enddate)
        {
            EndDateChanged?.Invoke(this, enddate);
            RaisePropertyChanged(nameof(EndDate));
        }

        /// <summary>
        /// Called when the Status has changed.
        /// </summary>
        protected virtual void OnStatusChanged(Int32 status)
        {
            StatusChanged?.Invoke(this, status);
            RaisePropertyChanged(nameof(Status));
        }

        /// <summary>
        /// Called when the JobLength has changed.
        /// </summary>
        protected virtual void OnJobLengthChanged(Double joblength)
        {
            JobLengthChanged?.Invoke(this, joblength);
            RaisePropertyChanged(nameof(JobLength));
        }

        /// <summary>
        /// Called when the IsGradient has changed.
        /// </summary>
        protected virtual void OnIsGradientChanged(Boolean isgradient)
        {
            IsGradientChanged?.Invoke(this, isgradient);
            RaisePropertyChanged(nameof(IsGradient));
        }

        /// <summary>
        /// Called when the GradientResolutionCm has changed.
        /// </summary>
        protected virtual void OnGradientResolutionCmChanged(Int32 gradientresolutioncm)
        {
            GradientResolutionCmChanged?.Invoke(this, gradientresolutioncm);
            RaisePropertyChanged(nameof(GradientResolutionCm));
        }

        /// <summary>
        /// Called when the LiquidQuantityString has changed.
        /// </summary>
        protected virtual void OnLiquidQuantityStringChanged(String liquidquantitystring)
        {
            LiquidQuantityStringChanged?.Invoke(this, liquidquantitystring);
            RaisePropertyChanged(nameof(LiquidQuantityString));
        }

        /// <summary>
        /// Called when the CyanQuantity has changed.
        /// </summary>
        protected virtual void OnCyanQuantityChanged(Int32 cyanquantity)
        {
            CyanQuantityChanged?.Invoke(this, cyanquantity);
            RaisePropertyChanged(nameof(CyanQuantity));
        }

        /// <summary>
        /// Called when the MagentaQuantity has changed.
        /// </summary>
        protected virtual void OnMagentaQuantityChanged(Int32 magentaquantity)
        {
            MagentaQuantityChanged?.Invoke(this, magentaquantity);
            RaisePropertyChanged(nameof(MagentaQuantity));
        }

        /// <summary>
        /// Called when the YellowQuantity has changed.
        /// </summary>
        protected virtual void OnYellowQuantityChanged(Int32 yellowquantity)
        {
            YellowQuantityChanged?.Invoke(this, yellowquantity);
            RaisePropertyChanged(nameof(YellowQuantity));
        }

        /// <summary>
        /// Called when the BlackQuantity has changed.
        /// </summary>
        protected virtual void OnBlackQuantityChanged(Int32 blackquantity)
        {
            BlackQuantityChanged?.Invoke(this, blackquantity);
            RaisePropertyChanged(nameof(BlackQuantity));
        }

        /// <summary>
        /// Called when the TransparentQuantity has changed.
        /// </summary>
        protected virtual void OnTransparentQuantityChanged(Int32 transparentquantity)
        {
            TransparentQuantityChanged?.Invoke(this, transparentquantity);
            RaisePropertyChanged(nameof(TransparentQuantity));
        }

        /// <summary>
        /// Called when the LubricantQuantity has changed.
        /// </summary>
        protected virtual void OnLubricantQuantityChanged(Int32 lubricantquantity)
        {
            LubricantQuantityChanged?.Invoke(this, lubricantquantity);
            RaisePropertyChanged(nameof(LubricantQuantity));
        }

        /// <summary>
        /// Called when the CleanerQuantity has changed.
        /// </summary>
        protected virtual void OnCleanerQuantityChanged(Int32 cleanerquantity)
        {
            CleanerQuantityChanged?.Invoke(this, cleanerquantity);
            RaisePropertyChanged(nameof(CleanerQuantity));
        }

        /// <summary>
        /// Called when the EndPosition has changed.
        /// </summary>
        protected virtual void OnEndPositionChanged(Double endposition)
        {
            EndPositionChanged?.Invoke(this, endposition);
            RaisePropertyChanged(nameof(EndPosition));
        }

        /// <summary>
        /// Called when the FailedMessage has changed.
        /// </summary>
        protected virtual void OnFailedMessageChanged(String failedmessage)
        {
            FailedMessageChanged?.Invoke(this, failedmessage);
            RaisePropertyChanged(nameof(FailedMessage));
        }

        /// <summary>
        /// Called when the IsSynchronized has changed.
        /// </summary>
        protected virtual void OnIsSynchronizedChanged(Boolean issynchronized)
        {
            IsSynchronizedChanged?.Invoke(this, issynchronized);
            RaisePropertyChanged(nameof(IsSynchronized));
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="JobRunBase" /> class.
        /// </summary>
        public JobRunBase() : base()
        {
        }
    }
}