mirror of
https://github.com/Kopano-dev/kopano-ol-extension.git
synced 2023-10-10 13:37:40 +02:00
[KOE-108] Copying contacts out of the GAB failed as it triggers a write event that is rejected. Fixed by rejecting write events only if there are preceding property changes on the same item. Also fixed a bug that the rejection dialog box was sometimes not shown by setting the parent window explicitly.
This commit is contained in:
parent
28b613af14
commit
4bf4539bda
@ -74,7 +74,8 @@ namespace Acacia.Features.GAB
|
|||||||
if (SuppressModifications && MailEvents != null)
|
if (SuppressModifications && MailEvents != null)
|
||||||
{
|
{
|
||||||
MailEvents.BeforeDelete += SuppressEventHandler_Delete;
|
MailEvents.BeforeDelete += SuppressEventHandler_Delete;
|
||||||
MailEvents.Write += SuppressEventHandler_Modify;
|
MailEvents.PropertyChange += SuppressEventHandler_PropertyChange;
|
||||||
|
MailEvents.Write += SuppressEventHandler_Write;
|
||||||
}
|
}
|
||||||
Watcher.AccountDiscovered += AccountDiscovered;
|
Watcher.AccountDiscovered += AccountDiscovered;
|
||||||
Watcher.AccountRemoved += AccountRemoved;
|
Watcher.AccountRemoved += AccountRemoved;
|
||||||
@ -247,9 +248,27 @@ namespace Acacia.Features.GAB
|
|||||||
SuppressEventHandler(item, false, ref cancel);
|
SuppressEventHandler(item, false, ref cancel);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SuppressEventHandler_Modify(IItem item, ref bool cancel)
|
/// <summary>
|
||||||
|
/// When copying a contact from the GAB to a local folder, Outlook raises the Write event on
|
||||||
|
/// the original. To detect this, we set this id on every property change (which is signalled before
|
||||||
|
/// write), and only suppress if anything has actually changed. If we suppress, the flag is cleared again.
|
||||||
|
/// </summary>
|
||||||
|
private string _propertyChangeId;
|
||||||
|
|
||||||
|
private void SuppressEventHandler_PropertyChange(IItem item, string propertyName)
|
||||||
{
|
{
|
||||||
SuppressEventHandler(item, true, ref cancel);
|
if (_propertyChangeId == item.EntryID)
|
||||||
|
return;
|
||||||
|
_propertyChangeId = item.EntryID;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SuppressEventHandler_Write(IItem item, ref bool cancel)
|
||||||
|
{
|
||||||
|
if (_propertyChangeId == item.EntryID)
|
||||||
|
{
|
||||||
|
SuppressEventHandler(item, true, ref cancel);
|
||||||
|
_propertyChangeId = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SuppressEventHandler(IItem item, bool findInspector, ref bool cancel)
|
private void SuppressEventHandler(IItem item, bool findInspector, ref bool cancel)
|
||||||
@ -301,7 +320,10 @@ namespace Acacia.Features.GAB
|
|||||||
}*/
|
}*/
|
||||||
|
|
||||||
// Show message and cancel event
|
// Show message and cancel event
|
||||||
MessageBox.Show(StringUtil.GetResourceString("GABEvent_Body"),
|
// TODO: show on active inspector if used
|
||||||
|
// [KOE-108] If the window is not specified as parent, it sometimes doesn't show
|
||||||
|
var res = MessageBox.Show(ThisAddIn.Instance.Window,
|
||||||
|
StringUtil.GetResourceString("GABEvent_Body"),
|
||||||
StringUtil.GetResourceString("GABEvent_Title"),
|
StringUtil.GetResourceString("GABEvent_Title"),
|
||||||
MessageBoxButtons.OK,
|
MessageBoxButtons.OK,
|
||||||
MessageBoxIcon.Warning
|
MessageBoxIcon.Warning
|
||||||
|
@ -231,6 +231,10 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
|
|
||||||
#region Window handle
|
#region Window handle
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Simple IWin32Window wrapper for a native handle. NativeWindow sometimes refuses to handle
|
||||||
|
/// these (FromHandle returns null), so use a simple wrapper.
|
||||||
|
/// </summary>
|
||||||
private class WindowHandle : IWin32Window
|
private class WindowHandle : IWin32Window
|
||||||
{
|
{
|
||||||
private IntPtr hWnd;
|
private IntPtr hWnd;
|
||||||
|
@ -38,6 +38,7 @@ namespace Acacia.Utils
|
|||||||
public delegate void MailEventHandler(IMailItem mail);
|
public delegate void MailEventHandler(IMailItem mail);
|
||||||
public delegate void MailResponseEventHandler(IMailItem mail, IMailItem response);
|
public delegate void MailResponseEventHandler(IMailItem mail, IMailItem response);
|
||||||
public delegate void ItemEventHandler(IItem item);
|
public delegate void ItemEventHandler(IItem item);
|
||||||
|
public delegate void PropertyChangeEventHandler(IItem item, string propertyName);
|
||||||
public delegate void CancellableItemEventHandler(IItem item, ref bool cancel);
|
public delegate void CancellableItemEventHandler(IItem item, ref bool cancel);
|
||||||
public delegate void CancellableMailItemEventHandler(IMailItem item, ref bool cancel);
|
public delegate void CancellableMailItemEventHandler(IMailItem item, ref bool cancel);
|
||||||
|
|
||||||
@ -119,6 +120,22 @@ namespace Acacia.Utils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public event PropertyChangeEventHandler PropertyChange;
|
||||||
|
private void OnPropertyChange(IItem item, string propertyName)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (PropertyChange != null && item != null)
|
||||||
|
{
|
||||||
|
PropertyChange(item, propertyName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (System.Exception e)
|
||||||
|
{
|
||||||
|
Logger.Instance.Error(this, "OnPropertyChange: {0}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public event CancellableItemEventHandler BeforeDelete;
|
public event CancellableItemEventHandler BeforeDelete;
|
||||||
private void OnBeforeDelete(IItem item, ref bool cancel)
|
private void OnBeforeDelete(IItem item, ref bool cancel)
|
||||||
{
|
{
|
||||||
@ -369,6 +386,7 @@ namespace Acacia.Utils
|
|||||||
|
|
||||||
events.BeforeDelete += HandleBeforeDelete;
|
events.BeforeDelete += HandleBeforeDelete;
|
||||||
events.Forward += HandleForward;
|
events.Forward += HandleForward;
|
||||||
|
events.PropertyChange += HandlePropertyChange;
|
||||||
events.Read += HandleRead;
|
events.Read += HandleRead;
|
||||||
events.Reply += HandleReply;
|
events.Reply += HandleReply;
|
||||||
events.ReplyAll += HandleReplyAll;
|
events.ReplyAll += HandleReplyAll;
|
||||||
@ -379,6 +397,7 @@ namespace Acacia.Utils
|
|||||||
{
|
{
|
||||||
events.BeforeDelete -= HandleBeforeDelete;
|
events.BeforeDelete -= HandleBeforeDelete;
|
||||||
events.Forward -= HandleForward;
|
events.Forward -= HandleForward;
|
||||||
|
events.PropertyChange -= HandlePropertyChange;
|
||||||
events.Read -= HandleRead;
|
events.Read -= HandleRead;
|
||||||
events.Reply -= HandleReply;
|
events.Reply -= HandleReply;
|
||||||
events.ReplyAll -= HandleReplyAll;
|
events.ReplyAll -= HandleReplyAll;
|
||||||
@ -400,8 +419,14 @@ namespace Acacia.Utils
|
|||||||
_events.OnForward(_item as IMailItem, wrapped as IMailItem);
|
_events.OnForward(_item as IMailItem, wrapped as IMailItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void HandlePropertyChange(string name)
|
||||||
|
{
|
||||||
|
_events.OnPropertyChange(_item, name);
|
||||||
|
}
|
||||||
|
|
||||||
private void HandleRead()
|
private void HandleRead()
|
||||||
{
|
{
|
||||||
|
// TODO: should this not be simply an IItem?
|
||||||
_events.OnRead(_item as IMailItem);
|
_events.OnRead(_item as IMailItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user