mirror of
https://github.com/Kopano-dev/kopano-ol-extension.git
synced 2023-10-10 13:37:40 +02:00
Cleaned up OutlookImageList
This commit is contained in:
parent
46c3caf960
commit
0eb4412ed4
@ -281,10 +281,15 @@
|
|||||||
<Compile Include="OutlookConstants.cs" />
|
<Compile Include="OutlookConstants.cs" />
|
||||||
<Compile Include="Stubs\IAddIn.cs" />
|
<Compile Include="Stubs\IAddIn.cs" />
|
||||||
<Compile Include="Stubs\IAddressEntry.cs" />
|
<Compile Include="Stubs\IAddressEntry.cs" />
|
||||||
|
<Compile Include="Stubs\ICommandBars.cs" />
|
||||||
<Compile Include="Stubs\IComWrapper.cs" />
|
<Compile Include="Stubs\IComWrapper.cs" />
|
||||||
|
<Compile Include="Stubs\IExplorer.cs" />
|
||||||
|
<Compile Include="Stubs\IOutlookWindow.cs" />
|
||||||
<Compile Include="Stubs\IRecipient.cs" />
|
<Compile Include="Stubs\IRecipient.cs" />
|
||||||
<Compile Include="Stubs\OutlookWrappers\AddInWrapper.cs" />
|
<Compile Include="Stubs\OutlookWrappers\AddInWrapper.cs" />
|
||||||
<Compile Include="Stubs\OutlookWrappers\AddressEntryWrapper.cs" />
|
<Compile Include="Stubs\OutlookWrappers\AddressEntryWrapper.cs" />
|
||||||
|
<Compile Include="Stubs\OutlookWrappers\CommandBarsWrapper.cs" />
|
||||||
|
<Compile Include="Stubs\OutlookWrappers\ExplorerWrapper.cs" />
|
||||||
<Compile Include="Stubs\OutlookWrappers\OutlookItemWrapper.cs" />
|
<Compile Include="Stubs\OutlookWrappers\OutlookItemWrapper.cs" />
|
||||||
<Compile Include="Stubs\OutlookWrappers\RecipientWrapper.cs" />
|
<Compile Include="Stubs\OutlookWrappers\RecipientWrapper.cs" />
|
||||||
<Compile Include="UI\Outlook\OutlookImageList.cs" />
|
<Compile Include="UI\Outlook\OutlookImageList.cs" />
|
||||||
@ -293,6 +298,7 @@
|
|||||||
<Compile Include="UI\Outlook\CommandElement.cs" />
|
<Compile Include="UI\Outlook\CommandElement.cs" />
|
||||||
<Compile Include="UI\Outlook\MenuItem.cs" />
|
<Compile Include="UI\Outlook\MenuItem.cs" />
|
||||||
<Compile Include="UI\Outlook\Types.cs" />
|
<Compile Include="UI\Outlook\Types.cs" />
|
||||||
|
<Compile Include="Utils\ImageUtils.cs" />
|
||||||
<Compile Include="Utils\RegistryUtil.cs" />
|
<Compile Include="Utils\RegistryUtil.cs" />
|
||||||
<Compile Include="ZPush\API\SharedFolders\AvailableFolder.cs" />
|
<Compile Include="ZPush\API\SharedFolders\AvailableFolder.cs" />
|
||||||
<Compile Include="ZPush\API\SharedFolders\SharedFolder.cs" />
|
<Compile Include="ZPush\API\SharedFolders\SharedFolder.cs" />
|
||||||
|
@ -22,9 +22,14 @@ namespace Acacia.Stubs
|
|||||||
IEnumerable<KeyValuePair<string,string>> COMAddIns { get; }
|
IEnumerable<KeyValuePair<string,string>> COMAddIns { get; }
|
||||||
string Version { get; }
|
string Version { get; }
|
||||||
|
|
||||||
IWin32Window Window { get; }
|
#region UI
|
||||||
|
|
||||||
OutlookUI OutlookUI { get; }
|
OutlookUI OutlookUI { get; }
|
||||||
|
IWin32Window Window { get; }
|
||||||
|
IExplorer GetActiveExplorer();
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
#region Event handlers
|
#region Event handlers
|
||||||
|
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Acacia.Stubs
|
||||||
|
{
|
||||||
|
public interface IMSOCommand
|
||||||
|
{
|
||||||
|
Bitmap GetImage(Size imageSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ICommandBars : IComWrapper
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the command with the specified id.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">The id.</param>
|
||||||
|
/// <returns>The command, or null if it does not exist.</returns>
|
||||||
|
IMSOCommand GetMso(string id);
|
||||||
|
}
|
||||||
|
}
|
17
src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IExplorer.cs
Normal file
17
src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IExplorer.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Acacia.Stubs
|
||||||
|
{
|
||||||
|
public interface IExplorer : IOutlookWindow
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the command bars.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The command bars. The caller is responsible for disposing.</returns>
|
||||||
|
ICommandBars GetCommandBars();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Acacia.Stubs
|
||||||
|
{
|
||||||
|
public interface IOutlookWindow : IComWrapper
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@ -82,8 +82,62 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region UI
|
||||||
|
|
||||||
public OutlookUI OutlookUI { get { return _thisAddIn.OutlookUI; } }
|
public OutlookUI OutlookUI { get { return _thisAddIn.OutlookUI; } }
|
||||||
|
|
||||||
|
public IExplorer GetActiveExplorer()
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
return new ExplorerWrapper(com.Add(_thisAddIn.Application).ActiveExplorer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Window handle
|
||||||
|
|
||||||
|
private class WindowHandle : IWin32Window
|
||||||
|
{
|
||||||
|
private IntPtr hWnd;
|
||||||
|
|
||||||
|
public WindowHandle(IntPtr hWnd)
|
||||||
|
{
|
||||||
|
this.hWnd = hWnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntPtr Handle
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return hWnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IWin32Window Window
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
IOleWindow win = _app.ActiveWindow() as IOleWindow;
|
||||||
|
if (win == null)
|
||||||
|
return null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
IntPtr hWnd;
|
||||||
|
win.GetWindow(out hWnd);
|
||||||
|
return new WindowHandle(hWnd);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
ComRelease.Release(win);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
public ZPushWatcher Watcher { get { return _thisAddIn.Watcher; } }
|
public ZPushWatcher Watcher { get { return _thisAddIn.Watcher; } }
|
||||||
public MailEvents MailEvents { get { return _thisAddIn.MailEvents; } }
|
public MailEvents MailEvents { get { return _thisAddIn.MailEvents; } }
|
||||||
public IEnumerable<Feature> Features { get { return _thisAddIn.Features; } }
|
public IEnumerable<Feature> Features { get { return _thisAddIn.Features; } }
|
||||||
@ -148,48 +202,6 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Window handle
|
|
||||||
|
|
||||||
private class WindowHandle : IWin32Window
|
|
||||||
{
|
|
||||||
private IntPtr hWnd;
|
|
||||||
|
|
||||||
public WindowHandle(IntPtr hWnd)
|
|
||||||
{
|
|
||||||
this.hWnd = hWnd;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntPtr Handle
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return hWnd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IWin32Window Window
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
IOleWindow win = _app.ActiveWindow() as IOleWindow;
|
|
||||||
if (win == null)
|
|
||||||
return null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
IntPtr hWnd;
|
|
||||||
win.GetWindow(out hWnd);
|
|
||||||
return new WindowHandle(hWnd);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(win);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
public IRecipient ResolveRecipient(string name)
|
public IRecipient ResolveRecipient(string name)
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
using Acacia.Utils;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using NSOffice = Microsoft.Office.Core;
|
||||||
|
using System.Drawing;
|
||||||
|
using stdole;
|
||||||
|
|
||||||
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
|
{
|
||||||
|
class CommandBarsWrapper : ComWrapper, ICommandBars
|
||||||
|
{
|
||||||
|
private class MSOCommand : IMSOCommand
|
||||||
|
{
|
||||||
|
private readonly CommandBarsWrapper _commands;
|
||||||
|
private readonly string _id;
|
||||||
|
|
||||||
|
public MSOCommand(CommandBarsWrapper commands, string id)
|
||||||
|
{
|
||||||
|
this._commands = commands;
|
||||||
|
this._id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap GetImage(Size imageSize)
|
||||||
|
{
|
||||||
|
IPictureDisp pict = _commands._item.GetImageMso(_id, imageSize.Width, imageSize.Height);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return ImageUtils.GetBitmapFromHBitmap(new IntPtr(pict.Handle));
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
ComRelease.Release(pict);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private NSOffice.CommandBars _item;
|
||||||
|
|
||||||
|
public CommandBarsWrapper(NSOffice.CommandBars item)
|
||||||
|
{
|
||||||
|
this._item = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IMSOCommand GetMso(string id)
|
||||||
|
{
|
||||||
|
return new MSOCommand(this, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: make TypedComWrapper
|
||||||
|
protected override void DoRelease()
|
||||||
|
{
|
||||||
|
ComRelease.Release(_item);
|
||||||
|
_item = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
using Acacia.Utils;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
|
{
|
||||||
|
class ExplorerWrapper : ComWrapper, IExplorer
|
||||||
|
{
|
||||||
|
private NSOutlook.Explorer _item;
|
||||||
|
|
||||||
|
public ExplorerWrapper(NSOutlook.Explorer item)
|
||||||
|
{
|
||||||
|
this._item = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void DoRelease()
|
||||||
|
{
|
||||||
|
ComRelease.Release(_item);
|
||||||
|
_item = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICommandBars GetCommandBars()
|
||||||
|
{
|
||||||
|
return new CommandBarsWrapper(_item.CommandBars);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -44,10 +44,6 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
this._item = item;
|
this._item = item;
|
||||||
}
|
}
|
||||||
|
|
||||||
~OutlookWrapper()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void DoRelease()
|
protected override void DoRelease()
|
||||||
{
|
{
|
||||||
if (_props != null)
|
if (_props != null)
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
/// Copyright 2016 Kopano b.v.
|
|
||||||
|
using Acacia.Stubs;
|
||||||
|
using Acacia.Utils;
|
||||||
|
/// Copyright 2016 Kopano b.v.
|
||||||
///
|
///
|
||||||
/// This program is free software: you can redistribute it and/or modify
|
/// This program is free software: you can redistribute it and/or modify
|
||||||
/// it under the terms of the GNU Affero General Public License, version 3,
|
/// it under the terms of the GNU Affero General Public License, version 3,
|
||||||
@ -13,7 +16,6 @@
|
|||||||
/// along with this program.If not, see<http://www.gnu.org/licenses/>.
|
/// along with this program.If not, see<http://www.gnu.org/licenses/>.
|
||||||
///
|
///
|
||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Microsoft.Office.Core;
|
using Microsoft.Office.Core;
|
||||||
using stdole;
|
using stdole;
|
||||||
using System;
|
using System;
|
||||||
@ -35,93 +37,6 @@ namespace Acacia.UI.Outlook
|
|||||||
{
|
{
|
||||||
public ImageList Images { get; private set; }
|
public ImageList Images { get; private set; }
|
||||||
|
|
||||||
[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
|
|
||||||
public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
|
|
||||||
|
|
||||||
private Bitmap GetBitmapFromHBitmap2(IntPtr nativeHBitmap)
|
|
||||||
{
|
|
||||||
|
|
||||||
Bitmap bmp = Bitmap.FromHbitmap(nativeHBitmap);
|
|
||||||
if (Bitmap.GetPixelFormatSize(bmp.PixelFormat) < 32)
|
|
||||||
return bmp;
|
|
||||||
|
|
||||||
// Special handling is required to convert a bitmap with alpha channel, FromHBitmap doesn't
|
|
||||||
// set the correct pixel format
|
|
||||||
Rectangle bmBounds = new Rectangle(0, 0, bmp.Width, bmp.Height);
|
|
||||||
BitmapData bmpData = bmp.LockBits(bmBounds, ImageLockMode.ReadOnly, bmp.PixelFormat);
|
|
||||||
Bitmap bmp2 = new Bitmap(bmpData.Width, bmpData.Height, PixelFormat.Format32bppArgb);
|
|
||||||
BitmapData bmpData2 = bmp2.LockBits(bmBounds, ImageLockMode.WriteOnly, bmp2.PixelFormat);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
for (int y = 0; y < bmp.Height; ++y)
|
|
||||||
{
|
|
||||||
IntPtr target = bmpData2.Scan0 + bmpData2.Stride * y;
|
|
||||||
IntPtr source = bmpData.Scan0 + bmpData.Stride * y;
|
|
||||||
CopyMemory(target, source, (uint)Math.Abs(bmpData2.Stride));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
bmp2.UnlockBits(bmpData2);
|
|
||||||
bmp.UnlockBits(bmpData);
|
|
||||||
}
|
|
||||||
return bmp2;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Bitmap GetBitmapFromHBitmap(IntPtr nativeHBitmap)
|
|
||||||
{
|
|
||||||
Bitmap bmp = Bitmap.FromHbitmap(nativeHBitmap);
|
|
||||||
|
|
||||||
if (Bitmap.GetPixelFormatSize(bmp.PixelFormat) < 32)
|
|
||||||
return bmp;
|
|
||||||
|
|
||||||
BitmapData bmpData;
|
|
||||||
|
|
||||||
if (IsAlphaBitmap(bmp, out bmpData))
|
|
||||||
return GetlAlphaBitmapFromBitmapData(bmpData);
|
|
||||||
|
|
||||||
return bmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Bitmap GetlAlphaBitmapFromBitmapData(BitmapData bmpData)
|
|
||||||
{
|
|
||||||
return new Bitmap(
|
|
||||||
bmpData.Width,
|
|
||||||
bmpData.Height,
|
|
||||||
bmpData.Stride,
|
|
||||||
PixelFormat.Format32bppArgb,
|
|
||||||
bmpData.Scan0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsAlphaBitmap(Bitmap bmp, out BitmapData bmpData)
|
|
||||||
{
|
|
||||||
Rectangle bmBounds = new Rectangle(0, 0, bmp.Width, bmp.Height);
|
|
||||||
|
|
||||||
bmpData = bmp.LockBits(bmBounds, ImageLockMode.ReadOnly, bmp.PixelFormat);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
for (int y = 0; y <= bmpData.Height - 1; y++)
|
|
||||||
{
|
|
||||||
for (int x = 0; x <= bmpData.Width - 1; x++)
|
|
||||||
{
|
|
||||||
Color pixelColor = Color.FromArgb(
|
|
||||||
Marshal.ReadInt32(bmpData.Scan0, (bmpData.Stride * y) + (4 * x)));
|
|
||||||
|
|
||||||
if (pixelColor.A > 0 & pixelColor.A < 255)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
bmp.UnlockBits(bmpData);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
public OutlookImageList(params string[] icons)
|
public OutlookImageList(params string[] icons)
|
||||||
{
|
{
|
||||||
Images = new ImageList();
|
Images = new ImageList();
|
||||||
@ -129,12 +44,13 @@ namespace Acacia.UI.Outlook
|
|||||||
Images.ImageSize = new Size(16, 16);
|
Images.ImageSize = new Size(16, 16);
|
||||||
|
|
||||||
// TODO: memory management
|
// TODO: memory management
|
||||||
CommandBars cmdBars = ThisAddIn.Instance.RawApp.ActiveWindow().CommandBars;
|
using (IExplorer explorer = ThisAddIn.Instance.GetActiveExplorer())
|
||||||
foreach (string id in icons)
|
using (ICommandBars cmdBars = explorer.GetCommandBars())
|
||||||
{
|
{
|
||||||
IPictureDisp pict = cmdBars.GetImageMso(id, Images.ImageSize.Width, Images.ImageSize.Height);
|
foreach (string id in icons)
|
||||||
var img = GetBitmapFromHBitmap2(new IntPtr(pict.Handle));
|
{
|
||||||
Images.Images.Add(img);
|
Images.Images.Add(cmdBars.GetMso(id).GetImage(Images.ImageSize));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
47
src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/ImageUtils.cs
Normal file
47
src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/ImageUtils.cs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Acacia.Utils
|
||||||
|
{
|
||||||
|
public static class ImageUtils
|
||||||
|
{
|
||||||
|
[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
|
||||||
|
private static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
|
||||||
|
|
||||||
|
public static Bitmap GetBitmapFromHBitmap(IntPtr nativeHBitmap)
|
||||||
|
{
|
||||||
|
|
||||||
|
Bitmap bmp = Bitmap.FromHbitmap(nativeHBitmap);
|
||||||
|
if (Bitmap.GetPixelFormatSize(bmp.PixelFormat) < 32)
|
||||||
|
return bmp;
|
||||||
|
|
||||||
|
// Special handling is required to convert a bitmap with alpha channel, FromHBitmap doesn't
|
||||||
|
// set the correct pixel format
|
||||||
|
Rectangle bmBounds = new Rectangle(0, 0, bmp.Width, bmp.Height);
|
||||||
|
BitmapData bmpData = bmp.LockBits(bmBounds, ImageLockMode.ReadOnly, bmp.PixelFormat);
|
||||||
|
Bitmap bmp2 = new Bitmap(bmpData.Width, bmpData.Height, PixelFormat.Format32bppArgb);
|
||||||
|
BitmapData bmpData2 = bmp2.LockBits(bmBounds, ImageLockMode.WriteOnly, bmp2.PixelFormat);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for (int y = 0; y < bmp.Height; ++y)
|
||||||
|
{
|
||||||
|
IntPtr target = bmpData2.Scan0 + bmpData2.Stride * y;
|
||||||
|
IntPtr source = bmpData.Scan0 + bmpData.Stride * y;
|
||||||
|
CopyMemory(target, source, (uint)Math.Abs(bmpData2.Stride));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
bmp2.UnlockBits(bmpData2);
|
||||||
|
bmp.UnlockBits(bmpData);
|
||||||
|
}
|
||||||
|
return bmp2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -134,11 +134,14 @@ namespace Acacia.ZPush
|
|||||||
if (GlobalOptions.INSTANCE.LocalFolders_Hide)
|
if (GlobalOptions.INSTANCE.LocalFolders_Hide)
|
||||||
{
|
{
|
||||||
// Hide the folders that are not custom folders
|
// Hide the folders that are not custom folders
|
||||||
using (ComRelease com = new ComRelease())
|
using (IFolder root = store.GetRootFolder())
|
||||||
{
|
{
|
||||||
foreach(IFolder sub in store.GetRootFolder().GetSubFolders())
|
foreach(IFolder sub in root.GetSubFolders())
|
||||||
{
|
{
|
||||||
sub.AttrHidden = !IsCustomFolder(sub);
|
using (sub)
|
||||||
|
{
|
||||||
|
sub.AttrHidden = !IsCustomFolder(sub);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user