mit hyphen

This commit is contained in:
BlubbFish 2013-06-25 22:53:41 +00:00
parent 8896edc368
commit 318d93e6c1
424 changed files with 161843 additions and 2 deletions

View File

@ -42,7 +42,7 @@ namespace Miranda
{
}
protected override void AfterPluginInitialization()
/*protected override void AfterPluginInitialization()
{
base.AfterPluginInitialization();
}
@ -70,6 +70,6 @@ namespace Miranda
public override object InitializeLifetimeService()
{
return base.InitializeLifetimeService();
}
}*/
}
}

View File

@ -29,6 +29,35 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<CodeAnalysisLogFile>..\library\Managed\AutoConnect.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>..\library\Managed\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<CodeAnalysisLogFile>..\library\Managed\AutoConnect.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
</PropertyGroup>
<ItemGroup>
<Reference Include="Hyphen">

View File

@ -0,0 +1,29 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
namespace Virtuoso.Miranda.Plugins
{
public abstract class AssemblyProbe : RemoteObject
{
public abstract string[] FindAssemblies();
}
}

View File

@ -0,0 +1,31 @@
/***********************************************************************\
* 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.Serialization;
namespace Virtuoso.Miranda.Plugins.Collections
{
[Serializable]
public class ConfigurationValues : Dictionary<string, string>
{
public ConfigurationValues() : base(1) { }
protected ConfigurationValues(SerializationInfo info, StreamingContext context) : base(info, context) { }
}
}

View File

@ -0,0 +1,33 @@
/***********************************************************************\
* 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.Windows.Forms;
namespace Virtuoso.Miranda.Plugins.Collections
{
public sealed class ControlCollection : List<Control>
{
#region .ctors
internal ControlCollection() : base(1) { }
#endregion
}
}

View File

@ -0,0 +1,29 @@
/***********************************************************************\
* 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 Virtuoso.Hyphen.Mini.Custom;
namespace Virtuoso.Miranda.Plugins.Collections
{
internal sealed class CustomApiExportDescriptorCollection : List<CustomApiExportDescriptor>
{
public CustomApiExportDescriptorCollection() : base() { }
}
}

View File

@ -0,0 +1,34 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
namespace Virtuoso.Miranda.Plugins.Collections
{
[CLSCompliant(false)]
public sealed class EventHandleCollection : List<EventHandle>
{
#region .ctors
internal EventHandleCollection() : base(3) { }
#endregion
}
}

View File

@ -0,0 +1,55 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
namespace Virtuoso.Miranda.Plugins.Collections
{
internal sealed class HookDescriptorCollection : List<HookDescriptor>, ITagSearchable<HookDescriptor>
{
#region .ctors
public HookDescriptorCollection() : base(3) { }
#endregion
#region Impl
public new void Add(HookDescriptor item)
{
if (Contains(item)) return;
base.Add(item);
}
public HookDescriptor Find(string name)
{
if (name == null)
throw new ArgumentNullException("name");
foreach (HookDescriptor descriptor in this)
if (descriptor.Name == name)
return descriptor;
return null;
}
#endregion
}
}

View File

@ -0,0 +1,26 @@
/***********************************************************************\
* 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;
namespace Virtuoso.Miranda.Plugins.Collections
{
internal interface ITagSearchable<T>
{
T Find(string tag);
}
}

View File

@ -0,0 +1,53 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
namespace Virtuoso.Miranda.Plugins.Collections
{
public sealed class MenuItemDeclarationCollection : List<MenuItemDeclarationAttribute>, ITagSearchable<MenuItemDeclarationAttribute>
{
#region .ctors
internal MenuItemDeclarationCollection() : base(3) { }
#endregion
#region Impl
public MenuItemDeclarationAttribute this[string tag]
{
get
{
return Find(tag);
}
}
public MenuItemDeclarationAttribute Find(string tag)
{
foreach (MenuItemDeclarationAttribute item in this)
if (item.Tag.Equals(tag, StringComparison.Ordinal)) return item;
return null;
}
#endregion
}
}

View File

@ -0,0 +1,58 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
using System.Collections.ObjectModel;
namespace Virtuoso.Miranda.Plugins.Collections
{
public sealed class MenuItemDeclarationReadOnlyCollection : ReadOnlyCollection<MenuItemDeclarationAttribute>, ITagSearchable<MenuItemDeclarationAttribute>
{
#region .ctors
internal MenuItemDeclarationReadOnlyCollection(MenuItemDeclarationCollection list) : base(list) { }
#endregion
#region Impl
public MenuItemDeclarationAttribute this[string tag]
{
get
{
return Find(tag);
}
}
public MenuItemDeclarationAttribute Find(string tag)
{
if (String.IsNullOrEmpty(tag))
throw new ArgumentNullException("tag");
foreach (MenuItemDeclarationAttribute item in this)
if (tag.Equals(item.Tag, StringComparison.Ordinal))
return item;
return null;
}
#endregion
}
}

View File

@ -0,0 +1,33 @@
/***********************************************************************\
* 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 Virtuoso.Hyphen.Mini;
namespace Virtuoso.Miranda.Plugins.Collections
{
public sealed class ModuleCollection : List<Module>
{
#region .ctors
internal ModuleCollection() : base(1) { }
#endregion
}
}

View File

@ -0,0 +1,35 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
using System.Collections.ObjectModel;
using Virtuoso.Hyphen.Mini;
namespace Virtuoso.Miranda.Plugins.Collections
{
public sealed class ModuleReadOnlyCollection : ReadOnlyCollection<Module>
{
#region .ctors
internal ModuleReadOnlyCollection(ModuleCollection list) : base(list) { }
#endregion
}
}

View File

@ -0,0 +1,77 @@
/***********************************************************************\
* 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;
namespace Virtuoso.Miranda.Plugins.Collections
{
/* DO NOT USE FIND... OR CONTAINS... METHODS THAT ACCEPT A TYPE INSTANCE FROM ANOTHER APPDOMAIN,
* YOU MAY LEAK ITS ASSEMBLY TO THAT DOMAIN. */
public sealed class PluginDescriptorCollection : List<PluginDescriptor>
{
#region .ctors
internal PluginDescriptorCollection() : base(3) { }
#endregion
#region Find methods
public PluginDescriptor FindDescriptorOf(MirandaPlugin plugin)
{
if (plugin == null)
throw new ArgumentNullException("plugin");
foreach (PluginDescriptor descriptor in this)
if (descriptor.Plugin == plugin) return descriptor;
return null;
}
public PluginDescriptor FindDescriptorOf(Type pluginType)
{
if (pluginType == null)
throw new ArgumentNullException("plugin");
if (!pluginType.IsSubclassOf(DefaultPluginManager.PluginType))
return null;
foreach (PluginDescriptor descriptor in this)
if (descriptor.Plugin.GetType() == pluginType) return descriptor;
return null;
}
#endregion
#region Contains methods
public bool ContainsDescriptorOf(MirandaPlugin plugin)
{
return (FindDescriptorOf(plugin) != null);
}
public bool ContainsDescriptorOf(Type pluginType)
{
return (FindDescriptorOf(pluginType) != null);
}
#endregion
}
}

View File

@ -0,0 +1,64 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
using System.Collections.ObjectModel;
namespace Virtuoso.Miranda.Plugins.Collections
{
/* DO NOT USE FIND... OR CONTAINS... METHODS THAT ACCEPT A TYPE INSTANCE FROM ANOTHER APPDOMAIN,
* YOU MAY LEAK AN ASSEMBLY TO THAT DOMAIN. */
public sealed class PluginDescriptorReadOnlyCollection : ReadOnlyCollection<PluginDescriptor>
{
#region .ctors
internal PluginDescriptorReadOnlyCollection(PluginDescriptorCollection list) : base(list) { }
#endregion
#region Find methods
public PluginDescriptor FindDescriptorOf(MirandaPlugin plugin)
{
return ((PluginDescriptorCollection)Items).FindDescriptorOf(plugin);
}
public PluginDescriptor FindDescriptorOf(Type pluginType)
{
return ((PluginDescriptorCollection)Items).FindDescriptorOf(pluginType);
}
#endregion
#region Contains methods
public bool ContainsDescriptorOf(MirandaPlugin plugin)
{
return ((PluginDescriptorCollection)Items).FindDescriptorOf(plugin) != null;
}
public bool ContainsDescriptorOf(Type pluginType)
{
return ((PluginDescriptorCollection)Items).FindDescriptorOf(pluginType) != null;
}
#endregion
}
}

View File

@ -0,0 +1,53 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
using System.Runtime.Serialization;
using System.Diagnostics;
namespace Virtuoso.Miranda.Plugins.Collections
{
public sealed class ProtocolDictionary : Dictionary<string, Protocol>
{
#region .ctors
internal ProtocolDictionary(int count) : base(count) { }
#endregion
#region Indexers
public new Protocol this[string key]
{
get
{
bool notFound = (key == null || !ContainsKey(key));
Debug.Assert(!notFound);
if (notFound)
return Protocol.UnknownProtocol;
return base[key];
}
}
#endregion
}
}

View File

@ -0,0 +1,101 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
using Virtuoso.Miranda.Plugins.Configuration.Forms.Controls;
using Virtuoso.Miranda.Plugins.Configuration.Forms;
using Virtuoso.Miranda.Plugins.Configuration;
namespace Virtuoso.Miranda.Plugins
{
public abstract class ConfigurableMirandaPlugin<TConfiguration> : MirandaPlugin, IConfigurablePluginBase<TConfiguration> where TConfiguration : PluginConfiguration
{
#region Fields
private TConfiguration pluginConfiguration;
public TConfiguration PluginConfiguration
{
get { return pluginConfiguration; }
}
private PluginConfiguration[] configuration;
PluginConfiguration[] IConfigurablePlugin.Configuration
{
get { return configuration ?? (configuration = new PluginConfiguration[] { pluginConfiguration }); }
}
#endregion
#region .ctors
protected ConfigurableMirandaPlugin() { }
#endregion
#region Methods
internal override void AfterPluginInitializationInternal()
{
pluginConfiguration = Infrastructure.PluginConfiguration.Load<TConfiguration>();
base.AfterPluginInitializationInternal();
}
internal override void BeforePluginDisableInternal()
{
SaveConfiguration();
base.BeforePluginDisableInternal();
}
internal override void BeforeMirandaShutdownInternal()
{
SaveConfiguration();
base.BeforeMirandaShutdownInternal();
}
private void SaveConfiguration()
{
//if (pluginConfiguration.IsDirty)
pluginConfiguration.Save();
}
public void ResetConfiguration()
{
pluginConfiguration = Infrastructure.PluginConfiguration.GetDefaultConfiguration<TConfiguration>();
}
public void ReloadConfiguration()
{
pluginConfiguration = Infrastructure.PluginConfiguration.Load<TConfiguration>();
}
public abstract void PopulateConfiguration(CategoryCollection categories);
#endregion
#region Properties
public override bool HasOptions
{
get { return true; }
}
#endregion
}
}

View File

