From 05d6d715a088bf1124b07ca70f1c33aefc845875 Mon Sep 17 00:00:00 2001
From: Patrick Simpson
Date: Wed, 8 Nov 2017 11:44:11 +0200
Subject: [PATCH 1/6] Comment update
---
src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs
index ed8d511..e000b51 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs
@@ -156,8 +156,8 @@ namespace Acacia
foreach (Feature feature in Features)
feature.AfterStartup();
- // Initial send receive
- ThisAddIn.Instance.SendReceive();
+ // [KOE-148] Initial send receive
+ Instance.SendReceive();
}
catch (System.Exception e)
{
From 4b868456b001eca519bc77d862ba71b48c4ab385 Mon Sep 17 00:00:00 2001
From: Patrick Simpson
Date: Wed, 8 Nov 2017 11:44:36 +0200
Subject: [PATCH 2/6] [KOE-98] Added exclusions for configured and GAB folders
to reminders query
---
.../SharedFolders/FeatureSharedFolders.cs | 12 +-
.../Features/SharedFolders/RemindersQuery.cs | 110 +++++++++++++-----
.../AcaciaZPushPlugin/ZPush/ZPushTypes.cs | 24 +++-
3 files changed, 111 insertions(+), 35 deletions(-)
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs
index 4eeebf7..bcbfbed 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs
@@ -88,7 +88,7 @@ namespace Acacia.Features.SharedFolders
private bool CanManageFolder(MenuItem b, IFolder folder)
{
- return folder.SyncId?.IsShared == true;
+ return folder.SyncId?.IsCustom == true;
}
private void ManageFolder(IFolder folder)
@@ -151,7 +151,7 @@ namespace Acacia.Features.SharedFolders
// Check that we can get the id
SyncId folderId = folder.SyncId;
Logger.Instance.Trace(this, "GetSharedFolder1: {0}", folderId);
- if (folderId == null || !folderId.IsShared)
+ if (folderId == null || !folderId.IsCustom)
return null;
// Get the ZPush account
@@ -310,7 +310,7 @@ namespace Acacia.Features.SharedFolders
public override bool IsApplicable(IFolder folder)
{
- if (folder.SyncId != null && folder.SyncId.IsShared)
+ if (folder.SyncId != null && folder.SyncId.IsCustom)
return true;
using (IFolder parent = folder.Parent)
@@ -354,7 +354,7 @@ namespace Acacia.Features.SharedFolders
private void OnSharedFolderDiscovered(IFolder folder)
{
Logger.Instance.Trace(this, "Shared folder discovered: {0} - {1}", folder.Name, folder.SyncId);
- if (folder.SyncId == null || !folder.SyncId.IsShared)
+ if (folder.SyncId == null || !folder.SyncId.IsCustom)
{
Logger.Instance.Warning(this, "Local folder created in shared folder, deleting: {0} - {1}", folder.Name, folder.SyncId);
// This is a new, locally created folder. Warn and remove
@@ -376,7 +376,7 @@ namespace Acacia.Features.SharedFolders
private void Folder_BeforeFolderMove(IFolder src, IFolder moveTo, ref bool cancel)
{
- if (src.SyncId?.IsShared == true || moveTo.SyncId?.IsShared == true)
+ if (src.SyncId?.IsCustom == true || moveTo.SyncId?.IsCustom == true)
{
// Suppress any move of or into a shared folder
Logger.Instance.Warning(this, "Shared folder move: {0} - {1}", src.Name, moveTo.Name);
@@ -399,7 +399,7 @@ namespace Acacia.Features.SharedFolders
private void CheckSharedFolderRename(IFolder folder)
{
- if (folder.SyncId != null && folder.SyncId.IsShared)
+ if (folder.SyncId != null && folder.SyncId.IsCustom)
{
string originalName = (string)folder.GetProperty(OutlookConstants.PR_ZPUSH_NAME);
// The folder.name property is sometimes cached, check against the MAPI property
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/RemindersQuery.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/RemindersQuery.cs
index dce9cf5..f6d4966 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/RemindersQuery.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/RemindersQuery.cs
@@ -17,7 +17,8 @@ namespace Acacia.Features.SharedFolders
private readonly FeatureSharedFolders _feature;
private readonly IFolder _folder;
private SearchQuery _queryRoot;
- private SearchQuery.Or _queryCustom;
+ private SearchQuery.Or _queryCustomShared;
+ private SearchQuery.Or _queryCustomConfigured;
private bool _queryCustomModified;
public RemindersQuery(FeatureSharedFolders feature, IStore store)
@@ -28,7 +29,7 @@ namespace Acacia.Features.SharedFolders
public bool Open()
{
- if (_queryCustom != null)
+ if (_queryCustomShared != null && _queryCustomConfigured != null)
return true;
try
{
@@ -39,30 +40,34 @@ namespace Acacia.Features.SharedFolders
SearchQuery.And root = (SearchQuery.And)_queryRoot;
// TODO: more strict checking of query
- if (root.Operands.Count == 3)
+ if (root.Operands.Count == 5)
{
- this._queryCustom = root.Operands.ElementAt(2) as SearchQuery.Or;
- if (this._queryCustom != null)
+ this._queryCustomShared = root.Operands.ElementAt(2) as SearchQuery.Or;
+ this._queryCustomConfigured = root.Operands.ElementAt(3) as SearchQuery.Or;
+ if (this._queryCustomShared != null)
{
// TODO: check property test
return true;
}
}
+ else if (root.Operands.Count == 3)
+ {
+ // KOE-98 introduced also checking of G and C prefixes, which are not yet present
+ _queryCustomShared = root.Operands.ElementAt(2) as SearchQuery.Or;
+ }
// We have the root, but not the custom query. Create it.
Logger.Instance.Debug(this, "Creating custom query");
- _queryCustom = new SearchQuery.Or();
-
- // Add the prefix exclusion for shared folders
- _queryCustom.Add(
- new SearchQuery.Not(
- new SearchQuery.PropertyContent(
- PROP_FOLDER, SearchQuery.ContentMatchOperation.Prefix, SearchQuery.ContentMatchModifiers.None, "S"
- )
+ if (_queryCustomShared == null)
+ _queryCustomShared = AddCustomQuery(root, "S");
+ _queryCustomConfigured = AddCustomQuery(root, "C");
+ // Add the G (GAB) exclusion. Folders will never have a flag with this prefix, so it's simpler
+ root.Operands.Add(new SearchQuery.Not(
+ new SearchQuery.PropertyContent(
+ PROP_FOLDER, SearchQuery.ContentMatchOperation.Prefix, SearchQuery.ContentMatchModifiers.None, "G"
)
- );
+ ));
- root.Operands.Add(_queryCustom);
Logger.Instance.Debug(this, "Modified query:\n{0}", root.ToString());
// Store it
FolderQuery = root;
@@ -72,7 +77,24 @@ namespace Acacia.Features.SharedFolders
{
Logger.Instance.Error(this, "Exception in Open: {0}", e);
}
- return _queryCustom != null;
+ return _queryCustomShared != null && _queryCustomConfigured != null;
+ }
+
+ private SearchQuery.Or AddCustomQuery(SearchQuery.And root, string prefix)
+ {
+ SearchQuery.Or custom = new SearchQuery.Or();
+
+ // Add the prefix exclusion
+ custom.Add(
+ new SearchQuery.Not(
+ new SearchQuery.PropertyContent(
+ PROP_FOLDER, SearchQuery.ContentMatchOperation.Prefix, SearchQuery.ContentMatchModifiers.None, prefix
+ )
+ )
+ );
+
+ root.Operands.Add(custom);
+ return custom;
}
public string LogContextId
@@ -117,15 +139,28 @@ namespace Acacia.Features.SharedFolders
public void UpdateReminders(SyncId folderId, bool wantReminders)
{
- Logger.Instance.Trace(this, "Setting reminders for folder {0}: {1}", wantReminders, folderId);
+ Logger.Instance.Trace(this, "Setting reminders for folder {0}: {1} ({2})", wantReminders, folderId, folderId?.Kind);
+ switch(folderId.Kind)
+ {
+ case SyncKind.Configured:
+ UpdateReminders(_queryCustomConfigured, folderId, wantReminders);
+ break;
+ case SyncKind.Shared:
+ UpdateReminders(_queryCustomShared, folderId, wantReminders);
+ break;
+ }
+ }
+
+ private void UpdateReminders(SearchQuery.Or query, SyncId folderId, bool wantReminders)
+ {
string prefix = MakeFolderPrefix(folderId);
if (prefix == null)
return;
// Find existing
- for (int i = 0; i < _queryCustom.Operands.Count;)
+ for (int i = 0; i < query.Operands.Count;)
{
- SearchQuery.PropertyContent element = _queryCustom.Operands[i] as SearchQuery.PropertyContent;
+ SearchQuery.PropertyContent element = query.Operands[i] as SearchQuery.PropertyContent;
if (element != null && prefix == (string)element.Content)
{
Logger.Instance.Trace(this, "Found at {0}: {1}", i, folderId);
@@ -134,7 +169,8 @@ namespace Acacia.Features.SharedFolders
return;
// Otherwise remove it. Still continue looking for others, just in case of duplicates
- _queryCustom.Operands.RemoveAt(i);
+ query.Operands.RemoveAt(i);
+ _queryCustomModified = true;
}
else ++i;
}
@@ -143,7 +179,7 @@ namespace Acacia.Features.SharedFolders
if (wantReminders)
{
Logger.Instance.Trace(this, "Adding reminders for {0}", folderId);
- _queryCustom.Operands.Add(new SearchQuery.PropertyContent(
+ query.Operands.Add(new SearchQuery.PropertyContent(
PROP_FOLDER, SearchQuery.ContentMatchOperation.Prefix, SearchQuery.ContentMatchModifiers.None, prefix
));
_queryCustomModified = true;
@@ -152,19 +188,37 @@ namespace Acacia.Features.SharedFolders
public void RemoveStaleReminders(IEnumerable wanted)
{
- // Collect the valid prefixes
- HashSet prefixes = new HashSet();
+ // Group the valid prefixes on type
+ HashSet prefixesS = new HashSet();
+ HashSet prefixesC = new HashSet();
foreach (SyncId id in wanted)
{
string prefix = MakeFolderPrefix(id);
if (prefix != null)
- prefixes.Add(prefix);
+ {
+ switch (id.Kind)
+ {
+ case SyncKind.Configured:
+ prefixesC.Add(prefix);
+ break;
+ case SyncKind.Shared:
+ prefixesS.Add(prefix);
+ break;
+ }
+ }
}
+ // Update the queries
+ RemoveStaleReminders(prefixesS, _queryCustomShared);
+ RemoveStaleReminders(prefixesC, _queryCustomConfigured);
+ }
+
+ private void RemoveStaleReminders(ISet prefixes, SearchQuery.Or query)
+ {
// Remove all operands for which we do not want the prefix
- for (int i = 0; i < _queryCustom.Operands.Count;)
+ for (int i = 0; i < query.Operands.Count;)
{
- SearchQuery.PropertyContent element = _queryCustom.Operands[i] as SearchQuery.PropertyContent;
+ SearchQuery.PropertyContent element = query.Operands[i] as SearchQuery.PropertyContent;
if (element != null)
{
string prefix = (string)element.Content;
@@ -175,7 +229,7 @@ namespace Acacia.Features.SharedFolders
}
Logger.Instance.Trace(this, "Unwanted prefix at {0}: {1}", i, prefix);
- _queryCustom.Operands.RemoveAt(i);
+ query.Operands.RemoveAt(i);
_queryCustomModified = true;
}
else ++i;
@@ -186,7 +240,7 @@ namespace Acacia.Features.SharedFolders
{
// Sanity check. The check for shared folders also excludes any weird ids; e.g. if permissions are wrong,
// this will not be a sync id, but a backend id.
- if (folderId == null || !folderId.IsShared)
+ if (folderId == null || !folderId.IsCustom)
return null;
return folderId.ToString() + ":";
}
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushTypes.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushTypes.cs
index fbbeadc..a5bd0ad 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushTypes.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushTypes.cs
@@ -69,6 +69,14 @@ namespace Acacia.ZPush
#endregion
}
+ public enum SyncKind
+ {
+ Normal,
+ Shared,
+ Configured,
+ GAB
+ }
+
public class SyncId : ZPushId
{
public static readonly SyncId NONE = new SyncId("0");
@@ -76,10 +84,24 @@ namespace Acacia.ZPush
public SyncId(string id) : base(id) { }
public SyncId(int id) : base(id) { }
+
+ public SyncKind Kind
+ {
+ get
+ {
+ if (_id.StartsWith("S"))
+ return SyncKind.Shared;
+ if (_id.StartsWith("C"))
+ return SyncKind.Configured;
+ if (_id.StartsWith("G"))
+ return SyncKind.GAB;
+ return SyncKind.Normal;
+ }
+ }
///
/// Checks if this is a SyncId for a shared folders
///
- public bool IsShared { get { return _id.StartsWith("S") || _id.StartsWith("C") || _id.StartsWith("G"); } }
+ public bool IsCustom { get { return Kind != SyncKind.Normal; } }
#region Standard overrides
From be5d6986541f899d859aecac35fc843969ad3ba8 Mon Sep 17 00:00:00 2001
From: Patrick Simpson
Date: Wed, 8 Nov 2017 12:53:57 +0200
Subject: [PATCH 3/6] [KOE-139] Added tooltips and support for disabling tree
nodes in shared folders dialog, to support configured folders
---
.../AcaciaZPushPlugin/Controls/KTree.cs | 25 +++++++------------
.../AcaciaZPushPlugin/Controls/KTreeNode.cs | 1 +
.../Features/SharedFolders/FolderTreeNode.cs | 3 +++
.../SharedFolders/SharedFoldersDialog.cs | 11 +++++++-
.../SharedFolders/SharedFoldersDialog.resx | 2 +-
.../Features/SharedFolders/StoreTreeNode.cs | 13 +++++++++-
.../Properties/Resources.Designer.cs | 10 ++++++++
.../Properties/Resources.resx | 4 +++
8 files changed, 50 insertions(+), 19 deletions(-)
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTree.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTree.cs
index a4b3d1d..cbcd617 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTree.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTree.cs
@@ -56,7 +56,7 @@ namespace Acacia.Controls
CheckStateChanged(this, new CheckStateChangedEventArgs(node));
}
}
-
+ private ToolTip toolTip;
private KCheckManager _checkManager;
[Browsable(false)]
public KCheckManager CheckManager
@@ -181,6 +181,8 @@ namespace Acacia.Controls
SetStyle(ControlStyles.Selectable, true);
BackColor = SystemColors.Window;
+ toolTip = new ToolTip();
+
_rootNodes = new KTreeNodes(this);
SetupRenderer();
InitScrollBars();
@@ -449,6 +451,12 @@ namespace Acacia.Controls
// Render new node
if (_highlightNode != null)
Rerender(_highlightNode);
+
+ // Update any tooltips
+ if (old?.ToolTip != null)
+ toolTip.SetToolTip(this, null);
+ if (_highlightNode?.ToolTip != null)
+ toolTip.SetToolTip(this, _highlightNode.ToolTip);
}
}
@@ -1147,20 +1155,5 @@ namespace Acacia.Controls
#endregion
-
- #region Winforms Autogenerated
-
- private void InitializeComponent()
- {
- this.SuspendLayout();
- //
- // KTree
- //
- this.Name = "KTree";
- this.ResumeLayout(false);
- }
-
- #endregion
-
}
}
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeNode.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeNode.cs
index 0d69747..83183b7 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeNode.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeNode.cs
@@ -64,6 +64,7 @@ namespace Acacia.Controls
public int? ImageIndex { get; set; }
public object Tag { get; set; }
+ public string ToolTip { get; set; }
#endregion
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FolderTreeNode.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FolderTreeNode.cs
index 16c3230..f1efeda 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FolderTreeNode.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FolderTreeNode.cs
@@ -30,6 +30,7 @@ namespace Acacia.Features.SharedFolders
private readonly StoreTreeNode _store;
private readonly AvailableFolder _folder;
private SharedFolder _share;
+ public bool IsReadOnly { get { return _store.IsReadOnly; } }
public FolderTreeNode(StoreTreeNode store, AvailableFolder folder, SharedFolder share)
{
@@ -39,6 +40,8 @@ namespace Acacia.Features.SharedFolders
this.Text = folder.Name;
+ HasCheckBox = !IsReadOnly;
+
// Image
// TODO: clean this up
int index = ((int)OutlookConstants.BASIC_SYNC_TYPES[(int)folder.Type]) - 1;
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs
index 9d0f93d..efce1de 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs
@@ -261,7 +261,8 @@ namespace Acacia.Features.SharedFolders
// Add the node
node = new StoreTreeNode(_folders, gabLookup.GAB,
- user, user.DisplayName, currentShares ?? new Dictionary());
+ user, user.DisplayName, currentShares ?? new Dictionary(),
+ false);
node.DirtyChanged += UserSharesChanged;
_userFolders.Add(user, node);
kTreeFolders.RootNodes.Add(node);
@@ -409,6 +410,7 @@ namespace Acacia.Features.SharedFolders
OptionSendAs = null;
OptionReminders = null;
OptionPermissions = null;
+ bool readOnly = false;
foreach (KTreeNode node in nodes)
{
@@ -421,6 +423,10 @@ namespace Acacia.Features.SharedFolders
if (!folderNode.IsShared)
continue;
+ // 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;
@@ -497,6 +503,9 @@ namespace Acacia.Features.SharedFolders
checkReminders.ThreeState = true;
}
}
+
+ // Apply read-only state
+ _layoutOptions.Enabled = !readOnly;
}
finally
{
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.resx b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.resx
index a3eb232..79c73f4 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.resx
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.resx
@@ -607,7 +607,7 @@
2
- <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="_labelName" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textName" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="_labelSendAs" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="checkSendAs" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="_labelReminders" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="checkReminders" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="_labelPermissions" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="labelPermissionsValue" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="AutoSize,0,Percent,100" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0" /></TableLayoutSettings>
+ <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="_labelName" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textName" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="_labelSendAs" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="checkSendAs" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="_labelReminders" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="checkReminders" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="_labelPermissions" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="labelPermissionsValue" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="AutoSize,0,Percent,100" /><Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /></TableLayoutSettings>
Fill
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/StoreTreeNode.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/StoreTreeNode.cs
index d7b57c3..4f8733f 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/StoreTreeNode.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/StoreTreeNode.cs
@@ -46,8 +46,11 @@ namespace Acacia.Features.SharedFolders
private readonly GABHandler _gab;
private readonly GABUser _user;
+ public readonly bool IsReadOnly;
+
public StoreTreeNode(SharedFoldersManager folders, GABHandler gab, GABUser user, string text,
- Dictionary currentFolders)
+ Dictionary currentFolders,
+ bool readOnly)
:
base(text)
{
@@ -55,6 +58,7 @@ namespace Acacia.Features.SharedFolders
this._feature = folders.Feature;
this._gab = gab;
this._user = user;
+ this.IsReadOnly = readOnly;
// Create an empty current state. When loading the nodes, the shares will be added. This has the benefit of
// cleaning up automatically any obsolote shares.
@@ -63,6 +67,7 @@ namespace Acacia.Features.SharedFolders
ChildLoader = new UserFolderLoader(this, folders, user);
ChildLoader.ReloadOnCloseOpen = true;
HasCheckBox = false;
+ ApplyReadOnly(this, IsReadOnly);
// TODO: better icons, better way of handling this
ImageIndex = user == GABUser.USER_PUBLIC ? 0 : 11;
@@ -78,6 +83,11 @@ namespace Acacia.Features.SharedFolders
Control = _reloader;
}
+ private static void ApplyReadOnly(KTreeNode node, bool isReadOnly)
+ {
+ node.ToolTip = isReadOnly ? Properties.Resources.SharedFolders_Node_Readonly_ToolTip : null;
+ }
+
public GABUser User
{
get { return ((UserFolderLoader)ChildLoader).User; }
@@ -264,6 +274,7 @@ namespace Acacia.Features.SharedFolders
// Create the tree node
SharedFolder share = rootNode.GetInitialShareState(folder);
FolderTreeNode child = new FolderTreeNode(rootNode, folder, share);
+ ApplyReadOnly(child, child.IsReadOnly);
// Add
children.Add(child);
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs
index 1e86f86..112e362 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs
@@ -1093,6 +1093,16 @@ namespace Acacia.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to The folder has been configured by your system administrator and cannot be modified.
+ ///Please contact your system administrator for any required changes..
+ ///
+ internal static string SharedFolders_Node_Readonly_ToolTip {
+ get {
+ return ResourceManager.GetString("SharedFolders_Node_Readonly_ToolTip", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to No shared folders are available or you do not have permissions to view the root of the inbox..
///
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx
index 0c60b45..a714232 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx
@@ -520,4 +520,8 @@
Shared folders
+
+ The folder has been configured by your system administrator and cannot be modified.
+Please contact your system administrator for any required changes.
+
\ No newline at end of file
From 7404b15d7a69fea343d2791a870b776330560fc0 Mon Sep 17 00:00:00 2001
From: Patrick Simpson
Date: Wed, 8 Nov 2017 13:26:01 +0200
Subject: [PATCH 4/6] [KOE-149] Setting displayName later in GAB syncing, to
prevent Outlook from constructing its own version.
---
.../AcaciaZPushPlugin/Features/GAB/GABHandler.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/GAB/GABHandler.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/GAB/GABHandler.cs
index aba773c..5e0372e 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/GAB/GABHandler.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/GAB/GABHandler.cs
@@ -515,11 +515,11 @@ namespace Acacia.Features.GAB
contact.CustomerID = id;
// Create the contact data
- if (Get(value, "displayName") != null) contact.FullName = Get(value, "displayName");
if (Get(value, "givenName") != null) contact.FirstName = Get(value, "givenName");
if (Get(value, "initials") != null) contact.Initials = Get(value, "initials");
if (Get(value, "surname") != null) contact.LastName = Get(value, "surname");
if (Get(value, "title") != null) contact.JobTitle = Get(value, "title");
+ if (Get(value, "displayName") != null) contact.FullName = Get(value, "displayName");
if (Get(value, "smtpAddress") != null)
{
From b82e2ef8391c284e9287b91347aee894c1d67fa0 Mon Sep 17 00:00:00 2001
From: Patrick Simpson
Date: Wed, 8 Nov 2017 14:39:52 +0200
Subject: [PATCH 5/6] [KOE-139] SharedFolderDialog now sets read-only flag on
statically configured shared folders.
---
.../AcaciaZPushPlugin/Controls/KTree.cs | 2 +-
.../AcaciaZPushPlugin/Controls/KTreeNode.cs | 14 ++++++++++++++
.../AcaciaZPushPlugin/Controls/KTreeRenderer.cs | 8 +++++---
.../Features/SharedFolders/FolderTreeNode.cs | 6 ++++--
.../Features/SharedFolders/SharedFoldersDialog.cs | 3 +--
.../Features/SharedFolders/StoreTreeNode.cs | 5 ++---
6 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTree.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTree.cs
index cbcd617..7425f32 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTree.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTree.cs
@@ -97,7 +97,7 @@ namespace Acacia.Controls
private void ToggleCheck(KTreeNode node)
{
- if (_checkManager == null || node == null)
+ if (_checkManager == null || node == null || !node.CheckBoxEnabled)
return;
if (!SelectedNodes.Contains(node) || SelectedNodes.Count == 1)
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeNode.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeNode.cs
index 83183b7..d0a19b9 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeNode.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeNode.cs
@@ -127,6 +127,20 @@ namespace Acacia.Controls
}
}
+ private bool _checkBoxEnabled = true;
+ public bool CheckBoxEnabled
+ {
+ get { return _checkBoxEnabled; }
+ set
+ {
+ if (_checkBoxEnabled != value)
+ {
+ _checkBoxEnabled = value;
+ Owner?.Rerender(this);
+ }
+ }
+ }
+
private bool _isExpanded;
public bool IsExpanded
{
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeRenderer.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeRenderer.cs
index 21c274c..787b49e 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeRenderer.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Controls/KTreeRenderer.cs
@@ -132,7 +132,7 @@ namespace Acacia.Controls
// Checkbox
if (_tree.CheckManager != null && node.HasCheckBox)
{
- RenderCheckBox(graphics, node, dims.GetPartRect(KTreeNodeMeasurements.Part.CheckBox, true), highlight);
+ RenderCheckBox(graphics, node, dims.GetPartRect(KTreeNodeMeasurements.Part.CheckBox, true), highlight, node.CheckBoxEnabled);
}
// Images
@@ -159,10 +159,12 @@ namespace Acacia.Controls
protected abstract void RenderNodeOutline(Graphics graphics, KTreeNode node, Rectangle rect, KTreeNodeMeasurements.Part? highlight);
internal protected abstract void RenderNodeExpander(Graphics graphics, KTreeNode node, Rectangle rect, KTreeNodeMeasurements.Part? highlight);
- protected virtual void RenderCheckBox(Graphics graphics, KTreeNode node, Rectangle rect, KTreeNodeMeasurements.Part? highlight)
+ protected virtual void RenderCheckBox(Graphics graphics, KTreeNode node, Rectangle rect, KTreeNodeMeasurements.Part? highlight, bool enabled)
{
int state = (int)node.CheckState * 4 + 1;
- if (highlight != null && highlight.Value == KTreeNodeMeasurements.Part.CheckBox)
+ if (!enabled)
+ state += 3;
+ else if (highlight != null && highlight.Value == KTreeNodeMeasurements.Part.CheckBox)
state += 1;
CheckBoxRenderer.DrawCheckBox(graphics, rect.Location, (CheckBoxState)state);
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FolderTreeNode.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FolderTreeNode.cs
index f1efeda..8f53e69 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FolderTreeNode.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FolderTreeNode.cs
@@ -30,7 +30,7 @@ namespace Acacia.Features.SharedFolders
private readonly StoreTreeNode _store;
private readonly AvailableFolder _folder;
private SharedFolder _share;
- public bool IsReadOnly { get { return _store.IsReadOnly; } }
+ public readonly bool IsReadOnly;
public FolderTreeNode(StoreTreeNode store, AvailableFolder folder, SharedFolder share)
{
@@ -40,7 +40,9 @@ namespace Acacia.Features.SharedFolders
this.Text = folder.Name;
- HasCheckBox = !IsReadOnly;
+ IsReadOnly = share?.SyncId?.Kind == SyncKind.Configured;
+ HasCheckBox = true;
+ CheckBoxEnabled = !IsReadOnly;
// Image
// TODO: clean this up
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs
index efce1de..444f876 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs
@@ -261,8 +261,7 @@ namespace Acacia.Features.SharedFolders
// Add the node
node = new StoreTreeNode(_folders, gabLookup.GAB,
- user, user.DisplayName, currentShares ?? new Dictionary(),
- false);
+ user, user.DisplayName, currentShares ?? new Dictionary());
node.DirtyChanged += UserSharesChanged;
_userFolders.Add(user, node);
kTreeFolders.RootNodes.Add(node);
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/StoreTreeNode.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/StoreTreeNode.cs
index 4f8733f..a42b327 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/StoreTreeNode.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/StoreTreeNode.cs
@@ -49,8 +49,7 @@ namespace Acacia.Features.SharedFolders
public readonly bool IsReadOnly;
public StoreTreeNode(SharedFoldersManager folders, GABHandler gab, GABUser user, string text,
- Dictionary currentFolders,
- bool readOnly)
+ Dictionary currentFolders)
:
base(text)
{
@@ -58,7 +57,7 @@ namespace Acacia.Features.SharedFolders
this._feature = folders.Feature;
this._gab = gab;
this._user = user;
- this.IsReadOnly = readOnly;
+ this.IsReadOnly = false;
// Create an empty current state. When loading the nodes, the shares will be added. This has the benefit of
// cleaning up automatically any obsolote shares.
From a9a24208882734f7f3b133d4b981e11c62b2a2c9 Mon Sep 17 00:00:00 2001
From: KOE_Export_Strings_Commit
Date: Wed, 8 Nov 2017 12:42:24 +0100
Subject: [PATCH 6/6] Commit strings #237
---
translations/KOE.pot | 8 ++++++++
translations/de.po | 8 ++++++++
translations/en.po | 10 ++++++++++
translations/fr.po | 8 ++++++++
translations/hu.po | 8 ++++++++
translations/it.po | 8 ++++++++
translations/nb.po | 8 ++++++++
translations/nl.po | 16 +++++++++++-----
translations/pt_br.po | 8 ++++++++
9 files changed, 77 insertions(+), 5 deletions(-)
diff --git a/translations/KOE.pot b/translations/KOE.pot
index 816f726..ac07a09 100644
--- a/translations/KOE.pot
+++ b/translations/KOE.pot
@@ -1057,6 +1057,14 @@ msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_LocalFolder_Tit
msgid "Shared folders"
msgstr ""
+#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Node_Readonly_ToolTip
+#, csharp-format
+msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Node_Readonly_ToolTip"
+msgid ""
+"The folder has been configured by your system administrator and cannot be modified. \n"
+"Please contact your system administrator for any required changes."
+msgstr ""
+
#: AcaciaZPushPlugin\UI\ProgressDialog\labelMessage.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\ProgressDialog\\labelMessage.Text"
diff --git a/translations/de.po b/translations/de.po
index f45bf8b..92e426d 100644
--- a/translations/de.po
+++ b/translations/de.po
@@ -1379,3 +1379,11 @@ msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_LocalFolder_Tit
msgid "Shared folders"
msgstr ""
+#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Node_Readonly_ToolTip
+#, csharp-format
+msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Node_Readonly_ToolTip"
+msgid ""
+"The folder has been configured by your system administrator and cannot be modified. \n"
+"Please contact your system administrator for any required changes."
+msgstr ""
+
diff --git a/translations/en.po b/translations/en.po
index 78c9e13..2ba8772 100644
--- a/translations/en.po
+++ b/translations/en.po
@@ -1059,6 +1059,16 @@ msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_LocalFolder_Tit
msgid "Shared folders"
msgstr "Shared folders"
+#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Node_Readonly_ToolTip
+#, csharp-format
+msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Node_Readonly_ToolTip"
+msgid ""
+"The folder has been configured by your system administrator and cannot be modified. \n"
+"Please contact your system administrator for any required changes."
+msgstr ""
+"The folder has been configured by your system administrator and cannot be modified. \n"
+"Please contact your system administrator for any required changes."
+
#: AcaciaZPushPlugin\UI\ProgressDialog\labelMessage.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\ProgressDialog\\labelMessage.Text"
diff --git a/translations/fr.po b/translations/fr.po
index 3315e54..b90fa9e 100644
--- a/translations/fr.po
+++ b/translations/fr.po
@@ -1377,3 +1377,11 @@ msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_LocalFolder_Tit
msgid "Shared folders"
msgstr ""
+#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Node_Readonly_ToolTip
+#, csharp-format
+msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Node_Readonly_ToolTip"
+msgid ""
+"The folder has been configured by your system administrator and cannot be modified. \n"
+"Please contact your system administrator for any required changes."
+msgstr ""
+
diff --git a/translations/hu.po b/translations/hu.po
index ca11fdd..d5dd2cc 100644
--- a/translations/hu.po
+++ b/translations/hu.po
@@ -1380,3 +1380,11 @@ msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_LocalFolder_Tit
msgid "Shared folders"
msgstr ""
+#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Node_Readonly_ToolTip
+#, csharp-format
+msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Node_Readonly_ToolTip"
+msgid ""
+"The folder has been configured by your system administrator and cannot be modified. \n"
+"Please contact your system administrator for any required changes."
+msgstr ""
+
diff --git a/translations/it.po b/translations/it.po
index bcefe08..4796625 100644
--- a/translations/it.po
+++ b/translations/it.po
@@ -1344,3 +1344,11 @@ msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_LocalFolder_Tit
msgid "Shared folders"
msgstr ""
+#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Node_Readonly_ToolTip
+#, csharp-format
+msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Node_Readonly_ToolTip"
+msgid ""
+"The folder has been configured by your system administrator and cannot be modified. \n"
+"Please contact your system administrator for any required changes."
+msgstr ""
+
diff --git a/translations/nb.po b/translations/nb.po
index c884a1b..fa2983c 100644
--- a/translations/nb.po
+++ b/translations/nb.po
@@ -1132,3 +1132,11 @@ msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_LocalFolder_Tit
msgid "Shared folders"
msgstr ""
+#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Node_Readonly_ToolTip
+#, csharp-format
+msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Node_Readonly_ToolTip"
+msgid ""
+"The folder has been configured by your system administrator and cannot be modified. \n"
+"Please contact your system administrator for any required changes."
+msgstr ""
+
diff --git a/translations/nl.po b/translations/nl.po
index 33bfeb2..3f209ab 100644
--- a/translations/nl.po
+++ b/translations/nl.po
@@ -4,8 +4,7 @@ msgstr ""
"POT-Creation-Date: \n"
"PO-Revision-Date: 2017-11-03 10:55+0000\n"
"Last-Translator: Bob \n"
-"Language-Team: Dutch \n"
+"Language-Team: Dutch \n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
@@ -1372,12 +1371,19 @@ msgstr "Kopieer filter"
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_LocalFolder_Body"
msgid "Modifying shared folders locally is not supported. Please use the 'Shared Folders' dialog to modify these folders."
-msgstr ""
-"Het lokaal aanpassen van gedeelde mappen word niet ondersteund. Gebruik het "
-"venster 'Gedeelde Mappen' om deze mappen aan te passen."
+msgstr "Het lokaal aanpassen van gedeelde mappen word niet ondersteund. Gebruik het venster 'Gedeelde Mappen' om deze mappen aan te passen."
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_LocalFolder_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_LocalFolder_Title"
msgid "Shared folders"
msgstr "Gedeelde mappen"
+
+#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Node_Readonly_ToolTip
+#, csharp-format
+msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Node_Readonly_ToolTip"
+msgid ""
+"The folder has been configured by your system administrator and cannot be modified. \n"
+"Please contact your system administrator for any required changes."
+msgstr ""
+
diff --git a/translations/pt_br.po b/translations/pt_br.po
index 7b750e7..33f3bab 100644
--- a/translations/pt_br.po
+++ b/translations/pt_br.po
@@ -1134,3 +1134,11 @@ msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_LocalFolder_Tit
msgid "Shared folders"
msgstr ""
+#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Node_Readonly_ToolTip
+#, csharp-format
+msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Node_Readonly_ToolTip"
+msgid ""
+"The folder has been configured by your system administrator and cannot be modified. \n"
+"Please contact your system administrator for any required changes."
+msgstr ""
+