/// <summary>
        /// Loads raw configuration data.
        /// </summary>
        /// <param name="configuration">
        /// The configuration object in context of which operation is executed.
        /// </param>
        /// <param name="rawConfigurationData">
        /// The raw configuration data.
        /// </param>
        public static void LoadRawConfiguration(this RanttConfiguration configuration, RawConfigurationData rawConfigurationData)
        {
            configuration.IsInitializing = true;
            configuration.AvailableWorkspaces.Clear();
            configuration.ResourceConfigurations.Clear();
            configuration.AttributeConfigurations.Clear();
            configuration.CalendarStateConfigurations.Clear();

            foreach (RawResourceConfiguration rawResource in rawConfigurationData.ResourceConfigurations)
            {
                ResourceConfiguration resourceConfiguration = new ResourceConfiguration(rawResource.Name, rawResource.Position, rawResource.IsVisible);
                configuration.ResourceConfigurations.Add(resourceConfiguration.Name, resourceConfiguration);
                resourceConfiguration.PropertyChanged += (sender, args) => configuration.RaiseConfigurationChangeEvent(sender, args.PropertyName);
            }

            foreach (RawBaseAttributeConfiguration rawBaseAttributeConfiguration in rawConfigurationData.BaseAttributeConfigurations)
            {
                AttributeConfiguration attributeConfiguration = rawBaseAttributeConfiguration.GetAttributeConfiguration();
                configuration.AttributeConfigurations.Add(attributeConfiguration.Name, attributeConfiguration);


                if (rawConfigurationData.ExtendedAttributeConfigurations.ContainsKey(attributeConfiguration.Name))
                {
                    foreach (RawAttributeExtendedConfiguration extendedConfiguration in rawConfigurationData.ExtendedAttributeConfigurations[attributeConfiguration.Name])
                    {
                        attributeConfiguration.InitializeAttributeValue(extendedConfiguration.Value);
                        attributeConfiguration.SetAttributeValueColor(extendedConfiguration.Value, CustomColorConverter.StringToColor(extendedConfiguration.Color));
                        attributeConfiguration.SetAttributeValueVisibility(extendedConfiguration.Value, extendedConfiguration.Visibility);
                    }
                }

                attributeConfiguration.PropertyChanged += (sender, args) => configuration.RaiseConfigurationChangeEvent(sender, args.PropertyName);
            }

            foreach (RawCalendarStateConfiguration rawCalendarStateConfiguration in rawConfigurationData.CalendarStateConfigurations)
            {
                CalendarStateConfiguration calendarStateConfiguration = new CalendarStateConfiguration(rawCalendarStateConfiguration.Name, CustomColorConverter.StringToColor(rawCalendarStateConfiguration.Color))
                {
                    IsVisible = rawCalendarStateConfiguration.IsVisible
                };
                calendarStateConfiguration.PropertyChanged += (sender, args) => configuration.RaiseConfigurationChangeEvent(sender, args.PropertyName);
            }

            RawWorkspaceConfiguration rawWorkspace = rawConfigurationData.CurrentWorkspace;

            configuration.CurrentWorkspace = rawWorkspace == null ? null :
                                             new WorkspaceConfiguration
            {
                Name = rawWorkspace.Name,
                GroupByAttributeName    = rawWorkspace.GroupByAttributeName,
                HighlightPast           = rawWorkspace.HighlightPast,
                AreTooltipsEnabled      = rawWorkspace.AreTooltipsEnabled,
                IsDataRowEnabled        = rawWorkspace.IsDataRowEnabled,
                IsPlotRowEnabled        = rawWorkspace.IsPlotRowEnabled,
                OperationColorAttribute = rawWorkspace.OperationColorAttribute,
                PlotType                = rawWorkspace.PlotType,
                PlotInterval            = rawWorkspace.PlotInterval,
                RelativeStartTime       = rawWorkspace.RelativeStartTime,
                SelectedAttributes      = rawWorkspace.SelectedAttributes,
                ShowCurrentTime         = rawWorkspace.ShowCurrentTime,
                ShowHorizontalGridLines = rawWorkspace.ShowHorizontalGridLines,
                ShowVerticalGridLines   = rawWorkspace.ShowVerticalGridLines,
                UseRelativeTime         = rawWorkspace.UseRelativeTime,
                RelativeDuration        = rawWorkspace.RelativeDuration,
                ShowCountData           = rawWorkspace.ShowCountData,
                ShowDurationData        = rawWorkspace.ShowDurationData
            };

            foreach (string availableWorkspace in rawConfigurationData.AvailableWorkspaces)
            {
                if ((configuration.CurrentWorkspace != null) &&
                    (configuration.CurrentWorkspace.Name == availableWorkspace))
                {
                    configuration.AvailableWorkspaces.Add(availableWorkspace, configuration.CurrentWorkspace);
                }
                else
                {
                    configuration.AvailableWorkspaces.Add(availableWorkspace, null);
                }
            }

            configuration.IsInitializing = false;
        }
        /// <summary>
        /// Gets raw configuration data for given rantt configuration.
        /// </summary>
        /// <param name="configuration">The rantt configuration.</param>
        /// <returns>The raw configuration data.</returns>
        public static RawConfigurationData GetRawConfigurationData(this RanttConfiguration configuration)
        {
            RawConfigurationData result = new RawConfigurationData
            {
                ResourceConfigurations          = new List <RawResourceConfiguration>(),
                BaseAttributeConfigurations     = new List <RawBaseAttributeConfiguration>(),
                ExtendedAttributeConfigurations = new Dictionary <string, List <RawAttributeExtendedConfiguration> >(),
                CalendarStateConfigurations     = new List <RawCalendarStateConfiguration>(),
                AvailableWorkspaces             = configuration.AvailableWorkspaces.Keys.ToList()
            };

            foreach (var resourceConfiguration in configuration.ResourceConfigurations.Values)
            {
                result.ResourceConfigurations.Add(new RawResourceConfiguration {
                    IsVisible = resourceConfiguration.IsVisible, Name = resourceConfiguration.Name, Position = resourceConfiguration.Position
                });
            }

            foreach (AttributeConfiguration attributeConfiguration in configuration.AttributeConfigurations.Values)
            {
                result.BaseAttributeConfigurations.Add(attributeConfiguration.GetRawBaseAttributeConfiguration());
                List <RawAttributeExtendedConfiguration> extendedConfigurations = attributeConfiguration.GetRawExtendedAttributeConfiguration();
                if (extendedConfigurations.Count > 0)
                {
                    result.ExtendedAttributeConfigurations.Add(attributeConfiguration.Name, extendedConfigurations);
                }
            }

            foreach (CalendarStateConfiguration calendarStateConfiguration in  configuration.CalendarStateConfigurations.Values)
            {
                result.CalendarStateConfigurations.Add(new RawCalendarStateConfiguration {
                    Color = calendarStateConfiguration.CalendarStateColor, IsVisible = calendarStateConfiguration.IsVisible, Name = calendarStateConfiguration.Name
                });
            }

            if (configuration.CurrentWorkspace != null)
            {
                result.CurrentWorkspace = new RawWorkspaceConfiguration
                {
                    Name = configuration.CurrentWorkspace.Name,
                    GroupByAttributeName    = configuration.CurrentWorkspace.GroupByAttributeName,
                    HighlightPast           = configuration.CurrentWorkspace.HighlightPast,
                    AreTooltipsEnabled      = configuration.CurrentWorkspace.AreTooltipsEnabled,
                    IsDataRowEnabled        = configuration.CurrentWorkspace.IsDataRowEnabled,
                    IsPlotRowEnabled        = configuration.CurrentWorkspace.IsPlotRowEnabled,
                    OperationColorAttribute = configuration.CurrentWorkspace.OperationColorAttribute,
                    PlotType                = configuration.CurrentWorkspace.PlotType,
                    PlotInterval            = configuration.CurrentWorkspace.PlotInterval,
                    RelativeStartTime       = configuration.CurrentWorkspace.RelativeStartTime,
                    SelectedAttributes      = configuration.CurrentWorkspace.SelectedAttributes,
                    ShowCurrentTime         = configuration.CurrentWorkspace.ShowCurrentTime,
                    ShowHorizontalGridLines = configuration.CurrentWorkspace.ShowHorizontalGridLines,
                    ShowVerticalGridLines   = configuration.CurrentWorkspace.ShowVerticalGridLines,
                    UseRelativeTime         = configuration.CurrentWorkspace.UseRelativeTime,
                    RelativeDuration        = configuration.CurrentWorkspace.RelativeDuration,
                    ShowCountData           = configuration.CurrentWorkspace.ShowCountData,
                    ShowDurationData        = configuration.CurrentWorkspace.ShowDurationData
                };
            }

            return(result);
        }