@ -0,0 +1,73 @@
/***********************************************************************\
* 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.Drawing;
using System.Windows.Forms;
using Virtuoso.Miranda.Plugins.Infrastructure;
namespace Virtuoso.Miranda.Plugins.Configuration
{
[Serializable]
public sealed class Category
{
#region Fields
private string name, description;
private CategoryItemCollection items;
#endregion
#region .ctors
public Category(string name, string description)
{
if (String.IsNullOrEmpty(name))
throw new ArgumentNullException("name");
if (String.IsNullOrEmpty(description))
throw new ArgumentNullException("description");
this.items = new CategoryItemCollection();
this.name = name;
this.description = description;
}
#endregion
#region Properties
public string Description
{
get { return description; }
}
public string Name
{
get { return name; }
}
public CategoryItemCollection Items
{
get { return items; }
}
#endregion
}
}

View File

@ -0,0 +1,33 @@
/***********************************************************************\
* 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;
namespace Virtuoso.Miranda.Plugins.Configuration
{
[Serializable]
public sealed class CategoryCollection : List<Category>
{
#region .ctors
public CategoryCollection() : base(1) { }
#endregion
}
}

View File

@ -0,0 +1,133 @@
/***********************************************************************\
* 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.Windows.Forms;
using System.Drawing;
using Virtuoso.Miranda.Plugins.Configuration.Forms.Controls;
using Virtuoso.Miranda.Plugins.Infrastructure;
namespace Virtuoso.Miranda.Plugins.Configuration
{
[Serializable]
public sealed class CategoryItem
{
#region Delegates
public delegate void Command(CategoryItem item);
#endregion
#region Fields
private string name, description;
private CategoryItemControl control;
private Type controlType;
private Image image;
private bool isExpertOption;
#endregion
#region .ctors
public CategoryItem(string name, string description, Command command)
: this(name, description)
{
if (command == null)
throw new ArgumentNullException("command");
control = new CategoryItemCommandControl(this, command);
}
public CategoryItem(string name, string description, Type itemOptionsType)
: this(name, description)
{
if (itemOptionsType == null)
throw new ArgumentNullException("itemOptionsType");
if (!itemOptionsType.IsSubclassOf(typeof(CategoryItemControl)))
throw new ArgumentException("Type must derive from the CategoryItemOptionsControl class.", "itemOptionsType");
this.controlType = itemOptionsType;
}
private CategoryItem(string name, string description)
{
if (String.IsNullOrEmpty(name))
throw new ArgumentNullException("name");
if (String.IsNullOrEmpty(description))
throw new ArgumentNullException("description");
this.name = name;
this.description = description;
}
#endregion
#region Properties
public string Name
{
get { return name; }
}
public string Description
{
get { return description; }
}
public Image Image
{
get { return image; }
set { image = value; }
}
internal CategoryItemControl Control
{
get
{
if (control == null)
{
control = (CategoryItemControl)Activator.CreateInstance(controlType, true);
control.Initialize(this);
}
return control;
}
}
internal bool ControlInitialized
{
get
{
return control != null;
}
}
public bool IsExpertOption
{
get { return isExpertOption; }
set { isExpertOption = value; }
}
#endregion
}
}

View File

@ -0,0 +1,33 @@
/***********************************************************************\
* 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;
namespace Virtuoso.Miranda.Plugins.Configuration
{
[Serializable]
public sealed class CategoryItemCollection : List<CategoryItem>
{
#region .ctors
internal CategoryItemCollection() : base(1) { }
#endregion
}
}

View File

@ -0,0 +1,55 @@
/***********************************************************************\
* 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;
namespace Virtuoso.Miranda.Plugins.Configuration
{
internal class ConfigurableEntityDescriptor
{
#region .ctors
public ConfigurableEntityDescriptor(IConfigurablePlugin plugin)
{
if (plugin == null)
throw new ArgumentNullException("plugin");
this.plugin = plugin;
}
#endregion
#region Properties
private IConfigurablePlugin plugin;
public IConfigurablePlugin Plugin
{
get { return plugin; }
}
private CategoryCollection categories;
public CategoryCollection Categories
{
get { return categories; }
set { categories = value; }
}
#endregion
}
}

View File

@ -0,0 +1,178 @@
namespace Virtuoso.Miranda.Plugins.Configuration.Forms
{
partial class ConfigurationDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfigurationDialog));
this.TopPanel = new System.Windows.Forms.Panel();
this.RibbonPageSwitcher = new RibbonStyle.TabPageSwitcher();
this.RibbonStrip = new RibbonStyle.TabStrip();
this.BottomPanel = new System.Windows.Forms.Panel();
this.CancelBTN = new System.Windows.Forms.Button();
this.OkBTN = new System.Windows.Forms.Button();
this.ControlPanel = new System.Windows.Forms.Panel();
this.WelcomePanel = new Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemHeader();
this.TopPanel.SuspendLayout();
this.BottomPanel.SuspendLayout();
this.ControlPanel.SuspendLayout();
this.SuspendLayout();
//
// TopPanel
//
this.TopPanel.Controls.Add(this.RibbonPageSwitcher);
this.TopPanel.Controls.Add(this.RibbonStrip);
this.TopPanel.Dock = System.Windows.Forms.DockStyle.Top;
this.TopPanel.Location = new System.Drawing.Point(0, 0);
this.TopPanel.Name = "TopPanel";
this.TopPanel.Size = new System.Drawing.Size(794, 127);
this.TopPanel.TabIndex = 0;
//
// RibbonPageSwitcher
//
this.RibbonPageSwitcher.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(191)))), ((int)(((byte)(219)))), ((int)(((byte)(255)))));
this.RibbonPageSwitcher.Dock = System.Windows.Forms.DockStyle.Fill;
this.RibbonPageSwitcher.Location = new System.Drawing.Point(0, 26);
this.RibbonPageSwitcher.Name = "RibbonPageSwitcher";
this.RibbonPageSwitcher.SelectedTabStripPage = null;
this.RibbonPageSwitcher.Size = new System.Drawing.Size(794, 101);
this.RibbonPageSwitcher.TabIndex = 1;
this.RibbonPageSwitcher.TabStrip = this.RibbonStrip;
this.RibbonPageSwitcher.Text = "RibbonPageSwitcher";
//
// RibbonStrip
//
this.RibbonStrip.AutoSize = false;
this.RibbonStrip.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(191)))), ((int)(((byte)(219)))), ((int)(((byte)(255)))));
this.RibbonStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
this.RibbonStrip.Location = new System.Drawing.Point(0, 0);
this.RibbonStrip.Name = "RibbonStrip";
this.RibbonStrip.Padding = new System.Windows.Forms.Padding(60, 3, 30, 0);
this.RibbonStrip.SelectedTab = null;
this.RibbonStrip.ShowItemToolTips = false;
this.RibbonStrip.Size = new System.Drawing.Size(794, 26);
this.RibbonStrip.TabIndex = 0;
this.RibbonStrip.TabOverlap = 0;
this.RibbonStrip.Text = "tabStrip1";
//
// BottomPanel
//
this.BottomPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(191)))), ((int)(((byte)(219)))), ((int)(((byte)(255)))));
this.BottomPanel.Controls.Add(this.CancelBTN);
this.BottomPanel.Controls.Add(this.OkBTN);
this.BottomPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
this.BottomPanel.Location = new System.Drawing.Point(0, 529);
this.BottomPanel.Name = "BottomPanel";
this.BottomPanel.Size = new System.Drawing.Size(794, 39);
this.BottomPanel.TabIndex = 1;
//
// CancelBTN
//
this.CancelBTN.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.CancelBTN.Location = new System.Drawing.Point(93, 7);
this.CancelBTN.Name = "CancelBTN";
this.CancelBTN.Size = new System.Drawing.Size(75, 23);
this.CancelBTN.TabIndex = 0;
this.CancelBTN.Text = "Cancel";
this.CancelBTN.UseVisualStyleBackColor = true;
this.CancelBTN.Click += new System.EventHandler(this.CancelBTN_Click);
//
// OkBTN
//
this.OkBTN.DialogResult = System.Windows.Forms.DialogResult.OK;
this.OkBTN.Location = new System.Drawing.Point(12, 7);
this.OkBTN.Name = "OkBTN";
this.OkBTN.Size = new System.Drawing.Size(75, 23);
this.OkBTN.TabIndex = 0;
this.OkBTN.Text = "OK";
this.OkBTN.UseVisualStyleBackColor = true;
this.OkBTN.Click += new System.EventHandler(this.OkBTN_Click);
//
// ControlPanel
//
this.ControlPanel.AutoScroll = true;
this.ControlPanel.Controls.Add(this.WelcomePanel);
this.ControlPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.ControlPanel.Location = new System.Drawing.Point(0, 127);
this.ControlPanel.Name = "ControlPanel";
this.ControlPanel.Size = new System.Drawing.Size(794, 402);
this.ControlPanel.TabIndex = 2;
//
// WelcomePanel
//
this.WelcomePanel.BackColor = System.Drawing.Color.Transparent;
this.WelcomePanel.Color = System.Drawing.Color.FromArgb(((int)(((byte)(191)))), ((int)(((byte)(219)))), ((int)(((byte)(255)))));
this.WelcomePanel.Dock = System.Windows.Forms.DockStyle.Top;
this.WelcomePanel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.WelcomePanel.HeaderFont = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.WelcomePanel.HeaderText = " Select a tab and pick a section to configure...";
this.WelcomePanel.Image = ((System.Drawing.Image)(resources.GetObject("WelcomePanel.Image")));
this.WelcomePanel.Location = new System.Drawing.Point(0, 0);
this.WelcomePanel.MinimumSize = new System.Drawing.Size(300, 40);
this.WelcomePanel.Name = "WelcomePanel";
this.WelcomePanel.Size = new System.Drawing.Size(794, 100);
this.WelcomePanel.TabIndex = 1;
//
// ConfigurationDialog
//
this.AcceptButton = this.OkBTN;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Window;
this.CancelButton = this.CancelBTN;
this.ClientSize = new System.Drawing.Size(794, 568);
this.Controls.Add(this.ControlPanel);
this.Controls.Add(this.TopPanel);
this.Controls.Add(this.BottomPanel);
this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimumSize = new System.Drawing.Size(800, 600);
this.Name = "ConfigurationDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Hyphen Configuration Center";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ConfigurationDialog_FormClosing);
this.TopPanel.ResumeLayout(false);
this.BottomPanel.ResumeLayout(false);
this.ControlPanel.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel TopPanel;
private RibbonStyle.TabPageSwitcher RibbonPageSwitcher;
private RibbonStyle.TabStrip RibbonStrip;
private System.Windows.Forms.Button CancelBTN;
private System.Windows.Forms.Button OkBTN;
private System.Windows.Forms.Panel ControlPanel;
private System.Windows.Forms.Panel BottomPanel;
private Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemHeader WelcomePanel;
}
}

View File

@ -0,0 +1,460 @@
/***********************************************************************\
* 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.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Virtuoso.Miranda.Plugins.Resources;
using Virtuoso.Miranda.Plugins.Properties;
using Virtuoso.Miranda.Plugins.Configuration.Forms.Controls;
using RibbonStyle;
using Virtuoso.Miranda.Plugins.Infrastructure;
using Virtuoso.Miranda.Plugins.Collections;
using Virtuoso.Hyphen;
using Virtuoso.Hyphen.Mini;
using System.Collections.ObjectModel;
using Virtuoso.Miranda.Plugins.Forms;
using Virtuoso.Hyphen.Configuration;
namespace Virtuoso.Miranda.Plugins.Configuration.Forms
{
/// <codename>Casablanca</codename>
public sealed partial class ConfigurationDialog : SingletonDialog
{
#region Fields
private bool Ok;
private List<ConfigurableEntityDescriptor> ConfigurableEntities;
private const char PathSeparator = '/';
private string[] CurrentPath;
private string ConfigurationParameter;
private CategoryCollection categories;
#endregion
#region .ctors
private ConfigurationDialog()
{
InitializeComponent();
((RibbonStyle.TabStripProfessionalRenderer)RibbonStrip.Renderer).HaloColor = Color.FromArgb(254, 209, 94);
((RibbonStyle.TabStripProfessionalRenderer)RibbonStrip.Renderer).BaseColor = Color.FromArgb(215, 227, 242);
categories = new CategoryCollection();
ConfigurableEntities = new List<ConfigurableEntityDescriptor>(5);
}
public static void Present(bool modal)
{
Present(modal, null, null);
}
public static void Present(bool modal, IConfigurablePlugin plugin)
{
Present(modal, plugin, null);
}
public static void Present(bool modal, string path)
{
Present(modal, null, path);
}
public static void Present(bool modal, IConfigurablePlugin plugin, string path)
{
ConfigurationDialog dialog = ConfigurationDialog.GetSingleton<ConfigurationDialog>(false);
if (dialog == null)
{
dialog = new ConfigurationDialog();
dialog.SetPath(path);
dialog.Populate(plugin);
}
dialog.ShowSingleton(modal);
}
#endregion
#region UI Handlers
private void OkBTN_Click(object sender, EventArgs e)
{
Ok = true;
Close();
}
private void CancelBTN_Click(object sender, EventArgs e)
{
Ok = false;
Close();
}
private void ConfigurationDialog_FormClosing(object sender, FormClosingEventArgs e)
{
if (Ok && !CanDismissActiveControl())
{
e.Cancel = true;
return;
}
foreach (ConfigurableEntityDescriptor descriptor in ConfigurableEntities)
ProcessChanges(descriptor, Ok);
if (Ok)
Settings.Default.Save();
}
private void ProcessChanges(ConfigurableEntityDescriptor descriptor, bool save)
{
foreach (Category category in descriptor.Categories)
{
foreach (CategoryItem item in category.Items)
{
if (!item.ControlInitialized)
continue;
CategoryItemControl control = item.Control;
if (save && control.IsDirty)
control.Save();
control.Close();
}
}
if (save)
{
foreach (PluginConfiguration config in descriptor.Plugin.Configuration)
if (config != null)
config.Save();
}
}
#endregion
#region Methods
#region Create/Set path
public static string CreatePath(IConfigurablePlugin plugin, string category, string item)
{
return CreatePath(plugin, category, item, null);
}
public static string CreatePath(IConfigurablePlugin plugin, string category, string item, string parameter)
{
if (plugin == null)
throw new ArgumentNullException("plugin");
if (String.IsNullOrEmpty(category))
throw new ArgumentNullException("category");
if (String.IsNullOrEmpty(item))
throw new ArgumentNullException("item");
return String.Format("{1}{0}{2}{0}{3}{0}{4}", PathSeparator.ToString(), plugin.Name, category, item, (parameter ?? String.Empty));
}
private void SetPath(string path)
{
if (String.IsNullOrEmpty(path))
return;
CurrentPath = path.Split(PathSeparator);
if (CurrentPath.Length != 4)
throw new ArgumentOutOfRangeException("path");
ConfigurationParameter = (String.IsNullOrEmpty(CurrentPath[3]) ? null : CurrentPath[3]);
}
private bool CanNavigateTo(IConfigurablePlugin plugin, Category category)
{
if (plugin == null)
throw new ArgumentNullException("plugin");
if (category == null)
throw new ArgumentNullException("category");
if (CurrentPath == null)
return false;
return (CurrentPath[0] == plugin.Name && CurrentPath[1] == category.Name);
}
private bool CanNavigateTo(CategoryItem item)
{
if (item == null)
throw new ArgumentNullException("item");
if (CurrentPath == null)
return false;
return CurrentPath[2] == item.Name;
}
#endregion
#region Entity population
private void Populate(IConfigurablePlugin pluginToPopulate)
{
ConfigurableEntities.Clear();
RibbonPageSwitcher.SelectedTabStripPage = null;
RibbonStrip.Items.Clear();
if (pluginToPopulate == null)
{
PopulateHyphenConfiguration();
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
PopulateStandalonePlugins();
else
PopulateIsolatedPlugins();
}
else
{
ConfigurableEntities.Add(new ConfigurableEntityDescriptor(pluginToPopulate));
Text += String.Format(" : {0}", pluginToPopulate.Name);
}
PopulateItems();
}
private void PopulateItems()
{
CategoryCollection categories = null;
for (int i = 0; i < ConfigurableEntities.Count; i++)
{
ConfigurableEntityDescriptor descriptor = ConfigurableEntities[i];
TabStripPage page = CreateAndRegisterEntityPage(categories, descriptor.Plugin, i);
descriptor.Categories = (categories = new CategoryCollection());
descriptor.Plugin.PopulateConfiguration(categories);
for (int j = 0; j < categories.Count; j++)
{
Category category = categories[j];
if (category == null)
continue;
PopulateCategoryPanel(page, category, descriptor.Plugin, j);
}
}
}
private void PopulateIsolatedPlugins()
{
PluginDescriptorReadOnlyCollection plugins = MirandaContext.Current.PluginManager.Plugins;
try
{
SynchronizationHelper.BeginCollectionUpdate(plugins);
foreach (PluginDescriptor descriptor in plugins)
if (descriptor.IsConfigurable)
ConfigurableEntities.Add(new ConfigurableEntityDescriptor((IConfigurablePlugin)descriptor.Plugin));
}
finally
{
SynchronizationHelper.EndUpdate(plugins);
}
}
private void PopulateStandalonePlugins()
{
ModuleReadOnlyCollection modules = ModuleManager.Singleton.RegisteredModules;
try
{
SynchronizationHelper.BeginCollectionUpdate(modules);
foreach (Module module in modules)
if (module.StandalonePlugin.Descriptor.IsConfigurable)
ConfigurableEntities.Add(new ConfigurableEntityDescriptor((IConfigurablePlugin)module.StandalonePlugin));
}
finally
{
SynchronizationHelper.EndUpdate(modules);
}
}
private void PopulateHyphenConfiguration()
{
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
ConfigurableEntities.Add(new ConfigurableEntityDescriptor(RuntimeConfigurator.Singleton));
else
ConfigurableEntities.Add(new ConfigurableEntityDescriptor(PMConfigurator.Singleton));
}
#endregion
#region Entity control creation
private void PopulateCategoryPanel(TabStripPage entityPage, Category category, IConfigurablePlugin plugin, int index)
{
TabPanel categoryPanel = CreateCategoryPanel(category, index);
entityPage.Controls.Add(categoryPanel);
if (CanNavigateTo(plugin, category))
RibbonPageSwitcher.SelectedTabStripPage = entityPage;
Point nextLocation = new Point();
foreach (CategoryItem item in category.Items)
{
RibbonButton btn = CreateButton(item, ref nextLocation);
categoryPanel.Controls.Add(btn);
if (CanNavigateTo(item))
RibbonButton_Click(btn, EventArgs.Empty);
}
}
private RibbonButton CreateButton(CategoryItem item, ref Point nextLocation)
{
RibbonButton btn = new RibbonButton();
btn.Text = item.Name;
btn.ShowInfoTips = true;
btn.InfoTitle = item.Name;
btn.InfoComment = item.Description;
if (item.Image == null)
item.Image = VisualResources.Image_64x67_Configuration;
btn.img = item.Image;
btn.Size = btn.img.Size;
if (nextLocation.IsEmpty)
nextLocation = new Point(-btn.Size.Width, 6);
btn.img_on = Properties.Resources.RibbonHover;
btn.img_click = Properties.Resources.RibbonClick;
nextLocation.Offset(btn.img.Size.Width + 5, 0);
btn.Location = nextLocation;
btn.Tag = item;
btn.Click += RibbonButton_Click;
return btn;
}
private TabPanel CreateCategoryPanel(Category category, int index)
{
TabPanel categoryPanel = new TabPanel();
categoryPanel.BaseColor = System.Drawing.Color.FromArgb(215, 227, 242);
categoryPanel.BaseColorOn = System.Drawing.Color.FromArgb(233, 239, 248);
categoryPanel.Dock = System.Windows.Forms.DockStyle.Left;
categoryPanel.ForeColor = System.Drawing.SystemColors.Desktop;
categoryPanel.Location = new System.Drawing.Point(101, 3);
categoryPanel.Opacity = 255;
categoryPanel.Padding = new System.Windows.Forms.Padding(6, 3, 6, 0);
categoryPanel.AutoSize = true;
categoryPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
categoryPanel.Speed = 1;
categoryPanel.TabIndex = index;
categoryPanel.Caption = category.Name;
return categoryPanel;
}
private TabStripPage CreateAndRegisterEntityPage(CategoryCollection categories, IConfigurablePlugin entity, int index)
{
TabStripPage entityPage = new TabStripPage();
entityPage.BaseColor = System.Drawing.Color.FromArgb(215, 227, 242);
entityPage.BaseColorOn = System.Drawing.Color.FromArgb(215, 227, 242);
entityPage.Dock = System.Windows.Forms.DockStyle.Fill;
entityPage.Opacity = 255;
entityPage.Padding = new System.Windows.Forms.Padding(0, 3, 0, 0);
entityPage.Size = new System.Drawing.Size(784, 99);
entityPage.Speed = 1;
entityPage.TabIndex = index;
RibbonPageSwitcher.Controls.Add(entityPage);
Tab entityTab = new Tab(entity.Name);
entityTab.AutoSize = false;
entityTab.Checked = true;
entityTab.CheckState = CheckState.Checked;
entityTab.ForeColor = System.Drawing.Color.FromArgb(44, 90, 154);
entityTab.Margin = new Padding(6, 1, 0, 2);
entityTab.Size = new Size(73, 23);
entityTab.Text = entity.Name;
entityTab.TabStripPage = entityPage;
if (entity is IInternalConfigurator)
entityTab.Image = VisualResources.Icon_16x16_Hyphen.ToBitmap();
RibbonStrip.Items.Add(entityTab);
return entityPage;
}
#endregion
#region Entity control handling
private bool CanDismissActiveControl()
{
if (ControlPanel.Controls.Count > 0 && ControlPanel.Controls[0] is CategoryItemControl)
return !((CategoryItemControl)ControlPanel.Controls[0]).OnHide();
else
return true;
}
private void RibbonButton_Click(object sender, EventArgs e)
{
RibbonButton btn = (RibbonButton)sender;
CategoryItem item = (CategoryItem)btn.Tag;
bool firstTime = !item.ControlInitialized;
CategoryItemControl control = item.Control;
control.OnSelected();
if (control.HasUI && !control.OnShow(firstTime))
{
if (!CanDismissActiveControl())
return;
control.ConfigurationParameter = ConfigurationParameter;
ControlPanel.Controls.Clear();
control.Dock = DockStyle.Fill;
ControlPanel.Controls.Add(control);
}
}
#endregion
#endregion
}
}

View File

@ -0,0 +1,222 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="RibbonStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="WelcomePanel.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/ooVVrpFy/wAAAACZfl//g2tQ/wAAAAB+ZEb/h2xPNgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt5x6mb6liv+9ooL/yLKa/7Wljf+qjXL/lH5j/49x
VJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9oYAwu5173bmdevDgzbn/8OTT/+bXxP/m0cH/1cOt/8Ks
k/+vknH8mH1f1I5zVTKTjY2ylpGR/2liYf9pYmH/fHBn/8WskP/u28v/9+nb/9S9qf+8pIf/vaWH/72h
hP/Muqb/ybWg/6eJbf+NclRJlpGR/9zVzv/w6eD/7uXb//Ts4//Rup3/9una/8ezmv/Hspz/9O3k/+/m
3f/Qu6H/wquQ/8q6qf+lj3TwAAAAAH9xa3+IfXr/v7Ss/1hLR//OuJ//59W///Hg0P+UeVr/TD87/4h9
eP9kWVT/wLau/72jhf/Qvaj/tZt9/56EZv8AAAAAg3hzgYZ6dv+IfXj/xK6V/864n//14tH/l3xd/4h9
eP9dUU3/iH14/4Z6dv/DqIj/zr2p/7qcev+Yfl7kAAAAAAAAAABxZWExdGtpnXVsas3EqIv///Xl/9fG
sf+BaET/eG9r1HZsaqO+n4D/2Me0/9nKuf+skHH/AAAAAAAAAACelpT/j4N//5CBf/yql4P/0Lyf/+TP
vP//+ez/28m3/7GZe/+7oYT/1cGs/9zJuv/Ot5r/rJB0/6SIbnQAAAAAkYaC/8xRMP+2OiH/tzoh/7lE
K/++Ykf/2cGr//zu4f//9en/+OfX/9bGr//Jspn/v6GAhKqPbhMAAAAAAAAAAKCYlf7WYUL/yVA2/8hP
Nv/JUDX/yIJl/8uxkf/Himz/1Lyk/8+5nf/Aj3D/vKSL/7OegGMAAAAAAAAAAAAAAAC0sa7/4HFW/9Vf
R//VX0f/1V9H/9VfRv/VX0b/1V9G/8Gnhv/CqIv/0FY+/7SwrPsAAAAAAAAAAAAAAAAAAAAAwcLD/+mA
Z//gblb/4W5V/+BuVf/hbVb/4G1V/+FtVf/hbVb/4G1W/9xkTf/Vzsf0////AQAAAAAAAAAAAAAAAMHB
wv/uinL/6Hdg/+h3YP/od2D/6Hdg/+h3YP/od2D/6Hdg/+h3YP/lblf/187I9wAAAAAAAAAAAAAAAAAA
AADBwsP/7opy/+6Kcv/uinL/7opy/+6Kcv/uinL/7opy/+6Kcv/uinL/7opy/9XQyvsAAAAAAAAAAAAA
AAAAAAAAwcLD/8q+t/7Lua/0yrix7829tPTSxr362MzF/NnNxf/YzcX+2MzE+9jNxf3OzMn+AAAAAAAA
AAAAAAAA/JMAAPwDAADwAAAAAAAAAAABAAAAAAAAgAAAAMABAACAAAAAgAEAAIADAACABwAAgAMAAIAH
AACABwAAgAcAAA==
</value>
</data>
</root>

View File

@ -0,0 +1,61 @@
/***********************************************************************\
* 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;
namespace Virtuoso.Miranda.Plugins.Configuration.Forms.Controls
{
internal sealed class CategoryItemCommandControl : CategoryItemControl
{
#region Fields
private CategoryItem.Command Command;
#endregion
#region .ctors
public CategoryItemCommandControl(CategoryItem item, CategoryItem.Command command)
{
if (command == null)
throw new ArgumentNullException("command");
this.Command = command;
}
#endregion
#region Overrides
protected internal override void OnSelected()
{
Command(ParentItem);
}
protected internal override bool HasUI
{
get
{
return false;
}
}
#endregion
}
}

View File

@ -0,0 +1,137 @@
/***********************************************************************\
* 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.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Security;
namespace Virtuoso.Miranda.Plugins.Configuration.Forms.Controls
{
public partial class CategoryItemControl : UserControl
{
#region .ctors
protected CategoryItemControl()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// CategoryItemControl
//
this.BackColor = System.Drawing.SystemColors.Window;
this.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.Name = "CategoryItemControl";
this.Size = new System.Drawing.Size(792, 400);
this.ResumeLayout(false);
}
#endregion
#region Properties
private bool dirty;
protected internal bool IsDirty
{
get { return dirty; }
set { dirty = value; }
}
private CategoryItem parentItem;
internal CategoryItem ParentItem
{
get { return parentItem; }
}
private string configurationParameter;
protected internal string ConfigurationParameter
{
get { return configurationParameter; }
internal set { configurationParameter = value; }
}
#endregion
#region Virtuals
/// <summary>
/// Gets a value indicating whether the control has an UI to show.
/// </summary>
protected internal virtual bool HasUI { get { return true; } }
/// <summary>
/// Occurs when a control is selected and before it is prepared to be shown.
/// </summary>
protected internal virtual void OnSelected() { }
/// <summary>
/// Occurs when a control is about to be shown. The control is shown when the user clicks on its item.
/// </summary>
/// <param name="firstTime">TRUE if the control is being requested for the first time; FALSE if it is requested repeatedly.</param>
/// <returns>TRUE to cancel the display; FALSE to continue.</returns>
protected internal virtual bool OnShow(bool firstTime) { return false; }
/// <summary>
/// Occurs when a control is about to be hidden. The control is hidden when the user clicks on another item.
/// </summary>
/// <returns>TRUE to cancel the dismissal; FALSE to continue.</returns>
protected internal virtual bool OnHide() { return false; }
/// <summary>
/// Occurs when the user dismisses the configuration dialog via OK button and the control is dirty. The control should save its settings now.
/// </summary>
protected internal virtual void Save() { }
/// <summary>
/// Occurs when the user dismisses the configuration dialog via OK or CANCEL button.
/// </summary>
protected internal virtual void Close() { }
/// <summary>
/// Marks the control dirty.
/// </summary>
protected virtual void SetControlDirtyHandler(object sender, EventArgs e)
{
IsDirty = true;
}
#endregion
#region Methods
internal void Initialize(CategoryItem parentItem)
{
this.parentItem = parentItem;
}
protected void CloseDialog()
{
ParentForm.Close();
}
#endregion
}
}

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -0,0 +1,94 @@
using Virtuoso.Miranda.Plugins.Forms.Controls;
namespace Virtuoso.Miranda.Plugins.Configuration.Forms.Controls
{
partial class CategoryItemHeader
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.ImagePBOX = new System.Windows.Forms.PictureBox();
this.DescriptionLABEL = new System.Windows.Forms.Label();
this.panel1 = new Virtuoso.Miranda.Plugins.Forms.Controls.GradientPanel();
((System.ComponentModel.ISupportInitialize)(this.ImagePBOX)).BeginInit();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// ImagePBOX
//
this.ImagePBOX.Image = global::Virtuoso.Miranda.Plugins.Properties.Resources.Icon_256_32x32;
this.ImagePBOX.Location = new System.Drawing.Point(10, 4);
this.ImagePBOX.Name = "ImagePBOX";
this.ImagePBOX.Size = new System.Drawing.Size(32, 32);
this.ImagePBOX.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.ImagePBOX.TabIndex = 0;
this.ImagePBOX.TabStop = false;
//
// DescriptionLABEL
//
this.DescriptionLABEL.AutoSize = true;
this.DescriptionLABEL.Font = new System.Drawing.Font("Tahoma", 8, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.DescriptionLABEL.ForeColor = System.Drawing.Color.Black;
this.DescriptionLABEL.Location = new System.Drawing.Point(50, 12);
this.DescriptionLABEL.Name = "DescriptionLABEL";
this.DescriptionLABEL.Size = new System.Drawing.Size(0, 16);
this.DescriptionLABEL.TabIndex = 2;
//
// panel1
//
this.panel1.Controls.Add(this.ImagePBOX);
this.panel1.Controls.Add(this.DescriptionLABEL);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.GradientColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Rotation = -90F;
this.panel1.Size = new System.Drawing.Size(765, 40);
this.panel1.TabIndex = 3;
//
// CategoryItemHeader
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Transparent;
this.Controls.Add(this.panel1);
this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.MinimumSize = new System.Drawing.Size(300, 40);
this.Name = "CategoryItemHeader";
this.Size = new System.Drawing.Size(765, 40);
((System.ComponentModel.ISupportInitialize)(this.ImagePBOX)).EndInit();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.PictureBox ImagePBOX;
private System.Windows.Forms.Label DescriptionLABEL;
private GradientPanel panel1;
}
}

View File

@ -0,0 +1,78 @@
/***********************************************************************\
* 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.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Design;
namespace Virtuoso.Miranda.Plugins.Configuration.Forms.Controls
{
public partial class CategoryItemHeader : UserControl
{
public CategoryItemHeader()
{
InitializeComponent();
}
[Browsable(true), Category("Appearance")]
public Image Image
{
get { return ImagePBOX.Image; }
set { ImagePBOX.Image = value; }
}
[Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[Localizable(true), Browsable(true), Category("Appearance"), DefaultValue("Header")]
public string HeaderText
{
get { return DescriptionLABEL.Text; }
set { DescriptionLABEL.Text = value; }
}
[Browsable(true), Category("Appearance")]
public Color Color
{
get { return panel1.GradientColor; }
set { panel1.GradientColor = value; }
}
public override Color ForeColor
{
get
{
return DescriptionLABEL.ForeColor;
}
set
{
DescriptionLABEL.ForeColor = value;
}
}
[Browsable(true), Category("Appearance")]
public Font HeaderFont
{
get { return DescriptionLABEL.Font; }
set { DescriptionLABEL.Font = value; }
}
}
}

View File

@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ImagePBOX.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="DescriptionLABEL.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="panel1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -0,0 +1,79 @@
using Virtuoso.Miranda.Plugins.Forms.Controls;
namespace Virtuoso.Miranda.Plugins.Configuration.Forms.Controls
{
partial class CategoryItemSection
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.panel1 = new Virtuoso.Miranda.Plugins.Forms.Controls.GradientPanel();
this.SectionLABEL = new System.Windows.Forms.Label();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.SectionLABEL);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.GradientColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(224)))), ((int)(((byte)(192)))));
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Rotation = 90F;
this.panel1.Size = new System.Drawing.Size(765, 20);
this.panel1.TabIndex = 1;
//
// SectionLABEL
//
this.SectionLABEL.AutoSize = true;
this.SectionLABEL.ForeColor = System.Drawing.SystemColors.MenuText;
this.SectionLABEL.Location = new System.Drawing.Point(8, 4);
this.SectionLABEL.Name = "SectionLABEL";
this.SectionLABEL.Size = new System.Drawing.Size(0, 13);
this.SectionLABEL.TabIndex = 0;
//
// CategoryItemSection
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Transparent;
this.Controls.Add(this.panel1);
this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.ForeColor = System.Drawing.Color.Black;
this.MinimumSize = new System.Drawing.Size(300, 20);
this.Name = "CategoryItemSection";
this.Size = new System.Drawing.Size(765, 20);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label SectionLABEL;
private GradientPanel panel1;
}
}

View File

@ -0,0 +1,51 @@
/***********************************************************************\
* 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.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Design;
namespace Virtuoso.Miranda.Plugins.Configuration.Forms.Controls
{
public partial class CategoryItemSection : UserControl
{
public CategoryItemSection()
{
InitializeComponent();
}
[Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[Localizable(true), Browsable(true), Category("Appearance"), DefaultValue("Section")]
public string SectionName
{
get { return SectionLABEL.Text; }
set { SectionLABEL.Text = value; }
}
[Browsable(true), Category("Appearance")]
public Color Color
{
get { return panel1.GradientColor; }
set { panel1.GradientColor = value; }
}
}
}

View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="panel1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="SectionLABEL.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -0,0 +1,277 @@
namespace Virtuoso.Miranda.Plugins.Forms.Configuration.Controls
{
partial class ConfigurationPanel
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfigurationPanel));
this.CategoriesILIST = new System.Windows.Forms.ImageList(this.components);
this.Toolbar = new System.Windows.Forms.ToolStrip();
this.ViewsTDBTN = new System.Windows.Forms.ToolStripDropDownButton();
this.detailsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.largeIconsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.CategoryItemsLVIEW = new System.Windows.Forms.ListView();
this.CategoryItemNameCOLUMN = new System.Windows.Forms.ColumnHeader();
this.CategoryItemDescriptionCOLUMN = new System.Windows.Forms.ColumnHeader();
this.CategoryItemsILIST = new System.Windows.Forms.ImageList(this.components);
this.SpecialItemsILIST = new System.Windows.Forms.ImageList(this.components);
this.CategoriesLVIEW = new Virtuoso.Miranda.Plugins.Forms.Configuration.Controls.CategoryListView();
this.NameCOLUMN = new System.Windows.Forms.ColumnHeader();
this.panel1 = new Virtuoso.Miranda.Plugins.Forms.Controls.GradientPanel();
this.CategoryDescriptionLABEL = new System.Windows.Forms.Label();
this.CategoryTitleLABEL = new System.Windows.Forms.Label();
this.CategoryIconPBOX = new System.Windows.Forms.PictureBox();
this.Toolbar.SuspendLayout();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.CategoryIconPBOX)).BeginInit();
this.SuspendLayout();
//
// CategoriesILIST
//
this.CategoriesILIST.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
this.CategoriesILIST.ImageSize = new System.Drawing.Size(16, 16);
this.CategoriesILIST.TransparentColor = System.Drawing.Color.Transparent;
//
// Toolbar
//
this.Toolbar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.Toolbar.AutoSize = false;
this.Toolbar.Dock = System.Windows.Forms.DockStyle.None;
this.Toolbar.Font = new System.Drawing.Font("Tahoma", 8F);
this.Toolbar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
this.Toolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ViewsTDBTN});
this.Toolbar.Location = new System.Drawing.Point(190, 62);
this.Toolbar.Name = "Toolbar";
this.Toolbar.Size = new System.Drawing.Size(510, 34);
this.Toolbar.TabIndex = 2;
this.Toolbar.Text = "toolStrip2";
//
// ViewsTDBTN
//
this.ViewsTDBTN.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.detailsToolStripMenuItem,
this.largeIconsToolStripMenuItem,
this.tilesToolStripMenuItem});
this.ViewsTDBTN.Image = ((System.Drawing.Image)(resources.GetObject("ViewsTDBTN.Image")));
this.ViewsTDBTN.ImageTransparentColor = System.Drawing.Color.Magenta;
this.ViewsTDBTN.Name = "ViewsTDBTN";
this.ViewsTDBTN.Size = new System.Drawing.Size(58, 31);
this.ViewsTDBTN.Text = "View";
this.ViewsTDBTN.DropDownOpening += new System.EventHandler(this.ViewsTDBTN_DropDownOpening);
//
// detailsToolStripMenuItem
//
this.detailsToolStripMenuItem.Name = "detailsToolStripMenuItem";
this.detailsToolStripMenuItem.Size = new System.Drawing.Size(139, 22);
this.detailsToolStripMenuItem.Tag = "Details";
this.detailsToolStripMenuItem.Text = "Details";
this.detailsToolStripMenuItem.Click += new System.EventHandler(this.ViewsItem_Click);
//
// largeIconsToolStripMenuItem
//
this.largeIconsToolStripMenuItem.Name = "largeIconsToolStripMenuItem";
this.largeIconsToolStripMenuItem.Size = new System.Drawing.Size(139, 22);
this.largeIconsToolStripMenuItem.Tag = "LargeIcon";
this.largeIconsToolStripMenuItem.Text = "Large icons";
this.largeIconsToolStripMenuItem.Click += new System.EventHandler(this.ViewsItem_Click);
//
// tilesToolStripMenuItem
//
this.tilesToolStripMenuItem.Name = "tilesToolStripMenuItem";
this.tilesToolStripMenuItem.Size = new System.Drawing.Size(139, 22);
this.tilesToolStripMenuItem.Tag = "Tile";
this.tilesToolStripMenuItem.Text = "Tiles";
this.tilesToolStripMenuItem.Click += new System.EventHandler(this.ViewsItem_Click);
//
// CategoryItemsLVIEW
//
this.CategoryItemsLVIEW.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.CategoryItemsLVIEW.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.CategoryItemsLVIEW.CausesValidation = false;
this.CategoryItemsLVIEW.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.CategoryItemNameCOLUMN,
this.CategoryItemDescriptionCOLUMN});
this.CategoryItemsLVIEW.DataBindings.Add(new System.Windows.Forms.Binding("View", global::Virtuoso.Miranda.Plugins.Properties.Settings.Default, "ConfigurationPanel_CategoryItems_View", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.CategoryItemsLVIEW.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.CategoryItemsLVIEW.LargeImageList = this.CategoryItemsILIST;
this.CategoryItemsLVIEW.Location = new System.Drawing.Point(184, 99);
this.CategoryItemsLVIEW.MultiSelect = false;
this.CategoryItemsLVIEW.Name = "CategoryItemsLVIEW";
this.CategoryItemsLVIEW.ShowGroups = false;
this.CategoryItemsLVIEW.Size = new System.Drawing.Size(515, 401);
this.CategoryItemsLVIEW.SmallImageList = this.CategoryItemsILIST;
this.CategoryItemsLVIEW.TabIndex = 4;
this.CategoryItemsLVIEW.TileSize = new System.Drawing.Size(500, 60);
this.CategoryItemsLVIEW.UseCompatibleStateImageBehavior = false;
this.CategoryItemsLVIEW.View = global::Virtuoso.Miranda.Plugins.Properties.Settings.Default.ConfigurationPanel_CategoryItems_View;
this.CategoryItemsLVIEW.ItemActivate += new System.EventHandler(this.CategoryItemsLVIEW_ItemActivate);
//
// CategoryItemNameCOLUMN
//
this.CategoryItemNameCOLUMN.Text = "Option";
//
// CategoryItemDescriptionCOLUMN
//
this.CategoryItemDescriptionCOLUMN.Text = "Description";
//
// CategoryItemsILIST
//
this.CategoryItemsILIST.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
this.CategoryItemsILIST.ImageSize = new System.Drawing.Size(32, 32);
this.CategoryItemsILIST.TransparentColor = System.Drawing.Color.Transparent;
//
// SpecialItemsILIST
//
this.SpecialItemsILIST.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("SpecialItemsILIST.ImageStream")));
this.SpecialItemsILIST.TransparentColor = System.Drawing.Color.Transparent;
this.SpecialItemsILIST.Images.SetKeyName(0, "Warning");
//
// CategoriesLVIEW
//
this.CategoriesLVIEW.Activation = System.Windows.Forms.ItemActivation.OneClick;
this.CategoriesLVIEW.Alignment = System.Windows.Forms.ListViewAlignment.Left;
this.CategoriesLVIEW.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.CategoriesLVIEW.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.NameCOLUMN});
this.CategoriesLVIEW.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.CategoriesLVIEW.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
this.CategoriesLVIEW.HideSelection = false;
this.CategoriesLVIEW.LargeImageList = this.CategoriesILIST;
this.CategoriesLVIEW.Location = new System.Drawing.Point(0, 0);
this.CategoriesLVIEW.Margin = new System.Windows.Forms.Padding(20, 15, 5, 5);
this.CategoriesLVIEW.MultiSelect = false;
this.CategoriesLVIEW.Name = "CategoriesLVIEW";
this.CategoriesLVIEW.ShowGroups = false;
this.CategoriesLVIEW.Size = new System.Drawing.Size(185, 500);
this.CategoriesLVIEW.Sorting = System.Windows.Forms.SortOrder.Ascending;
this.CategoriesLVIEW.TabIndex = 0;
this.CategoriesLVIEW.TileSize = new System.Drawing.Size(180, 30);
this.CategoriesLVIEW.UseCompatibleStateImageBehavior = false;
this.CategoriesLVIEW.View = System.Windows.Forms.View.Tile;
this.CategoriesLVIEW.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.CategoriesLVIEW_ItemSelectionChanged);
//
// NameCOLUMN
//
this.NameCOLUMN.Text = "Name";
this.NameCOLUMN.Width = 170;
//
// panel1
//
this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panel1.BackColor = System.Drawing.Color.White;
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.panel1.Controls.Add(this.CategoryDescriptionLABEL);
this.panel1.Controls.Add(this.CategoryTitleLABEL);
this.panel1.Controls.Add(this.CategoryIconPBOX);
this.panel1.GradientColor = System.Drawing.SystemColors.Control;
this.panel1.Location = new System.Drawing.Point(184, 0);
this.panel1.Name = "panel1";
this.panel1.Rotation = 0F;
this.panel1.Size = new System.Drawing.Size(516, 59);
this.panel1.TabIndex = 3;
//
// CategoryDescriptionLABEL
//
this.CategoryDescriptionLABEL.AutoSize = true;
this.CategoryDescriptionLABEL.BackColor = System.Drawing.Color.Transparent;
this.CategoryDescriptionLABEL.Location = new System.Drawing.Point(54, 28);
this.CategoryDescriptionLABEL.Name = "CategoryDescriptionLABEL";
this.CategoryDescriptionLABEL.Size = new System.Drawing.Size(60, 13);
this.CategoryDescriptionLABEL.TabIndex = 5;
this.CategoryDescriptionLABEL.Text = "Description";
//
// CategoryTitleLABEL
//
this.CategoryTitleLABEL.AutoSize = true;
this.CategoryTitleLABEL.BackColor = System.Drawing.Color.Transparent;
this.CategoryTitleLABEL.Font = new System.Drawing.Font("Franklin Gothic Medium", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.CategoryTitleLABEL.Location = new System.Drawing.Point(52, 6);
this.CategoryTitleLABEL.Name = "CategoryTitleLABEL";
this.CategoryTitleLABEL.Size = new System.Drawing.Size(66, 20);
this.CategoryTitleLABEL.TabIndex = 1;
this.CategoryTitleLABEL.Text = "Category";
//
// CategoryIconPBOX
//
this.CategoryIconPBOX.BackColor = System.Drawing.Color.Transparent;
this.CategoryIconPBOX.Location = new System.Drawing.Point(13, 12);
this.CategoryIconPBOX.Name = "CategoryIconPBOX";
this.CategoryIconPBOX.Size = new System.Drawing.Size(32, 32);
this.CategoryIconPBOX.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.CategoryIconPBOX.TabIndex = 0;
this.CategoryIconPBOX.TabStop = false;
//
// ConfigurationPanel
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.CategoryItemsLVIEW);
this.Controls.Add(this.CategoriesLVIEW);
this.Controls.Add(this.Toolbar);
this.Controls.Add(this.panel1);
this.Font = new System.Drawing.Font("Tahoma", 8F);
this.MinimumSize = new System.Drawing.Size(700, 500);
this.Name = "ConfigurationPanel";
this.Size = new System.Drawing.Size(700, 500);
this.Toolbar.ResumeLayout(false);
this.Toolbar.PerformLayout();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.CategoryIconPBOX)).EndInit();
this.ResumeLayout(false);
}
#endregion
private CategoryListView CategoriesLVIEW;
private System.Windows.Forms.ImageList CategoriesILIST;
private System.Windows.Forms.ColumnHeader NameCOLUMN;
private System.Windows.Forms.ToolStrip Toolbar;
private Virtuoso.Miranda.Plugins.Forms.Controls.GradientPanel panel1;
private System.Windows.Forms.Label CategoryTitleLABEL;
private System.Windows.Forms.PictureBox CategoryIconPBOX;
private System.Windows.Forms.ListView CategoryItemsLVIEW;
private System.Windows.Forms.ImageList CategoryItemsILIST;
private System.Windows.Forms.ColumnHeader CategoryItemNameCOLUMN;
private System.Windows.Forms.ColumnHeader CategoryItemDescriptionCOLUMN;
private System.Windows.Forms.Label CategoryDescriptionLABEL;
private System.Windows.Forms.ToolStripDropDownButton ViewsTDBTN;
private System.Windows.Forms.ToolStripMenuItem largeIconsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem tilesToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem detailsToolStripMenuItem;
private System.Windows.Forms.ImageList SpecialItemsILIST;
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Collections.ObjectModel;
using Virtuoso.Miranda.Plugins.Resources;
using Virtuoso.Miranda.Plugins.Properties;
using Virtuoso.Miranda.Plugins.Forms.Controls;
namespace Virtuoso.Miranda.Plugins.Forms.Configuration.Controls
{
internal sealed partial class ConfigurationPanel : UserControl
{
}
}

View File

@ -0,0 +1,290 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="CategoriesILIST.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="Toolbar.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Toolbar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>379, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ViewsTDBTN.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAfpJREFUOE+Nkt1L
U3EYx892ueOfEF0L/QVxzmWX1SwMeveqC0sh07Xly2pkrVRSiwwySvGimyCiWMPUmeSyJCLYmC6mdNib
LwkpJtL2+/b8nnM8WyuqAx+e5/fj+ZzvA+c4DmjqHqfTUe0QCpSKB07FUXlfVDD/fHozzqM1mqtOLN/B
34iHGlH8fIOR83ZGjV5V/y/53ZMzJZnmbdmtuVpE/jaYZYuds1XHhk/ZspwvT/aLTB9EziLTD/NMVUL9
07u1LP+YD4I29ZeSdTUojB4I41YF1t2XHox07WdxO3ENbpovT+4VC934nZvmXaoL9y7vY3EzdlUm99ry
Qc01UEgGIRHJ61wLss6ZfXeLjmcDR1hc/xRAw+Hdj9161UXrU6mDW/FOfK9gK9aJ4Pm9v4hrH/zIv21F
Q+2uMdqgTaG3DH37eAUlAlYfYDkyUseJUlyaaUUueglZQnosr862Q/LVqquzHdR3sDw+fJrFlfftnJqd
9iH9xleSc1EfvdEkX4aUXz06yeLSTBtyJGdITIS8wk42XnthTJmkpzx2L+XRhyeQp3WzURJpXZYj9UVb
XpxoxuJkGRMeLESaee3wg+O0pheJl16RppXnwj4Rm/QUbDk1fgF/QsqhwWNIvmjaSIQb11Kj59aNyNlt
FuVzSFePysN/o6n3d36Sn6D5TMF1/zamAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="CategoryItemsLVIEW.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="CategoryItemsILIST.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>476, 17</value>
</metadata>
<metadata name="SpecialItemsILIST.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>646, 17</value>
</metadata>
<data name="SpecialItemsILIST.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD+
GQAAAk1TRnQBSQFMAwEBAAEEAQABBAEAASABAAEgAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABgAMA
ASADAAEBAQABIAYAAUBeAAEnAgEBOAFRAgIBnQFXAgIBswFXAgIBswFRAgIBnQEnAgEBOP8A5QABQQIB
AXABXwIDAcYBegInAfUD4QH/A+AB/wFxAg0B7AFcAgMBwQFBAgEBcP8A3QABQQIBAXABYwIDAdAB2AHb
Ad0B/wGBAbMB1gH/AWkBpAHTAf8BYgGfAdEB/wF5AaIByAH/AdUB1gHXAf8BYwIDAdABQQIBAXD/AJUA
AQMCAQECAQYCAQEGAQoCAQILAgEBDQELAgEBDQELAgEBDQELAgEBDQELAgEBDQELAgEBDQELAgEBDQEL
AgEBDQELAgEBDQELAgEBDQELAgEBDQELAgEBDQELAgEBDQFEAgEBdwFjAgMB0gHVAdgB2QH/AXUBsQHi
Af8BdwG4AfgB/wF0AbcB/AH/AXIBuwH9Af8BaAG4AfYB/wFXAZ0B0AH/Ac8B0QHSAf8BYwIDAdABQQIB
AXD/AJEAAQYCAQEGARICAQEWARoCAQEjARwCAQEmARwCAQEmARwCAQEmARwCAQEmARwCAQEmARwCAQEm
ARwCAQEmARwCAQEmARwCAQEmARwCAQEmARwCAQEmARwCAQEmAT8CAQFpAWACAwHTAdgC2QH/AWgBpwHd
Af8BWgGjAfUB/wFDAZYB9QH/AT4BlgH0Af8BSAGfAfAB/wFYAbQB+QH/AVgBugH5Af8BUgGcAc8B/wPO
Af8BXAIDAcEBMwIBAU//AI0AAUgCAgGBAXACJwH3AYgBhAGBAf8BiAGEAYEB/wGIAYQBgQH/AYgBhAGB
Af8BiAGEAYEB/wGIAYQBgQH/AYgBhAGBAf8BiAGEAYEB/wGIAYQBgQH/AYgBhAGBAf8BiAGEAYEB/wGI
AYQBgQH/AYICgQH/A4EB/wPdAf8BawGdAcwB/wFFAZgB8wH/ATUBiwHzAf8BKQGBAdoB/wFFAWgBgQH/
AWEBgQGCAf8BTwGgAdwB/wFYAb8B+wH/AVEBvQH4Af8BWQGSAcQB/wGOAkwB+QFbAgIBuAEaAgEBIv8A
iQABiAGEAYEB/wH6AfkB9wH/AfoB+QH3Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH3Af8C+QH4Af8B+gH5
AfgB/wL5AfgB/wH6AfkB+AH/AvkB+AH/AvkB+AH/AfoB+QH4Af8D+QH/A6gB/wPRAf8BVAGVAdYB/wE2
AZUB8AH/ATgBjAHuAf8BJAGGAfsB/wEpAWgBjQH/AUEBMQEjAf8BdQFmAVwB/wFaAYMBpgH/AVUBwgL/
AVsBxAH4Af8BRwG0AfMB/wFjAZEBwwH/AWQCBQHkAUoCAgGG/wCJAAGIAYQBgQH/AfsB+QH4Af8B+gH5
AfcB/wH7AfkB+AH/AfoB+QH4Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH4Af8B+gH5AfgB/wL5AfgB/wL5
AfgB/wL5AfgB/wP5Af8D0QH/A6YB/wHKAc0BzwH/ATcBlQHpAf8BPgGSAe8B/wEvAYcB7AH/ARoBgQHy
Af8BIgGBAcMB/wE9AUcBUAH/AVsBZgFuAf8BTgGXAdMB/wFUAb0B/AH/AVsBwwH3Af8BVwHBAfoB/wFC
AaAB3QH/AcUBxwHIAf8BXQICAb0BLQIBAUP/AIUAAYgBhAGBAf8B+wH5AfcB/wH6AfkB9wH/AfoB+QH3
Af8B+gH5AfgB/wH6AfkB9wH/AfoB+QH4Af8C+QH4Af8B+gH5AfgB/wL5AfgB/wL5AfgB/wH6AfkB+AH/
AvkB+AH/A5wB/wPXAf8BegGlAc0B/wE3AZUB8AH/AUQBkwHvAf8BJAGDAesB/wEWAYEB6wH/ARkBgQHp
Af8BKwGBAbcB/wE1AYEBtgH/AT8BmwHoAf8BUAG0AfcB/wFXAb0B9wH/AVYBvQH3Af8BSAGxAfUB/wF6
AZ8BwAH/AWsCBQHmAU0CAgGR/wCFAAGIAYQBgQH/AfsB+QH3Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH4
Af8B+gH5AfcB/wL5AfcB/wH6AfkB+AH/AfoB+QH4Af8B+gH5AfgB/wL5AfgB/wH6AvkB/wLlAeQB/wOb
Af8B0gHVAdcB/wEzAZcB6QH/AUkBmwHxAf8BQQGTAe8B/wEcAYEB6gH/ARYBgQH2Af8BIwFnAY4B/wE6
ATkBOAH/AVoBWwFdAf8BQQGBAawB/wFDAa0B/QH/AU8BswH0Af8BUQG2AfUB/wFNAbEB9gH/ATkBmAHf
Af8CzQHOAf8BWgICAbkBGgIBASL/AIEAAYgBhAGBAf8B+gH5AfcB/wH6AfkB9wH/AfoB+QH3Af8B+gH5
AfcB/wH6AfkB+AH/AfoB+QH3Af8B+gH5AfcB/wL5AfgB/wL5AfcB/wH6AfkB+AH/AfoB+QH4Af8CxQHE
Af8DvAH/AZ4BvgHMAf8BMwGaAe4B/wFUAZ4B8AH/AToBkgHuAf8BGAGBAekB/wEWAYIB9wH/ASgBXwGB
Af8BOAEtASMB/wFfAVcBUQH/AT8BgQGlAf8BNAGeAfsB/wFCAaQB8gH/AUYBqAHzAf8BRgGlAfIB/wE4
AZkB6wH/AbEBugG/Af8BYQIDAdEBOAIBAVr/AIEAAYgBhAGBAf8B+wH5AfYB/wH6AfkB9wH/AfoB+QH2
Af8B+gH5AfcB/wH7AfkB9wH/AfoB+QH3Af8B+gH5AfcB/wH6AfkB+AH/AfoB+QH4Af8C+QH4Af8B+gH5
AfgB/wOyAf8D1AH/AXYBtwHZAf8BOAG1AfUB/wFZAacB8QH/ATYBjQHtAf8BFgGBAekB/wEWAYIB9gH/
AScBWwGBAf8BLAEkAR0B/wFNAUYBQQH/ATgBeAGYAf8BJQGRAfgB/wEyAZUB8AH/ATgBlgHvAf8BOwGW
Ae4B/wExAY4B7QH/AYsBogGzAf8BZgIFAeIBRgIBAXv/AIEAAYgBhAGBAf8B+gH5AfcB/wH6AfkB9wH/
AfsB+QH3Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH3Af8B+gH5AfgB/wH6AfkB+AH/AfoB+QH3Af8B+gH5
AfcB/wL5AfgB/wOmAf8D1gH/AUgBtwHmAf8BQgHBAfgB/wFcAcIB9wH/ATQBmgHvAf8BFgGBAekB/wEW
AYEB9QH/ASUBVgGBAf8BHwEYARYB/wE3AS8BKAH/AS8BaQGHAf8BGQGGAfcB/wEiAYQB6wH/ASkBgwHq
Af8BLwGEAekB/wEtAYEB6QH/AXIBjAGyAf8BeQIqAfYBTwICAZf/AIEAAYgBhAGBAf8B+gH5AfcB/wH7
AfkB9wH/AfsB+QH3Af8B+gH5AfcB/wH7AfkB9wH/AfoB+QH3Af8B+gH5AfgB/wH6AfkB9wH/AfoB+QH4
Af8B+gH5AfcB/wH6AfkB+AH/ApQBkwH/A+YB/wEzAbYB6AH/AUoBxQH5Af8BXQHGAfgB/wE0AbcB9QH/
ARYBmQHvAf8BFgGJAfYB/wEfAU0BdgH/AxYB/wEiARoBFwH/ASgBXgGBAf8BFgGBAfQB/wEZAYEB5wH/
AR8BgQHmAf8BJgGBAeUB/wEnAYEB5wH/AU4BgQG4Af8BkwJdAfsBWAICAbf/AIEAAYgBhAGBAf8B+wH5
AfcB/wH6AfkB9gH/AfoB+QH2Af8B+gH5AfcB/wH6AfkB9wH/AfsB+QH3Af8B+gH5AfcB/wH7AfkB9wH/
AfoB+QH4Af8B+gH5AfcB/wL5AfcB/wKVAZQB/wPnAf8BLwG7Ae0B/wFMAcYB+QH/AWEByAH4Af8BQgG9
AfcB/wEjAbIB9AH/ARoBrAH8Af8BNgFoAYEB/wEpASUBIgH/ARkCFgH/ASEBUgF/Af8BFgGBAfEB/wEW
AYEB5QH/ARwBgQHjAf8BIwGBAeMB/wEiAYAB4wH/ATkBgQG/Af8DwQH/AVgCAgG3/wCBAAGIAYQBgQH/
AfoB+QH2Af8B+gH5AfcB/wH7AfkB9wH/AfoB+QH3Af8B+gH5AfcB/wH7AfkB9gH/AfoB+QH3Af8B+wH5
AfcB/wH6AfkB9wH/AfoB+QH3Af8B+gH5AfgB/wKWAZUB/wPnAf8BNAHCAfEB/wFPAckB+gH/AXQBzwH5
Af8BbgHNAfkB/wFWAcQB9wH/AUUBvwH9Af8BZwGBAY0B/wFpAWEBXQH/AUwBRQFAAf8BMgFiAYEB/wEW
AYMB8AH/ARgBgQHnAf8BHgGBAeQB/wEjAYEB4wH/AR4BewHiAf8BKAF6AcQB/wPCAf8BWAICAbf/AIEA
AYgBhAGBAf8B+wH5AfcB/wH7AfkB9gH/AfoB+QH3Af8B+wH5AfcB/wH7AfkB9wH/AfsB+QH3Af8B+gH5
AfcB/wH6AfkB9wH/AfoB+QH3Af8B+gH5AfcB/wH6AfkB+AH/ApcBlgH/A+gB/wE3AcUB8QH/AVkB0AH8
Af8BgQHaAfwB/wGOAeAB/QH/AYQB3QH8Af8BgQHXAv8BgQGSAZ4B/wOBAf8BcAFlAV4B/wFCAXABgQH/
ARYBkwHxAf8BHQGKAeoB/wEgAYUB5wH/ASABgQHlAf8BFgF+AeQB/wElAXsBxAH/A8IB/wFYAgIBt/8A
gQABiAGEAYEB/wH7AfkB9gH/AfsB+QH2Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH2Af8B+wH5AfcB/wH7
AfkB9wH/AfoB+QH3Af8B+gH5AfcB/wH6AfkB+AH/AfoB+QH4Af8DmAH/A+gB/wFPAcQB6wH/AVAByAHy
Af8BgQHZAfoB/wGzAe0C/wHEAfIC/wGsAe0C/wGQAaoBsgH/AoEBggH/AXACcQH/AUIBewGDAf8BGgGa
AfMB/wEfAY4B6wH/ARwBhAHoAf8BFgGBAeAB/wEWAYEB1gH/ATwBgQHBAf8DwAH/AVgCAgG3/wCBAAGI
AYQBgQH/AfsB+QH2Af8B+gH5AfcB/wH6AfkB9wH/AfsB+QH2Af8B+gH5AfcB/wH7AfkB9wH/AfsB+QH3
Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH3Af8B+gH5AfcB/wOZAf8D+gH/AeMB5wHoAf8BtAHQAdoB/wGP
AcsB4QH/AZoB2QHwAf8B2gH2Af0B/wHUAfgC/wGZAd8B+AH/AXQBxgHvAf8BPQGtAecB/wEhAZ8B6gH/
ARsBlwHvAf8BFgGEAeQB/wEbAYEB1AH/AXUBnAHFAf8BlwGzAcMB/wHNAdMB1QH/AacCfQH8AVgCAgG3
/wCBAAGIAYQBgQH/AfsB+QH3Af8B+wH5AfYB/wH7AfkB9gH/AfoB+QH3Af8B+wH5AfYB/wH7AfkB9wH/
AfsB+QH3Af8B+wH5AfYB/wH7AfkB9wH/AfoB+QH3Af8B+gH5AfcB/wG4ArcB/wGeAp0B/wG2ArUB/wPU
Af8D9gH/AdMB3AHhAf8BswHYAecB/wGsAeQB9wH/AZIB5AL/AW0B0QH9Af8BNAG4AfkB/wEWAaIB8wH/
ARYBiwHhAf8BXAGgAdcB/wG8AcgBzgH/Ad4C3QH/A8YB/wGPAo4B/wFaAgIBuQFIAgIBgv8AgQABiAGE
AYEB/wH7AfkB9wH/AfsB+QH2Af8B+wH5AfYB/wH6AfkB9gH/AfsB+QH3Af8B+gH5AfYB/wH6AfkB9wH/
AfsB+QH3Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH3Af8B+gH5AfcB/wH6AfkB+AH/AtsB2QH/AbYCtQH/
AqIBoQH/A9IB/wHvAu4B/wG1AdYB4wH/AXYBywHxAf8BQwG/AfQB/wEWAagB7gH/ARoBmQHjAf8BiQG5
AdMB/wHfAd0B3AH/A70B/wOPAf8DqwH/A4EB/wEcAgEBJgELAgEBDf8AgQABiAGEAYEB/wH7AfkB9gH/
AfsB+QH2Af8B+wH5AfYB/wH7AfkB9wH/AfsB+QH2Af8B+wH5AfcB/wH7AfkB9gH/AfsB+QH3Af8B+wH5
AfYB/wH7AfkB9wH/AfoB+QH3Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH4Af8B+gH5AfcB/wHuAe0B6wH/
Aq4BrQH/A6wB/wHvAu4B/wHBAdAB1wH/AY0BwwHZAf8BhQG6AdEB/wG1AcUBzAH/AdoC2QH/A58B/wOn
Af8D6wH/A/kB/wGIAYQBgQH/ARwCAQEmAQsCAQEN/wCBAAFtAiMB9gH7AfkB9gH/AfsB+QH2Af8B+gH5
AfYB/wH7AfkB9wH/AfoB+QH2Af8B+wH5AfYB/wH6AfkB9gH/AfoB+QH3Af8B+gH5AfcB/wH7AfkB9wH/
AfoB+QH3Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH3Af8B+gH5AfgB/wH6AfkB+AH/AfoB+QH4Af8B1ALT
Af8DoAH/A90B/wPvAf8D7gH/A9MB/wObAf8D1wH/A/kB/wP5Af8D+QH/AYgBhAGBAf8BHAIBASYBCwIB
AQ3/AIEAAW0CIwH2AfsB+QH2Af8B+wH5AfYB/wH6AfkB9gH/AfsB+QH2Af8B+wH5AfcB/wH7AfkB9wH/
AfoB+QH2Af8B+wH5AfcB/wH7AfkB9gH/AfsB+QH2Af8B+wH5AfcB/wH7AfkB9wH/AfoB+QH3Af8B+gH5
AfcB/wH6AfkB9wH/AfoB+QH3Af8B+gH5AfgB/wL5AfgB/wLmAeUB/wKtAawB/wORAf8BkQKQAf8DqgH/
AuUB5AH/A/kB/wP5Af8B+AL5Af8D+QH/AYgBhAGBAf8BHAIBASYBCwIBAQ3/AIEAAW0CIwH2AfsB+QH2
Af8B+wH5AfYB/wH7AfkB9gH/AfsB+QH2Af8B+wH5AfYB/wH6AfkB9gH/AfsB+QH2Af8B+wH5AfYB/wH7
AfkB9gH/AfoB+QH3Af8B+wH5AfcB/wH6AfkB9wH/AfsB+QH3Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH4
Af8B+gH5AfcB/wL5AfgB/wL5AfgB/wL5AfgB/wL5AfgB/wH6AfkB+AH/AfoB+QH4Af8D+QH/AvkB+AH/
A/kB/wL5AfgB/wP5Af8BiAGEAYEB/wEcAgEBJgELAgEBDf8AgQABbQIjAfYB+wH5AfYB/wH7AfkB9gH/
AfsB+QH2Af8B+wH5AfYB/wH7AfkB9gH/AfsB+QH2Af8B+gH5AfcB/wH6AfkB9gH/AfsB+QH2Af8B+wH5
AfcB/wH6AfkB9wH/AfoB+QH2Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH3Af8B+gH5AfcB/wH6AfkB+AH/
AfoB+QH3Af8B+gH5AfcB/wL5AfgB/wL5AfgB/wL5AfgB/wH6AfkB+AH/AfoB+QH4Af8C+QH4Af8C+QH4
Af8D+QH/A/kB/wGIAYQBgQH/ARwCAQEmAQsCAQEN/wCBAAFtAiMB9gH7AfkB9gH/AfsB+QH2Af8B+wH5
AfYB/wH7AfkB9gH/AfsB+QH2Af8B+wH5AfYB/wH7AfkB9gH/AfoB+QH2Af8B+wH5AfYB/wH7AfkB9gH/
AfoB+QH2Af8B+wH5AfcB/wH6AfkB9wH/AfsB+QH3Af8B+gH5AfcB/wH6AfkB9wH/AfoB+QH3Af8B+gH5
AfcB/wH6AfkB+AH/AfoB+QH3Af8B+gH5AfgB/wL5AfgB/wH6AfkB+AH/AvkB+AH/AvkB+AH/AvkB+AH/
A/kB/wP5Af8BiAGEAYEB/wEcAgEBJgELAgEBDf8AgQABbgIjAfYBywHJAccB/wHLAckBxwH/AcsByQHH
Af8BywHJAccB/wHLAckBxwH/AcsByQHHAf8BywHJAccB/wHLAckBxwH/AcsByQHHAf8BywHJAccB/wHL
AckBxwH/AcsByQHHAf8BywHJAccB/wHLAckBxwH/AcsByQHHAf8BywHJAccB/wHMAcoByQH/Ac0BywHK
Af8BzQHMAcoB/wHNAcwBygH/Ac0BywHJAf8BzAHKAcgB/wHMAcoByAH/AcsByQHHAf8BywHJAccB/wHL
AckBxwH/AcsByQHHAf8BywHJAccB/wGIAYQBgQH/ARoCAQEjAQoCAQEL/wCBAAGAAn8B/gHmAd4B2AH/
Ad8B1wHRAf8B3gHXAdEB/wHeAdcB0QH/Ad4B1wHRAf8B3gHXAdEB/wHeAdcB0QH/Ad4B1wHRAf8B3gHX
AdEB/wHeAdcB0QH/Ad4B1wHRAf8B3gHXAdEB/wHeAdcB0QH/Ad4B1wHRAf8B3gHXAdEB/wHeAdcB0QH/
Ad4B1wHRAf8B3gHXAdEB/wHeAdcB0QH/Ad4B1wHRAf8B3gHXAdEB/wHeAdcB0QH/AZEBgQF+Af8B3gHX
AdEB/wGRAYEBfgH/Ad4B1wHRAf8BkQGBAX4B/wHeAdcB0QH/AYgBhAGBAf8BEgIBARYBBgIBAQb/AIEA
AUYCAQF8AYgBhAGBAf8BiAGEAYEB/wGIAYQBgQH/AYgBhAGBAf8BiAGEAYEB/wGIAYQBgQH/AYgBhAGB
Af8BiAGEAYEB/wGIAYQBgQH/AYgBhAGBAf8BiAGEAYEB/wGIAYQBgQH/AYgBhAGBAf8BiAGEAYEB/wGI
AYQBgQH/AYgBhAGBAf8BiAGEAYEB/wGIAYQBgQH/AYgBhAGBAf8BiAGEAYEB/wGIAYQBgQH/AYgBhAGB
Af8BiAGEAYEB/wGIAYQBgQH/AYgBhAGBAf8BiAGEAYEB/wGIAYQBgQH/AYgBhAGBAf8BSAICAYEBBgIB
AQYBAwIBAQL/AP8A/wD/AP8AhQABQgFNAT4HAAE+AwABKAMAAYADAAEgAwABAQEAAQEGAAECFgAD/wEA
Av8B4AF/DAAC/wHAAT8MAAL/AYABHw8AAQ8PAAEHDwABAw8AAQMPAAEBDwABAf8AXQAE/wwABP8MAAs=
</value>
</data>
<metadata name="CategoriesLVIEW.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="panel1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="CategoryDescriptionLABEL.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="CategoryTitleLABEL.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="CategoryIconPBOX.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -0,0 +1,224 @@
using Virtuoso.Miranda.Plugins.Configuration.Forms.Controls;
namespace Virtuoso.Miranda.Plugins.Configuration.Forms.Controls
{
partial class PluginManagementContent
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup("Enabled and running", System.Windows.Forms.HorizontalAlignment.Left);
System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup("Disabled by the user", System.Windows.Forms.HorizontalAlignment.Left);
System.Windows.Forms.ListViewGroup listViewGroup3 = new System.Windows.Forms.ListViewGroup("Crashed", System.Windows.Forms.HorizontalAlignment.Left);
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PluginManagementContent));
this.EnablePluginBTN = new System.Windows.Forms.Button();
this.DisablePluginBTN = new System.Windows.Forms.Button();
this.StatusColumn = new System.Windows.Forms.ColumnHeader();
this.PluginsLVIEW = new System.Windows.Forms.ListView();
this.NameColumn = new System.Windows.Forms.ColumnHeader();
this.AuthorColumn = new System.Windows.Forms.ColumnHeader();
this.VersionColumn = new System.Windows.Forms.ColumnHeader();
this.panel1 = new Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemHeader();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.DescriptionLABEL = new System.Windows.Forms.Label();
this.panel2 = new Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemSection();
this.HomePageLBTN = new System.Windows.Forms.LinkLabel();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// EnablePluginBTN
//
this.EnablePluginBTN.AutoSize = true;
this.EnablePluginBTN.Enabled = false;
this.EnablePluginBTN.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.EnablePluginBTN.Location = new System.Drawing.Point(678, 46);
this.EnablePluginBTN.Name = "EnablePluginBTN";
this.EnablePluginBTN.Size = new System.Drawing.Size(95, 23);
this.EnablePluginBTN.TabIndex = 11;
this.EnablePluginBTN.Text = "Enable plugin";
this.EnablePluginBTN.UseVisualStyleBackColor = false;
this.EnablePluginBTN.Click += new System.EventHandler(this.EnablePluginBTN_Click);
//
// DisablePluginBTN
//
this.DisablePluginBTN.AutoSize = true;
this.DisablePluginBTN.Enabled = false;
this.DisablePluginBTN.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.DisablePluginBTN.Location = new System.Drawing.Point(678, 75);
this.DisablePluginBTN.Name = "DisablePluginBTN";
this.DisablePluginBTN.Size = new System.Drawing.Size(95, 23);
this.DisablePluginBTN.TabIndex = 10;
this.DisablePluginBTN.Text = "Disable plugin";
this.DisablePluginBTN.UseVisualStyleBackColor = false;
this.DisablePluginBTN.Click += new System.EventHandler(this.DisablePluginBTN_Click);
//
// StatusColumn
//
this.StatusColumn.Text = "Status";
//
// PluginsLVIEW
//
this.PluginsLVIEW.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.NameColumn,
this.AuthorColumn,
this.VersionColumn,
this.StatusColumn});
this.PluginsLVIEW.FullRowSelect = true;
listViewGroup1.Header = "Enabled and running";
listViewGroup1.Name = "EnabledGroup";
listViewGroup2.Header = "Disabled by the user";
listViewGroup2.Name = "DisabledByUserGroup";
listViewGroup3.Header = "Crashed";
listViewGroup3.Name = "DisabledByCrashGroup";
this.PluginsLVIEW.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
listViewGroup1,
listViewGroup2,
listViewGroup3});
this.PluginsLVIEW.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.PluginsLVIEW.HideSelection = false;
this.PluginsLVIEW.Location = new System.Drawing.Point(12, 46);
this.PluginsLVIEW.MultiSelect = false;
this.PluginsLVIEW.Name = "PluginsLVIEW";
this.PluginsLVIEW.ShowItemToolTips = true;
this.PluginsLVIEW.Size = new System.Drawing.Size(650, 257);
this.PluginsLVIEW.Sorting = System.Windows.Forms.SortOrder.Ascending;
this.PluginsLVIEW.TabIndex = 9;
this.PluginsLVIEW.UseCompatibleStateImageBehavior = false;
this.PluginsLVIEW.View = System.Windows.Forms.View.Details;
this.PluginsLVIEW.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.PluginsLVIEW_ItemSelectionChanged);
//
// NameColumn
//
this.NameColumn.Text = "Title";
//
// AuthorColumn
//
this.AuthorColumn.Text = "Author";
//
// VersionColumn
//
this.VersionColumn.Text = "Version";
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.Transparent;
this.panel1.Color = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
this.panel1.Font = new System.Drawing.Font("Tahoma", 8.25F);
this.panel1.HeaderFont = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.panel1.HeaderText = "The following list contains installed Hyphen plugins.";
this.panel1.Image = ((System.Drawing.Image)(resources.GetObject("panel1.Image")));
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.MinimumSize = new System.Drawing.Size(300, 40);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(790, 40);
this.panel1.TabIndex = 16;
//
// pictureBox1
//
this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.pictureBox1.Location = new System.Drawing.Point(625, 170);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(212, 235);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.pictureBox1.TabIndex = 15;
this.pictureBox1.TabStop = false;
//
// DescriptionLABEL
//
this.DescriptionLABEL.AutoEllipsis = true;
this.DescriptionLABEL.BackColor = System.Drawing.Color.Transparent;
this.DescriptionLABEL.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.DescriptionLABEL.Location = new System.Drawing.Point(20, 335);
this.DescriptionLABEL.Name = "DescriptionLABEL";
this.DescriptionLABEL.Size = new System.Drawing.Size(586, 53);
this.DescriptionLABEL.TabIndex = 12;
this.DescriptionLABEL.Text = "(...)";
//
// panel2
//
this.panel2.BackColor = System.Drawing.Color.Transparent;
this.panel2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(224)))), ((int)(((byte)(192)))));
this.panel2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.panel2.ForeColor = System.Drawing.Color.Black;
this.panel2.Location = new System.Drawing.Point(12, 309);
this.panel2.MinimumSize = new System.Drawing.Size(300, 20);
this.panel2.Name = "panel2";
this.panel2.SectionName = "Description";
this.panel2.Size = new System.Drawing.Size(543, 20);
this.panel2.TabIndex = 17;
//
// HomePageLBTN
//
this.HomePageLBTN.AutoSize = true;
this.HomePageLBTN.Enabled = false;
this.HomePageLBTN.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.HomePageLBTN.Location = new System.Drawing.Point(561, 313);
this.HomePageLBTN.Name = "HomePageLBTN";
this.HomePageLBTN.Size = new System.Drawing.Size(58, 13);
this.HomePageLBTN.TabIndex = 18;
this.HomePageLBTN.TabStop = true;
this.HomePageLBTN.Text = "Homepage";
//
// PluginManagementContent
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.Controls.Add(this.HomePageLBTN);
this.Controls.Add(this.panel2);
this.Controls.Add(this.EnablePluginBTN);
this.Controls.Add(this.DisablePluginBTN);
this.Controls.Add(this.PluginsLVIEW);
this.Controls.Add(this.panel1);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.DescriptionLABEL);
this.Name = "PluginManagementContent";
this.Size = new System.Drawing.Size(790, 398);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button EnablePluginBTN;
private System.Windows.Forms.Button DisablePluginBTN;
private System.Windows.Forms.ColumnHeader StatusColumn;
private System.Windows.Forms.ListView PluginsLVIEW;
private System.Windows.Forms.ColumnHeader NameColumn;
private System.Windows.Forms.ColumnHeader AuthorColumn;
private System.Windows.Forms.ColumnHeader VersionColumn;
private Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemHeader panel1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Label DescriptionLABEL;
private CategoryItemSection panel2;
private System.Windows.Forms.LinkLabel HomePageLBTN;
}
}

View File

@ -0,0 +1,189 @@
/***********************************************************************\
* 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.Diagnostics;
using System.Windows.Forms;
using Virtuoso.Miranda.Plugins.Collections;
using Virtuoso.Miranda.Plugins.Infrastructure;
using Virtuoso.Miranda.Plugins.Resources;
namespace Virtuoso.Miranda.Plugins.Configuration.Forms.Controls
{
internal sealed partial class PluginManagementContent : CategoryItemControl
{
#region .ctors
private PluginManagementContent()
{
InitializeComponent();
PluginsLVIEW.Hide();
DescriptionLABEL.Text = TextResources.UI_Label_SelectPluginToDisplayDescr;
MirandaContext.Current.PluginManager.PluginStateChange += PluginManager_PluginStateChange;
}
private void PluginManager_PluginStateChange(object sender, PluginStateChangeEventArgs e)
{
if (InvokeRequired)
Invoke(new MethodInvoker(delegate { OnShow(true); }));
else
OnShow(true);
}
#endregion
#region UI Handlers
protected internal override void Close()
{
MirandaContext.Current.PluginManager.PluginStateChange -= PluginManager_PluginStateChange;
}
protected internal override bool OnShow(bool firstTime)
{
if (!firstTime)
return false;
PluginDescriptorReadOnlyCollection plugins = MirandaContext.Current.PluginManager.Plugins;
try
{
SynchronizationHelper.BeginCollectionUpdate(plugins);
PluginsLVIEW.Items.Clear();
DisablePluginBTN.Enabled = EnablePluginBTN.Enabled = HomePageLBTN.Enabled = false;
if (plugins.Count == 0)
{
PluginsLVIEW.Enabled = false;
PluginsLVIEW.Visible = true;
}
else
{
PublishPlugins(plugins);
}
}
finally
{
SynchronizationHelper.EndUpdate(plugins);
}
CommitListViewChanges();
return false;
}
private void CommitListViewChanges()
{
NameColumn.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
AuthorColumn.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
VersionColumn.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
StatusColumn.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
PluginsLVIEW.Show();
}
#endregion
#region Management
private void PublishPlugins(PluginDescriptorReadOnlyCollection plugins)
{
PluginsLVIEW.BeginUpdate();
foreach (PluginDescriptor descriptor in plugins)
{
try
{
ListViewItem item = new ListViewItem(new string[] { descriptor.Plugin.Name, descriptor.Plugin.Author,
descriptor.Plugin.Version.ToString(), descriptor.PluginState.ToString() });
switch (descriptor.PluginState)
{
case PluginState.Enabled:
item.Group = PluginsLVIEW.Groups["EnabledGroup"];
break;
case PluginState.Disabled:
item.Group = PluginsLVIEW.Groups["DisabledByUserGroup"];
break;
case PluginState.CrashDisabled:
item.Group = PluginsLVIEW.Groups["DisabledByCrashGroup"];
break;
}
item.Tag = descriptor;
PluginsLVIEW.Items.Add(item);
}
finally
{
PluginsLVIEW.EndUpdate();
}
}
}
private void PluginsLVIEW_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
if (e.IsSelected)
{
PluginDescriptor descriptor = (PluginDescriptor)e.Item.Tag;
PluginsLVIEW.Tag = descriptor;
DescriptionLABEL.Text = descriptor.Plugin.Description;
EnablePluginBTN.Enabled = !(descriptor.PluginState == PluginState.Enabled);
DisablePluginBTN.Enabled = !EnablePluginBTN.Enabled;
HomePageLBTN.Enabled = descriptor.Plugin.HomePage != null;
}
else
{
PluginsLVIEW.Tag = null;
DisablePluginBTN.Enabled = EnablePluginBTN.Enabled = HomePageLBTN.Enabled = false;
DescriptionLABEL.Text = TextResources.UI_Label_SelectPluginToDisplayDescr;
}
}
private void DisablePluginBTN_Click(object sender, EventArgs e)
{
if (PluginsLVIEW.Tag is PluginDescriptor)
((PluginDescriptor)PluginsLVIEW.Tag).SetPluginState(PluginState.Disabled, true);
}
private void EnablePluginBTN_Click(object sender, EventArgs e)
{
if (PluginsLVIEW.Tag is PluginDescriptor)
((PluginDescriptor)PluginsLVIEW.Tag).SetPluginState(PluginState.Enabled, true);
}
private void HomePageLBTN_LinkClicked(object sender, LinkLabelLinkClickedEventArgs eArgs)
{
try
{
if (PluginsLVIEW.Tag is PluginDescriptor)
Process.Start(((PluginDescriptor)PluginsLVIEW.Tag).Plugin.HomePage.ToString());
}
catch (Exception e)
{
MessageBox.Show(TextResources.ExceptionMsg_CannotOpenHomePage + e.Message, TextResources.UI_Caption_Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
}
}

View File

@ -0,0 +1,483 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="EnablePluginBTN.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="DisablePluginBTN.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="PluginsLVIEW.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="panel1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="panel1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<metadata name="pictureBox1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
18DMAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="DescriptionLABEL.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="panel2.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="HomePageLBTN.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -0,0 +1,29 @@
/***********************************************************************\
* 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;
namespace Virtuoso.Miranda.Plugins.Configuration
{
public interface IEncryption
{
byte[] Encrypt(byte[] data);
byte[] Decrypt(byte[] data);
}
}

View File

@ -0,0 +1,33 @@
/***********************************************************************\
* 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.IO;
using Virtuoso.Miranda.Plugins.Infrastructure;
namespace Virtuoso.Miranda.Plugins.Configuration
{
public interface IStorage : IDisposable
{
Stream OpenRead(Type configType, ConfigurationOptionsAttribute options);
Stream OpenWrite(Type configType, ConfigurationOptionsAttribute options);
bool Exists(Type configType, ConfigurationOptionsAttribute options);
}
}

View File

@ -0,0 +1,78 @@
/***********************************************************************\
* 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.IO;
using Virtuoso.Miranda.Plugins.Infrastructure;
using FxIsolatedStorage = System.IO.IsolatedStorage.IsolatedStorage;
using System.IO.IsolatedStorage;
namespace Virtuoso.Miranda.Plugins.Configuration
{
public class IsolatedStorage : StorageBase
{
#region Fields
private IsolatedStorageFile Store;
#endregion
#region .ctors
public IsolatedStorage()
{
Store = IsolatedStorageFile.GetUserStoreForAssembly();
}
#endregion
#region Methods
public override Stream OpenRead(Type configType, ConfigurationOptionsAttribute options)
{
if (Store == null)
throw new InvalidOperationException();
return new IsolatedStorageFileStream(GetFileName(configType, options), FileMode.Open, Store);
}
public override Stream OpenWrite(Type configType, ConfigurationOptionsAttribute options)
{
if (Store == null)
throw new InvalidOperationException();
return new IsolatedStorageFileStream(GetFileName(configType, options), FileMode.Create, Store);
}
public override bool Exists(Type configType, ConfigurationOptionsAttribute options)
{
return Store.GetFileNames(GetFileName(configType, options)).Length != 0;
}
public override void Dispose()
{
if (Store != null)
Store.Dispose();
Store = null;
}
#endregion
}
}

View File

@ -0,0 +1,84 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
using Virtuoso.Miranda.Plugins.Configuration;
using Virtuoso.Miranda.Plugins.Resources;
using Virtuoso.Miranda.Plugins.Configuration.Forms.Controls;
namespace Virtuoso.Miranda.Plugins.Configuration
{
internal sealed class PMConfigurator : IInternalConfigurator
{
#region .ctors
private PMConfigurator() { }
#endregion
#region Properties
private static IConfigurablePlugin singleton;
public static IConfigurablePlugin Singleton
{
get
{
return singleton ?? (singleton = new PMConfigurator());
}
}
#endregion
#region IConfigurablePlugin Members
public string Name
{
get { return "Plugins"; }
}
private PluginConfiguration[] configuration;
public PluginConfiguration[] Configuration
{
get { return configuration ?? (configuration = new PluginConfiguration[] { PMConfiguration.Singleton }); }
}
public void PopulateConfiguration(CategoryCollection categories)
{
Category category = new Category(TextResources.Config_Management, TextResources.Config_Management_Description);
categories.Add(category);
CategoryItem item = new CategoryItem(TextResources.Config_Management_Plugins, TextResources.Config_Management_Plugins_Description, typeof(PluginManagementContent));
item.Image = VisualResources.Image_64x67_Management;
category.Items.Add(item);
}
public void ResetConfiguration()
{
PMConfiguration.Reset();
}
public void ReloadConfiguration()
{
PMConfiguration.Reload();
}
#endregion
}
}

View File

@ -0,0 +1,120 @@
/***********************************************************************\
* 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.Security.Cryptography;
using System.IO;
namespace Virtuoso.Miranda.Plugins.Configuration
{
public abstract class PortableEncryption : IEncryption
{
#region Fields
private static readonly byte[] KeyGeneratorSalt = new byte[] { 13, 74, 64, 0, 11, 128, 32, 44, 113, 42 };
#endregion
#region .ctors
protected PortableEncryption() { }
#endregion
#region Methods
public virtual byte[] Encrypt(byte[] data)
{
ICryptoTransform transform = CreateEncryptor();
using (MemoryStream stream = new MemoryStream(data.Length))
{
using (CryptoStream crypto = new CryptoStream(stream, transform, CryptoStreamMode.Write))
crypto.Write(data, 0, data.Length);
return stream.ToArray();
}
}
public virtual byte[] Decrypt(byte[] data)
{
ICryptoTransform transform = CreateDecryptor();
using (MemoryStream inStream = new MemoryStream(data), outStream = new MemoryStream(data.Length))
{
using (CryptoStream crypto = new CryptoStream(inStream, transform, CryptoStreamMode.Read))
{
int count = 0;
byte[] buffer = new byte[2048];
while ((count = crypto.Read(buffer, 0, buffer.Length)) != 0)
outStream.Write(buffer, 0, count);
}
return outStream.ToArray();
}
}
#endregion
#region Encryption
protected virtual ICryptoTransform CreateEncryptor()
{
string key = PromptForKey(false);
TripleDES tripleDes = TripleDES.Create();
byte[] keyBytes;
byte[] ivBytes;
GetSecretBytes(tripleDes, key, out keyBytes, out ivBytes);
return tripleDes.CreateEncryptor(keyBytes, ivBytes);
}
protected virtual ICryptoTransform CreateDecryptor()
{
string key = PromptForKey(true);
TripleDES tripleDes = TripleDES.Create();
byte[] keyBytes;
byte[] ivBytes;
GetSecretBytes(tripleDes, key, out keyBytes, out ivBytes);
return tripleDes.CreateDecryptor(keyBytes, ivBytes);
}
protected static void GetSecretBytes(SymmetricAlgorithm algorithm, string password, out byte[] keyBytes, out byte[] ivBytes)
{
Rfc2898DeriveBytes keyGenerator = new Rfc2898DeriveBytes(password, KeyGeneratorSalt, 20);
keyBytes = keyGenerator.GetBytes(algorithm.LegalKeySizes[0].MaxSize / 8);
keyGenerator.IterationCount = 10;
ivBytes = keyGenerator.GetBytes(algorithm.LegalBlockSizes[0].MaxSize / 8);
}
#endregion
#region Abstracts
protected abstract string PromptForKey(bool decrypting);
#endregion
}
}

View File

@ -0,0 +1,63 @@
/***********************************************************************\
* 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.IO;
using Virtuoso.Miranda.Plugins.Infrastructure;
namespace Virtuoso.Miranda.Plugins.Configuration
{
public class PortableStorage : StorageBase
{
#region Helpers
private string GetPath(Type configType, ConfigurationOptionsAttribute options)
{
string configDirectory = Path.Combine(MirandaEnvironment.MirandaFolderPath, "Configuration");
if (!Directory.Exists(configDirectory))
Directory.CreateDirectory(configDirectory);
return Path.Combine(configDirectory, GetFileName(configType, options));
}
#endregion
#region Methods
public override Stream OpenRead(Type configType, ConfigurationOptionsAttribute options)
{
return File.OpenRead(GetPath(configType, options));
}
public override Stream OpenWrite(Type configType, ConfigurationOptionsAttribute options)
{
return File.OpenWrite(GetPath(configType, options));
}
public override bool Exists(Type configType, ConfigurationOptionsAttribute options)
{
return File.Exists(GetPath(configType, options));
}
public override void Dispose() { }
#endregion
}
}

View File

@ -0,0 +1,71 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
using System.IO;
namespace Virtuoso.Miranda.Plugins.Configuration
{
public abstract class StorageBase : IStorage
{
#region .ctors
protected StorageBase() { }
#endregion
#region Helpers
protected virtual string GetFileName(Type configType, ConfigurationOptionsAttribute options)
{
if (configType == null)
throw new ArgumentNullException("configType");
string versionSuffix = options != null && options.Version != null ?
options.Version.ToString() : String.Empty;
string profileBoundSuffix = String.Empty;
if (options != null && options.ProfileBound)
{
if (!MirandaContext.Initialized)
throw new InvalidOperationException();
profileBoundSuffix = Path.GetFileNameWithoutExtension(MirandaContext.Current.MirandaDatabase.ProfileName);
}
return String.Format("{0}_{1}_{2}", configType.FullName, versionSuffix, profileBoundSuffix).Replace('.', '-') + ".dat";
}
#endregion
#region Methods
public abstract Stream OpenRead(Type configType, ConfigurationOptionsAttribute options);
public abstract Stream OpenWrite(Type configType, ConfigurationOptionsAttribute options);
public abstract bool Exists(Type configType, ConfigurationOptionsAttribute options);
public abstract void Dispose();
#endregion
}
}

View File

@ -0,0 +1,37 @@
/***********************************************************************\
* 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.Security.Cryptography;
namespace Virtuoso.Miranda.Plugins.Configuration
{
public class WindowsEncryption : IEncryption
{
public byte[] Encrypt(byte[] data)
{
return ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);
}
public byte[] Decrypt(byte[] data)
{
return ProtectedData.Unprotect(data, null, DataProtectionScope.CurrentUser);
}
}
}

View File

@ -0,0 +1,53 @@
/***********************************************************************\
* 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.IO;
using Virtuoso.Miranda.Plugins.Infrastructure;
using Virtuoso.Hyphen;
namespace Virtuoso.Miranda.Plugins
{
internal sealed class DefaultAssemblyProbe : AssemblyProbe
{
#region .ctors
public DefaultAssemblyProbe() { }
#endregion
#region Impls
public override string[] FindAssemblies()
{
try
{
return Directory.Exists(MirandaEnvironment.ManagedPluginsFolderRelativePath) ?
Directory.GetFiles(MirandaEnvironment.ManagedPluginsFolderRelativePath, "*.dll") : new string[0];
}
catch (Exception e)
{
Log.DebuggerWrite(3, Loader.LogCategory, "Unable to find plugins: " + e.Message);
return new string[0];
}
}
#endregion
}
}

View File

@ -0,0 +1,95 @@
/***********************************************************************\
* 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.CompilerServices;
using Virtuoso.Miranda.Plugins.Forms;
using Virtuoso.Miranda.Plugins.Resources;
using System.Diagnostics;
using Virtuoso.Hyphen.Mini;
using System.Windows.Forms;
namespace Virtuoso.Miranda.Plugins
{
internal sealed class DefaultExceptionHandler : IExceptionHandler, IExceptionReporter
{
#region Properties
private MirandaPlugin plugin;
public MirandaPlugin Plugin
{
get { return plugin; }
}
#endregion
#region .ctors
private DefaultExceptionHandler(MirandaPlugin plugin)
{
this.plugin = plugin;
}
public static DefaultExceptionHandler Create()
{
return Create(null);
}
public static DefaultExceptionHandler Create(MirandaPlugin plugin)
{
return new DefaultExceptionHandler(plugin);
}
#endregion
#region Methods
public void HandleException(Exception e, PluginDescriptor descriptor)
{
IExceptionReporter reporter = plugin as IExceptionReporter ?? (plugin == null ? (IExceptionReporter)null : (IExceptionReporter)this);
ErrorDialog.PresentModal(e, reporter, String.Format(TextResources.MsgBox_Formatable1_Text_ModuleError, plugin), false);
}
void IExceptionReporter.ReportException(Exception e)
{
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
if (plugin is StandalonePlugin)
{
startInfo.FileName = String.Format("mailto:{0}?subject={1}&body={2}", ((StandalonePlugin)plugin).AuthorEmail, String.Format(TextResources.UI_Formatable1_Text_PluginCrashed, plugin), e.ToString());
}
else
{
startInfo.FileName = plugin.HomePage.ToString();
}
Process.Start(startInfo);
}
catch
{
MessageBox.Show(TextResources.MsgBox_Text_UnableToReportError, TextResources.MsgBox_Caption_Warning, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
#endregion
}
}

View File

@ -0,0 +1,172 @@
/***********************************************************************\
* 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.IO;
using System.Reflection;
using Virtuoso.Hyphen;
using Virtuoso.Miranda.Plugins.Forms;
using Virtuoso.Miranda.Plugins.Resources;
namespace Virtuoso.Miranda.Plugins
{
internal sealed class DefaultPluginManager : PluginManagerBase
{
#region Fields & Constants
public new const string LogCategory = Loader.LogCategory + "::PluginManager";
public const string InternalServiceNamePrefix = "Virtuoso.Miranda.Plugins.Services.";
#endregion
#region .ctors
public DefaultPluginManager(FusionContext fusionContext)
: base(fusionContext, true, true)
{
AssemblyName assemblyName = Assembly.GetExecutingAssembly().GetName();
Log.DebuggerWrite(0, LogCategory, "Hyphen Plugin Manager v" + assemblyName.Version.ToString() + " is initializing, please wait...");
FirePrimaryPluginManagerInitializedEvent(this, EventArgs.Empty);
Log.DebuggerWrite(0, LogCategory, "Default Plugin Manager initialized.");
}
#endregion
#region Fusion
protected internal override void FindAndLoadPlugins()
{
if (FusionContext.IsInvalid)
throw new InvalidOperationException(TextResources.ExceptionMsg_InvalidFusionContext);
if (Initialized)
throw new InvalidOperationException(TextResources.ExceptionMsg_PluginManagerAlreadyInitialized);
Assembly currentAssembly = null;
Type currentType = null;
MirandaPlugin currentPlugin = null;
try
{
string[] paths = FusionContext.AssemblyProbe.FindAssemblies();
if (paths.Length == 0)
{
Log.DebuggerWrite(1, LogCategory, "No managed plugins found.");
return;
}
Log.DebuggerWrite(0, LogCategory, "Found " + paths.Length + " managed plugins...");
foreach (string path in paths)
LoadAssembly(path, ref currentAssembly, ref currentType, ref currentPlugin);
}
catch (Exception e)
{
FusionException fEx = null;
Log.DebuggerWrite(0, LogCategory, e.ToString());
if (e is IOException)
fEx = new FusionException(TextResources.ExceptionMsg_IOErrorOccurred, currentAssembly, null, null, e);
if (e is FusionException)
fEx = (FusionException)e;
else
fEx = new FusionException(e.Message, currentAssembly, currentType, null, e);
HandleException(fEx, currentPlugin != null ? currentPlugin.Descriptor : (PluginDescriptor)null);
}
finally
{
DeclareInitialized();
RaiseFusionCompletedEvent(EventArgs.Empty);
Infrastructure.PluginConfiguration.FlushCaches();
Log.DebuggerWrite(0, LogCategory, "Fusion completed.");
}
}
private void LoadAssembly(string path, ref Assembly currentAssembly, ref Type currentType, ref MirandaPlugin currentPlugin)
{
Log.DebuggerWrite(0, LogCategory, "Loading assembly '" + path + "'...");
try
{
currentAssembly = Assembly.Load(Path.GetFileNameWithoutExtension(path));
foreach (Type type in GetExposedPlugins(currentAssembly))
LoadPluginFromType(currentType = type);
}
catch (BadImageFormatException bifE)
{
throw new FusionException(String.Format(TextResources.ExceptionMsg_Formatable1_UnmanagedImageFound, path), bifE.FusionLog, null, null, null, bifE);
}
catch (FileNotFoundException fnfE)
{
throw new FusionException(String.Format(TextResources.ExceptionMsg_Formatable1_AssemblyLoadError, currentAssembly != null ? currentAssembly.ToString() : path), fnfE.FusionLog, currentAssembly, currentType, null, fnfE);
}
catch (FusionException)
{
throw;
}
catch (Exception e)
{
throw new FusionException(String.Format(TextResources.ExceptionMsg_Formatable1_AssemblyLoadError, path, e.Message), currentAssembly.ToString(), null, null, null, e);
}
}
private void LoadPluginFromType(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
Log.DebuggerWrite(0, LogCategory, "Loading plugin '" + type.Name + "'...");
try
{
MirandaPlugin plugin = InstantiatePlugin(type, false);
if (plugin == null)
return;
PluginDescriptor pluginDescriptor = LoadPlugin(plugin);
// If not disabled, enable the plugin
if (IsEnabled(plugin))
SetPluginState(pluginDescriptor, PluginState.Enabled);
Log.DebuggerWrite(0, LogCategory, "Plugin successfully loaded.");
}
catch (MissingMethodException mmEx)
{
throw new FusionException(String.Format(TextResources.ExceptionMsg_Formatable1_NoValidPluginCtorFound, type.FullName), type.Assembly, type, null, mmEx);
}
catch (TargetInvocationException tiEx)
{
throw new FusionException(String.Format(TextResources.ExceptionMsg_Formatable2_ErrorWhileInstantiatingPlugin,
type.FullName, tiEx.InnerException != null ? tiEx.InnerException.Message : TextResources.UI_Label_Unknown),
type.Assembly, type, null, tiEx.InnerException);
}
catch (MethodAccessException maEx)
{
throw new FusionException(String.Format(TextResources.ExceptionMsg_Formatable1_UnauthorizedToInstantiatePlugin, type.FullName), type.Assembly, type, null, maEx);
}
}
#endregion
}
}

View File

@ -0,0 +1,505 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

View File

@ -0,0 +1,12 @@
THREAD SYNCHRONIZATION ===
=============================================================================
- If there is a SynchronizationSupervisor::BeginXXXUpdate() method,
then this method should be used to lock on a XXX variable type instead
of the lock statement
- for example, if there is a BeginDescriptorUpdate() method, then
you should use this method to lock on a Descriptor typed variable
- If there is no associated method in the SynchronizationSupervisor class,
then the lock statement should be used instead
- Previous two recomendations were introduced to ensure the coding consistency
in the thread synchronization on types being frequently passed as arguments

View File

@ -0,0 +1,3 @@
[.ShellClassInfo]
IconFile=%SystemRoot%\system32\SHELL32.dll
IconIndex=126

View File

@ -0,0 +1,304 @@
HYPHEN Version History
==========================================================================================================
KNOWN ISSUES
==========================================================================================================
- ContactInfo.Read/WriteSetting & ContactInfo.WriteSettingAsBlob do not support blob values yet
- MirandaDatabase.ContactSettingChange event does not provide data for changed blob values (see prev point)
v0.8.6.1931
==========================================================================================================
* MANY BINARY INCOMPATIBLE CHANGES
* MirandaContext completely refactored
- Service functions => ServiceManager
- Events + Event hooks => EventManager
+ MirandaContext.ServiceCallInterceptors
- Plugin dialogs tracking rewritten to be more efficient and deadlock free :-)
- EventHandle class refactored (see EventManager)
- DatabaseEventInfo.Data encoding bug fixed
- Internal text encoding mishandling fixed
+ LoaderOptions.MinimalMirandaVersion added
+ Hyphen tray icon moved to Hyphen's menu
v0.8.5.1502
==========================================================================================================
- MirandaDatabase.AddEvent encoding bug fixed
- MirandaDatabase.GetContacts/FindContact methods rewritten to be more efficient
+ ContactInfo.OpenMessageWindow()
* MirandaContext.UnhookEvent(MirandaPlugin, string) => MirandaContext.UnhookEvent(string, MirandaPlugin)
* IConfigurablePlugin interface undergone incompatible binary change
v0.8.5.1303
==========================================================================================================
+ Codename Casablanca - new configuration infrastructure
+ ContactList.AddEvent method introduced
+ AckRouter class for protocol ack processing introduced
+ Protocol.StatusChanged event introduced
+ Stability improvements
+ Exception handling improvements
- LangPack string encoding fixed
- Other bug fiexes
- Internal refactoring
* MirandaContext.NetworkProtocols => MirandaContext.Protocols
* NetworkProtocolDictionary => ProtocolDictionary
* A few events refactored
* A few classes renamed
v0.8.5.1101
==========================================================================================================
- 0.7+ Miranda Plugin API conformance
v0.8.5.1
==========================================================================================================
- Minor stability fix
v0.8.5.0
==========================================================================================================
* Virtuoso.Hyphen.Sandbox renamed to Virtuoso.Miranda.Plugins.Helpers.Sandbox
* ProtocolPlugin.Descriptor renamed to ProtocolPlugin.ProtocolDescriptor
+ MenuItemDeclarationAttribute can be now applied to methods as well without the need to specify
the service name; the service will be created for the method automagically
+ Virtuoso.Miranda.Plugins.Helpers.MessageQueue class introduced
* GenericEventArgs renamed to MirandaEventArgs
* Many *EventArgs classes renamed
- FIXED BUG: BeforeEventAdded event now does provide valid event data
v0.8.4.1
==========================================================================================================
* Many interfaces refactored,
- Critical interop bug fixed (thanks to MikZ)
v0.8.4.0
==========================================================================================================
- MPM bug fixes
* Configuration class renamed to PluginConfiguration,
v0.8.4.0
==========================================================================================================
* MirandaDatabase class + several other APIs overhauled,
+ Managed protocol support (see the MPM project on my site)
v0.8.3.2
==========================================================================================================
+ Configuration dialog revisited
v0.8.3.1
==========================================================================================================
+ Main menu popup menus support for managed plugins
+ Updated version of CueBannerTextBox included
+ InformationDialog introduced
+ New 'Loading plugins' dialog introduced
- FIXED BUG: Plugin settings not saved with LazyUnload feature enabled
v0.8.3.0
==========================================================================================================
- Incompatible binary changes, plugins must be recompiled
+ Plugin configuration framework introduced
+ Vista style introduced
+ Lazy unload introduced
+ CueBannerTextBox control included (nice work of Chili Software)
+ GradientPanel control included
+ Hyphen configuration revisited
- Many internal changes
v0.8.2.60
==========================================================================================================
- Hyphen is now strong named because some plugins may need to be strong named so Hyphen must be too
- Plugins will automatically load the newest version of Hyphen; this is done using the BindingRedirect
to avoid multiple versions of Hyphen assemblies to be deployed
* Incompatible binary changes, plugins must be recompiled
v0.8.2.25
==========================================================================================================
- I haven't accounted .NET Remoting object lifetime so after 5 minutes, all the remote objects
are disconnected, which is very bad => fixed by overriding the MarshalByRefObject::InitalizeLifetimeService
method
- If you're designing an object accessible from another AppDomain (for example if you're using
the Sandbox class), derive it from the Virtuoso.Miranda.Plugins.Infrastructure.RemoteObject class
to make it connected as long as it's not collected by GC
v0.8.2.20
==========================================================================================================
- ConfigurableMirandaPlugin class introduced; provides plugins with a seamless configuration store
v0.8.2.0
==========================================================================================================
- Icons refreshed
- Various internal changes
- Sandbox class introduced; allows you to easily sandbox your own plugins (in plugins :-)) or scripts
v0.8.1.80
==========================================================================================================
- Langpack localization support via the LanguagePack, LanguagePackStringResolver & LocalizableForm classes
- Hyphen's main menu items now take advantage of Langpack (I'm not going to localize dialogs using Langpack,
(at least not now), I prefer the .NET way, i.e. satelite assemblies)
v0.8.1.60
==========================================================================================================
- Updater plugin support (Virtuoso.Miranda.Plugins.ThirdParty.Updater.UpdaterPlugin class)
- LoaderOptionsAttribute now supports required Hyphen version specification; Hyphen refuses to load a plugin
that requires a newer version of Hyphen
v0.8.1.40
==========================================================================================================
- Internal stability improvements
v0.8.1.35
==========================================================================================================
- Virtuoso.Miranda.Plugins.Helpers.IniStructure class added; thanks kratchkov@inbox.lv for his
CodeProject submission!
v0.8.1.32
==========================================================================================================
- ContactInfo.Value is now translated to ANSI string by default not to Miranda's build default encoding.
v0.8.1.30
==========================================================================================================
- Internal sandboxing API changes
v0.8.1.10
==========================================================================================================
- Safe callbacks introduced; no managed plugin should now crash Miranda with an unhandled exception;
an exception will be caught and processed by a callback stub
v0.8.1.4
==========================================================================================================
- Internal refinements
v0.8.1.3
==========================================================================================================
- Internal Loader changes
- Internal Hyphen.Mini changes
v0.8.0.0
==========================================================================================================
- Midas is now Hyphen, the core has been re-engineered...
- Hyphen now supports delayed plugin loading and unloading; plugins are not loaded on startup but you can load
them using the Miranda Menu - 'Load/Unload Microsoft.net plugins' item; this saves memory and startup time
- EventHandle class providing you with an option to create and manage your own events
- MirandaContext now offers CreateServiceFunction and HookEvent methods
- You can override the builtin configuration and use your own Plugin manager instead of the builtin one
- You can override the builtin configuration and use your own Assembly probe to search for plugins
in custom directories
- You can manage plugins via a Hyphen manager icon in the tray
- Plugin assemblies are now shadow copied so you can update them on the fly and Hyphen will reload them
without the need of restarting Miranda
- Noticable performance improvements introduced; unsafe C# pointers employed to get rid of many copying
operations
- Bunch of new functionality added, see for yourself; I am unable to track that amount of changes ;)
v0.7.2.0
==========================================================================================================
- Midas.dll and Virtuoso.Miranda.Plugins were merged into the Midas.dll assembly
v0.7.1.10
==========================================================================================================
- Internal tuning
- InteropBufferPool now offers an override allowing you to set the buffer capacity
- note that a new buffer will be allocated if you explicitly set a capacity higher than the default one,
which is 260 bytes
v0.7.1.5
==========================================================================================================
- InteropBuffer class revamped to be more robust
- InteropBufferPool class introduced; it manages a few shared buffers and when an additional
buffer is requested, it allocates a one
- to obtain an instance of a buffer, you have to call the InteropBufferPool::AcquireBuffer() method
- you will be provided with an instance of capacity 260 bytes
- to release a buffer and free its resources, call the InteropBufferPool::ReleaseBuffer(InteropBuffer)
method; a buffer to be released must be unlocked!
- MirandaContext::CreateHookableEvent method provided; returns an instance of the EventHandle class
allowing you to manipulate with the event (fire it and set a default hook)
v0.7.1.1
==========================================================================================================
- Minor internal changes
- IcqXStatusPlugin source code included (note it requires Unicode Miranda and the latest ICQOscarJ plugin)
v0.7.1.0
==========================================================================================================
- MirandaContext::PluginSettingsManager property now returns null; please do not use this class, it will be
refactored in the future
- MirandaDatabase::GetProfileName() & ::GetProfilePath() methods added
- Translate::ToString() method now supports length and encoding options; you can now specify an encoding
in which is a string pointed by a handle encoded in or select StringEncoding::MirandaDefault to assume
ANSI under the non-unicode Miranda core and UNICODE under the unicode-aware Miranda core;
using this method will simplify possible unicode transition in the future
- MirandaEnvironment static class introduced; you can use it to obtain the information about Miranda
(currently there is a MirandaStringEncoding property only)
- InteropBuffer class introduced; you can pass it to a Miranda service expecting a char/byte/whatever
buffer pointer; just don't forget to Lock() and Unlock() it before and after the use, respectively
- to obtain a buffer pointer, you the IntPtr property;
- WARNING: do not call the Free()/Dispose() methods (!!!) these will invalidate the buffer and prevent
its next use; these methods are supposed to be called by internal callers only!
- to purge the content of the buffer (if security is your concern), use the Zero() method
- note that the Zero() operation is quite a slow one, so carefully consider its use
- to obtain the capacity of the buffer, use either the InteropBuffer::Capacity or ::CapacityAsXX fields
v0.7.0.5
==========================================================================================================
- MirandaDatabase now supports writing and reading contact settings; reading is done via
a "DB/Contact/GetSettingStatic" service call to improve performance
v0.7.0.1
==========================================================================================================
- Midas v1.0.0.1 included; minor internal API changes
v0.7.0.0
==========================================================================================================
- DotNetConnector is now Midas
- Miranda-2-.net proxy is now pure IL with 3 unmanaged exports only representing the Miranda API entry
points (previously there was an C++/CLI IJW assembly dependent on the MS VCRT v8.0 dlls; this is now gone)
- No public API changes
v0.6.8.0
==========================================================================================================
- PluginSettings class for storing plugin specific settings
- MirandaDatabase class extended
- IndividualMirandaPlugin class added; you can derive your plugins from it and use a small
IL stub to create plugins that are not managed by the PluginManager and thus can override Miranda system modules
and are even transient
- More documentation will code...
- Project <no-codename-yet> has been started; it's goal is to replace the C++/CLI loader stub with a pure
IL stub consisting from 3 unmanaged exports only...
v0.6.7.0
==========================================================================================================
- MenuItemDeclarationAttribute API refactored
- StandardServices & StandardEvent class removed
- ContactList now supports adding and modifying menu items
- Some collection changes
- ContactList.ProtocolStatusChange event added
v0.6.6.0
==========================================================================================================
- All previous known issues resolved (probably caused by some hook-twice operation)
- PluginContext is now MirandaContext
- PluginContext.MirandaPInvokeBridge is not public now, it was visible due a bug
- Miranda lazy event binding introduced (binds to Miranda's internal event only when somebody subscribes
a one)
- PrivatePluginAttribute introduced (makes a plugin manually loadable only, fusion will ignore it)
v0.6.5.0
==========================================================================================================
- Some optimalizations
- KNOWN ISSUES
- MirandaDatabase::EventAdded event fired twice. I think Miranda does this, but don't know why...
v0.6.3.0
==========================================================================================================
- Bunch of new stuff added, see for yourself...
v0.5.8.0
==========================================================================================================
- Contact info query support
- UnmanagedStructHandle´1 struct made public for use
(can be used for easy unmanaged memory allocation and deallocation)
- Performance and stability tuning
- MirandaPlugin base class expansion; some new virtual methods added
- Threaded fusion
v0.5.0.0
==========================================================================================================
- initial alpha release

View File

@ -0,0 +1,71 @@
HYPHEN SRC README
===================================================
© 2006 - 2009, virtuoso
deml.tomas@seznam.cz
v0.8.2009.0201
PREREQUISITES
===================================================
- Microsoft Visual Studio 2008 (no Express editions)
Full MS VS 2k8 is required because the build
solution features multilanguage projects.
(NMAKE, C#)
- Microsoft .NET 2.0 SDK
SOLUTION
===================================================
- In \Virtuoso.Hyphen\Virtuoso.Hyphen.sln
- HYPHEN project should be set as START PROJECT
- PLUGINS project
This is a C# project with Miranda .NET API.
It is build with VS and then disassembled using IlDasm.exe
into the Plugins.IL file.
- HYPHEN project
This is an NMAKE project containing an MSIL stub
which acts as a bootstrapper for MS.NET.
It merges the Plugins.il with the LoaderStub.il
into a single Hyphen.dll assembly using IlAsm.exe.
- HYPHEN.MINI project
This is an NMAKE project containg custom MSIL stub
for database and protocol plugins which cannot
be loaded with Hyphen directly.
HOW TO BUILD
===================================================
- 1) Include
"%WINDIR%\Microsoft.NET\Framework\v2.0.50727" and
"%PROGRAMFILES%\Microsoft Visual Studio 8\SDK\v2.0\Bin"
in the PATH variable.
These paths contain IlAsm.exe and IlDasm.exe respectively
which are needed during the build process.
- 2) Open the solution.
- 3) Switch to the release configuration.
- 4) Open the Hyphen project properties and change
the Output directory to point to
%YOUR_MIRANDA_FOLDER_GOES_HERE\Plugins directory.
- 5) Press F6 to build the solution. You should see
IlAsm output in the output window and IlDasm window
with progress bar.
- 6) Once it's done, you should find Hyphen.dll in your
Miranda\Plugins directory.
PROBLEMS
===================================================
- If you are getting "Failed to define document writer"
errors during the build, make sure the
Hyphen\Bin\(CONFIG_NAME_HERE) folder exists.
CONFIG_NAME_HERE stands for Debug or Release.
- Feel free to !MAIL! me in case of problems.
SOURCES
===================================================
Source codes are mostly undocumented (unfortunately).

View File

@ -0,0 +1,212 @@
<html>
<head>
<meta http-equiv="Content-Language" content="cs">
<title>Midas SDK Docs</title>
<style>
<!--
body { font-family: Tahoma; font-size: 10pt }
-->
</style>
</head>
<body>
<h1>Midas SDK Documentation v1.0</h1>
<h4>Miranda .net Association Plugin SDK, © 2006 Virtuoso</h4>
<h3>Contents</h3>
<ul>
<li>Overview</li>
<li>Architecture</li>
<li>Namespaces<ul>
<li>Key namespaces</li>
<li>Native interop namespaces</li>
</ul>
</li>
<li>Classes<ul>
<li>Key classes<ul>
<li>Plugin definition/construction classes</li>
<li>Miranda API wrapper classes</li>
</ul>
</li>
<li>Native interop classes</li>
<li>Helper classes</li>
</ul>
</li>
<li>A Hello World plugin Walkthrough</li>
</ul>
<p>&nbsp;</p>
<h3>Overview</h3>
<p>Midas (Miranda .net Assocication Plugin) is a plugin allowing Microsoft.net
platform developers to access Miranda APIs thus allowing them to write Miranda
targeted managed plugins.</p>
<p>I created Midas because I'm an avid C# programmer and I wanted to extend
Miranda in an easy, reliable and fast way - with Microsoft.net managed plugins.</p>
<p>You can write Miranda plugins in any Ecma CLI compliant language, for example
C#, J#, Delphi, C++/CLI or Visual Basic.net. Please note that you may not be
able to take advantage of all Midas features from languages that do not support
some CLS non-compliant constructs. You may have problems using Microsoft Visual
Basic.net because it, for example, does not support unsigned data types. Miranda
and Midas use these types (System.UIntPtr) extensively.</p>
<p>In a nutshell, Midas represents a native-to-managed wrapper presenting core
Miranda APIs in the OO fashion to .net. It wraps Miranda's procedural APIs to a
neat and logical object oriented interface.</p>
<p>Using Midas, you can write Miranda plugins that you or anybody else find
useful. With .net plugins, you can accomplish complicated and complex tasks in
the much faster way.</p>
<p>&nbsp;</p>
<h3>Architecture</h3>
<p>Midas consinsts of two crucial assemblies:</p>
<ul>
<li><b>Midas.dll</b><ul>
<li>this assembly was written in IL (Intermediate Language) and contains 3
unmanaged exports exposing required unmanaged plugin API exports to Miranda</li>
<li>previously, there was an C++/CLI assembly but it's maintentace was not
as easy as it ought to be (and me, primarily .net programmer, concluded a
pure IL assembly as a more transparent way to accomplish the connection with
Miranda than the opaque IJW magic C++/CLI compiler uses)</li>
<li>this assembly instantiates the Virtuoso.Midas.Loader class that provides
Miranda with a PLUGININFO information and initiates the .net plugins fusion</li>
</ul>
</li>
<li><b>Virtuoso.Miranda.Plugins.dll</b><ul>
<li>this assembly was written in safe C# and exposes unmanaged Miranda APIs
to the .net world</li>
<li>in this assembly, there is the Virtuoso.Miranda.Plugins.PluginManager
type (not publicly exposed) that finds, loads and initiates all the managed
plugins in the &lt;mirandaFolder&gt;\plugins\managed folder</li>
<li>this assembly is the one you will want to reference on your plugin's
compile time</li>
<li>this assembly also contains the most important type for us, developers,
the Virtuoso.Mirandas.Plugins.MirandaPlugin class representing the base
class for all of your plugins</li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<h3>Namespaces</h3>
<p>There are many publicly visible namespaces containing key classes and many
native interop helper classes making easy to access not yet wrapped parts of the
Miranda API.</p>
<h5>Key namespaces:</h5>
<ul>
<li><b>Virtuoso.Miranda.Plugins</b><ul>
<li>contains funtionality concerning the plugin fusion, maintentace,
definition and construction</li>
</ul>
</li>
<li><b>Virtuoso.Miranda.Plugins.Infrastructure</b><ul>
<li>contains all the functionality you may need to develop your plugins;
provides Database, Contact List, Contact Information, Network Protocol and
many other Miranda API wrappers</li>
<li>also contains some helper classes you may find useful
(unmanaged-to-managed data translation services and localization helpers)</li>
</ul>
</li>
<li><b>Virtoso.Miranda.Plugins.Infrastructure.IndividualMirandaConnection</b><ul>
<li>contains additional helper classes for plugins not managed by the
Microsoft.net plugins supervisor</li>
</ul>
</li>
<li><b>Virtuoso.Miranda.Plugins.ObjectCollections</b><ul>
<li>contains specialized object collections</li>
</ul>
</li>
</ul>
<h5>Native interop namespaces:</h5>
<ul>
<li><b>Virtuoso.Miranda.Plugins.Native</b><ul>
<li>contains types you may use when you need to directly interface with
Miranda APIs; provides you with unmanaged memory, string and struct handles</li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<h3>Classes</h3>
<p>There are several classes representing the Miranda API wrappers for Database,
Contact List and many other aspects of Miranda API model.</p>
<h5>Key classes:</h5>
<ul>
<li>
<h5>Plugin definition/construction classes</h5>
<ul>
<li>
<h5>Virtuoso.Miranda.Plugins namespace</h5>
<ul>
<li><b>abstract MirandaPlugin</b><ul>
<li>represents a base class for all .net plugins</li>
<li>to define a plugin, derive your class from this one, implement
required abstract members and you are ready to go</li>
<li><b>members</b><ul>
<li><b>methods</b><ul>
<li><b>protected</b><ul>
<li><b>void .ctor()</b><ul>
<li>Initializes an instance of the MirandaPlugin class</li>
</ul>
</li>
<li><b>virtual void AfterPluginInitialization() </b>
<ul>
<li>executed after the first plugin initialization</li>
<li>executed only once a Midas lifetime</li>
<li>use this method to initialize your plugin after Miranda
startup, for example for additional event hook-ups</li>
<li>DO NOT EXECUTE ANY TIME CONSUMING CODE IN THIS METHOD
NEITHER SHOW ANY WINDOWS FORMS</li>
</ul>
</li>
<li><b>virtual void AfterMenuItemsPopulation()</b><ul>
<li>executed after the plugin menu items detection</li>
<li>executed only once a Midas lifetime</li>
<li>use this method to change properties or manipulate with your
plugin menu items</li>
<li>DO NOT EXECUTE ANY TIME CONSUMING CODE IN THIS METHOD
NEITHER SHOW ANY WINDOWS FORMS</li>
</ul>
</li>
<li><b>virtual void AfterPluginEnable()</b><ul>
<li>executed right after a plugin is enabled by the
user/supervisor</li>
<li>executed every time a plugin is enabled</li>
<li>DO NOT EXECUTE ANY TIME CONSUMING CODE IN THIS METHOD
NEITHER SHOW ANY WINDOWS FORMS</li>
</ul>
</li>
<li><b>virtual void BeforePluginDisable()</b><ul>
<li>executed right before a plugin is disabled by the
user/supervisor</li>
<li>use this method to unhook events or destroy service
functions you created manually; events and services declared
through attributes will be unhooked/destroyed automatically by
the plugin supervisor</li>
<li>DO NOT EXECUTE ANY TIME CONSUMING CODE IN THIS METHOD
NEITHER SHOW ANY WINDOWS FORMS</li>
</ul>
</li>
<li><b>virtual void BeforeMirandaShutdown</b><ul>
<li>executed right before Miranda or the plugin supervisor is
shutdown</li>
<li>use this method to perform possible memory cleanup</li>
<li>DO NOT ALLOCATE NEW MEMORY NEITHER INTERFACE WITH MIRANDA
THROUGH WRAPPERS OR NATIVE INTEROP FROM THIS METHOD; MIRANDA IS
ABOUT TO SHUTDOWN AND MANY OF ITS APIS ARE NO LONGER AVAILABLE;
USE THE BEFOREPLUGINDISABLE() METHOD INSTEAD</li>
<li></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</body>
</html>

View File

@ -0,0 +1,57 @@
/***********************************************************************\
* 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;
namespace Virtuoso.Miranda.Plugins
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public sealed class ExposingPluginAttribute : Attribute
{
#region Fields
private Type pluginType;
#endregion
#region .ctors
public ExposingPluginAttribute(Type pluginType)
{
if (pluginType == null)
throw new ArgumentNullException("pluginType");
this.pluginType = pluginType;
}
#endregion
#region Properties
public Type PluginType
{
get
{
return this.pluginType;
}
}
#endregion
}
}

View File

@ -0,0 +1,120 @@
using Virtuoso.Miranda.Plugins.Forms.Controls;
namespace Virtuoso.Miranda.Plugins.Forms
{
partial class ConfigurationDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfigurationDialog));
this.OkBTN = new System.Windows.Forms.Button();
this.CancelBTN = new System.Windows.Forms.Button();
this.MainPanel = new Virtuoso.Miranda.Plugins.Forms.Controls.ConfigurationPanel();
this.HideExpertOptionsCHBOX = new System.Windows.Forms.CheckBox();
this.SuspendLayout();
//
// OkBTN
//
this.OkBTN.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.OkBTN.Location = new System.Drawing.Point(556, 524);
this.OkBTN.Name = "OkBTN";
this.OkBTN.Size = new System.Drawing.Size(75, 23);
this.OkBTN.TabIndex = 1;
this.OkBTN.Text = "Save";
this.OkBTN.UseVisualStyleBackColor = true;
this.OkBTN.Click += new System.EventHandler(this.OkBTN_Click);
//
// CancelBTN
//
this.CancelBTN.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.CancelBTN.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.CancelBTN.Location = new System.Drawing.Point(637, 524);
this.CancelBTN.Name = "CancelBTN";
this.CancelBTN.Size = new System.Drawing.Size(75, 23);
this.CancelBTN.TabIndex = 1;
this.CancelBTN.Text = "Cancel";
this.CancelBTN.UseVisualStyleBackColor = true;
this.CancelBTN.Click += new System.EventHandler(this.CancelBTN_Click);
//
// MainPanel
//
this.MainPanel.Font = new System.Drawing.Font("Tahoma", 8F);
this.MainPanel.HideExpertOptions = false;
this.MainPanel.Location = new System.Drawing.Point(14, 13);
this.MainPanel.MinimumSize = new System.Drawing.Size(700, 500);
this.MainPanel.Name = "MainPanel";
this.MainPanel.Size = new System.Drawing.Size(700, 500);
this.MainPanel.TabIndex = 0;
//
// HideExpertOptionsCHBOX
//
this.HideExpertOptionsCHBOX.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.HideExpertOptionsCHBOX.AutoSize = true;
this.HideExpertOptionsCHBOX.Checked = global::Virtuoso.Miranda.Plugins.Properties.Settings.Default.ConfigurationDialog_HideExpertOptions_Checked;
this.HideExpertOptionsCHBOX.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::Virtuoso.Miranda.Plugins.Properties.Settings.Default, "ConfigurationDialog_HideExpertOptions_Checked", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.HideExpertOptionsCHBOX.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.HideExpertOptionsCHBOX.Location = new System.Drawing.Point(12, 530);
this.HideExpertOptionsCHBOX.Name = "HideExpertOptionsCHBOX";
this.HideExpertOptionsCHBOX.Size = new System.Drawing.Size(137, 17);
this.HideExpertOptionsCHBOX.TabIndex = 2;
this.HideExpertOptionsCHBOX.Text = "Hide expert options";
this.HideExpertOptionsCHBOX.UseVisualStyleBackColor = true;
this.HideExpertOptionsCHBOX.CheckedChanged += new System.EventHandler(this.HideExpertOptionsCHBOX_CheckedChanged);
//
// ConfigurationDialog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(724, 559);
this.Controls.Add(this.HideExpertOptionsCHBOX);
this.Controls.Add(this.CancelBTN);
this.Controls.Add(this.OkBTN);
this.Controls.Add(this.MainPanel);
this.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "ConfigurationDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Configuration";
this.Shown += new System.EventHandler(this.ConfigurationDialog_Shown);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ConfigurationDialog_FormClosing);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button OkBTN;
private System.Windows.Forms.Button CancelBTN;
private ConfigurationPanel MainPanel;
private System.Windows.Forms.CheckBox HideExpertOptionsCHBOX;
}
}

View File

@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Virtuoso.Miranda.Plugins.Forms.Controls;
using Virtuoso.Miranda.Plugins.Infrastructure;
using Virtuoso.Miranda.Plugins.Resources;
using Virtuoso.Miranda.Plugins.Properties;
namespace Virtuoso.Miranda.Plugins.Forms
{
public sealed partial class ConfigurationDialog : SingletonDialog
{
#region Fields
private bool Ok;
private IConfigurablePlugin ConfigurableEntity;
#endregion
#region .ctors
private ConfigurationDialog(IConfigurablePlugin configurableEntity) : base(configurableEntity.Name)
{
InitializeComponent();
this.MainPanel.HideExpertOptions = HideExpertOptionsCHBOX.Checked;
this.ConfigurableEntity = configurableEntity;
this.Text = TextResources.UI_Caption_Configure_ + configurableEntity.Name;
configurableEntity.PopulateConfigurationPanel(MainPanel);
}
public static void Present(IConfigurablePlugin configurableEntity, bool modal)
{
Present(configurableEntity, null, modal);
}
public static void Present(IConfigurablePlugin configurableEntity, string path, bool modal)
{
if (configurableEntity == null)
throw new ArgumentNullException("configurableEntity");
ConfigurationDialog singleton = ConfigurationDialog.GetSingleton<ConfigurationDialog>(false, configurableEntity.Name) ??
new ConfigurationDialog(configurableEntity);
if (singleton.MainPanel.Categories.Count == 0)
MessageBox.Show(TextResources.MsgBox_Text_NoOptionsAvailable, TextResources.MsgBox_Caption_NoOptionsAvailable, MessageBoxButtons.OK, MessageBoxIcon.Information);
else
{
singleton.MainPanel.SetPath(path);
singleton.ShowSingleton(modal);
}
}
#endregion
#region Methods
public static string CreatePath(string categoryName, string itemName)
{
return ConfigurationPanel.CreatePath(categoryName, itemName);
}
#endregion
#region UI Handlers
private void ConfigurationDialog_Shown(object sender, EventArgs e)
{
MainPanel.Initialize();
}
private void OkBTN_Click(object sender, EventArgs e)
{
Ok = true;
Close();
}
private void CancelBTN_Click(object sender, EventArgs e)
{
Ok = false;
Close();
}
private void ConfigurationDialog_FormClosing(object sender, FormClosingEventArgs e)
{
if (Ok)
{
ConfigurableEntity.Configuration.Save();
Settings.Default.Save();
}
else
{
ConfigurableEntity.ReloadConfiguration();
Settings.Default.Reload();
}
}
private void HideExpertOptionsCHBOX_CheckedChanged(object sender, EventArgs e)
{
MainPanel.HideExpertOptions = HideExpertOptionsCHBOX.Checked;
}
#endregion
}
}

View File

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="OkBTN.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="CancelBTN.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="MainPanel.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="HideExpertOptionsCHBOX.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAB
AAAAAAAAnoFlAKCEZwChhmkAo4lrAKOIbQCkiW0ApoxuAKiMbwCmjHEAqI5xAKiOdACrkXYArZJ1AK+V
dwCsk3kArpR5ALGXewCwl34Asph6ALGZfgC0m38AtZ1/ALOagAC1nYEAtZ2FALeghwC5oYYAvKKGALmh
iAC7pIkAu6ePAL2mjgC9qI8Av6qTAMCqkQDCrJMAwKuUAMKulQDErZYAxrKbAMi2oADKuKIAyrikAMy6
pgDOvakA0L+rANDArQDQwbAA1sm5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAB8PAAAAAAAAAAAAAAAPLwAIAwAsAQAAAAAAAAAACgoKCAYDAwEAAAAAAAAAIhQd
HxcSDwkGFwAAAAAXFBgiHxIUFA8PCgkCBgAAABIiIhQAAAAADw8JBgAAAAAUKiAAAAAAAAAPDwYAAB0U
FiocAAAAAAAADxQKBgAsHxYuHAAAAAAAAA8XDxQAAAAYLyIAAAAAADEXHw8AAAAvGCkqIC8AACwXIx0P
LAAAHRgiLiwiGB0fIicWDg8AAAAAACMpLy8qKigdAAAAAAAAAAAYGBgYGBYWFgAAAAAAAAAAIgAAHBgA
ABgAAAAAAAAAAAAAACkcAAAAAAAAAP5/AADyTwAA8A8AAOAHAACAAQAAw8MAAMfjAAAH4QAAB+EAAMfD
AACBgQAAgAEAAPAPAADwDwAA9m8AAP5/AAA=
</value>
</data>
</root>

View File

@ -0,0 +1,54 @@
/***********************************************************************\
* 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.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
namespace Virtuoso.Miranda.Plugins.Forms.Controls
{
public class CommandButton : Button
{
public CommandButton()
{
FlatStyle = FlatStyle.Standard;
ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
TextAlign = ContentAlignment.MiddleLeft;
TextImageRelation = TextImageRelation.ImageBeforeText;
FlatAppearance.BorderSize = 3;
FlatAppearance.BorderColor = SystemColors.GradientActiveCaption;
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// CommandButton
//
this.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control;
this.FlatAppearance.BorderSize = 2;
this.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ButtonShadow;
this.FlatAppearance.MouseOverBackColor = System.Drawing.SystemColors.ButtonHighlight;
this.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.ResumeLayout(false);
}
}
}

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
</root>

View File

@ -0,0 +1,197 @@
/***********************************************************************\
* 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.Collections.ObjectModel;
using Virtuoso.Miranda.Plugins.Infrastructure;
using System.Windows.Forms;
using System.Drawing;
namespace Virtuoso.Miranda.Plugins.Forms.Controls
{
public class ContactListView : ListView
{
#region Fields
private ImageList ContactImages;
private System.ComponentModel.IContainer components;
#endregion
#region .ctors
public ContactListView()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ContactListView));
this.ContactImages = new System.Windows.Forms.ImageList(this.components);
this.SuspendLayout();
//
// ContactImages
//
this.ContactImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ContactImages.ImageStream")));
this.ContactImages.TransparentColor = System.Drawing.Color.Transparent;
this.ContactImages.Images.SetKeyName(0, "Contact");
//
// ContactListView
//
this.SmallImageList = this.ContactImages;
this.Sorting = System.Windows.Forms.SortOrder.Ascending;
this.View = System.Windows.Forms.View.List;
this.ResumeLayout(false);
}
#endregion
#region Events
public event EventHandler<ContactFilterEventArgs> FilterContact;
#endregion
#region Handlers
protected virtual object CreateItemTag(ContactInfo contact)
{
return contact;
}
protected virtual string CreateItemText(ContactInfo contact, object tag)
{
return contact.ToString();
}
protected virtual int GetImageIndex(ContactInfo contact, object tag)
{
return 0;
}
#endregion
#region Methods
public virtual void LoadContacts()
{
ReadOnlyCollection<ContactInfo> contacts = MirandaContext.Current.MirandaDatabase.GetContacts(false);
Items.Clear();
ContactFilterEventArgs e = new ContactFilterEventArgs();
for (int i = 0; i < contacts.Count; i++)
InsertContact(contacts[i], e);
}
public virtual void InsertContact(ContactInfo contact)
{
InsertContact(contact, null);
}
private void InsertContact(ContactInfo contact, ContactFilterEventArgs e)
{
if (contact == null)
throw new ArgumentNullException("contact");
if (e != null && FilterContact != null)
{
e.Contact = contact;
e.Skip = false;
FilterContact(this, e);
if (e.Skip)
return;
}
object tag = CreateItemTag(contact);
if (tag != null)
{
ListViewItem item = new ListViewItem(CreateItemText(contact, tag), GetImageIndex(contact, tag));
item.Tag = tag;
Items.Add(item);
}
}
public virtual bool RemoveContact(ContactInfo contact)
{
int index = -1;
for (int i = 0; index == -1 && i < Items.Count; i++)
if (Items[i].Tag.Equals(CreateItemTag(contact)))
index = i;
if (index != -1)
{
Items.RemoveAt(index);
return true;
}
else
return false;
}
public virtual ListViewItem FindContactItem(ContactInfo contact)
{
if (contact == null)
throw new ArgumentNullException("contact");
object tag = CreateItemTag(contact);
ListViewItem item = null;
if (Items.Count > 0)
item = FindItemWithText(CreateItemText(contact, tag), false, 0, false);
if (item == null)
return null;
if (object.ReferenceEquals(item.Tag, tag) || (tag != null && tag.Equals(item.Tag)))
return item;
else
return null;
}
#endregion
}
public class ContactFilterEventArgs : EventArgs
{
public ContactFilterEventArgs() { }
private ContactInfo contact;
public ContactInfo Contact
{
get { return contact; }
internal set { contact = value; }
}
private bool skip;
public bool Skip
{
get { return skip; }
set { skip = value; }
}
}
}

View File

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ContactImages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="ContactImages.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAq
BwAAAk1TRnQBSQFMAwEBAAEEAQABBAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMA
ARADAAEBAQABIAYAARAaAAEDAgEBAgEYAgEBHwFIAgIBggFVAgIBqgFcAgIBvgFkAQkBCAHWAVYCAgGp
ARICAQEX3AABDwIBARIBZQIIAdUBfQEwASoB7gHVAbABjgH/AegBvQGRAf8B7AHAAZcB/wHgAbYBjAH/
AdMBqgGBAf8BawEWAREB5AEmAgEBN9QAAQ0CAQEPAXIBHAEUAeQB4AG1AYoB/wHmAcgBtwH/AeMBvgGg
Af8B4QG3AY0B/wHlAb4BmQH/AdoBtgGRAf8B2QGwAYgB/wHQAaUBgQH/AUgCAgGB2AABYQIGAc0B4QGx
AYgB/wHLAboBrwH/AfIB2QHGAf8B6AG+AZEB/wHsAcgBpAH/AeEBwgGkAf8B2AGyAYsB/wHFAZ0BfwH/
AUECAQFw1AABmwGcAZMB/wFwASQBHAHsAfcBvAGVAf8BzQHAAbYB/wL9AfwC/wHQAaAB/wH1AcwBpgH/
AeYByQGtAf8B6AG/AZYB/wGPAVcBPQH5AYgBhwGEAf8EAAFeAgYB1wFeAQYBBAHWAV0CBgHZAVUCAgGr
wAABbgEgARwB5wHjAe4B5QH/AfMBzwGfAf8BxgGuAZ8B/wFMAXcBmQH/AZcBlQGUAf8B8QHCAZUB/wH3
AcwBogH/Ac4BpQGBAf8BigJ/Af4BXAENAQwB5gGCAYUBgQH/AfMB6AHbAf8B7QHiAdQC/wH3AewB/wF1
AS0BKAHtwAABbQEaARkB5QT/AesB4AHPAf8BfQF6AYEB/wEoAVYBgQH/ASIBUwGBAf8BlwGMAYEB/wHH
AaYBhQH/AdMBxgG8Af8B9wHtAeUB/wH3Ae0B5QH/AfcB7QHlAf8B9wHtAeUB/wH3Ae0B5QH/AfcB7QHl
Af8BcQEoASQB7MAAAW0BGgEZAeUE/wG8AbsBvQH/ATMBTwF9Af4BRgFrAYkB/wE4AWMBiAH/AWgBSAFJ
AfgB5QHbAdMB/wH3Ae0B5QH/AfcB7QHlAf8B9wHtAeUB/wH3Ae0B5QH/AfcB7QHlAf8B9wHtAeUB/wH3
Ae0B5QH/AXEBKAEkAezAAAFtARoBGQHlAfcB9QH2Af8BdQGKAaoB/wFWAX8BoAH/AVoBgQGgAf8BRQFw
AZEB/wGlAasBsQH/AdIBvAGwAf8B9wHtAeUB/wH3Ae0B5QH/AfcB7QHlAf8B9wHtAeUB/wH3Ae0B5QH/
AfcB7QHlAf8B9wHtAeUB/wFxASgBJAHswAABbQEaARkB5QHqAegB6gH/AXYBlAG6Af8BeAGZAb8B/wFu
AY0BswH/AVMBgAGiAf8BRQFeAXQB/wHGAbQBqgH/AfcB7QHlAf8BxgGzAaQB/wHGAbMBpAH/AcYBswGk
Af8BxgGzAaQB/wHGAbMBpAH/AfUB6QHgAf8BcQEoASQB7MAAAW0BGgEZAeUC5wHtAf8BjQGyAdcB/wGb
Ab8B5QH/AYEBpQHPAf8BWgF+AZkB/wE2AUIBTQH/AaYBmgGTAf8B9wHtAeUB/wHSAcIBtQH/AdQBxgG4
Af8B1AHGAbgB/wHUAcYBuAH/AdMBxAG2Af8B9wHtAeUB/wFxASkBJAHswAABbQEaARkB5QH0AfIB8wH/
AZEBrgHKAf4BnwHGAe4B/wGBAaoB1wH/AVYBawGBAf8BNwEuAScB/wGSAYcBgQH/AfcB7QHlAf8B0QHB
AbIB/wHUAcQBtwH/AdQBxAG3Af8B1AHGAbcB/wHTAcQBtgH/AfoB8QHpAf8BcQEpASQB7MAAAW0BGgEZ
AeUB+QH3AfYB/wGdAaIBqQH/AYABgQGLAf8BdQF9AYEB/wJaAVsB/wFFAUMBQQH/AcgBvgG4Af8B9wHt
AeUB/wHGAbMBpAH/AcYBswGkAf8BxgGzAaQB/wHGAbMBpAH/AcYBswGkAf8B+wH0Ae0B/wFzASYBIAHr
wAABbQEZARcB5QT/AdgBzgHHAf8BpQGfAZoB/wGBAXsBeQH/AXMBcQFuAf8BrQGmAaIB/wHpAdwB1AP/
Af4B/wH9AfsB9gH/AfoB9wH0Af8B9wH1AfIB/wH1AfIB7AH/AfMB7AHlAf8B/gH6AfQB/wFtAR0BHAHn
wAABaQEXARUB4xz/AYMCQAHvAXQBHwEeAeUBcQEfAR4B5QFxAR8BHgHlAXEBHwEeAeUBcQEfAR4B5QF0
ASIBHwHlAVACAgGYwAAB2AHbAdEB/wGRAZMBiAH/AZEBkwGIAf8BkQGTAYgB/wGRAZMBiAH/AZEBkwGI
Af8BkQGTAYgB/wGRAZMBiAH/AdgB2wHRAf/cAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUA
AYAXAAP/AQABwAE/BgABgAEfBwABHwYAAYABHwcAARBXAAF/BgAL
</value>
</data>
<metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
</root>

View File

@ -0,0 +1,189 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace Virtuoso.Miranda.Plugins.Forms.Controls
{
/// <summary>
/// Draws a textbox with a prompt inside of it, similar to the "Quick Search" box
/// in Outlook 2007, IE7 or the Firefox 2.0 search box. The prompt will disappear when
/// the focus is placed in the textbox, and will not display again if the Text property
/// contains any value. If the Text property is empty, then the prompt will display
/// again when the textbox loses the focus.
/// </summary>
public class CueBannerTextBox : System.Windows.Forms.TextBox
{
// Windows message constants
const int WM_SETFOCUS = 7;
const int WM_KILLFOCUS = 8;
const int WM_ERASEBKGND = 14;
const int WM_PAINT = 15;
// private internal variables
private bool _focusSelect = true;
private bool _drawPrompt = true;
private string _bannerText = String.Empty;
private Color _bannerColor = SystemColors.GrayText;
private Font _bannerFont = null;
/// <summary>
/// Public constructor
/// </summary>
/// <remarks>Uncomment the SetStyle line to activate the OnPaint logic in place of the WndProc logic</remarks>
public CueBannerTextBox()
{
//this.SetStyle(ControlStyles.UserPaint, true);
this.BannerFont = this.Font;
}
[Browsable(true)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Category("Appearance")]
[Description("The prompt text to display when there is nothing in the Text property.")]
public string BannerText
{
get { return _bannerText; }
set { if (value == null) value = String.Empty; _bannerText = value.Trim(); this.Invalidate(); }
}
[Browsable(true)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Category("Appearance")]
[Description("The ForeColor to use when displaying the PromptText.")]
public Color BannerForeColor
{
get { return _bannerColor; }
set { _bannerColor = value; this.Invalidate(); }
}
[Browsable(true)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Category("Appearance")]
[Description("The Font to use when displaying the PromptText.")]
public Font BannerFont
{
get { return _bannerFont; }
set { _bannerFont = value; this.Invalidate(); }
}
[Browsable(true)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Category("Behavior")]
[Description("Automatically select the text when control receives the focus.")]
public bool FocusSelect
{
get { return _focusSelect; }
set { _focusSelect = value; }
}
/// <summary>
/// When the textbox receives an OnEnter event, select all the text if any text is present
/// </summary>
/// <param name="e"></param>
protected override void OnEnter(EventArgs e)
{
if (this.Text.Length > 0 && _focusSelect)
this.SelectAll();
base.OnEnter(e);
}
/// <summary>
/// Redraw the control when the text alignment changes
/// </summary>
/// <param name="e"></param>
protected override void OnTextAlignChanged(EventArgs e)
{
base.OnTextAlignChanged(e);
this.Invalidate();
}
/// <summary>
/// Redraw the control with the prompt
/// </summary>
/// <param name="e"></param>
/// <remarks>This event will only fire if ControlStyles.UserPaint is set to true in the constructor</remarks>
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// Only draw the prompt in the OnPaint event and when the Text property is empty
if (_drawPrompt && this.Text.Length == 0)
DrawTextPrompt(e.Graphics);
}
/// <summary>
/// Overrides the default WndProc for the control
/// </summary>
/// <param name="m">The Windows message structure</param>
/// <remarks>
/// This technique is necessary because the OnPaint event seems to be doing some
/// extra processing that I haven't been able to figure out.
/// </remarks>
protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_SETFOCUS:
_drawPrompt = false;
break;
case WM_KILLFOCUS:
_drawPrompt = true;
break;
}
base.WndProc(ref m);
// Only draw the prompt on the WM_PAINT event and when the Text property is empty
if (m.Msg == WM_PAINT && _drawPrompt && this.Text.Length == 0 && !this.GetStyle(ControlStyles.UserPaint))
DrawTextPrompt();
}
/// <summary>
/// Overload to automatically create the Graphics region before drawing the text prompt
/// </summary>
/// <remarks>The Graphics region is disposed after drawing the prompt.</remarks>
protected virtual void DrawTextPrompt()
{
using (Graphics g = this.CreateGraphics())
{
DrawTextPrompt(g);
}
}
/// <summary>
/// Draws the PromptText in the TextBox.ClientRectangle using the PromptFont and PromptForeColor
/// </summary>
/// <param name="g">The Graphics region to draw the prompt on</param>
protected virtual void DrawTextPrompt(Graphics g)
{
TextFormatFlags flags = TextFormatFlags.NoPadding | TextFormatFlags.Top | TextFormatFlags.EndEllipsis;
Rectangle rect = this.ClientRectangle;
// Offset the rectangle based on the HorizontalAlignment,
// otherwise the display looks a little strange
switch (this.TextAlign)
{
case HorizontalAlignment.Center:
flags = flags | TextFormatFlags.HorizontalCenter;
rect.Offset(0, 1);
break;
case HorizontalAlignment.Left:
flags = flags | TextFormatFlags.Left;
rect.Offset(1, 1);
break;
case HorizontalAlignment.Right:
flags = flags | TextFormatFlags.Right;
rect.Offset(0, 1);
break;
}
// Draw the prompt text using TextRenderer
TextRenderer.DrawText(g, _bannerText, _bannerFont, rect, _bannerColor, this.BackColor, flags);
}
}
}

View File

@ -0,0 +1,125 @@
//--------------------------------------------------------------------------
//
// Copyright (c) Chili Software. All rights reserved.
//
// File: CueBannerTextBox.cs
//
// Description: Text box that allows to display a cue banner.
//
//--------------------------------------------------------------------------
// Idea from: http://www.delphipraxis.net/topic13132_editgetcuebannertext+win+xp.html
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Diagnostics;
using System.ComponentModel;
namespace Virtuoso.Miranda.Plugins.Forms.Controls
{
/// <summary>
/// This class represents a text box that is enhanced to display a little cue banner, if
/// no text has been entered. This could be used to inform the user what should be entered
/// in the text box.
/// </summary>
public class CueBannerTextBox : TextBox
{
#region NativeMethods
private const uint ECM_FIRST = 0x1500;
private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
private const uint WM_SETFONT = 0x30;
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, string lParam);
#endregion
private string _bannerText;
private Font _bannerFont;
/// <summary>
/// The banner text associated with the control.
/// </summary>
[Description("The banner text associated with the control.")]
[Category("Appearance")]
public string BannerText
{
get { return _bannerText; }
set
{
_bannerText = value;
// If supported set the value as banner text.
if (IsSupported)
SendMessage(this.Handle, EM_SETCUEBANNER, IntPtr.Zero, value);
}
}
/// <summary>
/// The banner font used to display the banner text in the control.
/// </summary>
[Description("The banner font used to display the banner text in the control.")]
[Category("Appearance")]
public Font BannerFont
{
get
{
if (_bannerFont == null && this.Parent != null)
return this.Parent.Font;
return _bannerFont;
}
set { _bannerFont = value; }
}
#region Overridden Members
/// <summary>
/// Invoked each time the focus is lost.
/// </summary>
/// <param name="e"></param>
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
// Notify the text box to change the font to the banner font.
if (this.Text.Length == 0 && IsSupported)
{
SendMessage(this.Handle, WM_SETFONT, _bannerFont.ToHfont(), null);
}
}
/// <summary>
/// Invoked each time the focus is gotten.
/// </summary>
/// <param name="e"></param>
protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
// Notify the text box to change the font back.
if (IsSupported)
SendMessage(this.Handle, WM_SETFONT, base.Font.ToHfont(), null);
}
#endregion
/// <summary>
/// Returns whether the OS supports banner texts. It is fine if the application
/// runs on XP or higher.
/// </summary>
private bool IsSupported
{
get
{
Version v = Environment.OSVersion.Version;
return ((v.Major == 5 && v.Minor == 1) || v.Major > 5);
}
}
}
}

View File

@ -0,0 +1,56 @@
/***********************************************************************\
* 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.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace Virtuoso.Miranda.Plugins.Forms.Controls
{
[ToolboxBitmap(typeof(Panel))]
public sealed class GradientPanel : Panel
{
public GradientPanel() { }
private Color gradientColor;
public Color GradientColor
{
get { return gradientColor; }
set { gradientColor = value; Refresh(); }
}
private float rotation;
public float Rotation
{
get { return rotation; }
set { rotation = value; Refresh(); }
}
protected override void OnPaint(PaintEventArgs e)
{
if (e.ClipRectangle.IsEmpty) return;
using (LinearGradientBrush brush = new LinearGradientBrush(ClientRectangle, BackColor, GradientColor, Rotation))
e.Graphics.FillRectangle(brush, ClientRectangle);
base.OnPaint(e);
}
}
}

View File

@ -0,0 +1,242 @@
/***********************************************************************\
* 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.Windows.Forms;
using System.Runtime.InteropServices;
using Virtuoso.Miranda.Plugins.Native;
using System.Drawing;
using Virtuoso.Miranda.Plugins.Infrastructure;
using Virtuoso.Miranda.Plugins.Resources;
using Virtuoso.Miranda.Plugins.Forms.Controls;
namespace Virtuoso.Miranda.Plugins.Forms.Controls
{
// Impl note: must be public, remoting rejects non-public method calls.
public sealed class ManagedMainMenu : ContextMenuStrip
{
#region Delegates
private delegate void AddMainMenuItemInvoker(ManagedMainMenu menu, ManagedMainMenuItem item);
private delegate void ModifyMenuItemInvoker(ManagedMainMenu menu, ref CLISTMENUITEM itemData, string handle);
#endregion
#region Fields
private static readonly Random HandleGenerator = new Random();
private static readonly AddMainMenuItemInvoker AddMainMenuItemDelegate = new AddMainMenuItemInvoker(AddMainMenuItem);
private static readonly ModifyMenuItemInvoker ModifyMenuItemDelegate = new ModifyMenuItemInvoker(ModifyMenuItem);
private static readonly ToolStripMenuItem EmptyItem;
private readonly int EmptyItemIndex;
#endregion
#region .ctors & .dctors
static ManagedMainMenu()
{
EmptyItem = new ToolStripMenuItem(TextResources.UI_Label_Empty);
EmptyItem.Visible = false;
}
internal ManagedMainMenu()
{
RenderMode = ToolStripRenderMode.System;
EmptyItemIndex = Items.Add(EmptyItem);
}
#endregion
#region Methods
#region Overrides
public override object InitializeLifetimeService()
{
return null;
}
#endregion
#region UI
internal void ShowUnderCursor()
{
if (Items.Count == 1)
Items[EmptyItemIndex].Visible = true;
else
Items[EmptyItemIndex].Visible = false;
Show(Cursor.Position);
}
#endregion
#region Interceptors
/// <summary>
///
/// </summary>
/// <param name="menu"></param>
/// <remarks>
/// This method is static to not let the execution run in default AppDomain but in a domain of the menu itself.
/// </remarks>
internal static void RegisterInterceptors(ManagedMainMenu menu)
{
MirandaContext context = MirandaContext.Current;
context.ServiceCallInterceptors.Register(MirandaServices.MS_CLIST_ADDMAINMENUITEM, menu.AddMainMenuItemServiceInterceptor);
context.ServiceCallInterceptors.Register(MirandaServices.MS_CLIST_MODIFYMENUITEM, menu.ModifyMenuItemInterceptor);
}
internal static void UnregisterInterceptors(ManagedMainMenu menu)
{
MirandaContext context = MirandaContext.Current;
context.ServiceCallInterceptors.Unregister(MirandaServices.MS_CLIST_ADDMAINMENUITEM);
context.ServiceCallInterceptors.Unregister(MirandaServices.MS_CLIST_MODIFYMENUITEM);
}
private int AddMainMenuItemServiceInterceptor(UIntPtr wParam, IntPtr lParam)
{
CLISTMENUITEM itemData = (CLISTMENUITEM)Marshal.PtrToStructure(lParam, typeof(CLISTMENUITEM));
ManagedMainMenuItem menuItem = null;
Image itemImage = null;
if (itemData.Icon != IntPtr.Zero)
itemImage = IconImageCache.Singleton.GetIconImage(itemData.Icon);
menuItem = new ManagedMainMenuItem(itemData.Text, itemData.PopUpMenu, itemData.Service, itemImage);
if (InvokeRequired)
Invoke(AddMainMenuItemDelegate, this, menuItem);
else
AddMainMenuItemDelegate(this, menuItem);
return menuItem.Handle;
}
private static void AddMainMenuItem(ManagedMainMenu menu, ManagedMainMenuItem item)
{
if (!String.IsNullOrEmpty(item.PopUpMenu))
{
string popupName = item.PopUpMenu;
ToolStripMenuItem popupItem = null;
ToolStripItem[] popupItems = menu.Items.Find(popupName, false);
if (popupItems.Length > 0)
popupItem = (ToolStripMenuItem)popupItems[0];
else
{
popupItem = new ToolStripMenuItem(popupName);
popupItem.Name = popupName;
menu.Items.Add(popupItem);
}
popupItem.DropDownItems.Add(item);
}
else
menu.Items.Add(item);
}
private int ModifyMenuItemInterceptor(UIntPtr wParam, IntPtr lParam)
{
try
{
CLISTMENUITEM itemData = (CLISTMENUITEM)Marshal.PtrToStructure(lParam, typeof(CLISTMENUITEM));
string handle = wParam.ToString();
if (!Items.ContainsKey(handle))
{
if (String.IsNullOrEmpty(itemData.PopUpMenu) ||
!Items.ContainsKey(itemData.PopUpMenu) ||
!((ToolStripMenuItem)Items[itemData.PopUpMenu]).DropDownItems.ContainsKey(handle))
return MirandaContext.Current.CallService(MirandaServices.MS_CLIST_MODIFYMENUITEM, wParam, lParam, true);
}
if (InvokeRequired)
Invoke(ModifyMenuItemDelegate, this, itemData, handle);
else
ModifyMenuItemDelegate(this, ref itemData, handle);
return 0;
}
catch
{
return -1;
}
}
private static void ModifyMenuItem(ManagedMainMenu menu, ref CLISTMENUITEM itemData, string handle)
{
ManagedMainMenuItem item = (ManagedMainMenuItem)menu.Items.Find(handle, itemData.PopUpMenu != null)[0];
MenuItemModifyFlags flags = (MenuItemModifyFlags)itemData.Flags;
if ((flags & MenuItemModifyFlags.CMIM_NAME) == MenuItemModifyFlags.CMIM_NAME)
item.Text = itemData.Text;
if ((flags & MenuItemModifyFlags.CMIM_ICON) == MenuItemModifyFlags.CMIM_ICON)
item.Image = IconImageCache.Singleton.GetIconImage(itemData.Icon);
if ((flags & MenuItemModifyFlags.CMIM_HOTKEY) == MenuItemModifyFlags.CMIM_HOTKEY)
item.ShortcutKeys = (Keys)itemData.HotKey;
if ((flags & MenuItemModifyFlags.CMIM_FLAGS) == MenuItemModifyFlags.CMIM_FLAGS)
{
MenuItemProperties itemFlags = (MenuItemProperties)(flags & ~MenuItemModifyFlags.CMIM_ALL);
switch (itemFlags)
{
case MenuItemProperties.Grayed:
item.Enabled = false;
break;
case MenuItemProperties.Hidden:
if (item.OwnerItem == null)
menu.Items.Remove(item);
else
{
ToolStripMenuItem popupItem = (ToolStripMenuItem)item.OwnerItem;
popupItem.DropDownItems.Remove(item);
if (popupItem.DropDownItems.Count == 0)
menu.Items.Remove(popupItem);
}
break;
case MenuItemProperties.Checked:
item.Checked = true;
break;
case MenuItemProperties.None:
item.Enabled = true;
item.Visible = true;
item.Checked = false;
break;
}
}
}
#endregion
#endregion
}
}

View File

@ -0,0 +1,85 @@
/***********************************************************************\
* 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.Windows.Forms;
using Virtuoso.Miranda.Plugins.Infrastructure;
using System.Drawing;
namespace Virtuoso.Miranda.Plugins.Forms.Controls
{
internal class ManagedMainMenuItem : ToolStripMenuItem
{
#region Fields
private static readonly Random HandleGenerator = new Random();
private int handle;
private string service, popUpMenu;
#endregion
#region .ctors
public ManagedMainMenuItem(string text, string popUpMenu, string service, Image image)
{
if (String.IsNullOrEmpty(text)) throw new ArgumentNullException("text");
if (String.IsNullOrEmpty(service)) throw new ArgumentNullException("service");
this.Name = (handle = HandleGenerator.Next()).ToString();
this.Text = text;
this.popUpMenu = popUpMenu;
this.service = service;
this.Image = image;
this.Click += new EventHandler(ManagedMainMenuItem_Click);
}
#endregion
#region Properties
public string PopUpMenu
{
get { return popUpMenu; }
}
public string Service
{
get { return service; }
}
public int Handle
{
get { return handle; }
}
#endregion
#region Methods
private void ManagedMainMenuItem_Click(object sender, EventArgs e)
{
MirandaContext.Current.CallService(service);
}
#endregion
}
}

View File

@ -0,0 +1,84 @@
/***********************************************************************\
* 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.Windows.Forms;
using Virtuoso.Miranda.Plugins.Infrastructure;
using Virtuoso.Miranda.Plugins.Configuration.Forms;
using Virtuoso.Miranda.Plugins.Configuration;
using Virtuoso.Miranda.Plugins.Resources;
using Virtuoso.Hyphen;
namespace Virtuoso.Miranda.Plugins.Forms.Controls
{
internal sealed class TrayContextMenu : ContextMenuStrip
{
#region Fields
private ToolStripMenuItem ManagePluginsITEM;
#endregion
#region .ctors
public TrayContextMenu()
{
InitializeComponent();
}
#endregion
#region Designer
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TrayContextMenu));
this.ManagePluginsITEM = new System.Windows.Forms.ToolStripMenuItem();
this.SuspendLayout();
//
// ManagePluginsITEM
//
this.ManagePluginsITEM.Image = ((System.Drawing.Image)(resources.GetObject("ManagePluginsITEM.Image")));
this.ManagePluginsITEM.Name = "ManagePluginsITEM";
this.ManagePluginsITEM.Size = new System.Drawing.Size(111, 22);
this.ManagePluginsITEM.Text = "Options";
this.ManagePluginsITEM.Click += new System.EventHandler(this.ManagePluginsITEM_Click);
//
// TrayContextMenu
//
this.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ManagePluginsITEM});
this.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
this.Size = new System.Drawing.Size(112, 26);
this.ResumeLayout(false);
}
#endregion
#region UI Handlers
private void ManagePluginsITEM_Click(object sender, EventArgs e)
{
Loader.GetInstance().ManagePlugins();
}
#endregion
}
}

View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ManagePluginsITEM.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALEwAA
CxMBAJqcGAAAAtdJREFUOE99U0tPE1EUblgQV64MCQv3rtwZE2NMiIkbQzTEldENFmpbWvqkpVT6pC2l
7ZS+3/Td6UyH0k6nBUt5yQKNAv4Gg0YXxMQYg6VzvDbBCGm4m3tz73e+853zncvhXLI0YXpTG6Y/X4b5
96aJ1oZm4/VDTYR5OB2mB3RR5rsxXoepYOWm0r8imQ5UjiRu8lZPMm2UeWJINMAQr3f0MaZtiDOAdtBF
a6wuQrO6KA1SD/X4XLAmUrutjTF3Z6LMiKuw+TtVfwvL2x+B3DwEfH0f8q8/QKD8BuZSa6zcU1aIsdI9
kYu4w1GFqld18fqxId4ADN8AYuMACs334CG3wbjU6BgTjVNnoQXB5V0IULtgRGrUvjIoPcttjjJQ6Z+J
1BJIIpus70EeBdqyzc50uBZWh+nr6hA9qA5WKX2UaWN4C2ypNVB5y6zIVUx05auC1QFDjGFLW4ewiDKi
hkkuNkXpL+uNsRrYs01QeMgOkt3HUYeq5KsI/UmP5BRbB2BIrP3o1U25j7ox5S93TAgnw4ow6SoecZCX
X3XoAtmCGrMPuhhz3CtY5qEGFW6irQtXQOIqgtiRhy5O4VsZRtkhvfoO7Lkmq/CVRy8SIH8lKi8JMz4K
xPY8K1jAh7oYibs0rAlWOt7SDvipHdCGKqeTbvL+GQE6j8gw4pfaS4Ecw0FozZwK7PkHHKGj2C/3Ukea
UBVMyC4fuQVYvgVoKDpyT+mbbJH8MuUmWZWHBIULB5EtAzxzEsbNqZ9d8gkX8VLgILgiZ3F9FtVkTTaQ
JatgRtM1G1wBjbcEUlSjcD4D43OpvXFL+jnXnOaeK03gKDxVuEus1EWwUicOk84Cqi8LAmsG+HNJ4JmW
YMySHus52xMOXCvFiBO+vWARLOSfTdjzJwJLGoT2nJhny/pe6OMdrjl1PuP/TCjwEX8+d+XvnWA+t8G3
ZbpfkmfNXuOakrxR01LfGf4P/J24pw50qlAAAAAASUVORK5CYII=
</value>
</data>
<metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -0,0 +1,61 @@
/***********************************************************************\
* 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.Windows.Forms;
using Virtuoso.Miranda.Plugins.Resources;
using System.ComponentModel;
using System.Drawing;
using Virtuoso.Miranda.Plugins.Infrastructure;
namespace Virtuoso.Miranda.Plugins.Forms.Controls
{
internal sealed class TrayMenuManager : IDisposable
{
#region Fields
private readonly NotifyIcon TrayIcon;
#endregion
#region .ctors
public TrayMenuManager()
{
TrayIcon = new NotifyIcon();
TrayIcon.Text = TextResources.UI_ToolTip_HyphenTrayIcon;
TrayIcon.Visible = true;
TrayIcon.Icon = VisualResources.Icon_16x16_Hyphen;
TrayIcon.ContextMenuStrip = new TrayContextMenu();
}
#endregion
#region IDisposable Members
public void Dispose()
{
if (TrayIcon != null)
TrayIcon.Dispose();
}
#endregion
}
}

View File

@ -0,0 +1,152 @@
namespace Virtuoso.Miranda.Plugins.Forms
{
internal partial class ErrorDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param eventName="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ErrorDialog));
this.MessageLABEL = new System.Windows.Forms.Label();
this.DetailsTBOX = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.OkBTN = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.Panel1 = new Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemHeader();
this.CancelBTN = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.SendReportLBTN = new System.Windows.Forms.LinkLabel();
this.Panel1.SuspendLayout();
this.SuspendLayout();
//
// MessageLABEL
//
resources.ApplyResources(this.MessageLABEL, "MessageLABEL");
this.MessageLABEL.Name = "MessageLABEL";
//
// DetailsTBOX
//
this.DetailsTBOX.BackColor = System.Drawing.SystemColors.Window;
resources.ApplyResources(this.DetailsTBOX, "DetailsTBOX");
this.DetailsTBOX.Name = "DetailsTBOX";
this.DetailsTBOX.ReadOnly = true;
//
// label2
//
resources.ApplyResources(this.label2, "label2");
this.label2.Name = "label2";
//
// OkBTN
//
resources.ApplyResources(this.OkBTN, "OkBTN");
this.OkBTN.DialogResult = System.Windows.Forms.DialogResult.OK;
this.OkBTN.Name = "OkBTN";
this.OkBTN.UseVisualStyleBackColor = true;
//
// label3
//
resources.ApplyResources(this.label3, "label3");
this.label3.BackColor = System.Drawing.Color.Transparent;
this.label3.Name = "label3";
//
// Panel1
//
this.Panel1.BackColor = System.Drawing.Color.Transparent;
this.Panel1.Color = System.Drawing.SystemColors.ActiveCaption;
this.Panel1.Controls.Add(this.label3);
resources.ApplyResources(this.Panel1, "Panel1");
this.Panel1.HeaderFont = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.Panel1.Image = ((System.Drawing.Image)(resources.GetObject("Panel1.Image")));
this.Panel1.MinimumSize = new System.Drawing.Size(300, 40);
this.Panel1.Name = "Panel1";
//
// CancelBTN
//
this.CancelBTN.DialogResult = System.Windows.Forms.DialogResult.Cancel;
resources.ApplyResources(this.CancelBTN, "CancelBTN");
this.CancelBTN.Name = "CancelBTN";
this.CancelBTN.UseVisualStyleBackColor = true;
//
// label1
//
resources.ApplyResources(this.label1, "label1");
this.label1.Name = "label1";
//
// label4
//
resources.ApplyResources(this.label4, "label4");
this.label4.Name = "label4";
//
// SendReportLBTN
//
resources.ApplyResources(this.SendReportLBTN, "SendReportLBTN");
this.SendReportLBTN.Name = "SendReportLBTN";
this.SendReportLBTN.TabStop = true;
this.SendReportLBTN.UseCompatibleTextRendering = true;
this.SendReportLBTN.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.SendReportLBTN_LinkClicked);
//
// ErrorDialog
//
this.AcceptButton = this.OkBTN;
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Window;
this.CancelButton = this.CancelBTN;
this.Controls.Add(this.SendReportLBTN);
this.Controls.Add(this.label4);
this.Controls.Add(this.CancelBTN);
this.Controls.Add(this.MessageLABEL);
this.Controls.Add(this.DetailsTBOX);
this.Controls.Add(this.OkBTN);
this.Controls.Add(this.label1);
this.Controls.Add(this.Panel1);
this.Controls.Add(this.label2);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ErrorDialog";
this.Shown += new System.EventHandler(this.PluginErrorDialog_Shown);
this.Panel1.ResumeLayout(false);
this.Panel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label MessageLABEL;
private System.Windows.Forms.TextBox DetailsTBOX;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button OkBTN;
private System.Windows.Forms.Label label3;
private Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemHeader Panel1;
private System.Windows.Forms.Button CancelBTN;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.LinkLabel SendReportLBTN;
}
}

View File

@ -0,0 +1,133 @@
/***********************************************************************\
* 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.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Virtuoso.Miranda.Plugins.Resources;
using Virtuoso.Miranda.Plugins.Infrastructure;
using System.Diagnostics;
using System.Media;
namespace Virtuoso.Miranda.Plugins.Forms
{
internal sealed partial class ErrorDialog : Form
{
#region Fields
private IExceptionReporter Reporter;
private Exception Exception;
#endregion
#region .ctors
private ErrorDialog()
{
InitializeComponent();
}
public static DialogResult PresentModal(Exception e)
{
return PresentModal(e, null, null, false);
}
public static DialogResult PresentModal(Exception e, IExceptionReporter reporter)
{
return PresentModal(e, reporter, null, false);
}
public static DialogResult PresentModal(Exception e, string message, bool canCancel)
{
return PresentModal(e, null, message, canCancel);
}
public static DialogResult PresentModal(Exception e, IExceptionReporter reporter, string message, bool canCancel)
{
using (ErrorDialog dlg = new ErrorDialog())
{
return dlg.BindAndShow(e, reporter, message, canCancel);
}
}
#endregion
#region Methods
private DialogResult BindAndShow(Exception exception, IExceptionReporter reporter, string message, bool canCancel)
{
if (exception == null)
throw new ArgumentNullException("exception");
this.Exception = exception;
this.MessageLABEL.Text = message ?? exception.Message;
PrepareReportLink(exception, reporter);
DumpException(exception);
CancelBTN.Visible = canCancel;
OkBTN.Focus();
return ShowDialog();
}
private void PrepareReportLink(Exception exception, IExceptionReporter reporter)
{
if (reporter == null)
{
SendReportLBTN.Enabled = false;
}
else
{
this.Reporter = reporter;
}
}
private void DumpException(Exception e)
{
StringBuilder dump = new StringBuilder();
if (e is IExceptionDumpController)
{
((IExceptionDumpController)e).DumpException(e, dump);
}
dump.AppendFormat("=== Exception dump ==={0}{1}{0}{0}", Environment.NewLine, e.ToString());
DetailsTBOX.Text = dump.ToString();
}
#endregion
#region UI Handlers
private void PluginErrorDialog_Shown(object sender, EventArgs e)
{
SystemSounds.Hand.Play();
}
private void SendReportLBTN_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Reporter.ReportException(Exception);
}
#endregion
}
}

View File

@ -0,0 +1,538 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="MessageLABEL.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="MessageLABEL.Location" type="System.Drawing.Point, System.Drawing">
<value>9, 56</value>
</data>
<data name="MessageLABEL.Size" type="System.Drawing.Size, System.Drawing">
<value>401, 56</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="MessageLABEL.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="MessageLABEL.Text" xml:space="preserve">
<value>(message)</value>
</data>
<data name="&gt;&gt;MessageLABEL.Name" xml:space="preserve">
<value>MessageLABEL</value>
</data>
<data name="&gt;&gt;MessageLABEL.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;MessageLABEL.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;MessageLABEL.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<metadata name="DetailsTBOX.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="DetailsTBOX.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 186</value>
</data>
<data name="DetailsTBOX.Multiline" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="DetailsTBOX.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
<value>Both</value>
</data>
<data name="DetailsTBOX.Size" type="System.Drawing.Size, System.Drawing">
<value>398, 171</value>
</data>
<data name="DetailsTBOX.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;DetailsTBOX.Name" xml:space="preserve">
<value>DetailsTBOX</value>
</data>
<data name="&gt;&gt;DetailsTBOX.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;DetailsTBOX.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;DetailsTBOX.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<metadata name="label2.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label2.Font" type="System.Drawing.Font, System.Drawing">
<value>Tahoma, 8pt, style=Bold</value>
</data>
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
<value>9, 170</value>
</data>
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
<value>46, 13</value>
</data>
<data name="label2.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>Details</value>
</data>
<data name="&gt;&gt;label2.Name" xml:space="preserve">
<value>label2</value>
</data>
<data name="&gt;&gt;label2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label2.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<metadata name="OkBTN.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="OkBTN.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="OkBTN.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 363</value>
</data>
<data name="OkBTN.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 23</value>
</data>
<data name="OkBTN.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="OkBTN.Text" xml:space="preserve">
<value>OK</value>
</data>
<data name="&gt;&gt;OkBTN.Name" xml:space="preserve">
<value>OkBTN</value>
</data>
<data name="&gt;&gt;OkBTN.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;OkBTN.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;OkBTN.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<metadata name="label3.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label3.Font" type="System.Drawing.Font, System.Drawing">
<value>Franklin Gothic Medium, 14pt</value>
</data>
<data name="label3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 12</value>
</data>
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
<value>273, 24</value>
</data>
<data name="label3.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>Failed to load a managed plugin</value>
</data>
<data name="&gt;&gt;label3.Name" xml:space="preserve">
<value>label3</value>
</data>
<data name="&gt;&gt;label3.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label3.Parent" xml:space="preserve">
<value>Panel1</value>
</data>
<data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<metadata name="Panel1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="Panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="Panel1.Font" type="System.Drawing.Font, System.Drawing">
<value>Tahoma, 8.25pt</value>
</data>
<data name="Panel1.HeaderText" xml:space="preserve">
<value>An error occured in Hyphen or one of its plugins.</value>
</data>
<data name="Panel1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
TkSuQmCC
</value>
</data>
<data name="Panel1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="Panel1.Size" type="System.Drawing.Size, System.Drawing">
<value>422, 53</value>
</data>
<data name="Panel1.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;Panel1.Name" xml:space="preserve">
<value>Panel1</value>
</data>
<data name="&gt;&gt;Panel1.Type" xml:space="preserve">
<value>Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemHeader, Hyphen, Version=0.8.6.1931, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;Panel1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;Panel1.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<metadata name="CancelBTN.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="CancelBTN.Location" type="System.Drawing.Point, System.Drawing">
<value>93, 363</value>
</data>
<data name="CancelBTN.Size" type="System.Drawing.Size, System.Drawing">
<value>75, 23</value>
</data>
<data name="CancelBTN.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="CancelBTN.Text" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="CancelBTN.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;CancelBTN.Name" xml:space="preserve">
<value>CancelBTN</value>
</data>
<data name="&gt;&gt;CancelBTN.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;CancelBTN.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;CancelBTN.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<metadata name="label1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label1.Font" type="System.Drawing.Font, System.Drawing">
<value>Tahoma, 8pt, style=Bold</value>
</data>
<data name="label1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>9, 124</value>
</data>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>118, 13</value>
</data>
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>Report the problem</value>
</data>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>
</data>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<metadata name="label4.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label4.Location" type="System.Drawing.Point, System.Drawing">
<value>9, 137</value>
</data>
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
<value>169, 13</value>
</data>
<data name="label4.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="label4.Text" xml:space="preserve">
<value>To send this report to the author,</value>
</data>
<data name="&gt;&gt;label4.Name" xml:space="preserve">
<value>label4</value>
</data>
<data name="&gt;&gt;label4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label4.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label4.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<metadata name="SendReportLBTN.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="SendReportLBTN.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="SendReportLBTN.LinkArea" type="System.Windows.Forms.LinkArea, System.Windows.Forms">
<value>0, 10</value>
</data>
<data name="SendReportLBTN.Location" type="System.Drawing.Point, System.Drawing">
<value>177, 137</value>
</data>
<data name="SendReportLBTN.Size" type="System.Drawing.Size, System.Drawing">
<value>53, 18</value>
</data>
<data name="SendReportLBTN.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="SendReportLBTN.Text" xml:space="preserve">
<value>click here.</value>
</data>
<data name="&gt;&gt;SendReportLBTN.Name" xml:space="preserve">
<value>SendReportLBTN</value>
</data>
<data name="&gt;&gt;SendReportLBTN.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;SendReportLBTN.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;SendReportLBTN.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 13</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>422, 397</value>
</data>
<data name="$this.Font" type="System.Drawing.Font, System.Drawing">
<value>Tahoma, 8pt</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAABweLRgcHi40HB4vHBweL8AcHi/AHB4vHBweLjQcHi0YAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAHB4sgBweLjDAwqf5oaMj/lpbd/6qq5v+goOP/kJDb/2hoyP8wMKn+BweLjAcH
iyAAAAAAAAAAAAAAAAAHB4sgCQmf81ZWwf+Wl+H/dnbY/0NDyv8eHr//Hh6//0NDyv92dtj/l5fh/1ZW
wf8KCpzzBweLIAAAAAAAAAAABweLjFVWw/+UlOP/TU2s/xYWkv8WFpL/Dw+8/w8Pu/8PD7v/FhaS/01N
rP+YmM//VlbB/wcHi4wAAAAABweLRi8vrP6VleT/RkbS///////29v3/FhaS/w4Ov/8ODr7/FhaS////
////////TU2s/5eX4f8wMKn+BweLRgcHi41nZ83/cnLg/wwMyP/29v3//////9DQ6f9CQqf/Nzeh/7Ky
2//9/f7//////xYWkv92ddn/aGjI/wcHi40HB4vHi4vi/zs72f8KC87/CgvM/9LS9f//////vr7h/6am
1v//////zs7o/xYWkv8WFpL/QUHN/5OU3v8HB4vHBweL8JeY7P8WFtf/CQnT/x0d1f83N9n/qKjW////
////////wMDi/1BQrf8bG8r/DQ3F/xscyP+pqen/BweL8AcHi/ClpfD/FRXb/wcI2P8ICNb/Nzeh/7Cw
2v///////////8vL5/9ERKf/CwvM/wsMyf8bG8v/sbHs/wcHi/AHB4vHkpHp/zs75v8GBt3/FhaS/9nZ
7f//////urrf/6en1v//////29vu/xYWkv8KCs//QD/Y/5WV4/8HB4vHBweLjWRl1f9wcO//BQXi//r6
/v//////3t7w/0BApv8wMOD/xsb2///////+/v//FhaS/3Jy5v9mZ8//BweLjQcHi0YtLbL+kpLy/z8/
7P//////+/v//xYWkv8ICOH/BQXg/wYG3v///////////01NrP+Tk+z/Li6u/gcHi0YAAAAABweLjFFR
0/+Pj/X/Pz7t/wME6P8EBOf/BATm/wQF5P8EBOP/BQbh/0FA5/+RkfH/UlLO/wcHi4wAAAAAAAAAAAcH
iyAHB6rzUVHT/5GR9P9vb/P/ODju/xIT6v8SEuj/OTns/29v8P+SkvL/UVLQ/wcHpvMHB4sgAAAAAAAA
AAAAAAAABweLIAcHi4wtLbL+ZGTY/5OT7f+oqPb/n5/1/46O7P9kZNf/LS2y/gcHi4wHB4sgAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAABweLRgcHi40HB4vHBweL8AcHi/AHB4vHBweLjQcHi0YAAAAAAAAAAAAA
AAAAAAAA8A8AAMADAACAAQAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAIAB
AADAAwAA8A8AAA==
</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Plugin error</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>ErrorDialog</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -0,0 +1,82 @@
namespace Virtuoso.Miranda.Plugins.Forms
{
partial class FusionProgressDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FusionProgressDialog));
this.FusionWorker = new System.ComponentModel.BackgroundWorker();
this.BackgroundPBOX = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.BackgroundPBOX)).BeginInit();
this.SuspendLayout();
//
// FusionWorker
//
this.FusionWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.FusionWorker_DoWork);
this.FusionWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.FusionWorker_RunWorkerCompleted);
//
// BackgroundPBOX
//
this.BackgroundPBOX.Image = ((System.Drawing.Image)(resources.GetObject("BackgroundPBOX.Image")));
this.BackgroundPBOX.Location = new System.Drawing.Point(0, 0);
this.BackgroundPBOX.Name = "BackgroundPBOX";
this.BackgroundPBOX.Size = new System.Drawing.Size(200, 100);
this.BackgroundPBOX.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.BackgroundPBOX.TabIndex = 2;
this.BackgroundPBOX.TabStop = false;
//
// FusionProgressDialog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.LightSteelBlue;
this.ClientSize = new System.Drawing.Size(200, 100);
this.ControlBox = false;
this.Controls.Add(this.BackgroundPBOX);
this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
this.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FusionProgressDialog";
this.Opacity = 0.75;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Loading plugins";
this.TransparencyKey = System.Drawing.Color.LightSteelBlue;
((System.ComponentModel.ISupportInitialize)(this.BackgroundPBOX)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.ComponentModel.BackgroundWorker FusionWorker;
private System.Windows.Forms.PictureBox BackgroundPBOX;
}
}

View File

@ -0,0 +1,89 @@
/***********************************************************************\
* 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.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Virtuoso.Hyphen;
using Virtuoso.Miranda.Plugins.Resources;
namespace Virtuoso.Miranda.Plugins.Forms
{
internal sealed partial class FusionProgressDialog : Form
{
#region Delegates
public delegate void WorkerDelegate();
#endregion
#region Fields
private WorkerDelegate Worker;
#endregion
#region .ctors
public FusionProgressDialog(WorkerDelegate del)
{
InitializeComponent();
Worker = del;
Shown += FusionProgressDialog_Shown;
}
public static void ShowDialog(WorkerDelegate del)
{
if (del == null)
throw new ArgumentNullException("del");
PluginDialog.ExecuteOnSTAThread(delegate(object delegateObj)
{
using (FusionProgressDialog dlg = new FusionProgressDialog((WorkerDelegate)delegateObj))
dlg.ShowDialog();
}, del);
}
#endregion
#region UI Handlers
private void FusionProgressDialog_Shown(object sender, EventArgs e)
{
FusionWorker.RunWorkerAsync();
}
private void FusionWorker_DoWork(object sender, DoWorkEventArgs e)
{
if (Worker != null)
Worker();
}
private void FusionWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Close();
}
#endregion
}
}

View File

@ -0,0 +1,611 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="FusionWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="BackgroundPBOX.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="BackgroundPBOX.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -0,0 +1,29 @@
/***********************************************************************\
* 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.Threading;
namespace Virtuoso.Miranda.Plugins.Forms
{
public interface ISynchronizedSubscriber
{
SynchronizationContext SyncContext { get; }
}
}

View File

@ -0,0 +1,136 @@
namespace Virtuoso.Miranda.Plugins.Forms
{
partial class InformationDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InformationDialog));
this.InformationLABEL = new System.Windows.Forms.Label();
this.OkBTN = new System.Windows.Forms.Button();
this.DialogHeader = new Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemHeader();
this.CaptionLABEL = new System.Windows.Forms.Label();
this.BackgroundPBOX = new System.Windows.Forms.PictureBox();
this.DialogHeader.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.BackgroundPBOX)).BeginInit();
this.SuspendLayout();
//
// InformationLABEL
//
this.InformationLABEL.BackColor = System.Drawing.Color.Transparent;
this.InformationLABEL.ForeColor = System.Drawing.SystemColors.WindowText;
this.InformationLABEL.Location = new System.Drawing.Point(9, 56);
this.InformationLABEL.Name = "InformationLABEL";
this.InformationLABEL.Size = new System.Drawing.Size(430, 155);
this.InformationLABEL.TabIndex = 2;
this.InformationLABEL.Text = "Information";
//
// OkBTN
//
this.OkBTN.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.OkBTN.Location = new System.Drawing.Point(12, 220);
this.OkBTN.Name = "OkBTN";
this.OkBTN.Size = new System.Drawing.Size(75, 23);
this.OkBTN.TabIndex = 0;
this.OkBTN.Text = "OK";
this.OkBTN.UseVisualStyleBackColor = true;
//
// DialogHeader
//
this.DialogHeader.BackColor = System.Drawing.Color.Transparent;
this.DialogHeader.Color = System.Drawing.SystemColors.ActiveCaption;
this.DialogHeader.Controls.Add(this.CaptionLABEL);
this.DialogHeader.Dock = System.Windows.Forms.DockStyle.Top;
this.DialogHeader.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.DialogHeader.HeaderFont = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.DialogHeader.HeaderText = "Caption";
this.DialogHeader.Image = global::Virtuoso.Miranda.Plugins.Properties.Resources.Icon_232_32x32;
this.DialogHeader.Location = new System.Drawing.Point(0, 0);
this.DialogHeader.MinimumSize = new System.Drawing.Size(300, 40);
this.DialogHeader.Name = "DialogHeader";
this.DialogHeader.Size = new System.Drawing.Size(451, 53);
this.DialogHeader.TabIndex = 1;
//
// CaptionLABEL
//
this.CaptionLABEL.AutoSize = true;
this.CaptionLABEL.BackColor = System.Drawing.Color.Transparent;
this.CaptionLABEL.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.CaptionLABEL.Location = new System.Drawing.Point(12, 23);
this.CaptionLABEL.Name = "CaptionLABEL";
this.CaptionLABEL.Size = new System.Drawing.Size(59, 13);
this.CaptionLABEL.TabIndex = 0;
this.CaptionLABEL.Text = "(caption)";
//
// BackgroundPBOX
//
this.BackgroundPBOX.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.BackgroundPBOX.Image = ((System.Drawing.Image)(resources.GetObject("BackgroundPBOX.Image")));
this.BackgroundPBOX.Location = new System.Drawing.Point(330, 127);
this.BackgroundPBOX.Name = "BackgroundPBOX";
this.BackgroundPBOX.Size = new System.Drawing.Size(120, 129);
this.BackgroundPBOX.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.BackgroundPBOX.TabIndex = 3;
this.BackgroundPBOX.TabStop = false;
this.BackgroundPBOX.Visible = false;
//
// InformationDialog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Window;
this.ClientSize = new System.Drawing.Size(451, 255);
this.Controls.Add(this.BackgroundPBOX);
this.Controls.Add(this.OkBTN);
this.Controls.Add(this.InformationLABEL);
this.Controls.Add(this.DialogHeader);
this.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "InformationDialog";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Information";
this.TopMost = true;
this.Shown += new System.EventHandler(this.InformationDialog_Shown);
this.DialogHeader.ResumeLayout(false);
this.DialogHeader.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.BackgroundPBOX)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemHeader DialogHeader;
private System.Windows.Forms.Label InformationLABEL;
private System.Windows.Forms.Label CaptionLABEL;
private System.Windows.Forms.Button OkBTN;
private System.Windows.Forms.PictureBox BackgroundPBOX;
}
}

View File

@ -0,0 +1,63 @@
/***********************************************************************\
* 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.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Media;
namespace Virtuoso.Miranda.Plugins.Forms
{
public partial class InformationDialog : Form
{
public const string NewLineToken = "[n]";
private InformationDialog()
{
InitializeComponent();
}
public static void PresentModal(string caption, string information, Image icon)
{
if (String.IsNullOrEmpty(caption))
throw new ArgumentNullException("caption");
if (String.IsNullOrEmpty(information))
throw new ArgumentNullException("information");
using (InformationDialog dlg = new InformationDialog())
{
dlg.DialogHeader.HeaderText = dlg.Text = caption;
dlg.InformationLABEL.Text = information.Replace(NewLineToken, Environment.NewLine);
if (icon != null)
dlg.DialogHeader.Image = icon;
dlg.ShowDialog();
}
}
private void InformationDialog_Shown(object sender, EventArgs e)
{
SystemSounds.Asterisk.Play();
}
}
}

View File

@ -0,0 +1,537 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="InformationLABEL.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="OkBTN.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="DialogHeader.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="CaptionLABEL.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BackgroundPBOX.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="BackgroundPBOX.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAB
AAAAAAAAenl6AJQxEgCUMRQAmTIUAKg/GgCsPxoAsz8cALo/HwCqQBsArkQeALBAGwC2QBwAsEQeALpA
HwCWRiwArkwqALBHIQC/QCAAskkhALBLKgC/WDEA3l0tAMJcNADGYDkAymI6AM9lOgDKYzwAzWU8ALxo
TgCkZlEAsGhUALptUQC9b1MAv29UALR1XwC4dmQAzmlBAMpsRwDVbUIA1G9HANRwRwDRcU0A3XVKANp2
TgDDaVAAx21XAMhtVwDKfV8A5XJHAO1zRQDhfFMA5X1RAOh/VwC6g3AAvYNyAO+DWQDNhmkA1ItuANeN
bwDBjn0AyYx4AOaKZADui2UA8JFrAPSTbQD0lG4A6pp2APeceACLiYkAkJCQAJuXlwCloaAApKSkALGw
sQC+ubcAzI+AAMmRgQDMmocAzJuJAN2cggDWppMA16qbANesmwDhoIcAzqyjAMuwpgDEsq4Az7SqANuw
oADFtrEAyLi0ANO5sADdu7EA3by0ANDJyADR0tQA19jaAPXk3QD/+fIA+vv7AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///8AAAAAAABKRgEBRkoAAAAAAAAAAEpFSEtfX0tIRUoAAAAAAEhHV00tDw8eTFdHSAAAAEpHViIM
PV1dHwQvVUdKAABFVyEMC1JkZCQEEi1XRQBKSE8TCwtSYGQkAxISTUhKRkswFRMLUmFkNwMMBx1LRgFf
JhsXC1JhZDwDDAkUXwEBXyomJRtSYWQ3AwsLFF8BRks7JSslU2JkIwULCh9LRkpIUysrLDUyMRYbGBdP
SEoARVtQNTVAYmM/GiY5WkUAAEpHXFQ1RGRkQiU7WEdKAAAASEdbWUNAQD9RW0dIAAAAAABKRUhLX19L
SEVKAAAAAAAAAABKRgEBRkoAAAAAAPgfAADgBwAAwAMAAIABAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAgAEAAIABAADAAwAA4AcAAPgfAAA=
</value>
</data>
</root>

View File

@ -0,0 +1,103 @@
/***********************************************************************\
* 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.Windows.Forms;
using Virtuoso.Miranda.Plugins.Infrastructure;
using Virtuoso.Miranda.Plugins.Native;
using System.Diagnostics;
using Virtuoso.Miranda.Plugins.Resources;
using System.ComponentModel;
namespace Virtuoso.Miranda.Plugins.Forms
{
[Flags]
public enum FormTranslationFlags : int
{
None = 0,
TranslateNonReadOnlyEditControls = 1, //translate all edit controls. By default non-read-only edit controls are not translated
NoTitleTranslation = 2 //do not translate the title of the dialog
}
public class LocalizableDialog : SingletonDialog
{
#region Fields
private const string MS_LANGPACK_TRANSLATEDIALOG = "LangPack/TranslateDialog";
private FormTranslationFlags translateFlags;
private readonly Collections.ControlCollection nonLocalizableControls;
[Browsable(false)]
public Collections.ControlCollection NonLocalizableControls
{
get { return nonLocalizableControls; }
}
public FormTranslationFlags TranslateFlags
{
get { return translateFlags; }
set { translateFlags = value; }
}
#endregion
#region .ctors
protected LocalizableDialog() : this(null, FormTranslationFlags.None) { }
protected LocalizableDialog(FormTranslationFlags flags) : this(null, flags) { }
protected LocalizableDialog(string dialogName, FormTranslationFlags flags) : base(dialogName)
{
translateFlags = flags;
nonLocalizableControls = new Collections.ControlCollection();
}
#endregion
#region UI handlers
protected override void OnLoad(EventArgs e)
{
if (!DesignMode)
{
if ((translateFlags & FormTranslationFlags.NoTitleTranslation) != FormTranslationFlags.NoTitleTranslation)
Text = LanguagePack.TranslateString(Text);
foreach (Control control in Controls)
{
TextBoxBase editCtrl = control as TextBoxBase;
if (!nonLocalizableControls.Contains(control))
{
if (editCtrl != null && !editCtrl.ReadOnly && (translateFlags & FormTranslationFlags.TranslateNonReadOnlyEditControls) != FormTranslationFlags.TranslateNonReadOnlyEditControls)
continue;
control.Text = LanguagePack.TranslateString(control.Text);
}
}
}
base.OnLoad(e);
}
#endregion
}
}

View File

@ -0,0 +1,171 @@
/***********************************************************************\
* 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.Windows.Forms;
using Virtuoso.Miranda.Plugins.Infrastructure;
using System.Threading;
using System.ComponentModel;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace Virtuoso.Miranda.Plugins.Forms
{
public class PluginDialog : RemotableForm
{
#region Fields
private static readonly List<PluginDialog> ActiveDialogs = new List<PluginDialog>();
#endregion
#region .ctors
protected PluginDialog() { }
#endregion
#region Overrides
protected override void OnShown(EventArgs e)
{
RegisterDialog();
base.OnShown(e);
}
protected override void OnClosed(EventArgs e)
{
UnregisterDialog();
base.OnClosed(e);
}
protected override void Dispose(bool disposing)
{
UnregisterDialog();
base.Dispose(disposing);
}
#endregion
#region Properties
protected MirandaContext Context
{
get { return MirandaContext.Current; }
}
#endregion
#region Methods
internal virtual void RegisterDialog()
{
lock (ActiveDialogs)
ActiveDialogs.Add(this);
}
/// <summary>
/// Remove the dialog from the active dialog tracking list.
/// </summary>
internal virtual void UnregisterDialog()
{
lock (ActiveDialogs)
ActiveDialogs.Remove(this);
}
public static void CloseDialogs(PluginDescriptor owner, bool force)
{
foreach (PluginDialog dialog in UnregisterAndGetActiveDialogs(owner))
{
try
{
if (dialog.InvokeRequired)
dialog.Invoke(new MethodInvoker(delegate { dialog.Dispose(); }));
else
dialog.Dispose();
}
catch { if (!force) throw; }
}
}
/// <summary>
/// Gathers active dialogs of the plugin and unregisters them.
/// </summary>
/// <param name="plugin">Plugin.</param>
/// <returns>Unregistered dialogs to dispose.</returns>
private static List<PluginDialog> UnregisterAndGetActiveDialogs(PluginDescriptor plugin)
{
Assembly pluginAssembly = plugin.Plugin.GetType().Assembly;
List<PluginDialog> dialogsToRemove = new List<PluginDialog>(2);
lock (ActiveDialogs)
{
foreach (PluginDialog dialog in ActiveDialogs)
{
// Account only undisposed dialogs from plugin's assembly
if (dialog.IsDisposed || dialog.GetType().Assembly != pluginAssembly)
continue;
dialogsToRemove.Add(dialog);
}
foreach (PluginDialog dialog in dialogsToRemove)
dialog.UnregisterDialog();
}
return dialogsToRemove;
}
public static void ExecuteOnSTAThread(ParameterizedThreadStart threadStart)
{
ExecuteOnSTAThread(threadStart, null);
}
public static void ExecuteOnSTAThread(ParameterizedThreadStart threadStart, object state)
{
if (threadStart == null)
throw new ArgumentNullException("threadStart");
Thread thread = new Thread(delegate(object _state)
{
try
{
Application.ThreadException += Application_ThreadException;
threadStart(_state);
}
finally
{
Application.ThreadException -= Application_ThreadException;
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start(state);
}
private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
DefaultExceptionHandler.Create().HandleException(e.Exception, null);
}
#endregion
}
}

View File

@ -0,0 +1,42 @@
/***********************************************************************\
* 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.Windows.Forms;
namespace Virtuoso.Miranda.Plugins.Forms
{
public class RemotableForm : Form
{
#region .ctors
internal RemotableForm() { }
#endregion
#region Overrides
public override object InitializeLifetimeService()
{
return null;
}
#endregion
}
}

View File

@ -0,0 +1,134 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
namespace Virtuoso.Miranda.Plugins.Forms
{
public class SingletonDialog : PluginDialog
{
#region Fields
private static readonly Dictionary<string, SingletonDialog> visibleDialogs = new Dictionary<string, SingletonDialog>(1);
protected static Dictionary<string, SingletonDialog> VisibleDialogs
{
get { return visibleDialogs; }
}
private string singletonName;
protected string SingletonName
{
get { return singletonName; }
private set { singletonName = value; }
}
#endregion
#region .ctors
protected SingletonDialog() : this(null) { }
protected SingletonDialog(string name)
{
this.singletonName = String.IsNullOrEmpty(name) ? GetDefaultName(GetType()) : name;
}
#endregion
#region Overrides
internal override void RegisterDialog()
{
lock (visibleDialogs)
{
if (!visibleDialogs.ContainsKey(SingletonName))
visibleDialogs[SingletonName] = this;
}
base.RegisterDialog();
}
internal override void UnregisterDialog()
{
lock (visibleDialogs)
visibleDialogs.Remove(SingletonName);
base.UnregisterDialog();
}
#endregion
#region Methods
public static TForm GetSingleton<TForm>(bool createIfNeeded) where TForm : PluginDialog
{
return GetSingleton<TForm>(createIfNeeded, typeof(TForm).FullName);
}
public static TForm GetSingleton<TForm>(bool createIfNeeded, string name) where TForm : PluginDialog
{
if (String.IsNullOrEmpty(name))
throw new ArgumentNullException("name");
lock (visibleDialogs)
{
if (!visibleDialogs.ContainsKey(name) || visibleDialogs[name].IsDisposed)
{
if (createIfNeeded)
return (TForm)Activator.CreateInstance(typeof(TForm), true);
else
return null;
}
else
return visibleDialogs[name] as TForm;
}
}
private delegate void ShowSingletonInvoker(bool modal);
public void ShowSingleton(bool modal)
{
if (InvokeRequired)
Invoke(new ShowSingletonInvoker(DoShowSingleton), modal);
else
DoShowSingleton(modal);
}
private void DoShowSingleton(bool modal)
{
if (Visible)
Activate();
else if (modal)
ShowDialog();
else
Show();
}
public static string GetDefaultName(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
return type.FullName;
}
#endregion
}
}

View File

@ -0,0 +1,3 @@
[.ShellClassInfo]
IconFile=%SystemRoot%\system32\SHELL32.dll
IconIndex=19

Binary file not shown.

View File

@ -0,0 +1,96 @@
/***********************************************************************\
* 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.Reflection;
using Virtuoso.Miranda.Plugins.Infrastructure;
using Virtuoso.Miranda.Plugins.Resources;
using System.Runtime.Serialization;
namespace Virtuoso.Miranda.Plugins
{
[Serializable]
public class FusionException : Exception, IExceptionDumpController
{
#region Fields
private readonly Assembly assembly;
private readonly Type pluginType;
private readonly MirandaPlugin instantiatedPlugin;
private readonly string fusionLog;
#endregion
#region .ctors
public FusionException(string message, Assembly assembly, Type type, MirandaPlugin plugin, Exception inner)
: this(message, TextResources.UI_Label_Empty, assembly, type, plugin, inner)
{ }
public FusionException(string message, string fusionLog, Assembly assembly, Type type, MirandaPlugin plugin, Exception inner) : base(message, inner)
{
this.assembly = assembly;
this.pluginType = type;
this.instantiatedPlugin = plugin;
this.fusionLog = fusionLog;
}
protected FusionException(SerializationInfo info, StreamingContext context) : base(info, context) {}
#endregion
#region Properties
public Assembly Assembly
{
get { return assembly; }
}
public Type PluginType
{
get { return pluginType; }
}
public MirandaPlugin InstantiatedPlugin
{
get { return instantiatedPlugin; }
}
public string FusionLog
{
get { return fusionLog; }
}
#endregion
#region IExceptionDumpController Members
void IExceptionDumpController.DumpException(Exception e, StringBuilder dump)
{
FusionException ex = (FusionException)e;
dump.AppendFormat("=== Description ==={0}{1}{0}{0}", Environment.NewLine, ex.Message);
dump.AppendFormat("=== Assembly ==={0}{1}{0}{0}", Environment.NewLine, ex.Assembly == null ? TextResources.UI_Label_Unknown : ex.Assembly.ToString());
dump.AppendFormat("=== Type ==={0}{1}{0}{0}", Environment.NewLine, ex.PluginType == null ? TextResources.UI_Label_Unknown : ex.PluginType.FullName);
dump.AppendFormat("=== Fusion log ==={0}{1}{0}{0}", Environment.NewLine, ex.FusionLog);
}
#endregion
}
}

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,84 @@
/***********************************************************************\
* 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.Reflection;
using System.Collections.Specialized;
namespace Virtuoso.Miranda.Plugins.Helpers
{
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
public sealed class EnumValueFriendlyNameAttribute : Attribute
{
#region Fields
private string friendlyName;
#endregion
#region .ctors
public EnumValueFriendlyNameAttribute(string name)
{
this.friendlyName = name;
}
#endregion
#region Properties
public string FriendlyName
{
get { return friendlyName; }
set { friendlyName = value; }
}
#endregion
#region Methods
public static Dictionary<TEnum, string> GetFriendlyNames<TEnum>() where TEnum : struct
{
Type enumType = typeof(TEnum);
if (!enumType.IsEnum)
throw new ArgumentException("TEnum is not an enumeration.", "TEnum");
Type thisType = typeof(EnumValueFriendlyNameAttribute);
Dictionary<TEnum, string> results = new Dictionary<TEnum, string>(1);
foreach (FieldInfo field in enumType.GetFields())
{
if ((field.Attributes & FieldAttributes.Literal) != FieldAttributes.Literal)
continue;
EnumValueFriendlyNameAttribute[] names = (EnumValueFriendlyNameAttribute[])field.GetCustomAttributes(thisType, false);
if (names != null && names.Length > 0)
results.Add((TEnum)field.GetRawConstantValue(), names[0].FriendlyName);
else
results.Add((TEnum)field.GetRawConstantValue(), field.Name);
}
return results;
}
#endregion
}
}

View File

@ -0,0 +1,652 @@
/* /--==###################==--\
* | Bram's Ini File Handler |
* \--==###################==--/
*
* This handles Ini files and all their content.
*
* Some explanation:
* Categories are in fact sections, but i didn't think
* "sections" so i wrote "categories". Sorry.
*
* comment lines in ini files begin with #, ; or //
* multi-line are not supported (Because I've never seen such)
*
* It ignores comments on reading but can write them
*
* How it works:
* All data is saved in one System.Collections.SortedList which
* contains the category names as keys, and all key-value pairs
* as values, saved as SortedList too:
*
* explanation sheet
*
* SortedList Categories
* {
* {"Category1", {Key1, value1}
* {Key2, value2}
* ...
* }
* {"Category2", {Key1, value1}
* {Key2, value2}
* ...
* }
* ...
* }
*
* that behaves like an array in an array (array[][]), but with dynamic bounds
* and strings as indexers.
*
* I hope you did understand this, it would have been easier to explain
* in French or German...
*
* You can make with it what you want, but I would be pleased to
* hear some feedback. (Ok, I admit: I would be pleased only if it's
* positive feedback...)
*
* Send me an email! kratchkov@inbox.lv
*
* Thanks
*
* DISCLAIMER:
* THIS CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
* KIND, EITHER EXPRESSED OR IMPLIED INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THIS
* CODE IS WITH YOU. SHOULD THIS CODE PROVE DEFECTIVE, YOU ASSUME
* THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION .
* You take full responsibility for the use of this code and any
* consequences thereof. I can not accept liability for damages
* or failures arising from the use of this code, or parts of this code.
*/
using System;
using System.IO;
using System.Text;
using System.Collections;
namespace Virtuoso.Miranda.Plugins.Helpers
{
/// <summary>
/// Handles Ini categories, keys and their associated values, static methods implemented for file
/// handling (saving and reading)
/// </summary>
public class IniStructure
{
#region Ini structure code
private SortedList Categories = new SortedList();
/// <summary>
/// Initialies a new IniStructure
/// </summary>
public IniStructure()
{
}
/// <summary>
/// Adds a category to the IniStructure
/// </summary>
/// <param name="Name">Name of the new category</param>
public bool AddCategory(string Name)
{
if (Name == "" | Categories.ContainsKey(Name))
return false;
if (Name.IndexOf('=') != -1
| Name.IndexOf('[') != -1
| Name.IndexOf(']') != -1) // these characters are not allowed in a category name
return false;
Categories.Add(Name, new SortedList());
return true;
}
/// <summary>
/// Deletes a category and its contents
/// </summary>
/// <param name="Name">category to delete</param>
public bool DeleteCategory(string Name)
{
if (Name == "" | !Categories.ContainsKey(Name))
return false;
Categories.Remove(Name);
return true;
}
/// <summary>
/// Renames a category
/// </summary>
/// <param name="Name">Category to rename</param>
/// <param name="NewName">New name</param>
public bool RenameCategory(string Name, string NewName)
{ // Or rather moves a category to a new name
if (Name == "" | !Categories.ContainsKey(Name) | NewName == "")
return false;
if (NewName.IndexOf('=') != -1
| NewName.IndexOf('[') != -1
| NewName.IndexOf(']') != -1) // these characters are not allowed in a category name
return false;
SortedList Category = (SortedList)(Categories[Name]);
Categories.Add(NewName, Category);
this.DeleteCategory(Name);
return true;
}
/// <summary>
/// Returns the names of all categories
/// </summary>
/// <returns></returns>
public string[] GetCategories()
{
string[] CatNames = new string[Categories.Count];
IList KeyList = Categories.GetKeyList();
int KeyCount = Categories.Count;
for (int i = 0; i < KeyCount; i++)
{
CatNames[i] = KeyList[i].ToString();
}
return CatNames;
}
/// <summary>
/// Returns the name of a category by specifying the index.
/// Useful to enumerate through all categories.
/// </summary>
/// <param name="Index">The category index</param>
/// <returns></returns>
public string GetCategoryName(int Index)
{
if (Index < 0 | Index >= Categories.Count)
return null;
return Categories.GetKey(Index).ToString();
}
/// <summary>
/// Adds a key-value pair to a specified category
/// </summary>
/// <param name="CategoryName">Name of the category</param>
/// <param name="Key">New name of the key</param>
/// <param name="Value">Associated value</param>
public bool AddValue(string CategoryName, string Key, string Value)
{
if (CategoryName == "" | Key == "")
return false;
if (Key.IndexOf('=') != -1
| Key.IndexOf('[') != -1
| Key.IndexOf(']') != -1 // these chars are not allowed for keynames
| Key.IndexOf(';') != -1
| Key.IndexOf('#') != -1
)
return false;
if (!Categories.ContainsKey(CategoryName))
return false;
SortedList Category = (SortedList)(Categories[CategoryName]);
if (Category.ContainsKey(Key))
return false;
Category.Add(Key, Value);
return true;
}
/// <summary>
/// Returns the value of a key-value pair in a specified category by specifying the key
/// </summary>
/// <param name="CategoryName">Name of the category</param>
/// <param name="Key">Name of the Key</param>
/// <returns></returns>
public string GetValue(string CategoryName, string Key)
{
if (CategoryName == "" | Key == "")
return null;
if (!Categories.ContainsKey(CategoryName))
return null;
SortedList Category = (SortedList)(Categories[CategoryName]);
if (!Category.ContainsKey(Key))
return null;
return Category[Key].ToString();
}
/// <summary>
/// Returns the key-value pair in a specified category by specifying the index
/// </summary>
/// <param name="CategoryName">Index of the category</param>
/// <param name="Key">Index of the Key</param>
/// <returns></returns>
public string GetValue(int CatIndex, int KeyIndex)
{
if (CatIndex < 0 | KeyIndex < 0
|CatIndex >= Categories.Count)
return null;
SortedList Category = (SortedList)(Categories.GetByIndex(CatIndex));
if (KeyIndex >= Category.Count)
return null;
return Category.GetByIndex(KeyIndex).ToString();
}
/// <summary>
/// Returns the name of the key in a key-value pair in a specified category by specifying the index
/// </summary>
/// <param name="CatIndex">Index of the category</param>
/// <param name="KeyIndex">Index of the key</param>
/// <returns></returns>
public string GetKeyName(int CatIndex, int KeyIndex)
{
if (CatIndex < 0 | KeyIndex < 0
|CatIndex >= Categories.Count)
return null;
SortedList Category = (SortedList)(Categories.GetByIndex(CatIndex));
if (KeyIndex >= Category.Count)
return null;
return Category.GetKey(KeyIndex).ToString();
}
/// <summary>
/// Deletes a key-value pair
/// </summary>
/// <param name="CategoryName">Name of the category</param>
/// <param name="Key">Name of the Key</param>
public bool DeleteValue(string CategoryName, string Key)
{
if (CategoryName == "" | Key == "")
return false;
if (!Categories.ContainsKey(CategoryName))
return false;
SortedList Category = (SortedList)(Categories[CategoryName]);
if (!Category.ContainsKey(Key))
return false;
Category.Remove(Key);
return true;
}
/// <summary>
/// Renames the keyname in a key-value pair
/// </summary>
/// <param name="CategoryName">Name of the category</param>
/// <param name="KeyName">Name of the Key</param>
/// <param name="NewKeyName">New name of the Key</param>
public bool RenameKey(string CategoryName, string KeyName, string NewKeyName)
{
if (CategoryName == "" | KeyName == "" | NewKeyName == "")
return false;
if (!Categories.ContainsKey(CategoryName))
return false;
if (NewKeyName.IndexOf('=') != -1
| NewKeyName.IndexOf('[') != -1
| NewKeyName.IndexOf(']') != -1 // these chars are not allowed for keynames
| NewKeyName.IndexOf(';') != -1
| NewKeyName.IndexOf('#') != -1
)
return false;
SortedList Category = (SortedList)(Categories[CategoryName]);
if ( !Category.ContainsKey(KeyName))
return false;
object value = Category[KeyName];
Category.Remove(KeyName);
Category.Add(NewKeyName, value);
return true;
}
/// <summary>
/// Modifies the value in a key-value pair
/// </summary>
/// <param name="CategoryName">Name of the category</param>
/// <param name="KeyName">Name of the Key</param>
/// <param name="NewValue">New name of the Key</param>
public bool ModifyValue(string CategoryName, string KeyName, string NewValue)
{
if (CategoryName == "" | KeyName == "")
return false;
if (!Categories.ContainsKey(CategoryName))
return false;
SortedList Category = (SortedList)(Categories[CategoryName]);
if ( !Category.ContainsKey(KeyName))
return false;
Category[KeyName] = NewValue;
return true;
}
/// <summary>
/// Returns all keys in a category
/// </summary>
/// <param name="CategoryName">Name of the category</param>
/// <returns></returns>
public string[] GetKeys(string CategoryName)
{
SortedList Category = (SortedList)(Categories[CategoryName]);
if (Category == null)
return new string[0];
int KeyCount = Category.Count;
string[] KeyNames = new string[KeyCount];
IList KeyList = Category.GetKeyList();
for (int i = 0; i < KeyCount; i++)
{
KeyNames[i] = KeyList[i].ToString();
}
return KeyNames;
}
#endregion
#region Ini writing code
/// <summary>
/// Writes an IniStructure to a file with a comment.
/// </summary>
/// <param name="IniData">The contents to write</param>
/// <param name="Filename">The complete path and name of the file</param>
/// <param name="comment">Comment to add</param>
/// <returns></returns>
public static bool WriteIni(IniStructure IniData, string Filename, string comment)
{
string DataToWrite = CreateData(IniData, BuildComment(comment));
return WriteFile(Filename, DataToWrite);
}
/// <summary>
/// Writes an IniStructure to a file without a comment.
/// </summary>
/// <param name="IniData">The contents to write</param>
/// <param name="Filename">The complete path and name of the file</param>
/// <returns></returns>
public static bool WriteIni(IniStructure IniData, string Filename)
{
string DataToWrite = CreateData(IniData);
return WriteFile(Filename, DataToWrite);
}
private static bool WriteFile(string Filename, string Data)
{ // Writes a string to a file
try
{
FileStream IniStream = new FileStream(Filename,FileMode.Create);
if (!IniStream.CanWrite)
{
IniStream.Close();
return false;
}
StreamWriter writer = new StreamWriter(IniStream);
writer.Write(Data);
writer.Flush();
writer.Close();
IniStream.Close();
return true;
}
catch
{
return false;
}
}
private static string BuildComment(string comment)
{ // Adds a # at the beginning of each line
if (comment == "")
return "";
string[] Lines = DivideToLines(comment);
string temp = "";
foreach (string line in Lines)
{
temp += "# " + line + "\r\n";
}
return temp;
}
private static string CreateData(IniStructure IniData)
{
return CreateData(IniData,"");
}
private static string CreateData(IniStructure IniData, string comment)
{ //Iterates through all categories and keys and appends all data to Data
int CategoryCount = IniData.GetCategories().Length;
int[] KeyCountPerCategory = new int[CategoryCount];
string Data = comment;
string[] temp = new string[2]; // will contain key-value pair
for (int i = 0; i < CategoryCount; i++) // Gets keycount per category
{
string CategoryName = IniData.GetCategories()[i];
KeyCountPerCategory[i] = IniData.GetKeys(CategoryName).Length;
}
for (int catcounter = 0; catcounter < CategoryCount; catcounter++)
{
Data += "\r\n[" + IniData.GetCategoryName(catcounter) + "]\r\n";
// writes [Category] to Data
for (int keycounter = 0; keycounter < KeyCountPerCategory[catcounter]; keycounter++)
{
temp[0] = IniData.GetKeyName(catcounter, keycounter);
temp[1] = IniData.GetValue(catcounter, keycounter);
Data += temp[0] + "=" + temp[1] + "\r\n";
// writes the key-value pair to Data
}
}
return Data;
}
#endregion
#region Ini reading code
/// <summary>
/// Reads an ini file and returns the content as an IniStructure. Returns null if an error occurred.
/// </summary>
/// <param name="Filename">The filename to read</param>
/// <returns></returns>
public static IniStructure ReadIni(string Filename)
{
string Data = ReadFile(Filename);
if (Data == null)
return null;
IniStructure data = InterpretIni(Data);
return data;
}
public static IniStructure InterpretIni(string Data)
{
IniStructure IniData = new IniStructure();
string[] Lines = RemoveAndVerifyIni(DivideToLines(Data));
// Divides the Data in lines, removes comments and empty lines
// and verifies if the ini is not corrupted
// Returns null if it is.
if (Lines == null)
return null;
if (IsLineACategoryDef(Lines[0]) != LineType.Category)
{
return null;
// Ini is faulty - does not begin with a categorydef
}
string CurrentCategory = "";
foreach (string line in Lines)
{
switch (IsLineACategoryDef(line))
{
case LineType.Category: // the line is a correct category definition
string NewCat = line.Substring(1,line.Length - 2);
IniData.AddCategory(NewCat); // adds the category to the IniData
CurrentCategory = NewCat;
break;
case LineType.NotACategory: // the line is not a category definition
string[] keyvalue = GetDataFromLine(line);
IniData.AddValue(CurrentCategory, keyvalue[0], keyvalue[1]);
// Adds the key-value to the current category
break;
case LineType.Faulty: // the line is faulty
return null;
}
}
return IniData;
}
private static string ReadFile(string filename)
{ // Reads a file to a string.
if (!File.Exists(filename))
return null;
StringBuilder IniData;
try
{
using (FileStream IniStream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
if (!IniStream.CanRead)
return null;
using (StreamReader reader = new StreamReader(IniStream))
{
IniData = new StringBuilder();
IniData.Append(reader.ReadToEnd());
return IniData.ToString();
}
}
}
catch
{
return null;
}
}
private static string[] GetDataFromLine(string Line)
{
// returns the key and the value of a key-value pair in "key=value" format.
int EqualPos = 0;
EqualPos = Line.IndexOf("=", 0);
if (EqualPos < 1)
{
return null;
}
string LeftKey = Line.Substring(0, EqualPos);
string RightValue = Line.Substring(EqualPos + 1);
string[] ToReturn = {LeftKey, RightValue};
return ToReturn;
}
private enum LineType // return type for IsLineACategoryDef and LineVerify
{
NotACategory,
Category,
Faulty,
Comment,
Empty,
Ok
}
private static LineType IsLineACategoryDef(string Line)
{
if (Line.Length < 3)
return LineType.NotACategory; // must be a short keyname like "k="
if (Line.Substring(0,1) == "[" & Line.Substring(Line.Length - 1, 1) == "]")
// seems to be a categorydef
{
if (Line.IndexOf("=") != -1)
// '=' found -> is incorrect for category def
return LineType.Faulty;
if (ContainsMoreThanOne(Line,'[') | ContainsMoreThanOne(Line, ']'))
// two or more '[' or ']' found -> incorrect
return LineType.Faulty;
return LineType.Category;
}
return LineType.NotACategory;
}
private static string[] DivideToLines(string Data)
{ // Divides a string into lines
string[] Lines = new string[Data.Length];
int oldnewlinepos = 0;
int LineCounter = 0;
for (int i = 0; i < Data.Length; i++)
{
if (Data.ToCharArray(i,1)[0] == '\n')
{
Lines[LineCounter] = Data.Substring(oldnewlinepos, i - oldnewlinepos - 1);
oldnewlinepos = i + 1;
LineCounter++;
}
}
// Lines[] array is too big: needs to be trimmed
Lines[LineCounter] = Data.Substring(oldnewlinepos, Data.Length - oldnewlinepos);
string[] LinesTrimmed = new string[LineCounter + 1];
for (int i = 0; i < LineCounter + 1; i++)
{
LinesTrimmed[i] = Lines[i];
}
return LinesTrimmed;
}
private static bool ContainsMoreThanOne(string Data, char verify)
{ // returns true if Data contains verify more than once
char[] data = Data.ToCharArray();
int count = 0;
foreach (char c in data)
{
if (c == verify)
count++;
}
if (count > 1)
return true;
return false;
}
private static LineType LineVerify(string line)
{ // Verifies a line of an ini
if (line == "")
return LineType.Empty;
if (line.IndexOf(";") == 0 | line.IndexOf("#") == 0 | line.IndexOf("//") == 0)
{
return LineType.Comment; // line is a comment: ignore
}
int equalindex = line.IndexOf('=');
if (equalindex == 0)
return LineType.Faulty; // an '=' cannot be on first place
if (equalindex != -1) // if = is found in line
{
// Verify: no '[' , ']' ,';' or '#' before the '='
if (line.IndexOf('[', 0, equalindex) != -1
| line.IndexOf(']', 0, equalindex) != -1
| line.IndexOf(';', 0, equalindex) != -1
| line.IndexOf('#', 0, equalindex) != -1)
return LineType.Faulty;
}
return LineType.Ok;
}
private static string[] RemoveAndVerifyIni(string[] Lines)
{
// removes empty lines and comments, and verifies every line
string[] temp = new string[Lines.Length];
int TempCounter = 0; // number of lines to return
foreach (string line in Lines)
{
switch (LineVerify(line))
{
case LineType.Faulty: // line is faulty
return null;
case LineType.Comment: // line is a comment
continue;
case LineType.Ok: // line is ok
temp[TempCounter] = line;
TempCounter++;
break;
case LineType.Empty: // line is empty
continue;
}
}
// the temp[] array is too big: needs to be trimmed.
string[] OKLines = new string[TempCounter];
for (int i = 0; i < TempCounter; i++)
{
OKLines[i] = temp[i];
}
return OKLines;
}
#endregion
}
}

