miranda/Hyphen/Plugins/Native/CLISTMENUITEM.cs
2013-06-25 22:53:41 +00:00

129 lines
5.0 KiB
C#

/***********************************************************************\
* Virtuoso.Miranda.Plugins (Hyphen) *
* Provides a managed wrapper for API of IM client Miranda. *
* Copyright (C) 2006-2009 virtuoso *
* deml.tomas@seznam.cz *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2.1 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
\***********************************************************************/
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using Virtuoso.Miranda.Plugins.Infrastructure;
using System.Drawing;
using System.Diagnostics;
using System.IO;
namespace Virtuoso.Miranda.Plugins.Native
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
internal struct CLISTMENUITEM
{
#region Fields
private readonly int Size;
public string Text;
public uint Flags;
public int Position;
public IntPtr Icon;
public string Service;
public string PopUpMenu;
public int PopUpPosition;
public uint HotKey;
public string ContactOwner;
#endregion
#region .ctors
public CLISTMENUITEM(MirandaPlugin owner, MenuItemDeclarationAttribute attrib)
{
if (owner == null)
throw new ArgumentNullException("owner");
if (attrib == null)
throw new ArgumentNullException("attrib");
this.Text = attrib.Text;
this.Service = attrib.Service;
this.ContactOwner = attrib.OwningModule;
this.Flags = (uint)attrib.Flags;
this.PopUpMenu = attrib.PopUpMenu;
this.PopUpPosition = attrib.PopUpPosition;
this.Position = attrib.Position;
this.HotKey = (uint)attrib.HotKey;
this.Icon = IntPtr.Zero;
this.Size = Marshal.SizeOf(typeof(CLISTMENUITEM));
LoadIcon(owner, attrib);
}
#endregion
#region Methods
private void LoadIcon(MirandaPlugin owner, MenuItemDeclarationAttribute attrib)
{
try
{
if (!attrib.HasIcon)
return;
if (attrib.UseEmbeddedIcon)
{
using (Stream stream = owner.GetType().Assembly.GetManifestResourceStream(attrib.IconID))
{
if (stream != null)
Icon = IconImageCache.Singleton.GetStreamedIcon(stream).Handle;
else
Debug.Fail("Embedded icon not found.");
}
}
else
Icon = Skin.LoadIcon(int.Parse(attrib.IconID));
}
catch
{
this.Icon = IntPtr.Zero;
}
}
#endregion
}
/*
typedef struct {
int cbSize; //size in bytes of this structure
char *pszName; //text of the menu item
DWORD flags; //flags
int position; //approx position on the menu. lower numbers go nearer the top
HICON hIcon; //HasIcon to put by the item. If this was not loaded from
//a resource, you can delete it straight after the call
char *pszService; //eventName of service to call when the item gets selected
char *pszPopupName; //eventName of the popup menu that this item is on. If this
//is NULL the item is on the root of the menu
int popupPosition; //position of the popup menu on the root menu. Ignored
//if pszPopupName is NULL or the popup menu already
//existed
DWORD hotKey; //keyboard accelerator, same as lParam of WM_HOTKEY
//0 for none
char *pszContactOwner; //contact menus only. The protocol module that owns
//the contacts to which this menu item applies. NULL if it
//applies to all contacts. If it applies to multiple but not all
//protocols, add multiple menu items or use ME_CLIST_PREBUILDCONTACTMENU
} CLISTMENUITEM;
*/
}