mit hyphen

This commit is contained in:
2013-06-25 22:53:41 +00:00
parent 8896edc368
commit 318d93e6c1
424 changed files with 161843 additions and 2 deletions
+120
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;
}
}
+110
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
}
}
@@ -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>
@@ -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);
}
}
}
@@ -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>
@@ -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; }
}
}
}
@@ -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>
@@ -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);
}
}
}
@@ -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);
}
}
}
}
@@ -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);
}
}
}
@@ -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
}
}
@@ -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
}
}
@@ -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
}
}
@@ -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>
@@ -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
}
}
+152
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;
}
}
+133
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
}
}
+538
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>
+82
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;
}
}
@@ -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
}
}
@@ -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>
@@ -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; }
}
}
+136
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;
}
}
+63
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();
}
}
}
+537
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>
+103
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
}
}
+171
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
}
}
+42
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
}
}
+134
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
}
}