View File

@ -0,0 +1,261 @@
/***********************************************************************\
* 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 Virtuoso.Miranda.Plugins.Infrastructure;
using System.Threading;
using System.Runtime.CompilerServices;
namespace Virtuoso.Miranda.Plugins.Helpers
{
/* CLASS ORIGIN: Spearhead project */
public class MessageQueue
{
#region Fields
private volatile bool enabled, suspended;
private readonly Queue<KeyValuePair<ContactInfo, string>> queue = new Queue<KeyValuePair<ContactInfo, string>>(5);
private Thread QueueThread;
private readonly ManualResetEvent waitHandle = new ManualResetEvent(true);
#endregion
#region Enums
protected enum CommonWaitTime : int
{
QueueSuspension = 50,
QueueItemProcessed = 1000,
QueueProcessed = 1000,
}
#endregion
#region Events
public event EventHandler MessageSending;
public event EventHandler MessageSent;
#endregion
#region .ctors & .dctors
public MessageQueue()
{
QueueThread = InitializeQueueThread();
}
protected virtual Thread InitializeQueueThread()
{
Thread thread = new Thread(ProcessQueue);
thread.IsBackground = true;
return thread;
}
~MessageQueue()
{
SetState(false);
waitHandle.Close();
}
#endregion
#region Properties
public bool Suspended
{
get
{
return suspended;
}
}
public ManualResetEvent WaitHandle
{
get
{
return waitHandle;
}
}
protected Queue<KeyValuePair<ContactInfo, string>> Queue
{
get { return queue; }
}
public bool Enabled
{
get
{
return enabled;
}
}
public bool QueueHasItems
{
get
{
lock (Queue)
return Queue.Count > 0;
}
}
protected virtual bool ClearQueueWhenDisabled
{
get
{
return true;
}
}
#endregion
#region Virtuals
protected virtual void ProcessQueue()
{
while (Enabled)
{
while (suspended)
Wait(CommonWaitTime.QueueSuspension);
lock (Queue)
{
while (QueueHasItems)
{
waitHandle.Reset();
RaiseMessageForwardingEvent();
DequeueAndSendMessage();
Wait(QueueItemProcessedWaitTime);
RaiseMessageForwardedEvent();
}
waitHandle.Set();
}
Wait(QueueProcessedWaitTime);
}
waitHandle.Set();
}
protected void DequeueAndSendMessage()
{
lock (Queue)
{
KeyValuePair<ContactInfo, string> data = Queue.Dequeue();
SendMessage(data.Key, data.Value);
}
}
protected virtual void SendMessage(ContactInfo recipient, string message)
{
recipient.SendMessage(message);
}
protected virtual int QueueItemProcessedWaitTime
{
get
{
return (int)CommonWaitTime.QueueItemProcessed;
}
}
protected virtual int QueueProcessedWaitTime
{
get
{
return (int)CommonWaitTime.QueueProcessed;
}
}
#endregion
#region Methods
public void SuspendQueue()
{
suspended = true;
}
public void ResumeQueue()
{
suspended = false;
}
public void EnqueueMessage(ContactInfo to, string message)
{
lock (queue)
queue.Enqueue(new KeyValuePair<ContactInfo, string>(to, message));
SetState(true);
}
public void SetState(bool enabled)
{
// Queue is used as a sync object here...
lock (Queue)
{
if (enabled)
{
if ((QueueThread.ThreadState & ThreadState.Stopped) == ThreadState.Stopped)
QueueThread = InitializeQueueThread();
if ((QueueThread.ThreadState & ThreadState.Unstarted) == ThreadState.Unstarted)
QueueThread.Start();
}
else
{
Queue.Clear();
}
this.enabled = enabled;
}
}
protected void RaiseMessageForwardingEvent()
{
if (MessageSending != null)
MessageSending(this, EventArgs.Empty);
}
protected void RaiseMessageForwardedEvent()
{
if (MessageSent != null)
MessageSent(this, EventArgs.Empty);
}
protected void Wait(CommonWaitTime miliseconds)
{
Wait((int)miliseconds);
}
protected void Wait(int miliseconds)
{
Thread.Sleep(miliseconds);
}
#endregion
}
}

