/// <summary>
        /// Initialisiert die Boolean-Variablen, die angeben, welche Einstellungen aktuell
        /// bezüglich der Listenanordnungen gewählt sind.
        /// </summary>
        /// <param name="appSettings">Die aktuellen Anwendungseinstellungen.</param>
        private void initializeListSettingsViewParameter(AppSettings appSettings)
        {
            Debug.WriteLine("Loaded settings for lists: {0}, {1}, {2}, {3}, {4}, {5}.",
               appSettings.GeneralListOrderSetting,
               appSettings.AnnouncementOrderSetting,
               appSettings.ChannelOderSetting,
               appSettings.GroupOrderSetting,
               appSettings.ConversationOrderSetting,
               appSettings.BallotOrderSetting);

            // Allgemeine Listeneinstellungen.
            OrderOption generalListOrder = appSettings.GeneralListOrderSetting;
            IsDescendingSortingOptionSelected = false;
            IsAscendingSortingOptionSelected = false;

            // Initialisierung der Boolean Parameter für allgemeine Listeneinstellungen.
            switch (generalListOrder)
            {
                case OrderOption.DESCENDING:
                    IsDescendingSortingOptionSelected = true;
                    break;
                case OrderOption.ASCENDING:
                    IsAscendingSortingOptionSelected = true;
                    break;
                default:
                    Debug.WriteLine("No value matched for the generalListOrder settings. Take ascending as default.");
                    IsAscendingSortingOptionSelected = true;
                    break;
            }

            // Anordnung von Nachrichten (Announcements) in Nachrichtenauflistungen.
            OrderOption announcementOrderSetting = appSettings.AnnouncementOrderSetting;
            IsAscendingMsgOrderSelected = false;
            IsDescendingMsgOrderSelected = false;

            switch (announcementOrderSetting)
            {
                case OrderOption.ASCENDING:
                    IsAscendingMsgOrderSelected = true;
                    break;
                case OrderOption.DESCENDING:
                    IsDescendingMsgOrderSelected = true;
                    break;
                default:
                    Debug.WriteLine("No value matched for the announcementOrderSetting. Take ascending as default.");
                    IsAscendingMsgOrderSelected = true;
                    break;
            }

            // Kanaleinstellungen.
            OrderOption channelSettings = appSettings.ChannelOderSetting;

            switch (channelSettings)
            {
                case OrderOption.ALPHABETICAL:
                    IsChannelOrderOptionAlphabetical = true;
                    IsChannelOrderOptionByType = false;
                    IsChannelOrderOptionByMsgAmount = false;
                    break;
                case OrderOption.BY_TYPE:
                    IsChannelOrderOptionAlphabetical = false;
                    IsChannelOrderOptionByType = true;
                    IsChannelOrderOptionByMsgAmount = false;
                    break;
                case OrderOption.BY_NEW_MESSAGES_AMOUNT:
                    
                    IsChannelOrderOptionAlphabetical = false;
                    IsChannelOrderOptionByType = false;
                    IsChannelOrderOptionByMsgAmount = true;
                    break;
                default:
                    Debug.WriteLine("No value matched for the channelListOrder settings. Take alphabetical as default.");
                    IsChannelOrderOptionAlphabetical = true;
                    IsChannelOrderOptionByType = false;
                    IsChannelOrderOptionByMsgAmount = false;
                    break;
            }

            // Gruppeneinstellungen.
            OrderOption groupSettings = appSettings.GroupOrderSetting;
            IsGroupOrderOptionAlphabetical = false;
            IsGroupOrderOptionByType = false;
            IsGroupOrderOptionByMsgAmount = false;

            switch (groupSettings)
            {
                case OrderOption.ALPHABETICAL:
                    IsGroupOrderOptionAlphabetical = true;
                    break;
                case OrderOption.BY_TYPE:
                    IsGroupOrderOptionByType = true;
                    break;
                case OrderOption.BY_NEW_MESSAGES_AMOUNT:
                    IsGroupOrderOptionByMsgAmount = true;
                    break;
                default:
                    Debug.WriteLine("No value matched for the groupListOrder settings. Take alphabetical as default.");
                    IsGroupOrderOptionAlphabetical = true;
                    break;
            }

            // Konversationeneinstellungen.
            OrderOption conversationSettings = appSettings.ConversationOrderSetting;
            IsConversationOrderOptionAlphabetical = false;
            IsConversationOrderOptionByMsgAmount = false;
            IsConversationOrderOptionLatest = false;

            switch (conversationSettings)
            {
                case OrderOption.ALPHABETICAL:
                    IsConversationOrderOptionAlphabetical = true;
                    break;
                case OrderOption.BY_NEW_MESSAGES_AMOUNT:
                    IsConversationOrderOptionByMsgAmount = true;
                    break;
                case OrderOption.BY_LATEST_DATE:
                    IsConversationOrderOptionLatest = true;
                    break;
                default:
                    Debug.WriteLine("No value matched for the conversationListOrder settings. Take alphabetical as default.");
                    IsConversationOrderOptionAlphabetical = true;
                    break;
            }

            // Abstimmungseinstellungen.
            OrderOption ballotSettings = appSettings.BallotOrderSetting;
            IsBallotOrderOptionAlphabetical = false;
            IsBallotOrderOptionByBallotType = false;
            IsBallotOrderOptionLatestVote = false;

            switch (ballotSettings)
            {
                case OrderOption.ALPHABETICAL:
                    IsBallotOrderOptionAlphabetical = true;
                    break;
                case OrderOption.BY_TYPE:
                    IsBallotOrderOptionByBallotType = true;
                    break;
                case OrderOption.BY_LATEST_VOTE:
                    IsBallotOrderOptionLatestVote = true;
                    break;
                default:
                    Debug.WriteLine("No value matched for the ballotListOrder settings. Take alphabetical as default.");
                    IsBallotOrderOptionAlphabetical = true;
                    break;
            }
        }
        /// <summary>
        /// Prüft im Falle einer eingegangenen ConversationMessage, ob der Nutzer benachrichtigt werden soll.
        /// Die Entscheidung wird abhängig von den Anwendungseinstellungen, oder falls definiert, abhängig
        /// von den gruppenspezifischen Einstellungen getroffen.
        /// </summary>
        /// <param name="appSettings">Die aktuell gültigen Anwendungseinstellungen</param>
        /// <param name="groupId">Die Id der betroffenen Gruppe, zu der die Konversation gehört.</param>
        /// <param name="conversationId">Die Id der betroffenen Konversation.</param>
        /// <returns>Liefert true, wenn der Nutzer benachrichtigt werden soll, ansonsten false.</returns>
        private bool checkNotificationRequiredForConversationMessage(AppSettings appSettings, int groupId, int conversationId)
        {
            bool notificationRequired = false;

            DataHandlingLayer.DataModel.Enums.NotificationSetting settings;

            // Hole die Gruppe und prüfe die Einstellungen.
            Group affectedGroup = groupController.GetGroup(groupId);
            if (affectedGroup.GroupNotificationSetting != 
                DataModel.Enums.NotificationSetting.APPLICATION_DEFAULT)
            {
                Debug.WriteLine("Take group specific settings.");

                settings = affectedGroup.GroupNotificationSetting;
            }
            else
            {
                Debug.WriteLine("Take application specific settings.");

                settings = appSettings.MsgNotificationSetting;
            }

            switch (settings)
            {
                case DataModel.Enums.NotificationSetting.ANNOUNCE_PRIORITY_HIGH:
                    // Prüfe, ob die eingegangene Nachricht die Priorität hoch hatte.
                    ConversationMessage lastMessage = groupController.GetLastConversationMessage(conversationId);
                    if (lastMessage != null)
                    {
                        if (lastMessage.MessagePriority == Priority.HIGH)
                        {
                            notificationRequired = true;
                        }
                    }
                    break;
                case DataModel.Enums.NotificationSetting.ANNOUNCE_ALL:
                    notificationRequired = true;
                    break;
                case DataModel.Enums.NotificationSetting.ANNOUNCE_NONE:
                    notificationRequired = false;
                    break;
                default:
                    Debug.WriteLine("No cases match, will return false.");
                    notificationRequired = false;
                    break;
            }

            Debug.WriteLine("The result of whether the user will be notified is {0}.", notificationRequired);
            return notificationRequired;
        }
        /// <summary>
        /// Prüft im Falle einer eingegangenen Announcement, ob der Nutzer benachrichtigt werden soll.
        /// Die Entscheidung wird abhängig von den Anwendungseinstellungen, oder falls definiert, abhängig
        /// von den kanalspezifischen Einstellungen getroffen.
        /// </summary>
        /// <param name="appSettings">Die aktuell gültigen Anwendungseinstellungen.</param>
        /// <param name="channelId">Die Id des betroffenen Kanals.</param>
        /// <returns>Liefert true, wenn der Nutzer benachrichtigt werden soll, ansonsten false.</returns>
        private bool checkNotificationRequiredForNewAnnouncement(AppSettings appSettings, int channelId)
        {
            bool notificationRequired = false;
                        
            DataHandlingLayer.DataModel.Enums.NotificationSetting settings;

            // Hole den Kanal und entscheide abhängig von den Einstellungen.
            Channel affectedChannel = channelController.GetChannel(channelId);
            if (affectedChannel.AnnouncementNotificationSetting
                != DataHandlingLayer.DataModel.Enums.NotificationSetting.APPLICATION_DEFAULT)
            {
                Debug.WriteLine("Take channel specific settings.");

                settings = affectedChannel.AnnouncementNotificationSetting;
            }
            else
            {
                Debug.WriteLine("Take application specific settings.");

                settings = appSettings.MsgNotificationSetting;
            }

            switch (settings)
            {
                case DataHandlingLayer.DataModel.Enums.NotificationSetting.ANNOUNCE_PRIORITY_HIGH:
                    // Prüfe, ob die empfangene Announcement Priorität hoch hatte.
                    Announcement lastRecvAnnouncement = channelController.GetLastReceivedAnnouncement(channelId);
                    if (lastRecvAnnouncement != null)
                    {
                        if (lastRecvAnnouncement.MessagePriority == Priority.HIGH)
                        {
                            notificationRequired = true;
                        }
                    }
                    break;
                case DataHandlingLayer.DataModel.Enums.NotificationSetting.ANNOUNCE_ALL:
                    notificationRequired = true;
                    break;
                case DataHandlingLayer.DataModel.Enums.NotificationSetting.ANNOUNCE_NONE:
                    notificationRequired = false;
                    break;
                default:
                    Debug.WriteLine("No case matched. Will return false.");
                    break;
            }

            Debug.WriteLine("The result of whether the user will be notified is {0}.", notificationRequired);
            return notificationRequired;
        }
 /// <summary>
 /// Speichert die Referenz auf das Objekt mit den Anwendungseinstellungen im Speicherbereich der Singleton-Klasse AppSettingsCache,
 /// so dass es zur Laufzeit der Anwendung aus diesem Speicher abgefragt werden kann.
 /// </summary>
 /// <param name="appSettings">Das Objekt der Klasse AppSettings, welches gespeichert werden soll.</param>
 public void CacheApplicationSettings(AppSettings appSettings)
 {
     this.appSettings = appSettings;
 }
        /// <summary>
        /// Aktualisiere die Anwendungseinstellungen in der Datenbank.
        /// Die aktualisierten Daten werden gekapselt in einem AppSettings Objekt übergeben.
        /// </summary>
        /// <param name="updatedSettings">Das AppSettings Objekt mit den aktualisierten Anwendungsdaten.</param>
        public void UpdateApplicationSettings(AppSettings updatedSettings)
        {
            // Frage das Mutex Objekt ab.
            Mutex mutex = DatabaseManager.GetDatabaseAccessMutexObject();

            // Fordere Zugriff auf die Datenbank an.
            if (mutex.WaitOne(DatabaseManager.MutexTimeoutValue))
            {
                using (SQLiteConnection conn = DatabaseManager.GetConnection())
                {
                    try{
                        string sql = @"UPDATE Settings 
                                       SET  ChannelSettings_OrderOptions_OrderId=?, ConversationSettings_OrderOptions_OrderId=?,
                                            GroupSettings_OrderOptions_OrderId=?, BallotSettings_OrderOptions_OrderId=?,
                                            AnnouncementSettings_OrderOptions_OrderId=?, GeneralListOrder_OrderOptions_OrderId=?,
                                            LanguageSettings_LanguageId=?, NotificationSettings_NotifierId=?
                                        WHERE Id=0;";
                        using (var stmt = conn.Prepare(sql))
                        {
                            stmt.Bind(1, (int)updatedSettings.ChannelOderSetting);
                            stmt.Bind(2, (int)updatedSettings.ConversationOrderSetting);
                            stmt.Bind(3, (int)updatedSettings.GroupOrderSetting);
                            stmt.Bind(4, (int)updatedSettings.BallotOrderSetting);
                            stmt.Bind(5, (int)updatedSettings.AnnouncementOrderSetting);
                            stmt.Bind(6, (int)updatedSettings.GeneralListOrderSetting);
                            stmt.Bind(7, (int)updatedSettings.LanguageSetting);
                            stmt.Bind(8, (int)updatedSettings.MsgNotificationSetting);

                            stmt.Step();

                            Debug.WriteLine("Performed update on Settings table.");
                        }
                    }
                    catch (SQLiteException sqlEx)
                    {
                        // Hier keine Abbildung auf DatabaseException.
                        Debug.WriteLine("SQLiteException has occurred in UpdateApplicationSettings. The message is: {0}.", sqlEx.Message);
                        throw new DatabaseException("Failed to update application settings.");
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine("Exception has occurred in UpdateApplicationSettings. The message is: {0}, " +
                            "and the stack trace: {1}.", ex.Message, ex.StackTrace);
                        throw new DatabaseException("Failed to update application settings.");
                    }
                    finally
                    {
                        mutex.ReleaseMutex();
                    }
                }
            }
            else
            {
                Debug.WriteLine("Couldn't get access to database. Time out.");
            }

        }
        /// <summary>
        /// Lädt die aktuell gültigen Anwendungseinstellungen aus der Datenbank und gibt sie 
        /// in einem Objekt gekapselt zurück.
        /// </summary>
        /// <returns>Eine Instanz von AppSetting.</returns>
        /// <exception cref="DatabaseException">Wirft DatabaseException, wenn Laden der Anwendungseinstellungen fehlschlägt.</exception>
        public AppSettings LoadApplicationSettings()
        {
            AppSettings appSettings = null;
            // Frage das Mutex Objekt ab.
            Mutex mutex = DatabaseManager.GetDatabaseAccessMutexObject();

            // Fordere Zugriff auf die Datenbank an.
            if (mutex.WaitOne(DatabaseManager.MutexTimeoutValue))
            {
                using (SQLiteConnection conn = DatabaseManager.GetConnection())
                {
                    try
                    {
                        string sql = @"SELECT * 
                                       FROM Settings
                                       WHERE Id=?;";
                        using(var stmt = conn.Prepare(sql))
                        {
                            stmt.Bind(1, 0);        // Settings unter Id 0 abgespeichert.

                            if(stmt.Step() == SQLiteResult.ROW)
                            {
                                OrderOption channelSetting = (OrderOption) Enum.ToObject(typeof(OrderOption), stmt["ChannelSettings_OrderOptions_OrderId"]);
                                OrderOption conversationSetting = (OrderOption)Enum.ToObject(typeof(OrderOption), stmt["ConversationSettings_OrderOptions_OrderId"]);
                                OrderOption groupSetting = (OrderOption)Enum.ToObject(typeof(OrderOption), stmt["GroupSettings_OrderOptions_OrderId"]);
                                OrderOption ballotSetting = (OrderOption)Enum.ToObject(typeof(OrderOption), stmt["BallotSettings_OrderOptions_OrderId"]);
                                OrderOption announcementSetting = (OrderOption)Enum.ToObject(typeof(OrderOption), stmt["AnnouncementSettings_OrderOptions_OrderId"]);
                                OrderOption generalListOrderSetting = (OrderOption)Enum.ToObject(typeof(OrderOption), stmt["GeneralListOrder_OrderOptions_OrderId"]);
                                Language languageSetting = (Language)Enum.ToObject(typeof(Language), stmt["LanguageSettings_LanguageId"]);
                                NotificationSetting notificationSetting = (NotificationSetting)Enum.ToObject(typeof(NotificationSetting), stmt["NotificationSettings_NotifierId"]);

                                appSettings = new AppSettings()
                                {
                                    ChannelOderSetting = channelSetting,
                                    ConversationOrderSetting = conversationSetting,
                                    GroupOrderSetting = groupSetting,
                                    BallotOrderSetting = ballotSetting,
                                    AnnouncementOrderSetting = announcementSetting,
                                    GeneralListOrderSetting = generalListOrderSetting,
                                    LanguageSetting = languageSetting,
                                    MsgNotificationSetting = notificationSetting
                                };
                            }
                        }
                    }
                    catch (SQLiteException sqlEx)
                    {
                        // Hier keine Abbildung auf DatabaseException.
                        Debug.WriteLine("SQLiteException has occurred in LoadApplicationSettings. The message is: {0}.", sqlEx.Message);
                        throw new DatabaseException("Failed to load application settings.");
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine("Exception has occurred in LoadApplicationSettings. The message is: {0}, " +
                            "and the stack trace: {1}.", ex.Message, ex.StackTrace);
                        throw new DatabaseException("Failed to load application settings.");
                    }
                    finally
                    {
                        mutex.ReleaseMutex();
                    }
                }
            }
            else
            {
                Debug.WriteLine("Couldn't get access to database. Time out.");
            }

            return appSettings;
        }