private void checkSendAs_CheckedChanged(object sender, EventArgs e) { for (int i = 0; i < _optionSendAsNodes.Count; ++i) { FolderTreeNode node = _optionSendAsNodes[i]; bool sendAs = false; switch (checkSendAs.CheckState) { case CheckState.Checked: sendAs = true; break; case CheckState.Indeterminate: sendAs = _optionSendAsInitial[i]; break; case CheckState.Unchecked: sendAs = false; break; } if (node.SharedFolder.FlagSendAsOwner != sendAs) { node.SharedFolder = node.SharedFolder.WithFlagSendAsOwner(sendAs); // Send-as is applied recursively foreach (FolderTreeNode desc in node.Descendants()) { desc.SharedFolder = desc.SharedFolder.WithFlagSendAsOwner(sendAs); } } } }
private void AddFolderNode(KTreeNode node, KTreeNodes children, AvailableFolder folder) { StoreTreeNode rootNode = (StoreTreeNode)this.Children.Parent; // Create the tree node SharedFolder share = rootNode.GetInitialShareState(folder); FolderTreeNode child = new FolderTreeNode(rootNode, folder, share); ApplyReadOnly(child, child.IsReadOnly); // Add children.Add(child); // Add the children foreach (AvailableFolder childFolder in folder.Children.OrderBy(f => f, new FolderComparer(false))) { AddFolderNode(child, child.Children, childFolder); } // Set the initial share state if (share != null) { child.IsChecked = true; } // Add the share; it might have become checked by any of the child nodes if (child.IsShared) { rootNode.AddShare(folder, share); } }
private void TryInitSendAsAddressParent(FolderTreeNode node) { if (node == null) { return; } for (KTreeNode current = node.Parent; current is FolderTreeNode; current = current.Parent) { FolderTreeNode parentNode = (FolderTreeNode)current; if (parentNode.SharedFolder == null) { break; } if (parentNode.SharedFolder.FlagSendAsOwner) { if (!string.IsNullOrWhiteSpace(parentNode.SharedFolder.SendAsAddress)) { node.SharedFolder.SendAsAddress = parentNode.SharedFolder.SendAsAddress; break; } } else { break; } } }
private void textSendAsAddress_TextChanged(object sender, EventArgs e) { for (int i = 0; i < _optionSendAsNodes.Count; ++i) { FolderTreeNode node = _optionSendAsNodes[i]; if (node.SharedFolder.SendAsAddress != textSendAsAddress.Text) { node.SharedFolder = node.SharedFolder.WithSendAsAddress(textSendAsAddress.Text); } } }
private void checkReminders_CheckedChanged(object sender, EventArgs e) { for (int i = 0; i < _optionRemindersNodes.Count; ++i) { FolderTreeNode node = _optionRemindersNodes[i]; bool reminders = false; switch (checkReminders.CheckState) { case CheckState.Checked: reminders = true; break; case CheckState.Indeterminate: reminders = _optionRemindersInitial[i]; break; case CheckState.Unchecked: reminders = false; break; } if (node.SharedFolder.FlagCalendarReminders != reminders) { node.SharedFolder = node.SharedFolder.WithFlagCalendarReminders(reminders); } } }
private void ShowOptions(KTreeNode[] nodes) { try { _layoutOptions.SuspendLayout(); _optionNameNode = null; _optionSendAsNodes.Clear(); _optionSendAsInitial.Clear(); _optionRemindersNodes.Clear(); _optionRemindersInitial.Clear(); _optionPermissionNodes.Clear(); OptionName = null; OptionTrackName = null; OptionSendAs = null; OptionReminders = null; OptionPermissions = null; foreach (KTreeNode node in nodes) { // Ignore the root nodes if (node is StoreTreeNode) { continue; } FolderTreeNode folderNode = (FolderTreeNode)node; // Can only set options for shared folders if (!folderNode.IsShared) { continue; } SharedFolder share = folderNode.SharedFolder; AvailableFolder folder = folderNode.AvailableFolder; // Assume we will edit the name for this node; cleared below if there are multiple _optionNameNode = folderNode; if (folder.Type.IsMail()) { // Show send as if there are any mail folders _optionSendAsNodes.Add(folderNode); _optionSendAsInitial.Add(folderNode.SharedFolder.FlagSendAsOwner); } else if (folder.Type.IsAppointment()) { // Show reminders for appointment folders _optionRemindersNodes.Add(folderNode); _optionRemindersInitial.Add(folderNode.SharedFolder.FlagCalendarReminders); } // Show permissions for all shared nodes _optionPermissionNodes.Add(folderNode); } // Now check consistency of the options // Only show the name if there is a single node. // We do that here so there doesn't have to be duplication if testing if it's sharedd, // ect if (_optionNameNode != null && nodes.Length == 1) { OptionName = _optionNameNode.SharedFolder.Name; OptionTrackName = _optionNameNode.SharedFolder.FlagUpdateShareName; } else { _optionNameNode = null; } // Permissions shown if all are the same if (_optionPermissionNodes.Count > 0) { Permission?permissions = _optionPermissionNodes.First().SharedFolder.Permissions; if (_optionPermissionNodes.All(x => x.SharedFolder.Permissions == permissions)) { OptionPermissions = permissions; } } // Send as shown if any node supports it if (_optionSendAsNodes.Count > 0) { bool sendAs = _optionSendAsNodes.First().SharedFolder.FlagSendAsOwner; if (_optionSendAsNodes.All(x => x.SharedFolder.FlagSendAsOwner == sendAs)) { OptionSendAs = sendAs ? CheckState.Checked : CheckState.Unchecked; checkSendAs.ThreeState = false; } else { OptionSendAs = CheckState.Indeterminate; checkSendAs.ThreeState = true; } } // Reminders shown if any node supports it if (_optionRemindersNodes.Count > 0) { bool reminders = _optionRemindersNodes.First().SharedFolder.FlagCalendarReminders; if (_optionRemindersNodes.All(x => x.SharedFolder.FlagCalendarReminders == reminders)) { OptionReminders = reminders ? CheckState.Checked : CheckState.Unchecked; checkReminders.ThreeState = false; } else { OptionReminders = CheckState.Indeterminate; checkReminders.ThreeState = true; } } } finally { _layoutOptions.ResumeLayout(); } }
private void ShowOptions(KTreeNode[] nodes) { try { _layoutOptions.SuspendLayout(); _optionNameNode = null; _optionSendAsNodes.Clear(); _optionSendAsInitial.Clear(); _optionRemindersNodes.Clear(); _optionRemindersInitial.Clear(); _optionPermissionNodes.Clear(); _optionWholeStoreNodes.Clear(); _optionWholeStoreNodesInitial.Clear(); OptionName = null; OptionTrackName = null; OptionSendAs = null; OptionReminders = null; OptionPermissions = null; OptionWholeStore = null; OptionWholeStoreReminders = null; bool readOnly = false; bool haveStoreNodes = false; bool haveFolderNodes = false; foreach (KTreeNode node in nodes) { // Ignore the root nodes if (node is StoreTreeNode) { if (!_folders.SupportsWholeStore || !node.HasCheckBox) { continue; } StoreTreeNode storeNode = (StoreTreeNode)node; haveStoreNodes = true; _optionWholeStoreNodes.Add(storeNode); _optionWholeStoreNodesInitial.Add(storeNode.IsShared); } else { FolderTreeNode folderNode = (FolderTreeNode)node; // Can only set options for shared folders if (!folderNode.IsShared) { continue; } haveFolderNodes = true; // Set all controls to read-only if any of the nodes is read-only if (folderNode.IsReadOnly) { readOnly = true; } SharedFolder share = folderNode.SharedFolder; AvailableFolder folder = folderNode.AvailableFolder; // Assume we will edit the name for this node; cleared below if there are multiple _optionNameNode = folderNode; if (folder.Type.IsMail()) { // Show send as if there are any mail folders _optionSendAsNodes.Add(folderNode); _optionSendAsInitial.Add(folderNode.SharedFolder.FlagSendAsOwner); } else if (folder.Type.IsAppointment()) { // Show reminders for appointment folders _optionRemindersNodes.Add(folderNode); _optionRemindersInitial.Add(folderNode.SharedFolder.FlagCalendarReminders); } // Show permissions for all shared nodes _optionPermissionNodes.Add(folderNode); } } // Now check consistency of the options if (haveFolderNodes && haveStoreNodes) { // Mixed nodes, no options return; } if (haveStoreNodes) { if (_optionWholeStoreNodes.Count > 0) { bool isShared = _optionWholeStoreNodes.First().WantShare; bool wasShared = _optionWholeStoreNodes.First().IsShared; if (_optionWholeStoreNodes.All(x => x.WantShare == isShared)) { OptionWholeStore = isShared ? CheckState.Checked : CheckState.Unchecked; checkWholeStore.ThreeState = false; } else { OptionWholeStore = CheckState.Indeterminate; checkWholeStore.ThreeState = true; } _labelRestartRequired.Visible = isShared && !wasShared; } } else { // Only show the name if there is a single node. // We do that here so there doesn't have to be duplication if testing if it's sharedd, // ect if (_optionNameNode != null && nodes.Length == 1) { OptionName = _optionNameNode.SharedFolder.Name; OptionTrackName = _optionNameNode.SharedFolder.FlagUpdateShareName; } else { _optionNameNode = null; } // Permissions shown if all are the same if (_optionPermissionNodes.Count > 0) { Permission?permissions = _optionPermissionNodes.First().SharedFolder.Permissions; if (_optionPermissionNodes.All(x => x.SharedFolder.Permissions == permissions)) { OptionPermissions = permissions; } } // Send as shown if any node supports it if (_optionSendAsNodes.Count > 0) { bool sendAs = _optionSendAsNodes.First().SharedFolder.FlagSendAsOwner; if (_optionSendAsNodes.All(x => x.SharedFolder.FlagSendAsOwner == sendAs)) { OptionSendAs = sendAs ? CheckState.Checked : CheckState.Unchecked; checkSendAs.ThreeState = false; } else { OptionSendAs = CheckState.Indeterminate; checkSendAs.ThreeState = true; } textSendAsAddress.Text = TryInitSendAsAddress(); EnableSendAsAddress(); } // Reminders shown if any node supports it if (_optionRemindersNodes.Count > 0) { bool reminders = _optionRemindersNodes.First().SharedFolder.FlagCalendarReminders; if (_optionRemindersNodes.All(x => x.SharedFolder.FlagCalendarReminders == reminders)) { OptionReminders = reminders ? CheckState.Checked : CheckState.Unchecked; checkReminders.ThreeState = false; } else { OptionReminders = CheckState.Indeterminate; checkReminders.ThreeState = true; } } } // Apply read-only state _layoutOptions.Enabled = !readOnly; } finally { _layoutOptions.ResumeLayout(); } }