View File

@ -0,0 +1,185 @@
/***********************************************************************\
* 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.Reflection;
using Virtuoso.Miranda.Plugins.Resources;
using System.Security;
using System.Security.Policy;
using System.IO;
using Virtuoso.Miranda.Plugins.Infrastructure;
using System.Diagnostics;
using System.Security.Permissions;
namespace Virtuoso.Miranda.Plugins.Helpers
{
/* CLASS ORIGIN: Loki project */
public abstract class Sandbox : RemoteObject
{
#region Fields
private AppDomain hostingAppDomain;
protected AppDomain HostingAppDomain
{
get { return hostingAppDomain; }
}
#endregion
#region Nested classes
private sealed class MirandaContextInitHelper : RemoteObject
{
public MirandaContextInitHelper(MirandaContext context)
{
if (context == null)
throw new ArgumentNullException("context");
MirandaContext.InvalidateCurrent();
MirandaContext.InitializeCurrent(context);
}
}
#endregion
#region .ctors
protected Sandbox() { }
public static void Unload(Sandbox sandbox)
{
if (sandbox == null)
throw new ArgumentNullException("sandbox");
if (sandbox.hostingAppDomain == null)
throw new ArgumentException();
if (sandbox.hostingAppDomain == AppDomain.CurrentDomain)
throw new InvalidOperationException(TextResources.ExceptionMsg_UnableToUnloadPluginMangerFromCurrentAppDomain);
sandbox.OnSandboxUnload();
sandbox.UnloadHostingAppDomain();
}
#endregion
#region Virtuals
protected virtual void InitializeAppDomainSetup(AppDomainSetup domainSetup) { }
protected virtual void OnSandboxUnload() { }
#endregion
#region Helpers
protected static StrongName GetStrongName(Assembly assembly)
{
if (assembly == null)
throw new ArgumentNullException("assembly");
AssemblyName assemblyName = assembly.GetName();
Debug.Assert(assemblyName != null, "Could not get assembly name");
byte[] publicKey = assemblyName.GetPublicKey();
if (publicKey == null || publicKey.Length == 0)
throw new InvalidOperationException(String.Format("{0} is not strongly named", assembly));
StrongNamePublicKeyBlob keyBlob = new StrongNamePublicKeyBlob(publicKey);
return new StrongName(keyBlob, assemblyName.Name, assemblyName.Version);
}
#endregion
#region Methods
protected void SetUpHostingAppDomain(string name)
{
SetUpHostingAppDomain(name, null, null);
}
protected void SetUpHostingAppDomain(string name, Evidence evidence, PermissionSet permissions, params StrongName[] fullTrust)
{
if (String.IsNullOrEmpty(name))
throw new ArgumentNullException("name");
if (hostingAppDomain != null)
throw new InvalidOperationException();
AppDomainSetup currentSetup = AppDomain.CurrentDomain.SetupInformation;
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationName = name;
domainSetup.ApplicationBase = currentSetup.ApplicationBase;
domainSetup.PrivateBinPath = String.Format("{0};{1};", MirandaEnvironment.MirandaPluginsFolderRelativePath, MirandaEnvironment.ManagedPluginsFolderRelativePath);
domainSetup.ConfigurationFile = currentSetup.ConfigurationFile;
InitializeAppDomainSetup(domainSetup);
if (permissions == null)
hostingAppDomain = AppDomain.CreateDomain(name, null, domainSetup);
else
hostingAppDomain = AppDomain.CreateDomain(name, evidence, domainSetup, permissions, fullTrust);
}
protected void UnloadHostingAppDomain()
{
if (hostingAppDomain == null)
throw new InvalidOperationException();
else
{
AppDomain.Unload(hostingAppDomain);
hostingAppDomain = null;
}
}
protected T InstantiateRemoteObject<T>(string assemblyName, string typeName, params object[] args) where T : class
{
return Activator.CreateInstance(hostingAppDomain, assemblyName, typeName, true, BindingFlags.Instance | BindingFlags.CreateInstance | BindingFlags.NonPublic | BindingFlags.Public, null, args, null, null, null).Unwrap() as T;
}
protected T InstantiateRemoteObjectFrom<T>(string assemblyFile, string typeName, params object[] args) where T : class
{
return Activator.CreateInstanceFrom(hostingAppDomain, assemblyFile, typeName, true, BindingFlags.Instance | BindingFlags.CreateInstance | BindingFlags.NonPublic | BindingFlags.Public, null, args, null, null, null).Unwrap() as T;
}
protected void InitializeRemoteContext(MirandaContext context)
{
if (context == null)
throw new ArgumentNullException("context");
if (hostingAppDomain == null)
throw new InvalidOperationException();
InstantiateRemoteObject<MirandaContextInitHelper>(Assembly.GetExecutingAssembly().FullName, typeof(MirandaContextInitHelper).FullName, context);
}
public void SetUnhandledExceptionHandler(UnhandledExceptionEventHandler handler)
{
hostingAppDomain.UnhandledException += handler;
}
public void RemoveUnhandledExceptionHandler(UnhandledExceptionEventHandler handler)
{
hostingAppDomain.UnhandledException -= handler;
}
#endregion
}
}

View File

@ -0,0 +1,52 @@
/***********************************************************************\
* 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;
namespace Virtuoso.Miranda.Plugins.Helpers
{
internal class TypeInstanceCache<T> : Dictionary<Type, T>
{
#region .ctors
public TypeInstanceCache() { }
#endregion
#region Methods
public T Instantiate(Type type)
{
lock (this)
{
if (ContainsKey(type))
return this[type];
else
{
T instance = (T)Activator.CreateInstance(type);
this[type] = instance;
return instance;
}
}
}
#endregion
}
}

View File

@ -0,0 +1,38 @@
/***********************************************************************\
* 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;
namespace Virtuoso.Miranda.Plugins.Helpers
{
public static class Utilities
{
[CLSCompliant(false)]
public static uint GetTimestamp()
{
return GetTimestamp(DateTime.Now);
}
[CLSCompliant(false)]
public static uint GetTimestamp(DateTime dateTime)
{
return (uint)(dateTime.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;
}
}
}

View File

@ -0,0 +1,169 @@
using Virtuoso.Miranda.Plugins.Configuration.Forms.Controls;
namespace Virtuoso.Hyphen.Configuration.Controls
{
partial class AboutContent
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutContent));
this.panel1 = new Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemHeader();
this.panel2 = new Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemSection();
this.VersionLABEL = new System.Windows.Forms.Label();
this.HomepageLINK = new System.Windows.Forms.LinkLabel();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.categoryItemSection1 = new Virtuoso.Miranda.Plugins.Configuration.Forms.Controls.CategoryItemSection();
this.label1 = new System.Windows.Forms.Label();
this.listBox1 = new System.Windows.Forms.ListBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.Transparent;
this.panel1.Color = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
this.panel1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.panel1.HeaderFont = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.panel1.HeaderText = "About Hyphen";
this.panel1.Image = global::Virtuoso.Miranda.Plugins.Properties.Resources.Icon_232_32x32;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.MinimumSize = new System.Drawing.Size(300, 40);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(792, 40);
this.panel1.TabIndex = 0;
//
// panel2
//
this.panel2.BackColor = System.Drawing.Color.Transparent;
this.panel2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(224)))), ((int)(((byte)(192)))));
this.panel2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.panel2.ForeColor = System.Drawing.Color.Black;
this.panel2.Location = new System.Drawing.Point(10, 46);
this.panel2.MinimumSize = new System.Drawing.Size(300, 20);
this.panel2.Name = "panel2";
this.panel2.SectionName = "Hyphen";
this.panel2.Size = new System.Drawing.Size(765, 20);
this.panel2.TabIndex = 1;
//
// VersionLABEL
//
this.VersionLABEL.AutoSize = true;
this.VersionLABEL.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.VersionLABEL.Location = new System.Drawing.Point(127, 72);
this.VersionLABEL.Name = "VersionLABEL";
this.VersionLABEL.Size = new System.Drawing.Size(51, 13);
this.VersionLABEL.TabIndex = 2;
this.VersionLABEL.Text = "v0.0.0.0";
//
// HomepageLINK
//
this.HomepageLINK.AutoSize = true;
this.HomepageLINK.Location = new System.Drawing.Point(130, 85);
this.HomepageLINK.Name = "HomepageLINK";
this.HomepageLINK.Size = new System.Drawing.Size(121, 13);
this.HomepageLINK.TabIndex = 3;
this.HomepageLINK.TabStop = true;
this.HomepageLINK.Text = "© (Assembly copyright)";
this.HomepageLINK.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.HomepageLINK_LinkClicked);
//
// pictureBox1
//
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(21, 72);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(100, 50);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.pictureBox1.TabIndex = 5;
this.pictureBox1.TabStop = false;
//
// categoryItemSection1
//
this.categoryItemSection1.BackColor = System.Drawing.Color.Transparent;
this.categoryItemSection1.Color = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(224)))), ((int)(((byte)(192)))));
this.categoryItemSection1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.categoryItemSection1.ForeColor = System.Drawing.Color.Black;
this.categoryItemSection1.Location = new System.Drawing.Point(10, 149);
this.categoryItemSection1.MinimumSize = new System.Drawing.Size(300, 20);
this.categoryItemSection1.Name = "categoryItemSection1";
this.categoryItemSection1.SectionName = "Components";
this.categoryItemSection1.Size = new System.Drawing.Size(765, 20);
this.categoryItemSection1.TabIndex = 4;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.label1.Location = new System.Drawing.Point(18, 172);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(239, 13);
this.label1.TabIndex = 5;
this.label1.Text = "Hyphen uses these 3rd party assemblies:";
//
// listBox1
//
this.listBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.listBox1.FormattingEnabled = true;
this.listBox1.Items.AddRange(new object[] {
"RibbonPanel, © Juan Pablo G.C."});
this.listBox1.Location = new System.Drawing.Point(33, 188);
this.listBox1.Name = "listBox1";
this.listBox1.SelectionMode = System.Windows.Forms.SelectionMode.None;
this.listBox1.Size = new System.Drawing.Size(224, 104);
this.listBox1.Sorted = true;
this.listBox1.TabIndex = 6;
//
// AboutContent
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.listBox1);
this.Controls.Add(this.label1);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.HomepageLINK);
this.Controls.Add(this.VersionLABEL);
this.Controls.Add(this.categoryItemSection1);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panel1);
this.Name = "AboutContent";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private CategoryItemHeader panel1;
private CategoryItemSection panel2;
private System.Windows.Forms.Label VersionLABEL;
private System.Windows.Forms.LinkLabel HomepageLINK;
private System.Windows.Forms.PictureBox pictureBox1;
private CategoryItemSection categoryItemSection1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ListBox listBox1;
}
}

Some files were not shown because too many files have changed in this diff Show More