From 8896edc3687bb93eeba4cbcd9a01caf534c612e4 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Wed, 8 May 2013 21:39:27 +0000 Subject: [PATCH] speak --- Speak/Speak/Core/ActionClickEvent.cs | 30 + Speak/Speak/Core/ActionProcessor.cs | 86 + Speak/Speak/Core/AvatarProcessor.cs | 172 ++ Speak/Speak/Core/Buttons.cs | 359 +++ Speak/Speak/Core/HTTP.cs | 206 ++ Speak/Speak/Core/IMessageProcessor.cs | 15 + Speak/Speak/Core/ImagePreview.cs | 96 + Speak/Speak/Core/LinkButton.cs | 134 ++ Speak/Speak/Core/LogWindow.cs | 164 ++ Speak/Speak/Core/MirandaDB.cs | 194 ++ Speak/Speak/Core/Regexps.cs | 107 + Speak/Speak/Core/Settings.cs | 351 +++ Speak/Speak/Fork/ContactContainer.cs | 101 + Speak/Speak/Fork/ContactManager.cs | 636 +++++ Speak/Speak/HPP/HistoryppHandler.cs | 708 ++++++ Speak/Speak/HPP/HppActionOleObject.cs | 157 ++ Speak/Speak/HPP/HppAvatarObject.cs | 181 ++ Speak/Speak/Interfaces/HTMLDispIDs.cs | 1927 ++++++++++++++++ Speak/Speak/Interfaces/HTMLDocumentEvents2.cs | 110 + Speak/Speak/Interfaces/IHTMLDocument2.cs | 1025 +++++++++ Speak/Speak/Interfaces/IHTMLElement.cs | 784 +++++++ Speak/Speak/Interfaces/IHTMLEventObj.cs | 65 + Speak/Speak/Interfaces/IHTMLStyle.cs | 1497 ++++++++++++ Speak/Speak/Interop/IEHandler.cs | 310 +++ Speak/Speak/Interop/Structs.cs | 84 + Speak/Speak/Interop/Subclassing.cs | 71 + Speak/Speak/Interop/WinApi.cs | 356 +++ Speak/Speak/MainClass.cs | 230 ++ Speak/Speak/Opt/Options.cs | 967 ++++++++ Speak/Speak/Opt/Win32ImageList.cs | 64 + Speak/Speak/Opt/dialog.res | Bin 0 -> 59368 bytes Speak/Speak/Properties/AssemblyInfo.cs | 36 + Speak/Speak/Properties/Resources.Designer.cs | 93 + Speak/Speak/Properties/Resources.resx | 130 ++ Speak/Speak/Resources/icon_message.ico | Bin 0 -> 6830 bytes Speak/Speak/Resources/icon_small_dot.ico | Bin 0 -> 2550 bytes Speak/Speak/Resources/status_online.ico | Bin 0 -> 6830 bytes Speak/Speak/RichEdit/ActionOleObject.cs | 349 +++ Speak/Speak/RichEdit/AvatarObject.cs | 75 + Speak/Speak/RichEdit/IRichEditOle.cs | 927 ++++++++ Speak/Speak/RichEdit/ITextDocument.cs | 52 + Speak/Speak/RichEdit/ITextFont.cs | 76 + Speak/Speak/RichEdit/ITextPara.cs | 80 + Speak/Speak/RichEdit/ITextRange.cs | 108 + Speak/Speak/RichEdit/ITextSelection.cs | 35 + Speak/Speak/RichEdit/ITextStoryRanges.cs | 22 + Speak/Speak/RichEdit/REConstants.cs | 100 + Speak/Speak/RichEdit/RichEditHandler.cs | 656 ++++++ Speak/Speak/RichEdit/RichEditHelpers.cs | 138 ++ Speak/Speak/Sites/BNWSite.cs | 83 + Speak/Speak/Sites/ISite.cs | 43 + Speak/Speak/Sites/JuickSite.cs | 116 + Speak/Speak/Sites/PstoSite.cs | 102 + Speak/Speak/Sites/SitesManager.cs | 66 + Speak/Speak/Speak.csproj | 169 ++ Speak/Speak/Speak.dll | Bin 0 -> 3584 bytes Speak/Speak/Storage/Settings.cs | 157 ++ Speak/Speak/Structs/API.cs | 98 + Speak/Speak/Structs/IconLib.cs | 34 + Speak/Speak/Structs/Miranda.cs | 462 ++++ Speak/Speak/Structs/TabSRMM.cs | 63 + Speak/Speak/TTS/TextToSpeak.cs | 157 ++ Speak/Speak/UI/ActionMenuItem.cs | 132 ++ Speak/Speak/UI/PreviewForm.cs | 205 ++ Speak/Speak/UI/PreviewForm.designer.cs | 66 + Speak/Speak/UI/PreviewForm.resx | 120 + Speak/Speak/Utils/IconTable.cs | 30 + Speak/Speak/Utils/Invokable.cs | 134 ++ Speak/Speak/Utils/Util.cs | 188 ++ Speak/Speak/contributors.txt | 53 + Speak/Speak/res/Icon_exit.ico | Bin 0 -> 2550 bytes Speak/Speak/res/Icon_show_hide.ico | Bin 0 -> 2550 bytes Speak/Speak/res/Off.ico | Bin 0 -> 2550 bytes Speak/Speak/res/On.ico | Bin 0 -> 2550 bytes Speak/Speak/res/_blank.ico | Bin 0 -> 318 bytes Speak/Speak/res/arrow_sort_column_down.bmp | Bin 0 -> 150 bytes Speak/Speak/res/arrow_sort_column_up.bmp | Bin 0 -> 150 bytes Speak/Speak/res/chat_join.ico | Bin 0 -> 2550 bytes Speak/Speak/res/chat_leave.ico | Bin 0 -> 2550 bytes Speak/Speak/res/check_off.ico | Bin 0 -> 2550 bytes Speak/Speak/res/check_on.ico | Bin 0 -> 2550 bytes Speak/Speak/res/contact_add.ico | Bin 0 -> 2550 bytes Speak/Speak/res/contact_delete.ico | Bin 0 -> 2550 bytes Speak/Speak/res/contact_groups.ico | Bin 0 -> 2550 bytes Speak/Speak/res/contact_rename.ico | Bin 0 -> 2550 bytes Speak/Speak/res/contact_view_details.ico | Bin 0 -> 6830 bytes Speak/Speak/res/cursor_drag_copy.cur | Bin 0 -> 326 bytes Speak/Speak/res/cursor_drop_user.cur | Bin 0 -> 1086 bytes Speak/Speak/res/cursor_hyperlink.cur | Bin 0 -> 326 bytes Speak/Speak/res/group_closed.ico | Bin 0 -> 2550 bytes Speak/Speak/res/group_opened.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_accmgr.ico | Bin 0 -> 6830 bytes Speak/Speak/res/icon_all.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_ansi.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_auth_request.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_changefont.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_connecting.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_down_arrow.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_file.ico | Bin 0 -> 6830 bytes Speak/Speak/res/icon_find_user.ico | Bin 0 -> 6830 bytes Speak/Speak/res/icon_help.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_history.ico | Bin 0 -> 6830 bytes Speak/Speak/res/icon_loaded.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_mail.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_message.ico | Bin 0 -> 6830 bytes Speak/Speak/res/icon_notloaded.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_options.ico | Bin 0 -> 6830 bytes Speak/Speak/res/icon_search_all.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_small_dot.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_sms.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_typing.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_undo.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_unicode.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_url.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_window.ico | Bin 0 -> 2550 bytes Speak/Speak/res/icon_windows.ico | Bin 0 -> 2550 bytes Speak/Speak/res/miranda_home.ico | Bin 0 -> 2550 bytes Speak/Speak/res/miranda_logo.ico | Bin 0 -> 22486 bytes Speak/Speak/res/miranda_manager.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_DND.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_NA.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_away.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_free4chat.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_invisible.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_locked.ico | Bin 0 -> 2550 bytes Speak/Speak/res/status_occupied.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_offline.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_on_the_phone.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_online.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_out2lunch.ico | Bin 0 -> 6830 bytes Speak/Speak/res/status_user_online.ico | Bin 0 -> 6830 bytes Speak/Speak/resource.aps | Bin 0 -> 484740 bytes Speak/Speak/resource.h | 528 +++++ Speak/Speak/resource.rc | 2042 +++++++++++++++++ Speak/Speak/statusmodes.h | 52 + 135 files changed, 19164 insertions(+) create mode 100644 Speak/Speak/Core/ActionClickEvent.cs create mode 100644 Speak/Speak/Core/ActionProcessor.cs create mode 100644 Speak/Speak/Core/AvatarProcessor.cs create mode 100644 Speak/Speak/Core/Buttons.cs create mode 100644 Speak/Speak/Core/HTTP.cs create mode 100644 Speak/Speak/Core/IMessageProcessor.cs create mode 100644 Speak/Speak/Core/ImagePreview.cs create mode 100644 Speak/Speak/Core/LinkButton.cs create mode 100644 Speak/Speak/Core/LogWindow.cs create mode 100644 Speak/Speak/Core/MirandaDB.cs create mode 100644 Speak/Speak/Core/Regexps.cs create mode 100644 Speak/Speak/Core/Settings.cs create mode 100644 Speak/Speak/Fork/ContactContainer.cs create mode 100644 Speak/Speak/Fork/ContactManager.cs create mode 100644 Speak/Speak/HPP/HistoryppHandler.cs create mode 100644 Speak/Speak/HPP/HppActionOleObject.cs create mode 100644 Speak/Speak/HPP/HppAvatarObject.cs create mode 100644 Speak/Speak/Interfaces/HTMLDispIDs.cs create mode 100644 Speak/Speak/Interfaces/HTMLDocumentEvents2.cs create mode 100644 Speak/Speak/Interfaces/IHTMLDocument2.cs create mode 100644 Speak/Speak/Interfaces/IHTMLElement.cs create mode 100644 Speak/Speak/Interfaces/IHTMLEventObj.cs create mode 100644 Speak/Speak/Interfaces/IHTMLStyle.cs create mode 100644 Speak/Speak/Interop/IEHandler.cs create mode 100644 Speak/Speak/Interop/Structs.cs create mode 100644 Speak/Speak/Interop/Subclassing.cs create mode 100644 Speak/Speak/Interop/WinApi.cs create mode 100644 Speak/Speak/MainClass.cs create mode 100644 Speak/Speak/Opt/Options.cs create mode 100644 Speak/Speak/Opt/Win32ImageList.cs create mode 100644 Speak/Speak/Opt/dialog.res create mode 100644 Speak/Speak/Properties/AssemblyInfo.cs create mode 100644 Speak/Speak/Properties/Resources.Designer.cs create mode 100644 Speak/Speak/Properties/Resources.resx create mode 100644 Speak/Speak/Resources/icon_message.ico create mode 100644 Speak/Speak/Resources/icon_small_dot.ico create mode 100644 Speak/Speak/Resources/status_online.ico create mode 100644 Speak/Speak/RichEdit/ActionOleObject.cs create mode 100644 Speak/Speak/RichEdit/AvatarObject.cs create mode 100644 Speak/Speak/RichEdit/IRichEditOle.cs create mode 100644 Speak/Speak/RichEdit/ITextDocument.cs create mode 100644 Speak/Speak/RichEdit/ITextFont.cs create mode 100644 Speak/Speak/RichEdit/ITextPara.cs create mode 100644 Speak/Speak/RichEdit/ITextRange.cs create mode 100644 Speak/Speak/RichEdit/ITextSelection.cs create mode 100644 Speak/Speak/RichEdit/ITextStoryRanges.cs create mode 100644 Speak/Speak/RichEdit/REConstants.cs create mode 100644 Speak/Speak/RichEdit/RichEditHandler.cs create mode 100644 Speak/Speak/RichEdit/RichEditHelpers.cs create mode 100644 Speak/Speak/Sites/BNWSite.cs create mode 100644 Speak/Speak/Sites/ISite.cs create mode 100644 Speak/Speak/Sites/JuickSite.cs create mode 100644 Speak/Speak/Sites/PstoSite.cs create mode 100644 Speak/Speak/Sites/SitesManager.cs create mode 100644 Speak/Speak/Speak.csproj create mode 100644 Speak/Speak/Speak.dll create mode 100644 Speak/Speak/Storage/Settings.cs create mode 100644 Speak/Speak/Structs/API.cs create mode 100644 Speak/Speak/Structs/IconLib.cs create mode 100644 Speak/Speak/Structs/Miranda.cs create mode 100644 Speak/Speak/Structs/TabSRMM.cs create mode 100644 Speak/Speak/TTS/TextToSpeak.cs create mode 100644 Speak/Speak/UI/ActionMenuItem.cs create mode 100644 Speak/Speak/UI/PreviewForm.cs create mode 100644 Speak/Speak/UI/PreviewForm.designer.cs create mode 100644 Speak/Speak/UI/PreviewForm.resx create mode 100644 Speak/Speak/Utils/IconTable.cs create mode 100644 Speak/Speak/Utils/Invokable.cs create mode 100644 Speak/Speak/Utils/Util.cs create mode 100644 Speak/Speak/contributors.txt create mode 100644 Speak/Speak/res/Icon_exit.ico create mode 100644 Speak/Speak/res/Icon_show_hide.ico create mode 100644 Speak/Speak/res/Off.ico create mode 100644 Speak/Speak/res/On.ico create mode 100644 Speak/Speak/res/_blank.ico create mode 100644 Speak/Speak/res/arrow_sort_column_down.bmp create mode 100644 Speak/Speak/res/arrow_sort_column_up.bmp create mode 100644 Speak/Speak/res/chat_join.ico create mode 100644 Speak/Speak/res/chat_leave.ico create mode 100644 Speak/Speak/res/check_off.ico create mode 100644 Speak/Speak/res/check_on.ico create mode 100644 Speak/Speak/res/contact_add.ico create mode 100644 Speak/Speak/res/contact_delete.ico create mode 100644 Speak/Speak/res/contact_groups.ico create mode 100644 Speak/Speak/res/contact_rename.ico create mode 100644 Speak/Speak/res/contact_view_details.ico create mode 100644 Speak/Speak/res/cursor_drag_copy.cur create mode 100644 Speak/Speak/res/cursor_drop_user.cur create mode 100644 Speak/Speak/res/cursor_hyperlink.cur create mode 100644 Speak/Speak/res/group_closed.ico create mode 100644 Speak/Speak/res/group_opened.ico create mode 100644 Speak/Speak/res/icon_accmgr.ico create mode 100644 Speak/Speak/res/icon_all.ico create mode 100644 Speak/Speak/res/icon_ansi.ico create mode 100644 Speak/Speak/res/icon_auth_request.ico create mode 100644 Speak/Speak/res/icon_changefont.ico create mode 100644 Speak/Speak/res/icon_connecting.ico create mode 100644 Speak/Speak/res/icon_down_arrow.ico create mode 100644 Speak/Speak/res/icon_file.ico create mode 100644 Speak/Speak/res/icon_find_user.ico create mode 100644 Speak/Speak/res/icon_help.ico create mode 100644 Speak/Speak/res/icon_history.ico create mode 100644 Speak/Speak/res/icon_loaded.ico create mode 100644 Speak/Speak/res/icon_mail.ico create mode 100644 Speak/Speak/res/icon_message.ico create mode 100644 Speak/Speak/res/icon_notloaded.ico create mode 100644 Speak/Speak/res/icon_options.ico create mode 100644 Speak/Speak/res/icon_search_all.ico create mode 100644 Speak/Speak/res/icon_small_dot.ico create mode 100644 Speak/Speak/res/icon_sms.ico create mode 100644 Speak/Speak/res/icon_typing.ico create mode 100644 Speak/Speak/res/icon_undo.ico create mode 100644 Speak/Speak/res/icon_unicode.ico create mode 100644 Speak/Speak/res/icon_url.ico create mode 100644 Speak/Speak/res/icon_window.ico create mode 100644 Speak/Speak/res/icon_windows.ico create mode 100644 Speak/Speak/res/miranda_home.ico create mode 100644 Speak/Speak/res/miranda_logo.ico create mode 100644 Speak/Speak/res/miranda_manager.ico create mode 100644 Speak/Speak/res/status_DND.ico create mode 100644 Speak/Speak/res/status_NA.ico create mode 100644 Speak/Speak/res/status_away.ico create mode 100644 Speak/Speak/res/status_free4chat.ico create mode 100644 Speak/Speak/res/status_invisible.ico create mode 100644 Speak/Speak/res/status_locked.ico create mode 100644 Speak/Speak/res/status_occupied.ico create mode 100644 Speak/Speak/res/status_offline.ico create mode 100644 Speak/Speak/res/status_on_the_phone.ico create mode 100644 Speak/Speak/res/status_online.ico create mode 100644 Speak/Speak/res/status_out2lunch.ico create mode 100644 Speak/Speak/res/status_user_online.ico create mode 100644 Speak/Speak/resource.aps create mode 100644 Speak/Speak/resource.h create mode 100644 Speak/Speak/resource.rc create mode 100644 Speak/Speak/statusmodes.h diff --git a/Speak/Speak/Core/ActionClickEvent.cs b/Speak/Speak/Core/ActionClickEvent.cs new file mode 100644 index 0000000..56b5b79 --- /dev/null +++ b/Speak/Speak/Core/ActionClickEvent.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Speak.Core +{ + internal class ActionClickEvent : EventArgs + { + private string action; + private bool autoSend; + + public ActionClickEvent(string action, bool autoSend) + { + this.action = action; + this.autoSend = autoSend; + } + + public string Action + { + get { return action; } + set { action = value; } + } + + public bool AutoSend + { + get { return autoSend; } + set { autoSend = value; } + } + } +} diff --git a/Speak/Speak/Core/ActionProcessor.cs b/Speak/Speak/Core/ActionProcessor.cs new file mode 100644 index 0000000..c8d8c6a --- /dev/null +++ b/Speak/Speak/Core/ActionProcessor.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Speak.Fork; + +namespace Speak.Core +{ + internal class ActionProcessor + { + private ContactManager cm; + private Buttons btns; + + public ActionProcessor(ContactManager cm, Buttons btns) + { + this.cm = cm; + this.btns = btns; + + btns.OnAction += ActionHandler; + cm.OnAction += ActionHandler; + } + + private void ActionHandler(object sender, ActionEvent e) + { + string[] actionInfo = e.Action.Split('/'); + + switch (actionInfo[0]) + { + case "autofork": + Settings.Instance.AutoFork = !Settings.Instance.AutoFork; + Settings.Save(); + break; + case "forkdel": + DialogResult dr = MessageBox.Show( + "Ты уверен в том, что делаешь?" + Environment.NewLine + + "Хочешь удалить из контакт листа все псевдоконтакты с комментариями?", + "[xJuick] Подтверждение очистки контакт листа", + MessageBoxButtons.YesNoCancel, + MessageBoxIcon.Exclamation); + + if (dr == DialogResult.Yes) + cm.ClearContacts(); + break; + case "fork": + if (actionInfo.Length == 1) + return; + + Match m = Sites.SitesManager.GetContactSite(e.HContact).NumRegex.Match(actionInfo[1]); + if (!m.Success) + return; + + cm.ChangeForkState(e.HContact, m.Groups["post"].Value); + + break; + case "avatars": + Settings.Instance.ShowAvatars = !Settings.Instance.ShowAvatars; + Settings.Save(); + cm.Avatars(); + break; + } + } + } + + internal class ActionEvent : EventArgs + { + private string action; + private IntPtr hContact; + + public ActionEvent(IntPtr hContact, string action) + { + this.hContact = hContact; + this.action = action; + } + + public string Action + { + get { return action; } + } + + public IntPtr HContact + { + get { return hContact; } + } + } +} diff --git a/Speak/Speak/Core/AvatarProcessor.cs b/Speak/Speak/Core/AvatarProcessor.cs new file mode 100644 index 0000000..d33d5e0 --- /dev/null +++ b/Speak/Speak/Core/AvatarProcessor.cs @@ -0,0 +1,172 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Xml; +using Speak.Sites; + +namespace Speak.Core +{ + internal class AvatarProcessor + { + private object lockObject = new object(); + private /*volatile*/ Queue queue; + private HTTP http; + private ISite site; + + private string avatarsPath; + + public AvatarProcessor(ISite site) + { + this.site = site; + avatarsPath = Settings.xJuickAvatarsFolder + "\\" + site.Name + "_{0}.png"; + http = new HTTP(); + queue = new Queue(); + } + + public void AddToQueue(string userName, AvatarCallBack callback) + { + //string url = String.Format(ava32, userName); + //lock(lockObject) + { + foreach (AvatarQueueItem aItem in queue) + { + if (aItem.UserName.Equals(userName)) + { + if (callback != null) + aItem.AddCallBack(callback); + return; + } + } + + queue.Enqueue(new AvatarQueueItem(userName, callback)); + } + } + + private void Dequeue() + { + while (queue.Count != 0) + { + lock (lockObject) + { + if (queue.Count != 0) + { + AvatarQueueItem item = queue.Dequeue(); + if (DownloadAvatar(item.UserName)) + { + item.CallSubscribers(String.Format(avatarsPath, item.UserName)); + } + } + } + } + } + + public void Process() + { + if (queue.Count != 0) + { + Thread thread = new Thread(Dequeue); + thread.IsBackground = false; + thread.Start(); + } + } + + public string GetUserAvatar(string userName, AvatarCallBack callback) + { + string fullPath = Path.GetFullPath(String.Format(avatarsPath, userName)); + if (File.Exists(fullPath)) + return fullPath; + + AddToQueue(userName, callback); + return String.Empty; + } + + private bool DownloadAvatar(string user) + { + string avatarUrl = site.GetAvatarPath(user); + + if (String.IsNullOrEmpty(avatarUrl)) + return false; + + Stream avatar = http.GetImage(avatarUrl); + if (avatar != null) + { + if (File.Exists(String.Format(avatarsPath, user))) + return false; + Stream fs = FileStream.Synchronized(File.Open(String.Format(avatarsPath, user), FileMode.Create, FileAccess.Write, FileShare.None)); + byte[] bytes = new byte[255]; + int count = 0; + + while ((count = avatar.Read(bytes, 0, 255)) > 0) + { + fs.Write(bytes, 0, count); + } + + avatar.Close(); + fs.Close(); + return true; + } + + return false; + } + } + + internal delegate void AvatarCallBack(string userName, string avatarPath); + + internal class AvatarQueueItem + { + private string userName; + private List callbacks; + + public AvatarQueueItem(string avatarUrl, AvatarCallBack callback) + { + this.userName = avatarUrl; + callbacks = new List(); + callbacks.Add(callback); + } + + public string UserName + { + get { return userName; } + } + + public void AddCallBack(AvatarCallBack callBack) + { + callbacks.Add(callBack); + } + + public void CallSubscribers(string avatarPath) + { + for (int i = 0, iCount = callbacks.Count; i < iCount; i++) + { + if (callbacks[i] != null) + callbacks[i].Invoke(userName, avatarPath); + } + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof (AvatarQueueItem)) return false; + return Equals((AvatarQueueItem) obj); + } + + public bool Equals(AvatarQueueItem other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Equals(other.userName, userName); + } + + public override int GetHashCode() + { + unchecked + { + return ((userName != null ? userName.GetHashCode() : 0)*397) ^ (callbacks != null ? callbacks.GetHashCode() : 0); + } + } + } +} diff --git a/Speak/Speak/Core/Buttons.cs b/Speak/Speak/Core/Buttons.cs new file mode 100644 index 0000000..8dd2717 --- /dev/null +++ b/Speak/Speak/Core/Buttons.cs @@ -0,0 +1,359 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Xml.Serialization; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Virtuoso.Miranda.Plugins.Native; +using Speak.Structs; +using Speak.Utils; + +namespace Speak.Core +{ + internal class Buttons + { + private bool hidden; + private bool enabled; + private List buttons; + private List hardcodedButtons; + + private const string AUTOFORK_COMMAND = "xJuick://AutoFork"; + private const string AVATARS_COMMAND = "xJuick://Avatars"; + private const string FORKDEL_COMMAND = "xJuick://ForkDel"; + + public Buttons() + { + buttons = new List(); + hardcodedButtons = new List(); + hardcodedButtons.Add(new ButtonInfo("Отдельное окно для комментариев", AUTOFORK_COMMAND, "xJuick_Fork", true, true)); + hardcodedButtons.Add(new ButtonInfo("Удалить контакты комментариев", FORKDEL_COMMAND, "xJuick_ForkDel")); + hardcodedButtons.Add(new ButtonInfo("Включить/Выключить аватары", AVATARS_COMMAND, "xJuick_Avatars")); + + hidden = true; + enabled = false; + } + + public void AddButton(string name, string command) + { + AddButton(name, command, name); + } + + public void AddButton(string name, string command, string iconName) + { + buttons.Add(new ButtonInfo(name, command, iconName)); + } + + public void AddButtons(ButtonInfo[] buttons) + { + this.buttons.AddRange(buttons); + } + + private IntPtr GetIcon(ButtonInfo btn) + { + UnmanagedStringHandle str = new UnmanagedStringHandle(btn.IconName, StringEncoding.Ansi); + IntPtr hIcon = new IntPtr(MirandaContext.Current.CallService(API.MS_SKIN2_GETICON, UIntPtr.Zero, str.IntPtr)); + str.Free(); + if (hIcon != IntPtr.Zero) + { + btn.HIcon = hIcon; + return btn.HIcon; + } + + IconName iName = new IconName(); + iName.Init(); + iName.cbSize = Marshal.SizeOf(iName); + iName.szSection = Settings.IcoLibPath; + iName.szDescription = btn.Name; + iName.pszName = btn.IconName; + iName.hDefaultIcon = IconTable.GetDefaultIcon(btn.IconName); + + hIcon = Marshal.AllocHGlobal(Marshal.SizeOf(iName)); + Marshal.StructureToPtr(iName, hIcon, false); + btn.HIcon = new IntPtr(MirandaContext.Current.CallService(API.MS_SKIN2_ADDICON, UIntPtr.Zero, hIcon)); + + return btn.HIcon; + } + + private void SetButtonState(IntPtr hContact, ButtonInfo btn, UInt32 state) + { + BBButton bbButton = new BBButton(); + bbButton.cbSize = Marshal.SizeOf(bbButton); + bbButton.pszModuleName = Settings.ModuleName; + bbButton.szTooltip = btn.Name; + bbButton.dwButtonID = btn.ButtonID; + bbButton.iButtonWidth = 0; + bbButton.hIcon = btn.HIcon; + bbButton.bbbFlags = state; + + IntPtr bbPtr = Marshal.AllocHGlobal(Marshal.SizeOf(bbButton)); + Marshal.StructureToPtr(bbButton, bbPtr, false); + MirandaContext.Current.CallService(API.MS_BB_SETBUTTONSTATE, hContact, bbPtr); + } + + public void Create() + { + Delete(); + Create(290, hardcodedButtons); + Create(340, buttons); + } + + private void Create(uint startIndex, List btns) + { + for (int i = 0, iCount = btns.Count; i < iCount; i++) + { + ButtonInfo btn = btns[i]; + if (!btn.Enabled) + continue; + + BBButton bbButton = new BBButton(); + bbButton.cbSize = Marshal.SizeOf(bbButton); + bbButton.pszModuleName = Settings.ModuleName; + bbButton.szTooltip = btn.Name; + bbButton.dwDefPos = startIndex + (uint)i + 1; + bbButton.dwButtonID = btn.ButtonID = bbButton.dwDefPos; + bbButton.iButtonWidth = 0; + bbButton.bbbFlags |= TabSRMMConstants.BBBF_ISCHATBUTTON | TabSRMMConstants.BBBF_ISIMBUTTON | TabSRMMConstants.BBBF_ISLSIDEBUTTON; + if (btn.IsPush) + bbButton.bbbFlags |= TabSRMMConstants.BBBF_ISPUSHBUTTON; + + if (hidden) + bbButton.bbbFlags |= TabSRMMConstants.BBBF_HIDDEN; + + bbButton.hIcon = btn.HIcon == IntPtr.Zero ? GetIcon(btn) : btn.HIcon; + + IntPtr bbPtr = Marshal.AllocHGlobal(Marshal.SizeOf(bbButton)); + Marshal.StructureToPtr(bbButton, bbPtr, false); + MirandaContext.Current.CallService(API.MS_BB_ADDBUTTON, IntPtr.Zero, bbPtr); + } + } + + public void Click(UInt32 buttonID, IntPtr hContact) + { + if (!Click(buttonID, hContact, buttons)) + Click(buttonID, hContact, hardcodedButtons); + } + + private bool Click(UInt32 buttonID, IntPtr hContact, List btns) + { + for (int i = 0, iCount = btns.Count; i < iCount; i++) + { + ButtonInfo btn = btns[i]; + if (btn.ButtonID == buttonID) + { + // Нет, я не идиот (кажется). + // Просто MirandaContext.Current.HookEvent вызывается дважды + btn.Pressed = !btn.Pressed; + if (btn.Pressed) + return true; + + if (btn.Command.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase)) + { + Util.OpenURL(btn.Command); + return true; + } + + if (btn.Command.StartsWith("xJuick://", StringComparison.InvariantCultureIgnoreCase)) + { + InvokeOnAction(hContact, btn.Command.Substring(9).ToLower()); + return true; + } + + CSSData css = new CSSData(); + css.hContact = hContact; + css.szProtoService = API.PSS_MESSAGE; + css.wParam = IntPtr.Zero; + css.lParam = new UnmanagedStringHandle(btn.Command, StringEncoding.Ansi).IntPtr; + + IntPtr cmdPtr = Marshal.AllocHGlobal(Marshal.SizeOf(css)); + Marshal.StructureToPtr(css, cmdPtr, false); + MirandaContext.Current.CallService(API.MS_PROTO_CALLCONTACTSERVICE, IntPtr.Zero, cmdPtr); + return true; + } + } + + return false; + } + + private void Delete() + { + Delete(buttons); + Delete(hardcodedButtons); + } + + private void Delete(List btns) + { + for (int i = 0, iCount = btns.Count; i < iCount; i++) + { + if (btns[i].ButtonID == 0) + continue; + + BBButton bbButton = new BBButton(); + bbButton.cbSize = Marshal.SizeOf(bbButton); + bbButton.pszModuleName = Settings.ModuleName; + bbButton.dwButtonID = btns[i].ButtonID; + bbButton.iButtonWidth = 0; + bbButton.szTooltip = ""; + + IntPtr bbPtr = Marshal.AllocHGlobal(Marshal.SizeOf(bbButton)); + Marshal.StructureToPtr(bbButton, bbPtr, false); + MirandaContext.Current.CallService(API.MS_BB_REMOVEBUTTON, IntPtr.Zero, bbPtr); + + btns[i].ButtonID = 0; + } + } + + public void Hide(IntPtr hContact) + { + hidden = true; + Hide(hContact, buttons); + Hide(hContact, hardcodedButtons); + } + + private void Hide(IntPtr hContact, List btns) + { + for (int i = 0, iCount = btns.Count; i < iCount; i++) + { + SetButtonState(hContact, btns[i], TabSRMMConstants.BBSF_HIDDEN); + } + } + + public void Show(IntPtr hContact) + { + hidden = false; + Show(hContact, buttons); + Show(hContact, hardcodedButtons); + + for (int i = 0, iCount = hardcodedButtons.Count; i < iCount; i++) + { + if (hardcodedButtons[i].Command.Equals(AUTOFORK_COMMAND)) + { + SetButtonState(hContact, hardcodedButtons[i], Settings.Instance.AutoFork ? TabSRMMConstants.BBSF_PUSHED : TabSRMMConstants.BBSF_RELEASED); + } + // doesnt work in IE and HPP + else if (hardcodedButtons[i].Command.Equals(AVATARS_COMMAND)) + { + SetButtonState(hContact, hardcodedButtons[i], Settings.CurrentLog != LogHandler.Default ? TabSRMMConstants.BBSF_HIDDEN : TabSRMMConstants.BBSF_RELEASED); + } + } + } + + public void Show(IntPtr hContact, List btns) + { + for (int i = 0, iCount = btns.Count; i < iCount; i++) + { + SetButtonState(hContact, btns[i], TabSRMMConstants.BBSF_RELEASED); + btns[i].Pressed = true; + } + } + + public bool Hidden + { + get { return hidden; } + set { hidden = value; } + } + + public bool Enabled + { + get { return enabled; } + set { enabled = value; } + } + + public event EventHandler OnAction; + public void InvokeOnAction(IntPtr hContact, string action) + { + if (OnAction == null) + return; + OnAction(this, new ActionEvent(hContact, action)); + } + + } + + [Serializable] + public class ButtonInfo + { + private uint buttonID; + private string name; + private string command; + private string iconName; + private bool pressed; + private bool isPush; + private bool enabled; + + public ButtonInfo() + { + } + + public ButtonInfo(string name, string command, string iconName) : this(name, command, iconName, false, true) + { + + } + + public ButtonInfo(string name, string command, string iconName, bool isPush, bool enabled) : this() + { + this.name = name; + this.command = command; + this.iconName = iconName; + this.isPush = isPush; + buttonID = 0; + pressed = true; + this.enabled = enabled; + } + + [XmlAttribute(AttributeName = "enabled")] + public bool Enabled + { + get { return enabled; } + set { enabled = value; } + } + + [XmlIgnore] + public bool Pressed + { + get { return pressed; } + set { pressed = value; } + } + + [XmlIgnore] + public bool IsPush + { + get { return isPush; } + set { isPush = value; } + } + + [XmlIgnore] [NonSerialized] public IntPtr HIcon; + + [XmlIgnore] + public uint ButtonID + { + get { return buttonID; } + set { buttonID = value; } + } + + [XmlAttribute(AttributeName = "name")] + public string Name + { + get { return name; } + set { name = value; } + } + + [XmlAttribute(AttributeName = "command")] + public string Command + { + get { return command; } + set { command = value; } + } + + [XmlAttribute(AttributeName = "iconname")] + public string IconName + { + get { return iconName; } + set { iconName = value; } + } + + public ButtonInfo Clone() + { + return new ButtonInfo(name, command, iconName, isPush, enabled); + } + } +} + + diff --git a/Speak/Speak/Core/HTTP.cs b/Speak/Speak/Core/HTTP.cs new file mode 100644 index 0000000..064ac8a --- /dev/null +++ b/Speak/Speak/Core/HTTP.cs @@ -0,0 +1,206 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Windows.Forms; +using Speak.Properties; + +namespace Speak.Core +{ + internal class HTTP + { + private readonly Encoding cp1251; + private readonly Encoding utf; + private static readonly Encoding staticUtf = Encoding.UTF8; + private static string UserAgent = "xJuick v0.0.6a http://xa0c.net"; + + public HTTP() + { + cp1251 = Encoding.GetEncoding(1251); + utf = Encoding.UTF8; + } + + public event EventHandler OnContentReady; + private void InvokeOnContentReady(ContentEventArgs e) + { + EventHandler onContentReadyHandler = OnContentReady; + if (onContentReadyHandler != null) onContentReadyHandler(this, e); + } + + public void SendGetAsync(string url) + { + Thread thread = new Thread(SendGet); + thread.IsBackground = true; + thread.Start(url); + } + + private void SendGet(object urlObj) + { + SendGet(urlObj.ToString()); + } + + public string SendGet(string url) + { + return SendGet(url, false); + } + + private string SendGet(string url, bool async) + { + try + { + HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); + request.UserAgent = UserAgent; + request.Timeout = 4000; + + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + + string result = ReadResponse(response); + if (async) + InvokeOnContentReady(new ContentEventArgs(result)); + + return result; + } + catch (Exception) + { + InvokeOnContentReady(null); + } + + return String.Empty; + } + + public static string StaticSendGet(string url) + { + try + { + HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); + request.UserAgent = UserAgent; + request.Timeout = 4000; + + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + + return StaticReadResponse(response); + } + catch (Exception) + { + // nah + } + + return String.Empty; + } + + public Stream GetImage(string url) + { + return GetImage(url, true); + } + + public Stream GetImage(string url, bool returnBlankAvatar) + { + try + { + WebRequest wreq = WebRequest.Create(url); + HttpWebResponse httpResponse = (HttpWebResponse)wreq.GetResponse(); + if (httpResponse.ContentType != "text/html") + { + return httpResponse.GetResponseStream(); + } + else + { + Match m = Regexps.Image.Match(ReadResponse(httpResponse)); + if (!m.Success) + { + return null; + } + else + { + string imgUrl = m.Groups["image"].Value; + if (!imgUrl.StartsWith("http://")) + { + if (imgUrl.StartsWith("//")) + imgUrl = "http:" + imgUrl; + else + imgUrl = "http://" + imgUrl; + } + return GetImage(imgUrl, returnBlankAvatar); + } + } + } + catch (Exception) + { + MemoryStream stream = new MemoryStream(); + if (returnBlankAvatar) + { + //Resources.avatar_notfound.Save(stream, ImageFormat.Png); + stream.Seek(0, SeekOrigin.Begin); + } + return stream; + } + } + + private string ReadResponse(HttpWebResponse response) + { + string result = ""; + Stream stream = response.GetResponseStream(); + //StreamReader reader = new StreamReader(stream, response.CharacterSet.ToLower().IndexOf("utf") == -1 ? cp1251 : utf); + StreamReader reader = new StreamReader(stream, utf); + char[] chars = new Char[256]; + int count = reader.Read(chars, 0, 256); + + while (count > 0) + { + string str = new String(chars, 0, count); + result = result + str; + count = reader.Read(chars, 0, 256); + } + + response.Close(); + stream.Close(); + reader.Close(); + + return result; + } + + public static string StaticReadResponse(HttpWebResponse response) + { + string result = ""; + Stream stream = response.GetResponseStream(); + //StreamReader reader = new StreamReader(stream, response.CharacterSet.ToLower().IndexOf("utf") == -1 ? cp1251 : utf); + StreamReader reader = new StreamReader(stream, staticUtf); + char[] chars = new Char[256]; + int count = reader.Read(chars, 0, 256); + + while (count > 0) + { + string str = new String(chars, 0, count); + result = result + str; + count = reader.Read(chars, 0, 256); + } + + response.Close(); + stream.Close(); + reader.Close(); + + return result; + } + } + + public class ContentEventArgs : EventArgs + { + private string content; + + public ContentEventArgs(string content) + { + this.content = content; + } + + public string Content + { + get { return content; } + set { content = value; } + } + } +} diff --git a/Speak/Speak/Core/IMessageProcessor.cs b/Speak/Speak/Core/IMessageProcessor.cs new file mode 100644 index 0000000..a82a35e --- /dev/null +++ b/Speak/Speak/Core/IMessageProcessor.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Speak.Core +{ + internal interface IMessageProcessor : IDisposable + { + void Update(); + void ShowThreads(); + void Avatars(); + void SettingsChanged(); + event EventHandler JuickClicked; + } +} diff --git a/Speak/Speak/Core/ImagePreview.cs b/Speak/Speak/Core/ImagePreview.cs new file mode 100644 index 0000000..b317fa6 --- /dev/null +++ b/Speak/Speak/Core/ImagePreview.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using System.Windows.Forms; +using Speak.UI; + +namespace Speak.Core +{ + internal static class ImagePreview + { + private static PreviewForm pForm = new PreviewForm(); + private static string[] imageTypes; + + static ImagePreview() + { + imageTypes = new string[] { ".jpg", ".png", ".gif" }; + } + + public static bool IsImage(string url) + { + string ext = Path.GetExtension(url); + for (int i = 0, iCount = imageTypes.Length; i < iCount; i++) + { + if (imageTypes[i].Equals(ext, StringComparison.InvariantCultureIgnoreCase)) + return true; + } + + return false; + } + + public static void Show(Int32 x, Int32 y, string url) + { + pForm.Left = x; + pForm.Top = y; + if (!pForm.Visible) + { + pForm.Show(); + } + string pUrl = Settings.Instance.PreviewEngine.Url; + + pForm.Url = !pUrl.Equals("{0}") ? String.Format(pUrl, System.Web.HttpUtility.UrlEncode(url)) : url; + } + + public static void Hide() + { + if (pForm.Visible) + { + pForm.Hide(); + } + } + } + + [Serializable] + public class PreviewEngine + { + private string name; + private string url; + private bool enabled; + + public PreviewEngine() + { + } + + public PreviewEngine(string name, string url, bool enabled) + { + this.name = name; + this.url = url; + this.enabled = enabled; + } + + public string Name + { + get { return name; } + set { name = value; } + } + + public string Url + { + get { return url; } + set { url = value; } + } + + public bool Enabled + { + get { return enabled; } + set { enabled = value; } + } + + public PreviewEngine Clone() + { + return new PreviewEngine(name, url, enabled); + } + } +} diff --git a/Speak/Speak/Core/LinkButton.cs b/Speak/Speak/Core/LinkButton.cs new file mode 100644 index 0000000..8f620c5 --- /dev/null +++ b/Speak/Speak/Core/LinkButton.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Serialization; + +namespace Speak.Core +{ + [Serializable] + public class LinkButton + { + private string action; + private string displayName; + private string iconName; + private bool autoSend; + private bool enabled; + private LinkDisplayType displayType; + + public LinkButton() + { + } + + public LinkButton(string action, string displayName, bool autoSend, LinkDisplayType displayType) : this (action, displayName, String.Empty, autoSend, displayType, true) + { + + } + + public LinkButton(string action, string displayName, string iconName, bool autoSend, LinkDisplayType displayType, bool enabled) : this() + { + this.action = action; + this.displayName = displayName; + this.autoSend = autoSend; + this.displayType = displayType; + this.iconName = iconName; + this.enabled = enabled; + } + + [XmlAttribute(AttributeName = "enabled")] + public bool Enabled + { + get { return enabled; } + set { enabled = value; } + } + + [XmlAttribute("action")] + public string Action + { + get { return action; } + set { action = value; } + } + + [XmlAttribute("displayname")] + public string DisplayName + { + get { return displayName; } + set { displayName = value; } + } + + [XmlAttribute("autosend")] + public bool AutoSend + { + get { return autoSend; } + set { autoSend = value; } + } + + [XmlAttribute("displayon")] + public LinkDisplayType DisplayType + { + get { return displayType; } + set { displayType = value; } + } + + [XmlAttribute("iconname")] + public string IconName + { + get { return iconName; } + set { iconName = value; } + } + + public LinkButton Clone() + { + return new LinkButton(action, displayName, iconName, autoSend, displayType, enabled); + } + } + + [Serializable] + public class SimpleWordAction + { + private string action; + private bool autosend; + + public SimpleWordAction() + { + } + + public SimpleWordAction(string action, bool autosend) + { + this.action = action; + this.autosend = autosend; + } + + [XmlAttribute("action")] + public string Action + { + get { return action; } + set { action = value; } + } + + [XmlAttribute("autosend")] + public bool Autosend + { + get { return autosend; } + set { autosend = value; } + } + } + + public enum LinkDisplayType + { + Nicks, + Posts, + Comments, + Always, + Image + } + + public enum ActionWordType + { + None, + URL, + Comments, + Post, + Nick, + Tag + } +} diff --git a/Speak/Speak/Core/LogWindow.cs b/Speak/Speak/Core/LogWindow.cs new file mode 100644 index 0000000..c47bb2a --- /dev/null +++ b/Speak/Speak/Core/LogWindow.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Speak.Fork; +using Speak.Interop; +using Speak.Structs; +using Speak.Utils; + +namespace Speak.Core +{ + internal static class LogWindow + { + private static ISettingOwner ownerTabSRMM; + private static ISettingOwner ownerScriver; + private static ISettingOwner ownerHistoryPP; + private static bool isIEInstalled; + private static bool isHPPInstalled; + public static bool hppImitated; + public static string CurrentLogEngine; + + public static Color SRMMBackColor; + + public const string TabSRMMEngine = "tabSRMM"; + public const string ScriverEngine = "Scriver"; + public const string ScriverEnginePlus = "Scriver+"; + public const string SRMMEngine = "SRMM"; + public const string SRMMEnginePlus = "SRMM+"; + + + static LogWindow() + { + ownerTabSRMM = new ContactManager.SettingOwner("Tab_SRMsg"); + ownerScriver = new ContactManager.SettingOwner("SRMM"); + ownerHistoryPP = new ContactManager.SettingOwner("HistoryPlusPlus"); + + isIEInstalled = ServiceManager.ServiceExists(API.MS_IEVIEW_WINDOW); + isHPPInstalled = ServiceManager.ServiceExists(API.MS_HPP_EG_WINDOW); + + SRMMBackColor = Color.Empty; + CurrentLogEngine = Util.CurrentMessageEngine(); // tabSRMM, Scriver, SRMM + } + + //public static IntPtr FindRealLogWindow(IntPtr mainHandle, LogHandler currentLog) + //{ + // return FindRealLogWindow(mainHandle, currentLog, IntPtr.Zero); + //} + + public static IntPtr FindRealLogWindow(IntPtr mainHandle, LogHandler currentLog, IntPtr hContact, out LogHandler contactLog) + { + string className = String.Empty; + + if (hContact != IntPtr.Zero) + { + LogHandler forcedLog = GetForcedContactLogSettings(hContact); + if (forcedLog != LogHandler.Default) + { + switch (forcedLog) + { + case LogHandler.ForcedHPP: + if (isHPPInstalled) + currentLog = LogHandler.HistoryPP; + else + currentLog = LogHandler.Default; + break; + case LogHandler.ForcedIEView: + if (isIEInstalled) + { + if (!hppImitated) + currentLog = LogHandler.IEView; + else + currentLog = LogHandler.ImitatedHPP; + } + else + { + currentLog = LogHandler.Default; + } + break; + case LogHandler.ForcedDefault: + currentLog = LogHandler.Default; + break; + } + } + } + + switch (currentLog) + { + case LogHandler.ImitatedHPP: + case LogHandler.HistoryPP: + className = "TExtHistoryGrid"; + break; + case LogHandler.IEView: + className = "Internet Explorer_Server"; + break; + case LogHandler.Default: + SRMMBackColor = ColorTranslator.FromWin32(Convert.ToInt32(ContactInfo.ReadSetting(IntPtr.Zero, "BkgColour", ownerScriver, DatabaseSettingType.UInt32))); + className = CurrentLogEngine.Equals("tabSRMM") || CurrentLogEngine.Equals("SRMM") ? "RichEdit20A" : "RichEdit20W"; + break; + default: + throw new ArgumentOutOfRangeException("currentLog"); + } + contactLog = currentLog; + IntPtr logPtr = !CurrentLogEngine.Equals(ScriverEnginePlus) && !CurrentLogEngine.Equals(SRMMEnginePlus) ? WinApi.GetLogWindow(mainHandle, className) : WinApi.GetLogWindowByStyles(mainHandle, className); + return logPtr; + } + + public static LogHandler GetForcedContactLogSettings(IntPtr hContact) + { + LogHandler result = LogHandler.Default; + if (CurrentLogEngine.Equals("tabSRMM")) + { + byte hppForced = Convert.ToByte(ContactInfo.ReadSetting(hContact, "hpplog", ownerTabSRMM, DatabaseSettingType.Byte)); + byte ieviewForced = Convert.ToByte(ContactInfo.ReadSetting(hContact, "ieview", ownerTabSRMM, DatabaseSettingType.Byte)); + + return (hppForced == 1 ? LogHandler.ForcedHPP : (ieviewForced == 1 ? LogHandler.ForcedIEView : ((ieviewForced == 255 && hppForced == 255) ? LogHandler.ForcedDefault : LogHandler.Default))); + } + + return result; + } + + public static LogHandler GetViewMode() + { + bool useIE = false; + bool useHPP = false; + hppImitated = Convert.ToBoolean(ContactInfo.ReadSetting(IntPtr.Zero, "IEViewAPI", ownerHistoryPP, DatabaseSettingType.Byte)); + + switch (CurrentLogEngine) + { + case TabSRMMEngine: + useHPP = Convert.ToBoolean(ContactInfo.ReadSetting(IntPtr.Zero, "default_hpp", ownerTabSRMM, DatabaseSettingType.Byte)); + useIE = Convert.ToBoolean(ContactInfo.ReadSetting(IntPtr.Zero, "default_ieview", ownerTabSRMM, DatabaseSettingType.Byte)); + break; + case ScriverEngine: + useIE = Convert.ToBoolean(ContactInfo.ReadSetting(IntPtr.Zero, "UseIEView", ownerScriver, DatabaseSettingType.Byte)); + break; + case SRMMEngine: + return LogHandler.Default; + } + + return (isIEInstalled && useIE && !hppImitated) + ? LogHandler.IEView + //: ((isHPPInstalled && (useHPP || (useIE && hppImitated))) ? LogHandler.HistoryPP : LogHandler.Default); + : ((isHPPInstalled && useHPP && !useIE) + ? LogHandler.HistoryPP + : ((isHPPInstalled && useIE && hppImitated) ? LogHandler.ImitatedHPP : LogHandler.Default)); + } + } + + public enum LogHandler + { + Default, + IEView, + HistoryPP, + ImitatedHPP, + + ForcedHPP, + ForcedIEView, + ForcedDefault + } + + +} diff --git a/Speak/Speak/Core/MirandaDB.cs b/Speak/Speak/Core/MirandaDB.cs new file mode 100644 index 0000000..d224758 --- /dev/null +++ b/Speak/Speak/Core/MirandaDB.cs @@ -0,0 +1,194 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using Virtuoso.Miranda.Plugins.Helpers; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Virtuoso.Miranda.Plugins.Native; +using Speak.Structs; +using Speak.Utils; + +namespace Speak.Core +{ + internal static class MirandaDB + { + private static Type dbeType = typeof(DBEVENTINFO); + private static int dbeTypeSize = Marshal.SizeOf(dbeType); + + public static DatabaseEventInfoEx GetEvent(IntPtr eventHandler) + { + if (eventHandler == IntPtr.Zero) + return null; + + IntPtr hStruct = IntPtr.Zero; + DatabaseEventInfoEx result = null; + InteropBuffer buffer = null; + + try + { + int blobSize = MirandaContext.Current.CallService(API.MS_DB_EVENT_GETBLOBSIZE, eventHandler, IntPtr.Zero); + if (blobSize == -1) + { + throw new ArgumentException(); + } + buffer = InteropBufferPool.AcquireBuffer(blobSize); + buffer.Lock(); + + DBEVENTINFO dbev = new DBEVENTINFO(blobSize, buffer.IntPtr); + hStruct = Marshal.AllocHGlobal(dbeTypeSize); + Marshal.StructureToPtr(dbev, hStruct, false); + + MirandaContext.Current.CallService(API.MS_DB_EVENT_GET, eventHandler, hStruct); + dbev = (DBEVENTINFO)Marshal.PtrToStructure(hStruct, dbeType); + result = new DatabaseEventInfoEx(dbev); + } + finally + { + if (buffer != null) + buffer.Unlock(); + if (hStruct != IntPtr.Zero) + Marshal.FreeHGlobal(hStruct); + } + + return result; + } + + public static void DirectCopyHistory(IntPtr fromContact, IntPtr toContact, Regex condition) + { + if (fromContact == IntPtr.Zero || toContact == IntPtr.Zero) + return; + + IntPtr hStruct = IntPtr.Zero; + InteropBuffer buffer = null; + IEnumerable source = MirandaContext.Current.MirandaDatabase.GetEventHandles(fromContact); + List deleteList = new List(); + foreach (IntPtr hist in source) + { + int blobSize = MirandaContext.Current.CallService(API.MS_DB_EVENT_GETBLOBSIZE, hist, IntPtr.Zero); + if (blobSize == -1) + { + throw new ArgumentException(); + } + buffer = InteropBufferPool.AcquireBuffer(blobSize); + buffer.Lock(); + + DBEVENTINFO dbev = new DBEVENTINFO(blobSize, buffer.IntPtr); + hStruct = Marshal.AllocHGlobal(dbeTypeSize); + Marshal.StructureToPtr(dbev, hStruct, false); + + MirandaContext.Current.CallService(API.MS_DB_EVENT_GET, hist, hStruct); + dbev = (DBEVENTINFO)Marshal.PtrToStructure(hStruct, dbeType); + + if (condition != null) + { + if (dbev.EventType != (ushort)DatabaseEventType.Message) + continue; + + DatabaseEventInfoEx dbevEx = new DatabaseEventInfoEx(dbev); + if (!condition.Match(dbevEx.Data).Success) + { + buffer.Unlock(); + continue; + } + } + + dbev.Flags = dbev.Flags & ~(uint)DatabaseEventProperties.First; + hStruct = Marshal.AllocHGlobal(dbeTypeSize); + Marshal.StructureToPtr(dbev, hStruct, false); + MirandaContext.Current.CallService(API.MS_DB_EVENT_ADD, toContact, hStruct); + deleteList.Add(hist); + buffer.Unlock(); + Marshal.FreeHGlobal(hStruct); + } + + for (int i = 0, iCount = deleteList.Count; i < iCount; i++) + { + DeleteEvent(fromContact, deleteList[i]); + } + } + + public static void DeleteEvent(IntPtr hContact, IntPtr histHandle) + { + MirandaContext.Current.CallService(API.MS_DB_EVENT_DELETE, hContact, histHandle); + } + + public static void AddEvent(IntPtr toContact, string data, ISettingOwner owner, DatabaseEventType type, DatabaseEventProperties flags, DateTime timestamp) + { + IntPtr hStruct = IntPtr.Zero; + IntPtr pBlob = IntPtr.Zero; + try + { + int blobSize; + pBlob = Util.GetStringPtr(data, out blobSize); + + DBEVENTINFO dbev = new DBEVENTINFO(blobSize, pBlob); + dbev.EventType = (ushort)DatabaseEventType.Message; + dbev.Flags = (uint)flags | MainConstants.DBEF_UTF; + dbev.Module = Translate.ToHandle(owner.Name, StringEncoding.Ansi).IntPtr; + dbev.Timestamp = Utilities.GetTimestamp(timestamp); + + hStruct = Marshal.AllocHGlobal(dbeTypeSize); + Marshal.StructureToPtr(dbev, hStruct, false); + MirandaContext.Current.CallService(API.MS_DB_EVENT_ADD, toContact, hStruct); + } + finally + { + if (hStruct != IntPtr.Zero) + Marshal.FreeHGlobal(hStruct); + if (pBlob != IntPtr.Zero) + Marshal.FreeHGlobal(pBlob); + } + } + } + + internal class DatabaseEventInfoEx + { + private string data; + private DatabaseEventType eventType; + private DatabaseEventProperties flags; + private DateTime timeStamp; + private Protocol ownerModule; + + public DatabaseEventInfoEx(DBEVENTINFO unmanagedDBEvent) + { + + ownerModule = Protocol.UnknownProtocol; + if (unmanagedDBEvent.Module != IntPtr.Zero) + { + if(!MirandaContext.Current.Protocols.TryGetValue(Translate.ToString(unmanagedDBEvent.Module, StringEncoding.Ansi), out ownerModule)) + ownerModule = Protocol.UnknownProtocol; + } + + flags = (DatabaseEventProperties)unmanagedDBEvent.Flags; + eventType = (DatabaseEventType)((short)unmanagedDBEvent.EventType); + data = Util.GetNormalRussian(unmanagedDBEvent.BlobPtr, unmanagedDBEvent.BlobSize); + timeStamp = Util.GetDateTime(unmanagedDBEvent.Timestamp); + } + + public string Data + { + get { return data; } + } + + public DatabaseEventType EventType + { + get { return eventType; } + } + + public DatabaseEventProperties Flags + { + get { return flags; } + } + + public DateTime TimeStamp + { + get { return timeStamp; } + } + + public Protocol OwnerModule + { + get { return ownerModule; } + } + } +} diff --git a/Speak/Speak/Core/Regexps.cs b/Speak/Speak/Core/Regexps.cs new file mode 100644 index 0000000..e761fd0 --- /dev/null +++ b/Speak/Speak/Core/Regexps.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace Speak.Core +{ + internal static class Regexps + { + public static Regex _NumRegEx = new Regex( + "(?(?\\#\\d+)(?/\\d+)?)", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + public static Regex UID = new Regex( + "/(?\\d+)\\.png", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + public static Regex GetHistoryRegEx(string postNumber) + { + return new Regex( + String.Format("\\B(?{0})", postNumber.Replace("#", "\\#")), + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + } + + public static Regex TopNameRegEx = new Regex( + "\\B@(?\\w+[-_\\.\\w]*\\w+)\\:", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + public static Regex _NameRegEx = new Regex( + "(?\\B@\\w+[-_\\.\\w]*\\w+)(?\\:{1})?", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + public static Regex JidRegEx = new Regex( + "(?\\B@[\\w-_\\.]+\\@[\\w-_\\.]+)", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + public static Regex Russian = new Regex( + "[А-Я]+", + RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + public static Regex Image = new Regex( + "[^\"]*)\"", + RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + public static Regex PureReplyRegEx = new Regex( + "\\B(?\\#(?\\d+)(?:/(?\\d+))?)", + RegexOptions.IgnoreCase + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + public static Regex ReplyRegEx = new Regex( + "(?\\#(?\\d+)(?:/(?\\d+)){1})\\ http://juick." + + "com/(?(post)\\k)(?(cmnt)\\#\\k)", // do I need to add '$' to the end? + RegexOptions.IgnoreCase + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + } +} diff --git a/Speak/Speak/Core/Settings.cs b/Speak/Speak/Core/Settings.cs new file mode 100644 index 0000000..9e74744 --- /dev/null +++ b/Speak/Speak/Core/Settings.cs @@ -0,0 +1,351 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.Windows.Forms; +using System.Xml.Serialization; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Speak.Fork; +using Speak.Sites; + +namespace Speak.Core +{ + [Serializable] + public class Settings + { + private static string filepath = ""; + public static string xJuickDataFolder = ""; + public static string xJuickAvatarsFolder = ""; + private static Settings instance; + + private bool autoFork; + private bool fastIEView; + private bool showAvatars; + private bool showContextAvatars; + private string jabberProtocolName; + + public static bool SomeEventsDoubled = LogWindow.CurrentLogEngine.Equals("tabSRMM"); + public static readonly string ModuleName = "xJuick"; + public static readonly string IcoLibPath = "TabSRMM/Toolbar/" + ModuleName; + public static readonly string DefaultProtocolName = "yours@jabber.protocol.name"; + private static ContactManager.SettingOwner owner = new ContactManager.SettingOwner(ModuleName); + public static LogHandler CurrentLog = LogHandler.Default; + private SimpleWordAction srmmNickAction; + private SimpleWordAction srmmNumberAction; + private PreviewEngine currenPreview; + + private ISite[] sites; + private ButtonInfo[] buttons; + private LinkButton[] srmmLinkButtons; + private PreviewEngine[] previewEngines; + private string[] activeContacts; + + static Settings() + { + InitDirectories(Path.GetDirectoryName(Application.ExecutablePath)); + } + + public static void InitDirectories(string basePath) + { + try + { + xJuickDataFolder = Path.Combine(Path.Combine(basePath, "plugins"), "xJuick"); + xJuickAvatarsFolder = Path.Combine(xJuickDataFolder, "Avatars"); + if (!Directory.Exists(xJuickDataFolder)) + Directory.CreateDirectory(xJuickDataFolder); + if (!Directory.Exists(xJuickAvatarsFolder)) + Directory.CreateDirectory(xJuickAvatarsFolder); + + filepath = Path.Combine(xJuickDataFolder, "config.xml"); + } + catch + { + // eat this! >:) + } + } + + [XmlIgnore] + public static Settings Instance + { + get + { + if (instance == null) + { + try + { + Load(); + } + catch + { + instance = new Settings(); + } + Save(); + } + return instance; + } + } + + public static void Reload() + { + instance = null; + } + + private static void Load() + { + //LoadXML(); + bool useXML = File.Exists(filepath); + if (useXML) + { + LoadXML(); + } + else + { + IFormatter bs = new BinaryFormatter(); + using (MemoryStream ms = new MemoryStream((byte[])ContactInfo.ReadSetting(IntPtr.Zero, "Settings", owner, DatabaseSettingType.Blob))) + { + instance = (Settings)bs.Deserialize(ms); + if (instance.PreviewEngines == null) + { + instance.PreviewEngines = DefaultEngines(); + } + if (instance.Sites == null) + { + instance.Sites = GetSites(); + } + } + } + + } + + private static void LoadXML() + { + using (FileStream fs = new FileStream(filepath, FileMode.Open)) + { + XmlSerializer xs = new XmlSerializer(typeof(Settings)); + instance = (Settings)xs.Deserialize(fs) ?? new Settings(); + } + } + + public static void Save() + { + bool useXML = File.Exists(filepath); + try + { + if (useXML) + { + SaveXML(); + } + else + { + ContactInfo ci = ContactInfo.FromHandle(IntPtr.Zero); + IFormatter bs = new BinaryFormatter(); + using (MemoryStream ms = new MemoryStream()) + { + bs.Serialize(ms, instance); + byte[] data = new byte[ms.Length]; + ms.Position = 0; + ms.Read(data, 0, (int)ms.Length); + ci.WriteSettingAsBlob("Settings", owner, data); + } + } + } + catch (Exception) + { + + throw; + } + } + + public static void SaveXML() + { + using (FileStream fs = new FileStream(filepath, FileMode.Create)) + { + XmlSerializer xs = new XmlSerializer(typeof(Settings)); + xs.Serialize(fs, instance); + } + } + + public Settings() + { + List buttons = new List(); + buttons.Add(new ButtonInfo("10 последних сообщений", "#+", ModuleName + "_GetLast")); + /* + buttons.Add(new ButtonInfo("10 горячих сообщений", "#", ModuleName + "_GetTop")); + buttons.Add(new ButtonInfo("10 популярных тегов", "*", ModuleName + "_GetTopTags")); + buttons.Add(new ButtonInfo("10 популярных пользователей", "@", ModuleName + "_GetTopUsers")); + buttons.Add(new ButtonInfo("Ваши подписки", "S", ModuleName + "_GetSubscriptions")); + */ + buttons.Add(new ButtonInfo("Ссылка для логина", "LOGIN", ModuleName + "_GetLogin")); + + this.buttons = buttons.ToArray(); + + List linkButtons = new List(); + linkButtons.Add(new LinkButton("%NUMBER%", "Прочитать", ModuleName + "_Magnifier", true, LinkDisplayType.Posts, true)); + linkButtons.Add(new LinkButton("xJuick://Fork/%NUMBER%", "Отдельное окно", ModuleName + "_ForkSmall", true, LinkDisplayType.Posts, true)); + linkButtons.Add(new LinkButton("%NUMBER%+", "Много прочитать", ModuleName + "_Plus", true, LinkDisplayType.Posts, true)); + linkButtons.Add(new LinkButton("S %NUMBER%", "Хочу следить", ModuleName + "_Tick", true, LinkDisplayType.Posts, true)); + linkButtons.Add(new LinkButton("U %NUMBER%", "Не хочу следить", ModuleName + "_Minus", true, LinkDisplayType.Posts, true)); + linkButtons.Add(new LinkButton("! %NUMBER%", "SPAM it", ModuleName + "_Exclamation", false, LinkDisplayType.Posts, true)); + + linkButtons.Add(new LinkButton("%NUMBER%", "Перечитать пост", ModuleName + "_Magnifier", true, LinkDisplayType.Comments, true)); + linkButtons.Add(new LinkButton("xJuick://Fork/%NUMBER%", "Отдельное окно", ModuleName + "_ForkSmall", true, LinkDisplayType.Comments, true)); + linkButtons.Add(new LinkButton("U %NUMBER%", "Задолбали комменты", ModuleName + "_Minus", true, LinkDisplayType.Comments, true)); + linkButtons.Add(new LinkButton("D %COMMENT%", "Удалить", ModuleName + "_Cross", false, LinkDisplayType.Comments, true)); + + linkButtons.Add(new LinkButton("%NICK%", "Инфо", ModuleName + "_Magnifier", true, LinkDisplayType.Nicks, true)); + linkButtons.Add(new LinkButton("%NICK%+", "10 постов", ModuleName + "_Plus", true, LinkDisplayType.Nicks, true)); + linkButtons.Add(new LinkButton("PM %NICK% ", "Приват", ModuleName + "_Ballon", false, LinkDisplayType.Nicks, true)); + linkButtons.Add(new LinkButton("S %NICK%", "Хочу следить", ModuleName + "_Tick", true, LinkDisplayType.Nicks, true)); + linkButtons.Add(new LinkButton("U %NICK%", "Не хочу следить", ModuleName + "_Minus", true, LinkDisplayType.Nicks, true)); + linkButtons.Add(new LinkButton("BL %NICK%", "Занести в блэклист", ModuleName + "_BlackUser", false, LinkDisplayType.Nicks, true)); + + this.srmmLinkButtons = linkButtons.ToArray(); + + PreviewEngines = DefaultEngines(); + + jabberProtocolName = "yours@jabber.protocol.name"; + + activeContacts = new string[0]; + + + + this.sites = GetSites(); + + autoFork = false; + fastIEView = true; + showAvatars = true; + showContextAvatars = true; + + srmmNickAction = new SimpleWordAction("%NICK% ", false); + srmmNumberAction = new SimpleWordAction("%NUMBER% ", false); + } + + private static ISite[] GetSites() + { + List sites = new List(); + foreach (KeyValuePair site in SitesManager.Sites) + { + sites.Add(site.Value); + } + + return sites.ToArray(); + } + + private static PreviewEngine[] DefaultEngines() + { + List engines = new List(); + engines.Add(new PreviewEngine("m-software.de", "http://www.m-software.de/screenshot/Screenshot.png?url={0}&delay=10&type=jpg&scale=3", true)); + engines.Add(new PreviewEngine("images.websnapr.com", "http://images.websnapr.com/?url={0}&size=s", false)); + return engines.ToArray(); + } + + [XmlArrayItem("JID")] + public string[] ActiveContacts + { + get { return activeContacts; } + set { activeContacts = value; } + } + + public ISite[] Sites + { + get { return sites; } + set { sites = value; } + } + + public string JabberProtocolName + { + get { return jabberProtocolName; } + set { jabberProtocolName = value; } + } + + public ButtonInfo[] Buttons + { + get { return buttons; } + set { buttons = value; } + } + + public bool AutoFork + { + get { return autoFork; } + set { autoFork = value; } + } + + public bool ShowAvatars + { + get { return showAvatars; } + set { showAvatars = value; } + } + + public bool ShowContextAvatars + { + get { return showContextAvatars; } + set { showContextAvatars = value; } + } + + public bool FastIEView + { + get { return fastIEView; } + set { fastIEView = value; } + } + + public LinkButton[] SRMMLinkButtons + { + get { return srmmLinkButtons; } + set { srmmLinkButtons = value; } + } + + [XmlIgnore] + public bool ShowPreview + { + get { return currenPreview != null; } + set { } + } + + [XmlIgnore] + public PreviewEngine PreviewEngine + { + get { return currenPreview; } + set { } + } + + public PreviewEngine[] PreviewEngines + { + get { return previewEngines; } + set + { + previewEngines = value; + for (int i = 0, iCount = previewEngines.Length; i < iCount; i++) + { + if (previewEngines[i].Enabled) + { + currenPreview = previewEngines[i]; + return; + } + } + + currenPreview = null; + } + } + + public SimpleWordAction SRMMNickAction + { + get { return srmmNickAction; } + set { srmmNickAction = value; } + } + + public SimpleWordAction SRMMNumberAction + { + get { return srmmNumberAction; } + set { srmmNumberAction = value; } + } + + public static void ResetToDefault() + { + instance = new Settings(); + } + } +} + + diff --git a/Speak/Speak/Fork/ContactContainer.cs b/Speak/Speak/Fork/ContactContainer.cs new file mode 100644 index 0000000..7b55fee --- /dev/null +++ b/Speak/Speak/Fork/ContactContainer.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Speak.Core; +using Speak.HPP; +using Speak.Interop; +using Speak.RichEdit; +using Speak.Sites; + +namespace Speak.Fork +{ + internal class ContactContainer : IDisposable + { + private ContactManager parent; + private ContactInfo contact; + private IMessageProcessor processor; + + public ContactContainer(ContactManager parent, ContactInfo contact) + { + this.parent = parent; + this.contact = contact; + processor = null; + } + + public ContactInfo Contact + { + get { return contact; } + } + + internal IMessageProcessor Processor + { + get { return processor; } + } + + public void UpdateProcessor() + { + if (processor != null) + processor.Update(); + } + + public void InitMessageProcessor(ISite site, IntPtr hContact, IntPtr hWnd) + { + if (processor == null) + { + LogHandler currenLog = Settings.CurrentLog; + IntPtr logHandle = currenLog != LogHandler.ImitatedHPP ? LogWindow.FindRealLogWindow(hWnd, currenLog, hContact, out currenLog) : IntPtr.Zero; + + if (logHandle == IntPtr.Zero && currenLog != LogHandler.ImitatedHPP) + { + MessageBox.Show( + "Cant find LOG window of '" + LogWindow.CurrentLogEngine + "'." + Environment.NewLine + + "Links highlighting will be disabled", + "[xJuick] InitMessageProcessor() error", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + + return; + } + + switch (currenLog) + { + case LogHandler.Default: + processor = new RichEditHandler(site, logHandle); + break; + case LogHandler.IEView: + processor = new IEHandler(site, logHandle); + break; + case LogHandler.HistoryPP: + processor = new HistoryppHandler(site, logHandle, false); + break; + case LogHandler.ImitatedHPP: + processor = new HistoryppHandler(site, hWnd, true); + break; + } + + processor.JuickClicked += processor_JuickClicked; + } + } + + private void processor_JuickClicked(object sender, ActionClickEvent e) + { + parent.OnJuickClicked(this, e); + } + + public void Close() + { + if (processor != null) + { + processor.JuickClicked -= processor_JuickClicked; + processor = null; + } + } + + public void Dispose() + { + Close(); + } + } +} diff --git a/Speak/Speak/Fork/ContactManager.cs b/Speak/Speak/Fork/ContactManager.cs new file mode 100644 index 0000000..bfcb8cf --- /dev/null +++ b/Speak/Speak/Fork/ContactManager.cs @@ -0,0 +1,636 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Windows.Forms; +using Virtuoso.Miranda.Plugins.Helpers; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Virtuoso.Miranda.Plugins.Native; +using Speak.Core; +using Speak.HPP; +using Speak.RichEdit; +using Speak.Sites; +using Speak.Structs; +using Speak.UI; +using Speak.Utils; + +namespace Speak.Fork +{ + class ContactManager : IDisposable + { + internal class SettingOwner : ISettingOwner + { + private string name; + + public SettingOwner(string name) + { + this.name = name; + } + + public string Name + { + get { return name; } + set { name = value; } + } + + } + + private string ownerProtocol; + //private ContactContainer juickContact; + private List siteContacts; + + // todo: FIX IT!!!111 + private const string namePrefix = "[xJuick] "; + private const string xJuickSiteField = "Site"; + private List forkContacts; + private SettingOwner pOwner; + private SettingOwner mpOwner; + private SettingOwner clOwner; + private SettingOwner sOwner; + private IntPtr rootName; + private bool addAsTemporary; + private StatusModes mode; + private Dictionary additionalContacts; + + + public ContactManager(IntPtr rootName, ISite[] currentSites, string ownerProtocol) + { + + siteContacts = new List(); + + + this.rootName = rootName; + mode = StatusModes.OnThePhone; + additionalContacts = new Dictionary(); + forkContacts = new List(); + + pOwner = new SettingOwner("Protocol"); + mpOwner = new SettingOwner(ownerProtocol); + clOwner = new SettingOwner("CList"); + sOwner = new SettingOwner("xJuickSite"); + + List mainContacts = new List(); + for (int i = 0, iCount = currentSites.Length; i < iCount; i++) + { + mainContacts.Add(currentSites[i].MainContact); + + ISite site = currentSites[i]; + for (int j = 0, jCount = currentSites[i].AdditionalContacts.Length; j < jCount; j++) + { + additionalContacts[currentSites[i].AdditionalContacts[j]] = site; + } + } + + if (!FillContactList(mainContacts, ownerProtocol)) + throw new Exception("No protocols found"); + + addAsTemporary = false; + + MirandaContext.Current.MirandaDatabase.ContactDeleted += MirandaDatabase_ContactDeleted; + } + + private bool MirandaDatabase_ContactDeleted(object sender, MirandaContactEventArgs e) + { + int deleteIndex = -1; + for (int i = 0, iCount = forkContacts.Count; i < iCount; i++) + { + if (forkContacts[i].Contact.MirandaHandle == e.ContactInfo.MirandaHandle) + { + if (IsAdditional(forkContacts[i].Contact.UniqueID.ToString())) + return false; + + deleteIndex = i; + break; + } + } + + if (deleteIndex != -1) + { + CopyHistory(e.ContactInfo.MirandaHandle, GetMainContactHandle(e.ContactInfo.MirandaHandle), null); + forkContacts.RemoveAt(deleteIndex); + } + return false; + } + + public bool IsMainContact(IntPtr hMainContact) + { + return GetMainContactContainer(hMainContact) != null; + } + + private ContactContainer GetMainContactContainer(IntPtr hMainContact) + { + for (int i = 0, iCount = siteContacts.Count; i < iCount; i++) + { + if (hMainContact == siteContacts[i].Contact.MirandaHandle) + return siteContacts[i]; + } + + return null; + } + + public IntPtr GetMainContactHandle(IntPtr childHContact) + { + ISite site = SitesManager.GetContactSite(childHContact); + + if (site == null) + return IntPtr.Zero; + + for (int i = 0, iCount = siteContacts.Count; i < iCount; i++) + { + if (siteContacts[i].Contact.UniqueID.ToString() == site.MainContact) + { + return siteContacts[i].Contact.MirandaHandle; + } + } + + return IntPtr.Zero; // yeah. maybe will implement multi-juick later :) + } + + private bool FillContactList(List mainContacts, string ownerProtocol) + { + // quiet unload + if (Util.EnumProtocols().Count == 0) + return false; + + Dictionary> protocols = new Dictionary>(); + int contactsCount = 0; + + IEnumerable hContacts = MirandaContext.Current.MirandaDatabase.GetContactHandles(); + foreach (IntPtr hContact in hContacts) + { + contactsCount++; + ContactInfo ci = ContactInfo.FromHandle(hContact); + + if (ci == null || ci.UniqueID == null) + continue; + + string jid = ci.UniqueID.ToString(); + + bool isAdditional = IsAdditional(jid); + if (jid.StartsWith(namePrefix) || isAdditional) + { + if (!IsOnContact(ci.MirandaHandle)) + AddToContact(ci.MirandaHandle); + + forkContacts.Add(new ContactContainer(this, ci)); + + string contactSite = (string)ci.ReadSetting(xJuickSiteField, sOwner, DatabaseSettingType.AsciiString); + if (!String.IsNullOrEmpty(contactSite)) + { + ISite contactSiteObject = SitesManager.GetContactSite(contactSite, true); + if (contactSiteObject != null) + SitesManager.SitesInfo[ci.MirandaHandle] = contactSiteObject; + } + else if (isAdditional) + { + SitesManager.SitesInfo[ci.MirandaHandle] = additionalContacts[jid]; + } + } + else if (mainContacts.IndexOf(jid) != -1) + { + ISite site = SitesManager.GetContactSite(jid, false); + if (site != null) + SitesManager.SitesInfo[hContact] = site; + + string ownerProto = (string)ci.ReadSetting("p", pOwner, DatabaseSettingType.AsciiString); + if (!protocols.ContainsKey(jid)) + protocols[jid] = new Dictionary(); + + protocols[jid].Add(ownerProto, ci); + } + } + + if (contactsCount == 0) + return false; + + bool found = false; + foreach (KeyValuePair> jp in protocols) + { + foreach (KeyValuePair p in jp.Value) + { + if (p.Key.Equals(ownerProtocol, StringComparison.InvariantCultureIgnoreCase)) + { + this.ownerProtocol = ownerProtocol; + ContactInfo ci = jp.Value[this.ownerProtocol]; + ContactContainer mainContact = new ContactContainer(this, ci); + siteContacts.Add(mainContact); + if (!IsOnContact(ci.MirandaHandle)) + AddToContact(ci.MirandaHandle); + found = true; + } + } + } + + if (found) + return true; + + if (String.IsNullOrEmpty(this.ownerProtocol)) + { + if (protocols.Count == 0) + { + System.Windows.Forms.MessageBox.Show("Found ZERO protocols with main accounts (check options)" + Environment.NewLine + + "xJuick plugin will be unloaded now.", "[xJuick] Jabber Protocol error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + /*ProtocolSelect ps = new ProtocolSelect(protocols); + if (ps.ShowDialog() != DialogResult.OK) + return false; + + if (String.IsNullOrEmpty(ps.ResultProtocol) || ps.ResultContactInfo == null) + return false; + + this.ownerProtocol = ps.ResultProtocol; + ContactInfo ci = ps.ResultContactInfo; + + ContactContainer mainContact = new ContactContainer(this, ci); + siteContacts.Add(mainContact); + if (!IsOnContact(ci.MirandaHandle)) + AddToContact(ci.MirandaHandle); + + Settings.Instance.JabberProtocolName = this.ownerProtocol; + Settings.Save();*/ + + return true; + } + + return false; + } + + public bool IsForked(IntPtr hContact) + { + for (int i = 0, iCount = forkContacts.Count; i < iCount; i++) + { + if (forkContacts[i].Contact.MirandaHandle == hContact) + { + return true; + } + } + return false; + } + + public bool IsAdditional(string UID) + { + return additionalContacts.ContainsKey(UID); + } + + public ContactInfo GetContactInfo(string mainContact, string name) + { + ContactInfo result = null; + + string sname = namePrefix + name; + for (int i = 0, iCount = forkContacts.Count; i < iCount; i++) + { + if (forkContacts[i].Contact != null && forkContacts[i].Contact.UniqueID != null) + { + if (forkContacts[i].Contact.UniqueID.ToString().Equals(sname, StringComparison.InvariantCultureIgnoreCase)) + { + result = forkContacts[i].Contact; + break; + } + } + else + { + MessageBox.Show("GetContactInfo() -> Null ID [???]"); + } + } + + + if (result == null && Settings.Instance.AutoFork) + { + result = MakeFork(mainContact, name); + } + else if (result != null) + ChangeStatus(result, mode); + + return result; + } + + private ContactInfo MakeFork(string mainContact, string name) + { + ContactInfo result = AddNewContact(mainContact, name); + if (result != null) + { + SitesManager.SitesInfo[result.MirandaHandle] = SitesManager.GetContactSite(mainContact, false); + + if (!IsOnContact(result.MirandaHandle)) + AddToContact(result.MirandaHandle); + + forkContacts.Add(new ContactContainer(this, result)); + ChangeStatus(result, mode); + } + return result; + } + + public void CopyHistory(IntPtr fromContact, IntPtr toContact, Regex condition) + { + MirandaDB.DirectCopyHistory(fromContact, toContact, condition); + } + + public void SettingsChanged() + { + for (int i = 0, iCount = siteContacts.Count; i < iCount; i++) + { + if (siteContacts[i].Processor != null) + siteContacts[i].Processor.SettingsChanged(); + } + + for (int i = 0, iCount = forkContacts.Count; i < iCount; i++) + { + if (forkContacts[i].Processor != null) + { + forkContacts[i].Processor.SettingsChanged(); + break; + } + } + } + + public void OpenChat(IntPtr hContact, IntPtr hWnd) + { + ContactContainer contact = GetMainContactContainer(hContact); + ISite site = SitesManager.GetContactSite(hContact); + + if (site == null) + { + if (contact != null) + { + string cintactID = contact.Contact.UniqueID.ToString(); + site = SitesManager.GetContactSite(cintactID, true); + if (site != null) + SitesManager.SitesInfo[hContact] = site; + } + else + { + ContactInfo ci = ContactInfo.FromHandle(hContact); + string contactSite = (string)ci.ReadSetting(xJuickSiteField, pOwner, DatabaseSettingType.AsciiString); + if (!String.IsNullOrEmpty(contactSite)) + { + site = SitesManager.GetContactSite(contactSite, false); + } + else if (IsAdditional(ci.UniqueID.ToString())) + { + site = additionalContacts[ci.UniqueID.ToString()]; + } + } + + if (site == null) + return; + } + + + if (contact != null) + { + contact.InitMessageProcessor(site, hContact, hWnd); + return; + } + + for (int i = 0, iCount = forkContacts.Count; i < iCount; i++) + { + if (forkContacts[i].Contact.MirandaHandle == hContact) + { + forkContacts[i].InitMessageProcessor(site, hContact, hWnd); + break; + } + } + } + + public void CloseChat(IntPtr hContact) + { + //SitesManager.SitesInfo.Remove(hContact); + + ContactContainer contact = GetMainContactContainer(hContact); + if (contact != null) + { + contact.Close(); + return; + } + + for (int i = 0, iCount = forkContacts.Count; i < iCount; i++) + { + if (forkContacts[i].Contact.MirandaHandle == hContact) + { + forkContacts[i].Close(); + break; + } + } + } + + public void ProcessHistoryItem(IntPtr smallHandle, ItemRenderDetails ird) + { + ContactContainer item = null; + + ContactContainer contact = GetMainContactContainer(ird.hContact); + if (contact != null) + { + item = contact; + } + else + { + for (int i = 0, iCount = forkContacts.Count; i < iCount; i++) + { + if (forkContacts[i].Contact.MirandaHandle == ird.hContact) + { + item = forkContacts[i]; + break; + } + } + } + + if (item == null) + return; + + if (item.Processor is HistoryppHandler) + ((HistoryppHandler)item.Processor).ProcessHistoryItem(smallHandle, ird); + } + + public void Avatars() + { + for (int i = 0, iCount = siteContacts.Count; i < iCount; i++) + { + if (siteContacts[i].Processor != null) + siteContacts[i].Processor.Avatars(); + } + + for (int i = 0, iCount = forkContacts.Count; i < iCount; i++) + { + if (forkContacts[i].Processor != null) + forkContacts[i].Processor.Avatars(); + } + } + + public void Update(IntPtr hContact) + { + ContactContainer contact = GetMainContactContainer(hContact); + if (contact != null) + { + contact.UpdateProcessor(); + return; + } + + for (int i = 0, iCount = forkContacts.Count; i < iCount; i++) + { + if (forkContacts[i].Contact.MirandaHandle == hContact) + { + forkContacts[i].UpdateProcessor(); + break; + } + } + } + + private ContactInfo AddNewContact(string mainContact, string uid) + { + if (String.IsNullOrEmpty(ownerProtocol)) + return null; + try + { + ContactInfo ci = ContactInfo.CreateContact(); + + ci.WriteSetting("FullName", mpOwner, uid, DatabaseSettingType.AsciiString); + ci.WriteSetting("jid", mpOwner, namePrefix + uid, DatabaseSettingType.AsciiString); + ci.WriteSetting("p", pOwner, ownerProtocol, DatabaseSettingType.AsciiString); + ci.WriteSetting(xJuickSiteField, sOwner, mainContact, DatabaseSettingType.AsciiString); + + if (addAsTemporary) + { + ci.WriteSetting("NotOnList", clOwner, 1, DatabaseSettingType.Byte); + ci.WriteSetting("Delete", clOwner, 1, DatabaseSettingType.Byte); + } + + return ci; + } + catch (Exception ex) + { + /*QuickDebug qd = new QuickDebug(ex.Message + Environment.NewLine + ex.StackTrace); + qd.ShowDialog();*/ + MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace); + return null; + } + } + + public ContactInfo CheckForHandle(IntPtr hContact, string message) + { + Match m = Regexps.ReplyRegEx.Match(message); + if (m.Success) + { + string mainContact = SitesManager.GetContactSite(hContact).MainContact; + return GetContactInfo(mainContact, "#" + m.Groups["post"].Value); + } + + return null; + } + + public ContactInfo CheckForHandlePure(IntPtr hContact, string message) + { + Match m = Regexps.PureReplyRegEx.Match(message); + if (m.Success) + { + ISite site = SitesManager.GetContactSite(hContact); + string mainContact = site == null ? String.Empty : site.MainContact; + return GetContactInfo(mainContact, "#" + m.Groups["post"].Value); + } + + return null; + } + + public void ChangeForkState(IntPtr hContact, string name) + { + string mainContact = SitesManager.GetContactSite(hContact).MainContact; + ContactInfo result = GetContactInfo(mainContact, name); + if (result == null) + { + result = MakeFork(mainContact, name); + if (result != null) + CopyHistory(GetMainContactHandle(hContact), result.MirandaHandle, Regexps.GetHistoryRegEx(name)); + } + else + { + result.OpenMessageWindow(); + } + } + + private void AddToContact(IntPtr hContact) + { + MirandaContext.Current.CallService(API.MS_PROTO_ADDTOCONTACT, hContact, rootName); + } + + private bool IsOnContact(IntPtr hContact) + { + return Convert.ToBoolean(MirandaContext.Current.CallService(API.MS_PROTO_ISPROTOONCONTACT, hContact, rootName)); + } + + private void ChangeStatus(ContactInfo ci, StatusModes status) + { + try + { + ci.WriteSetting("Status", mpOwner, (UInt16)status, DatabaseSettingType.UInt16); + } + catch { } + } + + public void ClearContacts() + { + ContactContainer[] fk = forkContacts.ToArray(); + for (int i = 0, iCount = fk.Length; i < iCount; i++) + { + if (!IsAdditional(fk[i].Contact.UniqueID.ToString())) + { + fk[i].Contact.Delete(); + } + } + forkContacts.Clear(); + forkContacts = new List(); + } + + public void OnJuickClicked(object sender, ActionClickEvent e) + { + IntPtr hContact = ((ContactContainer) sender).Contact.MirandaHandle; + if (!e.AutoSend) + { + UnmanagedStringHandle str = new UnmanagedStringHandle(e.Action, StringEncoding.Ansi); + MirandaContext.Current.CallService(API.MS_MSG_SENDMESSAGE, hContact, str.IntPtr); + str.Free(); + } + else + { + if (e.Action.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase)) + { + Util.OpenURL(e.Action); + } + else if (e.Action.StartsWith("xJuick://", StringComparison.InvariantCultureIgnoreCase)) + { + InvokeOnAction(hContact, e.Action.Substring(9).ToLower()); + } + else + { + CSSData css = new CSSData(); + css.hContact = hContact; //juickContact.Contact.MirandaHandle; + css.szProtoService = API.PSS_MESSAGE; + css.wParam = IntPtr.Zero; + css.lParam = new UnmanagedStringHandle(e.Action, StringEncoding.Ansi).IntPtr; + + IntPtr cmdPtr = Marshal.AllocHGlobal(Marshal.SizeOf(css)); + Marshal.StructureToPtr(css, cmdPtr, false); + MirandaContext.Current.CallService(API.MS_PROTO_CALLCONTACTSERVICE, IntPtr.Zero, cmdPtr); + } + } + } + + public event EventHandler OnAction; + public void InvokeOnAction(IntPtr hContact, string action) + { + if (OnAction == null) + return; + OnAction(this, new ActionEvent(hContact, action)); + } + + public void Dispose() + { + for (int i = 0, iCount = forkContacts.Count; i < iCount; i++) + { + forkContacts[i].Dispose(); + } + } + } +} diff --git a/Speak/Speak/HPP/HistoryppHandler.cs b/Speak/Speak/HPP/HistoryppHandler.cs new file mode 100644 index 0000000..5bee66f --- /dev/null +++ b/Speak/Speak/HPP/HistoryppHandler.cs @@ -0,0 +1,708 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Speak.Core; +using Speak.Interop; +using Speak.RichEdit; +using Speak.Sites; +using Speak.Structs; +using Speak.UI; +using Speak.Utils; + +namespace Speak.HPP +{ + internal class HistoryppHandler : IMessageProcessor + { + private IntPtr wHandle; + private ISite site; + private Subclassing subclass; + private List btns; + private List avatars; + private Dictionary chachedRects; + + + private AvatarProcessor ap; + private ContextMenu context; + + private SimpleWordAction srmmNickAction; + private SimpleWordAction srmmNumberAction; + + private bool needRecalc; + private bool inRecalc; + private bool initialized; + private bool lazyInit; + + private static Guid IID_IOleObject = typeof(IOleObject).GUID; + + public HistoryppHandler(ISite site, IntPtr wHandle, bool lazyInit) + { + this.site = site; + Int32 hppVersion = MirandaContext.Current.CallService(API.MS_HPP_GETVERSION, IntPtr.Zero, IntPtr.Zero); + byte[] hppVBytes = BitConverter.GetBytes(hppVersion); + Version vHpp = new Version(hppVBytes[3], hppVBytes[2], hppVBytes[1], hppVBytes[0]); + if (vHpp < HppConstaints.MinumumVersion) + { + MessageBox.Show( + "You version of History++ plugin (" + vHpp.ToString() + ") is too old." + Environment.NewLine + + "Minimum supported version is " + HppConstaints.MinumumVersion.ToString() + Environment.NewLine + + "Links highlighting will be disabled", + "[xJuick] History++ version checking...", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + initialized = false; + return; + } + + needRecalc = inRecalc = false; + initialized = !lazyInit; + this.lazyInit = lazyInit; + this.wHandle = wHandle; + + if (initialized) + { + subclass = new Subclassing(wHandle); + subclass.StartSubclassing(WndProc); + } + + btns = new List(); + avatars = new List(); + chachedRects = new Dictionary(); + + srmmNickAction = Settings.Instance.SRMMNickAction; + srmmNumberAction = Settings.Instance.SRMMNumberAction; + + ap = new AvatarProcessor(site); + MakeContextMenu(); + } + + private void MakeContextMenu() + { + context = new ContextMenu(); + foreach (LinkButton lb in Settings.Instance.SRMMLinkButtons) + { + if (!lb.Enabled) + continue; + ActionMenuItem mi = new ActionMenuItem(lb); + //mi.Image = IconTable.GetActionIcon(lb.IconName); + mi.Click += ActionMenuClick; + context.MenuItems.Add(mi); + } + + ActionMenuItem contextAvatar = new ActionMenuItem(new LinkButton(String.Empty, String.Empty, false, LinkDisplayType.Image)); + context.MenuItems.Add(contextAvatar); + } + + public int WndProc(IntPtr hWnd, int Msg, int wParam, int lParam) + { + bool lmb = false; + switch (Msg) + { + case WinApi.WM_LBUTTONDBLCLK: + case WinApi.WM_LBUTTONDOWN: + case WinApi.WM_LBUTTONUP: + int x = Util.LoWord(lParam); + int y = Util.HiWord(lParam); + + for (int i = 0, iCount = btns.Count; i < iCount; i++) + { + HppActionOleObject btn = btns[i]; + RECT rect = chachedRects[btn.Owner].Rect; + if (rect.IsEmpty) + continue; + + if (btn.HitTest(x, y - rect.Top)) + { + if (Msg == WinApi.WM_LBUTTONDOWN) + { + btn.SetLMBDownState(); + } + else if (Msg == WinApi.WM_LBUTTONUP) + { + btn.SetLMBUpState(hWnd, rect.Top); + } + + lmb = true; + break; + } + } + break; + + } + + int result = 0; + if (!lmb) + result = subclass.CallParent(hWnd, Msg, wParam, lParam); + + switch (Msg) + { + case WinApi.WM_MOUSEMOVE: + int x = Util.LoWord(lParam); + int y = Util.HiWord(lParam); + + if (needRecalc) + { + RecalcRects(); + needRecalc = false; + } + + for (int i = 0, iCount = btns.Count; i < iCount; i++) + { + HppActionOleObject btn = btns[i]; + RECT rect = chachedRects[btn.Owner].Rect; + if (!rect.IsEmpty) + btn.MouseMoving(x, y - rect.Top); + } + + if (((wParam & WinApi.MK_CONTROL) == WinApi.MK_CONTROL) && Settings.Instance.ShowPreview) + { + foreach (KeyValuePair rect in chachedRects) + { + if (!rect.Value.Rect.IsEmpty) + { + if (y > rect.Value.Rect.Top && y < rect.Value.Rect.Bottom) + { + string url = GetCurrentURL(x - rect.Value.Rect.Left, y - rect.Value.Rect.Top, RichEditHelpers.GetIText(rect.Key), rect.Key); + if (!String.IsNullOrEmpty(url)) + { + POINT pt = new POINT(x, y); + WinApi.ClientToScreen(wHandle, ref pt); + ImagePreview.Show(pt.X, pt.Y + 10, url); + break; + } + else + { + ImagePreview.Hide(); + } + break; + } + } + } + } + else + { + ImagePreview.Hide(); + } + + break; + //case WinApi.WM_PAINT: + case WinApi.WM_VSCROLL: + case WinApi.WM_RESIZE: + needRecalc = true; + break; + } + + return result; + } + + public void SettingsChanged() + { + MakeContextMenu(); + } + + public void Update() + { + if (!initialized) + return; + } + + public void ShowThreads() + { + if (!initialized) + return; + } + + public void Avatars() + { + if (!initialized) + return; + // not supported + } + + private void ClearButtons(IntPtr oldOwner) + { + List newBtns = new List(); + for (int i = 0, iCount = btns.Count; i < iCount; i++) + { + if (btns[i].Owner != oldOwner) + newBtns.Add(btns[i]); + } + btns = newBtns; + + List newAvatars = new List(); + for (int i = 0, iCount = newAvatars.Count; i < iCount; i++) + { + if (avatars[i].Owner != oldOwner) + newAvatars.Add(avatars[i]); + } + avatars = newAvatars; + } + + private void RecalcRects() + { + inRecalc = true; + Dictionary newRects = new Dictionary(); + foreach (KeyValuePair rect in chachedRects) + { + IntPtr h = rect.Key; + RichEditInfo ri = RichEditHelpers.GetRichEditInfo(h, wHandle); + RECT r = ri.Rect; + + newRects.Add(h, ri); + + if (r.Top > 0) + { + SetActionObjectPosition(h, true); + } + else if (r.Bottom > 0 /*&& !rect.Value.Equals(r)*/) + { + SetActionObjectPosition(h, true); + } + } + + for (int i = 0, iCount = avatars.Count; i < iCount; i++) + { + avatars[i].BgColor = newRects[avatars[i].Owner].BgColor; + } + + chachedRects = newRects; + inRecalc = false; + } + + public void ProcessHistoryItem(IntPtr smallHandle, ItemRenderDetails ird) + { + if (lazyInit) + { + LogHandler currentLog; + wHandle = LogWindow.FindRealLogWindow(wHandle, Settings.CurrentLog, ird.hContact, out currentLog); + if (wHandle != IntPtr.Zero) + { + subclass = new Subclassing(wHandle); + subclass.StartSubclassing(WndProc); + initialized = true; + } + lazyInit = false; + } + + if (!initialized) + return; + + IRichEditOle richEditOle = RichEditHelpers.SendMessage(smallHandle, REConstants.EM_GETOLEINTERFACE, 0); + ITextDocument itr = RichEditHelpers.GetIText(smallHandle); + + if (!inRecalc) + { + if (chachedRects.ContainsKey(smallHandle)) + ClearButtons(smallHandle); + chachedRects[smallHandle] = RichEditInfo.Empty; + } + + if (itr != null) + Routine(itr, richEditOle, smallHandle); + + needRecalc = true; + + return; + } + + private string GetRichEditText(ITextDocument richEdit) + { + string text = richEdit.Range(0, Int32.MaxValue).Text; + if (String.IsNullOrEmpty(text)) + return String.Empty; + + return text; + } + + private void Routine(ITextDocument richEdit, IRichEditOle ole, IntPtr handle) + { + string text = GetRichEditText(richEdit); + + bool readOnly = (WinApi.GetWindowLong(handle, WinApi.GWL_STYLE) & REConstants.ES_READONLY) != 0; + if (readOnly) + WinApi.SendMessage(handle, REConstants.EM_SETREADONLY, 0, 0); + + richEdit.Freeze(); + // posts/comments + Match m = site.NumRegex.Match(text); + while (m.Success) + { + string victimWord = m.Groups["full"].Value; + ActionWordType actionWord = !String.IsNullOrEmpty(m.Groups["cmnt"].Value) + ? ActionWordType.Comments + : ActionWordType.Post; + + + int selStart = text.IndexOf(victimWord); + bool correctID = true; + + if (victimWord.Length < 3) + correctID = false; + + // fucking urls + if (correctID && victimWord.Length < 5) + { + richEdit.Selection.Start = selStart; + richEdit.Selection.End = selStart + 1; + CHARFORMAT2_STRUCT cf = new CHARFORMAT2_STRUCT(); + cf.cbSize = (UInt32)Marshal.SizeOf(cf); + cf.szFaceName = new char[32]; + + IntPtr wpar = new IntPtr(REConstants.SCF_SELECTION); + IntPtr lpar = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf)); + Marshal.StructureToPtr(cf, lpar, false); + + new IntPtr(WinApi.SendMessage(handle, REConstants.EM_GETCHARFORMAT, wpar, lpar)); + + cf = (CHARFORMAT2_STRUCT)Marshal.PtrToStructure(lpar, typeof(CHARFORMAT2_STRUCT)); + + if ( + ((cf.dwMask & REConstants.CFM_LINK) == REConstants.CFM_LINK) && + ((cf.dwEffects & REConstants.CFE_LINK) == REConstants.CFE_LINK) + ) + { + correctID = false; + } + + Marshal.FreeCoTaskMem(lpar); + } + + if (correctID) + { + AddActionObject(richEdit, ole, handle, selStart, victimWord, actionWord); + text = GetRichEditText(richEdit); + } + + + m = m.NextMatch(); + } + + // JIDs + m = Regexps.JidRegEx.Match(text); + while (m.Success) + { + string victimWord = m.Groups["name"].Value; + + AddActionObject(richEdit, ole, handle, text.IndexOf(victimWord), victimWord, ActionWordType.Nick); + text = GetRichEditText(richEdit); + + m = m.NextMatch(); + } + + // @nicks + m = site.NameRegex.Match(text); + while (m.Success) + { + string victimWord = m.Groups["name"].Value; + ActionObjectType objectType = !String.IsNullOrEmpty(m.Groups["isFirst"].Value) ? ActionObjectType.FirstNick : ActionObjectType.Nick; + AddActionObject(richEdit, ole, handle, text.IndexOf(victimWord), victimWord, ActionWordType.Nick, objectType); + text = GetRichEditText(richEdit); + + m = m.NextMatch(); + } + richEdit.Unfreeze(); + + // avatars + if (Settings.Instance.ShowAvatars) + ShowAvatars(richEdit, ole, handle); + + if (readOnly) + WinApi.SendMessage(handle, REConstants.EM_SETREADONLY, 1, 0); + } + + private void ShowAvatars(ITextDocument richEdit, IRichEditOle richEditOle, IntPtr owner) + { + List> avatars = new List>(); + //Int32 lastLine = -1; + for (int i = 0, iCount = richEditOle.GetObjectCount(); i < iCount; i++) + { + REOBJECT reoObject = new REOBJECT(); + if (richEditOle.GetObject(i, reoObject, GETOBJECTOPTIONS.REO_GETOBJ_POLEOBJ) == 0) + { + if (reoObject.clsid == HppActionOleObject.Guid) + { + IntPtr iaolep; + Marshal.QueryInterface(reoObject.poleobj, ref IID_IOleObject, out iaolep); + + IActionOleObject iao = (IActionOleObject)Marshal.GetTypedObjectForIUnknown(iaolep, typeof(IActionOleObject)); + if (!iao.IsTailObjectSet && iao.ObjectType == ActionObjectType.FirstNick) + { + // select for yourself + //int lineIndex = WinApi.SendMessage(owner, REConstants.EM_EXLINEFROMCHAR, 0, reoObject.cp); + //int charOffset = reoObject.cp - WinApi.SendMessage(wHandle, REConstants.EM_LINEINDEX, lineIndex, 0); + //avatars.Add(new KeyValuePair(iao.Text.Substring(1), reoObject.cp + avatars.Count - (lastLine != lineIndex ? charOffset : 0))); + avatars.Add(new KeyValuePair(iao.Text.Substring(1), reoObject.cp + avatars.Count)); + //lastLine = lineIndex; + iao.IsTailObjectSet = true; + } + } + } + } + int offset = 0; + foreach (KeyValuePair ava in avatars) + { + int index = offset + ava.Value; + richEdit.Selection.Start = index; + richEdit.Selection.End = index; + RichEditHelpers.InsertControl(richEditOle, new HppAvatarObject(owner, wHandle, ap, ava.Key)); + richEdit.Range(index + 1, index + 1).Text = " "; + offset += 1; + } + ap.Process(); + needRecalc = true; + } + + // well. it's not supported yet, since I dunno how to invalidate hpp window + private void DeleteAvatars(ITextDocument richEdit, IRichEditOle richEditOle) + { + for (int i = 0, iCount = richEditOle.GetObjectCount(); i < iCount; i++) + { + REOBJECT reoObject = new REOBJECT(); + if (richEditOle.GetObject(i, reoObject, GETOBJECTOPTIONS.REO_GETOBJ_POLEOBJ) == 0) + { + if (reoObject.clsid == AvatarObject.Guid) + { + richEdit.Range(reoObject.cp, reoObject.cp + 2).Text = ""; + } + } + } + + for (int i = 0, iCount = btns.Count; i < iCount; i++) + { + if (btns[i].ObjectType == ActionObjectType.FirstNick) + btns[i].IsTailObjectSet = false; + } + } + + private void AddActionObject(ITextDocument richEdit, IRichEditOle ole, IntPtr owner, int selStart, string fullWord, ActionWordType actionType) + { + AddActionObject(richEdit, ole, owner, selStart, fullWord, actionType, ActionObjectType.Default); + } + + private void AddActionObject(ITextDocument richEdit, IRichEditOle ole, IntPtr owner, int selStart, string fullWord, ActionWordType actionType, ActionObjectType objectType) + { + richEdit.Selection.Start = selStart; + richEdit.Selection.End = selStart + fullWord.Length; + + HppActionOleObject aoo = new HppActionOleObject(); + aoo.ObjectType = objectType; + aoo.ActionType = actionType; + aoo.Owner = owner; + aoo.MainHandle = wHandle; + aoo.Left = 0; + aoo.ActionClicked += actionObject_JuickClicked; + aoo.Font = new Font(richEdit.Selection.Font.Name, richEdit.Selection.Font.Size); + aoo.ForeColor = ColorTranslator.FromWin32(richEdit.Selection.Font.ForeColor); + aoo.Text = fullWord; + + btns.Add(aoo); + RichEditHelpers.InsertControl(ole, aoo); + } + + private void SetActionObjectPosition(IntPtr owner, bool redraw) + { + IRichEditOle ole = RichEditHelpers.SendMessage(owner, REConstants.EM_GETOLEINTERFACE, 0); + ITextDocument richEdit = RichEditHelpers.GetIText(owner); + if (richEdit == null) + return; + + ITextRange range = richEdit.Range(0, Int32.MaxValue); + for (int i = 0, iCount = ole.GetObjectCount(); i < iCount; i++) + { + REOBJECT reoObject = new REOBJECT(); + if (ole.GetObject(i, reoObject, GETOBJECTOPTIONS.REO_GETOBJ_POLEOBJ) == 0) + { + bool isButton = reoObject.clsid == HppActionOleObject.Guid; + if ((isButton) || (Settings.Instance.ShowAvatars && reoObject.clsid == HppAvatarObject.Guid)) + { + int x; + int y; + range.SetRange(reoObject.cp, reoObject.cp); + range.GetPoint(REConstants.TomStart | REConstants.TA_LEFT | REConstants.TA_BOTTOM, out x, out y); + + + IntPtr iaolep; + Marshal.QueryInterface(reoObject.poleobj, ref IID_IOleObject, out iaolep); + + IActionOleObject iao = (IActionOleObject)Marshal.GetTypedObjectForIUnknown(iaolep, typeof(IActionOleObject)); + + POINT stc = new POINT(x, y); + WinApi.ScreenToClient(owner, ref stc); + iao.Left = stc.X; + iao.Bottom = stc.Y; + if (redraw) + { + if (isButton) + { + ((HppActionOleObject) iao).Draw(); + ((HppActionOleObject) iao).Drawn = false; + } + /* + else + { + HppAvatarObject avo = (HppAvatarObject)iao; + if (!avo.Drawn && avo.Ready) + avo.Draw(); + } + */ + } + } + } + } + } + + private void ActionMenuClick(object sender, EventArgs e) + { + ActionMenuItem mi = (ActionMenuItem)sender; + InvokeJuick(new ActionClickEvent(mi.Action, mi.AutoSend)); + } + + private void actionObject_JuickClicked(object sender, ActionObjectClickEvent e) + { + ActionWordType actionWord = e.ActionType; + if (e.MenuLocation != Point.Empty) + { + if (actionWord == ActionWordType.None) + return; + + for (int i = 0, iCount = context.MenuItems.Count; i < iCount; i++) + { + ActionMenuItem btn = (ActionMenuItem)context.MenuItems[i]; + btn.MainWord = e.ActionText; + if (btn.DisplayType != LinkDisplayType.Always) + { + if ( + (btn.DisplayType == LinkDisplayType.Comments && actionWord != ActionWordType.Comments) || + (btn.DisplayType == LinkDisplayType.Posts && actionWord != ActionWordType.Post) || + (btn.DisplayType == LinkDisplayType.Nicks && actionWord != ActionWordType.Nick) + ) + { + btn.Visible = false; + continue; + } + } + + if (btn.DisplayType == LinkDisplayType.Image) + { + if (Settings.Instance.ShowContextAvatars) + { + string avatarPath = ap.GetUserAvatar(btn.MainWord.Substring(1), null); + if (String.IsNullOrEmpty(avatarPath)) + { + ap.Process(); + btn.Visible = false; + continue; + } + else + { + btn.Image = Image.FromFile(avatarPath); + } + } + else + { + btn.Visible = false; + continue; + } + } + + Match m = site.NumRegex.Match(btn.MainWord); + if (m.Success) + { + if (!String.IsNullOrEmpty(m.Groups["cmnt"].Value)) + { + btn.AdditionalWord = m.Groups["full"].Value; + btn.MainWord = m.Groups["post"].Value; + } + } + + btn.Visible = true; + continue; + } + context.Show(sender as Control, e.MenuLocation); + } + else + { + if (actionWord == ActionWordType.Nick) + InvokeJuick(new ActionClickEvent(srmmNickAction.Action.Replace("%NICK%", e.ActionText), srmmNickAction.Autosend)); + else if (actionWord == ActionWordType.Post || actionWord == ActionWordType.Comments) + InvokeJuick(new ActionClickEvent(srmmNumberAction.Action.Replace("%NUMBER%", e.ActionText), srmmNumberAction.Autosend)); + } + } + + private string GetCurrentURL(int x, int y, ITextDocument richEdit, IntPtr handle) + { + POINTL pointl = new POINTL(x, y); + Subclassing.SetLastError(0); + int charIndex = WinApi.SendMessage(handle, REConstants.EM_CHARFROMPOS, 0, ref pointl); + int err = Marshal.GetLastWin32Error(); + if (err != 0 && err != 6) + return String.Empty; + + if (charIndex <= 0) + return null; + int lineIndex = WinApi.SendMessage(handle, REConstants.EM_EXLINEFROMCHAR, 0, charIndex); + int charOffset = charIndex - WinApi.SendMessage(handle, REConstants.EM_LINEINDEX, lineIndex, 0); + int len = WinApi.SendMessage(handle, REConstants.EM_LINELENGTH, charIndex, 0); + + string line = richEdit.Range(charIndex - charOffset, (charIndex - charOffset) + len).Text; + + if (String.IsNullOrEmpty(line)) + return null; + + if (charOffset == len) + return null; + + string result = String.Empty; + int i = charOffset - 1; + int j = charOffset - 1; + try + { + + while (i >= 0 && line[i] != ' ') + { + i--; + } + i = i + 1; + + if (j == -1) + return null; + while (j < len && line[j] != ' ') + { + j++; + } + + if (j < i) + return null; + + result = line.Substring(i, j - i).Trim(); + if (result.IndexOf("http://") != -1) + { + return result; + } + } + catch { return String.Empty; } + + return String.Empty; + } + + public event EventHandler JuickClicked; + private void InvokeJuick(ActionClickEvent e) + { + EventHandler handler = JuickClicked; + if (handler != null) handler(this, e); + } + + public void Dispose() + { + if (subclass != null) + { + subclass.StopSubclass(); + subclass.Dispose(); + } + } + } +} diff --git a/Speak/Speak/HPP/HppActionOleObject.cs b/Speak/Speak/HPP/HppActionOleObject.cs new file mode 100644 index 0000000..7b90e78 --- /dev/null +++ b/Speak/Speak/HPP/HppActionOleObject.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using Speak.Interop; +using Speak.RichEdit; +using Speak.Structs; + +namespace Speak.HPP +{ + [Guid("f16cc4c1-ea72-4777-9205-892fd50bf6e5")] + internal class HppActionOleObject: ActionOleObject + { + private IntPtr owner; + private IntPtr mainHandle; + private bool drawn; + new public static readonly Guid Guid = new Guid("f16cc4c1-ea72-4777-9205-892fd50bf6e5"); + + internal void Draw() + { + TFVCNDATA_NMHDR mh = new TFVCNDATA_NMHDR(); + mh.cbSize = Marshal.SizeOf(mh); + mh.handleFrom = owner; // "mini" RE handle + mh.code = HppConstaints.NM_FIREVIEWCHANGE; + mh.bEvent = HppConstaints.FVCN_PREFIRE; + mh.bAction = HppConstaints.FVCA_DRAW; + mh.rcRect = new RECT(Left, Top, Right, Bottom); + mh.lparam = IntPtr.Zero; + + IntPtr cmd = Marshal.AllocHGlobal(Marshal.SizeOf(mh)); + Marshal.StructureToPtr(mh, cmd, false); + + WinApi.SendMessage(mainHandle, WinApi.WM_NOTIFY, owner, cmd); + + mh = (TFVCNDATA_NMHDR)Marshal.PtrToStructure(cmd, typeof(TFVCNDATA_NMHDR)); + + if (mh.bAction == HppConstaints.FVCA_CUSTOMDRAW && mh.hDC != IntPtr.Zero) + { + BackColor = mh.clrBackground.GetColor(); + Rectangle rect = new Rectangle(Left, Top, Right - Left, Bottom - Top); + + Graphics g = Graphics.FromHdc(mh.hDC); + DrawBackground(g, rect); + Draw(g, Left); + g.Dispose(); + + mh.bEvent = HppConstaints.FVCN_POSTFIRE; + cmd = Marshal.AllocHGlobal(Marshal.SizeOf(mh)); + Marshal.StructureToPtr(mh, cmd, false); + WinApi.SendMessage(mainHandle, WinApi.WM_NOTIFY, owner, cmd); + drawn = true; + } + } + + private void Draw(Graphics g, int leftOffset) + { + TextRenderer.DrawText( + g, Text, Font, + onControl ? new Point(leftOffset + 1, Top + (Height - textSize.Height) / 2) : new Point(leftOffset + 1, Top + Height - textSize.Height), + onControl ? hoverForeColor : ForeColor, TextFormatFlags.Default); + + + /*using (Bitmap bm = Properties.Resources.power) + { + g.DrawImage(bm, leftOffset + Width - iconWidth, Top + ((Height - iconHeight) / 2) + 1); + }*/ + } + + private void DrawBackground(Graphics g, Rectangle rect) + { + Rectangle activePart = rect; + switch (currentHover) + { + case HoverPart.None: + break; + case HoverPart.MainWord: + //activePart = new Rectangle(0, 0, textSize.Width, Height - 1); + activePart = new Rectangle(rect.Left, rect.Top, textSize.Width, rect.Height - 1); + break; + case HoverPart.Icon: + activePart = new Rectangle(rect.Left + textSize.Width, rect.Top, iconWidth-1, Height-1); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + using (SolidBrush b = new SolidBrush(BackColor)) + { + g.FillRectangle(b, rect); + } + + if (onControl) + { + using (SolidBrush b = new SolidBrush(hoverBackColor)) + { + g.FillRectangle(b, activePart); + } + + using (Pen p = new Pen(borderColor, 1.0f)) + { + g.DrawRectangle(p, activePart); + } + + Rectangle border = new Rectangle(rect.Location, new Size(rect.Width-1, rect.Height-1)); + using (Pen p = new Pen(borderColor, 1.0f)) + { + g.DrawRectangle(p, border); + } + + } + } + + protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) + { + if (!drawn) + { + base.OnPaint(e); + drawn = true; + } + } + + public bool Drawn + { + get { return drawn; } + set { drawn = value; } + } + + protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs pevent) + { + //base.OnPaintBackground(pevent); + } + + protected override void Invalidate() + { + Draw(); + } + + public IntPtr Owner + { + get { return owner; } + set { owner = value; } + } + + public IntPtr MainHandle + { + get { return mainHandle; } + set { mainHandle = value; } + } + + new public Guid GUID + { + get { return Guid; } + } + } +} diff --git a/Speak/Speak/HPP/HppAvatarObject.cs b/Speak/Speak/HPP/HppAvatarObject.cs new file mode 100644 index 0000000..3423f34 --- /dev/null +++ b/Speak/Speak/HPP/HppAvatarObject.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Runtime.InteropServices; +using Speak.Core; +using Speak.Interop; +using Speak.RichEdit; +using Speak.Structs; + +namespace Speak.HPP +{ + // бляяя.... + [Guid("04175c1c-6ab3-4688-837a-6b478fc64b65")] + internal class HppAvatarObject : AvatarObject, IActionOleGUID, IActionOleObject + { + private bool drawn; + private bool drawnInternal; + private volatile bool gotBottom; + private IntPtr owner; + private IntPtr mainHandle; + new public static readonly Guid Guid = new Guid("04175c1c-6ab3-4688-837a-6b478fc64b65"); + + public HppAvatarObject(IntPtr owner, IntPtr mainHandle, AvatarProcessor ap, string key) : base(ap, key, Color.Pink) + { + drawn = false; + Width = Height = 32; + this.mainHandle = mainHandle; + this.owner = owner; + } + + internal void Draw() + { + //if (!gotBottom) + // return; + + TFVCNDATA_NMHDR mh = new TFVCNDATA_NMHDR(); + mh.cbSize = Marshal.SizeOf(mh); + mh.handleFrom = owner; // "mini" RE handle + mh.code = HppConstaints.NM_FIREVIEWCHANGE; + mh.bEvent = HppConstaints.FVCN_PREFIRE; + mh.bAction = HppConstaints.FVCA_DRAW; + mh.rcRect = new RECT(Left, Top, Right, Bottom); + mh.lparam = IntPtr.Zero; + + IntPtr cmd = Marshal.AllocHGlobal(Marshal.SizeOf(mh)); + Marshal.StructureToPtr(mh, cmd, false); + + WinApi.SendMessage(mainHandle, WinApi.WM_NOTIFY, owner, cmd); + + mh = (TFVCNDATA_NMHDR)Marshal.PtrToStructure(cmd, typeof(TFVCNDATA_NMHDR)); + + if (mh.bAction == HppConstaints.FVCA_CUSTOMDRAW && mh.hDC != IntPtr.Zero) + { + Graphics g = Graphics.FromHdc(mh.hDC); + g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; + g.DrawImage(image, Left, Top, Width, Height); + g.Dispose(); + + mh.bEvent = HppConstaints.FVCN_POSTFIRE; + cmd = Marshal.AllocHGlobal(Marshal.SizeOf(mh)); + Marshal.StructureToPtr(mh, cmd, false); + WinApi.SendMessage(mainHandle, WinApi.WM_NOTIFY, owner, cmd); + drawn = true; + } + } + + public override void AvatarCallback(string userName, string avatarPath) + { + drawnInternal = false; + image = Image.FromFile(avatarPath); + if (gotBottom) + Draw(); + } + + protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) + { + if (!drawnInternal && Ready) + { + base.OnPaint(e); + drawnInternal = true; + } + } + + protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs pevent) + { + //base.OnPaintBackground(pevent); + } + + protected override void Invalidate() + { + //Draw(); + } + + public bool Ready + { + get { return image != null; } + } + + public bool Drawn + { + get { return drawn; } + } + + public Color BgColor + { + get + { + return BackColor; + + } + + set + { + drawn = false; + BackColor = value; + Invalidate(); + } + } + + public IntPtr Owner + { + get { return owner; } + } + + new public Guid GUID + { + get { return Guid; } + } + + new public int Bottom + { + set + { + Top = value - Height; + gotBottom = true; + if (Ready) + Draw(); + } + get { return base.Bottom; } + } + + public ActionObjectType ObjectType + { + get { return ActionObjectType.Default; } + set { } + } + + public bool IsTailObjectSet + { + get { return true; } + set { } + } + + public bool HitTest(int x, int y) + { + return false; + } + + public void MouseMoving(int x, int y) + { + + } + + public void SetLMBDownState() + { + + } + + public void SetLMBUpState(IntPtr richEditHwnd, int topOffset) + { + + } + + public ActionWordType ActionType + { + get { return ActionWordType.None; } + set { } + } + } +} diff --git a/Speak/Speak/Interfaces/HTMLDispIDs.cs b/Speak/Speak/Interfaces/HTMLDispIDs.cs new file mode 100644 index 0000000..bb14dec --- /dev/null +++ b/Speak/Speak/Interfaces/HTMLDispIDs.cs @@ -0,0 +1,1927 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Speak.Interfaces +{ + public sealed class HTMLDispIDs + { + //useful DISPIDs + public const int DISPID_UNKNOWN = -1; + + //The original value -2147418111 was incorrect + //0x80010000 = -2147418112 = &H80010000 + public const int DISPID_XOBJ_MIN = -2147418112; + + //0x8001FFFF + public const int DISPID_XOBJ_MAX = -2147352577; + public const int DISPID_XOBJ_BASE = DISPID_XOBJ_MIN; + public const int DISPID_HTMLOBJECT = (DISPID_XOBJ_BASE + 500); + public const int DISPID_ELEMENT = (DISPID_HTMLOBJECT + 500); + public const int DISPID_SITE = (DISPID_ELEMENT + 1000); + public const int DISPID_OBJECT = (DISPID_SITE + 1000); + public const int DISPID_STYLE = (DISPID_OBJECT + 1000); + public const int DISPID_ATTRS = (DISPID_STYLE + 1000); + public const int DISPID_EVENTS = (DISPID_ATTRS + 1000); + public const int DISPID_XOBJ_EXPANDO = (DISPID_EVENTS + 1000); + public const int DISPID_XOBJ_ORDINAL = (DISPID_XOBJ_EXPANDO + 1000); + + public const int DISPID_AMBIENT_DLCONTROL = -5512; + + public const int STDDISPID_XOBJ_ONBLUR = (DISPID_XOBJ_BASE); + public const int STDDISPID_XOBJ_ONFOCUS = (DISPID_XOBJ_BASE + 1); + public const int STDDISPID_XOBJ_BEFOREUPDATE = (DISPID_XOBJ_BASE + 4); + public const int STDDISPID_XOBJ_AFTERUPDATE = (DISPID_XOBJ_BASE + 5); + public const int STDDISPID_XOBJ_ONROWEXIT = (DISPID_XOBJ_BASE + 6); + public const int STDDISPID_XOBJ_ONROWENTER = (DISPID_XOBJ_BASE + 7); + public const int STDDISPID_XOBJ_ONMOUSEOVER = (DISPID_XOBJ_BASE + 8); + public const int STDDISPID_XOBJ_ONMOUSEOUT = (DISPID_XOBJ_BASE + 9); + public const int STDDISPID_XOBJ_ONHELP = (DISPID_XOBJ_BASE + 10); + public const int STDDISPID_XOBJ_ONDRAGSTART = (DISPID_XOBJ_BASE + 11); + public const int STDDISPID_XOBJ_ONSELECTSTART = (DISPID_XOBJ_BASE + 12); + public const int STDDISPID_XOBJ_ERRORUPDATE = (DISPID_XOBJ_BASE + 13); + public const int STDDISPID_XOBJ_ONDATASETCHANGED = (DISPID_XOBJ_BASE + 14); + public const int STDDISPID_XOBJ_ONDATAAVAILABLE = (DISPID_XOBJ_BASE + 15); + public const int STDDISPID_XOBJ_ONDATASETCOMPLETE = (DISPID_XOBJ_BASE + 16); + public const int STDDISPID_XOBJ_ONFILTER = (DISPID_XOBJ_BASE + 17); + public const int STDDISPID_XOBJ_ONLOSECAPTURE = (DISPID_XOBJ_BASE + 18); + public const int STDDISPID_XOBJ_ONPROPERTYCHANGE = (DISPID_XOBJ_BASE + 19); + public const int STDDISPID_XOBJ_ONDRAG = (DISPID_XOBJ_BASE + 20); + public const int STDDISPID_XOBJ_ONDRAGEND = (DISPID_XOBJ_BASE + 21); + public const int STDDISPID_XOBJ_ONDRAGENTER = (DISPID_XOBJ_BASE + 22); + public const int STDDISPID_XOBJ_ONDRAGOVER = (DISPID_XOBJ_BASE + 23); + public const int STDDISPID_XOBJ_ONDRAGLEAVE = (DISPID_XOBJ_BASE + 24); + public const int STDDISPID_XOBJ_ONDROP = (DISPID_XOBJ_BASE + 25); + public const int STDDISPID_XOBJ_ONCUT = (DISPID_XOBJ_BASE + 26); + public const int STDDISPID_XOBJ_ONCOPY = (DISPID_XOBJ_BASE + 27); + public const int STDDISPID_XOBJ_ONPASTE = (DISPID_XOBJ_BASE + 28); + public const int STDDISPID_XOBJ_ONBEFORECUT = (DISPID_XOBJ_BASE + 29); + public const int STDDISPID_XOBJ_ONBEFORECOPY = (DISPID_XOBJ_BASE + 30); + public const int STDDISPID_XOBJ_ONBEFOREPASTE = (DISPID_XOBJ_BASE + 31); + public const int STDDISPID_XOBJ_ONROWSDELETE = (DISPID_XOBJ_BASE + 32); + public const int STDDISPID_XOBJ_ONROWSINSERTED = (DISPID_XOBJ_BASE + 33); + public const int STDDISPID_XOBJ_ONCELLCHANGE = (DISPID_XOBJ_BASE + 34); + public const int STDPROPID_XOBJ_DISABLED = (DISPID_XOBJ_BASE + 0x4C); //+76 + public const int DISPID_DEFAULTVALUE = (DISPID_A_FIRST + 83); + + public const int DISPID_CLICK = (-600); + public const int DISPID_DBLCLICK = (-601); + public const int DISPID_KEYDOWN = (-602); + public const int DISPID_KEYPRESS = (-603); + public const int DISPID_KEYUP = (-604); + public const int DISPID_MOUSEDOWN = (-605); + public const int DISPID_MOUSEMOVE = (-606); + public const int DISPID_MOUSEUP = (-607); + public const int DISPID_ERROREVENT = (-608); + public const int DISPID_READYSTATECHANGE = (-609); + public const int DISPID_CLICK_VALUE = (-610); + public const int DISPID_RIGHTTOLEFT = (-611); + public const int DISPID_TOPTOBOTTOM = (-612); + public const int DISPID_THIS = (-613); + + // Standard dispatch ID constants + + public const int DISPID_AUTOSIZE = (-500); + public const int DISPID_BACKCOLOR = (-501); + public const int DISPID_BACKSTYLE = (-502); + public const int DISPID_BORDERCOLOR = (-503); + public const int DISPID_BORDERSTYLE = (-504); + public const int DISPID_BORDERWIDTH = (-505); + public const int DISPID_DRAWMODE = (-507); + public const int DISPID_DRAWSTYLE = (-508); + public const int DISPID_DRAWWIDTH = (-509); + public const int DISPID_FILLCOLOR = (-510); + public const int DISPID_FILLSTYLE = (-511); + public const int DISPID_FONT = (-512); + public const int DISPID_FORECOLOR = (-513); + public const int DISPID_ENABLED = (-514); + public const int DISPID_HWND = (-515); + public const int DISPID_TABSTOP = (-516); + public const int DISPID_TEXT = (-517); + public const int DISPID_CAPTION = (-518); + public const int DISPID_BORDERVISIBLE = (-519); + public const int DISPID_APPEARANCE = (-520); + public const int DISPID_MOUSEPOINTER = (-521); + public const int DISPID_MOUSEICON = (-522); + public const int DISPID_PICTURE = (-523); + public const int DISPID_VALID = (-524); + public const int DISPID_READYSTATE = (-525); + public const int DISPID_LISTINDEX = (-526); + public const int DISPID_SELECTED = (-527); + public const int DISPID_LIST = (-528); + public const int DISPID_COLUMN = (-529); + public const int DISPID_LISTCOUNT = (-531); + public const int DISPID_MULTISELECT = (-532); + public const int DISPID_MAXLENGTH = (-533); + public const int DISPID_PASSWORDCHAR = (-534); + public const int DISPID_SCROLLBARS = (-535); + public const int DISPID_WORDWRAP = (-536); + public const int DISPID_MULTILINE = (-537); + public const int DISPID_NUMBEROFROWS = (-538); + public const int DISPID_NUMBEROFCOLUMNS = (-539); + public const int DISPID_DISPLAYSTYLE = (-540); + public const int DISPID_GROUPNAME = (-541); + public const int DISPID_IMEMODE = (-542); + public const int DISPID_ACCELERATOR = (-543); + public const int DISPID_ENTERKEYBEHAVIOR = (-544); + public const int DISPID_TABKEYBEHAVIOR = (-545); + public const int DISPID_SELTEXT = (-546); + public const int DISPID_SELSTART = (-547); + public const int DISPID_SELLENGTH = (-548); + + public const int DISPID_AMBIENT_CODEPAGE = (-725); + public const int DISPID_AMBIENT_CHARSET = (-727); + + public const int DISPID_REFRESH = (-550); + public const int DISPID_DOCLICK = (-551); + public const int DISPID_ABOUTBOX = (-552); + public const int DISPID_ADDITEM = (-553); + public const int DISPID_CLEAR = (-554); + public const int DISPID_REMOVEITEM = (-555); + public const int DISPID_NORMAL_FIRST = 1000; + + public const int DISPID_ONABORT = (DISPID_NORMAL_FIRST); + public const int DISPID_ONCHANGE = (DISPID_NORMAL_FIRST + 1); + public const int DISPID_ONERROR = (DISPID_NORMAL_FIRST + 2); + public const int DISPID_ONLOAD = (DISPID_NORMAL_FIRST + 3); + public const int DISPID_ONSELECT = (DISPID_NORMAL_FIRST + 6); + public const int DISPID_ONSUBMIT = (DISPID_NORMAL_FIRST + 7); + public const int DISPID_ONUNLOAD = (DISPID_NORMAL_FIRST + 8); + public const int DISPID_ONBOUNCE = (DISPID_NORMAL_FIRST + 9); + public const int DISPID_ONFINISH = (DISPID_NORMAL_FIRST + 10); + public const int DISPID_ONSTART = (DISPID_NORMAL_FIRST + 11); + public const int DISPID_ONLAYOUT = (DISPID_NORMAL_FIRST + 13); + public const int DISPID_ONSCROLL = (DISPID_NORMAL_FIRST + 14); + public const int DISPID_ONRESET = (DISPID_NORMAL_FIRST + 15); + public const int DISPID_ONRESIZE = (DISPID_NORMAL_FIRST + 16); + public const int DISPID_ONBEFOREUNLOAD = (DISPID_NORMAL_FIRST + 17); + public const int DISPID_ONCHANGEFOCUS = (DISPID_NORMAL_FIRST + 18); + public const int DISPID_ONCHANGEBLUR = (DISPID_NORMAL_FIRST + 19); + public const int DISPID_ONPERSIST = (DISPID_NORMAL_FIRST + 20); + public const int DISPID_ONPERSISTSAVE = (DISPID_NORMAL_FIRST + 21); + public const int DISPID_ONPERSISTLOAD = (DISPID_NORMAL_FIRST + 22); + public const int DISPID_ONCONTEXTMENU = (DISPID_NORMAL_FIRST + 23); + public const int DISPID_ONBEFOREPRINT = (DISPID_NORMAL_FIRST + 24); + public const int DISPID_ONAFTERPRINT = (DISPID_NORMAL_FIRST + 25); + public const int DISPID_ONSTOP = (DISPID_NORMAL_FIRST + 26); + public const int DISPID_ONBEFOREEDITFOCUS = (DISPID_NORMAL_FIRST + 27); + public const int DISPID_ONMOUSEHOVER = (DISPID_NORMAL_FIRST + 28); + public const int DISPID_ONCONTENTREADY = (DISPID_NORMAL_FIRST + 29); + public const int DISPID_ONLAYOUTCOMPLETE = (DISPID_NORMAL_FIRST + 30); + public const int DISPID_ONPAGE = (DISPID_NORMAL_FIRST + 31); + public const int DISPID_ONLINKEDOVERFLOW = (DISPID_NORMAL_FIRST + 32); + public const int DISPID_ONMOUSEWHEEL = (DISPID_NORMAL_FIRST + 33); + public const int DISPID_ONBEFOREDEACTIVATE = (DISPID_NORMAL_FIRST + 34); + public const int DISPID_ONMOVE = (DISPID_NORMAL_FIRST + 35); + public const int DISPID_ONCONTROLSELECT = (DISPID_NORMAL_FIRST + 36); + public const int DISPID_ONSELECTIONCHANGE = (DISPID_NORMAL_FIRST + 37); + public const int DISPID_ONMOVESTART = (DISPID_NORMAL_FIRST + 38); + public const int DISPID_ONMOVEEND = (DISPID_NORMAL_FIRST + 39); + public const int DISPID_ONRESIZESTART = (DISPID_NORMAL_FIRST + 40); + public const int DISPID_ONRESIZEEND = (DISPID_NORMAL_FIRST + 41); + public const int DISPID_ONMOUSEENTER = (DISPID_NORMAL_FIRST + 42); + public const int DISPID_ONMOUSELEAVE = (DISPID_NORMAL_FIRST + 43); + public const int DISPID_ONACTIVATE = (DISPID_NORMAL_FIRST + 44); + public const int DISPID_ONDEACTIVATE = (DISPID_NORMAL_FIRST + 45); + public const int DISPID_ONMULTILAYOUTCLEANUP = (DISPID_NORMAL_FIRST + 46); + public const int DISPID_ONBEFOREACTIVATE = (DISPID_NORMAL_FIRST + 47); + public const int DISPID_ONFOCUSIN = (DISPID_NORMAL_FIRST + 48); + public const int DISPID_ONFOCUSOUT = (DISPID_NORMAL_FIRST + 49); + + public const int DISPID_A_UNICODEBIDI = (DISPID_A_FIRST + 118); // Complex Text support for CSS2 unicode-bidi + public const int DISPID_A_DIRECTION = (DISPID_A_FIRST + 119); // Complex Text support for CSS2 direction + + public const int DISPID_EVPROP_ONMOUSEOVER = (DISPID_EVENTS + 0); + public const int DISPID_EVMETH_ONMOUSEOVER = STDDISPID_XOBJ_ONMOUSEOVER; + public const int DISPID_EVPROP_ONMOUSEOUT = (DISPID_EVENTS + 1); + public const int DISPID_EVMETH_ONMOUSEOUT = STDDISPID_XOBJ_ONMOUSEOUT; + public const int DISPID_EVPROP_ONMOUSEDOWN = (DISPID_EVENTS + 2); + public const int DISPID_EVMETH_ONMOUSEDOWN = DISPID_MOUSEDOWN; + public const int DISPID_EVPROP_ONMOUSEUP = (DISPID_EVENTS + 3); + public const int DISPID_EVMETH_ONMOUSEUP = DISPID_MOUSEUP; + public const int DISPID_EVPROP_ONMOUSEMOVE = (DISPID_EVENTS + 4); + public const int DISPID_EVMETH_ONMOUSEMOVE = DISPID_MOUSEMOVE; + public const int DISPID_EVPROP_ONKEYDOWN = (DISPID_EVENTS + 5); + public const int DISPID_EVMETH_ONKEYDOWN = DISPID_KEYDOWN; + public const int DISPID_EVPROP_ONKEYUP = (DISPID_EVENTS + 6); + public const int DISPID_EVMETH_ONKEYUP = DISPID_KEYUP; + public const int DISPID_EVPROP_ONKEYPRESS = (DISPID_EVENTS + 7); + public const int DISPID_EVMETH_ONKEYPRESS = DISPID_KEYPRESS; + public const int DISPID_EVPROP_ONCLICK = (DISPID_EVENTS + 8); + public const int DISPID_EVMETH_ONCLICK = DISPID_CLICK; + public const int DISPID_EVPROP_ONDBLCLICK = (DISPID_EVENTS + 9); + public const int DISPID_EVMETH_ONDBLCLICK = DISPID_DBLCLICK; + public const int DISPID_EVPROP_ONSELECT = (DISPID_EVENTS + 10); + public const int DISPID_EVMETH_ONSELECT = DISPID_ONSELECT; + public const int DISPID_EVPROP_ONSUBMIT = (DISPID_EVENTS + 11); + public const int DISPID_EVMETH_ONSUBMIT = DISPID_ONSUBMIT; + public const int DISPID_EVPROP_ONRESET = (DISPID_EVENTS + 12); + public const int DISPID_EVMETH_ONRESET = DISPID_ONRESET; + public const int DISPID_EVPROP_ONHELP = (DISPID_EVENTS + 13); + public const int DISPID_EVMETH_ONHELP = STDDISPID_XOBJ_ONHELP; + public const int DISPID_EVPROP_ONFOCUS = (DISPID_EVENTS + 14); + public const int DISPID_EVMETH_ONFOCUS = STDDISPID_XOBJ_ONFOCUS; + public const int DISPID_EVPROP_ONBLUR = (DISPID_EVENTS + 15); + public const int DISPID_EVMETH_ONBLUR = STDDISPID_XOBJ_ONBLUR; + public const int DISPID_EVPROP_ONROWEXIT = (DISPID_EVENTS + 18); + public const int DISPID_EVMETH_ONROWEXIT = STDDISPID_XOBJ_ONROWEXIT; + public const int DISPID_EVPROP_ONROWENTER = (DISPID_EVENTS + 19); + public const int DISPID_EVMETH_ONROWENTER = STDDISPID_XOBJ_ONROWENTER; + public const int DISPID_EVPROP_ONBOUNCE = (DISPID_EVENTS + 20); + public const int DISPID_EVMETH_ONBOUNCE = DISPID_ONBOUNCE; + public const int DISPID_EVPROP_ONBEFOREUPDATE = (DISPID_EVENTS + 21); + public const int DISPID_EVMETH_ONBEFOREUPDATE = STDDISPID_XOBJ_BEFOREUPDATE; + public const int DISPID_EVPROP_ONAFTERUPDATE = (DISPID_EVENTS + 22); + public const int DISPID_EVMETH_ONAFTERUPDATE = STDDISPID_XOBJ_AFTERUPDATE; + public const int DISPID_EVPROP_ONBEFOREDRAGOVER = (DISPID_EVENTS + 23); + //public const int DISPID_EVMETH_ONBEFOREDRAGOVER = EVENTID_CommonCtrlEvent_BeforeDragOver; + public const int DISPID_EVPROP_ONBEFOREDROPORPASTE = (DISPID_EVENTS + 24); + //public const int DISPID_EVMETH_ONBEFOREDROPORPASTE = EVENTID_CommonCtrlEvent_BeforeDropOrPaste; + public const int DISPID_EVPROP_ONREADYSTATECHANGE = (DISPID_EVENTS + 25); + public const int DISPID_EVMETH_ONREADYSTATECHANGE = DISPID_READYSTATECHANGE; + public const int DISPID_EVPROP_ONFINISH = (DISPID_EVENTS + 26); + public const int DISPID_EVMETH_ONFINISH = DISPID_ONFINISH; + public const int DISPID_EVPROP_ONSTART = (DISPID_EVENTS + 27); + public const int DISPID_EVMETH_ONSTART = DISPID_ONSTART; + public const int DISPID_EVPROP_ONABORT = (DISPID_EVENTS + 28); + public const int DISPID_EVMETH_ONABORT = DISPID_ONABORT; + public const int DISPID_EVPROP_ONERROR = (DISPID_EVENTS + 29); + public const int DISPID_EVMETH_ONERROR = DISPID_ONERROR; + public const int DISPID_EVPROP_ONCHANGE = (DISPID_EVENTS + 30); + public const int DISPID_EVMETH_ONCHANGE = DISPID_ONCHANGE; + public const int DISPID_EVPROP_ONSCROLL = (DISPID_EVENTS + 31); + public const int DISPID_EVMETH_ONSCROLL = DISPID_ONSCROLL; + public const int DISPID_EVPROP_ONLOAD = (DISPID_EVENTS + 32); + public const int DISPID_EVMETH_ONLOAD = DISPID_ONLOAD; + public const int DISPID_EVPROP_ONUNLOAD = (DISPID_EVENTS + 33); + public const int DISPID_EVMETH_ONUNLOAD = DISPID_ONUNLOAD; + public const int DISPID_EVPROP_ONLAYOUT = (DISPID_EVENTS + 34); + public const int DISPID_EVMETH_ONLAYOUT = DISPID_ONLAYOUT; + public const int DISPID_EVPROP_ONDRAGSTART = (DISPID_EVENTS + 35); + public const int DISPID_EVMETH_ONDRAGSTART = STDDISPID_XOBJ_ONDRAGSTART; + public const int DISPID_EVPROP_ONRESIZE = (DISPID_EVENTS + 36); + public const int DISPID_EVMETH_ONRESIZE = DISPID_ONRESIZE; + public const int DISPID_EVPROP_ONSELECTSTART = (DISPID_EVENTS + 37); + public const int DISPID_EVMETH_ONSELECTSTART = STDDISPID_XOBJ_ONSELECTSTART; + public const int DISPID_EVPROP_ONERRORUPDATE = (DISPID_EVENTS + 38); + public const int DISPID_EVMETH_ONERRORUPDATE = STDDISPID_XOBJ_ERRORUPDATE; + public const int DISPID_EVPROP_ONBEFOREUNLOAD = (DISPID_EVENTS + 39); + //public const int DISPID_EVMETH_ONBEFOREUNLOAD = DISPID_ONBEFOREUNLOAD; + public const int DISPID_EVPROP_ONDATASETCHANGED = (DISPID_EVENTS + 40); + public const int DISPID_EVMETH_ONDATASETCHANGED = STDDISPID_XOBJ_ONDATASETCHANGED; + public const int DISPID_EVPROP_ONDATAAVAILABLE = (DISPID_EVENTS + 41); + public const int DISPID_EVMETH_ONDATAAVAILABLE = STDDISPID_XOBJ_ONDATAAVAILABLE; + public const int DISPID_EVPROP_ONDATASETCOMPLETE = (DISPID_EVENTS + 42); + public const int DISPID_EVMETH_ONDATASETCOMPLETE = STDDISPID_XOBJ_ONDATASETCOMPLETE; + public const int DISPID_EVPROP_ONFILTER = (DISPID_EVENTS + 43); + public const int DISPID_EVMETH_ONFILTER = STDDISPID_XOBJ_ONFILTER; + public const int DISPID_EVPROP_ONCHANGEFOCUS = (DISPID_EVENTS + 44); + public const int DISPID_EVMETH_ONCHANGEFOCUS = DISPID_ONCHANGEFOCUS; + public const int DISPID_EVPROP_ONCHANGEBLUR = (DISPID_EVENTS + 45); + public const int DISPID_EVMETH_ONCHANGEBLUR = DISPID_ONCHANGEBLUR; + public const int DISPID_EVPROP_ONLOSECAPTURE = (DISPID_EVENTS + 46); + public const int DISPID_EVMETH_ONLOSECAPTURE = STDDISPID_XOBJ_ONLOSECAPTURE; + public const int DISPID_EVPROP_ONPROPERTYCHANGE = (DISPID_EVENTS + 47); + public const int DISPID_EVMETH_ONPROPERTYCHANGE = STDDISPID_XOBJ_ONPROPERTYCHANGE; + public const int DISPID_EVPROP_ONPERSISTSAVE = (DISPID_EVENTS + 48); + public const int DISPID_EVMETH_ONPERSISTSAVE = DISPID_ONPERSISTSAVE; + public const int DISPID_EVPROP_ONDRAG = (DISPID_EVENTS + 49); + public const int DISPID_EVMETH_ONDRAG = STDDISPID_XOBJ_ONDRAG; + public const int DISPID_EVPROP_ONDRAGEND = (DISPID_EVENTS + 50); + public const int DISPID_EVMETH_ONDRAGEND = STDDISPID_XOBJ_ONDRAGEND; + public const int DISPID_EVPROP_ONDRAGENTER = (DISPID_EVENTS + 51); + public const int DISPID_EVMETH_ONDRAGENTER = STDDISPID_XOBJ_ONDRAGENTER; + public const int DISPID_EVPROP_ONDRAGOVER = (DISPID_EVENTS + 52); + public const int DISPID_EVMETH_ONDRAGOVER = STDDISPID_XOBJ_ONDRAGOVER; + public const int DISPID_EVPROP_ONDRAGLEAVE = (DISPID_EVENTS + 53); + public const int DISPID_EVMETH_ONDRAGLEAVE = STDDISPID_XOBJ_ONDRAGLEAVE; + public const int DISPID_EVPROP_ONDROP = (DISPID_EVENTS + 54); + public const int DISPID_EVMETH_ONDROP = STDDISPID_XOBJ_ONDROP; + public const int DISPID_EVPROP_ONCUT = (DISPID_EVENTS + 55); + public const int DISPID_EVMETH_ONCUT = STDDISPID_XOBJ_ONCUT; + public const int DISPID_EVPROP_ONCOPY = (DISPID_EVENTS + 56); + public const int DISPID_EVMETH_ONCOPY = STDDISPID_XOBJ_ONCOPY; + public const int DISPID_EVPROP_ONPASTE = (DISPID_EVENTS + 57); + public const int DISPID_EVMETH_ONPASTE = STDDISPID_XOBJ_ONPASTE; + public const int DISPID_EVPROP_ONBEFORECUT = (DISPID_EVENTS + 58); + public const int DISPID_EVMETH_ONBEFORECUT = STDDISPID_XOBJ_ONBEFORECUT; + public const int DISPID_EVPROP_ONBEFORECOPY = (DISPID_EVENTS + 59); + public const int DISPID_EVMETH_ONBEFORECOPY = STDDISPID_XOBJ_ONBEFORECOPY; + public const int DISPID_EVPROP_ONBEFOREPASTE = (DISPID_EVENTS + 60); + public const int DISPID_EVMETH_ONBEFOREPASTE = STDDISPID_XOBJ_ONBEFOREPASTE; + public const int DISPID_EVPROP_ONPERSISTLOAD = (DISPID_EVENTS + 61); + public const int DISPID_EVMETH_ONPERSISTLOAD = DISPID_ONPERSISTLOAD; + public const int DISPID_EVPROP_ONROWSDELETE = (DISPID_EVENTS + 62); + public const int DISPID_EVMETH_ONROWSDELETE = STDDISPID_XOBJ_ONROWSDELETE; + public const int DISPID_EVPROP_ONROWSINSERTED = (DISPID_EVENTS + 63); + public const int DISPID_EVMETH_ONROWSINSERTED = STDDISPID_XOBJ_ONROWSINSERTED; + public const int DISPID_EVPROP_ONCELLCHANGE = (DISPID_EVENTS + 64); + public const int DISPID_EVMETH_ONCELLCHANGE = STDDISPID_XOBJ_ONCELLCHANGE; + public const int DISPID_EVPROP_ONCONTEXTMENU = (DISPID_EVENTS + 65); + public const int DISPID_EVMETH_ONCONTEXTMENU = DISPID_ONCONTEXTMENU; + public const int DISPID_EVPROP_ONBEFOREPRINT = (DISPID_EVENTS + 66); + public const int DISPID_EVMETH_ONBEFOREPRINT = DISPID_ONBEFOREPRINT; + public const int DISPID_EVPROP_ONAFTERPRINT = (DISPID_EVENTS + 67); + public const int DISPID_EVMETH_ONAFTERPRINT = DISPID_ONAFTERPRINT; + public const int DISPID_EVPROP_ONSTOP = (DISPID_EVENTS + 68); + public const int DISPID_EVMETH_ONSTOP = DISPID_ONSTOP; + public const int DISPID_EVPROP_ONBEFOREEDITFOCUS = (DISPID_EVENTS + 69); + public const int DISPID_EVMETH_ONBEFOREEDITFOCUS = DISPID_ONBEFOREEDITFOCUS; + public const int DISPID_EVPROP_ONATTACHEVENT = (DISPID_EVENTS + 70); + public const int DISPID_EVPROP_ONMOUSEHOVER = (DISPID_EVENTS + 71); + public const int DISPID_EVMETH_ONMOUSEHOVER = DISPID_ONMOUSEHOVER; + public const int DISPID_EVPROP_ONCONTENTREADY = (DISPID_EVENTS + 72); + public const int DISPID_EVMETH_ONCONTENTREADY = DISPID_ONCONTENTREADY; + public const int DISPID_EVPROP_ONLAYOUTCOMPLETE = (DISPID_EVENTS + 73); + public const int DISPID_EVMETH_ONLAYOUTCOMPLETE = DISPID_ONLAYOUTCOMPLETE; + public const int DISPID_EVPROP_ONPAGE = (DISPID_EVENTS + 74); + public const int DISPID_EVMETH_ONPAGE = DISPID_ONPAGE; + public const int DISPID_EVPROP_ONLINKEDOVERFLOW = (DISPID_EVENTS + 75); + public const int DISPID_EVMETH_ONLINKEDOVERFLOW = DISPID_ONLINKEDOVERFLOW; + public const int DISPID_EVPROP_ONMOUSEWHEEL = (DISPID_EVENTS + 76); + public const int DISPID_EVMETH_ONMOUSEWHEEL = DISPID_ONMOUSEWHEEL; + public const int DISPID_EVPROP_ONBEFOREDEACTIVATE = (DISPID_EVENTS + 77); + public const int DISPID_EVMETH_ONBEFOREDEACTIVATE = DISPID_ONBEFOREDEACTIVATE; + public const int DISPID_EVPROP_ONMOVE = (DISPID_EVENTS + 78); + public const int DISPID_EVMETH_ONMOVE = DISPID_ONMOVE; + public const int DISPID_EVPROP_ONCONTROLSELECT = (DISPID_EVENTS + 79); + public const int DISPID_EVMETH_ONCONTROLSELECT = DISPID_ONCONTROLSELECT; + public const int DISPID_EVPROP_ONSELECTIONCHANGE = (DISPID_EVENTS + 80); + public const int DISPID_EVMETH_ONSELECTIONCHANGE = DISPID_ONSELECTIONCHANGE; + public const int DISPID_EVPROP_ONMOVESTART = (DISPID_EVENTS + 81); + public const int DISPID_EVMETH_ONMOVESTART = DISPID_ONMOVESTART; + public const int DISPID_EVPROP_ONMOVEEND = (DISPID_EVENTS + 82); + public const int DISPID_EVMETH_ONMOVEEND = DISPID_ONMOVEEND; + public const int DISPID_EVPROP_ONRESIZESTART = (DISPID_EVENTS + 83); + public const int DISPID_EVMETH_ONRESIZESTART = DISPID_ONRESIZESTART; + public const int DISPID_EVPROP_ONRESIZEEND = (DISPID_EVENTS + 84); + public const int DISPID_EVMETH_ONRESIZEEND = DISPID_ONRESIZEEND; + public const int DISPID_EVPROP_ONMOUSEENTER = (DISPID_EVENTS + 85); + public const int DISPID_EVMETH_ONMOUSEENTER = DISPID_ONMOUSEENTER; + public const int DISPID_EVPROP_ONMOUSELEAVE = (DISPID_EVENTS + 86); + public const int DISPID_EVMETH_ONMOUSELEAVE = DISPID_ONMOUSELEAVE; + public const int DISPID_EVPROP_ONACTIVATE = (DISPID_EVENTS + 87); + public const int DISPID_EVMETH_ONACTIVATE = DISPID_ONACTIVATE; + public const int DISPID_EVPROP_ONDEACTIVATE = (DISPID_EVENTS + 88); + public const int DISPID_EVMETH_ONDEACTIVATE = DISPID_ONDEACTIVATE; + public const int DISPID_EVPROP_ONMULTILAYOUTCLEANUP = (DISPID_EVENTS + 89); + public const int DISPID_EVMETH_ONMULTILAYOUTCLEANUP = DISPID_ONMULTILAYOUTCLEANUP; + public const int DISPID_EVPROP_ONBEFOREACTIVATE = (DISPID_EVENTS + 90); + public const int DISPID_EVMETH_ONBEFOREACTIVATE = DISPID_ONBEFOREACTIVATE; + public const int DISPID_EVPROP_ONFOCUSIN = (DISPID_EVENTS + 91); + public const int DISPID_EVMETH_ONFOCUSIN = DISPID_ONFOCUSIN; + public const int DISPID_EVPROP_ONFOCUSOUT = (DISPID_EVENTS + 92); + public const int DISPID_EVMETH_ONFOCUSOUT = DISPID_ONFOCUSOUT; + + public const int DISPID_EVMETH_ONBEFOREUNLOAD = DISPID_ONBEFOREUNLOAD; + + public const int STDPROPID_XOBJ_CONTROLTIPTEXT = (DISPID_XOBJ_BASE + 0x45); + + public const int DISPID_A_LANGUAGE = (DISPID_A_FIRST + 100); + public const int DISPID_A_LANG = (DISPID_A_FIRST + 9); + public const int STDPROPID_XOBJ_PARENT = (DISPID_XOBJ_BASE + 0x8); + public const int STDPROPID_XOBJ_STYLE = (DISPID_XOBJ_BASE + 0x4A); + + // DISPIDs for interface IHTMLEventObj4 + public const int DISPID_IHTMLEVENTOBJ4_WHEELDELTA = DISPID_EVENTOBJ + 51; + + public const int DISPID_IHTMLELEMENT_SETATTRIBUTE = DISPID_HTMLOBJECT + 1; + public const int DISPID_IHTMLELEMENT_GETATTRIBUTE = DISPID_HTMLOBJECT + 2; + public const int DISPID_IHTMLELEMENT_REMOVEATTRIBUTE = DISPID_HTMLOBJECT + 3; + public const int DISPID_IHTMLELEMENT_CLASSNAME = DISPID_ELEMENT + 1; + public const int DISPID_IHTMLELEMENT_ID = DISPID_ELEMENT + 2; + public const int DISPID_IHTMLELEMENT_TAGNAME = DISPID_ELEMENT + 4; + public const int DISPID_IHTMLELEMENT_PARENTELEMENT = STDPROPID_XOBJ_PARENT; + public const int DISPID_IHTMLELEMENT_STYLE = STDPROPID_XOBJ_STYLE; + public const int DISPID_IHTMLELEMENT_ONHELP = DISPID_EVPROP_ONHELP; //-2147412098 + public const int DISPID_IHTMLELEMENT_ONCLICK = DISPID_EVPROP_ONCLICK; //-2147412103 + public const int DISPID_IHTMLELEMENT_ONDBLCLICK = DISPID_EVPROP_ONDBLCLICK;//-2147412102 + public const int DISPID_IHTMLELEMENT_ONKEYDOWN = DISPID_EVPROP_ONKEYDOWN; //-2147412106 + public const int DISPID_IHTMLELEMENT_ONKEYUP = DISPID_EVPROP_ONKEYUP; + public const int DISPID_IHTMLELEMENT_ONKEYPRESS = DISPID_EVPROP_ONKEYPRESS; //-2147412104 + public const int DISPID_IHTMLELEMENT_ONMOUSEOUT = DISPID_EVPROP_ONMOUSEOUT; //-2147412110 + public const int DISPID_IHTMLELEMENT_ONMOUSEOVER = DISPID_EVPROP_ONMOUSEOVER; //-2147412111 + public const int DISPID_IHTMLELEMENT_ONMOUSEMOVE = DISPID_EVPROP_ONMOUSEMOVE; // -2147412107 + public const int DISPID_IHTMLELEMENT_ONMOUSEDOWN = DISPID_EVPROP_ONMOUSEDOWN; + public const int DISPID_IHTMLELEMENT_ONMOUSEUP = DISPID_EVPROP_ONMOUSEUP; + public const int DISPID_IHTMLELEMENT_DOCUMENT = DISPID_ELEMENT + 18; + public const int DISPID_IHTMLELEMENT_TITLE = STDPROPID_XOBJ_CONTROLTIPTEXT; + public const int DISPID_IHTMLELEMENT_LANGUAGE = DISPID_A_LANGUAGE; + public const int DISPID_IHTMLELEMENT_ONSELECTSTART = DISPID_EVPROP_ONSELECTSTART; + public const int DISPID_IHTMLELEMENT_SCROLLINTOVIEW = DISPID_ELEMENT + 19; + public const int DISPID_IHTMLELEMENT_CONTAINS = DISPID_ELEMENT + 20; + public const int DISPID_IHTMLELEMENT_SOURCEINDEX = DISPID_ELEMENT + 24; + public const int DISPID_IHTMLELEMENT_RECORDNUMBER = DISPID_ELEMENT + 25; + public const int DISPID_IHTMLELEMENT_LANG = DISPID_A_LANG; + public const int DISPID_IHTMLELEMENT_OFFSETLEFT = DISPID_ELEMENT + 8; + public const int DISPID_IHTMLELEMENT_OFFSETTOP = DISPID_ELEMENT + 9; + public const int DISPID_IHTMLELEMENT_OFFSETWIDTH = DISPID_ELEMENT + 10; + public const int DISPID_IHTMLELEMENT_OFFSETHEIGHT = DISPID_ELEMENT + 11; + public const int DISPID_IHTMLELEMENT_OFFSETPARENT = DISPID_ELEMENT + 12; + public const int DISPID_IHTMLELEMENT_INNERHTML = DISPID_ELEMENT + 26; + public const int DISPID_IHTMLELEMENT_INNERTEXT = DISPID_ELEMENT + 27; + public const int DISPID_IHTMLELEMENT_OUTERHTML = DISPID_ELEMENT + 28; + public const int DISPID_IHTMLELEMENT_OUTERTEXT = DISPID_ELEMENT + 29; + public const int DISPID_IHTMLELEMENT_INSERTADJACENTHTML = DISPID_ELEMENT + 30; + public const int DISPID_IHTMLELEMENT_INSERTADJACENTTEXT = DISPID_ELEMENT + 31; + public const int DISPID_IHTMLELEMENT_PARENTTEXTEDIT = DISPID_ELEMENT + 32; + public const int DISPID_IHTMLELEMENT_ISTEXTEDIT = DISPID_ELEMENT + 34; + public const int DISPID_IHTMLELEMENT_CLICK = DISPID_ELEMENT + 33; + public const int DISPID_IHTMLELEMENT_FILTERS = DISPID_ELEMENT + 35; + public const int DISPID_IHTMLELEMENT_ONDRAGSTART = DISPID_EVPROP_ONDRAGSTART; + public const int DISPID_IHTMLELEMENT_TOSTRING = DISPID_ELEMENT + 36; + public const int DISPID_IHTMLELEMENT_ONBEFOREUPDATE = DISPID_EVPROP_ONBEFOREUPDATE; + public const int DISPID_IHTMLELEMENT_ONAFTERUPDATE = DISPID_EVPROP_ONAFTERUPDATE; + public const int DISPID_IHTMLELEMENT_ONERRORUPDATE = DISPID_EVPROP_ONERRORUPDATE; + public const int DISPID_IHTMLELEMENT_ONROWEXIT = DISPID_EVPROP_ONROWEXIT; + public const int DISPID_IHTMLELEMENT_ONROWENTER = DISPID_EVPROP_ONROWENTER; + public const int DISPID_IHTMLELEMENT_ONDATASETCHANGED = DISPID_EVPROP_ONDATASETCHANGED; + public const int DISPID_IHTMLELEMENT_ONDATAAVAILABLE = DISPID_EVPROP_ONDATAAVAILABLE; + public const int DISPID_IHTMLELEMENT_ONDATASETCOMPLETE = DISPID_EVPROP_ONDATASETCOMPLETE; + public const int DISPID_IHTMLELEMENT_ONFILTERCHANGE = DISPID_EVPROP_ONFILTER; + public const int DISPID_IHTMLELEMENT_CHILDREN = DISPID_ELEMENT + 37; + public const int DISPID_IHTMLELEMENT_ALL = DISPID_ELEMENT + 38; + + // DISPIDs for interface IHTMLElement2 + + public const int DISPID_IHTMLELEMENT2_SCOPENAME = DISPID_ELEMENT + 39; + public const int DISPID_IHTMLELEMENT2_SETCAPTURE = DISPID_ELEMENT + 40; + public const int DISPID_IHTMLELEMENT2_RELEASECAPTURE = DISPID_ELEMENT + 41; + public const int DISPID_IHTMLELEMENT2_ONLOSECAPTURE = DISPID_EVPROP_ONLOSECAPTURE; + public const int DISPID_IHTMLELEMENT2_COMPONENTFROMPOINT = DISPID_ELEMENT + 42; + public const int DISPID_IHTMLELEMENT2_DOSCROLL = DISPID_ELEMENT + 43; + public const int DISPID_IHTMLELEMENT2_ONSCROLL = DISPID_EVPROP_ONSCROLL; + public const int DISPID_IHTMLELEMENT2_ONDRAG = DISPID_EVPROP_ONDRAG; + public const int DISPID_IHTMLELEMENT2_ONDRAGEND = DISPID_EVPROP_ONDRAGEND; + public const int DISPID_IHTMLELEMENT2_ONDRAGENTER = DISPID_EVPROP_ONDRAGENTER; + public const int DISPID_IHTMLELEMENT2_ONDRAGOVER = DISPID_EVPROP_ONDRAGOVER; + public const int DISPID_IHTMLELEMENT2_ONDRAGLEAVE = DISPID_EVPROP_ONDRAGLEAVE; + public const int DISPID_IHTMLELEMENT2_ONDROP = DISPID_EVPROP_ONDROP; + public const int DISPID_IHTMLELEMENT2_ONBEFORECUT = DISPID_EVPROP_ONBEFORECUT; + public const int DISPID_IHTMLELEMENT2_ONCUT = DISPID_EVPROP_ONCUT; + public const int DISPID_IHTMLELEMENT2_ONBEFORECOPY = DISPID_EVPROP_ONBEFORECOPY; + public const int DISPID_IHTMLELEMENT2_ONCOPY = DISPID_EVPROP_ONCOPY; + public const int DISPID_IHTMLELEMENT2_ONBEFOREPASTE = DISPID_EVPROP_ONBEFOREPASTE; + public const int DISPID_IHTMLELEMENT2_ONPASTE = DISPID_EVPROP_ONPASTE; + public const int DISPID_IHTMLELEMENT2_CURRENTSTYLE = DISPID_ELEMENT + 7; + public const int DISPID_IHTMLELEMENT2_ONPROPERTYCHANGE = DISPID_EVPROP_ONPROPERTYCHANGE; + public const int DISPID_IHTMLELEMENT2_GETCLIENTRECTS = DISPID_ELEMENT + 44; + public const int DISPID_IHTMLELEMENT2_GETBOUNDINGCLIENTRECT = DISPID_ELEMENT + 45; + public const int DISPID_IHTMLELEMENT2_SETEXPRESSION = DISPID_HTMLOBJECT + 4; + public const int DISPID_IHTMLELEMENT2_GETEXPRESSION = DISPID_HTMLOBJECT + 5; + public const int DISPID_IHTMLELEMENT2_REMOVEEXPRESSION = DISPID_HTMLOBJECT + 6; + //public const int DISPID_IHTMLELEMENT2_TABINDEX = STDPROPID_XOBJ_TABINDEX; + public const int DISPID_IHTMLELEMENT2_FOCUS = DISPID_SITE + 0; + public const int DISPID_IHTMLELEMENT2_ACCESSKEY = DISPID_SITE + 5; + public const int DISPID_IHTMLELEMENT2_ONBLUR = DISPID_EVPROP_ONBLUR; + public const int DISPID_IHTMLELEMENT2_ONFOCUS = DISPID_EVPROP_ONFOCUS; + public const int DISPID_IHTMLELEMENT2_ONRESIZE = DISPID_EVPROP_ONRESIZE; + public const int DISPID_IHTMLELEMENT2_BLUR = DISPID_SITE + 2; + public const int DISPID_IHTMLELEMENT2_ADDFILTER = DISPID_SITE + 17; + public const int DISPID_IHTMLELEMENT2_REMOVEFILTER = DISPID_SITE + 18; + public const int DISPID_IHTMLELEMENT2_CLIENTHEIGHT = DISPID_SITE + 19; + public const int DISPID_IHTMLELEMENT2_CLIENTWIDTH = DISPID_SITE + 20; + public const int DISPID_IHTMLELEMENT2_CLIENTTOP = DISPID_SITE + 21; + public const int DISPID_IHTMLELEMENT2_CLIENTLEFT = DISPID_SITE + 22; + public const int DISPID_IHTMLELEMENT2_ATTACHEVENT = DISPID_HTMLOBJECT + 7; + public const int DISPID_IHTMLELEMENT2_DETACHEVENT = DISPID_HTMLOBJECT + 8; + //public const int DISPID_IHTMLELEMENT2_READYSTATE = DISPID_A_READYSTATE; + public const int DISPID_IHTMLELEMENT2_ONREADYSTATECHANGE = DISPID_EVPROP_ONREADYSTATECHANGE; + public const int DISPID_IHTMLELEMENT2_ONROWSDELETE = DISPID_EVPROP_ONROWSDELETE; + public const int DISPID_IHTMLELEMENT2_ONROWSINSERTED = DISPID_EVPROP_ONROWSINSERTED; + public const int DISPID_IHTMLELEMENT2_ONCELLCHANGE = DISPID_EVPROP_ONCELLCHANGE; + //public const int DISPID_IHTMLELEMENT2_DIR = DISPID_A_DIR; + public const int DISPID_IHTMLELEMENT2_CREATECONTROLRANGE = DISPID_ELEMENT + 56; + public const int DISPID_IHTMLELEMENT2_SCROLLHEIGHT = DISPID_ELEMENT + 57; + public const int DISPID_IHTMLELEMENT2_SCROLLWIDTH = DISPID_ELEMENT + 58; + public const int DISPID_IHTMLELEMENT2_SCROLLTOP = DISPID_ELEMENT + 59; + public const int DISPID_IHTMLELEMENT2_SCROLLLEFT = DISPID_ELEMENT + 60; + public const int DISPID_IHTMLELEMENT2_CLEARATTRIBUTES = DISPID_ELEMENT + 62; + public const int DISPID_IHTMLELEMENT2_MERGEATTRIBUTES = DISPID_ELEMENT + 63; + public const int DISPID_IHTMLELEMENT2_ONCONTEXTMENU = DISPID_EVPROP_ONCONTEXTMENU; + public const int DISPID_IHTMLELEMENT2_INSERTADJACENTELEMENT = DISPID_ELEMENT + 69; + public const int DISPID_IHTMLELEMENT2_APPLYELEMENT = DISPID_ELEMENT + 65; + public const int DISPID_IHTMLELEMENT2_GETADJACENTTEXT = DISPID_ELEMENT + 70; + public const int DISPID_IHTMLELEMENT2_REPLACEADJACENTTEXT = DISPID_ELEMENT + 71; + public const int DISPID_IHTMLELEMENT2_CANHAVECHILDREN = DISPID_ELEMENT + 72; + public const int DISPID_IHTMLELEMENT2_ADDBEHAVIOR = DISPID_ELEMENT + 80; + public const int DISPID_IHTMLELEMENT2_REMOVEBEHAVIOR = DISPID_ELEMENT + 81; + public const int DISPID_IHTMLELEMENT2_RUNTIMESTYLE = DISPID_ELEMENT + 64; + public const int DISPID_IHTMLELEMENT2_BEHAVIORURNS = DISPID_ELEMENT + 82; + public const int DISPID_IHTMLELEMENT2_TAGURN = DISPID_ELEMENT + 83; + public const int DISPID_IHTMLELEMENT2_ONBEFOREEDITFOCUS = DISPID_EVPROP_ONBEFOREEDITFOCUS; + public const int DISPID_IHTMLELEMENT2_READYSTATEVALUE = DISPID_ELEMENT + 84; + public const int DISPID_IHTMLELEMENT2_GETELEMENTSBYTAGNAME = DISPID_ELEMENT + 85; + + // DISPIDs for interface IHTMLElementCollection + + public const int DISPID_IHTMLELEMENTCOLLECTION_TOSTRING = DISPID_COLLECTION + 1; + public const int DISPID_IHTMLELEMENTCOLLECTION_LENGTH = DISPID_COLLECTION; + public const int DISPID_IHTMLELEMENTCOLLECTION__NEWENUM = DISPID_NEWENUM; + public const int DISPID_IHTMLELEMENTCOLLECTION_ITEM = DISPID_VALUE; + public const int DISPID_IHTMLELEMENTCOLLECTION_TAGS = DISPID_COLLECTION + 2; + + + // DISPIDs for interface IHTMLEventObj + + public const int DISPID_EVENTOBJ = DISPID_NORMAL_FIRST; + + public const int DISPID_IHTMLEVENTOBJ_SRCELEMENT = DISPID_EVENTOBJ + 1; + public const int DISPID_IHTMLEVENTOBJ_ALTKEY = DISPID_EVENTOBJ + 2; + public const int DISPID_IHTMLEVENTOBJ_CTRLKEY = DISPID_EVENTOBJ + 3; + public const int DISPID_IHTMLEVENTOBJ_SHIFTKEY = DISPID_EVENTOBJ + 4; + public const int DISPID_IHTMLEVENTOBJ_RETURNVALUE = DISPID_EVENTOBJ + 7; + public const int DISPID_IHTMLEVENTOBJ_CANCELBUBBLE = DISPID_EVENTOBJ + 8; + public const int DISPID_IHTMLEVENTOBJ_FROMELEMENT = DISPID_EVENTOBJ + 9; + public const int DISPID_IHTMLEVENTOBJ_TOELEMENT = DISPID_EVENTOBJ + 10; + public const int DISPID_IHTMLEVENTOBJ_KEYCODE = DISPID_EVENTOBJ + 11; + public const int DISPID_IHTMLEVENTOBJ_BUTTON = DISPID_EVENTOBJ + 12; + public const int DISPID_IHTMLEVENTOBJ_TYPE = DISPID_EVENTOBJ + 13; + public const int DISPID_IHTMLEVENTOBJ_QUALIFIER = DISPID_EVENTOBJ + 14; + public const int DISPID_IHTMLEVENTOBJ_REASON = DISPID_EVENTOBJ + 15; + public const int DISPID_IHTMLEVENTOBJ_X = DISPID_EVENTOBJ + 5; + public const int DISPID_IHTMLEVENTOBJ_Y = DISPID_EVENTOBJ + 6; + public const int DISPID_IHTMLEVENTOBJ_CLIENTX = DISPID_EVENTOBJ + 20; + public const int DISPID_IHTMLEVENTOBJ_CLIENTY = DISPID_EVENTOBJ + 21; + public const int DISPID_IHTMLEVENTOBJ_OFFSETX = DISPID_EVENTOBJ + 22; + public const int DISPID_IHTMLEVENTOBJ_OFFSETY = DISPID_EVENTOBJ + 23; + public const int DISPID_IHTMLEVENTOBJ_SCREENX = DISPID_EVENTOBJ + 24; + public const int DISPID_IHTMLEVENTOBJ_SCREENY = DISPID_EVENTOBJ + 25; + public const int DISPID_IHTMLEVENTOBJ_SRCFILTER = DISPID_EVENTOBJ + 26; + + // DISPIDs for interface IHTMLEventObj2 + + public const int DISPID_IHTMLEVENTOBJ2_SETATTRIBUTE = DISPID_HTMLOBJECT + 1; + public const int DISPID_IHTMLEVENTOBJ2_GETATTRIBUTE = DISPID_HTMLOBJECT + 2; + public const int DISPID_IHTMLEVENTOBJ2_REMOVEATTRIBUTE = DISPID_HTMLOBJECT + 3; + public const int DISPID_IHTMLEVENTOBJ2_PROPERTYNAME = DISPID_EVENTOBJ + 27; + public const int DISPID_IHTMLEVENTOBJ2_BOOKMARKS = DISPID_EVENTOBJ + 31; + public const int DISPID_IHTMLEVENTOBJ2_RECORDSET = DISPID_EVENTOBJ + 32; + public const int DISPID_IHTMLEVENTOBJ2_DATAFLD = DISPID_EVENTOBJ + 33; + public const int DISPID_IHTMLEVENTOBJ2_BOUNDELEMENTS = DISPID_EVENTOBJ + 34; + public const int DISPID_IHTMLEVENTOBJ2_REPEAT = DISPID_EVENTOBJ + 35; + public const int DISPID_IHTMLEVENTOBJ2_SRCURN = DISPID_EVENTOBJ + 36; + public const int DISPID_IHTMLEVENTOBJ2_SRCELEMENT = DISPID_EVENTOBJ + 1; + public const int DISPID_IHTMLEVENTOBJ2_ALTKEY = DISPID_EVENTOBJ + 2; + public const int DISPID_IHTMLEVENTOBJ2_CTRLKEY = DISPID_EVENTOBJ + 3; + public const int DISPID_IHTMLEVENTOBJ2_SHIFTKEY = DISPID_EVENTOBJ + 4; + public const int DISPID_IHTMLEVENTOBJ2_FROMELEMENT = DISPID_EVENTOBJ + 9; + public const int DISPID_IHTMLEVENTOBJ2_TOELEMENT = DISPID_EVENTOBJ + 10; + public const int DISPID_IHTMLEVENTOBJ2_BUTTON = DISPID_EVENTOBJ + 12; + public const int DISPID_IHTMLEVENTOBJ2_TYPE = DISPID_EVENTOBJ + 13; + public const int DISPID_IHTMLEVENTOBJ2_QUALIFIER = DISPID_EVENTOBJ + 14; + public const int DISPID_IHTMLEVENTOBJ2_REASON = DISPID_EVENTOBJ + 15; + public const int DISPID_IHTMLEVENTOBJ2_X = DISPID_EVENTOBJ + 5; + public const int DISPID_IHTMLEVENTOBJ2_Y = DISPID_EVENTOBJ + 6; + public const int DISPID_IHTMLEVENTOBJ2_CLIENTX = DISPID_EVENTOBJ + 20; + public const int DISPID_IHTMLEVENTOBJ2_CLIENTY = DISPID_EVENTOBJ + 21; + public const int DISPID_IHTMLEVENTOBJ2_OFFSETX = DISPID_EVENTOBJ + 22; + public const int DISPID_IHTMLEVENTOBJ2_OFFSETY = DISPID_EVENTOBJ + 23; + public const int DISPID_IHTMLEVENTOBJ2_SCREENX = DISPID_EVENTOBJ + 24; + public const int DISPID_IHTMLEVENTOBJ2_SCREENY = DISPID_EVENTOBJ + 25; + public const int DISPID_IHTMLEVENTOBJ2_SRCFILTER = DISPID_EVENTOBJ + 26; + public const int DISPID_IHTMLEVENTOBJ2_DATATRANSFER = DISPID_EVENTOBJ + 37; + + // DISPIDs for interface IHTMLEventObj3 + + public const int DISPID_IHTMLEVENTOBJ3_CONTENTOVERFLOW = DISPID_EVENTOBJ + 38; + public const int DISPID_IHTMLEVENTOBJ3_SHIFTLEFT = DISPID_EVENTOBJ + 39; + public const int DISPID_IHTMLEVENTOBJ3_ALTLEFT = DISPID_EVENTOBJ + 40; + public const int DISPID_IHTMLEVENTOBJ3_CTRLLEFT = DISPID_EVENTOBJ + 41; + public const int DISPID_IHTMLEVENTOBJ3_IMECOMPOSITIONCHANGE = DISPID_EVENTOBJ + 42; + public const int DISPID_IHTMLEVENTOBJ3_IMENOTIFYCOMMAND = DISPID_EVENTOBJ + 43; + public const int DISPID_IHTMLEVENTOBJ3_IMENOTIFYDATA = DISPID_EVENTOBJ + 44; + public const int DISPID_IHTMLEVENTOBJ3_IMEREQUEST = DISPID_EVENTOBJ + 46; + public const int DISPID_IHTMLEVENTOBJ3_IMEREQUESTDATA = DISPID_EVENTOBJ + 47; + public const int DISPID_IHTMLEVENTOBJ3_KEYBOARDLAYOUT = DISPID_EVENTOBJ + 45; + public const int DISPID_IHTMLEVENTOBJ3_BEHAVIORCOOKIE = DISPID_EVENTOBJ + 48; + public const int DISPID_IHTMLEVENTOBJ3_BEHAVIORPART = DISPID_EVENTOBJ + 49; + public const int DISPID_IHTMLEVENTOBJ3_NEXTPAGE = DISPID_EVENTOBJ + 50; + + + public const int DISPID_A_FIRST = DISPID_ATTRS; + public const int DISPID_A_DIR = DISPID_A_FIRST + 117; + + // DISPIDs for interface IHTMLDocument3 + public const int DISPID_IHTMLDOCUMENT3_RELEASECAPTURE = DISPID_OMDOCUMENT + 72; + public const int DISPID_IHTMLDOCUMENT3_RECALC = DISPID_OMDOCUMENT + 73; + public const int DISPID_IHTMLDOCUMENT3_CREATETEXTNODE = DISPID_OMDOCUMENT + 74; + public const int DISPID_IHTMLDOCUMENT3_DOCUMENTELEMENT = DISPID_OMDOCUMENT + 75; + public const int DISPID_IHTMLDOCUMENT3_UNIQUEID = DISPID_OMDOCUMENT + 77; + public const int DISPID_IHTMLDOCUMENT3_ATTACHEVENT = DISPID_HTMLOBJECT + 7; + public const int DISPID_IHTMLDOCUMENT3_DETACHEVENT = DISPID_HTMLOBJECT + 8; + public const int DISPID_IHTMLDOCUMENT3_ONROWSDELETE = DISPID_EVPROP_ONROWSDELETE; + public const int DISPID_IHTMLDOCUMENT3_ONROWSINSERTED = DISPID_EVPROP_ONROWSINSERTED; + public const int DISPID_IHTMLDOCUMENT3_ONCELLCHANGE = DISPID_EVPROP_ONCELLCHANGE; + public const int DISPID_IHTMLDOCUMENT3_ONDATASETCHANGED = DISPID_EVPROP_ONDATASETCHANGED; + public const int DISPID_IHTMLDOCUMENT3_ONDATAAVAILABLE = DISPID_EVPROP_ONDATAAVAILABLE; + public const int DISPID_IHTMLDOCUMENT3_ONDATASETCOMPLETE = DISPID_EVPROP_ONDATASETCOMPLETE; + public const int DISPID_IHTMLDOCUMENT3_ONPROPERTYCHANGE = DISPID_EVPROP_ONPROPERTYCHANGE; + public const int DISPID_IHTMLDOCUMENT3_DIR = DISPID_A_DIR; + public const int DISPID_IHTMLDOCUMENT3_ONCONTEXTMENU = DISPID_EVPROP_ONCONTEXTMENU; + public const int DISPID_IHTMLDOCUMENT3_ONSTOP = DISPID_EVPROP_ONSTOP; + public const int DISPID_IHTMLDOCUMENT3_CREATEDOCUMENTFRAGMENT = DISPID_OMDOCUMENT + 76; + public const int DISPID_IHTMLDOCUMENT3_PARENTDOCUMENT = DISPID_OMDOCUMENT + 78; + public const int DISPID_IHTMLDOCUMENT3_ENABLEDOWNLOAD = DISPID_OMDOCUMENT + 79; + public const int DISPID_IHTMLDOCUMENT3_BASEURL = DISPID_OMDOCUMENT + 80; + public const int DISPID_IHTMLDOCUMENT3_CHILDNODES = DISPID_ELEMENT + 49; + public const int DISPID_IHTMLDOCUMENT3_INHERITSTYLESHEETS = DISPID_OMDOCUMENT + 82; + public const int DISPID_IHTMLDOCUMENT3_ONBEFOREEDITFOCUS = DISPID_EVPROP_ONBEFOREEDITFOCUS; + public const int DISPID_IHTMLDOCUMENT3_GETELEMENTSBYNAME = DISPID_OMDOCUMENT + 86; + public const int DISPID_IHTMLDOCUMENT3_GETELEMENTBYID = DISPID_OMDOCUMENT + 88; + public const int DISPID_IHTMLDOCUMENT3_GETELEMENTSBYTAGNAME = DISPID_OMDOCUMENT + 87; + + // DISPIDs for interface IHTMLDocument4 + public const int DISPID_OMDOCUMENT = DISPID_NORMAL_FIRST; + + public const int DISPID_IHTMLDOCUMENT4_FOCUS = DISPID_OMDOCUMENT + 89; + public const int DISPID_IHTMLDOCUMENT4_HASFOCUS = DISPID_OMDOCUMENT + 90; + public const int DISPID_IHTMLDOCUMENT4_ONSELECTIONCHANGE = DISPID_EVPROP_ONSELECTIONCHANGE; + public const int DISPID_IHTMLDOCUMENT4_NAMESPACES = DISPID_OMDOCUMENT + 91; + public const int DISPID_IHTMLDOCUMENT4_CREATEDOCUMENTFROMURL = DISPID_OMDOCUMENT + 92; + public const int DISPID_IHTMLDOCUMENT4_MEDIA = DISPID_OMDOCUMENT + 93; + public const int DISPID_IHTMLDOCUMENT4_CREATEEVENTOBJECT = DISPID_OMDOCUMENT + 94; + public const int DISPID_IHTMLDOCUMENT4_FIREEVENT = DISPID_OMDOCUMENT + 95; + public const int DISPID_IHTMLDOCUMENT4_CREATERENDERSTYLE = DISPID_OMDOCUMENT + 96; + public const int DISPID_IHTMLDOCUMENT4_ONCONTROLSELECT = DISPID_EVPROP_ONCONTROLSELECT; + public const int DISPID_IHTMLDOCUMENT4_URLUNENCODED = DISPID_OMDOCUMENT + 97; + + // DISPIDs for interface IHTMLDocument5 + + public const int DISPID_IHTMLDOCUMENT5_ONMOUSEWHEEL = DISPID_EVPROP_ONMOUSEWHEEL; + public const int DISPID_IHTMLDOCUMENT5_DOCTYPE = DISPID_OMDOCUMENT + 98; + public const int DISPID_IHTMLDOCUMENT5_IMPLEMENTATION = DISPID_OMDOCUMENT + 99; + public const int DISPID_IHTMLDOCUMENT5_CREATEATTRIBUTE = DISPID_OMDOCUMENT + 100; + public const int DISPID_IHTMLDOCUMENT5_CREATECOMMENT = DISPID_OMDOCUMENT + 101; + public const int DISPID_IHTMLDOCUMENT5_ONFOCUSIN = DISPID_EVPROP_ONFOCUSIN; + public const int DISPID_IHTMLDOCUMENT5_ONFOCUSOUT = DISPID_EVPROP_ONFOCUSOUT; + public const int DISPID_IHTMLDOCUMENT5_ONACTIVATE = DISPID_EVPROP_ONACTIVATE; + public const int DISPID_IHTMLDOCUMENT5_ONDEACTIVATE = DISPID_EVPROP_ONDEACTIVATE; + public const int DISPID_IHTMLDOCUMENT5_ONBEFOREACTIVATE = DISPID_EVPROP_ONBEFOREACTIVATE; + public const int DISPID_IHTMLDOCUMENT5_ONBEFOREDEACTIVATE = DISPID_EVPROP_ONBEFOREDEACTIVATE; + public const int DISPID_IHTMLDOCUMENT5_COMPATMODE = DISPID_OMDOCUMENT + 102; + + + //DISPIDS for interface IHTMLDocumentEvents2 + public const int DISPID_HTMLDOCUMENTEVENTS2_ONHELP = DISPID_EVMETH_ONHELP; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONCLICK = DISPID_EVMETH_ONCLICK; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONDBLCLICK = DISPID_EVMETH_ONDBLCLICK; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONKEYDOWN = DISPID_EVMETH_ONKEYDOWN; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONKEYUP = DISPID_EVMETH_ONKEYUP; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONKEYPRESS = DISPID_EVMETH_ONKEYPRESS; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEDOWN = DISPID_EVMETH_ONMOUSEDOWN; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEMOVE = DISPID_EVMETH_ONMOUSEMOVE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEUP = DISPID_EVMETH_ONMOUSEUP; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEOUT = DISPID_EVMETH_ONMOUSEOUT; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEOVER = DISPID_EVMETH_ONMOUSEOVER; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONREADYSTATECHANGE = DISPID_EVMETH_ONREADYSTATECHANGE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREUPDATE = DISPID_EVMETH_ONBEFOREUPDATE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONAFTERUPDATE = DISPID_EVMETH_ONAFTERUPDATE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONROWEXIT = DISPID_EVMETH_ONROWEXIT; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONROWENTER = DISPID_EVMETH_ONROWENTER; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONDRAGSTART = DISPID_EVMETH_ONDRAGSTART; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONSELECTSTART = DISPID_EVMETH_ONSELECTSTART; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONERRORUPDATE = DISPID_EVMETH_ONERRORUPDATE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONCONTEXTMENU = DISPID_EVMETH_ONCONTEXTMENU; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONSTOP = DISPID_EVMETH_ONSTOP; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONROWSDELETE = DISPID_EVMETH_ONROWSDELETE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONROWSINSERTED = DISPID_EVMETH_ONROWSINSERTED; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONCELLCHANGE = DISPID_EVMETH_ONCELLCHANGE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONPROPERTYCHANGE = DISPID_EVMETH_ONPROPERTYCHANGE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONDATASETCHANGED = DISPID_EVMETH_ONDATASETCHANGED; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONDATAAVAILABLE = DISPID_EVMETH_ONDATAAVAILABLE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONDATASETCOMPLETE = DISPID_EVMETH_ONDATASETCOMPLETE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREEDITFOCUS = DISPID_EVMETH_ONBEFOREEDITFOCUS; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONSELECTIONCHANGE = DISPID_EVMETH_ONSELECTIONCHANGE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONCONTROLSELECT = DISPID_EVMETH_ONCONTROLSELECT; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEWHEEL = DISPID_EVMETH_ONMOUSEWHEEL; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONFOCUSIN = DISPID_EVMETH_ONFOCUSIN; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONFOCUSOUT = DISPID_EVMETH_ONFOCUSOUT; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONACTIVATE = DISPID_EVMETH_ONACTIVATE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONDEACTIVATE = DISPID_EVMETH_ONDEACTIVATE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREACTIVATE = DISPID_EVMETH_ONBEFOREACTIVATE; + public const int DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREDEACTIVATE = DISPID_EVMETH_ONBEFOREDEACTIVATE; + + // DISPIDs for event set HTMLWindowEvents2 + + public const int DISPID_HTMLWINDOWEVENTS2_ONLOAD = DISPID_EVMETH_ONLOAD; + public const int DISPID_HTMLWINDOWEVENTS2_ONUNLOAD = DISPID_EVMETH_ONUNLOAD; + public const int DISPID_HTMLWINDOWEVENTS2_ONHELP = DISPID_EVMETH_ONHELP; + public const int DISPID_HTMLWINDOWEVENTS2_ONFOCUS = DISPID_EVMETH_ONFOCUS; + public const int DISPID_HTMLWINDOWEVENTS2_ONBLUR = DISPID_EVMETH_ONBLUR; + public const int DISPID_HTMLWINDOWEVENTS2_ONERROR = DISPID_EVMETH_ONERROR; + public const int DISPID_HTMLWINDOWEVENTS2_ONRESIZE = DISPID_EVMETH_ONRESIZE; + public const int DISPID_HTMLWINDOWEVENTS2_ONSCROLL = DISPID_EVMETH_ONSCROLL; + public const int DISPID_HTMLWINDOWEVENTS2_ONBEFOREUNLOAD = DISPID_EVMETH_ONBEFOREUNLOAD; + public const int DISPID_HTMLWINDOWEVENTS2_ONBEFOREPRINT = DISPID_EVMETH_ONBEFOREPRINT; + public const int DISPID_HTMLWINDOWEVENTS2_ONAFTERPRINT = DISPID_EVMETH_ONAFTERPRINT; + + // DISPIDs for interface IHTMLDOMNode + + public const int DISPID_IHTMLDOMNODE_NODETYPE = DISPID_ELEMENT + 46; + public const int DISPID_IHTMLDOMNODE_PARENTNODE = DISPID_ELEMENT + 47; + public const int DISPID_IHTMLDOMNODE_HASCHILDNODES = DISPID_ELEMENT + 48; + public const int DISPID_IHTMLDOMNODE_CHILDNODES = DISPID_ELEMENT + 49; + public const int DISPID_IHTMLDOMNODE_ATTRIBUTES = DISPID_ELEMENT + 50; + public const int DISPID_IHTMLDOMNODE_INSERTBEFORE = DISPID_ELEMENT + 51; + public const int DISPID_IHTMLDOMNODE_REMOVECHILD = DISPID_ELEMENT + 52; + public const int DISPID_IHTMLDOMNODE_REPLACECHILD = DISPID_ELEMENT + 53; + public const int DISPID_IHTMLDOMNODE_CLONENODE = DISPID_ELEMENT + 61; + public const int DISPID_IHTMLDOMNODE_REMOVENODE = DISPID_ELEMENT + 66; + public const int DISPID_IHTMLDOMNODE_SWAPNODE = DISPID_ELEMENT + 68; + public const int DISPID_IHTMLDOMNODE_REPLACENODE = DISPID_ELEMENT + 67; + public const int DISPID_IHTMLDOMNODE_APPENDCHILD = DISPID_ELEMENT + 73; + public const int DISPID_IHTMLDOMNODE_NODENAME = DISPID_ELEMENT + 74; + public const int DISPID_IHTMLDOMNODE_NODEVALUE = DISPID_ELEMENT + 75; + public const int DISPID_IHTMLDOMNODE_FIRSTCHILD = DISPID_ELEMENT + 76; + public const int DISPID_IHTMLDOMNODE_LASTCHILD = DISPID_ELEMENT + 77; + public const int DISPID_IHTMLDOMNODE_PREVIOUSSIBLING = DISPID_ELEMENT + 78; + public const int DISPID_IHTMLDOMNODE_NEXTSIBLING = DISPID_ELEMENT + 79; + + public const int DISPID_COLLECTION_MIN = 1000000; + public const int DISPID_COLLECTION_MAX = 2999999; + public const int DISPID_COLLECTION = (DISPID_NORMAL_FIRST + 500); + public const int DISPID_VALUE = 0; + + /* The following DISPID is reserved to indicate the param + * that is the right-hand-side (or "put" value) of a PropertyPut + */ + public const int DISPID_PROPERTYPUT = -3; + + /* DISPID reserved for the standard "NewEnum" method */ + public const int DISPID_NEWENUM = -4; + + // DISPIDs for interface IHTMLDOMChildrenCollection + + public const int DISPID_IHTMLDOMCHILDRENCOLLECTION_LENGTH = DISPID_COLLECTION; + public const int DISPID_IHTMLDOMCHILDRENCOLLECTION__NEWENUM = DISPID_NEWENUM; + public const int DISPID_IHTMLDOMCHILDRENCOLLECTION_ITEM = DISPID_VALUE; + + // DISPIDs for interface IHTMLFramesCollection2 + + public const int DISPID_IHTMLFRAMESCOLLECTION2_ITEM = 0; + public const int DISPID_IHTMLFRAMESCOLLECTION2_LENGTH = 1001; + + // DISPIDs for interface IHTMLWindow2 + + public const int DISPID_IHTMLWINDOW2_FRAMES = 1100; + public const int DISPID_IHTMLWINDOW2_DEFAULTSTATUS = 1101; + public const int DISPID_IHTMLWINDOW2_STATUS = 1102; + public const int DISPID_IHTMLWINDOW2_SETTIMEOUT = 1172; + public const int DISPID_IHTMLWINDOW2_CLEARTIMEOUT = 1104; + public const int DISPID_IHTMLWINDOW2_ALERT = 1105; + public const int DISPID_IHTMLWINDOW2_CONFIRM = 1110; + public const int DISPID_IHTMLWINDOW2_PROMPT = 1111; + public const int DISPID_IHTMLWINDOW2_IMAGE = 1125; + public const int DISPID_IHTMLWINDOW2_LOCATION = 14; + public const int DISPID_IHTMLWINDOW2_HISTORY = 2; + public const int DISPID_IHTMLWINDOW2_CLOSE = 3; + public const int DISPID_IHTMLWINDOW2_OPENER = 4; + public const int DISPID_IHTMLWINDOW2_NAVIGATOR = 5; + public const int DISPID_IHTMLWINDOW2_NAME = 11; + public const int DISPID_IHTMLWINDOW2_PARENT = 12; + public const int DISPID_IHTMLWINDOW2_OPEN = 13; + public const int DISPID_IHTMLWINDOW2_SELF = 20; + public const int DISPID_IHTMLWINDOW2_TOP = 21; + public const int DISPID_IHTMLWINDOW2_WINDOW = 22; + public const int DISPID_IHTMLWINDOW2_NAVIGATE = 25; + public const int DISPID_IHTMLWINDOW2_ONFOCUS = DISPID_EVPROP_ONFOCUS; + public const int DISPID_IHTMLWINDOW2_ONBLUR = DISPID_EVPROP_ONBLUR; + public const int DISPID_IHTMLWINDOW2_ONLOAD = DISPID_EVPROP_ONLOAD; + public const int DISPID_IHTMLWINDOW2_ONBEFOREUNLOAD = DISPID_EVPROP_ONBEFOREUNLOAD; + public const int DISPID_IHTMLWINDOW2_ONUNLOAD = DISPID_EVPROP_ONUNLOAD; + public const int DISPID_IHTMLWINDOW2_ONHELP = DISPID_EVPROP_ONHELP; + public const int DISPID_IHTMLWINDOW2_ONERROR = DISPID_EVPROP_ONERROR; + public const int DISPID_IHTMLWINDOW2_ONRESIZE = DISPID_EVPROP_ONRESIZE; + public const int DISPID_IHTMLWINDOW2_ONSCROLL = DISPID_EVPROP_ONSCROLL; + public const int DISPID_IHTMLWINDOW2_DOCUMENT = 1151; + public const int DISPID_IHTMLWINDOW2_EVENT = 1152; + public const int DISPID_IHTMLWINDOW2__NEWENUM = 1153; + public const int DISPID_IHTMLWINDOW2_SHOWMODALDIALOG = 1154; + public const int DISPID_IHTMLWINDOW2_SHOWHELP = 1155; + public const int DISPID_IHTMLWINDOW2_SCREEN = 1156; + public const int DISPID_IHTMLWINDOW2_OPTION = 1157; + public const int DISPID_IHTMLWINDOW2_FOCUS = 1158; + public const int DISPID_IHTMLWINDOW2_CLOSED = 23; + public const int DISPID_IHTMLWINDOW2_BLUR = 1159; + public const int DISPID_IHTMLWINDOW2_SCROLL = 1160; + public const int DISPID_IHTMLWINDOW2_CLIENTINFORMATION = 1161; + public const int DISPID_IHTMLWINDOW2_SETINTERVAL = 1173; + public const int DISPID_IHTMLWINDOW2_CLEARINTERVAL = 1163; + public const int DISPID_IHTMLWINDOW2_OFFSCREENBUFFERING = 1164; + public const int DISPID_IHTMLWINDOW2_EXECSCRIPT = 1165; + public const int DISPID_IHTMLWINDOW2_TOSTRING = 1166; + public const int DISPID_IHTMLWINDOW2_SCROLLBY = 1167; + public const int DISPID_IHTMLWINDOW2_SCROLLTO = 1168; + public const int DISPID_IHTMLWINDOW2_MOVETO = 6; + public const int DISPID_IHTMLWINDOW2_MOVEBY = 7; + public const int DISPID_IHTMLWINDOW2_RESIZETO = 9; + public const int DISPID_IHTMLWINDOW2_RESIZEBY = 8; + public const int DISPID_IHTMLWINDOW2_EXTERNAL = 1169; + + // DISPIDS for interface IHtmlAncher + public const int DISPID_ANCHOR = DISPID_NORMAL_FIRST; + public const int STDPROPID_XOBJ_TABINDEX = DISPID_XOBJ_BASE + 0xF; + + public const int DISPID_IHTMLANCHORELEMENT_HREF = DISPID_VALUE; + public const int DISPID_IHTMLANCHORELEMENT_TARGET = DISPID_ANCHOR + 3; + public const int DISPID_IHTMLANCHORELEMENT_REL = DISPID_ANCHOR + 5; + public const int DISPID_IHTMLANCHORELEMENT_REV = DISPID_ANCHOR + 6; + public const int DISPID_IHTMLANCHORELEMENT_URN = DISPID_ANCHOR + 7; + public const int DISPID_IHTMLANCHORELEMENT_METHODS = DISPID_ANCHOR + 8; + public const int DISPID_IHTMLANCHORELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLANCHORELEMENT_HOST = DISPID_ANCHOR + 12; + public const int DISPID_IHTMLANCHORELEMENT_HOSTNAME = DISPID_ANCHOR + 13; + public const int DISPID_IHTMLANCHORELEMENT_PATHNAME = DISPID_ANCHOR + 14; + public const int DISPID_IHTMLANCHORELEMENT_PORT = DISPID_ANCHOR + 15; + public const int DISPID_IHTMLANCHORELEMENT_PROTOCOL = DISPID_ANCHOR + 16; + public const int DISPID_IHTMLANCHORELEMENT_SEARCH = DISPID_ANCHOR + 17; + public const int DISPID_IHTMLANCHORELEMENT_HASH = DISPID_ANCHOR + 18; + public const int DISPID_IHTMLANCHORELEMENT_ONBLUR = DISPID_EVPROP_ONBLUR; + public const int DISPID_IHTMLANCHORELEMENT_ONFOCUS = DISPID_EVPROP_ONFOCUS; + public const int DISPID_IHTMLANCHORELEMENT_ACCESSKEY = DISPID_SITE + 5; + public const int DISPID_IHTMLANCHORELEMENT_PROTOCOLLONG = DISPID_ANCHOR + 31; + public const int DISPID_IHTMLANCHORELEMENT_MIMETYPE = DISPID_ANCHOR + 30; + public const int DISPID_IHTMLANCHORELEMENT_NAMEPROP = DISPID_ANCHOR + 32; + public const int DISPID_IHTMLANCHORELEMENT_TABINDEX = STDPROPID_XOBJ_TABINDEX; + public const int DISPID_IHTMLANCHORELEMENT_FOCUS = DISPID_SITE + 0; + public const int DISPID_IHTMLANCHORELEMENT_BLUR = DISPID_SITE + 2; + + // DISPIDs for interface IHTMLImgElement + + public const int DISPID_IMGBASE = DISPID_NORMAL_FIRST; + public const int DISPID_IMG = (DISPID_IMGBASE + 1000); + public const int DISPID_INPUTIMAGE = (DISPID_IMGBASE + 1000); + public const int DISPID_INPUT = (DISPID_TEXTSITE + 1000); + public const int DISPID_INPUTTEXTBASE = (DISPID_INPUT + 1000); + public const int DISPID_INPUTTEXT = (DISPID_INPUTTEXTBASE + 1000); + public const int DISPID_SELECT = DISPID_NORMAL_FIRST; + + public const int DISPID_A_READYSTATE = (DISPID_A_FIRST + 116); // ready state + public const int STDPROPID_XOBJ_CONTROLALIGN = (DISPID_XOBJ_BASE + 0x49); + public const int STDPROPID_XOBJ_NAME = (DISPID_XOBJ_BASE + 0x0); + public const int STDPROPID_XOBJ_WIDTH = (DISPID_XOBJ_BASE + 0x5); + public const int STDPROPID_XOBJ_HEIGHT = (DISPID_XOBJ_BASE + 0x6); + + public const int DISPID_IHTMLIMGELEMENT_ISMAP = DISPID_IMG + 2; + public const int DISPID_IHTMLIMGELEMENT_USEMAP = DISPID_IMG + 8; + public const int DISPID_IHTMLIMGELEMENT_MIMETYPE = DISPID_IMG + 10; + public const int DISPID_IHTMLIMGELEMENT_FILESIZE = DISPID_IMG + 11; + public const int DISPID_IHTMLIMGELEMENT_FILECREATEDDATE = DISPID_IMG + 12; + public const int DISPID_IHTMLIMGELEMENT_FILEMODIFIEDDATE = DISPID_IMG + 13; + public const int DISPID_IHTMLIMGELEMENT_FILEUPDATEDDATE = DISPID_IMG + 14; + public const int DISPID_IHTMLIMGELEMENT_PROTOCOL = DISPID_IMG + 15; + public const int DISPID_IHTMLIMGELEMENT_HREF = DISPID_IMG + 16; + public const int DISPID_IHTMLIMGELEMENT_NAMEPROP = DISPID_IMG + 17; + public const int DISPID_IHTMLIMGELEMENT_BORDER = DISPID_IMGBASE + 4; + public const int DISPID_IHTMLIMGELEMENT_VSPACE = DISPID_IMGBASE + 5; + public const int DISPID_IHTMLIMGELEMENT_HSPACE = DISPID_IMGBASE + 6; + public const int DISPID_IHTMLIMGELEMENT_ALT = DISPID_IMGBASE + 2; + public const int DISPID_IHTMLIMGELEMENT_SRC = DISPID_IMGBASE + 3; + public const int DISPID_IHTMLIMGELEMENT_LOWSRC = DISPID_IMGBASE + 7; + public const int DISPID_IHTMLIMGELEMENT_VRML = DISPID_IMGBASE + 8; + public const int DISPID_IHTMLIMGELEMENT_DYNSRC = DISPID_IMGBASE + 9; + public const int DISPID_IHTMLIMGELEMENT_READYSTATE = DISPID_A_READYSTATE; + public const int DISPID_IHTMLIMGELEMENT_COMPLETE = DISPID_IMGBASE + 10; + public const int DISPID_IHTMLIMGELEMENT_LOOP = DISPID_IMGBASE + 11; + public const int DISPID_IHTMLIMGELEMENT_ALIGN = STDPROPID_XOBJ_CONTROLALIGN; + public const int DISPID_IHTMLIMGELEMENT_ONLOAD = DISPID_EVPROP_ONLOAD; + public const int DISPID_IHTMLIMGELEMENT_ONERROR = DISPID_EVPROP_ONERROR; + public const int DISPID_IHTMLIMGELEMENT_ONABORT = DISPID_EVPROP_ONABORT; + public const int DISPID_IHTMLIMGELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLIMGELEMENT_WIDTH = STDPROPID_XOBJ_WIDTH; + public const int DISPID_IHTMLIMGELEMENT_HEIGHT = STDPROPID_XOBJ_HEIGHT; + public const int DISPID_IHTMLIMGELEMENT_START = DISPID_IMGBASE + 13; + + // DISPIDs for interface IHTMLTxtRange + public const int DISPID_RANGE = DISPID_NORMAL_FIRST; + + public const int DISPID_IHTMLTXTRANGE_HTMLTEXT = DISPID_RANGE + 3; + public const int DISPID_IHTMLTXTRANGE_TEXT = DISPID_RANGE + 4; + public const int DISPID_IHTMLTXTRANGE_PARENTELEMENT = DISPID_RANGE + 6; + public const int DISPID_IHTMLTXTRANGE_DUPLICATE = DISPID_RANGE + 8; + public const int DISPID_IHTMLTXTRANGE_INRANGE = DISPID_RANGE + 10; + public const int DISPID_IHTMLTXTRANGE_ISEQUAL = DISPID_RANGE + 11; + public const int DISPID_IHTMLTXTRANGE_SCROLLINTOVIEW = DISPID_RANGE + 12; + public const int DISPID_IHTMLTXTRANGE_COLLAPSE = DISPID_RANGE + 13; + public const int DISPID_IHTMLTXTRANGE_EXPAND = DISPID_RANGE + 14; + public const int DISPID_IHTMLTXTRANGE_MOVE = DISPID_RANGE + 15; + public const int DISPID_IHTMLTXTRANGE_MOVESTART = DISPID_RANGE + 16; + public const int DISPID_IHTMLTXTRANGE_MOVEEND = DISPID_RANGE + 17; + public const int DISPID_IHTMLTXTRANGE_SELECT = DISPID_RANGE + 24; + public const int DISPID_IHTMLTXTRANGE_PASTEHTML = DISPID_RANGE + 26; + public const int DISPID_IHTMLTXTRANGE_MOVETOELEMENTTEXT = DISPID_RANGE + 1; + public const int DISPID_IHTMLTXTRANGE_SETENDPOINT = DISPID_RANGE + 25; + public const int DISPID_IHTMLTXTRANGE_COMPAREENDPOINTS = DISPID_RANGE + 18; + public const int DISPID_IHTMLTXTRANGE_FINDTEXT = DISPID_RANGE + 19; + public const int DISPID_IHTMLTXTRANGE_MOVETOPOINT = DISPID_RANGE + 20; + public const int DISPID_IHTMLTXTRANGE_GETBOOKMARK = DISPID_RANGE + 21; + public const int DISPID_IHTMLTXTRANGE_MOVETOBOOKMARK = DISPID_RANGE + 9; + public const int DISPID_IHTMLTXTRANGE_QUERYCOMMANDSUPPORTED = DISPID_RANGE + 27; + public const int DISPID_IHTMLTXTRANGE_QUERYCOMMANDENABLED = DISPID_RANGE + 28; + public const int DISPID_IHTMLTXTRANGE_QUERYCOMMANDSTATE = DISPID_RANGE + 29; + public const int DISPID_IHTMLTXTRANGE_QUERYCOMMANDINDETERM = DISPID_RANGE + 30; + public const int DISPID_IHTMLTXTRANGE_QUERYCOMMANDTEXT = DISPID_RANGE + 31; + public const int DISPID_IHTMLTXTRANGE_QUERYCOMMANDVALUE = DISPID_RANGE + 32; + public const int DISPID_IHTMLTXTRANGE_EXECCOMMAND = DISPID_RANGE + 33; + public const int DISPID_IHTMLTXTRANGE_EXECCOMMANDSHOWHELP = DISPID_RANGE + 34; + + // DISPIDs for interface IHTMLDOMAttribute + + public const int DISPID_DOMATTRIBUTE = DISPID_NORMAL_FIRST; + + public const int DISPID_IHTMLDOMATTRIBUTE_NODENAME = DISPID_DOMATTRIBUTE; + public const int DISPID_IHTMLDOMATTRIBUTE_NODEVALUE = DISPID_DOMATTRIBUTE + 2; + public const int DISPID_IHTMLDOMATTRIBUTE_SPECIFIED = DISPID_DOMATTRIBUTE + 1; + + // DISPIDs for interface IHTMLAttributeCollection + + public const int DISPID_IHTMLATTRIBUTECOLLECTION_LENGTH = DISPID_COLLECTION; + public const int DISPID_IHTMLATTRIBUTECOLLECTION__NEWENUM = DISPID_NEWENUM; + public const int DISPID_IHTMLATTRIBUTECOLLECTION_ITEM = DISPID_VALUE; + + // DISPIDs for interface IHTMLStyleSheetsCollection + + public const int DISPID_STYLESHEETS_COL = DISPID_NORMAL_FIRST; + + public const int DISPID_IHTMLSTYLESHEETSCOLLECTION_LENGTH = DISPID_STYLESHEETS_COL + 1; + public const int DISPID_IHTMLSTYLESHEETSCOLLECTION__NEWENUM = DISPID_NEWENUM; + public const int DISPID_IHTMLSTYLESHEETSCOLLECTION_ITEM = DISPID_VALUE; + + // DISPIDs for interface IHTMLSelectionObject + + public const int DISPID_SELECTOBJ = DISPID_NORMAL_FIRST; + + public const int DISPID_IHTMLSELECTIONOBJECT_CREATERANGE = DISPID_SELECTOBJ + 1; + public const int DISPID_IHTMLSELECTIONOBJECT_EMPTY = DISPID_SELECTOBJ + 2; + public const int DISPID_IHTMLSELECTIONOBJECT_CLEAR = DISPID_SELECTOBJ + 3; + public const int DISPID_IHTMLSELECTIONOBJECT_TYPE = DISPID_SELECTOBJ + 4; + + // DISPIDS for interface IHTMLBodyElement + public const int DISPID_TEXTSITE = DISPID_NORMAL_FIRST; + public const int DISPID_BODY = (DISPID_TEXTSITE + 1000); + public const int DISPID_IHTMLBODYELEMENT_CREATETEXTRANGE = DISPID_BODY + 13; + + // DISPIDs for interface IHTMLDOMTextNode + public const int DISPID_DOMTEXTNODE = DISPID_NORMAL_FIRST; + + public const int DISPID_IHTMLDOMTEXTNODE_DATA = DISPID_DOMTEXTNODE; + public const int DISPID_IHTMLDOMTEXTNODE_TOSTRING = DISPID_DOMTEXTNODE + 1; + public const int DISPID_IHTMLDOMTEXTNODE_LENGTH = DISPID_DOMTEXTNODE + 2; + public const int DISPID_IHTMLDOMTEXTNODE_SPLITTEXT = DISPID_DOMTEXTNODE + 3; + + // DISPIDs for interface IHTMLDOMTextNode2 + public const int DISPID_IHTMLDOMTEXTNODE2_SUBSTRINGDATA = DISPID_DOMTEXTNODE + 4; + public const int DISPID_IHTMLDOMTEXTNODE2_APPENDDATA = DISPID_DOMTEXTNODE + 5; + public const int DISPID_IHTMLDOMTEXTNODE2_INSERTDATA = DISPID_DOMTEXTNODE + 6; + public const int DISPID_IHTMLDOMTEXTNODE2_DELETEDATA = DISPID_DOMTEXTNODE + 7; + public const int DISPID_IHTMLDOMTEXTNODE2_REPLACEDATA = DISPID_DOMTEXTNODE + 8; + + // DISPIDs for interface IHTMLDOMAttribute2 + public const int DISPID_IHTMLDOMATTRIBUTE2_NAME = DISPID_DOMATTRIBUTE + 3; + public const int DISPID_IHTMLDOMATTRIBUTE2_VALUE = DISPID_DOMATTRIBUTE + 4; + public const int DISPID_IHTMLDOMATTRIBUTE2_EXPANDO = DISPID_DOMATTRIBUTE + 5; + public const int DISPID_IHTMLDOMATTRIBUTE2_NODETYPE = DISPID_DOMATTRIBUTE + 6; + public const int DISPID_IHTMLDOMATTRIBUTE2_PARENTNODE = DISPID_DOMATTRIBUTE + 7; + public const int DISPID_IHTMLDOMATTRIBUTE2_CHILDNODES = DISPID_DOMATTRIBUTE + 8; + public const int DISPID_IHTMLDOMATTRIBUTE2_FIRSTCHILD = DISPID_DOMATTRIBUTE + 9; + public const int DISPID_IHTMLDOMATTRIBUTE2_LASTCHILD = DISPID_DOMATTRIBUTE + 10; + public const int DISPID_IHTMLDOMATTRIBUTE2_PREVIOUSSIBLING = DISPID_DOMATTRIBUTE + 11; + public const int DISPID_IHTMLDOMATTRIBUTE2_NEXTSIBLING = DISPID_DOMATTRIBUTE + 12; + public const int DISPID_IHTMLDOMATTRIBUTE2_ATTRIBUTES = DISPID_DOMATTRIBUTE + 13; + public const int DISPID_IHTMLDOMATTRIBUTE2_OWNERDOCUMENT = DISPID_DOMATTRIBUTE + 14; + public const int DISPID_IHTMLDOMATTRIBUTE2_INSERTBEFORE = DISPID_DOMATTRIBUTE + 15; + public const int DISPID_IHTMLDOMATTRIBUTE2_REPLACECHILD = DISPID_DOMATTRIBUTE + 16; + public const int DISPID_IHTMLDOMATTRIBUTE2_REMOVECHILD = DISPID_DOMATTRIBUTE + 17; + public const int DISPID_IHTMLDOMATTRIBUTE2_APPENDCHILD = DISPID_DOMATTRIBUTE + 18; + public const int DISPID_IHTMLDOMATTRIBUTE2_HASCHILDNODES = DISPID_DOMATTRIBUTE + 19; + public const int DISPID_IHTMLDOMATTRIBUTE2_CLONENODE = DISPID_DOMATTRIBUTE + 20; + + public const int DISPID_HEDELEMS = DISPID_NORMAL_FIRST; + + // DISPIDs for interface IHTMLHeadElement + public const int DISPID_IHTMLHEADELEMENT_PROFILE = DISPID_HEDELEMS + 1; + + public const int DISPID_A_VALUE = DISPID_A_FIRST + 101; + // DISPIDs for interface IHTMLTitleElement + public const int DISPID_IHTMLTITLEELEMENT_TEXT = DISPID_A_VALUE; + + // DISPIDs for interface IHTMLMetaElement + public const int DISPID_IHTMLMETAELEMENT_HTTPEQUIV = DISPID_HEDELEMS + 1; + public const int DISPID_IHTMLMETAELEMENT_CONTENT = DISPID_HEDELEMS + 2; + public const int DISPID_IHTMLMETAELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLMETAELEMENT_URL = DISPID_HEDELEMS + 3; + public const int DISPID_IHTMLMETAELEMENT_CHARSET = DISPID_HEDELEMS + 13; + + // DISPIDs for interface IHTMLMetaElement2 + public const int DISPID_IHTMLMETAELEMENT2_SCHEME = DISPID_HEDELEMS + 20; + + // DISPIDs for interface IHTMLBaseElement + public const int DISPID_IHTMLBASEELEMENT_HREF = DISPID_HEDELEMS + 3; + public const int DISPID_IHTMLBASEELEMENT_TARGET = DISPID_HEDELEMS + 4; + + // DISPIDs for interface IHTMLNextIdElement + public const int DISPID_IHTMLNEXTIDELEMENT_N = DISPID_HEDELEMS + 12; + + public const int DISPID_A_COLOR = DISPID_A_FIRST + 2; + public const int DISPID_A_FONTFACE = DISPID_A_FIRST + 18; + public const int DISPID_A_FONTSIZE = DISPID_A_FIRST + 19; + public const int DISPID_A_FONTSTYLE = DISPID_A_FIRST + 24; + public const int DISPID_A_FONTVARIANT = DISPID_A_FIRST + 25; + public const int DISPID_A_BASEFONT = DISPID_A_FIRST + 26; + public const int DISPID_A_FONTWEIGHT = DISPID_A_FIRST + 27; + + // DISPIDs for interface IHTMLBaseFontElement + public const int DISPID_IHTMLBASEFONTELEMENT_COLOR = DISPID_A_COLOR; + public const int DISPID_IHTMLBASEFONTELEMENT_FACE = DISPID_A_FONTFACE; + public const int DISPID_IHTMLBASEFONTELEMENT_SIZE = DISPID_A_BASEFONT; + + public const int DISPID_SCRIPT = DISPID_NORMAL_FIRST; + // DISPIDs for interface IHTMLScriptElement + public const int DISPID_IHTMLSCRIPTELEMENT_SRC = DISPID_SCRIPT + 1; + public const int DISPID_IHTMLSCRIPTELEMENT_HTMLFOR = DISPID_SCRIPT + 4; + public const int DISPID_IHTMLSCRIPTELEMENT_EVENT = DISPID_SCRIPT + 5; + public const int DISPID_IHTMLSCRIPTELEMENT_TEXT = DISPID_SCRIPT + 6; + public const int DISPID_IHTMLSCRIPTELEMENT_DEFER = DISPID_SCRIPT + 7; + public const int DISPID_IHTMLSCRIPTELEMENT_READYSTATE = DISPID_A_READYSTATE; + public const int DISPID_IHTMLSCRIPTELEMENT_ONERROR = DISPID_EVPROP_ONERROR; + public const int DISPID_IHTMLSCRIPTELEMENT_TYPE = DISPID_SCRIPT + 9; + + private const int DISPID_COMMENTPDL = DISPID_NORMAL_FIRST; + // DISPIDs for interface IHTMLCommentElement + public const int DISPID_IHTMLCOMMENTELEMENT_TEXT = DISPID_COMMENTPDL + 1; + public const int DISPID_IHTMLCOMMENTELEMENT_ATOMIC = DISPID_COMMENTPDL + 2; + + public const int DISPID_TABLE = DISPID_NORMAL_FIRST; + public const int DISPID_TABLESECTION = DISPID_NORMAL_FIRST; + public const int DISPID_TABLEROW = DISPID_NORMAL_FIRST; + public const int DISPID_TABLECOL = DISPID_NORMAL_FIRST; + public const int DISPID_A_BACKGROUNDIMAGE = DISPID_A_FIRST + 1; + public const int DISPID_A_TABLEBORDERCOLOR = DISPID_A_FIRST + 28; + public const int DISPID_A_TABLEBORDERCOLORLIGHT = DISPID_A_FIRST + 29; + public const int DISPID_A_TABLEBORDERCOLORDARK = DISPID_A_FIRST + 30; + public const int DISPID_A_TABLEVALIGN = DISPID_A_FIRST + 31; + //unchecked((int)0x48) + public const int STDPROPID_XOBJ_BLOCKALIGN = DISPID_XOBJ_BASE + 0x48; + public const int DISPID_TABLECELL = DISPID_TEXTSITE + 1000; + public const int DISPID_A_NOWRAP = DISPID_A_FIRST + 5; + + // DISPIDs for interface IHTMLTable + public const int DISPID_IHTMLTABLE_COLS = DISPID_TABLE + 1; + public const int DISPID_IHTMLTABLE_BORDER = DISPID_TABLE + 2; + public const int DISPID_IHTMLTABLE_FRAME = DISPID_TABLE + 4; + public const int DISPID_IHTMLTABLE_RULES = DISPID_TABLE + 3; + public const int DISPID_IHTMLTABLE_CELLSPACING = DISPID_TABLE + 5; + public const int DISPID_IHTMLTABLE_CELLPADDING = DISPID_TABLE + 6; + public const int DISPID_IHTMLTABLE_BACKGROUND = DISPID_A_BACKGROUNDIMAGE; + public const int DISPID_IHTMLTABLE_BGCOLOR = DISPID_BACKCOLOR; + public const int DISPID_IHTMLTABLE_BORDERCOLOR = DISPID_A_TABLEBORDERCOLOR; + public const int DISPID_IHTMLTABLE_BORDERCOLORLIGHT = DISPID_A_TABLEBORDERCOLORLIGHT; + public const int DISPID_IHTMLTABLE_BORDERCOLORDARK = DISPID_A_TABLEBORDERCOLORDARK; + public const int DISPID_IHTMLTABLE_ALIGN = STDPROPID_XOBJ_CONTROLALIGN; + public const int DISPID_IHTMLTABLE_REFRESH = DISPID_TABLE + 15; + public const int DISPID_IHTMLTABLE_ROWS = DISPID_TABLE + 16; + public const int DISPID_IHTMLTABLE_WIDTH = STDPROPID_XOBJ_WIDTH; + public const int DISPID_IHTMLTABLE_HEIGHT = STDPROPID_XOBJ_HEIGHT; + public const int DISPID_IHTMLTABLE_DATAPAGESIZE = DISPID_TABLE + 17; + public const int DISPID_IHTMLTABLE_NEXTPAGE = DISPID_TABLE + 18; + public const int DISPID_IHTMLTABLE_PREVIOUSPAGE = DISPID_TABLE + 19; + public const int DISPID_IHTMLTABLE_THEAD = DISPID_TABLE + 20; + public const int DISPID_IHTMLTABLE_TFOOT = DISPID_TABLE + 21; + public const int DISPID_IHTMLTABLE_TBODIES = DISPID_TABLE + 24; + public const int DISPID_IHTMLTABLE_CAPTION = DISPID_TABLE + 25; + public const int DISPID_IHTMLTABLE_CREATETHEAD = DISPID_TABLE + 26; + public const int DISPID_IHTMLTABLE_DELETETHEAD = DISPID_TABLE + 27; + public const int DISPID_IHTMLTABLE_CREATETFOOT = DISPID_TABLE + 28; + public const int DISPID_IHTMLTABLE_DELETETFOOT = DISPID_TABLE + 29; + public const int DISPID_IHTMLTABLE_CREATECAPTION = DISPID_TABLE + 30; + public const int DISPID_IHTMLTABLE_DELETECAPTION = DISPID_TABLE + 31; + public const int DISPID_IHTMLTABLE_INSERTROW = DISPID_TABLE + 32; + public const int DISPID_IHTMLTABLE_DELETEROW = DISPID_TABLE + 33; + public const int DISPID_IHTMLTABLE_READYSTATE = DISPID_A_READYSTATE; + public const int DISPID_IHTMLTABLE_ONREADYSTATECHANGE = DISPID_EVPROP_ONREADYSTATECHANGE; + + // DISPIDs for interface IHTMLTable2 + public const int DISPID_IHTMLTABLE2_FIRSTPAGE = DISPID_TABLE + 35; + public const int DISPID_IHTMLTABLE2_LASTPAGE = DISPID_TABLE + 36; + public const int DISPID_IHTMLTABLE2_CELLS = DISPID_TABLE + 37; + public const int DISPID_IHTMLTABLE2_MOVEROW = DISPID_TABLE + 38; + + // DISPIDs for interface IHTMLTable3 + public const int DISPID_IHTMLTABLE3_SUMMARY = DISPID_TABLE + 39; + + // DISPIDs for interface IHTMLTableCol + public const int DISPID_IHTMLTABLECOL_SPAN = DISPID_TABLECOL + 1; + public const int DISPID_IHTMLTABLECOL_WIDTH = STDPROPID_XOBJ_WIDTH; + public const int DISPID_IHTMLTABLECOL_ALIGN = STDPROPID_XOBJ_BLOCKALIGN; + public const int DISPID_IHTMLTABLECOL_VALIGN = DISPID_A_TABLEVALIGN; + + // DISPIDs for interface IHTMLTableCol2 + public const int DISPID_IHTMLTABLECOL2_CH = DISPID_TABLECOL + 2; + public const int DISPID_IHTMLTABLECOL2_CHOFF = DISPID_TABLECOL + 3; + + // DISPIDs for interface IHTMLTableSection + public const int DISPID_IHTMLTABLESECTION_ALIGN = STDPROPID_XOBJ_BLOCKALIGN; + public const int DISPID_IHTMLTABLESECTION_VALIGN = DISPID_A_TABLEVALIGN; + public const int DISPID_IHTMLTABLESECTION_BGCOLOR = DISPID_BACKCOLOR; + public const int DISPID_IHTMLTABLESECTION_ROWS = DISPID_TABLESECTION; + public const int DISPID_IHTMLTABLESECTION_INSERTROW = DISPID_TABLESECTION + 1; + public const int DISPID_IHTMLTABLESECTION_DELETEROW = DISPID_TABLESECTION + 2; + + // DISPIDs for interface IHTMLTableSection2 + public const int DISPID_IHTMLTABLESECTION2_MOVEROW = DISPID_TABLESECTION + 3; + + // DISPIDs for interface IHTMLTableSection3 + public const int DISPID_IHTMLTABLESECTION3_CH = DISPID_TABLESECTION + 4; + public const int DISPID_IHTMLTABLESECTION3_CHOFF = DISPID_TABLESECTION + 5; + + // DISPIDs for interface IHTMLTableRow + public const int DISPID_IHTMLTABLEROW_ALIGN = STDPROPID_XOBJ_BLOCKALIGN; + public const int DISPID_IHTMLTABLEROW_VALIGN = DISPID_A_TABLEVALIGN; + public const int DISPID_IHTMLTABLEROW_BGCOLOR = DISPID_BACKCOLOR; + public const int DISPID_IHTMLTABLEROW_BORDERCOLOR = DISPID_A_TABLEBORDERCOLOR; + public const int DISPID_IHTMLTABLEROW_BORDERCOLORLIGHT = DISPID_A_TABLEBORDERCOLORLIGHT; + public const int DISPID_IHTMLTABLEROW_BORDERCOLORDARK = DISPID_A_TABLEBORDERCOLORDARK; + public const int DISPID_IHTMLTABLEROW_ROWINDEX = DISPID_TABLEROW; + public const int DISPID_IHTMLTABLEROW_SECTIONROWINDEX = DISPID_TABLEROW + 1; + public const int DISPID_IHTMLTABLEROW_CELLS = DISPID_TABLEROW + 2; + public const int DISPID_IHTMLTABLEROW_INSERTCELL = DISPID_TABLEROW + 3; + public const int DISPID_IHTMLTABLEROW_DELETECELL = DISPID_TABLEROW + 4; + + // DISPIDs for interface IHTMLTableRow2 + public const int DISPID_IHTMLTABLEROW2_HEIGHT = STDPROPID_XOBJ_HEIGHT; + + // DISPIDs for interface IHTMLTableRow3 + public const int DISPID_IHTMLTABLEROW3_CH = DISPID_TABLEROW + 9; + public const int DISPID_IHTMLTABLEROW3_CHOFF = DISPID_TABLEROW + 10; + + // DISPIDs for interface IHTMLTableRowMetrics + public const int DISPID_IHTMLTABLEROWMETRICS_CLIENTHEIGHT = DISPID_SITE + 19; + public const int DISPID_IHTMLTABLEROWMETRICS_CLIENTWIDTH = DISPID_SITE + 20; + public const int DISPID_IHTMLTABLEROWMETRICS_CLIENTTOP = DISPID_SITE + 21; + public const int DISPID_IHTMLTABLEROWMETRICS_CLIENTLEFT = DISPID_SITE + 22; + + // DISPIDs for interface IHTMLTableCell + public const int DISPID_IHTMLTABLECELL_ROWSPAN = DISPID_TABLECELL + 1; + public const int DISPID_IHTMLTABLECELL_COLSPAN = DISPID_TABLECELL + 2; + public const int DISPID_IHTMLTABLECELL_ALIGN = STDPROPID_XOBJ_BLOCKALIGN; + public const int DISPID_IHTMLTABLECELL_VALIGN = DISPID_A_TABLEVALIGN; + public const int DISPID_IHTMLTABLECELL_BGCOLOR = DISPID_BACKCOLOR; + public const int DISPID_IHTMLTABLECELL_NOWRAP = DISPID_A_NOWRAP; + public const int DISPID_IHTMLTABLECELL_BACKGROUND = DISPID_A_BACKGROUNDIMAGE; + public const int DISPID_IHTMLTABLECELL_BORDERCOLOR = DISPID_A_TABLEBORDERCOLOR; + public const int DISPID_IHTMLTABLECELL_BORDERCOLORLIGHT = DISPID_A_TABLEBORDERCOLORLIGHT; + public const int DISPID_IHTMLTABLECELL_BORDERCOLORDARK = DISPID_A_TABLEBORDERCOLORDARK; + public const int DISPID_IHTMLTABLECELL_WIDTH = STDPROPID_XOBJ_WIDTH; + public const int DISPID_IHTMLTABLECELL_HEIGHT = STDPROPID_XOBJ_HEIGHT; + public const int DISPID_IHTMLTABLECELL_CELLINDEX = DISPID_TABLECELL + 3; + + // DISPIDs for interface IHTMLTableCell + public const int DISPID_IHTMLTABLECELL2_ABBR = DISPID_TABLECELL + 4; + public const int DISPID_IHTMLTABLECELL2_AXIS = DISPID_TABLECELL + 5; + public const int DISPID_IHTMLTABLECELL2_CH = DISPID_TABLECELL + 6; + public const int DISPID_IHTMLTABLECELL2_CHOFF = DISPID_TABLECELL + 7; + public const int DISPID_IHTMLTABLECELL2_HEADERS = DISPID_TABLECELL + 8; + public const int DISPID_IHTMLTABLECELL2_SCOPE = DISPID_TABLECELL + 9; + + // DISPIDs for event set HTMLElementEvents2 + + public const int DISPID_HTMLELEMENTEVENTS2_ONHELP = DISPID_EVMETH_ONHELP; + public const int DISPID_HTMLELEMENTEVENTS2_ONCLICK = DISPID_EVMETH_ONCLICK; + public const int DISPID_HTMLELEMENTEVENTS2_ONDBLCLICK = DISPID_EVMETH_ONDBLCLICK; + public const int DISPID_HTMLELEMENTEVENTS2_ONKEYPRESS = DISPID_EVMETH_ONKEYPRESS; + public const int DISPID_HTMLELEMENTEVENTS2_ONKEYDOWN = DISPID_EVMETH_ONKEYDOWN; + public const int DISPID_HTMLELEMENTEVENTS2_ONKEYUP = DISPID_EVMETH_ONKEYUP; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOUSEOUT = DISPID_EVMETH_ONMOUSEOUT; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER = DISPID_EVMETH_ONMOUSEOVER; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOUSEMOVE = DISPID_EVMETH_ONMOUSEMOVE; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOUSEDOWN = DISPID_EVMETH_ONMOUSEDOWN; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOUSEUP = DISPID_EVMETH_ONMOUSEUP; + public const int DISPID_HTMLELEMENTEVENTS2_ONSELECTSTART = DISPID_EVMETH_ONSELECTSTART; + public const int DISPID_HTMLELEMENTEVENTS2_ONFILTERCHANGE = DISPID_EVMETH_ONFILTER; + public const int DISPID_HTMLELEMENTEVENTS2_ONDRAGSTART = DISPID_EVMETH_ONDRAGSTART; + public const int DISPID_HTMLELEMENTEVENTS2_ONBEFOREUPDATE = DISPID_EVMETH_ONBEFOREUPDATE; + public const int DISPID_HTMLELEMENTEVENTS2_ONAFTERUPDATE = DISPID_EVMETH_ONAFTERUPDATE; + public const int DISPID_HTMLELEMENTEVENTS2_ONERRORUPDATE = DISPID_EVMETH_ONERRORUPDATE; + public const int DISPID_HTMLELEMENTEVENTS2_ONROWEXIT = DISPID_EVMETH_ONROWEXIT; + public const int DISPID_HTMLELEMENTEVENTS2_ONROWENTER = DISPID_EVMETH_ONROWENTER; + public const int DISPID_HTMLELEMENTEVENTS2_ONDATASETCHANGED = DISPID_EVMETH_ONDATASETCHANGED; + public const int DISPID_HTMLELEMENTEVENTS2_ONDATAAVAILABLE = DISPID_EVMETH_ONDATAAVAILABLE; + public const int DISPID_HTMLELEMENTEVENTS2_ONDATASETCOMPLETE = DISPID_EVMETH_ONDATASETCOMPLETE; + public const int DISPID_HTMLELEMENTEVENTS2_ONLOSECAPTURE = DISPID_EVMETH_ONLOSECAPTURE; + public const int DISPID_HTMLELEMENTEVENTS2_ONPROPERTYCHANGE = DISPID_EVMETH_ONPROPERTYCHANGE; + public const int DISPID_HTMLELEMENTEVENTS2_ONSCROLL = DISPID_EVMETH_ONSCROLL; + public const int DISPID_HTMLELEMENTEVENTS2_ONFOCUS = DISPID_EVMETH_ONFOCUS; + public const int DISPID_HTMLELEMENTEVENTS2_ONBLUR = DISPID_EVMETH_ONBLUR; + public const int DISPID_HTMLELEMENTEVENTS2_ONRESIZE = DISPID_EVMETH_ONRESIZE; + public const int DISPID_HTMLELEMENTEVENTS2_ONDRAG = DISPID_EVMETH_ONDRAG; + public const int DISPID_HTMLELEMENTEVENTS2_ONDRAGEND = DISPID_EVMETH_ONDRAGEND; + public const int DISPID_HTMLELEMENTEVENTS2_ONDRAGENTER = DISPID_EVMETH_ONDRAGENTER; + public const int DISPID_HTMLELEMENTEVENTS2_ONDRAGOVER = DISPID_EVMETH_ONDRAGOVER; + public const int DISPID_HTMLELEMENTEVENTS2_ONDRAGLEAVE = DISPID_EVMETH_ONDRAGLEAVE; + public const int DISPID_HTMLELEMENTEVENTS2_ONDROP = DISPID_EVMETH_ONDROP; + public const int DISPID_HTMLELEMENTEVENTS2_ONBEFORECUT = DISPID_EVMETH_ONBEFORECUT; + public const int DISPID_HTMLELEMENTEVENTS2_ONCUT = DISPID_EVMETH_ONCUT; + public const int DISPID_HTMLELEMENTEVENTS2_ONBEFORECOPY = DISPID_EVMETH_ONBEFORECOPY; + public const int DISPID_HTMLELEMENTEVENTS2_ONCOPY = DISPID_EVMETH_ONCOPY; + public const int DISPID_HTMLELEMENTEVENTS2_ONBEFOREPASTE = DISPID_EVMETH_ONBEFOREPASTE; + public const int DISPID_HTMLELEMENTEVENTS2_ONPASTE = DISPID_EVMETH_ONPASTE; + public const int DISPID_HTMLELEMENTEVENTS2_ONCONTEXTMENU = DISPID_EVMETH_ONCONTEXTMENU; + public const int DISPID_HTMLELEMENTEVENTS2_ONROWSDELETE = DISPID_EVMETH_ONROWSDELETE; + public const int DISPID_HTMLELEMENTEVENTS2_ONROWSINSERTED = DISPID_EVMETH_ONROWSINSERTED; + public const int DISPID_HTMLELEMENTEVENTS2_ONCELLCHANGE = DISPID_EVMETH_ONCELLCHANGE; + public const int DISPID_HTMLELEMENTEVENTS2_ONREADYSTATECHANGE = DISPID_EVMETH_ONREADYSTATECHANGE; + public const int DISPID_HTMLELEMENTEVENTS2_ONLAYOUTCOMPLETE = DISPID_EVMETH_ONLAYOUTCOMPLETE; + public const int DISPID_HTMLELEMENTEVENTS2_ONPAGE = DISPID_EVMETH_ONPAGE; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOUSEENTER = DISPID_EVMETH_ONMOUSEENTER; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOUSELEAVE = DISPID_EVMETH_ONMOUSELEAVE; + public const int DISPID_HTMLELEMENTEVENTS2_ONACTIVATE = DISPID_EVMETH_ONACTIVATE; + public const int DISPID_HTMLELEMENTEVENTS2_ONDEACTIVATE = DISPID_EVMETH_ONDEACTIVATE; + public const int DISPID_HTMLELEMENTEVENTS2_ONBEFOREDEACTIVATE = DISPID_EVMETH_ONBEFOREDEACTIVATE; + public const int DISPID_HTMLELEMENTEVENTS2_ONBEFOREACTIVATE = DISPID_EVMETH_ONBEFOREACTIVATE; + public const int DISPID_HTMLELEMENTEVENTS2_ONFOCUSIN = DISPID_EVMETH_ONFOCUSIN; + public const int DISPID_HTMLELEMENTEVENTS2_ONFOCUSOUT = DISPID_EVMETH_ONFOCUSOUT; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOVE = DISPID_EVMETH_ONMOVE; + public const int DISPID_HTMLELEMENTEVENTS2_ONCONTROLSELECT = DISPID_EVMETH_ONCONTROLSELECT; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOVESTART = DISPID_EVMETH_ONMOVESTART; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOVEEND = DISPID_EVMETH_ONMOVEEND; + public const int DISPID_HTMLELEMENTEVENTS2_ONRESIZESTART = DISPID_EVMETH_ONRESIZESTART; + public const int DISPID_HTMLELEMENTEVENTS2_ONRESIZEEND = DISPID_EVMETH_ONRESIZEEND; + public const int DISPID_HTMLELEMENTEVENTS2_ONMOUSEWHEEL = DISPID_EVMETH_ONMOUSEWHEEL; + + public const int DISPID_HR = DISPID_NORMAL_FIRST; + public const int DISPID_IHTMLHRELEMENT_ALIGN = STDPROPID_XOBJ_BLOCKALIGN; + public const int DISPID_IHTMLHRELEMENT_COLOR = DISPID_A_COLOR; + public const int DISPID_IHTMLHRELEMENT_NOSHADE = DISPID_HR + 1; + public const int DISPID_IHTMLHRELEMENT_WIDTH = STDPROPID_XOBJ_WIDTH; + public const int DISPID_IHTMLHRELEMENT_SIZE = STDPROPID_XOBJ_HEIGHT; + + + // DISPIDs for interface IHTMLInputElement + + public const int DISPID_IHTMLINPUTELEMENT_TYPE = DISPID_INPUT; + public const int DISPID_IHTMLINPUTELEMENT_VALUE = DISPID_A_VALUE; + public const int DISPID_IHTMLINPUTELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLINPUTELEMENT_STATUS = DISPID_INPUT + 1; + public const int DISPID_IHTMLINPUTELEMENT_DISABLED = STDPROPID_XOBJ_DISABLED; + public const int DISPID_IHTMLINPUTELEMENT_FORM = DISPID_SITE + 4; + public const int DISPID_IHTMLINPUTELEMENT_SIZE = DISPID_INPUT + 2; + public const int DISPID_IHTMLINPUTELEMENT_MAXLENGTH = DISPID_INPUT + 3; + public const int DISPID_IHTMLINPUTELEMENT_SELECT = DISPID_INPUT + 4; + public const int DISPID_IHTMLINPUTELEMENT_ONCHANGE = DISPID_EVPROP_ONCHANGE; + public const int DISPID_IHTMLINPUTELEMENT_ONSELECT = DISPID_EVPROP_ONSELECT; + public const int DISPID_IHTMLINPUTELEMENT_DEFAULTVALUE = DISPID_DEFAULTVALUE; + public const int DISPID_IHTMLINPUTELEMENT_READONLY = DISPID_INPUT + 5; + public const int DISPID_IHTMLINPUTELEMENT_CREATETEXTRANGE = DISPID_INPUT + 6; + public const int DISPID_IHTMLINPUTELEMENT_INDETERMINATE = DISPID_INPUT + 7; + public const int DISPID_IHTMLINPUTELEMENT_DEFAULTCHECKED = DISPID_INPUT + 8; + public const int DISPID_IHTMLINPUTELEMENT_CHECKED = DISPID_INPUT + 9; + public const int DISPID_IHTMLINPUTELEMENT_BORDER = DISPID_INPUT + 12; + public const int DISPID_IHTMLINPUTELEMENT_VSPACE = DISPID_INPUT + 13; + public const int DISPID_IHTMLINPUTELEMENT_HSPACE = DISPID_INPUT + 14; + public const int DISPID_IHTMLINPUTELEMENT_ALT = DISPID_INPUT + 10; + public const int DISPID_IHTMLINPUTELEMENT_SRC = DISPID_INPUT + 11; + public const int DISPID_IHTMLINPUTELEMENT_LOWSRC = DISPID_INPUT + 15; + public const int DISPID_IHTMLINPUTELEMENT_VRML = DISPID_INPUT + 16; + public const int DISPID_IHTMLINPUTELEMENT_DYNSRC = DISPID_INPUT + 17; + public const int DISPID_IHTMLINPUTELEMENT_READYSTATE = DISPID_A_READYSTATE; + public const int DISPID_IHTMLINPUTELEMENT_COMPLETE = DISPID_INPUT + 18; + public const int DISPID_IHTMLINPUTELEMENT_LOOP = DISPID_INPUT + 19; + public const int DISPID_IHTMLINPUTELEMENT_ALIGN = STDPROPID_XOBJ_CONTROLALIGN; + public const int DISPID_IHTMLINPUTELEMENT_ONLOAD = DISPID_EVPROP_ONLOAD; + public const int DISPID_IHTMLINPUTELEMENT_ONERROR = DISPID_EVPROP_ONERROR; + public const int DISPID_IHTMLINPUTELEMENT_ONABORT = DISPID_EVPROP_ONABORT; + public const int DISPID_IHTMLINPUTELEMENT_WIDTH = STDPROPID_XOBJ_WIDTH; + public const int DISPID_IHTMLINPUTELEMENT_HEIGHT = STDPROPID_XOBJ_HEIGHT; + public const int DISPID_IHTMLINPUTELEMENT_START = DISPID_INPUT + 20; + + // DISPIDs for interface IHTMLSelectElement + + public const int DISPID_IHTMLSELECTELEMENT_SIZE = DISPID_SELECT + 2; + public const int DISPID_IHTMLSELECTELEMENT_MULTIPLE = DISPID_SELECT + 3; + public const int DISPID_IHTMLSELECTELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLSELECTELEMENT_OPTIONS = DISPID_SELECT + 5; + public const int DISPID_IHTMLSELECTELEMENT_ONCHANGE = DISPID_EVPROP_ONCHANGE; + public const int DISPID_IHTMLSELECTELEMENT_SELECTEDINDEX = DISPID_SELECT + 10; + public const int DISPID_IHTMLSELECTELEMENT_TYPE = DISPID_SELECT + 12; + public const int DISPID_IHTMLSELECTELEMENT_VALUE = DISPID_SELECT + 11; + public const int DISPID_IHTMLSELECTELEMENT_DISABLED = STDPROPID_XOBJ_DISABLED; + public const int DISPID_IHTMLSELECTELEMENT_FORM = DISPID_SITE + 4; + public const int DISPID_IHTMLSELECTELEMENT_ADD = DISPID_COLLECTION + 3; + public const int DISPID_IHTMLSELECTELEMENT_REMOVE = DISPID_COLLECTION + 4; + public const int DISPID_IHTMLSELECTELEMENT_LENGTH = DISPID_COLLECTION; + public const int DISPID_IHTMLSELECTELEMENT__NEWENUM = DISPID_NEWENUM; + public const int DISPID_IHTMLSELECTELEMENT_ITEM = DISPID_VALUE; + public const int DISPID_IHTMLSELECTELEMENT_TAGS = DISPID_COLLECTION + 2; + + // DISPIDs for interface IHTMLTextAreaElement + public const int DISPID_TEXTAREA = (DISPID_INPUTTEXT + 1000); + public const int DISPID_MARQUEE = (DISPID_TEXTAREA + 1000); + public const int DISPID_RICHTEXT = (DISPID_MARQUEE + 1000); + + public const int DISPID_IHTMLTEXTAREAELEMENT_TYPE = DISPID_INPUT; + public const int DISPID_IHTMLTEXTAREAELEMENT_VALUE = DISPID_A_VALUE; + public const int DISPID_IHTMLTEXTAREAELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLTEXTAREAELEMENT_STATUS = DISPID_INPUT + 1; + public const int DISPID_IHTMLTEXTAREAELEMENT_DISABLED = STDPROPID_XOBJ_DISABLED; + public const int DISPID_IHTMLTEXTAREAELEMENT_FORM = DISPID_SITE + 4; + public const int DISPID_IHTMLTEXTAREAELEMENT_DEFAULTVALUE = DISPID_DEFAULTVALUE; + public const int DISPID_IHTMLTEXTAREAELEMENT_SELECT = DISPID_RICHTEXT + 5; + public const int DISPID_IHTMLTEXTAREAELEMENT_ONCHANGE = DISPID_EVPROP_ONCHANGE; + public const int DISPID_IHTMLTEXTAREAELEMENT_ONSELECT = DISPID_EVPROP_ONSELECT; + public const int DISPID_IHTMLTEXTAREAELEMENT_READONLY = DISPID_RICHTEXT + 4; + public const int DISPID_IHTMLTEXTAREAELEMENT_ROWS = DISPID_RICHTEXT + 1; + public const int DISPID_IHTMLTEXTAREAELEMENT_COLS = DISPID_RICHTEXT + 2; + public const int DISPID_IHTMLTEXTAREAELEMENT_WRAP = DISPID_RICHTEXT + 3; + public const int DISPID_IHTMLTEXTAREAELEMENT_CREATETEXTRANGE = DISPID_RICHTEXT + 6; + + // DISPIDs for interface IHTMLFormElement + + public const int DISPID_FORM = DISPID_NORMAL_FIRST; + public const int DISPID_IHTMLFORMELEMENT_ACTION = DISPID_FORM + 1; + public const int DISPID_IHTMLFORMELEMENT_DIR = DISPID_A_DIR; + public const int DISPID_IHTMLFORMELEMENT_ENCODING = DISPID_FORM + 3; + public const int DISPID_IHTMLFORMELEMENT_METHOD = DISPID_FORM + 4; + public const int DISPID_IHTMLFORMELEMENT_ELEMENTS = DISPID_FORM + 5; + public const int DISPID_IHTMLFORMELEMENT_TARGET = DISPID_FORM + 6; + public const int DISPID_IHTMLFORMELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLFORMELEMENT_ONSUBMIT = DISPID_EVPROP_ONSUBMIT; + public const int DISPID_IHTMLFORMELEMENT_ONRESET = DISPID_EVPROP_ONRESET; + public const int DISPID_IHTMLFORMELEMENT_SUBMIT = DISPID_FORM + 9; + public const int DISPID_IHTMLFORMELEMENT_RESET = DISPID_FORM + 10; + public const int DISPID_IHTMLFORMELEMENT_LENGTH = DISPID_COLLECTION; + public const int DISPID_IHTMLFORMELEMENT__NEWENUM = DISPID_NEWENUM; + public const int DISPID_IHTMLFORMELEMENT_ITEM = DISPID_VALUE; + public const int DISPID_IHTMLFORMELEMENT_TAGS = DISPID_COLLECTION + 2; + + public const int DISPID_IHTMLCONTROLELEMENT_TABINDEX = STDPROPID_XOBJ_TABINDEX; + public const int DISPID_IHTMLCONTROLELEMENT_FOCUS = DISPID_SITE + 0; + public const int DISPID_IHTMLCONTROLELEMENT_ACCESSKEY = DISPID_SITE + 5; + public const int DISPID_IHTMLCONTROLELEMENT_ONBLUR = DISPID_EVPROP_ONBLUR; + public const int DISPID_IHTMLCONTROLELEMENT_ONFOCUS = DISPID_EVPROP_ONFOCUS; + public const int DISPID_IHTMLCONTROLELEMENT_ONRESIZE = DISPID_EVPROP_ONRESIZE; + public const int DISPID_IHTMLCONTROLELEMENT_BLUR = DISPID_SITE + 2; + public const int DISPID_IHTMLCONTROLELEMENT_ADDFILTER = DISPID_SITE + 17; + public const int DISPID_IHTMLCONTROLELEMENT_REMOVEFILTER = DISPID_SITE + 18; + public const int DISPID_IHTMLCONTROLELEMENT_CLIENTHEIGHT = DISPID_SITE + 19; + public const int DISPID_IHTMLCONTROLELEMENT_CLIENTWIDTH = DISPID_SITE + 20; + public const int DISPID_IHTMLCONTROLELEMENT_CLIENTTOP = DISPID_SITE + 21; + public const int DISPID_IHTMLCONTROLELEMENT_CLIENTLEFT = DISPID_SITE + 22; + + public const int DISPID_IHTMLCONTROLRANGE_SELECT = DISPID_RANGE + 2; + public const int DISPID_IHTMLCONTROLRANGE_ADD = DISPID_RANGE + 3; + public const int DISPID_IHTMLCONTROLRANGE_REMOVE = DISPID_RANGE + 4; + public const int DISPID_IHTMLCONTROLRANGE_ITEM = DISPID_VALUE; + public const int DISPID_IHTMLCONTROLRANGE_SCROLLINTOVIEW = DISPID_RANGE + 6; + public const int DISPID_IHTMLCONTROLRANGE_QUERYCOMMANDSUPPORTED = DISPID_RANGE + 7; + public const int DISPID_IHTMLCONTROLRANGE_QUERYCOMMANDENABLED = DISPID_RANGE + 8; + public const int DISPID_IHTMLCONTROLRANGE_QUERYCOMMANDSTATE = DISPID_RANGE + 9; + public const int DISPID_IHTMLCONTROLRANGE_QUERYCOMMANDINDETERM = DISPID_RANGE + 10; + public const int DISPID_IHTMLCONTROLRANGE_QUERYCOMMANDTEXT = DISPID_RANGE + 11; + public const int DISPID_IHTMLCONTROLRANGE_QUERYCOMMANDVALUE = DISPID_RANGE + 12; + public const int DISPID_IHTMLCONTROLRANGE_EXECCOMMAND = DISPID_RANGE + 13; + public const int DISPID_IHTMLCONTROLRANGE_EXECCOMMANDSHOWHELP = DISPID_RANGE + 14; + public const int DISPID_IHTMLCONTROLRANGE_COMMONPARENTELEMENT = DISPID_RANGE + 15; + public const int DISPID_IHTMLCONTROLRANGE_LENGTH = DISPID_RANGE + 5; + + // DISPIDs for interface IHTMLOptionElement + public const int DISPID_OPTION = DISPID_NORMAL_FIRST; + public const int DISPID_IHTMLOPTIONELEMENT_SELECTED = DISPID_OPTION + 1; + public const int DISPID_IHTMLOPTIONELEMENT_VALUE = DISPID_OPTION + 2; + public const int DISPID_IHTMLOPTIONELEMENT_DEFAULTSELECTED = DISPID_OPTION + 3; + public const int DISPID_IHTMLOPTIONELEMENT_INDEX = DISPID_OPTION + 5; + public const int DISPID_IHTMLOPTIONELEMENT_TEXT = DISPID_OPTION + 4; + public const int DISPID_IHTMLOPTIONELEMENT_FORM = DISPID_OPTION + 6; + + // DISPIDs for interface IHTMLFrameSetElement + public const int DISPID_FRAMESET = DISPID_NORMAL_FIRST; + public const int DISPID_IHTMLFRAMESETELEMENT_ROWS = DISPID_FRAMESET; + public const int DISPID_IHTMLFRAMESETELEMENT_COLS = DISPID_FRAMESET + 1; + public const int DISPID_IHTMLFRAMESETELEMENT_BORDER = DISPID_FRAMESET + 2; + public const int DISPID_IHTMLFRAMESETELEMENT_BORDERCOLOR = DISPID_FRAMESET + 3; + public const int DISPID_IHTMLFRAMESETELEMENT_FRAMEBORDER = DISPID_FRAMESET + 4; + public const int DISPID_IHTMLFRAMESETELEMENT_FRAMESPACING = DISPID_FRAMESET + 5; + public const int DISPID_IHTMLFRAMESETELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLFRAMESETELEMENT_ONLOAD = DISPID_EVPROP_ONLOAD; + public const int DISPID_IHTMLFRAMESETELEMENT_ONUNLOAD = DISPID_EVPROP_ONUNLOAD; + public const int DISPID_IHTMLFRAMESETELEMENT_ONBEFOREUNLOAD = DISPID_EVPROP_ONBEFOREUNLOAD; + + // DISPIDs for interface IHTMLFrameBase + public const int DISPID_FRAMESITE = (DISPID_SITE + 1000); + public const int DISPID_FRAME = (DISPID_FRAMESITE + 1000); + public const int DISPID_IFRAME = (DISPID_FRAMESITE + 1000); + + public const int DISPID_IHTMLFRAMEBASE_SRC = DISPID_FRAMESITE + 0; + public const int DISPID_IHTMLFRAMEBASE_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLFRAMEBASE_BORDER = DISPID_FRAMESITE + 2; + public const int DISPID_IHTMLFRAMEBASE_FRAMEBORDER = DISPID_FRAMESITE + 3; + public const int DISPID_IHTMLFRAMEBASE_FRAMESPACING = DISPID_FRAMESITE + 4; + public const int DISPID_IHTMLFRAMEBASE_MARGINWIDTH = DISPID_FRAMESITE + 5; + public const int DISPID_IHTMLFRAMEBASE_MARGINHEIGHT = DISPID_FRAMESITE + 6; + public const int DISPID_IHTMLFRAMEBASE_NORESIZE = DISPID_FRAMESITE + 7; + public const int DISPID_IHTMLFRAMEBASE_SCROLLING = DISPID_FRAMESITE + 8; + + // DISPIDs for interface IHTMLFrameBase2 + public const int DISPID_A_ALLOWTRANSPARENCY = (DISPID_A_FIRST + 206); + public const int DISPID_IHTMLFRAMEBASE2_CONTENTWINDOW = DISPID_FRAMESITE + 9; + public const int DISPID_IHTMLFRAMEBASE2_ONLOAD = DISPID_EVPROP_ONLOAD; + public const int DISPID_IHTMLFRAMEBASE2_ONREADYSTATECHANGE = DISPID_EVPROP_ONREADYSTATECHANGE; + public const int DISPID_IHTMLFRAMEBASE2_READYSTATE = DISPID_A_READYSTATE; + public const int DISPID_IHTMLFRAMEBASE2_ALLOWTRANSPARENCY = DISPID_A_ALLOWTRANSPARENCY; + + // DISPIDs for interface IHTMLHeaderElement + public const int DISPID_IHTMLHEADERELEMENT_ALIGN = STDPROPID_XOBJ_BLOCKALIGN; + + // DISPIDs for interface IHTMLIFrameElement + public const int DISPID_IHTMLIFRAMEELEMENT_VSPACE = DISPID_IFRAME + 1; + public const int DISPID_IHTMLIFRAMEELEMENT_HSPACE = DISPID_IFRAME + 2; + public const int DISPID_IHTMLIFRAMEELEMENT_ALIGN = STDPROPID_XOBJ_CONTROLALIGN; + // DISPIDs for interface IHTMLIFrameElement2 + public const int DISPID_IHTMLIFRAMEELEMENT2_HEIGHT = STDPROPID_XOBJ_HEIGHT; + public const int DISPID_IHTMLIFRAMEELEMENT2_WIDTH = STDPROPID_XOBJ_WIDTH; + + // DISPIDs for interface IHTMLImageElementFactory + public const int DISPID_IHTMLIMAGEELEMENTFACTORY_CREATE = DISPID_VALUE; + + // DISPIDs for interface IHTMLInputButtonElement + public const int DISPID_IHTMLINPUTBUTTONELEMENT_TYPE = DISPID_INPUT; + public const int DISPID_IHTMLINPUTBUTTONELEMENT_VALUE = DISPID_A_VALUE; + public const int DISPID_IHTMLINPUTBUTTONELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLINPUTBUTTONELEMENT_STATUS = DISPID_INPUT + 21; + public const int DISPID_IHTMLINPUTBUTTONELEMENT_DISABLED = STDPROPID_XOBJ_DISABLED; + public const int DISPID_IHTMLINPUTBUTTONELEMENT_FORM = DISPID_SITE + 4; + public const int DISPID_IHTMLINPUTBUTTONELEMENT_CREATETEXTRANGE = DISPID_INPUT + 6; + + // DISPIDs for interface IHTMLInputFileElement + public const int DISPID_IHTMLINPUTFILEELEMENT_TYPE = DISPID_INPUT; + public const int DISPID_IHTMLINPUTFILEELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLINPUTFILEELEMENT_STATUS = DISPID_INPUT + 21; + public const int DISPID_IHTMLINPUTFILEELEMENT_DISABLED = STDPROPID_XOBJ_DISABLED; + public const int DISPID_IHTMLINPUTFILEELEMENT_FORM = DISPID_SITE + 4; + public const int DISPID_IHTMLINPUTFILEELEMENT_SIZE = DISPID_INPUT + 2; + public const int DISPID_IHTMLINPUTFILEELEMENT_MAXLENGTH = DISPID_INPUT + 3; + public const int DISPID_IHTMLINPUTFILEELEMENT_SELECT = DISPID_INPUT + 4; + public const int DISPID_IHTMLINPUTFILEELEMENT_ONCHANGE = DISPID_EVPROP_ONCHANGE; + public const int DISPID_IHTMLINPUTFILEELEMENT_ONSELECT = DISPID_EVPROP_ONSELECT; + public const int DISPID_IHTMLINPUTFILEELEMENT_VALUE = DISPID_A_VALUE; + + // DISPIDs for interface IHTMLInputHiddenElement + public const int DISPID_IHTMLINPUTHIDDENELEMENT_TYPE = DISPID_INPUT; + public const int DISPID_IHTMLINPUTHIDDENELEMENT_VALUE = DISPID_A_VALUE; + public const int DISPID_IHTMLINPUTHIDDENELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLINPUTHIDDENELEMENT_STATUS = DISPID_INPUT + 21; + public const int DISPID_IHTMLINPUTHIDDENELEMENT_DISABLED = STDPROPID_XOBJ_DISABLED; + public const int DISPID_IHTMLINPUTHIDDENELEMENT_FORM = DISPID_SITE + 4; + public const int DISPID_IHTMLINPUTHIDDENELEMENT_CREATETEXTRANGE = DISPID_INPUT + 6; + + // DISPIDs for interface IHTMLInputImage + public const int DISPID_IHTMLINPUTIMAGE_TYPE = DISPID_INPUT; + public const int DISPID_IHTMLINPUTIMAGE_DISABLED = STDPROPID_XOBJ_DISABLED; + public const int DISPID_IHTMLINPUTIMAGE_BORDER = DISPID_INPUT + 12; + public const int DISPID_IHTMLINPUTIMAGE_VSPACE = DISPID_INPUT + 13; + public const int DISPID_IHTMLINPUTIMAGE_HSPACE = DISPID_INPUT + 14; + public const int DISPID_IHTMLINPUTIMAGE_ALT = DISPID_INPUT + 10; + public const int DISPID_IHTMLINPUTIMAGE_SRC = DISPID_INPUT + 11; + public const int DISPID_IHTMLINPUTIMAGE_LOWSRC = DISPID_INPUT + 15; + public const int DISPID_IHTMLINPUTIMAGE_VRML = DISPID_INPUT + 16; + public const int DISPID_IHTMLINPUTIMAGE_DYNSRC = DISPID_INPUT + 17; + public const int DISPID_IHTMLINPUTIMAGE_READYSTATE = DISPID_A_READYSTATE; + public const int DISPID_IHTMLINPUTIMAGE_COMPLETE = DISPID_INPUT + 18; + public const int DISPID_IHTMLINPUTIMAGE_LOOP = DISPID_INPUT + 19; + public const int DISPID_IHTMLINPUTIMAGE_ALIGN = STDPROPID_XOBJ_CONTROLALIGN; + public const int DISPID_IHTMLINPUTIMAGE_ONLOAD = DISPID_EVPROP_ONLOAD; + public const int DISPID_IHTMLINPUTIMAGE_ONERROR = DISPID_EVPROP_ONERROR; + public const int DISPID_IHTMLINPUTIMAGE_ONABORT = DISPID_EVPROP_ONABORT; + public const int DISPID_IHTMLINPUTIMAGE_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLINPUTIMAGE_WIDTH = STDPROPID_XOBJ_WIDTH; + public const int DISPID_IHTMLINPUTIMAGE_HEIGHT = STDPROPID_XOBJ_HEIGHT; + public const int DISPID_IHTMLINPUTIMAGE_START = DISPID_INPUT + 20; + + // DISPIDs for interface IHTMLInputTextElement + public const int DISPID_IHTMLINPUTTEXTELEMENT_TYPE = DISPID_INPUT; + public const int DISPID_IHTMLINPUTTEXTELEMENT_VALUE = DISPID_A_VALUE; + public const int DISPID_IHTMLINPUTTEXTELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLINPUTTEXTELEMENT_STATUS = DISPID_INPUT + 21; + public const int DISPID_IHTMLINPUTTEXTELEMENT_DISABLED = STDPROPID_XOBJ_DISABLED; + public const int DISPID_IHTMLINPUTTEXTELEMENT_FORM = DISPID_SITE + 4; + public const int DISPID_IHTMLINPUTTEXTELEMENT_DEFAULTVALUE = DISPID_DEFAULTVALUE; + public const int DISPID_IHTMLINPUTTEXTELEMENT_SIZE = DISPID_INPUT + 2; + public const int DISPID_IHTMLINPUTTEXTELEMENT_MAXLENGTH = DISPID_INPUT + 3; + public const int DISPID_IHTMLINPUTTEXTELEMENT_SELECT = DISPID_INPUT + 4; + public const int DISPID_IHTMLINPUTTEXTELEMENT_ONCHANGE = DISPID_EVPROP_ONCHANGE; + public const int DISPID_IHTMLINPUTTEXTELEMENT_ONSELECT = DISPID_EVPROP_ONSELECT; + public const int DISPID_IHTMLINPUTTEXTELEMENT_READONLY = DISPID_INPUT + 5; + public const int DISPID_IHTMLINPUTTEXTELEMENT_CREATETEXTRANGE = DISPID_INPUT + 6; + + // DISPIDs for interface IHTMLLIElement + public const int DISPID_LI = DISPID_NORMAL_FIRST; + public const int DISPID_A_LISTTYPE = (DISPID_A_FIRST + 17); + public const int DISPID_IHTMLLIELEMENT_TYPE = DISPID_A_LISTTYPE; + public const int DISPID_IHTMLLIELEMENT_VALUE = DISPID_LI + 1; + + // DISPIDs for interface IHTMLAnchorElement2 + public const int DISPID_IHTMLANCHORELEMENT2_CHARSET = DISPID_ANCHOR + 23; + public const int DISPID_IHTMLANCHORELEMENT2_COORDS = DISPID_ANCHOR + 24; + public const int DISPID_IHTMLANCHORELEMENT2_HREFLANG = DISPID_ANCHOR + 25; + public const int DISPID_IHTMLANCHORELEMENT2_SHAPE = DISPID_ANCHOR + 26; + public const int DISPID_IHTMLANCHORELEMENT2_TYPE = DISPID_ANCHOR + 27; + + // DISPIDs for interface IHTMLAreaElement + public const int DISPID_AREA = DISPID_NORMAL_FIRST; + + public const int DISPID_IHTMLAREAELEMENT_SHAPE = DISPID_AREA + 1; + public const int DISPID_IHTMLAREAELEMENT_COORDS = DISPID_AREA + 2; + public const int DISPID_IHTMLAREAELEMENT_HREF = DISPID_VALUE; + public const int DISPID_IHTMLAREAELEMENT_TARGET = DISPID_AREA + 4; + public const int DISPID_IHTMLAREAELEMENT_ALT = DISPID_AREA + 5; + public const int DISPID_IHTMLAREAELEMENT_NOHREF = DISPID_AREA + 6; + public const int DISPID_IHTMLAREAELEMENT_HOST = DISPID_AREA + 7; + public const int DISPID_IHTMLAREAELEMENT_HOSTNAME = DISPID_AREA + 8; + public const int DISPID_IHTMLAREAELEMENT_PATHNAME = DISPID_AREA + 9; + public const int DISPID_IHTMLAREAELEMENT_PORT = DISPID_AREA + 10; + public const int DISPID_IHTMLAREAELEMENT_PROTOCOL = DISPID_AREA + 11; + public const int DISPID_IHTMLAREAELEMENT_SEARCH = DISPID_AREA + 12; + public const int DISPID_IHTMLAREAELEMENT_HASH = DISPID_AREA + 13; + public const int DISPID_IHTMLAREAELEMENT_ONBLUR = DISPID_EVPROP_ONBLUR; + public const int DISPID_IHTMLAREAELEMENT_ONFOCUS = DISPID_EVPROP_ONFOCUS; + public const int DISPID_IHTMLAREAELEMENT_TABINDEX = STDPROPID_XOBJ_TABINDEX; + public const int DISPID_IHTMLAREAELEMENT_FOCUS = DISPID_SITE + 0; + public const int DISPID_IHTMLAREAELEMENT_BLUR = DISPID_SITE + 2; + + // DISPIDs for interface IHTMLAreasCollection + public const int DISPID_IHTMLAREASCOLLECTION_LENGTH = DISPID_COLLECTION; + public const int DISPID_IHTMLAREASCOLLECTION__NEWENUM = DISPID_NEWENUM; + public const int DISPID_IHTMLAREASCOLLECTION_ITEM = DISPID_VALUE; + public const int DISPID_IHTMLAREASCOLLECTION_TAGS = DISPID_COLLECTION + 2; + public const int DISPID_IHTMLAREASCOLLECTION_ADD = DISPID_COLLECTION + 3; + public const int DISPID_IHTMLAREASCOLLECTION_REMOVE = DISPID_COLLECTION + 4; + + // DISPIDs for interface IHTMLButtonElement + public const int DISPID_BUTTON = (DISPID_RICHTEXT + 1000); + + public const int DISPID_IHTMLBUTTONELEMENT_TYPE = DISPID_INPUT; + public const int DISPID_IHTMLBUTTONELEMENT_VALUE = DISPID_A_VALUE; + public const int DISPID_IHTMLBUTTONELEMENT_NAME = STDPROPID_XOBJ_NAME; + public const int DISPID_IHTMLBUTTONELEMENT_STATUS = DISPID_BUTTON + 1; + public const int DISPID_IHTMLBUTTONELEMENT_DISABLED = STDPROPID_XOBJ_DISABLED; + public const int DISPID_IHTMLBUTTONELEMENT_FORM = DISPID_SITE + 4; + public const int DISPID_IHTMLBUTTONELEMENT_CREATETEXTRANGE = DISPID_BUTTON + 2; + + // DISPIDs for interface IHTMLBRElement + public const int DISPID_A_CLEAR = (DISPID_A_FIRST + 16); + public const int DISPID_IHTMLBRELEMENT_CLEAR = DISPID_A_CLEAR; + + // DISPIDs for interface IHTMLCurrentStyle + public const int DISPID_A_BACKGROUNDPOSX = (DISPID_A_FIRST + 33); + public const int DISPID_A_BACKGROUNDPOSY = (DISPID_A_FIRST + 34); + public const int DISPID_A_BACKGROUNDREPEAT = (DISPID_A_FIRST + 44); + public const int DISPID_A_BACKGROUNDATTACHMENT = (DISPID_A_FIRST + 45); + public const int DISPID_A_BACKGROUNDPOSITION = (DISPID_A_FIRST + 46); + public const int DISPID_A_WORDSPACING = (DISPID_A_FIRST + 47); + public const int DISPID_A_VERTICALALIGN = (DISPID_A_FIRST + 48); + public const int DISPID_A_BORDER = (DISPID_A_FIRST + 49); + public const int DISPID_A_BORDERTOP = (DISPID_A_FIRST + 50); + public const int DISPID_A_BORDERRIGHT = (DISPID_A_FIRST + 51); + public const int DISPID_A_BORDERBOTTOM = (DISPID_A_FIRST + 52); + public const int DISPID_A_BORDERLEFT = (DISPID_A_FIRST + 53); + public const int DISPID_A_BORDERCOLOR = (DISPID_A_FIRST + 54); + public const int DISPID_A_BORDERTOPCOLOR = (DISPID_A_FIRST + 55); + public const int DISPID_A_BORDERRIGHTCOLOR = (DISPID_A_FIRST + 56); + public const int DISPID_A_BORDERBOTTOMCOLOR = (DISPID_A_FIRST + 57); + public const int DISPID_A_BORDERLEFTCOLOR = (DISPID_A_FIRST + 58); + public const int DISPID_A_BORDERWIDTH = (DISPID_A_FIRST + 59); + public const int DISPID_A_BORDERTOPWIDTH = (DISPID_A_FIRST + 60); + public const int DISPID_A_BORDERRIGHTWIDTH = (DISPID_A_FIRST + 61); + public const int DISPID_A_BORDERBOTTOMWIDTH = (DISPID_A_FIRST + 62); + public const int DISPID_A_BORDERLEFTWIDTH = (DISPID_A_FIRST + 63); + public const int DISPID_A_BORDERSTYLE = (DISPID_A_FIRST + 64); + public const int DISPID_A_BORDERTOPSTYLE = (DISPID_A_FIRST + 65); + public const int DISPID_A_BORDERRIGHTSTYLE = (DISPID_A_FIRST + 66); + public const int DISPID_A_BORDERBOTTOMSTYLE = (DISPID_A_FIRST + 67); + public const int DISPID_A_BORDERLEFTSTYLE = (DISPID_A_FIRST + 68); + public const int STDPROPID_XOBJ_LEFT = (DISPID_XOBJ_BASE + 0x3); + public const int STDPROPID_XOBJ_TOP = (DISPID_XOBJ_BASE + 0x4); + public const int DISPID_A_PADDING = (DISPID_A_FIRST + 11); + public const int DISPID_A_PADDINGTOP = (DISPID_A_FIRST + 12); + public const int DISPID_A_PADDINGRIGHT = (DISPID_A_FIRST + 13); + public const int DISPID_A_PADDINGBOTTOM = (DISPID_A_FIRST + 14); + public const int DISPID_A_PADDINGLEFT = (DISPID_A_FIRST + 15); + public const int DISPID_A_TEXTDECORATION = (DISPID_A_FIRST + 35); + public const int DISPID_A_VISIBILITY = (DISPID_A_FIRST + 80); + public const int DISPID_A_ZINDEX = (DISPID_A_FIRST + 91); + public const int DISPID_A_CLIP = (DISPID_A_FIRST + 92); + public const int DISPID_A_CLIPRECTTOP = (DISPID_A_FIRST + 93); + public const int DISPID_A_CLIPRECTRIGHT = (DISPID_A_FIRST + 94); + public const int DISPID_A_CLIPRECTBOTTOM = (DISPID_A_FIRST + 95); + public const int DISPID_A_CLIPRECTLEFT = (DISPID_A_FIRST + 96); + public const int DISPID_A_FONTFACESRC = (DISPID_A_FIRST + 97); + public const int DISPID_A_TABLELAYOUT = (DISPID_A_FIRST + 98); + public const int DISPID_A_TEXTTRANSFORM = (DISPID_A_FIRST + 4); + public const int DISPID_A_LINEHEIGHT = (DISPID_A_FIRST + 6); + public const int DISPID_A_TEXTINDENT = (DISPID_A_FIRST + 7); + public const int DISPID_A_LETTERSPACING = (DISPID_A_FIRST + 8); + public const int DISPID_A_OVERFLOW = (DISPID_A_FIRST + 10); + public const int DISPID_A_MARGIN = (DISPID_A_FIRST + 36); + public const int DISPID_A_MARGINTOP = (DISPID_A_FIRST + 37); + public const int DISPID_A_MARGINRIGHT = (DISPID_A_FIRST + 38); + public const int DISPID_A_MARGINBOTTOM = (DISPID_A_FIRST + 39); + public const int DISPID_A_MARGINLEFT = (DISPID_A_FIRST + 40); + public const int DISPID_A_LISTSTYLETYPE = (DISPID_A_FIRST + 72); + public const int DISPID_A_LISTSTYLEPOSITION = (DISPID_A_FIRST + 73); + public const int DISPID_A_LISTSTYLEIMAGE = (DISPID_A_FIRST + 74); + public const int DISPID_A_LISTSTYLE = (DISPID_A_FIRST + 75); + public const int DISPID_A_WHITESPACE = (DISPID_A_FIRST + 76); + public const int DISPID_A_PAGEBREAKBEFORE = (DISPID_A_FIRST + 77); + public const int DISPID_A_PAGEBREAKAFTER = (DISPID_A_FIRST + 78); + public const int DISPID_A_SCROLL = (DISPID_A_FIRST + 79); + public const int DISPID_A_CURSOR = (DISPID_A_FIRST + 102); + public const int DISPID_A_BORDERCOLLAPSE = (DISPID_A_FIRST + 84); + public const int DISPID_A_BEHAVIOR = (DISPID_A_FIRST + 115); // xtags + public const int STDPROPID_XOBJ_RIGHT = (DISPID_XOBJ_BASE + 0x4D); + public const int STDPROPID_XOBJ_BOTTOM = (DISPID_XOBJ_BASE + 0x4E); + public const int DISPID_A_IMEMODE = (DISPID_A_FIRST + 120); + public const int DISPID_A_RUBYALIGN = (DISPID_A_FIRST + 121); + public const int DISPID_A_RUBYPOSITION = (DISPID_A_FIRST + 122); + public const int DISPID_A_RUBYOVERHANG = (DISPID_A_FIRST + 123); + //;begin_internal + public const int DISPID_INTERNAL_ONBEHAVIOR_CONTENTREADY = (DISPID_A_FIRST + 124); + public const int DISPID_INTERNAL_ONBEHAVIOR_DOCUMENTREADY = (DISPID_A_FIRST + 125); + public const int DISPID_INTERNAL_CDOMCHILDRENPTRCACHE = (DISPID_A_FIRST + 126); + //;end_internal + public const int DISPID_A_LAYOUTGRIDCHAR = (DISPID_A_FIRST + 127); + public const int DISPID_A_LAYOUTGRIDLINE = (DISPID_A_FIRST + 128); + public const int DISPID_A_LAYOUTGRIDMODE = (DISPID_A_FIRST + 129); + public const int DISPID_A_LAYOUTGRIDTYPE = (DISPID_A_FIRST + 130); + public const int DISPID_A_LAYOUTGRID = (DISPID_A_FIRST + 131); + public const int DISPID_A_TEXTAUTOSPACE = (DISPID_A_FIRST + 132); + public const int DISPID_A_LINEBREAK = (DISPID_A_FIRST + 133); + public const int DISPID_A_WORDBREAK = (DISPID_A_FIRST + 134); + public const int DISPID_A_TEXTJUSTIFY = (DISPID_A_FIRST + 135); + public const int DISPID_A_TEXTJUSTIFYTRIM = (DISPID_A_FIRST + 136); + public const int DISPID_A_TEXTKASHIDA = (DISPID_A_FIRST + 137); + public const int DISPID_A_OVERFLOWX = (DISPID_A_FIRST + 139); + public const int DISPID_A_OVERFLOWY = (DISPID_A_FIRST + 140); + public const int DISPID_A_HTCDISPATCHITEM_VALUE = (DISPID_A_FIRST + 141); + public const int DISPID_A_DOCFRAGMENT = (DISPID_A_FIRST + 142); + public const int DISPID_A_HTCDD_ELEMENT = (DISPID_A_FIRST + 143); + public const int DISPID_A_HTCDD_CREATEEVENTOBJECT = (DISPID_A_FIRST + 144); + public const int DISPID_A_URNATOM = (DISPID_A_FIRST + 145); + public const int DISPID_A_UNIQUEPEERNUMBER = (DISPID_A_FIRST + 146); + public const int DISPID_A_ACCELERATOR = (DISPID_A_FIRST + 147); + //;begin_internal + public const int DISPID_INTERNAL_ONBEHAVIOR_APPLYSTYLE = (DISPID_A_FIRST + 148); + public const int DISPID_INTERNAL_RUNTIMESTYLEAA = (DISPID_A_FIRST + 149); + public const int DISPID_A_HTCDISPATCHITEM_VALUE_SCRIPTSONLY = (DISPID_A_FIRST + 150); + //;end_internal + public const int DISPID_A_EXTENDEDTAGDESC = (DISPID_A_FIRST + 151); + public const int DISPID_A_ROTATE = (DISPID_A_FIRST + 152); + public const int DISPID_A_ZOOM = (DISPID_A_FIRST + 153); + public const int DISPID_A_HTCDD_PROTECTEDELEMENT = (DISPID_A_FIRST + 154); + public const int DISPID_A_LAYOUTFLOW = (DISPID_A_FIRST + 155); + public const int DISPID_A_HTCDD_ISMARKUPSHARED = (DISPID_A_FIRST + 157); + public const int DISPID_A_WORDWRAP = (DISPID_A_FIRST + 158); + public const int DISPID_A_TEXTUNDERLINEPOSITION = (DISPID_A_FIRST + 159); + public const int DISPID_A_HASLAYOUT = (DISPID_A_FIRST + 160); + public const int DISPID_A_MEDIA = (DISPID_A_FIRST + 161); + public const int DISPID_A_EDITABLE = (DISPID_A_FIRST + 162); + public const int DISPID_A_HIDEFOCUS = (DISPID_A_FIRST + 163); + public const int DISPID_A_SCROLLBARBASECOLOR = (DISPID_A_FIRST + 180); + public const int DISPID_A_SCROLLBARFACECOLOR = (DISPID_A_FIRST + 181); + public const int DISPID_A_SCROLLBAR3DLIGHTCOLOR = (DISPID_A_FIRST + 182); + public const int DISPID_A_SCROLLBARSHADOWCOLOR = (DISPID_A_FIRST + 183); + public const int DISPID_A_SCROLLBARHIGHLIGHTCOLOR = (DISPID_A_FIRST + 184); + public const int DISPID_A_SCROLLBARDARKSHADOWCOLOR = (DISPID_A_FIRST + 185); + public const int DISPID_A_SCROLLBARARROWCOLOR = (DISPID_A_FIRST + 186); + public const int DISPID_A_SCROLLBARTRACKCOLOR = (DISPID_A_FIRST + 196); + public const int DISPID_A_WRITINGMODE = (DISPID_A_FIRST + 192); + public const int DISPID_A_FILTER = (DISPID_A_FIRST + 82); + public const int DISPID_A_TEXTALIGNLAST = (DISPID_A_FIRST + 203); + public const int DISPID_A_TEXTKASHIDASPACE = (DISPID_A_FIRST + 204); + public const int DISPID_A_ISBLOCK = (DISPID_A_FIRST + 208); + public const int DISPID_A_TEXTOVERFLOW = (DISPID_A_FIRST + 209); + //;begin_internal + public const int DISPID_INTERNAL_CATTRIBUTECOLLPTRCACHE = (DISPID_A_FIRST + 210); + //;end_internal + public const int DISPID_A_MINHEIGHT = (DISPID_A_FIRST + 211); + //;begin_internal + public const int DISPID_INTERNAL_INVOKECONTEXTDOCUMENT = (DISPID_A_FIRST + 212); + public const int DISPID_A_POSITION = (DISPID_A_FIRST + 90); + public const int DISPID_A_FLOAT = (DISPID_A_FIRST + 70); + public const int DISPID_A_DISPLAY = (DISPID_A_FIRST + 71); + + public const int DISPID_IHTMLCURRENTSTYLE_POSITION = DISPID_A_POSITION; + public const int DISPID_IHTMLCURRENTSTYLE_STYLEFLOAT = DISPID_A_FLOAT; + public const int DISPID_IHTMLCURRENTSTYLE_COLOR = DISPID_A_COLOR; + public const int DISPID_IHTMLCURRENTSTYLE_BACKGROUNDCOLOR = DISPID_BACKCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE_FONTFAMILY = DISPID_A_FONTFACE; + public const int DISPID_IHTMLCURRENTSTYLE_FONTSTYLE = DISPID_A_FONTSTYLE; + public const int DISPID_IHTMLCURRENTSTYLE_FONTVARIANT = DISPID_A_FONTVARIANT; + public const int DISPID_IHTMLCURRENTSTYLE_FONTWEIGHT = DISPID_A_FONTWEIGHT; + public const int DISPID_IHTMLCURRENTSTYLE_FONTSIZE = DISPID_A_FONTSIZE; + public const int DISPID_IHTMLCURRENTSTYLE_BACKGROUNDIMAGE = DISPID_A_BACKGROUNDIMAGE; + public const int DISPID_IHTMLCURRENTSTYLE_BACKGROUNDPOSITIONX = DISPID_A_BACKGROUNDPOSX; + public const int DISPID_IHTMLCURRENTSTYLE_BACKGROUNDPOSITIONY = DISPID_A_BACKGROUNDPOSY; + public const int DISPID_IHTMLCURRENTSTYLE_BACKGROUNDREPEAT = DISPID_A_BACKGROUNDREPEAT; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERLEFTCOLOR = DISPID_A_BORDERLEFTCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERTOPCOLOR = DISPID_A_BORDERTOPCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERRIGHTCOLOR = DISPID_A_BORDERRIGHTCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERBOTTOMCOLOR = DISPID_A_BORDERBOTTOMCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERTOPSTYLE = DISPID_A_BORDERTOPSTYLE; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERRIGHTSTYLE = DISPID_A_BORDERRIGHTSTYLE; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERBOTTOMSTYLE = DISPID_A_BORDERBOTTOMSTYLE; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERLEFTSTYLE = DISPID_A_BORDERLEFTSTYLE; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERTOPWIDTH = DISPID_A_BORDERTOPWIDTH; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERRIGHTWIDTH = DISPID_A_BORDERRIGHTWIDTH; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERBOTTOMWIDTH = DISPID_A_BORDERBOTTOMWIDTH; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERLEFTWIDTH = DISPID_A_BORDERLEFTWIDTH; + public const int DISPID_IHTMLCURRENTSTYLE_LEFT = STDPROPID_XOBJ_LEFT; + public const int DISPID_IHTMLCURRENTSTYLE_TOP = STDPROPID_XOBJ_TOP; + public const int DISPID_IHTMLCURRENTSTYLE_WIDTH = STDPROPID_XOBJ_WIDTH; + public const int DISPID_IHTMLCURRENTSTYLE_HEIGHT = STDPROPID_XOBJ_HEIGHT; + public const int DISPID_IHTMLCURRENTSTYLE_PADDINGLEFT = DISPID_A_PADDINGLEFT; + public const int DISPID_IHTMLCURRENTSTYLE_PADDINGTOP = DISPID_A_PADDINGTOP; + public const int DISPID_IHTMLCURRENTSTYLE_PADDINGRIGHT = DISPID_A_PADDINGRIGHT; + public const int DISPID_IHTMLCURRENTSTYLE_PADDINGBOTTOM = DISPID_A_PADDINGBOTTOM; + public const int DISPID_IHTMLCURRENTSTYLE_TEXTALIGN = STDPROPID_XOBJ_BLOCKALIGN; + public const int DISPID_IHTMLCURRENTSTYLE_TEXTDECORATION = DISPID_A_TEXTDECORATION; + public const int DISPID_IHTMLCURRENTSTYLE_DISPLAY = DISPID_A_DISPLAY; + public const int DISPID_IHTMLCURRENTSTYLE_VISIBILITY = DISPID_A_VISIBILITY; + public const int DISPID_IHTMLCURRENTSTYLE_ZINDEX = DISPID_A_ZINDEX; + public const int DISPID_IHTMLCURRENTSTYLE_LETTERSPACING = DISPID_A_LETTERSPACING; + public const int DISPID_IHTMLCURRENTSTYLE_LINEHEIGHT = DISPID_A_LINEHEIGHT; + public const int DISPID_IHTMLCURRENTSTYLE_TEXTINDENT = DISPID_A_TEXTINDENT; + public const int DISPID_IHTMLCURRENTSTYLE_VERTICALALIGN = DISPID_A_VERTICALALIGN; + public const int DISPID_IHTMLCURRENTSTYLE_BACKGROUNDATTACHMENT = DISPID_A_BACKGROUNDATTACHMENT; + public const int DISPID_IHTMLCURRENTSTYLE_MARGINTOP = DISPID_A_MARGINTOP; + public const int DISPID_IHTMLCURRENTSTYLE_MARGINRIGHT = DISPID_A_MARGINRIGHT; + public const int DISPID_IHTMLCURRENTSTYLE_MARGINBOTTOM = DISPID_A_MARGINBOTTOM; + public const int DISPID_IHTMLCURRENTSTYLE_MARGINLEFT = DISPID_A_MARGINLEFT; + public const int DISPID_IHTMLCURRENTSTYLE_CLEAR = DISPID_A_CLEAR; + public const int DISPID_IHTMLCURRENTSTYLE_LISTSTYLETYPE = DISPID_A_LISTSTYLETYPE; + public const int DISPID_IHTMLCURRENTSTYLE_LISTSTYLEPOSITION = DISPID_A_LISTSTYLEPOSITION; + public const int DISPID_IHTMLCURRENTSTYLE_LISTSTYLEIMAGE = DISPID_A_LISTSTYLEIMAGE; + public const int DISPID_IHTMLCURRENTSTYLE_CLIPTOP = DISPID_A_CLIPRECTTOP; + public const int DISPID_IHTMLCURRENTSTYLE_CLIPRIGHT = DISPID_A_CLIPRECTRIGHT; + public const int DISPID_IHTMLCURRENTSTYLE_CLIPBOTTOM = DISPID_A_CLIPRECTBOTTOM; + public const int DISPID_IHTMLCURRENTSTYLE_CLIPLEFT = DISPID_A_CLIPRECTLEFT; + public const int DISPID_IHTMLCURRENTSTYLE_OVERFLOW = DISPID_A_OVERFLOW; + public const int DISPID_IHTMLCURRENTSTYLE_PAGEBREAKBEFORE = DISPID_A_PAGEBREAKBEFORE; + public const int DISPID_IHTMLCURRENTSTYLE_PAGEBREAKAFTER = DISPID_A_PAGEBREAKAFTER; + public const int DISPID_IHTMLCURRENTSTYLE_CURSOR = DISPID_A_CURSOR; + public const int DISPID_IHTMLCURRENTSTYLE_TABLELAYOUT = DISPID_A_TABLELAYOUT; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERCOLLAPSE = DISPID_A_BORDERCOLLAPSE; + public const int DISPID_IHTMLCURRENTSTYLE_DIRECTION = DISPID_A_DIRECTION; + public const int DISPID_IHTMLCURRENTSTYLE_BEHAVIOR = DISPID_A_BEHAVIOR; + public const int DISPID_IHTMLCURRENTSTYLE_GETATTRIBUTE = DISPID_HTMLOBJECT + 2; + public const int DISPID_IHTMLCURRENTSTYLE_UNICODEBIDI = DISPID_A_UNICODEBIDI; + public const int DISPID_IHTMLCURRENTSTYLE_RIGHT = STDPROPID_XOBJ_RIGHT; + public const int DISPID_IHTMLCURRENTSTYLE_BOTTOM = STDPROPID_XOBJ_BOTTOM; + public const int DISPID_IHTMLCURRENTSTYLE_IMEMODE = DISPID_A_IMEMODE; + public const int DISPID_IHTMLCURRENTSTYLE_RUBYALIGN = DISPID_A_RUBYALIGN; + public const int DISPID_IHTMLCURRENTSTYLE_RUBYPOSITION = DISPID_A_RUBYPOSITION; + public const int DISPID_IHTMLCURRENTSTYLE_RUBYOVERHANG = DISPID_A_RUBYOVERHANG; + public const int DISPID_IHTMLCURRENTSTYLE_TEXTAUTOSPACE = DISPID_A_TEXTAUTOSPACE; + public const int DISPID_IHTMLCURRENTSTYLE_LINEBREAK = DISPID_A_LINEBREAK; + public const int DISPID_IHTMLCURRENTSTYLE_WORDBREAK = DISPID_A_WORDBREAK; + public const int DISPID_IHTMLCURRENTSTYLE_TEXTJUSTIFY = DISPID_A_TEXTJUSTIFY; + public const int DISPID_IHTMLCURRENTSTYLE_TEXTJUSTIFYTRIM = DISPID_A_TEXTJUSTIFYTRIM; + public const int DISPID_IHTMLCURRENTSTYLE_TEXTKASHIDA = DISPID_A_TEXTKASHIDA; + public const int DISPID_IHTMLCURRENTSTYLE_BLOCKDIRECTION = DISPID_A_DIR; + public const int DISPID_IHTMLCURRENTSTYLE_LAYOUTGRIDCHAR = DISPID_A_LAYOUTGRIDCHAR; + public const int DISPID_IHTMLCURRENTSTYLE_LAYOUTGRIDLINE = DISPID_A_LAYOUTGRIDLINE; + public const int DISPID_IHTMLCURRENTSTYLE_LAYOUTGRIDMODE = DISPID_A_LAYOUTGRIDMODE; + public const int DISPID_IHTMLCURRENTSTYLE_LAYOUTGRIDTYPE = DISPID_A_LAYOUTGRIDTYPE; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERSTYLE = DISPID_A_BORDERSTYLE; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERCOLOR = DISPID_A_BORDERCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE_BORDERWIDTH = DISPID_A_BORDERWIDTH; + public const int DISPID_IHTMLCURRENTSTYLE_PADDING = DISPID_A_PADDING; + public const int DISPID_IHTMLCURRENTSTYLE_MARGIN = DISPID_A_MARGIN; + public const int DISPID_IHTMLCURRENTSTYLE_ACCELERATOR = DISPID_A_ACCELERATOR; + public const int DISPID_IHTMLCURRENTSTYLE_OVERFLOWX = DISPID_A_OVERFLOWX; + public const int DISPID_IHTMLCURRENTSTYLE_OVERFLOWY = DISPID_A_OVERFLOWY; + public const int DISPID_IHTMLCURRENTSTYLE_TEXTTRANSFORM = DISPID_A_TEXTTRANSFORM; + // DISPIDs for interface IHTMLCurrentStyle2 + public const int DISPID_IHTMLCURRENTSTYLE2_LAYOUTFLOW = DISPID_A_LAYOUTFLOW; + public const int DISPID_IHTMLCURRENTSTYLE2_WORDWRAP = DISPID_A_WORDWRAP; + public const int DISPID_IHTMLCURRENTSTYLE2_TEXTUNDERLINEPOSITION = DISPID_A_TEXTUNDERLINEPOSITION; + public const int DISPID_IHTMLCURRENTSTYLE2_HASLAYOUT = DISPID_A_HASLAYOUT; + public const int DISPID_IHTMLCURRENTSTYLE2_SCROLLBARBASECOLOR = DISPID_A_SCROLLBARBASECOLOR; + public const int DISPID_IHTMLCURRENTSTYLE2_SCROLLBARFACECOLOR = DISPID_A_SCROLLBARFACECOLOR; + public const int DISPID_IHTMLCURRENTSTYLE2_SCROLLBAR3DLIGHTCOLOR = DISPID_A_SCROLLBAR3DLIGHTCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE2_SCROLLBARSHADOWCOLOR = DISPID_A_SCROLLBARSHADOWCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE2_SCROLLBARHIGHLIGHTCOLOR = DISPID_A_SCROLLBARHIGHLIGHTCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE2_SCROLLBARDARKSHADOWCOLOR = DISPID_A_SCROLLBARDARKSHADOWCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE2_SCROLLBARARROWCOLOR = DISPID_A_SCROLLBARARROWCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE2_SCROLLBARTRACKCOLOR = DISPID_A_SCROLLBARTRACKCOLOR; + public const int DISPID_IHTMLCURRENTSTYLE2_WRITINGMODE = DISPID_A_WRITINGMODE; + public const int DISPID_IHTMLCURRENTSTYLE2_ZOOM = DISPID_A_ZOOM; + public const int DISPID_IHTMLCURRENTSTYLE2_FILTER = DISPID_A_FILTER; + public const int DISPID_IHTMLCURRENTSTYLE2_TEXTALIGNLAST = DISPID_A_TEXTALIGNLAST; + public const int DISPID_IHTMLCURRENTSTYLE2_TEXTKASHIDASPACE = DISPID_A_TEXTKASHIDASPACE; + public const int DISPID_IHTMLCURRENTSTYLE2_ISBLOCK = DISPID_A_ISBLOCK; + // DISPIDs for interface IHTMLCurrentStyle3 + public const int DISPID_IHTMLCURRENTSTYLE3_TEXTOVERFLOW = DISPID_A_TEXTOVERFLOW; + public const int DISPID_IHTMLCURRENTSTYLE3_MINHEIGHT = DISPID_A_MINHEIGHT; + public const int DISPID_IHTMLCURRENTSTYLE3_WORDSPACING = DISPID_A_WORDSPACING; + public const int DISPID_IHTMLCURRENTSTYLE3_WHITESPACE = DISPID_A_WHITESPACE; + + public const int DISPID_IHTMLCOMPUTEDSTYLE = DISPID_NORMAL_FIRST; + // DISPIDs for interface IHTMLComputedStyle + public const int DISPID_IHTMLCOMPUTEDSTYLE_BOLD = DISPID_IHTMLCOMPUTEDSTYLE + 1; + public const int DISPID_IHTMLCOMPUTEDSTYLE_ITALIC = DISPID_IHTMLCOMPUTEDSTYLE + 2; + public const int DISPID_IHTMLCOMPUTEDSTYLE_UNDERLINE = DISPID_IHTMLCOMPUTEDSTYLE + 3; + public const int DISPID_IHTMLCOMPUTEDSTYLE_OVERLINE = DISPID_IHTMLCOMPUTEDSTYLE + 4; + public const int DISPID_IHTMLCOMPUTEDSTYLE_STRIKEOUT = DISPID_IHTMLCOMPUTEDSTYLE + 5; + public const int DISPID_IHTMLCOMPUTEDSTYLE_SUBSCRIPT = DISPID_IHTMLCOMPUTEDSTYLE + 6; + public const int DISPID_IHTMLCOMPUTEDSTYLE_SUPERSCRIPT = DISPID_IHTMLCOMPUTEDSTYLE + 7; + public const int DISPID_IHTMLCOMPUTEDSTYLE_EXPLICITFACE = DISPID_IHTMLCOMPUTEDSTYLE + 8; + public const int DISPID_IHTMLCOMPUTEDSTYLE_FONTWEIGHT = DISPID_IHTMLCOMPUTEDSTYLE + 9; + public const int DISPID_IHTMLCOMPUTEDSTYLE_FONTSIZE = DISPID_IHTMLCOMPUTEDSTYLE + 10; + public const int DISPID_IHTMLCOMPUTEDSTYLE_FONTNAME = DISPID_IHTMLCOMPUTEDSTYLE + 11; + public const int DISPID_IHTMLCOMPUTEDSTYLE_HASBGCOLOR = DISPID_IHTMLCOMPUTEDSTYLE + 12; + public const int DISPID_IHTMLCOMPUTEDSTYLE_TEXTCOLOR = DISPID_IHTMLCOMPUTEDSTYLE + 13; + public const int DISPID_IHTMLCOMPUTEDSTYLE_BACKGROUNDCOLOR = DISPID_IHTMLCOMPUTEDSTYLE + 14; + public const int DISPID_IHTMLCOMPUTEDSTYLE_PREFORMATTED = DISPID_IHTMLCOMPUTEDSTYLE + 15; + public const int DISPID_IHTMLCOMPUTEDSTYLE_DIRECTION = DISPID_IHTMLCOMPUTEDSTYLE + 16; + public const int DISPID_IHTMLCOMPUTEDSTYLE_BLOCKDIRECTION = DISPID_IHTMLCOMPUTEDSTYLE + 17; + public const int DISPID_IHTMLCOMPUTEDSTYLE_OL = DISPID_IHTMLCOMPUTEDSTYLE + 18; + + public const int DISPID_ILINEINFO = DISPID_NORMAL_FIRST; + // DISPIDs for interface ILineInfo + public const int DISPID_ILINEINFO_X = DISPID_ILINEINFO + 1; + public const int DISPID_ILINEINFO_BASELINE = DISPID_ILINEINFO + 2; + public const int DISPID_ILINEINFO_TEXTDESCENT = DISPID_ILINEINFO + 3; + public const int DISPID_ILINEINFO_TEXTHEIGHT = DISPID_ILINEINFO + 4; + public const int DISPID_ILINEINFO_LINEDIRECTION = DISPID_ILINEINFO + 5; + + // DISPIDs for interface IHTMLRenderStyle + public const int DISPID_A_TEXTLINETHROUGHSTYLE = (DISPID_A_FIRST + 166); + public const int DISPID_A_TEXTUNDERLINESTYLE = (DISPID_A_FIRST + 167); + public const int DISPID_A_TEXTEFFECT = (DISPID_A_FIRST + 168); + public const int DISPID_A_TEXTBACKGROUNDCOLOR = (DISPID_A_FIRST + 169); + public const int DISPID_A_RENDERINGPRIORITY = (DISPID_A_FIRST + 170); + public const int DISPID_A_DEFAULTTEXTSELECTION = (DISPID_A_FIRST + 188); + public const int DISPID_A_TEXTDECORATIONCOLOR = (DISPID_A_FIRST + 189); + public const int DISPID_A_TEXTCOLOR = (DISPID_A_FIRST + 190); + public const int DISPID_A_STYLETEXTDECORATION = (DISPID_A_FIRST + 191); + + public const int DISPID_IHTMLRENDERSTYLE_TEXTLINETHROUGHSTYLE = DISPID_A_TEXTLINETHROUGHSTYLE; + public const int DISPID_IHTMLRENDERSTYLE_TEXTUNDERLINESTYLE = DISPID_A_TEXTUNDERLINESTYLE; + public const int DISPID_IHTMLRENDERSTYLE_TEXTEFFECT = DISPID_A_TEXTEFFECT; + public const int DISPID_IHTMLRENDERSTYLE_TEXTCOLOR = DISPID_A_TEXTCOLOR; + public const int DISPID_IHTMLRENDERSTYLE_TEXTBACKGROUNDCOLOR = DISPID_A_TEXTBACKGROUNDCOLOR; + public const int DISPID_IHTMLRENDERSTYLE_TEXTDECORATIONCOLOR = DISPID_A_TEXTDECORATIONCOLOR; + public const int DISPID_IHTMLRENDERSTYLE_RENDERINGPRIORITY = DISPID_A_RENDERINGPRIORITY; + public const int DISPID_IHTMLRENDERSTYLE_DEFAULTTEXTSELECTION = DISPID_A_DEFAULTTEXTSELECTION; + public const int DISPID_IHTMLRENDERSTYLE_TEXTDECORATION = DISPID_A_STYLETEXTDECORATION; + + public const int DISPID_NAVIGATOR = 1; + // DISPIDs for interface IOmNavigator + public const int DISPID_IOMNAVIGATOR_APPCODENAME = DISPID_NAVIGATOR; + public const int DISPID_IOMNAVIGATOR_APPNAME = DISPID_NAVIGATOR + 1; + public const int DISPID_IOMNAVIGATOR_APPVERSION = DISPID_NAVIGATOR + 2; + public const int DISPID_IOMNAVIGATOR_USERAGENT = DISPID_NAVIGATOR + 3; + public const int DISPID_IOMNAVIGATOR_JAVAENABLED = DISPID_NAVIGATOR + 4; + public const int DISPID_IOMNAVIGATOR_TAINTENABLED = DISPID_NAVIGATOR + 5; + public const int DISPID_IOMNAVIGATOR_MIMETYPES = DISPID_NAVIGATOR + 6; + public const int DISPID_IOMNAVIGATOR_PLUGINS = DISPID_NAVIGATOR + 7; + public const int DISPID_IOMNAVIGATOR_COOKIEENABLED = DISPID_NAVIGATOR + 8; + public const int DISPID_IOMNAVIGATOR_OPSPROFILE = DISPID_NAVIGATOR + 9; + public const int DISPID_IOMNAVIGATOR_TOSTRING = DISPID_NAVIGATOR + 10; + public const int DISPID_IOMNAVIGATOR_CPUCLASS = DISPID_NAVIGATOR + 11; + public const int DISPID_IOMNAVIGATOR_SYSTEMLANGUAGE = DISPID_NAVIGATOR + 12; + public const int DISPID_IOMNAVIGATOR_BROWSERLANGUAGE = DISPID_NAVIGATOR + 13; + public const int DISPID_IOMNAVIGATOR_USERLANGUAGE = DISPID_NAVIGATOR + 14; + public const int DISPID_IOMNAVIGATOR_PLATFORM = DISPID_NAVIGATOR + 15; + public const int DISPID_IOMNAVIGATOR_APPMINORVERSION = DISPID_NAVIGATOR + 16; + public const int DISPID_IOMNAVIGATOR_CONNECTIONSPEED = DISPID_NAVIGATOR + 17; + public const int DISPID_IOMNAVIGATOR_ONLINE = DISPID_NAVIGATOR + 18; + public const int DISPID_IOMNAVIGATOR_USERPROFILE = DISPID_NAVIGATOR + 19; + + // DISPIDs for interface IHTMLWindow3 + public const int DISPID_IHTMLWINDOW3_SCREENLEFT = 1170; + public const int DISPID_IHTMLWINDOW3_SCREENTOP = 1171; + public const int DISPID_IHTMLWINDOW3_ATTACHEVENT = DISPID_HTMLOBJECT + 7; + public const int DISPID_IHTMLWINDOW3_DETACHEVENT = DISPID_HTMLOBJECT + 8; + public const int DISPID_IHTMLWINDOW3_SETTIMEOUT = 1103; + public const int DISPID_IHTMLWINDOW3_SETINTERVAL = 1162; + public const int DISPID_IHTMLWINDOW3_PRINT = 1174; + public const int DISPID_IHTMLWINDOW3_ONBEFOREPRINT = DISPID_EVPROP_ONBEFOREPRINT; + public const int DISPID_IHTMLWINDOW3_ONAFTERPRINT = DISPID_EVPROP_ONAFTERPRINT; + public const int DISPID_IHTMLWINDOW3_CLIPBOARDDATA = 1175; + public const int DISPID_IHTMLWINDOW3_SHOWMODELESSDIALOG = 1176; + + // DISPIDs for interface IHTMLWindow4 + public const int DISPID_IHTMLWINDOW4_CREATEPOPUP = 1180; + public const int DISPID_IHTMLWINDOW4_FRAMEELEMENT = 1181; + + // DISPIDs for interface IHTMLPopup + public const int DISPID_HTMLPOPUP = 27000; + public const int DISPID_IHTMLPOPUP_SHOW = DISPID_HTMLPOPUP + 1; + public const int DISPID_IHTMLPOPUP_HIDE = DISPID_HTMLPOPUP + 2; + public const int DISPID_IHTMLPOPUP_DOCUMENT = DISPID_HTMLPOPUP + 3; + public const int DISPID_IHTMLPOPUP_ISOPEN = DISPID_HTMLPOPUP + 4; + + + } +} diff --git a/Speak/Speak/Interfaces/HTMLDocumentEvents2.cs b/Speak/Speak/Interfaces/HTMLDocumentEvents2.cs new file mode 100644 index 0000000..e48386e --- /dev/null +++ b/Speak/Speak/Interfaces/HTMLDocumentEvents2.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Speak.Interfaces +{ + [ComVisible(true), ComImport()] + [TypeLibType((short)4160)] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] + [Guid("3050f613-98b5-11cf-bb82-00aa00bdce0b")] + public interface HTMLDocumentEvents2 + { + /* + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONHELP)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onhelp([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + */ + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONCLICK)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onclick([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + /* + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONDBLCLICK)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool ondblclick([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONKEYDOWN)] + void onkeydown([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONKEYUP)] + void onkeyup([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONKEYPRESS)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onkeypress([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEDOWN)] + void onmousedown([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEMOVE)] + void onmousemove([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEUP)] + void onmouseup([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEOUT)] + void onmouseout([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEOVER)] + void onmouseover([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONREADYSTATECHANGE)] + void onreadystatechange([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREUPDATE)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onbeforeupdate([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONAFTERUPDATE)] + void onafterupdate([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONROWEXIT)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onrowexit([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONROWENTER)] + void onrowenter([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONDRAGSTART)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool ondragstart([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONSELECTSTART)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onselectstart([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONERRORUPDATE)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onerrorupdate([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONCONTEXTMENU)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool oncontextmenu([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONSTOP)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onstop([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONROWSDELETE)] + void onrowsdelete([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONROWSINSERTED)] + void onrowsinserted([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONCELLCHANGE)] + void oncellchange([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONPROPERTYCHANGE)] + void onpropertychange([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONDATASETCHANGED)] + void ondatasetchanged([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONDATAAVAILABLE)] + void ondataavailable([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONDATASETCOMPLETE)] + void ondatasetcomplete([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREEDITFOCUS)] + void onbeforeeditfocus([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONSELECTIONCHANGE)] + void onselectionchange([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONCONTROLSELECT)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool oncontrolselect([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONMOUSEWHEEL)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onmousewheel([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONFOCUSIN)] + void onfocusin([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONFOCUSOUT)] + void onfocusout([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONACTIVATE)] + void onactivate([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONDEACTIVATE)] + void ondeactivate([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREACTIVATE)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onbeforeactivate([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + [DispId(HTMLDispIDs.DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREDEACTIVATE)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool onbeforedeactivate([In, MarshalAs(UnmanagedType.Interface)] IHTMLEventObj pEvtObj); + */ + } +} diff --git a/Speak/Speak/Interfaces/IHTMLDocument2.cs b/Speak/Speak/Interfaces/IHTMLDocument2.cs new file mode 100644 index 0000000..b9b279e --- /dev/null +++ b/Speak/Speak/Interfaces/IHTMLDocument2.cs @@ -0,0 +1,1025 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Speak.Interfaces +{ + [Guid("332C4425-26CB-11D0-B483-00C04FD90119")] + [ComImport] + [TypeLibType((short)4160)] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] + public interface IHTMLDocument2 + { + /// write method of IHTMLDocument2 interface. + /// An original IDL definition of write method was the following: HRESULT write (SAFEARRAY() psarray); + // IDL: HRESULT write (SAFEARRAY() psarray); + // VB6: Sub write (ByVal psarray() As Any) + [DispId(1054)] + void write([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] object psarray); + + /// writeln method of IHTMLDocument2 interface. + /// An original IDL definition of writeln method was the following: HRESULT writeln (SAFEARRAY() psarray); + // IDL: HRESULT writeln (SAFEARRAY() psarray); + // VB6: Sub writeln (ByVal psarray() As Any) + [DispId(1055)] //VarEnum.VT_VARIANT + void writeln([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] object psarray); + + /// open method of IHTMLDocument2 interface. + /// An original IDL definition of open method was the following: HRESULT open ([optional, defaultvalue("text/html")] BSTR url, [optional] VARIANT name, [optional] VARIANT features, [optional] VARIANT replace, [out, retval] IDispatch** ReturnValue); + // IDL: HRESULT open ([optional, defaultvalue("text/html")] BSTR url, [optional] VARIANT name, [optional] VARIANT features, [optional] VARIANT replace, [out, retval] IDispatch** ReturnValue); + // VB6: Function open ([ByVal url As String = "text/html"], [ByVal name As Any], [ByVal features As Any], [ByVal replace As Any]) As IDispatch + [DispId(1056)] + [return: MarshalAs(UnmanagedType.IDispatch)] + object open([MarshalAs(UnmanagedType.BStr)] string url, object name, object features, object replace); + + /// close method of IHTMLDocument2 interface. + /// An original IDL definition of close method was the following: HRESULT close (void); + // IDL: HRESULT close (void); + // VB6: Sub close + [DispId(1057)] + void close(); + + /// clear method of IHTMLDocument2 interface. + /// An original IDL definition of clear method was the following: HRESULT clear (void); + // IDL: HRESULT clear (void); + // VB6: Sub clear + [DispId(1058)] + void clear(); + + /// queryCommandSupported method of IHTMLDocument2 interface. + /// An original IDL definition of queryCommandSupported method was the following: HRESULT queryCommandSupported (BSTR cmdID, [out, retval] VARIANT_BOOL* ReturnValue); + // IDL: HRESULT queryCommandSupported (BSTR cmdID, [out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function queryCommandSupported (ByVal cmdID As String) As Boolean + [DispId(1059)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool queryCommandSupported([MarshalAs(UnmanagedType.BStr)] string cmdID); + + /// queryCommandEnabled method of IHTMLDocument2 interface. + /// An original IDL definition of queryCommandEnabled method was the following: HRESULT queryCommandEnabled (BSTR cmdID, [out, retval] VARIANT_BOOL* ReturnValue); + // IDL: HRESULT queryCommandEnabled (BSTR cmdID, [out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function queryCommandEnabled (ByVal cmdID As String) As Boolean + [DispId(1060)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool queryCommandEnabled([MarshalAs(UnmanagedType.BStr)] string cmdID); + + /// queryCommandState method of IHTMLDocument2 interface. + /// An original IDL definition of queryCommandState method was the following: HRESULT queryCommandState (BSTR cmdID, [out, retval] VARIANT_BOOL* ReturnValue); + // IDL: HRESULT queryCommandState (BSTR cmdID, [out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function queryCommandState (ByVal cmdID As String) As Boolean + [DispId(1061)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool queryCommandState([MarshalAs(UnmanagedType.BStr)] string cmdID); + + /// queryCommandIndeterm method of IHTMLDocument2 interface. + /// An original IDL definition of queryCommandIndeterm method was the following: HRESULT queryCommandIndeterm (BSTR cmdID, [out, retval] VARIANT_BOOL* ReturnValue); + // IDL: HRESULT queryCommandIndeterm (BSTR cmdID, [out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function queryCommandIndeterm (ByVal cmdID As String) As Boolean + [DispId(1062)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool queryCommandIndeterm([MarshalAs(UnmanagedType.BStr)] string cmdID); + + /// queryCommandText method of IHTMLDocument2 interface. + /// An original IDL definition of queryCommandText method was the following: HRESULT queryCommandText (BSTR cmdID, [out, retval] BSTR* ReturnValue); + // IDL: HRESULT queryCommandText (BSTR cmdID, [out, retval] BSTR* ReturnValue); + // VB6: Function queryCommandText (ByVal cmdID As String) As String + [DispId(1063)] + [return: MarshalAs(UnmanagedType.BStr)] + string queryCommandText([MarshalAs(UnmanagedType.BStr)] string cmdID); + + /// queryCommandValue method of IHTMLDocument2 interface. + /// An original IDL definition of queryCommandValue method was the following: HRESULT queryCommandValue (BSTR cmdID, [out, retval] VARIANT* ReturnValue); + // IDL: HRESULT queryCommandValue (BSTR cmdID, [out, retval] VARIANT* ReturnValue); + // VB6: Function queryCommandValue (ByVal cmdID As String) As Any + [DispId(1064)] + object queryCommandValue([MarshalAs(UnmanagedType.BStr)] string cmdID); + + /// execCommand method of IHTMLDocument2 interface. + /// An original IDL definition of execCommand method was the following: HRESULT execCommand (BSTR cmdID, [optional, defaultvalue(0)] VARIANT_BOOL showUI, [optional] VARIANT value, [out, retval] VARIANT_BOOL* ReturnValue); + // IDL: HRESULT execCommand (BSTR cmdID, [optional, defaultvalue(0)] VARIANT_BOOL showUI, [optional] VARIANT value, [out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function execCommand (ByVal cmdID As String, [ByVal showUI As Boolean = False], [ByVal value As Any]) As Boolean + [DispId(1065)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool execCommand([MarshalAs(UnmanagedType.BStr)] string cmdID, [MarshalAs(UnmanagedType.VariantBool)] bool showUI, object value); + + /// execCommandShowHelp method of IHTMLDocument2 interface. + /// An original IDL definition of execCommandShowHelp method was the following: HRESULT execCommandShowHelp (BSTR cmdID, [out, retval] VARIANT_BOOL* ReturnValue); + // IDL: HRESULT execCommandShowHelp (BSTR cmdID, [out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function execCommandShowHelp (ByVal cmdID As String) As Boolean + [DispId(1066)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool execCommandShowHelp([MarshalAs(UnmanagedType.BStr)] string cmdID); + + /// createElement method of IHTMLDocument2 interface. + /// An original IDL definition of createElement method was the following: HRESULT createElement (BSTR eTag, [out, retval] IHTMLElement** ReturnValue); + // IDL: HRESULT createElement (BSTR eTag, [out, retval] IHTMLElement** ReturnValue); + // VB6: Function createElement (ByVal eTag As String) As IHTMLElement + [DispId(1067)] + IHTMLElement createElement([MarshalAs(UnmanagedType.BStr)] string eTag); + + /// elementFromPoint method of IHTMLDocument2 interface. + /// An original IDL definition of elementFromPoint method was the following: HRESULT elementFromPoint (long x, long y, [out, retval] IHTMLElement** ReturnValue); + // IDL: HRESULT elementFromPoint (long x, long y, [out, retval] IHTMLElement** ReturnValue); + // VB6: Function elementFromPoint (ByVal x As Long, ByVal y As Long) As IHTMLElement + [DispId(1068)] + IHTMLElement elementFromPoint(int x, int y); + + /// toString method of IHTMLDocument2 interface. + /// An original IDL definition of toString method was the following: HRESULT toString ([out, retval] BSTR* ReturnValue); + // IDL: HRESULT toString ([out, retval] BSTR* ReturnValue); + // VB6: Function toString As String + [DispId(1070)] + [return: MarshalAs(UnmanagedType.BStr)] + string toString(); + + /// createStyleSheet method of IHTMLDocument2 interface. + /// An original IDL definition of createStyleSheet method was the following: HRESULT createStyleSheet ([optional, defaultvalue("")] BSTR bstrHref, [optional, defaultvalue(-1)] long lIndex, [out, retval] IHTMLStyleSheet** ReturnValue); + // IDL: HRESULT createStyleSheet ([optional, defaultvalue("")] BSTR bstrHref, [optional, defaultvalue(-1)] long lIndex, [out, retval] IHTMLStyleSheet** ReturnValue); + // VB6: Function createStyleSheet ([ByVal bstrHref As String = ""], [ByVal lIndex As Long = -1]) As IHTMLStyleSheet + [DispId(1071)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLStyleSheet + object createStyleSheet([MarshalAs(UnmanagedType.BStr)] string bstrHref, int lIndex); + + /// activeElement property of IHTMLDocument2 interface. + /// An original IDL definition of activeElement property was the following: IHTMLElement* activeElement; + // IDL: IHTMLElement* activeElement; + // VB6: activeElement As IHTMLElement + IHTMLElement activeElement + { + // IDL: HRESULT activeElement ([out, retval] IHTMLElement** ReturnValue); + // VB6: Function activeElement As IHTMLElement + [DispId(1005)] + get; + } + + /// alinkColor property of IHTMLDocument2 interface. + /// An original IDL definition of alinkColor property was the following: VARIANT alinkColor; + // IDL: VARIANT alinkColor; + // VB6: alinkColor As Any + object alinkColor + { + // IDL: HRESULT alinkColor ([out, retval] VARIANT* ReturnValue); + // VB6: Function alinkColor As Any + [DispId(1022)] + get; + // IDL: HRESULT alinkColor (VARIANT value); + // VB6: Sub alinkColor (ByVal value As Any) + [DispId(1022)] + set; + } + + /// all property of IHTMLDocument2 interface. + /// An original IDL definition of all property was the following: IHTMLElementCollection* all; + // IDL: IHTMLElementCollection* all; + // VB6: all As IHTMLElementCollection + object all + { + // IDL: HRESULT all ([out, retval] IHTMLElementCollection** ReturnValue); + // VB6: Function all As IHTMLElementCollection + [DispId(1003)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLElementCollection + get; + } + + /// anchors property of IHTMLDocument2 interface. + /// An original IDL definition of anchors property was the following: IHTMLElementCollection* anchors; + // IDL: IHTMLElementCollection* anchors; + // VB6: anchors As IHTMLElementCollection + object anchors + { + // IDL: HRESULT anchors ([out, retval] IHTMLElementCollection** ReturnValue); + // VB6: Function anchors As IHTMLElementCollection + [DispId(1007)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLElementCollection + get; + } + + /// applets property of IHTMLDocument2 interface. + /// An original IDL definition of applets property was the following: IHTMLElementCollection* applets; + // IDL: IHTMLElementCollection* applets; + // VB6: applets As IHTMLElementCollection + object applets + { + // IDL: HRESULT applets ([out, retval] IHTMLElementCollection** ReturnValue); + // VB6: Function applets As IHTMLElementCollection + [DispId(1008)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLElementCollection + get; + } + + /// bgColor property of IHTMLDocument2 interface. + /// An original IDL definition of bgColor property was the following: VARIANT bgColor; + // IDL: VARIANT bgColor; + // VB6: bgColor As Any + object bgColor + { + // IDL: HRESULT bgColor ([out, retval] VARIANT* ReturnValue); + // VB6: Function bgColor As Any + [DispId(-501)] + get; + // IDL: HRESULT bgColor (VARIANT value); + // VB6: Sub bgColor (ByVal value As Any) + [DispId(-501)] + set; + } + + /// body property of IHTMLDocument2 interface. + /// An original IDL definition of body property was the following: IHTMLElement* body; + // IDL: IHTMLElement* body; + // VB6: body As IHTMLElement + IHTMLElement body + { + // IDL: HRESULT body ([out, retval] IHTMLElement** ReturnValue); + // VB6: Function body As IHTMLElement + [DispId(1004)] + get; + } + + /// charset property of IHTMLDocument2 interface. + /// An original IDL definition of charset property was the following: BSTR charset; + // IDL: BSTR charset; + // VB6: charset As String + string charset + { + // IDL: HRESULT charset ([out, retval] BSTR* ReturnValue); + // VB6: Function charset As String + [DispId(1032)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT charset (BSTR value); + // VB6: Sub charset (ByVal value As String) + [DispId(1032)] + set; + } + + /// cookie property of IHTMLDocument2 interface. + /// An original IDL definition of cookie property was the following: BSTR cookie; + // IDL: BSTR cookie; + // VB6: cookie As String + string cookie + { + // IDL: HRESULT cookie ([out, retval] BSTR* ReturnValue); + // VB6: Function cookie As String + [DispId(1030)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT cookie (BSTR value); + // VB6: Sub cookie (ByVal value As String) + [DispId(1030)] + set; + } + + /// defaultCharset property of IHTMLDocument2 interface. + /// An original IDL definition of defaultCharset property was the following: BSTR defaultCharset; + // IDL: BSTR defaultCharset; + // VB6: defaultCharset As String + string defaultCharset + { + // IDL: HRESULT defaultCharset ([out, retval] BSTR* ReturnValue); + // VB6: Function defaultCharset As String + [DispId(1033)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT defaultCharset (BSTR value); + // VB6: Sub defaultCharset (ByVal value As String) + [DispId(1033)] + set; + } + + /// designMode property of IHTMLDocument2 interface. + /// An original IDL definition of designMode property was the following: BSTR designMode; + // IDL: BSTR designMode; + // VB6: designMode As String + string designMode + { + // IDL: HRESULT designMode ([out, retval] BSTR* ReturnValue); + // VB6: Function designMode As String + [DispId(1014)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT designMode (BSTR value); + // VB6: Sub designMode (ByVal value As String) + [DispId(1014)] + set; + } + + /// domain property of IHTMLDocument2 interface. + /// An original IDL definition of domain property was the following: BSTR domain; + // IDL: BSTR domain; + // VB6: domain As String + string domain + { + // IDL: HRESULT domain ([out, retval] BSTR* ReturnValue); + // VB6: Function domain As String + [DispId(1029)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT domain (BSTR value); + // VB6: Sub domain (ByVal value As String) + [DispId(1029)] + set; + } + + /// embeds property of IHTMLDocument2 interface. + /// An original IDL definition of embeds property was the following: IHTMLElementCollection* embeds; + // IDL: IHTMLElementCollection* embeds; + // VB6: embeds As IHTMLElementCollection + object embeds + { + // IDL: HRESULT embeds ([out, retval] IHTMLElementCollection** ReturnValue); + // VB6: Function embeds As IHTMLElementCollection + [DispId(1015)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLElementCollection + get; + } + + /// expando property of IHTMLDocument2 interface. + /// An original IDL definition of expando property was the following: VARIANT_BOOL expando; + // IDL: VARIANT_BOOL expando; + // VB6: expando As Boolean + bool expando + { + // IDL: HRESULT expando ([out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function expando As Boolean + [DispId(1031)] + [return: MarshalAs(UnmanagedType.VariantBool)] + get; + // IDL: HRESULT expando (VARIANT_BOOL value); + // VB6: Sub expando (ByVal value As Boolean) + [DispId(1031)] + set; + } + + /// fgColor property of IHTMLDocument2 interface. + /// An original IDL definition of fgColor property was the following: VARIANT fgColor; + // IDL: VARIANT fgColor; + // VB6: fgColor As Any + object fgColor + { + // IDL: HRESULT fgColor ([out, retval] VARIANT* ReturnValue); + // VB6: Function fgColor As Any + [DispId(-2147413110)] + get; + // IDL: HRESULT fgColor (VARIANT value); + // VB6: Sub fgColor (ByVal value As Any) + [DispId(-2147413110)] + set; + } + + /// fileCreatedDate property of IHTMLDocument2 interface. + /// An original IDL definition of fileCreatedDate property was the following: BSTR fileCreatedDate; + // IDL: BSTR fileCreatedDate; + // VB6: fileCreatedDate As String + string fileCreatedDate + { + // IDL: HRESULT fileCreatedDate ([out, retval] BSTR* ReturnValue); + // VB6: Function fileCreatedDate As String + [DispId(1043)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// fileModifiedDate property of IHTMLDocument2 interface. + /// An original IDL definition of fileModifiedDate property was the following: BSTR fileModifiedDate; + // IDL: BSTR fileModifiedDate; + // VB6: fileModifiedDate As String + string fileModifiedDate + { + // IDL: HRESULT fileModifiedDate ([out, retval] BSTR* ReturnValue); + // VB6: Function fileModifiedDate As String + [DispId(1044)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// fileSize property of IHTMLDocument2 interface. + /// An original IDL definition of fileSize property was the following: BSTR fileSize; + // IDL: BSTR fileSize; + // VB6: fileSize As String + string fileSize + { + // IDL: HRESULT fileSize ([out, retval] BSTR* ReturnValue); + // VB6: Function fileSize As String + [DispId(1042)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// fileUpdatedDate property of IHTMLDocument2 interface. + /// An original IDL definition of fileUpdatedDate property was the following: BSTR fileUpdatedDate; + // IDL: BSTR fileUpdatedDate; + // VB6: fileUpdatedDate As String + string fileUpdatedDate + { + // IDL: HRESULT fileUpdatedDate ([out, retval] BSTR* ReturnValue); + // VB6: Function fileUpdatedDate As String + [DispId(1045)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// forms property of IHTMLDocument2 interface. + /// An original IDL definition of forms property was the following: IHTMLElementCollection* forms; + // IDL: IHTMLElementCollection* forms; + // VB6: forms As IHTMLElementCollection + object forms + { + // IDL: HRESULT forms ([out, retval] IHTMLElementCollection** ReturnValue); + // VB6: Function forms As IHTMLElementCollection + [DispId(1010)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLElementCollection + get; + } + + /// frames property of IHTMLDocument2 interface. + /// An original IDL definition of frames property was the following: IHTMLFramesCollection2* frames; + // IDL: IHTMLFramesCollection2* frames; + // VB6: frames As IHTMLFramesCollection2 + object frames + { + // IDL: HRESULT frames ([out, retval] IHTMLFramesCollection2** ReturnValue); + // VB6: Function frames As IHTMLFramesCollection2 + [DispId(1019)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLFramesCollection2 + get; + } + + /// images property of IHTMLDocument2 interface. + /// An original IDL definition of images property was the following: IHTMLElementCollection* images; + // IDL: IHTMLElementCollection* images; + // VB6: images As IHTMLElementCollection + object images + { + // IDL: HRESULT images ([out, retval] IHTMLElementCollection** ReturnValue); + // VB6: Function images As IHTMLElementCollection + [DispId(1011)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLElementCollection + get; + } + + /// lastModified property of IHTMLDocument2 interface. + /// An original IDL definition of lastModified property was the following: BSTR lastModified; + // IDL: BSTR lastModified; + // VB6: lastModified As String + string lastModified + { + // IDL: HRESULT lastModified ([out, retval] BSTR* ReturnValue); + // VB6: Function lastModified As String + [DispId(1028)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// linkColor property of IHTMLDocument2 interface. + /// An original IDL definition of linkColor property was the following: VARIANT linkColor; + // IDL: VARIANT linkColor; + // VB6: linkColor As Any + object linkColor + { + // IDL: HRESULT linkColor ([out, retval] VARIANT* ReturnValue); + // VB6: Function linkColor As Any + [DispId(1024)] + get; + // IDL: HRESULT linkColor (VARIANT value); + // VB6: Sub linkColor (ByVal value As Any) + [DispId(1024)] + set; + } + + /// links property of IHTMLDocument2 interface. + /// An original IDL definition of links property was the following: IHTMLElementCollection* links; + // IDL: IHTMLElementCollection* links; + // VB6: links As IHTMLElementCollection + object links + { + // IDL: HRESULT links ([out, retval] IHTMLElementCollection** ReturnValue); + // VB6: Function links As IHTMLElementCollection + [DispId(1009)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLElementCollection + get; + } + + /// location property of IHTMLDocument2 interface. + /// An original IDL definition of location property was the following: IHTMLLocation* location; + // IDL: IHTMLLocation* location; + // VB6: location As IHTMLLocation + object location + { + // IDL: HRESULT location ([out, retval] IHTMLLocation** ReturnValue); + // VB6: Function location As IHTMLLocation + [DispId(1026)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLLocation + get; + } + + /// mimeType property of IHTMLDocument2 interface. + /// An original IDL definition of mimeType property was the following: BSTR mimeType; + // IDL: BSTR mimeType; + // VB6: mimeType As String + string mimeType + { + // IDL: HRESULT mimeType ([out, retval] BSTR* ReturnValue); + // VB6: Function mimeType As String + [DispId(1041)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// nameProp property of IHTMLDocument2 interface. + /// An original IDL definition of nameProp property was the following: BSTR nameProp; + // IDL: BSTR nameProp; + // VB6: nameProp As String + string nameProp + { + // IDL: HRESULT nameProp ([out, retval] BSTR* ReturnValue); + // VB6: Function nameProp As String + [DispId(1048)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// onafterupdate property of IHTMLDocument2 interface. + /// An original IDL definition of onafterupdate property was the following: VARIANT onafterupdate; + // IDL: VARIANT onafterupdate; + // VB6: onafterupdate As Any + object onafterupdate + { + // IDL: HRESULT onafterupdate ([out, retval] VARIANT* ReturnValue); + // VB6: Function onafterupdate As Any + [DispId(-2147412090)] + get; + // IDL: HRESULT onafterupdate (VARIANT value); + // VB6: Sub onafterupdate (ByVal value As Any) + [DispId(-2147412090)] + set; + } + + /// onbeforeupdate property of IHTMLDocument2 interface. + /// An original IDL definition of onbeforeupdate property was the following: VARIANT onbeforeupdate; + // IDL: VARIANT onbeforeupdate; + // VB6: onbeforeupdate As Any + object onbeforeupdate + { + // IDL: HRESULT onbeforeupdate ([out, retval] VARIANT* ReturnValue); + // VB6: Function onbeforeupdate As Any + [DispId(-2147412091)] + get; + // IDL: HRESULT onbeforeupdate (VARIANT value); + // VB6: Sub onbeforeupdate (ByVal value As Any) + [DispId(-2147412091)] + set; + } + + /// onclick property of IHTMLDocument2 interface. + /// An original IDL definition of onclick property was the following: VARIANT onclick; + // IDL: VARIANT onclick; + // VB6: onclick As Any + object onclick + { + // IDL: HRESULT onclick ([out, retval] VARIANT* ReturnValue); + // VB6: Function onclick As Any + [DispId(-2147412104)] + get; + // IDL: HRESULT onclick (VARIANT value); + // VB6: Sub onclick (ByVal value As Any) + [DispId(-2147412104)] + set; + } + + /// ondblclick property of IHTMLDocument2 interface. + /// An original IDL definition of ondblclick property was the following: VARIANT ondblclick; + // IDL: VARIANT ondblclick; + // VB6: ondblclick As Any + object ondblclick + { + // IDL: HRESULT ondblclick ([out, retval] VARIANT* ReturnValue); + // VB6: Function ondblclick As Any + [DispId(-2147412103)] + get; + // IDL: HRESULT ondblclick (VARIANT value); + // VB6: Sub ondblclick (ByVal value As Any) + [DispId(-2147412103)] + set; + } + + /// ondragstart property of IHTMLDocument2 interface. + /// An original IDL definition of ondragstart property was the following: VARIANT ondragstart; + // IDL: VARIANT ondragstart; + // VB6: ondragstart As Any + object ondragstart + { + // IDL: HRESULT ondragstart ([out, retval] VARIANT* ReturnValue); + // VB6: Function ondragstart As Any + [DispId(-2147412077)] + get; + // IDL: HRESULT ondragstart (VARIANT value); + // VB6: Sub ondragstart (ByVal value As Any) + [DispId(-2147412077)] + set; + } + + /// onerrorupdate property of IHTMLDocument2 interface. + /// An original IDL definition of onerrorupdate property was the following: VARIANT onerrorupdate; + // IDL: VARIANT onerrorupdate; + // VB6: onerrorupdate As Any + object onerrorupdate + { + // IDL: HRESULT onerrorupdate ([out, retval] VARIANT* ReturnValue); + // VB6: Function onerrorupdate As Any + [DispId(-2147412074)] + get; + // IDL: HRESULT onerrorupdate (VARIANT value); + // VB6: Sub onerrorupdate (ByVal value As Any) + [DispId(-2147412074)] + set; + } + + /// onhelp property of IHTMLDocument2 interface. + /// An original IDL definition of onhelp property was the following: VARIANT onhelp; + // IDL: VARIANT onhelp; + // VB6: onhelp As Any + object onhelp + { + // IDL: HRESULT onhelp ([out, retval] VARIANT* ReturnValue); + // VB6: Function onhelp As Any + [DispId(-2147412099)] + get; + // IDL: HRESULT onhelp (VARIANT value); + // VB6: Sub onhelp (ByVal value As Any) + [DispId(-2147412099)] + set; + } + + /// onkeydown property of IHTMLDocument2 interface. + /// An original IDL definition of onkeydown property was the following: VARIANT onkeydown; + // IDL: VARIANT onkeydown; + // VB6: onkeydown As Any + object onkeydown + { + // IDL: HRESULT onkeydown ([out, retval] VARIANT* ReturnValue); + // VB6: Function onkeydown As Any + [DispId(-2147412107)] + get; + // IDL: HRESULT onkeydown (VARIANT value); + // VB6: Sub onkeydown (ByVal value As Any) + [DispId(-2147412107)] + set; + } + + /// onkeypress property of IHTMLDocument2 interface. + /// An original IDL definition of onkeypress property was the following: VARIANT onkeypress; + // IDL: VARIANT onkeypress; + // VB6: onkeypress As Any + object onkeypress + { + // IDL: HRESULT onkeypress ([out, retval] VARIANT* ReturnValue); + // VB6: Function onkeypress As Any + [DispId(-2147412105)] + get; + // IDL: HRESULT onkeypress (VARIANT value); + // VB6: Sub onkeypress (ByVal value As Any) + [DispId(-2147412105)] + set; + } + + /// onkeyup property of IHTMLDocument2 interface. + /// An original IDL definition of onkeyup property was the following: VARIANT onkeyup; + // IDL: VARIANT onkeyup; + // VB6: onkeyup As Any + object onkeyup + { + // IDL: HRESULT onkeyup ([out, retval] VARIANT* ReturnValue); + // VB6: Function onkeyup As Any + [DispId(-2147412106)] + get; + // IDL: HRESULT onkeyup (VARIANT value); + // VB6: Sub onkeyup (ByVal value As Any) + [DispId(-2147412106)] + set; + } + + /// onmousedown property of IHTMLDocument2 interface. + /// An original IDL definition of onmousedown property was the following: VARIANT onmousedown; + // IDL: VARIANT onmousedown; + // VB6: onmousedown As Any + object onmousedown + { + // IDL: HRESULT onmousedown ([out, retval] VARIANT* ReturnValue); + // VB6: Function onmousedown As Any + [DispId(-2147412110)] + get; + // IDL: HRESULT onmousedown (VARIANT value); + // VB6: Sub onmousedown (ByVal value As Any) + [DispId(-2147412110)] + set; + } + + /// onmousemove property of IHTMLDocument2 interface. + /// An original IDL definition of onmousemove property was the following: VARIANT onmousemove; + // IDL: VARIANT onmousemove; + // VB6: onmousemove As Any + object onmousemove + { + // IDL: HRESULT onmousemove ([out, retval] VARIANT* ReturnValue); + // VB6: Function onmousemove As Any + [DispId(-2147412108)] + get; + // IDL: HRESULT onmousemove (VARIANT value); + // VB6: Sub onmousemove (ByVal value As Any) + [DispId(-2147412108)] + set; + } + + /// onmouseout property of IHTMLDocument2 interface. + /// An original IDL definition of onmouseout property was the following: VARIANT onmouseout; + // IDL: VARIANT onmouseout; + // VB6: onmouseout As Any + object onmouseout + { + // IDL: HRESULT onmouseout ([out, retval] VARIANT* ReturnValue); + // VB6: Function onmouseout As Any + [DispId(-2147412111)] + get; + // IDL: HRESULT onmouseout (VARIANT value); + // VB6: Sub onmouseout (ByVal value As Any) + [DispId(-2147412111)] + set; + } + + /// onmouseover property of IHTMLDocument2 interface. + /// An original IDL definition of onmouseover property was the following: VARIANT onmouseover; + // IDL: VARIANT onmouseover; + // VB6: onmouseover As Any + object onmouseover + { + // IDL: HRESULT onmouseover ([out, retval] VARIANT* ReturnValue); + // VB6: Function onmouseover As Any + [DispId(-2147412112)] + get; + // IDL: HRESULT onmouseover (VARIANT value); + // VB6: Sub onmouseover (ByVal value As Any) + [DispId(-2147412112)] + set; + } + + /// onmouseup property of IHTMLDocument2 interface. + /// An original IDL definition of onmouseup property was the following: VARIANT onmouseup; + // IDL: VARIANT onmouseup; + // VB6: onmouseup As Any + object onmouseup + { + // IDL: HRESULT onmouseup ([out, retval] VARIANT* ReturnValue); + // VB6: Function onmouseup As Any + [DispId(-2147412109)] + get; + // IDL: HRESULT onmouseup (VARIANT value); + // VB6: Sub onmouseup (ByVal value As Any) + [DispId(-2147412109)] + set; + } + + /// onreadystatechange property of IHTMLDocument2 interface. + /// An original IDL definition of onreadystatechange property was the following: VARIANT onreadystatechange; + // IDL: VARIANT onreadystatechange; + // VB6: onreadystatechange As Any + object onreadystatechange + { + // IDL: HRESULT onreadystatechange ([out, retval] VARIANT* ReturnValue); + // VB6: Function onreadystatechange As Any + [DispId(-2147412087)] + get; + // IDL: HRESULT onreadystatechange (VARIANT value); + // VB6: Sub onreadystatechange (ByVal value As Any) + [DispId(-2147412087)] + set; + } + + /// onrowenter property of IHTMLDocument2 interface. + /// An original IDL definition of onrowenter property was the following: VARIANT onrowenter; + // IDL: VARIANT onrowenter; + // VB6: onrowenter As Any + object onrowenter + { + // IDL: HRESULT onrowenter ([out, retval] VARIANT* ReturnValue); + // VB6: Function onrowenter As Any + [DispId(-2147412093)] + get; + // IDL: HRESULT onrowenter (VARIANT value); + // VB6: Sub onrowenter (ByVal value As Any) + [DispId(-2147412093)] + set; + } + + /// onrowexit property of IHTMLDocument2 interface. + /// An original IDL definition of onrowexit property was the following: VARIANT onrowexit; + // IDL: VARIANT onrowexit; + // VB6: onrowexit As Any + object onrowexit + { + // IDL: HRESULT onrowexit ([out, retval] VARIANT* ReturnValue); + // VB6: Function onrowexit As Any + [DispId(-2147412094)] + get; + // IDL: HRESULT onrowexit (VARIANT value); + // VB6: Sub onrowexit (ByVal value As Any) + [DispId(-2147412094)] + set; + } + + /// onselectstart property of IHTMLDocument2 interface. + /// An original IDL definition of onselectstart property was the following: VARIANT onselectstart; + // IDL: VARIANT onselectstart; + // VB6: onselectstart As Any + object onselectstart + { + // IDL: HRESULT onselectstart ([out, retval] VARIANT* ReturnValue); + // VB6: Function onselectstart As Any + [DispId(-2147412075)] + get; + // IDL: HRESULT onselectstart (VARIANT value); + // VB6: Sub onselectstart (ByVal value As Any) + [DispId(-2147412075)] + set; + } + + /// parentWindow property of IHTMLDocument2 interface. + /// An original IDL definition of parentWindow property was the following: IHTMLWindow2* parentWindow; + // IDL: IHTMLWindow2* parentWindow; + // VB6: parentWindow As IHTMLWindow2 + object parentWindow + { + // IDL: HRESULT parentWindow ([out, retval] IHTMLWindow2** ReturnValue); + // VB6: Function parentWindow As IHTMLWindow2 + [DispId(1034)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLWindow2 + get; + } + + /// plugins property of IHTMLDocument2 interface. + /// An original IDL definition of plugins property was the following: IHTMLElementCollection* plugins; + // IDL: IHTMLElementCollection* plugins; + // VB6: plugins As IHTMLElementCollection + object plugins + { + // IDL: HRESULT plugins ([out, retval] IHTMLElementCollection** ReturnValue); + // VB6: Function plugins As IHTMLElementCollection + [DispId(1021)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLElementCollection + get; + } + + /// protocol property of IHTMLDocument2 interface. + /// An original IDL definition of protocol property was the following: BSTR protocol; + // IDL: BSTR protocol; + // VB6: protocol As String + string protocol + { + // IDL: HRESULT protocol ([out, retval] BSTR* ReturnValue); + // VB6: Function protocol As String + [DispId(1047)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// readyState property of IHTMLDocument2 interface. + /// An original IDL definition of readyState property was the following: BSTR readyState; + // IDL: BSTR readyState; + // VB6: readyState As String + string readyState + { + // IDL: HRESULT readyState ([out, retval] BSTR* ReturnValue); + // VB6: Function readyState As String + [DispId(1018)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// referrer property of IHTMLDocument2 interface. + /// An original IDL definition of referrer property was the following: BSTR referrer; + // IDL: BSTR referrer; + // VB6: referrer As String + string referrer + { + // IDL: HRESULT referrer ([out, retval] BSTR* ReturnValue); + // VB6: Function referrer As String + [DispId(1027)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// Script property of IHTMLDocument2 interface. + /// An original IDL definition of Script property was the following: IDispatch* Script; + // IDL: IDispatch* Script; + // VB6: Script As IDispatch + object Script + { + // IDL: HRESULT Script ([out, retval] IDispatch** ReturnValue); + // VB6: Function Script As IDispatch + [DispId(1001)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + /// scripts property of IHTMLDocument2 interface. + /// An original IDL definition of scripts property was the following: IHTMLElementCollection* scripts; + // IDL: IHTMLElementCollection* scripts; + // VB6: scripts As IHTMLElementCollection + object scripts + { + // IDL: HRESULT scripts ([out, retval] IHTMLElementCollection** ReturnValue); + // VB6: Function scripts As IHTMLElementCollection + [DispId(1013)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLElementCollection + get; + } + + /// security property of IHTMLDocument2 interface. + /// An original IDL definition of security property was the following: BSTR security; + // IDL: BSTR security; + // VB6: security As String + string security + { + // IDL: HRESULT security ([out, retval] BSTR* ReturnValue); + // VB6: Function security As String + [DispId(1046)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// selection property of IHTMLDocument2 interface. + /// An original IDL definition of selection property was the following: IHTMLSelectionObject* selection; + // IDL: IHTMLSelectionObject* selection; + // VB6: selection As IHTMLSelectionObject + object selection + { + // IDL: HRESULT selection ([out, retval] IHTMLSelectionObject** ReturnValue); + // VB6: Function selection As IHTMLSelectionObject + [DispId(1017)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLSelectionObject + get; + } + + /// styleSheets property of IHTMLDocument2 interface. + /// An original IDL definition of styleSheets property was the following: IHTMLStyleSheetsCollection* styleSheets; + // IDL: IHTMLStyleSheetsCollection* styleSheets; + // VB6: styleSheets As IHTMLStyleSheetsCollection + object styleSheets + { + // IDL: HRESULT styleSheets ([out, retval] IHTMLStyleSheetsCollection** ReturnValue); + // VB6: Function styleSheets As IHTMLStyleSheetsCollection + [DispId(1069)] + [return: MarshalAs(UnmanagedType.Interface)] //IHTMLStyleSheetsCollection + get; + } + + /// title property of IHTMLDocument2 interface. + /// An original IDL definition of title property was the following: BSTR title; + // IDL: BSTR title; + // VB6: title As String + string title + { + // IDL: HRESULT title ([out, retval] BSTR* ReturnValue); + // VB6: Function title As String + [DispId(1012)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT title (BSTR value); + // VB6: Sub title (ByVal value As String) + [DispId(1012)] + set; + } + + /// url property of IHTMLDocument2 interface. + /// An original IDL definition of url property was the following: BSTR url; + // IDL: BSTR url; + // VB6: url As String + string url + { + // IDL: HRESULT url ([out, retval] BSTR* ReturnValue); + // VB6: Function url As String + [DispId(1025)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT url (BSTR value); + // VB6: Sub url (ByVal value As String) + [DispId(1025)] + set; + } + + /// vlinkColor property of IHTMLDocument2 interface. + /// An original IDL definition of vlinkColor property was the following: VARIANT vlinkColor; + // IDL: VARIANT vlinkColor; + // VB6: vlinkColor As Any + object vlinkColor + { + // IDL: HRESULT vlinkColor ([out, retval] VARIANT* ReturnValue); + // VB6: Function vlinkColor As Any + [DispId(1023)] + get; + // IDL: HRESULT vlinkColor (VARIANT value); + // VB6: Sub vlinkColor (ByVal value As Any) + [DispId(1023)] + set; + } + } +} diff --git a/Speak/Speak/Interfaces/IHTMLElement.cs b/Speak/Speak/Interfaces/IHTMLElement.cs new file mode 100644 index 0000000..3663e33 --- /dev/null +++ b/Speak/Speak/Interfaces/IHTMLElement.cs @@ -0,0 +1,784 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Speak.Interfaces +{ + [Guid("3050F1FF-98B5-11CF-BB82-00AA00BDCE0B")] + [ComImport] + [TypeLibType((short)4160)] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] + public interface IHTMLElement + { + /// setAttribute method of IHTMLElement interface. + /// An original IDL definition of setAttribute method was the following: HRESULT setAttribute (BSTR strAttributeName, VARIANT AttributeValue, [optional, defaultvalue(1)] long lFlags); + // IDL: HRESULT setAttribute (BSTR strAttributeName, VARIANT AttributeValue, [optional, defaultvalue(1)] long lFlags); + // VB6: Sub setAttribute (ByVal strAttributeName As String, ByVal AttributeValue As Any, [ByVal lFlags As Long = 1]) + [DispId(HTMLDispIDs.DISPID_IHTMLELEMENT_SETATTRIBUTE)] // - 2147417611)] + void setAttribute([MarshalAs(UnmanagedType.BStr)] string strAttributeName, object AttributeValue, int lFlags); + + /// getAttribute method of IHTMLElement interface. + /// An original IDL definition of getAttribute method was the following: HRESULT getAttribute (BSTR strAttributeName, [optional, defaultvalue(0)] long lFlags, [out, retval] VARIANT* ReturnValue); + // IDL: HRESULT getAttribute (BSTR strAttributeName, [optional, defaultvalue(0)] long lFlags, [out, retval] VARIANT* ReturnValue); + // VB6: Function getAttribute (ByVal strAttributeName As String, [ByVal lFlags As Long = 0]) As Any + [DispId(-2147417610)] + object getAttribute([MarshalAs(UnmanagedType.BStr)] string strAttributeName, int lFlags); + + /// removeAttribute method of IHTMLElement interface. + /// An original IDL definition of removeAttribute method was the following: HRESULT removeAttribute (BSTR strAttributeName, [optional, defaultvalue(1)] long lFlags, [out, retval] VARIANT_BOOL* ReturnValue); + // IDL: HRESULT removeAttribute (BSTR strAttributeName, [optional, defaultvalue(1)] long lFlags, [out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function removeAttribute (ByVal strAttributeName As String, [ByVal lFlags As Long = 1]) As Boolean + [DispId(-2147417609)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool removeAttribute([MarshalAs(UnmanagedType.BStr)] string strAttributeName, int lFlags); + + /// scrollIntoView method of IHTMLElement interface. + /// An original IDL definition of scrollIntoView method was the following: HRESULT scrollIntoView ([optional] VARIANT varargStart); + // IDL: HRESULT scrollIntoView ([optional] VARIANT varargStart); + // VB6: Sub scrollIntoView ([ByVal varargStart As Any]) + [DispId(-2147417093)] + void scrollIntoView(object varargStart); + + /// contains method of IHTMLElement interface. + /// An original IDL definition of contains method was the following: HRESULT contains (IHTMLElement* pChild, [out, retval] VARIANT_BOOL* ReturnValue); + // IDL: HRESULT contains (IHTMLElement* pChild, [out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function contains (ByVal pChild As IHTMLElement) As Boolean + [DispId(-2147417092)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool contains(IHTMLElement pChild); + + /// insertAdjacentHTML method of IHTMLElement interface. + /// An original IDL definition of insertAdjacentHTML method was the following: HRESULT insertAdjacentHTML (BSTR where, BSTR html); + // IDL: HRESULT insertAdjacentHTML (BSTR where, BSTR html); + // VB6: Sub insertAdjacentHTML (ByVal where As String, ByVal html As String) + [DispId(-2147417082)] + void insertAdjacentHTML([MarshalAs(UnmanagedType.BStr)] string where, [MarshalAs(UnmanagedType.BStr)] string html); + + /// insertAdjacentText method of IHTMLElement interface. + /// An original IDL definition of insertAdjacentText method was the following: HRESULT insertAdjacentText (BSTR where, BSTR text); + // IDL: HRESULT insertAdjacentText (BSTR where, BSTR text); + // VB6: Sub insertAdjacentText (ByVal where As String, ByVal text As String) + [DispId(-2147417081)] + void insertAdjacentText([MarshalAs(UnmanagedType.BStr)] string where, [MarshalAs(UnmanagedType.BStr)] string text); + + /// click method of IHTMLElement interface. + /// An original IDL definition of click method was the following: HRESULT click (void); + // IDL: HRESULT click (void); + // VB6: Sub click + [DispId(-2147417079)] + void click(); + + /// toString method of IHTMLElement interface. + /// An original IDL definition of toString method was the following: HRESULT toString ([out, retval] BSTR* ReturnValue); + // IDL: HRESULT toString ([out, retval] BSTR* ReturnValue); + // VB6: Function toString As String + [DispId(-2147417076)] + [return: MarshalAs(UnmanagedType.BStr)] + string toString(); + + /// all property of IHTMLElement interface. + /// An original IDL definition of all property was the following: IDispatch* all; + // IDL: IDispatch* all; + // VB6: all As IDispatch + object all + { + // IDL: HRESULT all ([out, retval] IDispatch** ReturnValue); + // VB6: Function all As IDispatch + [DispId(-2147417074)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + /// children property of IHTMLElement interface. + /// An original IDL definition of children property was the following: IDispatch* children; + // IDL: IDispatch* children; + // VB6: children As IDispatch + object children + { + // IDL: HRESULT children ([out, retval] IDispatch** ReturnValue); + // VB6: Function children As IDispatch + [DispId(-2147417075)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + /// className property of IHTMLElement interface. + /// An original IDL definition of className property was the following: BSTR className; + // IDL: BSTR className; + // VB6: className As String + string className + { + // IDL: HRESULT className ([out, retval] BSTR* ReturnValue); + // VB6: Function className As String + [DispId(-2147417111)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT className (BSTR value); + // VB6: Sub className (ByVal value As String) + [DispId(-2147417111)] + set; + } + + /// document property of IHTMLElement interface. + /// An original IDL definition of document property was the following: IDispatch* document; + // IDL: IDispatch* document; + // VB6: document As IDispatch + object document + { + // IDL: HRESULT document ([out, retval] IDispatch** ReturnValue); + // VB6: Function document As IDispatch + [DispId(-2147417094)] + [return: MarshalAs(UnmanagedType.IDispatch)] + get; + } + + /// filters property of IHTMLElement interface. + /// An original IDL definition of filters property was the following: IHTMLFiltersCollection* filters; + // IDL: IHTMLFiltersCollection* filters; + // VB6: filters As IHTMLFiltersCollection + //IHTMLFiltersCollection filters + object filters + { + // IDL: HRESULT filters ([out, retval] IHTMLFiltersCollection** ReturnValue); + // VB6: Function filters As IHTMLFiltersCollection + [DispId(-2147417077)] + [return: MarshalAs(UnmanagedType.Interface)] + get; + } + + /// id property of IHTMLElement interface. + /// An original IDL definition of id property was the following: BSTR id; + // IDL: BSTR id; + // VB6: id As String + string id + { + // IDL: HRESULT id ([out, retval] BSTR* ReturnValue); + // VB6: Function id As String + [DispId(-2147417110)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT id (BSTR value); + // VB6: Sub id (ByVal value As String) + [DispId(-2147417110)] + set; + } + + /// innerHTML property of IHTMLElement interface. + /// An original IDL definition of innerHTML property was the following: BSTR innerHTML; + // IDL: BSTR innerHTML; + // VB6: innerHTML As String + string innerHTML + { + // IDL: HRESULT innerHTML ([out, retval] BSTR* ReturnValue); + // VB6: Function innerHTML As String + [DispId(-2147417086)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT innerHTML (BSTR value); + // VB6: Sub innerHTML (ByVal value As String) + [DispId(-2147417086)] + set; + } + + /// innerText property of IHTMLElement interface. + /// An original IDL definition of innerText property was the following: BSTR innerText; + // IDL: BSTR innerText; + // VB6: innerText As String + string innerText + { + // IDL: HRESULT innerText ([out, retval] BSTR* ReturnValue); + // VB6: Function innerText As String + [DispId(-2147417085)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT innerText (BSTR value); + // VB6: Sub innerText (ByVal value As String) + [DispId(-2147417085)] + set; + } + + /// isTextEdit property of IHTMLElement interface. + /// An original IDL definition of isTextEdit property was the following: VARIANT_BOOL isTextEdit; + // IDL: VARIANT_BOOL isTextEdit; + // VB6: isTextEdit As Boolean + bool isTextEdit + { + // IDL: HRESULT isTextEdit ([out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function isTextEdit As Boolean + [DispId(-2147417078)] + [return: MarshalAs(UnmanagedType.VariantBool)] + get; + } + + /// lang property of IHTMLElement interface. + /// An original IDL definition of lang property was the following: BSTR lang; + // IDL: BSTR lang; + // VB6: lang As String + string lang + { + // IDL: HRESULT lang ([out, retval] BSTR* ReturnValue); + // VB6: Function lang As String + [DispId(-2147413103)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT lang (BSTR value); + // VB6: Sub lang (ByVal value As String) + [DispId(-2147413103)] + set; + } + + /// language property of IHTMLElement interface. + /// An original IDL definition of language property was the following: BSTR language; + // IDL: BSTR language; + // VB6: language As String + string language + { + // IDL: HRESULT language ([out, retval] BSTR* ReturnValue); + // VB6: Function language As String + [DispId(-2147413012)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT language (BSTR value); + // VB6: Sub language (ByVal value As String) + [DispId(-2147413012)] + set; + } + + /// offsetHeight property of IHTMLElement interface. + /// An original IDL definition of offsetHeight property was the following: long offsetHeight; + // IDL: long offsetHeight; + // VB6: offsetHeight As Long + int offsetHeight + { + // IDL: HRESULT offsetHeight ([out, retval] long* ReturnValue); + // VB6: Function offsetHeight As Long + [DispId(-2147417101)] + get; + } + + /// offsetLeft property of IHTMLElement interface. + /// An original IDL definition of offsetLeft property was the following: long offsetLeft; + // IDL: long offsetLeft; + // VB6: offsetLeft As Long + int offsetLeft + { + // IDL: HRESULT offsetLeft ([out, retval] long* ReturnValue); + // VB6: Function offsetLeft As Long + [DispId(-2147417104)] + get; + } + + /// offsetParent property of IHTMLElement interface. + /// An original IDL definition of offsetParent property was the following: IHTMLElement* offsetParent; + // IDL: IHTMLElement* offsetParent; + // VB6: offsetParent As IHTMLElement + IHTMLElement offsetParent + { + // IDL: HRESULT offsetParent ([out, retval] IHTMLElement** ReturnValue); + // VB6: Function offsetParent As IHTMLElement + [DispId(-2147417100)] + get; + } + + /// offsetTop property of IHTMLElement interface. + /// An original IDL definition of offsetTop property was the following: long offsetTop; + // IDL: long offsetTop; + // VB6: offsetTop As Long + int offsetTop + { + // IDL: HRESULT offsetTop ([out, retval] long* ReturnValue); + // VB6: Function offsetTop As Long + [DispId(-2147417103)] + get; + } + + /// offsetWidth property of IHTMLElement interface. + /// An original IDL definition of offsetWidth property was the following: long offsetWidth; + // IDL: long offsetWidth; + // VB6: offsetWidth As Long + int offsetWidth + { + // IDL: HRESULT offsetWidth ([out, retval] long* ReturnValue); + // VB6: Function offsetWidth As Long + [DispId(-2147417102)] + get; + } + + /// onafterupdate property of IHTMLElement interface. + /// An original IDL definition of onafterupdate property was the following: VARIANT onafterupdate; + // IDL: VARIANT onafterupdate; + // VB6: onafterupdate As Any + object onafterupdate + { + // IDL: HRESULT onafterupdate ([out, retval] VARIANT* ReturnValue); + // VB6: Function onafterupdate As Any + [DispId(-2147412090)] + get; + // IDL: HRESULT onafterupdate (VARIANT value); + // VB6: Sub onafterupdate (ByVal value As Any) + [DispId(-2147412090)] + set; + } + + /// onbeforeupdate property of IHTMLElement interface. + /// An original IDL definition of onbeforeupdate property was the following: VARIANT onbeforeupdate; + // IDL: VARIANT onbeforeupdate; + // VB6: onbeforeupdate As Any + object onbeforeupdate + { + // IDL: HRESULT onbeforeupdate ([out, retval] VARIANT* ReturnValue); + // VB6: Function onbeforeupdate As Any + [DispId(-2147412091)] + get; + // IDL: HRESULT onbeforeupdate (VARIANT value); + // VB6: Sub onbeforeupdate (ByVal value As Any) + [DispId(-2147412091)] + set; + } + + /// onclick property of IHTMLElement interface. + /// An original IDL definition of onclick property was the following: VARIANT onclick; + // IDL: VARIANT onclick; + // VB6: onclick As Any + object onclick + { + // IDL: HRESULT onclick ([out, retval] VARIANT* ReturnValue); + // VB6: Function onclick As Any + [DispId(-2147412104)] + get; + // IDL: HRESULT onclick (VARIANT value); + // VB6: Sub onclick (ByVal value As Any) + [DispId(-2147412104)] + set; + } + + /// ondataavailable property of IHTMLElement interface. + /// An original IDL definition of ondataavailable property was the following: VARIANT ondataavailable; + // IDL: VARIANT ondataavailable; + // VB6: ondataavailable As Any + object ondataavailable + { + // IDL: HRESULT ondataavailable ([out, retval] VARIANT* ReturnValue); + // VB6: Function ondataavailable As Any + [DispId(-2147412071)] + get; + // IDL: HRESULT ondataavailable (VARIANT value); + // VB6: Sub ondataavailable (ByVal value As Any) + [DispId(-2147412071)] + set; + } + + /// ondatasetchanged property of IHTMLElement interface. + /// An original IDL definition of ondatasetchanged property was the following: VARIANT ondatasetchanged; + // IDL: VARIANT ondatasetchanged; + // VB6: ondatasetchanged As Any + object ondatasetchanged + { + // IDL: HRESULT ondatasetchanged ([out, retval] VARIANT* ReturnValue); + // VB6: Function ondatasetchanged As Any + [DispId(-2147412072)] + get; + // IDL: HRESULT ondatasetchanged (VARIANT value); + // VB6: Sub ondatasetchanged (ByVal value As Any) + [DispId(-2147412072)] + set; + } + + /// ondatasetcomplete property of IHTMLElement interface. + /// An original IDL definition of ondatasetcomplete property was the following: VARIANT ondatasetcomplete; + // IDL: VARIANT ondatasetcomplete; + // VB6: ondatasetcomplete As Any + object ondatasetcomplete + { + // IDL: HRESULT ondatasetcomplete ([out, retval] VARIANT* ReturnValue); + // VB6: Function ondatasetcomplete As Any + [DispId(-2147412070)] + get; + // IDL: HRESULT ondatasetcomplete (VARIANT value); + // VB6: Sub ondatasetcomplete (ByVal value As Any) + [DispId(-2147412070)] + set; + } + + /// ondblclick property of IHTMLElement interface. + /// An original IDL definition of ondblclick property was the following: VARIANT ondblclick; + // IDL: VARIANT ondblclick; + // VB6: ondblclick As Any + object ondblclick + { + // IDL: HRESULT ondblclick ([out, retval] VARIANT* ReturnValue); + // VB6: Function ondblclick As Any + [DispId(-2147412103)] + get; + // IDL: HRESULT ondblclick (VARIANT value); + // VB6: Sub ondblclick (ByVal value As Any) + [DispId(-2147412103)] + set; + } + + /// ondragstart property of IHTMLElement interface. + /// An original IDL definition of ondragstart property was the following: VARIANT ondragstart; + // IDL: VARIANT ondragstart; + // VB6: ondragstart As Any + object ondragstart + { + // IDL: HRESULT ondragstart ([out, retval] VARIANT* ReturnValue); + // VB6: Function ondragstart As Any + [DispId(-2147412077)] + get; + // IDL: HRESULT ondragstart (VARIANT value); + // VB6: Sub ondragstart (ByVal value As Any) + [DispId(-2147412077)] + set; + } + + /// onerrorupdate property of IHTMLElement interface. + /// An original IDL definition of onerrorupdate property was the following: VARIANT onerrorupdate; + // IDL: VARIANT onerrorupdate; + // VB6: onerrorupdate As Any + object onerrorupdate + { + // IDL: HRESULT onerrorupdate ([out, retval] VARIANT* ReturnValue); + // VB6: Function onerrorupdate As Any + [DispId(-2147412074)] + get; + // IDL: HRESULT onerrorupdate (VARIANT value); + // VB6: Sub onerrorupdate (ByVal value As Any) + [DispId(-2147412074)] + set; + } + + /// onfilterchange property of IHTMLElement interface. + /// An original IDL definition of onfilterchange property was the following: VARIANT onfilterchange; + // IDL: VARIANT onfilterchange; + // VB6: onfilterchange As Any + object onfilterchange + { + // IDL: HRESULT onfilterchange ([out, retval] VARIANT* ReturnValue); + // VB6: Function onfilterchange As Any + [DispId(-2147412069)] + get; + // IDL: HRESULT onfilterchange (VARIANT value); + // VB6: Sub onfilterchange (ByVal value As Any) + [DispId(-2147412069)] + set; + } + + /// onhelp property of IHTMLElement interface. + /// An original IDL definition of onhelp property was the following: VARIANT onhelp; + // IDL: VARIANT onhelp; + // VB6: onhelp As Any + object onhelp + { + // IDL: HRESULT onhelp ([out, retval] VARIANT* ReturnValue); + // VB6: Function onhelp As Any + [DispId(-2147412099)] + get; + // IDL: HRESULT onhelp (VARIANT value); + // VB6: Sub onhelp (ByVal value As Any) + [DispId(-2147412099)] + set; + } + + /// onkeydown property of IHTMLElement interface. + /// An original IDL definition of onkeydown property was the following: VARIANT onkeydown; + // IDL: VARIANT onkeydown; + // VB6: onkeydown As Any + object onkeydown + { + // IDL: HRESULT onkeydown ([out, retval] VARIANT* ReturnValue); + // VB6: Function onkeydown As Any + [DispId(-2147412107)] + get; + // IDL: HRESULT onkeydown (VARIANT value); + // VB6: Sub onkeydown (ByVal value As Any) + [DispId(-2147412107)] + set; + } + + /// onkeypress property of IHTMLElement interface. + /// An original IDL definition of onkeypress property was the following: VARIANT onkeypress; + // IDL: VARIANT onkeypress; + // VB6: onkeypress As Any + object onkeypress + { + // IDL: HRESULT onkeypress ([out, retval] VARIANT* ReturnValue); + // VB6: Function onkeypress As Any + [DispId(-2147412105)] + get; + // IDL: HRESULT onkeypress (VARIANT value); + // VB6: Sub onkeypress (ByVal value As Any) + [DispId(-2147412105)] + set; + } + + /// onkeyup property of IHTMLElement interface. + /// An original IDL definition of onkeyup property was the following: VARIANT onkeyup; + // IDL: VARIANT onkeyup; + // VB6: onkeyup As Any + object onkeyup + { + // IDL: HRESULT onkeyup ([out, retval] VARIANT* ReturnValue); + // VB6: Function onkeyup As Any + [DispId(-2147412106)] + get; + // IDL: HRESULT onkeyup (VARIANT value); + // VB6: Sub onkeyup (ByVal value As Any) + [DispId(-2147412106)] + set; + } + + /// onmousedown property of IHTMLElement interface. + /// An original IDL definition of onmousedown property was the following: VARIANT onmousedown; + // IDL: VARIANT onmousedown; + // VB6: onmousedown As Any + object onmousedown + { + // IDL: HRESULT onmousedown ([out, retval] VARIANT* ReturnValue); + // VB6: Function onmousedown As Any + [DispId(-2147412110)] + get; + // IDL: HRESULT onmousedown (VARIANT value); + // VB6: Sub onmousedown (ByVal value As Any) + [DispId(-2147412110)] + set; + } + + /// onmousemove property of IHTMLElement interface. + /// An original IDL definition of onmousemove property was the following: VARIANT onmousemove; + // IDL: VARIANT onmousemove; + // VB6: onmousemove As Any + object onmousemove + { + // IDL: HRESULT onmousemove ([out, retval] VARIANT* ReturnValue); + // VB6: Function onmousemove As Any + [DispId(-2147412108)] + get; + // IDL: HRESULT onmousemove (VARIANT value); + // VB6: Sub onmousemove (ByVal value As Any) + [DispId(-2147412108)] + set; + } + + /// onmouseout property of IHTMLElement interface. + /// An original IDL definition of onmouseout property was the following: VARIANT onmouseout; + // IDL: VARIANT onmouseout; + // VB6: onmouseout As Any + object onmouseout + { + // IDL: HRESULT onmouseout ([out, retval] VARIANT* ReturnValue); + // VB6: Function onmouseout As Any + [DispId(-2147412111)] + get; + // IDL: HRESULT onmouseout (VARIANT value); + // VB6: Sub onmouseout (ByVal value As Any) + [DispId(-2147412111)] + set; + } + + /// onmouseover property of IHTMLElement interface. + /// An original IDL definition of onmouseover property was the following: VARIANT onmouseover; + // IDL: VARIANT onmouseover; + // VB6: onmouseover As Any + object onmouseover + { + // IDL: HRESULT onmouseover ([out, retval] VARIANT* ReturnValue); + // VB6: Function onmouseover As Any + [DispId(-2147412112)] + get; + // IDL: HRESULT onmouseover (VARIANT value); + // VB6: Sub onmouseover (ByVal value As Any) + [DispId(-2147412112)] + set; + } + + /// onmouseup property of IHTMLElement interface. + /// An original IDL definition of onmouseup property was the following: VARIANT onmouseup; + // IDL: VARIANT onmouseup; + // VB6: onmouseup As Any + object onmouseup + { + // IDL: HRESULT onmouseup ([out, retval] VARIANT* ReturnValue); + // VB6: Function onmouseup As Any + [DispId(-2147412109)] + get; + // IDL: HRESULT onmouseup (VARIANT value); + // VB6: Sub onmouseup (ByVal value As Any) + [DispId(-2147412109)] + set; + } + + /// onrowenter property of IHTMLElement interface. + /// An original IDL definition of onrowenter property was the following: VARIANT onrowenter; + // IDL: VARIANT onrowenter; + // VB6: onrowenter As Any + object onrowenter + { + // IDL: HRESULT onrowenter ([out, retval] VARIANT* ReturnValue); + // VB6: Function onrowenter As Any + [DispId(-2147412093)] + get; + // IDL: HRESULT onrowenter (VARIANT value); + // VB6: Sub onrowenter (ByVal value As Any) + [DispId(-2147412093)] + set; + } + + /// onrowexit property of IHTMLElement interface. + /// An original IDL definition of onrowexit property was the following: VARIANT onrowexit; + // IDL: VARIANT onrowexit; + // VB6: onrowexit As Any + object onrowexit + { + // IDL: HRESULT onrowexit ([out, retval] VARIANT* ReturnValue); + // VB6: Function onrowexit As Any + [DispId(-2147412094)] + get; + // IDL: HRESULT onrowexit (VARIANT value); + // VB6: Sub onrowexit (ByVal value As Any) + [DispId(-2147412094)] + set; + } + + /// onselectstart property of IHTMLElement interface. + /// An original IDL definition of onselectstart property was the following: VARIANT onselectstart; + // IDL: VARIANT onselectstart; + // VB6: onselectstart As Any + object onselectstart + { + // IDL: HRESULT onselectstart ([out, retval] VARIANT* ReturnValue); + // VB6: Function onselectstart As Any + [DispId(-2147412075)] + get; + // IDL: HRESULT onselectstart (VARIANT value); + // VB6: Sub onselectstart (ByVal value As Any) + [DispId(-2147412075)] + set; + } + + /// outerHTML property of IHTMLElement interface. + /// An original IDL definition of outerHTML property was the following: BSTR outerHTML; + // IDL: BSTR outerHTML; + // VB6: outerHTML As String + string outerHTML + { + // IDL: HRESULT outerHTML ([out, retval] BSTR* ReturnValue); + // VB6: Function outerHTML As String + [DispId(-2147417084)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT outerHTML (BSTR value); + // VB6: Sub outerHTML (ByVal value As String) + [DispId(-2147417084)] + set; + } + + /// outerText property of IHTMLElement interface. + /// An original IDL definition of outerText property was the following: BSTR outerText; + // IDL: BSTR outerText; + // VB6: outerText As String + string outerText + { + // IDL: HRESULT outerText ([out, retval] BSTR* ReturnValue); + // VB6: Function outerText As String + [DispId(-2147417083)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT outerText (BSTR value); + // VB6: Sub outerText (ByVal value As String) + [DispId(-2147417083)] + set; + } + + /// parentElement property of IHTMLElement interface. + /// An original IDL definition of parentElement property was the following: IHTMLElement* parentElement; + // IDL: IHTMLElement* parentElement; + // VB6: parentElement As IHTMLElement + IHTMLElement parentElement + { + // IDL: HRESULT parentElement ([out, retval] IHTMLElement** ReturnValue); + // VB6: Function parentElement As IHTMLElement + [DispId(-2147418104)] + get; + } + + /// parentTextEdit property of IHTMLElement interface. + /// An original IDL definition of parentTextEdit property was the following: IHTMLElement* parentTextEdit; + // IDL: IHTMLElement* parentTextEdit; + // VB6: parentTextEdit As IHTMLElement + IHTMLElement parentTextEdit + { + // IDL: HRESULT parentTextEdit ([out, retval] IHTMLElement** ReturnValue); + // VB6: Function parentTextEdit As IHTMLElement + [DispId(-2147417080)] + get; + } + + /// recordNumber property of IHTMLElement interface. + /// An original IDL definition of recordNumber property was the following: VARIANT recordNumber; + // IDL: VARIANT recordNumber; + // VB6: recordNumber As Any + object recordNumber + { + // IDL: HRESULT recordNumber ([out, retval] VARIANT* ReturnValue); + // VB6: Function recordNumber As Any + [DispId(-2147417087)] + get; + } + + /// sourceIndex property of IHTMLElement interface. + /// An original IDL definition of sourceIndex property was the following: long sourceIndex; + // IDL: long sourceIndex; + // VB6: sourceIndex As Long + int sourceIndex + { + // IDL: HRESULT sourceIndex ([out, retval] long* ReturnValue); + // VB6: Function sourceIndex As Long + [DispId(-2147417088)] + get; + } + + /// style property of IHTMLElement interface. + /// An original IDL definition of style property was the following: IHTMLStyle* style; + // IDL: IHTMLStyle* style; + // VB6: style As IHTMLStyle + IHTMLStyle style + { + // IDL: HRESULT style ([out, retval] IHTMLStyle** ReturnValue); + // VB6: Function style As IHTMLStyle + [DispId(-2147418038)] + get; + } + + /// tagName property of IHTMLElement interface. + /// An original IDL definition of tagName property was the following: BSTR tagName; + // IDL: BSTR tagName; + // VB6: tagName As String + string tagName + { + // IDL: HRESULT tagName ([out, retval] BSTR* ReturnValue); + // VB6: Function tagName As String + [DispId(-2147417108)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// title property of IHTMLElement interface. + /// An original IDL definition of title property was the following: BSTR title; + // IDL: BSTR title; + // VB6: title As String + string title + { + // IDL: HRESULT title ([out, retval] BSTR* ReturnValue); + // VB6: Function title As String + [DispId(-2147418043)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT title (BSTR value); + // VB6: Sub title (ByVal value As String) + [DispId(-2147418043)] + set; + } + } +} diff --git a/Speak/Speak/Interfaces/IHTMLEventObj.cs b/Speak/Speak/Interfaces/IHTMLEventObj.cs new file mode 100644 index 0000000..9b0ad2f --- /dev/null +++ b/Speak/Speak/Interfaces/IHTMLEventObj.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Speak.Interfaces +{ + [ComVisible(true), ComImport()] + [TypeLibType((short)4160)] //TypeLibTypeFlags.FDispatchable + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] + [Guid("3050f32d-98b5-11cf-bb82-00aa00bdce0b")] + public interface IHTMLEventObj + { + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_SRCELEMENT)] + IHTMLElement SrcElement { [return: MarshalAs(UnmanagedType.Interface)] get; } + + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_ALTKEY)] + bool AltKey { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_CTRLKEY)] + bool CtrlKey { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_SHIFTKEY)] + bool ShiftKey { get; } + //VARIANT + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_RETURNVALUE)] + Object ReturnValue { set; get; } + + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_CANCELBUBBLE)] + bool CancelBubble { set; [return: MarshalAs(UnmanagedType.VariantBool)] get; } + + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_FROMELEMENT)] + IHTMLElement FromElement { [return: MarshalAs(UnmanagedType.Interface)] get; } + + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_TOELEMENT)] + IHTMLElement ToElement { [return: MarshalAs(UnmanagedType.Interface)] get; } + + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_KEYCODE)] + int keyCode { set; get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_BUTTON)] + int Button { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_TYPE)] + string EventType { [return: MarshalAs(UnmanagedType.BStr)] get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_QUALIFIER)] + string Qualifier { [return: MarshalAs(UnmanagedType.BStr)] get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_REASON)] + int Reason { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_X)] + int X { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_Y)] + int Y { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_CLIENTX)] + int ClientX { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_CLIENTY)] + int ClientY { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_OFFSETX)] + int OffsetX { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_OFFSETY)] + int OffsetY { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_SCREENX)] + int ScreenX { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_SCREENY)] + int ScreenY { get; } + [DispId(HTMLDispIDs.DISPID_IHTMLEVENTOBJ_SRCFILTER)] + object SrcFilter { [return: MarshalAs(UnmanagedType.IDispatch)] get; } + } +} diff --git a/Speak/Speak/Interfaces/IHTMLStyle.cs b/Speak/Speak/Interfaces/IHTMLStyle.cs new file mode 100644 index 0000000..69c6e79 --- /dev/null +++ b/Speak/Speak/Interfaces/IHTMLStyle.cs @@ -0,0 +1,1497 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Speak.Interfaces +{ + [Guid("3050F25E-98B5-11CF-BB82-00AA00BDCE0B")] + [ComImport] + [TypeLibType((short)4160)] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] + public interface IHTMLStyle + { + /// setAttribute method of IHTMLStyle interface. + /// An original IDL definition of setAttribute method was the following: HRESULT setAttribute (BSTR strAttributeName, VARIANT AttributeValue, [optional, defaultvalue(1)] long lFlags); + // IDL: HRESULT setAttribute (BSTR strAttributeName, VARIANT AttributeValue, [optional, defaultvalue(1)] long lFlags); + // VB6: Sub setAttribute (ByVal strAttributeName As String, ByVal AttributeValue As Any, [ByVal lFlags As Long = 1]) + [DispId(-2147417611)] + void setAttribute([MarshalAs(UnmanagedType.BStr)] string strAttributeName, object AttributeValue, int lFlags); + + /// getAttribute method of IHTMLStyle interface. + /// An original IDL definition of getAttribute method was the following: HRESULT getAttribute (BSTR strAttributeName, [optional, defaultvalue(0)] long lFlags, [out, retval] VARIANT* ReturnValue); + // IDL: HRESULT getAttribute (BSTR strAttributeName, [optional, defaultvalue(0)] long lFlags, [out, retval] VARIANT* ReturnValue); + // VB6: Function getAttribute (ByVal strAttributeName As String, [ByVal lFlags As Long = 0]) As Any + [DispId(-2147417610)] + object getAttribute([MarshalAs(UnmanagedType.BStr)] string strAttributeName, int lFlags); + + /// removeAttribute method of IHTMLStyle interface. + /// An original IDL definition of removeAttribute method was the following: HRESULT removeAttribute (BSTR strAttributeName, [optional, defaultvalue(1)] long lFlags, [out, retval] VARIANT_BOOL* ReturnValue); + // IDL: HRESULT removeAttribute (BSTR strAttributeName, [optional, defaultvalue(1)] long lFlags, [out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function removeAttribute (ByVal strAttributeName As String, [ByVal lFlags As Long = 1]) As Boolean + [DispId(-2147417609)] + [return: MarshalAs(UnmanagedType.VariantBool)] + bool removeAttribute([MarshalAs(UnmanagedType.BStr)] string strAttributeName, int lFlags); + + /// toString method of IHTMLStyle interface. + /// An original IDL definition of toString method was the following: HRESULT toString ([out, retval] BSTR* ReturnValue); + // IDL: HRESULT toString ([out, retval] BSTR* ReturnValue); + // VB6: Function toString As String + [DispId(-2147414104)] + [return: MarshalAs(UnmanagedType.BStr)] + string toString(); + + /// background property of IHTMLStyle interface. + /// An original IDL definition of background property was the following: BSTR background; + // IDL: BSTR background; + // VB6: background As String + string background + { + // IDL: HRESULT background ([out, retval] BSTR* ReturnValue); + // VB6: Function background As String + [DispId(-2147413080)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT background (BSTR value); + // VB6: Sub background (ByVal value As String) + [DispId(-2147413080)] + set; + } + + /// backgroundAttachment property of IHTMLStyle interface. + /// An original IDL definition of backgroundAttachment property was the following: BSTR backgroundAttachment; + // IDL: BSTR backgroundAttachment; + // VB6: backgroundAttachment As String + string backgroundAttachment + { + // IDL: HRESULT backgroundAttachment ([out, retval] BSTR* ReturnValue); + // VB6: Function backgroundAttachment As String + [DispId(-2147413067)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT backgroundAttachment (BSTR value); + // VB6: Sub backgroundAttachment (ByVal value As String) + [DispId(-2147413067)] + set; + } + + /// backgroundColor property of IHTMLStyle interface. + /// An original IDL definition of backgroundColor property was the following: VARIANT backgroundColor; + // IDL: VARIANT backgroundColor; + // VB6: backgroundColor As Any + object backgroundColor + { + // IDL: HRESULT backgroundColor ([out, retval] VARIANT* ReturnValue); + // VB6: Function backgroundColor As Any + [DispId(-501)] + get; + // IDL: HRESULT backgroundColor (VARIANT value); + // VB6: Sub backgroundColor (ByVal value As Any) + [DispId(-501)] + set; + } + + /// backgroundImage property of IHTMLStyle interface. + /// An original IDL definition of backgroundImage property was the following: BSTR backgroundImage; + // IDL: BSTR backgroundImage; + // VB6: backgroundImage As String + string backgroundImage + { + // IDL: HRESULT backgroundImage ([out, retval] BSTR* ReturnValue); + // VB6: Function backgroundImage As String + [DispId(-2147413111)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT backgroundImage (BSTR value); + // VB6: Sub backgroundImage (ByVal value As String) + [DispId(-2147413111)] + set; + } + + /// backgroundPosition property of IHTMLStyle interface. + /// An original IDL definition of backgroundPosition property was the following: BSTR backgroundPosition; + // IDL: BSTR backgroundPosition; + // VB6: backgroundPosition As String + string backgroundPosition + { + // IDL: HRESULT backgroundPosition ([out, retval] BSTR* ReturnValue); + // VB6: Function backgroundPosition As String + [DispId(-2147413066)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT backgroundPosition (BSTR value); + // VB6: Sub backgroundPosition (ByVal value As String) + [DispId(-2147413066)] + set; + } + + /// backgroundPositionX property of IHTMLStyle interface. + /// An original IDL definition of backgroundPositionX property was the following: VARIANT backgroundPositionX; + // IDL: VARIANT backgroundPositionX; + // VB6: backgroundPositionX As Any + object backgroundPositionX + { + // IDL: HRESULT backgroundPositionX ([out, retval] VARIANT* ReturnValue); + // VB6: Function backgroundPositionX As Any + [DispId(-2147413079)] + get; + // IDL: HRESULT backgroundPositionX (VARIANT value); + // VB6: Sub backgroundPositionX (ByVal value As Any) + [DispId(-2147413079)] + set; + } + + /// backgroundPositionY property of IHTMLStyle interface. + /// An original IDL definition of backgroundPositionY property was the following: VARIANT backgroundPositionY; + // IDL: VARIANT backgroundPositionY; + // VB6: backgroundPositionY As Any + object backgroundPositionY + { + // IDL: HRESULT backgroundPositionY ([out, retval] VARIANT* ReturnValue); + // VB6: Function backgroundPositionY As Any + [DispId(-2147413078)] + get; + // IDL: HRESULT backgroundPositionY (VARIANT value); + // VB6: Sub backgroundPositionY (ByVal value As Any) + [DispId(-2147413078)] + set; + } + + /// backgroundRepeat property of IHTMLStyle interface. + /// An original IDL definition of backgroundRepeat property was the following: BSTR backgroundRepeat; + // IDL: BSTR backgroundRepeat; + // VB6: backgroundRepeat As String + string backgroundRepeat + { + // IDL: HRESULT backgroundRepeat ([out, retval] BSTR* ReturnValue); + // VB6: Function backgroundRepeat As String + [DispId(-2147413068)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT backgroundRepeat (BSTR value); + // VB6: Sub backgroundRepeat (ByVal value As String) + [DispId(-2147413068)] + set; + } + + /// border property of IHTMLStyle interface. + /// An original IDL definition of border property was the following: BSTR border; + // IDL: BSTR border; + // VB6: border As String + string border + { + // IDL: HRESULT border ([out, retval] BSTR* ReturnValue); + // VB6: Function border As String + [DispId(-2147413063)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT border (BSTR value); + // VB6: Sub border (ByVal value As String) + [DispId(-2147413063)] + set; + } + + /// borderBottom property of IHTMLStyle interface. + /// An original IDL definition of borderBottom property was the following: BSTR borderBottom; + // IDL: BSTR borderBottom; + // VB6: borderBottom As String + string borderBottom + { + // IDL: HRESULT borderBottom ([out, retval] BSTR* ReturnValue); + // VB6: Function borderBottom As String + [DispId(-2147413060)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderBottom (BSTR value); + // VB6: Sub borderBottom (ByVal value As String) + [DispId(-2147413060)] + set; + } + + /// borderBottomColor property of IHTMLStyle interface. + /// An original IDL definition of borderBottomColor property was the following: VARIANT borderBottomColor; + // IDL: VARIANT borderBottomColor; + // VB6: borderBottomColor As Any + object borderBottomColor + { + // IDL: HRESULT borderBottomColor ([out, retval] VARIANT* ReturnValue); + // VB6: Function borderBottomColor As Any + [DispId(-2147413055)] + get; + // IDL: HRESULT borderBottomColor (VARIANT value); + // VB6: Sub borderBottomColor (ByVal value As Any) + [DispId(-2147413055)] + set; + } + + /// borderBottomStyle property of IHTMLStyle interface. + /// An original IDL definition of borderBottomStyle property was the following: BSTR borderBottomStyle; + // IDL: BSTR borderBottomStyle; + // VB6: borderBottomStyle As String + string borderBottomStyle + { + // IDL: HRESULT borderBottomStyle ([out, retval] BSTR* ReturnValue); + // VB6: Function borderBottomStyle As String + [DispId(-2147413045)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderBottomStyle (BSTR value); + // VB6: Sub borderBottomStyle (ByVal value As String) + [DispId(-2147413045)] + set; + } + + /// borderBottomWidth property of IHTMLStyle interface. + /// An original IDL definition of borderBottomWidth property was the following: VARIANT borderBottomWidth; + // IDL: VARIANT borderBottomWidth; + // VB6: borderBottomWidth As Any + object borderBottomWidth + { + // IDL: HRESULT borderBottomWidth ([out, retval] VARIANT* ReturnValue); + // VB6: Function borderBottomWidth As Any + [DispId(-2147413050)] + get; + // IDL: HRESULT borderBottomWidth (VARIANT value); + // VB6: Sub borderBottomWidth (ByVal value As Any) + [DispId(-2147413050)] + set; + } + + /// borderColor property of IHTMLStyle interface. + /// An original IDL definition of borderColor property was the following: BSTR borderColor; + // IDL: BSTR borderColor; + // VB6: borderColor As String + string borderColor + { + // IDL: HRESULT borderColor ([out, retval] BSTR* ReturnValue); + // VB6: Function borderColor As String + [DispId(-2147413058)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderColor (BSTR value); + // VB6: Sub borderColor (ByVal value As String) + [DispId(-2147413058)] + set; + } + + /// borderLeft property of IHTMLStyle interface. + /// An original IDL definition of borderLeft property was the following: BSTR borderLeft; + // IDL: BSTR borderLeft; + // VB6: borderLeft As String + string borderLeft + { + // IDL: HRESULT borderLeft ([out, retval] BSTR* ReturnValue); + // VB6: Function borderLeft As String + [DispId(-2147413059)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderLeft (BSTR value); + // VB6: Sub borderLeft (ByVal value As String) + [DispId(-2147413059)] + set; + } + + /// borderLeftColor property of IHTMLStyle interface. + /// An original IDL definition of borderLeftColor property was the following: VARIANT borderLeftColor; + // IDL: VARIANT borderLeftColor; + // VB6: borderLeftColor As Any + object borderLeftColor + { + // IDL: HRESULT borderLeftColor ([out, retval] VARIANT* ReturnValue); + // VB6: Function borderLeftColor As Any + [DispId(-2147413054)] + get; + // IDL: HRESULT borderLeftColor (VARIANT value); + // VB6: Sub borderLeftColor (ByVal value As Any) + [DispId(-2147413054)] + set; + } + + /// borderLeftStyle property of IHTMLStyle interface. + /// An original IDL definition of borderLeftStyle property was the following: BSTR borderLeftStyle; + // IDL: BSTR borderLeftStyle; + // VB6: borderLeftStyle As String + string borderLeftStyle + { + // IDL: HRESULT borderLeftStyle ([out, retval] BSTR* ReturnValue); + // VB6: Function borderLeftStyle As String + [DispId(-2147413044)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderLeftStyle (BSTR value); + // VB6: Sub borderLeftStyle (ByVal value As String) + [DispId(-2147413044)] + set; + } + + /// borderLeftWidth property of IHTMLStyle interface. + /// An original IDL definition of borderLeftWidth property was the following: VARIANT borderLeftWidth; + // IDL: VARIANT borderLeftWidth; + // VB6: borderLeftWidth As Any + object borderLeftWidth + { + // IDL: HRESULT borderLeftWidth ([out, retval] VARIANT* ReturnValue); + // VB6: Function borderLeftWidth As Any + [DispId(-2147413049)] + get; + // IDL: HRESULT borderLeftWidth (VARIANT value); + // VB6: Sub borderLeftWidth (ByVal value As Any) + [DispId(-2147413049)] + set; + } + + /// borderRight property of IHTMLStyle interface. + /// An original IDL definition of borderRight property was the following: BSTR borderRight; + // IDL: BSTR borderRight; + // VB6: borderRight As String + string borderRight + { + // IDL: HRESULT borderRight ([out, retval] BSTR* ReturnValue); + // VB6: Function borderRight As String + [DispId(-2147413061)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderRight (BSTR value); + // VB6: Sub borderRight (ByVal value As String) + [DispId(-2147413061)] + set; + } + + /// borderRightColor property of IHTMLStyle interface. + /// An original IDL definition of borderRightColor property was the following: VARIANT borderRightColor; + // IDL: VARIANT borderRightColor; + // VB6: borderRightColor As Any + object borderRightColor + { + // IDL: HRESULT borderRightColor ([out, retval] VARIANT* ReturnValue); + // VB6: Function borderRightColor As Any + [DispId(-2147413056)] + get; + // IDL: HRESULT borderRightColor (VARIANT value); + // VB6: Sub borderRightColor (ByVal value As Any) + [DispId(-2147413056)] + set; + } + + /// borderRightStyle property of IHTMLStyle interface. + /// An original IDL definition of borderRightStyle property was the following: BSTR borderRightStyle; + // IDL: BSTR borderRightStyle; + // VB6: borderRightStyle As String + string borderRightStyle + { + // IDL: HRESULT borderRightStyle ([out, retval] BSTR* ReturnValue); + // VB6: Function borderRightStyle As String + [DispId(-2147413046)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderRightStyle (BSTR value); + // VB6: Sub borderRightStyle (ByVal value As String) + [DispId(-2147413046)] + set; + } + + /// borderRightWidth property of IHTMLStyle interface. + /// An original IDL definition of borderRightWidth property was the following: VARIANT borderRightWidth; + // IDL: VARIANT borderRightWidth; + // VB6: borderRightWidth As Any + object borderRightWidth + { + // IDL: HRESULT borderRightWidth ([out, retval] VARIANT* ReturnValue); + // VB6: Function borderRightWidth As Any + [DispId(-2147413051)] + get; + // IDL: HRESULT borderRightWidth (VARIANT value); + // VB6: Sub borderRightWidth (ByVal value As Any) + [DispId(-2147413051)] + set; + } + + /// borderStyle property of IHTMLStyle interface. + /// An original IDL definition of borderStyle property was the following: BSTR borderStyle; + // IDL: BSTR borderStyle; + // VB6: borderStyle As String + string borderStyle + { + // IDL: HRESULT borderStyle ([out, retval] BSTR* ReturnValue); + // VB6: Function borderStyle As String + [DispId(-2147413048)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderStyle (BSTR value); + // VB6: Sub borderStyle (ByVal value As String) + [DispId(-2147413048)] + set; + } + + /// borderTop property of IHTMLStyle interface. + /// An original IDL definition of borderTop property was the following: BSTR borderTop; + // IDL: BSTR borderTop; + // VB6: borderTop As String + string borderTop + { + // IDL: HRESULT borderTop ([out, retval] BSTR* ReturnValue); + // VB6: Function borderTop As String + [DispId(-2147413062)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderTop (BSTR value); + // VB6: Sub borderTop (ByVal value As String) + [DispId(-2147413062)] + set; + } + + /// borderTopColor property of IHTMLStyle interface. + /// An original IDL definition of borderTopColor property was the following: VARIANT borderTopColor; + // IDL: VARIANT borderTopColor; + // VB6: borderTopColor As Any + object borderTopColor + { + // IDL: HRESULT borderTopColor ([out, retval] VARIANT* ReturnValue); + // VB6: Function borderTopColor As Any + [DispId(-2147413057)] + get; + // IDL: HRESULT borderTopColor (VARIANT value); + // VB6: Sub borderTopColor (ByVal value As Any) + [DispId(-2147413057)] + set; + } + + /// borderTopStyle property of IHTMLStyle interface. + /// An original IDL definition of borderTopStyle property was the following: BSTR borderTopStyle; + // IDL: BSTR borderTopStyle; + // VB6: borderTopStyle As String + string borderTopStyle + { + // IDL: HRESULT borderTopStyle ([out, retval] BSTR* ReturnValue); + // VB6: Function borderTopStyle As String + [DispId(-2147413047)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderTopStyle (BSTR value); + // VB6: Sub borderTopStyle (ByVal value As String) + [DispId(-2147413047)] + set; + } + + /// borderTopWidth property of IHTMLStyle interface. + /// An original IDL definition of borderTopWidth property was the following: VARIANT borderTopWidth; + // IDL: VARIANT borderTopWidth; + // VB6: borderTopWidth As Any + object borderTopWidth + { + // IDL: HRESULT borderTopWidth ([out, retval] VARIANT* ReturnValue); + // VB6: Function borderTopWidth As Any + [DispId(-2147413052)] + get; + // IDL: HRESULT borderTopWidth (VARIANT value); + // VB6: Sub borderTopWidth (ByVal value As Any) + [DispId(-2147413052)] + set; + } + + /// borderWidth property of IHTMLStyle interface. + /// An original IDL definition of borderWidth property was the following: BSTR borderWidth; + // IDL: BSTR borderWidth; + // VB6: borderWidth As String + string borderWidth + { + // IDL: HRESULT borderWidth ([out, retval] BSTR* ReturnValue); + // VB6: Function borderWidth As String + [DispId(-2147413053)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT borderWidth (BSTR value); + // VB6: Sub borderWidth (ByVal value As String) + [DispId(-2147413053)] + set; + } + + /// clear property of IHTMLStyle interface. + /// An original IDL definition of clear property was the following: BSTR clear; + // IDL: BSTR clear; + // VB6: clear As String + string clear + { + // IDL: HRESULT clear ([out, retval] BSTR* ReturnValue); + // VB6: Function clear As String + [DispId(-2147413096)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT clear (BSTR value); + // VB6: Sub clear (ByVal value As String) + [DispId(-2147413096)] + set; + } + + /// clip property of IHTMLStyle interface. + /// An original IDL definition of clip property was the following: BSTR clip; + // IDL: BSTR clip; + // VB6: clip As String + string clip + { + // IDL: HRESULT clip ([out, retval] BSTR* ReturnValue); + // VB6: Function clip As String + [DispId(-2147413020)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT clip (BSTR value); + // VB6: Sub clip (ByVal value As String) + [DispId(-2147413020)] + set; + } + + /// color property of IHTMLStyle interface. + /// An original IDL definition of color property was the following: VARIANT color; + // IDL: VARIANT color; + // VB6: color As Any + object color + { + // IDL: HRESULT color ([out, retval] VARIANT* ReturnValue); + // VB6: Function color As Any + [DispId(-2147413110)] + get; + // IDL: HRESULT color (VARIANT value); + // VB6: Sub color (ByVal value As Any) + [DispId(-2147413110)] + set; + } + + /// cssText property of IHTMLStyle interface. + /// An original IDL definition of cssText property was the following: BSTR cssText; + // IDL: BSTR cssText; + // VB6: cssText As String + string cssText + { + // IDL: HRESULT cssText ([out, retval] BSTR* ReturnValue); + // VB6: Function cssText As String + [DispId(-2147413013)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT cssText (BSTR value); + // VB6: Sub cssText (ByVal value As String) + [DispId(-2147413013)] + set; + } + + /// cursor property of IHTMLStyle interface. + /// An original IDL definition of cursor property was the following: BSTR cursor; + // IDL: BSTR cursor; + // VB6: cursor As String + string cursor + { + // IDL: HRESULT cursor ([out, retval] BSTR* ReturnValue); + // VB6: Function cursor As String + [DispId(-2147413010)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT cursor (BSTR value); + // VB6: Sub cursor (ByVal value As String) + [DispId(-2147413010)] + set; + } + + /// display property of IHTMLStyle interface. + /// An original IDL definition of display property was the following: BSTR display; + // IDL: BSTR display; + // VB6: display As String + string display + { + // IDL: HRESULT display ([out, retval] BSTR* ReturnValue); + // VB6: Function display As String + [DispId(-2147413041)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT display (BSTR value); + // VB6: Sub display (ByVal value As String) + [DispId(-2147413041)] + set; + } + + /// filter property of IHTMLStyle interface. + /// An original IDL definition of filter property was the following: BSTR filter; + // IDL: BSTR filter; + // VB6: filter As String + string filter + { + // IDL: HRESULT filter ([out, retval] BSTR* ReturnValue); + // VB6: Function filter As String + [DispId(-2147413030)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT filter (BSTR value); + // VB6: Sub filter (ByVal value As String) + [DispId(-2147413030)] + set; + } + + /// font property of IHTMLStyle interface. + /// An original IDL definition of font property was the following: BSTR font; + // IDL: BSTR font; + // VB6: font As String + string font + { + // IDL: HRESULT font ([out, retval] BSTR* ReturnValue); + // VB6: Function font As String + [DispId(-2147413071)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT font (BSTR value); + // VB6: Sub font (ByVal value As String) + [DispId(-2147413071)] + set; + } + + /// fontFamily property of IHTMLStyle interface. + /// An original IDL definition of fontFamily property was the following: BSTR fontFamily; + // IDL: BSTR fontFamily; + // VB6: fontFamily As String + string fontFamily + { + // IDL: HRESULT fontFamily ([out, retval] BSTR* ReturnValue); + // VB6: Function fontFamily As String + [DispId(-2147413094)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT fontFamily (BSTR value); + // VB6: Sub fontFamily (ByVal value As String) + [DispId(-2147413094)] + set; + } + + /// fontSize property of IHTMLStyle interface. + /// An original IDL definition of fontSize property was the following: VARIANT fontSize; + // IDL: VARIANT fontSize; + // VB6: fontSize As Any + object fontSize + { + // IDL: HRESULT fontSize ([out, retval] VARIANT* ReturnValue); + // VB6: Function fontSize As Any + [DispId(-2147413093)] + get; + // IDL: HRESULT fontSize (VARIANT value); + // VB6: Sub fontSize (ByVal value As Any) + [DispId(-2147413093)] + set; + } + + /// fontStyle property of IHTMLStyle interface. + /// An original IDL definition of fontStyle property was the following: BSTR fontStyle; + // IDL: BSTR fontStyle; + // VB6: fontStyle As String + string fontStyle + { + // IDL: HRESULT fontStyle ([out, retval] BSTR* ReturnValue); + // VB6: Function fontStyle As String + [DispId(-2147413088)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT fontStyle (BSTR value); + // VB6: Sub fontStyle (ByVal value As String) + [DispId(-2147413088)] + set; + } + + /// fontVariant property of IHTMLStyle interface. + /// An original IDL definition of fontVariant property was the following: BSTR fontVariant; + // IDL: BSTR fontVariant; + // VB6: fontVariant As String + string fontVariant + { + // IDL: HRESULT fontVariant ([out, retval] BSTR* ReturnValue); + // VB6: Function fontVariant As String + [DispId(-2147413087)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT fontVariant (BSTR value); + // VB6: Sub fontVariant (ByVal value As String) + [DispId(-2147413087)] + set; + } + + /// fontWeight property of IHTMLStyle interface. + /// An original IDL definition of fontWeight property was the following: BSTR fontWeight; + // IDL: BSTR fontWeight; + // VB6: fontWeight As String + string fontWeight + { + // IDL: HRESULT fontWeight ([out, retval] BSTR* ReturnValue); + // VB6: Function fontWeight As String + [DispId(-2147413085)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT fontWeight (BSTR value); + // VB6: Sub fontWeight (ByVal value As String) + [DispId(-2147413085)] + set; + } + + /// height property of IHTMLStyle interface. + /// An original IDL definition of height property was the following: VARIANT height; + // IDL: VARIANT height; + // VB6: height As Any + object height + { + // IDL: HRESULT height ([out, retval] VARIANT* ReturnValue); + // VB6: Function height As Any + [DispId(-2147418106)] + get; + // IDL: HRESULT height (VARIANT value); + // VB6: Sub height (ByVal value As Any) + [DispId(-2147418106)] + set; + } + + /// left property of IHTMLStyle interface. + /// An original IDL definition of left property was the following: VARIANT left; + // IDL: VARIANT left; + // VB6: left As Any + object left + { + // IDL: HRESULT left ([out, retval] VARIANT* ReturnValue); + // VB6: Function left As Any + [DispId(-2147418109)] + get; + // IDL: HRESULT left (VARIANT value); + // VB6: Sub left (ByVal value As Any) + [DispId(-2147418109)] + set; + } + + /// letterSpacing property of IHTMLStyle interface. + /// An original IDL definition of letterSpacing property was the following: VARIANT letterSpacing; + // IDL: VARIANT letterSpacing; + // VB6: letterSpacing As Any + object letterSpacing + { + // IDL: HRESULT letterSpacing ([out, retval] VARIANT* ReturnValue); + // VB6: Function letterSpacing As Any + [DispId(-2147413104)] + get; + // IDL: HRESULT letterSpacing (VARIANT value); + // VB6: Sub letterSpacing (ByVal value As Any) + [DispId(-2147413104)] + set; + } + + /// lineHeight property of IHTMLStyle interface. + /// An original IDL definition of lineHeight property was the following: VARIANT lineHeight; + // IDL: VARIANT lineHeight; + // VB6: lineHeight As Any + object lineHeight + { + // IDL: HRESULT lineHeight ([out, retval] VARIANT* ReturnValue); + // VB6: Function lineHeight As Any + [DispId(-2147413106)] + get; + // IDL: HRESULT lineHeight (VARIANT value); + // VB6: Sub lineHeight (ByVal value As Any) + [DispId(-2147413106)] + set; + } + + /// listStyle property of IHTMLStyle interface. + /// An original IDL definition of listStyle property was the following: BSTR listStyle; + // IDL: BSTR listStyle; + // VB6: listStyle As String + string listStyle + { + // IDL: HRESULT listStyle ([out, retval] BSTR* ReturnValue); + // VB6: Function listStyle As String + [DispId(-2147413037)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT listStyle (BSTR value); + // VB6: Sub listStyle (ByVal value As String) + [DispId(-2147413037)] + set; + } + + /// listStyleImage property of IHTMLStyle interface. + /// An original IDL definition of listStyleImage property was the following: BSTR listStyleImage; + // IDL: BSTR listStyleImage; + // VB6: listStyleImage As String + string listStyleImage + { + // IDL: HRESULT listStyleImage ([out, retval] BSTR* ReturnValue); + // VB6: Function listStyleImage As String + [DispId(-2147413038)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT listStyleImage (BSTR value); + // VB6: Sub listStyleImage (ByVal value As String) + [DispId(-2147413038)] + set; + } + + /// listStylePosition property of IHTMLStyle interface. + /// An original IDL definition of listStylePosition property was the following: BSTR listStylePosition; + // IDL: BSTR listStylePosition; + // VB6: listStylePosition As String + string listStylePosition + { + // IDL: HRESULT listStylePosition ([out, retval] BSTR* ReturnValue); + // VB6: Function listStylePosition As String + [DispId(-2147413039)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT listStylePosition (BSTR value); + // VB6: Sub listStylePosition (ByVal value As String) + [DispId(-2147413039)] + set; + } + + /// listStyleType property of IHTMLStyle interface. + /// An original IDL definition of listStyleType property was the following: BSTR listStyleType; + // IDL: BSTR listStyleType; + // VB6: listStyleType As String + string listStyleType + { + // IDL: HRESULT listStyleType ([out, retval] BSTR* ReturnValue); + // VB6: Function listStyleType As String + [DispId(-2147413040)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT listStyleType (BSTR value); + // VB6: Sub listStyleType (ByVal value As String) + [DispId(-2147413040)] + set; + } + + /// margin property of IHTMLStyle interface. + /// An original IDL definition of margin property was the following: BSTR margin; + // IDL: BSTR margin; + // VB6: margin As String + string margin + { + // IDL: HRESULT margin ([out, retval] BSTR* ReturnValue); + // VB6: Function margin As String + [DispId(-2147413076)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT margin (BSTR value); + // VB6: Sub margin (ByVal value As String) + [DispId(-2147413076)] + set; + } + + /// marginBottom property of IHTMLStyle interface. + /// An original IDL definition of marginBottom property was the following: VARIANT marginBottom; + // IDL: VARIANT marginBottom; + // VB6: marginBottom As Any + object marginBottom + { + // IDL: HRESULT marginBottom ([out, retval] VARIANT* ReturnValue); + // VB6: Function marginBottom As Any + [DispId(-2147413073)] + get; + // IDL: HRESULT marginBottom (VARIANT value); + // VB6: Sub marginBottom (ByVal value As Any) + [DispId(-2147413073)] + set; + } + + /// marginLeft property of IHTMLStyle interface. + /// An original IDL definition of marginLeft property was the following: VARIANT marginLeft; + // IDL: VARIANT marginLeft; + // VB6: marginLeft As Any + object marginLeft + { + // IDL: HRESULT marginLeft ([out, retval] VARIANT* ReturnValue); + // VB6: Function marginLeft As Any + [DispId(-2147413072)] + get; + // IDL: HRESULT marginLeft (VARIANT value); + // VB6: Sub marginLeft (ByVal value As Any) + [DispId(-2147413072)] + set; + } + + /// marginRight property of IHTMLStyle interface. + /// An original IDL definition of marginRight property was the following: VARIANT marginRight; + // IDL: VARIANT marginRight; + // VB6: marginRight As Any + object marginRight + { + // IDL: HRESULT marginRight ([out, retval] VARIANT* ReturnValue); + // VB6: Function marginRight As Any + [DispId(-2147413074)] + get; + // IDL: HRESULT marginRight (VARIANT value); + // VB6: Sub marginRight (ByVal value As Any) + [DispId(-2147413074)] + set; + } + + /// marginTop property of IHTMLStyle interface. + /// An original IDL definition of marginTop property was the following: VARIANT marginTop; + // IDL: VARIANT marginTop; + // VB6: marginTop As Any + object marginTop + { + // IDL: HRESULT marginTop ([out, retval] VARIANT* ReturnValue); + // VB6: Function marginTop As Any + [DispId(-2147413075)] + get; + // IDL: HRESULT marginTop (VARIANT value); + // VB6: Sub marginTop (ByVal value As Any) + [DispId(-2147413075)] + set; + } + + /// overflow property of IHTMLStyle interface. + /// An original IDL definition of overflow property was the following: BSTR overflow; + // IDL: BSTR overflow; + // VB6: overflow As String + string overflow + { + // IDL: HRESULT overflow ([out, retval] BSTR* ReturnValue); + // VB6: Function overflow As String + [DispId(-2147413102)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT overflow (BSTR value); + // VB6: Sub overflow (ByVal value As String) + [DispId(-2147413102)] + set; + } + + /// padding property of IHTMLStyle interface. + /// An original IDL definition of padding property was the following: BSTR padding; + // IDL: BSTR padding; + // VB6: padding As String + string padding + { + // IDL: HRESULT padding ([out, retval] BSTR* ReturnValue); + // VB6: Function padding As String + [DispId(-2147413101)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT padding (BSTR value); + // VB6: Sub padding (ByVal value As String) + [DispId(-2147413101)] + set; + } + + /// paddingBottom property of IHTMLStyle interface. + /// An original IDL definition of paddingBottom property was the following: VARIANT paddingBottom; + // IDL: VARIANT paddingBottom; + // VB6: paddingBottom As Any + object paddingBottom + { + // IDL: HRESULT paddingBottom ([out, retval] VARIANT* ReturnValue); + // VB6: Function paddingBottom As Any + [DispId(-2147413098)] + get; + // IDL: HRESULT paddingBottom (VARIANT value); + // VB6: Sub paddingBottom (ByVal value As Any) + [DispId(-2147413098)] + set; + } + + /// paddingLeft property of IHTMLStyle interface. + /// An original IDL definition of paddingLeft property was the following: VARIANT paddingLeft; + // IDL: VARIANT paddingLeft; + // VB6: paddingLeft As Any + object paddingLeft + { + // IDL: HRESULT paddingLeft ([out, retval] VARIANT* ReturnValue); + // VB6: Function paddingLeft As Any + [DispId(-2147413097)] + get; + // IDL: HRESULT paddingLeft (VARIANT value); + // VB6: Sub paddingLeft (ByVal value As Any) + [DispId(-2147413097)] + set; + } + + /// paddingRight property of IHTMLStyle interface. + /// An original IDL definition of paddingRight property was the following: VARIANT paddingRight; + // IDL: VARIANT paddingRight; + // VB6: paddingRight As Any + object paddingRight + { + // IDL: HRESULT paddingRight ([out, retval] VARIANT* ReturnValue); + // VB6: Function paddingRight As Any + [DispId(-2147413099)] + get; + // IDL: HRESULT paddingRight (VARIANT value); + // VB6: Sub paddingRight (ByVal value As Any) + [DispId(-2147413099)] + set; + } + + /// paddingTop property of IHTMLStyle interface. + /// An original IDL definition of paddingTop property was the following: VARIANT paddingTop; + // IDL: VARIANT paddingTop; + // VB6: paddingTop As Any + object paddingTop + { + // IDL: HRESULT paddingTop ([out, retval] VARIANT* ReturnValue); + // VB6: Function paddingTop As Any + [DispId(-2147413100)] + get; + // IDL: HRESULT paddingTop (VARIANT value); + // VB6: Sub paddingTop (ByVal value As Any) + [DispId(-2147413100)] + set; + } + + /// pageBreakAfter property of IHTMLStyle interface. + /// An original IDL definition of pageBreakAfter property was the following: BSTR pageBreakAfter; + // IDL: BSTR pageBreakAfter; + // VB6: pageBreakAfter As String + string pageBreakAfter + { + // IDL: HRESULT pageBreakAfter ([out, retval] BSTR* ReturnValue); + // VB6: Function pageBreakAfter As String + [DispId(-2147413034)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT pageBreakAfter (BSTR value); + // VB6: Sub pageBreakAfter (ByVal value As String) + [DispId(-2147413034)] + set; + } + + /// pageBreakBefore property of IHTMLStyle interface. + /// An original IDL definition of pageBreakBefore property was the following: BSTR pageBreakBefore; + // IDL: BSTR pageBreakBefore; + // VB6: pageBreakBefore As String + string pageBreakBefore + { + // IDL: HRESULT pageBreakBefore ([out, retval] BSTR* ReturnValue); + // VB6: Function pageBreakBefore As String + [DispId(-2147413035)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT pageBreakBefore (BSTR value); + // VB6: Sub pageBreakBefore (ByVal value As String) + [DispId(-2147413035)] + set; + } + + /// pixelHeight property of IHTMLStyle interface. + /// An original IDL definition of pixelHeight property was the following: long pixelHeight; + // IDL: long pixelHeight; + // VB6: pixelHeight As Long + int pixelHeight + { + // IDL: HRESULT pixelHeight ([out, retval] long* ReturnValue); + // VB6: Function pixelHeight As Long + [DispId(-2147414109)] + get; + // IDL: HRESULT pixelHeight (long value); + // VB6: Sub pixelHeight (ByVal value As Long) + [DispId(-2147414109)] + set; + } + + /// pixelLeft property of IHTMLStyle interface. + /// An original IDL definition of pixelLeft property was the following: long pixelLeft; + // IDL: long pixelLeft; + // VB6: pixelLeft As Long + int pixelLeft + { + // IDL: HRESULT pixelLeft ([out, retval] long* ReturnValue); + // VB6: Function pixelLeft As Long + [DispId(-2147414111)] + get; + // IDL: HRESULT pixelLeft (long value); + // VB6: Sub pixelLeft (ByVal value As Long) + [DispId(-2147414111)] + set; + } + + /// pixelTop property of IHTMLStyle interface. + /// An original IDL definition of pixelTop property was the following: long pixelTop; + // IDL: long pixelTop; + // VB6: pixelTop As Long + int pixelTop + { + // IDL: HRESULT pixelTop ([out, retval] long* ReturnValue); + // VB6: Function pixelTop As Long + [DispId(-2147414112)] + get; + // IDL: HRESULT pixelTop (long value); + // VB6: Sub pixelTop (ByVal value As Long) + [DispId(-2147414112)] + set; + } + + /// pixelWidth property of IHTMLStyle interface. + /// An original IDL definition of pixelWidth property was the following: long pixelWidth; + // IDL: long pixelWidth; + // VB6: pixelWidth As Long + int pixelWidth + { + // IDL: HRESULT pixelWidth ([out, retval] long* ReturnValue); + // VB6: Function pixelWidth As Long + [DispId(-2147414110)] + get; + // IDL: HRESULT pixelWidth (long value); + // VB6: Sub pixelWidth (ByVal value As Long) + [DispId(-2147414110)] + set; + } + + /// posHeight property of IHTMLStyle interface. + /// An original IDL definition of posHeight property was the following: float posHeight; + // IDL: float posHeight; + // VB6: posHeight As Single + float posHeight + { + // IDL: HRESULT posHeight ([out, retval] float* ReturnValue); + // VB6: Function posHeight As Single + [DispId(-2147414105)] + get; + // IDL: HRESULT posHeight (float value); + // VB6: Sub posHeight (ByVal value As Single) + [DispId(-2147414105)] + set; + } + + /// position property of IHTMLStyle interface. + /// An original IDL definition of position property was the following: BSTR position; + // IDL: BSTR position; + // VB6: position As String + string position + { + // IDL: HRESULT position ([out, retval] BSTR* ReturnValue); + // VB6: Function position As String + [DispId(-2147413022)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + } + + /// posLeft property of IHTMLStyle interface. + /// An original IDL definition of posLeft property was the following: float posLeft; + // IDL: float posLeft; + // VB6: posLeft As Single + float posLeft + { + // IDL: HRESULT posLeft ([out, retval] float* ReturnValue); + // VB6: Function posLeft As Single + [DispId(-2147414107)] + get; + // IDL: HRESULT posLeft (float value); + // VB6: Sub posLeft (ByVal value As Single) + [DispId(-2147414107)] + set; + } + + /// posTop property of IHTMLStyle interface. + /// An original IDL definition of posTop property was the following: float posTop; + // IDL: float posTop; + // VB6: posTop As Single + float posTop + { + // IDL: HRESULT posTop ([out, retval] float* ReturnValue); + // VB6: Function posTop As Single + [DispId(-2147414108)] + get; + // IDL: HRESULT posTop (float value); + // VB6: Sub posTop (ByVal value As Single) + [DispId(-2147414108)] + set; + } + + /// posWidth property of IHTMLStyle interface. + /// An original IDL definition of posWidth property was the following: float posWidth; + // IDL: float posWidth; + // VB6: posWidth As Single + float posWidth + { + // IDL: HRESULT posWidth ([out, retval] float* ReturnValue); + // VB6: Function posWidth As Single + [DispId(-2147414106)] + get; + // IDL: HRESULT posWidth (float value); + // VB6: Sub posWidth (ByVal value As Single) + [DispId(-2147414106)] + set; + } + + /// styleFloat property of IHTMLStyle interface. + /// An original IDL definition of styleFloat property was the following: BSTR styleFloat; + // IDL: BSTR styleFloat; + // VB6: styleFloat As String + string styleFloat + { + // IDL: HRESULT styleFloat ([out, retval] BSTR* ReturnValue); + // VB6: Function styleFloat As String + [DispId(-2147413042)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT styleFloat (BSTR value); + // VB6: Sub styleFloat (ByVal value As String) + [DispId(-2147413042)] + set; + } + + /// textAlign property of IHTMLStyle interface. + /// An original IDL definition of textAlign property was the following: BSTR textAlign; + // IDL: BSTR textAlign; + // VB6: textAlign As String + string textAlign + { + // IDL: HRESULT textAlign ([out, retval] BSTR* ReturnValue); + // VB6: Function textAlign As String + [DispId(-2147418040)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT textAlign (BSTR value); + // VB6: Sub textAlign (ByVal value As String) + [DispId(-2147418040)] + set; + } + + /// textDecoration property of IHTMLStyle interface. + /// An original IDL definition of textDecoration property was the following: BSTR textDecoration; + // IDL: BSTR textDecoration; + // VB6: textDecoration As String + string textDecoration + { + // IDL: HRESULT textDecoration ([out, retval] BSTR* ReturnValue); + // VB6: Function textDecoration As String + [DispId(-2147413077)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT textDecoration (BSTR value); + // VB6: Sub textDecoration (ByVal value As String) + [DispId(-2147413077)] + set; + } + + /// textDecorationBlink property of IHTMLStyle interface. + /// An original IDL definition of textDecorationBlink property was the following: VARIANT_BOOL textDecorationBlink; + // IDL: VARIANT_BOOL textDecorationBlink; + // VB6: textDecorationBlink As Boolean + bool textDecorationBlink + { + // IDL: HRESULT textDecorationBlink ([out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function textDecorationBlink As Boolean + [DispId(-2147413090)] + [return: MarshalAs(UnmanagedType.VariantBool)] + get; + // IDL: HRESULT textDecorationBlink (VARIANT_BOOL value); + // VB6: Sub textDecorationBlink (ByVal value As Boolean) + [DispId(-2147413090)] + set; + } + + /// textDecorationLineThrough property of IHTMLStyle interface. + /// An original IDL definition of textDecorationLineThrough property was the following: VARIANT_BOOL textDecorationLineThrough; + // IDL: VARIANT_BOOL textDecorationLineThrough; + // VB6: textDecorationLineThrough As Boolean + bool textDecorationLineThrough + { + // IDL: HRESULT textDecorationLineThrough ([out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function textDecorationLineThrough As Boolean + [DispId(-2147413092)] + [return: MarshalAs(UnmanagedType.VariantBool)] + get; + // IDL: HRESULT textDecorationLineThrough (VARIANT_BOOL value); + // VB6: Sub textDecorationLineThrough (ByVal value As Boolean) + [DispId(-2147413092)] + set; + } + + /// textDecorationNone property of IHTMLStyle interface. + /// An original IDL definition of textDecorationNone property was the following: VARIANT_BOOL textDecorationNone; + // IDL: VARIANT_BOOL textDecorationNone; + // VB6: textDecorationNone As Boolean + bool textDecorationNone + { + // IDL: HRESULT textDecorationNone ([out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function textDecorationNone As Boolean + [DispId(-2147413089)] + [return: MarshalAs(UnmanagedType.VariantBool)] + get; + // IDL: HRESULT textDecorationNone (VARIANT_BOOL value); + // VB6: Sub textDecorationNone (ByVal value As Boolean) + [DispId(-2147413089)] + set; + } + + /// textDecorationOverline property of IHTMLStyle interface. + /// An original IDL definition of textDecorationOverline property was the following: VARIANT_BOOL textDecorationOverline; + // IDL: VARIANT_BOOL textDecorationOverline; + // VB6: textDecorationOverline As Boolean + bool textDecorationOverline + { + // IDL: HRESULT textDecorationOverline ([out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function textDecorationOverline As Boolean + [DispId(-2147413043)] + [return: MarshalAs(UnmanagedType.VariantBool)] + get; + // IDL: HRESULT textDecorationOverline (VARIANT_BOOL value); + // VB6: Sub textDecorationOverline (ByVal value As Boolean) + [DispId(-2147413043)] + set; + } + + /// textDecorationUnderline property of IHTMLStyle interface. + /// An original IDL definition of textDecorationUnderline property was the following: VARIANT_BOOL textDecorationUnderline; + // IDL: VARIANT_BOOL textDecorationUnderline; + // VB6: textDecorationUnderline As Boolean + bool textDecorationUnderline + { + // IDL: HRESULT textDecorationUnderline ([out, retval] VARIANT_BOOL* ReturnValue); + // VB6: Function textDecorationUnderline As Boolean + [DispId(-2147413091)] + [return: MarshalAs(UnmanagedType.VariantBool)] + get; + // IDL: HRESULT textDecorationUnderline (VARIANT_BOOL value); + // VB6: Sub textDecorationUnderline (ByVal value As Boolean) + [DispId(-2147413091)] + set; + } + + /// textIndent property of IHTMLStyle interface. + /// An original IDL definition of textIndent property was the following: VARIANT textIndent; + // IDL: VARIANT textIndent; + // VB6: textIndent As Any + object textIndent + { + // IDL: HRESULT textIndent ([out, retval] VARIANT* ReturnValue); + // VB6: Function textIndent As Any + [DispId(-2147413105)] + get; + // IDL: HRESULT textIndent (VARIANT value); + // VB6: Sub textIndent (ByVal value As Any) + [DispId(-2147413105)] + set; + } + + /// textTransform property of IHTMLStyle interface. + /// An original IDL definition of textTransform property was the following: BSTR textTransform; + // IDL: BSTR textTransform; + // VB6: textTransform As String + string textTransform + { + // IDL: HRESULT textTransform ([out, retval] BSTR* ReturnValue); + // VB6: Function textTransform As String + [DispId(-2147413108)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT textTransform (BSTR value); + // VB6: Sub textTransform (ByVal value As String) + [DispId(-2147413108)] + set; + } + + /// top property of IHTMLStyle interface. + /// An original IDL definition of top property was the following: VARIANT top; + // IDL: VARIANT top; + // VB6: top As Any + object top + { + // IDL: HRESULT top ([out, retval] VARIANT* ReturnValue); + // VB6: Function top As Any + [DispId(-2147418108)] + get; + // IDL: HRESULT top (VARIANT value); + // VB6: Sub top (ByVal value As Any) + [DispId(-2147418108)] + set; + } + + /// verticalAlign property of IHTMLStyle interface. + /// An original IDL definition of verticalAlign property was the following: VARIANT verticalAlign; + // IDL: VARIANT verticalAlign; + // VB6: verticalAlign As Any + object verticalAlign + { + // IDL: HRESULT verticalAlign ([out, retval] VARIANT* ReturnValue); + // VB6: Function verticalAlign As Any + [DispId(-2147413064)] + get; + // IDL: HRESULT verticalAlign (VARIANT value); + // VB6: Sub verticalAlign (ByVal value As Any) + [DispId(-2147413064)] + set; + } + + /// visibility property of IHTMLStyle interface. + /// An original IDL definition of visibility property was the following: BSTR visibility; + // IDL: BSTR visibility; + // VB6: visibility As String + string visibility + { + // IDL: HRESULT visibility ([out, retval] BSTR* ReturnValue); + // VB6: Function visibility As String + [DispId(-2147413032)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT visibility (BSTR value); + // VB6: Sub visibility (ByVal value As String) + [DispId(-2147413032)] + set; + } + + /// whiteSpace property of IHTMLStyle interface. + /// An original IDL definition of whiteSpace property was the following: BSTR whiteSpace; + // IDL: BSTR whiteSpace; + // VB6: whiteSpace As String + string whiteSpace + { + // IDL: HRESULT whiteSpace ([out, retval] BSTR* ReturnValue); + // VB6: Function whiteSpace As String + [DispId(-2147413036)] + [return: MarshalAs(UnmanagedType.BStr)] + get; + // IDL: HRESULT whiteSpace (BSTR value); + // VB6: Sub whiteSpace (ByVal value As String) + [DispId(-2147413036)] + set; + } + + /// width property of IHTMLStyle interface. + /// An original IDL definition of width property was the following: VARIANT width; + // IDL: VARIANT width; + // VB6: width As Any + object width + { + // IDL: HRESULT width ([out, retval] VARIANT* ReturnValue); + // VB6: Function width As Any + [DispId(-2147418107)] + get; + // IDL: HRESULT width (VARIANT value); + // VB6: Sub width (ByVal value As Any) + [DispId(-2147418107)] + set; + } + + /// wordSpacing property of IHTMLStyle interface. + /// An original IDL definition of wordSpacing property was the following: VARIANT wordSpacing; + // IDL: VARIANT wordSpacing; + // VB6: wordSpacing As Any + object wordSpacing + { + // IDL: HRESULT wordSpacing ([out, retval] VARIANT* ReturnValue); + // VB6: Function wordSpacing As Any + [DispId(-2147413065)] + get; + // IDL: HRESULT wordSpacing (VARIANT value); + // VB6: Sub wordSpacing (ByVal value As Any) + [DispId(-2147413065)] + set; + } + + /// zIndex property of IHTMLStyle interface. + /// An original IDL definition of zIndex property was the following: VARIANT zIndex; + // IDL: VARIANT zIndex; + // VB6: zIndex As Any + object zIndex + { + // IDL: HRESULT zIndex ([out, retval] VARIANT* ReturnValue); + // VB6: Function zIndex As Any + [DispId(-2147413021)] + get; + // IDL: HRESULT zIndex (VARIANT value); + // VB6: Sub zIndex (ByVal value As Any) + [DispId(-2147413021)] + set; + } + } +} diff --git a/Speak/Speak/Interop/IEHandler.cs b/Speak/Speak/Interop/IEHandler.cs new file mode 100644 index 0000000..efc554b --- /dev/null +++ b/Speak/Speak/Interop/IEHandler.cs @@ -0,0 +1,310 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices.ComTypes; +using System.Threading; +using System.Windows.Forms; +using Speak.Core; +using Speak.Interfaces; +using Speak.Sites; +using Speak.Utils; + +namespace Speak.Interop +{ + internal class IEHandler : Invokable, IMessageProcessor + { + private string documentBody; + private IHTMLDocument2 doc; + + private IntPtr wHandle; + private static Guid IID_IHTMLDocument = new Guid("626FC520-A41E-11CF-A731-00A0C9082637"); + private static Guid IID_HTMLDocumentEvents2 = typeof(HTMLDocumentEvents2).GUID; + + private int cookie = -1; + private IConnectionPoint connPoint; + private IConnectionPointContainer connPointContainer; + private Handler handler; + + private const int MAX_UPDATETIME_WAITING = 1500; // 1.5 секунды + private bool inUpdate; + private bool jsExists; + private bool doBrake; + + private Settings settings; + private AvatarProcessor ap; + private ISite site; + + public IEHandler(ISite site, IntPtr wHandle) : base (wHandle) + { + jsExists = true; + inUpdate = true; + + this.site = site; + + settings = Settings.Instance; + this.wHandle = wHandle; + + documentBody = String.Empty; + doc = IEDocumentFromHandle(this.wHandle); + + handler = new Handler(this); + connPointContainer = (IConnectionPointContainer)doc; + connPointContainer.FindConnectionPoint(ref IID_HTMLDocumentEvents2, out connPoint); + connPoint.Advise(handler, out cookie); + + //script = (HTMLWindow2Class)doc.Script; + //scriptWindow = typeof (HTMLWindow2Class); + try + { + // По-хорошему, это надо бы в OnDownloadComplete, но мне лень. :) + object joinedString = doc.Script.GetType().InvokeMember("eval", System.Reflection.BindingFlags.InvokeMethod, null, doc.Script, new object[] { "jInit();" }); + if (Settings.Instance.ShowAvatars) + InsertAvatars(joinedString.ToString()); + + //doc.Script.GetType().InvokeMember("eval", System.Reflection.BindingFlags.InvokeMethod, null, doc.Script, new object[] { "jInit();" }); + } + catch(Exception ex) + { + jsExists = false; + MessageBox.Show( + "Cant find javascript:jInit() function." + Environment.NewLine + + "Have you edit IEView template file?" + Environment.NewLine + Environment.NewLine + + ex.Message, + "[xJuick] JavaScript init error", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + + documentBody = doc.body.innerHTML; + } + + private void InsertAvatars(string unsplittedUsers) + { + if (String.IsNullOrEmpty(unsplittedUsers)) + return; + ap = new AvatarProcessor(site); + string[] users = unsplittedUsers.Split('#'); + List> avatars = new List>(); + for (int i = 0, iCount = users.Length; i < iCount; i++) + { + string avatarPath = ap.GetUserAvatar(users[i].Substring(1), AvatarCallBack); + if (!String.IsNullOrEmpty(avatarPath)) + { + avatars.Add(new KeyValuePair(users[i], avatarPath.Replace('\\', '/'))); + } + } + + for (int i = 0, iCount = avatars.Count; i < iCount; i++) + { + try + { + doc.Script.GetType().InvokeMember("eval", System.Reflection.BindingFlags.InvokeMethod, null, doc.Script, new object[] { "jInsertAvatar('" + avatars[i].Key + "', '" + avatars[i].Value + "');" }); + } + catch { } + } + + if (avatars.Count != users.Length) + ap.Process(); + } + + private delegate void UpdateAvatar(string userName, string avatarPath); + private void PerformAvatarCallBack(string userName, string avatarPath) + { + try + { + doc.Script.GetType().InvokeMember("eval", System.Reflection.BindingFlags.InvokeMethod, null, doc.Script, new object[] { "jInsertAvatar('@" + userName + "', '" + avatarPath + "');" }); + } + catch { } + } + + private void AvatarCallBack(string userName, string avatarPath) + { + avatarPath = avatarPath.Replace('\\', '/'); + if (InvokeRequired) + { + UpdateAvatar d = PerformAvatarCallBack; + Invoke(d, new object[] { userName, avatarPath }); + } + else + { + PerformAvatarCallBack(userName, avatarPath); + } + } + + public bool FoundIEView + { + get { return doc != null; } + } + + private delegate void UpdateChecker(); + public void Update() + { + inUpdate = !inUpdate; + if (inUpdate) + return; + + if (!jsExists) + return; + + // Мда... Вы этого не видели :) + // Нет. Не надо смотреть на этот апдейт. :) + documentBody = doc.body.innerHTML; + UpdateChecker updater = InfinityLoop; + updater.BeginInvoke(UpdateCallback, updater); + } + + public void SettingsChanged() + { + + } + + public void ShowThreads() + { + + } + + public void Avatars() + { + // not implemented :) + } + + private delegate void UpdatePerformer(); + private void PerformUpdate() + { + try + { + object joinedString = doc.Script.GetType().InvokeMember("eval", System.Reflection.BindingFlags.InvokeMethod, null, doc.Script, new object[] { "jInit();" }); + if (Settings.Instance.ShowAvatars) + InsertAvatars(joinedString.ToString()); + } + catch { } + } + + private void UpdateCallback(IAsyncResult result) + { + UpdateChecker flusher = (UpdateChecker)result.AsyncState; + + flusher.EndInvoke(result); + + if (doBrake) + return; + + if (InvokeRequired) + { + UpdatePerformer d = PerformUpdate; + Invoke(d, null); + return; + } + + try + { + doc.Script.GetType().InvokeMember("eval", System.Reflection.BindingFlags.InvokeMethod, null, doc.Script, new object[] { "jInit();" }); + } + catch { } + } + + private void InfinityLoop() + { + int currentTime = 0; + while (true) + { + if (doBrake) + return; + // Ещё вариант: if (doc.containsElementWithID("jText")) { .. } + // ...но опасно :) + if (settings.FastIEView && !documentBody.Equals(doc.body.innerHTML, StringComparison.InvariantCultureIgnoreCase)) + { + documentBody = doc.body.innerHTML; + return; + } + Thread.Sleep(100); + currentTime += 100; + // well... не дождались апдейта + if (currentTime >= MAX_UPDATETIME_WAITING) + return; + } + + } + + private static IHTMLDocument2 IEDocumentFromHandle(IntPtr hWnd) + { + IHTMLDocument2 document = null; + int lRes; + + if (WinApi.WM_HTML_GETOBJECT != 0) + { + WinApi.SendMessageTimeout(hWnd, WinApi.WM_HTML_GETOBJECT, 0, 0, WinApi.SMTO_ABORTIFHUNG, 1000, out lRes); + + if (!(lRes == 0)) + { + Guid iid = IID_IHTMLDocument; + WinApi.ObjectFromLresult(lRes, ref iid, 0, ref document); + } + } + + return document; + } + + public event EventHandler JuickClicked; + public void InvokeJuick(string action, bool autoSend) + { + if (JuickClicked == null) + return; + JuickClicked(this, new ActionClickEvent(action, autoSend)); + } + + ~IEHandler() + { + + } + + #region Implementation of IDisposable + + public void Dispose() + { + doBrake = true; + if (cookie != -1) + { + connPoint.Unadvise(cookie); + } + cookie = -1; + handler = null; + } + + #endregion + } + + internal class Handler : HTMLDocumentEvents2 + { + private IEHandler parent; + + public Handler(IEHandler parent) + { + this.parent = parent; + } + + public bool onclick(IHTMLEventObj pEvtObj) + { + IHTMLElement el = pEvtObj.SrcElement; + if (!el.tagName.Equals("DIV", StringComparison.InvariantCultureIgnoreCase)) + return false; + + string action = el.getAttribute("action", 0).ToString(); + if (String.IsNullOrEmpty(action)) + return false; + + string autoSendStr = el.getAttribute("autosend", 0).ToString(); + bool autoSend = autoSendStr.Equals("1") || + autoSendStr.Equals("true", StringComparison.CurrentCultureIgnoreCase); + + + pEvtObj.ReturnValue = false; + pEvtObj.CancelBubble = true; + + + parent.InvokeJuick(action, autoSend); + return false; + } + } +} + + diff --git a/Speak/Speak/Interop/Structs.cs b/Speak/Speak/Interop/Structs.cs new file mode 100644 index 0000000..b3aca46 --- /dev/null +++ b/Speak/Speak/Interop/Structs.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Speak.Interop +{ + [StructLayout(LayoutKind.Sequential)] + public struct COLORREF + { + public uint ColorDWORD; + + public COLORREF(System.Drawing.Color color) + { + ColorDWORD = (uint)color.R + (((uint)color.G) << 8) + (((uint)color.B) << 16); + } + + public System.Drawing.Color GetColor() + { + return System.Drawing.Color.FromArgb((int)(0x000000FFU & ColorDWORD), + (int)(0x0000FF00U & ColorDWORD) >> 8, (int)(0x00FF0000U & ColorDWORD) >> 16); + } + + public void SetColor(System.Drawing.Color color) + { + ColorDWORD = (uint)color.R + (((uint)color.G) << 8) + (((uint)color.B) << 16); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int Left; + public int Top; + public int Right; + public int Bottom; + + public RECT(int left, int top, int right, int bottom) + { + Left = left; + Top = top; + Right = right; + Bottom = bottom; + } + + public static RECT Empty + { + get { return new RECT(0,0,0,0); } + } + + public bool IsEmpty + { + get { return (Left == Right) && (Top == Bottom) && (Right == Top) && (Bottom == 0); } + } + + public bool Equals(RECT rect) + { + return Top == rect.Top && Bottom == rect.Bottom && Left == rect.Left && Right == rect.Right; + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct POINT + { + public int X; + public int Y; + + public POINT(int x, int y) + { + this.X = x; + this.Y = y; + } + + public static implicit operator System.Drawing.Point(POINT p) + { + return new System.Drawing.Point(p.X, p.Y); + } + + public static implicit operator POINT(System.Drawing.Point p) + { + return new POINT(p.X, p.Y); + } + } +} diff --git a/Speak/Speak/Interop/Subclassing.cs b/Speak/Speak/Interop/Subclassing.cs new file mode 100644 index 0000000..6828f1e --- /dev/null +++ b/Speak/Speak/Interop/Subclassing.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Speak.Interop +{ + public class Subclassing : IDisposable + { + private const int GWL_WNDPROC = -4; + + [DllImport("user32", SetLastError = true)] + private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, Win32WndProc newProc); + [DllImport("user32", SetLastError = true)] + private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr newProc); + [DllImport("user32")] + private static extern int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, int Msg, int wParam, int lParam); + [DllImport("kernel32.dll")] + public static extern void SetLastError(uint dwErrCode); + + private IntPtr wHandle; + private Win32WndProc wProc; + private IntPtr oldWndProc = IntPtr.Zero; + + public Subclassing(IntPtr wHandle) + { + this.wHandle = wHandle; + } + + public int StartSubclassing(Win32WndProc newWindowProc) + { + wProc = newWindowProc; + SetLastError(0); + if (oldWndProc != IntPtr.Zero) + SetWindowLong(wHandle, GWL_WNDPROC, wProc); + else + oldWndProc = SetWindowLong(wHandle, GWL_WNDPROC, wProc); + return Marshal.GetLastWin32Error(); + } + + public int CallParent(IntPtr hWnd, int Msg, int wParam, int lParam) + { + if (Msg == 0x02 || Msg == 0x10) + { + StopSubclass(); + } + return CallWindowProc(oldWndProc, hWnd, Msg, wParam, lParam); + } + + public void StopSubclass() + { + if (wHandle != IntPtr.Zero && oldWndProc != IntPtr.Zero) + { + SetWindowLong(wHandle, GWL_WNDPROC, oldWndProc); + wHandle = IntPtr.Zero; + wProc = null; + } + } + + #region Implementation of IDisposable + + public void Dispose() + { + StopSubclass(); + } + + #endregion + } + + public delegate int Win32WndProc(IntPtr hWnd, int Msg, int wParam, int lParam); +} diff --git a/Speak/Speak/Interop/WinApi.cs b/Speak/Speak/Interop/WinApi.cs new file mode 100644 index 0000000..7e0783f --- /dev/null +++ b/Speak/Speak/Interop/WinApi.cs @@ -0,0 +1,356 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using Speak.Interfaces; +using Speak.RichEdit; + +namespace Speak.Interop +{ + internal class WinApi + { + public static int SMTO_ABORTIFHUNG = 0x2; + public static int WM_HTML_GETOBJECT = RegisterWindowMessage("WM_HTML_GETOBJECT"); + public const int WM_USER = 0x0400; + public static int GWL_STYLE = -16; + public const int NM_CLICK = -2; + public const int WM_HSCROLL = -16; + public static IntPtr HWND_DESKTOP = IntPtr.Zero; + + public const Int32 PSM_CHANGED = WM_USER + 104; + public const Int32 PSN_APPLY = ((0 - 200) - 2); + + public const Int32 MK_CONTROL = 0x8; + + public const int WM_MOUSEMOVE = 0x200; + public const int WM_LBUTTONDOWN = 0x201; + public const int WM_LBUTTONUP = 0x202; + public const int WM_RBUTTONDOWN = 0x204; + public const int WM_RBUTTONUP = 0x205; + public const int WM_MBUTTONDOWN = 0x207; + public const int WM_MBUTTONUP = 0x208; + public const int WM_LBUTTONDBLCLK = 0x203; + public const int WM_MBUTTONDBLCLK = 0x209; + public const int WM_RBUTTONDBLCLK = 0x206; + public const int WM_KEYUP = 0x101; + public const int WM_KEYDOWN = 0x100; + public const int WM_SYSKEYDOWN = 0x104; + + public const int UM_CHECKSTATECHANGE = WM_USER + 100; + + public const int WM_VSCROLL = 0x115; + public const int WM_UPDATE = 0x401; + public const int WM_RESIZE = 0x0085; + public const int WM_PAINT = 0x0F; + public const int WM_SETTEXT = 0xC; + public const int WM_NOTIFY = 0x4E; + public const int WM_GETTEXT = 13; + public const int WM_GETTEXTLENGTH = 14; + + public const int WM_INITDIALOG = 0x0110; + public const int WM_COMMAND = 0x0111; + public const int WM_SETFOCUS = 0x0007; + + public const int WM_DESTROY = 0x2; + + public const int BM_GETCHECK = 0x00F0; + public const int BM_SETCHECK = 0x00F1; + public const int BST_UNCHECKED = 0; + public const int BST_CHECKED = 1; + public const int BST_INDETERMINATE = 2; + public const int BST_PUSHED = 4; + public const int BST_FOCUS = 8; + + public const int CB_ADDSTRING = 0x0143; + public const int CB_SETCURSEL = 0x014E; + public const int CB_GETCURSEL = 0x0147; + public const int CB_GETLBTEXT = 0x0148; + public const int CB_SELECTSTRING = 0x014D; + + public const int CB_GETLBTEXTLEN = 0x0149; + public const int CB_RESETCONTENT = 0x014B; + + public const int CBN_SELCHANGE = 1; + + public const int LVM_FIRST = 0x1000; + public const int LVM_INSERTITEM = LVM_FIRST + 7; + public const int LVIF_TEXT = 0x0001; + public const int LVIF_IMAGE = 0x0002; + public const int LVIF_PARAM = 0x0004; + public const int LVIF_INDENT = 0x0010; + + public const int ILC_MASK = 0x0001; + public const int ILC_COLOR32 = 0x0020; + + public const int BN_CLICKED = 0; + public const int EN_CHANGE = 0x300; + + public const int STM_SETICON = 368; + public const uint ILD_NORMAL = 0; + public const int COLOR_WINDOW = 5; //http://msdn.microsoft.com/en-us/library/windows/desktop/ms724371(v=vs.85).aspx + public const int COLOR_WINDOWTEXT = 8; + public const int TBM_SETRANGE = WM_USER + 6; + public const int TBM_SETPOS = WM_USER + 5; + public const int TBM_GETPOS = WM_USER; + + [DllImport("user32.dll")] + public static extern int GetSysColor(int XAmount); + + [DllImport("user32.dll")] + public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, Int32 Msg, Int32 wParam, Int32 lParam); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, Int32 Msg, Int64 wParam, Int64 lParam); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, Int32 Msg, Int32 wParam, IntPtr lParam); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, Int32 Msg, Int32 wParam, ref POINTL lParam); + + [DllImport("user32.dll", EntryPoint = "SendMessageA", /*CharSet = CharSet.Auto, */SetLastError = true)] + public static extern int SendMessageA(IntPtr hwnd, int msg, int wParam, IntPtr lParam); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("user32.dll", SetLastError = true)] + public static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("user32.dll", SetLastError = true)] + public static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, IntPtr lParam); + + [DllImport("user32.dll")] + public static extern bool ScrollWindow(IntPtr hWnd, int XAmount, int YAmount, IntPtr lpRect, IntPtr wpRect); + + [DllImport("user32.dll")] + public static extern bool DestroyIcon(int hIcon); + + [DllImport("comctl32.dll")] + public static extern bool ImageList_Destroy(int himl); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); + + [DllImport("user32.dll", EntryPoint = "SendMessageTimeoutA")] + public static extern int SendMessageTimeout(IntPtr hwnd, int msg, int wParam, int lParam, int fuFlags, int uTimeout, out int lpdwResult); + + [DllImport("user32.dll", SetLastError = true)] + public static extern int GetWindowLong(IntPtr hWnd, int nIndex); + + [DllImport("OLEACC.dll")] + public static extern int ObjectFromLresult(int lResult, ref Guid riid, int wParam, ref IHTMLDocument2 ppvObject); + + [DllImport("user32.dll", EntryPoint = "RegisterWindowMessageA")] + public static extern int RegisterWindowMessage(string lpString); + + [DllImport("user32.dll")] + public static extern bool ClientToScreen(IntPtr hwnd, ref POINT lpPoint); + + [DllImport("user32.dll")] + public static extern bool ScreenToClient(IntPtr hwnd, ref POINT lpPoint); + + [DllImport("user32.dll")] + public static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); + + [DllImport("user32.dll")] + public static extern Int32 SendDlgItemMessage(IntPtr hDlg, int nIDDlgItem, uint Msg, Int32 wParam, Int32 lParam); + + [DllImport("user32.dll")] + public static extern Int32 SendDlgItemMessage(IntPtr hDlg, int nIDDlgItem, uint Msg, Int32 wParam, IntPtr lParam); + + [DllImport("user32.dll")] + public static extern bool EnableWindow(IntPtr hWnd, bool bEnable); + + [DllImport("user32.dll")] + public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow); + + [DllImport("comctl32.dll", SetLastError = true)] + public static extern IntPtr ImageList_Create(int cx, int cy, uint flags, int cInitial, int cGrow); + + [DllImport("comctl32.dll", SetLastError = true)] + public static extern Int32 ImageList_ReplaceIcon(IntPtr imageList, Int32 iconIndex, IntPtr hIcon); + + [DllImport("comctl32.dll", SetLastError = true)] + public static extern Int32 ImageList_GetIcon(IntPtr imageList, Int32 iconIndex, uint flags); + + [DllImport("user32.dll")] + public static extern uint GetMessagePos(); + + [DllImport("user32.dll")] + public static extern Int32 GetFocus(); + + [DllImport("user32.dll")] + public static extern Int32 SetFocus(IntPtr hWnd); + + [DllImport("user32.dll")] + public static extern IntPtr GetParent(IntPtr hWnd); + + [DllImport("user32.dll", SetLastError = true)] + public static extern int MapWindowPoints(IntPtr hwndFrom, IntPtr hwndTo, ref POINT lpPoints, [MarshalAs(UnmanagedType.U4)] int cPoints); + + [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] + public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); + + [DllImport("user32")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i); + public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter); + + public static IntPtr MakeLParam(int wLow, int wHigh) + { + return (IntPtr)(((short)wHigh << 16) | (wLow & 0xffff)); + } + + + + public static List GetChildWindows(IntPtr parent) + { + List result = new List(); + GCHandle listHandle = GCHandle.Alloc(result); + try + { + EnumWindowProc childProc = EnumWindow; + EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle)); + } + finally + { + if (listHandle.IsAllocated) + listHandle.Free(); + } + return result; + } + + public static string GetWindowName(IntPtr window) + { + StringBuilder className = new StringBuilder(100); + GetClassName(window, className, className.Capacity); + return className.ToString(); + } + + private static bool EnumWindow(IntPtr handle, IntPtr pointer) + { + GCHandle gch = GCHandle.FromIntPtr(pointer); + List list = gch.Target as List; + if (list == null) + { + throw new InvalidCastException("GCHandle Target could not be cast as List"); + } + list.Add(handle); + // You can modify this to check to see if you want to cancel the operation, then return a null here + return true; + } + + public static IntPtr GetLogWindow(IntPtr parent, string className) + { + List childs = GetChildWindows(parent); + for (int i = 0, iCount = childs.Count; i < iCount; i++) + { +#if DEBUG + System.Diagnostics.Debug.WriteLine("[" + childs[i].ToString("X") + "] " + GetWindowName(childs[i])); +#endif + if (GetWindowName(childs[i]).StartsWith(className)) + return childs[i]; + } + + return IntPtr.Zero; + } + + // sciver 2.8.1.1+ fix + public static IntPtr GetLogWindowByStyles(IntPtr parent, string className) + { + List childs = GetChildWindows(parent); + for (int i = 0, iCount = childs.Count; i < iCount; i++) + { + if (GetWindowName(childs[i]).StartsWith(className)) + { + Int32 exStyles = GetWindowLong(childs[i], GWL_STYLE); + if (exStyles != 0 && ((exStyles & REConstants.ES_READONLY) != 0) && ((exStyles & REConstants.ES_AUTOVSCROLL) != 0)) + return childs[i]; + } + } + + return IntPtr.Zero; + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct NMHDR + { + public IntPtr handleFrom; + public Int32 idFrom; + public Int32 code; + } + + public struct WindowShowStyle + { + /// Hides the window and activates another window. + public const Int32 SW_HIDE = 0; + + /// Activates and displays a window. If the window is minimized + /// or maximized, the system restores it to its original size and + /// position. An application should specify this flag when displaying + /// the window for the first time. + public const Int32 SW_SHOWNORMAL = 1; + + /// Activates the window and displays it as a minimized window. + public const Int32 SW_SHOWMINIMIZED = 2; + + /// Activates the window and displays it as a maximized window. + public const Int32 SW_SHOWMAXIMIZED = 3; + + /// Maximizes the specified window. + public const Int32 SW_MAXIMIZE = 3; + + /// Displays a window in its most recent size and position. + /// This value is similar to "ShowNormal", except the window is not + /// actived. + public const Int32 SW_SHOWNOACTIVATE = 4; + + /// Activates the window and displays it in its current size + /// and position. + public const Int32 SW_SHOW = 5; + + /// Minimizes the specified window and activates the next + /// top-level window in the Z order. + public const Int32 SW_MINIMIZE = 6; + + /// Displays the window as a minimized window. This value is + /// similar to "ShowMinimized", except the window is not activated. + public const Int32 SW_SHOWMINNOACTIVE = 7; + + /// Displays the window in its current size and position. This + /// value is similar to "Show", except the window is not activated. + public const Int32 SW_SHOWNA = 8; + + /// Activates and displays the window. If the window is + /// minimized or maximized, the system restores it to its original size + /// and position. An application should specify this flag when restoring + /// a minimized window. + public const Int32 SW_RESTORE = 9; + + /// Sets the show state based on the SW_ value specified in the + /// STARTUPINFO structure passed to the CreateProcess function by the + /// program that started the application. + /// See SW_SHOWDEFAULT + public const Int32 ShowDefault = 10; + + /// Windows 2000/XP: Minimizes a window, even if the thread + /// that owns the window is hung. This flag should only be used when + /// minimizing windows from a different thread. + public const Int32 SW_FORCEMINIMIZE = 11; + } + + [ComImport] + [Guid("6d5140c1-7436-11ce-8034-00aa006009fa")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + interface IServiceProvider + { + void QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject); + } +} diff --git a/Speak/Speak/MainClass.cs b/Speak/Speak/MainClass.cs new file mode 100644 index 0000000..9d04f5b --- /dev/null +++ b/Speak/Speak/MainClass.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Virtuoso.Miranda.Plugins; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Virtuoso.Hyphen.Mini; +using Virtuoso.Hyphen.Mini.Custom; +using Virtuoso.Miranda.Plugins.ThirdParty.Updater; +using System.Windows.Forms; +using Speak; +using Speak.Opt; +using Speak.Storage; +using Speak.TTS; +using Speak.Structs; + +[assembly: ExposingPlugin(typeof(MainClass))] + +namespace Speak +{ + /// + /// MainClass of Speak + /// + public class MainClass : StandalonePlugin + { + private Options option; + + private MainClass() + { + this.option = new Options(); + this.option.Changed += new Options.ChangedEventHandler(option_hasUpdated); + } + + /// + /// Run after the Plugin Initialisation + /// + protected override void AfterPluginInitialization() + { + option_hasUpdated(Options.EventChanged.Active); + option_hasUpdated(Options.EventChanged.Announce); + option_hasUpdated(Options.EventChanged.Engine); + RegisterUpdate(); + EventManager.CreateEventHook(API.ME_OPT_INITIALISE, this.option.Opts, this); + EventManager.CreateEventHook(API.ME_DB_EVENT_ADDED, Message, this); + EventManager.CreateEventHook(API.ME_DB_CONTACT_SETTINGCHANGED, StatusChange, this); + SpeakWelcome(); + } + + protected override void BeforePluginDisable() + { + EventManager.RemoveEventHook(API.ME_OPT_INITIALISE, this); + EventManager.RemoveEventHook(API.ME_DB_EVENT_ADDED, this); + EventManager.RemoveEventHook(API.ME_DB_CONTACT_SETTINGCHANGED, this); + TextToSpeak.getInstance().Stop(); + } + + private int Message(UIntPtr wParam, IntPtr lParam) + { + DatabaseEventInfo d = DatabaseEventInfo.FromHandle(lParam); + if (d.Type == DatabaseEventType.Message && !((d.Flags & DatabaseEventProperties.Sent) == DatabaseEventProperties.Sent)) + { + ContactInfo c = ContactInfo.FromHandle(d.GetContactHandle()); + Settings s = Settings.getInstance(); + if (s.canMessageRead(d.Data, c.UniqueID.ToString())) + { + TextToSpeak tts = TextToSpeak.getInstance(); + string text = String.Format(s.getSpeakString(), c.DisplayName, d.Data); + string sig = text + d.Timestamp; + //MessageBox.Show(sig); + tts.speak(text, sig); + } + } + return 0; + } + + private int StatusChange(UIntPtr wParam, IntPtr lParam) + { + ContactInfo c = ContactInfo.FromHandle(wParam); + if (c.UniqueID == null) //Unknown User (maybe myself) + { + return 0; + } + Settings s = Settings.getInstance(); + if (s.hasChangedStatus(c.UniqueID.ToString(), c.Status.ToString())) + { + if (s.canStatusRead(c.UniqueID.ToString())) + { + TextToSpeak tts = TextToSpeak.getInstance(); + string text = String.Format(s.getStatusString(c.Status), c.DisplayName, c.Status.ToString()); + tts.speak(text,""); + } + } + return 0; + } + + private void option_hasUpdated(Options.EventChanged e) + { + if (e == Options.EventChanged.Engine) + { + TextToSpeak tts = TextToSpeak.getInstance(); + tts.setVoice(Options.readDBString("engine", "speak_config")); + tts.setVolume(int.Parse(Options.readDBLong("volume", "speak_config").ToString())); + tts.setRate(int.Parse(Options.readDBLong("rate", "speak_config").ToString())); + tts.setPitch(int.Parse(Options.readDBLong("pitch", "speak_config").ToString())); + } + if (e == Options.EventChanged.Active) + { + Settings s = Settings.getInstance(); + s.ReadContactList(); + } + if (e == Options.EventChanged.Announce) + { + Settings s = Settings.getInstance(); + s.SetGlobalSettings(); + } + } + + private void SpeakWelcome() + { + TextToSpeak tts = TextToSpeak.getInstance(); + tts.speak(Options.readDBString("welcome_msg", "speak_config"), "welcome" + DateTime.Now); + } + + private void RegisterUpdate() + { + try + { + Update update = new Update(this, new Uri(this.HomePage.ToString() + "files/miranda/speak_last.zip"), new Uri(this.HomePage.ToString() + "files/miranda/speak_updater_version.txt"), " "); + UpdaterPlugin.RegisterForUpdate(update); + } + catch (NotSupportedException) { } + } + + #region Constants + /// + /// Get Version + /// + private static Version VERSION = new Version(0, 8, 0, 0); + + /// + /// Get Author + /// + public override string Author + { + get { return "BlubbFish"; } + } + + /// + /// Get Description + /// + public override string Description + { + get { return ".NET Speak Provider"; } + } + + /// + /// Get HasOptions + /// + public override bool HasOptions + { + get { return false; } + } + + /// + /// Get Hompage + /// + public override Uri HomePage + { + get { return new Uri("http://dev.blubbfish.net"); } + } + + /// + /// Get Name + /// + public override string Name + { + get { return "Speak"; } + } + + /// + /// Get Version + /// + public override Version Version + { + get { return VERSION; } + } + + /// + /// Get AutorEmail + /// + public override string AuthorEmail + { + get { return "dev@blubbfish.net"; } + } + + /// + /// Get Copyright String + /// + public override string Copyright + { + get { return "2013 © BlubbFish"; } + } + + /// + /// Get GUID PrluginInterfaces + /// + public override Guid[] PluginInterfaces + { + get { return new Guid[] { uuid }; } + } + + /// + /// Get ReplaceDefaultModule + /// + public override int ReplacesDefaultModule + { + get { return 0; } + } + + /// + /// Get GUID + /// + public override Guid UUID + { + get { return uuid; } + } + + private static readonly Guid uuid = new Guid("65BC8980-1028-40A4-A52F-440C48035E02"); + #endregion + } +} diff --git a/Speak/Speak/Opt/Options.cs b/Speak/Speak/Opt/Options.cs new file mode 100644 index 0000000..19dd631 --- /dev/null +++ b/Speak/Speak/Opt/Options.cs @@ -0,0 +1,967 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Resources; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using System.Collections.ObjectModel; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Virtuoso.Miranda.Plugins.Native; +//using xJuick.Core; +//using xJuick.Fork; +using Speak.Interop; +using Speak.Structs; +//using xJuick.UI; +using Speak.Utils; +using Speak.TTS; +//using ISite = xJuick.Sites.ISite; + + +namespace Speak.Opt +{ + internal class Options + { + #region Menu Constants + private const Int32 IDD_SPEAK_OPTIONS_DIALOG = 666; + private const Int32 IDD_ANNOUNCE_OPTIONS_DIALOG = 667; + private const Int32 IDD_ENGINE_OPTIONS_DIALOG = 668; + + private const Int32 IDC_SPEAK_LIST = 1079; + private const Int32 IDC_SPEAK_VISIBLEICON = 1204; + private const Int32 IDC_SPEAK_INVISIBLEICON = 1205; + + private const Int32 IDI_ANNOUNCE_OFFLINE = 1002; + private const Int32 IDI_ANNOUNCE_ONLINE = 1025; + private const Int32 IDI_ANNOUNCE_AWAY = 1024; + private const Int32 IDI_ANNOUNCE_DND = 1019; + private const Int32 IDI_ANNOUNCE_NA = 1026; + private const Int32 IDI_ANNOUNCE_OCCUPIED = 1027; + private const Int32 IDI_ANNOUNCE_FREEFORCHAT = 1028; + private const Int32 IDI_ANNOUNCE_INVISIBLE = 1029; + private const Int32 IDI_ANNOUNCE_CONNECT = 1030; + private const Int32 IDI_ANNOUNCE_DISCONNECT = 1031; + private const Int32 IDI_ANNOUNCE_SHUTDOWN = 1032; + private const Int32 IDI_ANNOUNCE_ACTIVE = 1033; + private const Int32 IDI_ANNOUNCE_ONOPEN = 1034; + private const Int32 IDI_ANNOUNCE_ONFOCUS = 1035; + private const Int32 IDI_ANNOUNCE_LENGTH = 1011; + + private const Int32 IDI_ENGINE_VOICES = 1001; + private const Int32 IDI_ENGINE_VOLUME = 1000; + private const Int32 IDI_ENGINE_RATE = 1002; + private const Int32 IDI_ENGINE_PITCH = 1003; + private const Int32 IDI_ENGINE_WELCOME = 1011; + private const Int32 IDI_ENGINE_TEST = 1006; + #endregion + + private bool initset = true; + private Delegate dlgProcSpeak; + private Delegate dlgProcAnnounce; + private Delegate dlgProcEngine; + private int hItemUnkSpeak; + private static Win32ImageList imagelistSpeak; + + /// + /// Enum of the Events + /// + public enum EventChanged + { + /// + /// When A Usercontact has Changed + /// + Active, + /// + /// When the Global Settings Changed + /// + Announce, + /// + /// When the Engine Settings Changed + /// + Engine, + /// + /// No Events has Raised + /// + None + } + + /// + /// Delegate an Event of Changed + /// + /// Eventtype + public delegate void ChangedEventHandler(EventChanged e); + + /// + /// Raises When Settings was Changed + /// + public event ChangedEventHandler Changed; + + /// + /// Internal Raising for Event + /// + /// + protected virtual void OnChanged(EventChanged e) + { + if (Changed != null) + Changed(e); + } + + /// + /// The Option Class that Handles the Optionsdialog + /// + public Options() + { + initImageLists(); + } + + private void initImageLists() + { + imagelistSpeak = createImageList(new List() { StandartIcons.SKINICON_OTHER_SMALLDOT, StandartIcons.SKINICON_EVENT_MESSAGE, StandartIcons.ID_STATUS_ONLINE }); + } + + private Win32ImageList createImageList(List list) + { + list.Sort(); + Win32ImageList imageList = new Win32ImageList(); + for (int i = 0, iconCount = list.Count; i < iconCount; i++) + { + imageList.AddIcon(list[i], IconTable.GetDefaultIcon(list[i])); + } + return imageList; + } + + /// + /// Here you Can Connect your Options + /// + /// Miranda Handle + /// + /// 0 + public int Opts(UIntPtr wparam, IntPtr lparam) + { + initset = !initset; + if (initset) + return 0; + + #region Active Status Page + dlgProcSpeak = new Win32WndProc(WndProcSpeak); + OptionsDialogPage odpspeak = new OptionsDialogPage(); + odpspeak.szTitle = Marshal.StringToHGlobalAnsi("Active Modes"); + odpspeak.cbSize = Marshal.SizeOf(odpspeak); + odpspeak.position = 0; + odpspeak.pszTemplate = new IntPtr((UInt32)((short)IDD_SPEAK_OPTIONS_DIALOG)); + odpspeak.pfnDlgProc = Marshal.GetFunctionPointerForDelegate(dlgProcSpeak); + odpspeak.szGroup = Marshal.StringToHGlobalAnsi("Speak"); + odpspeak.groupPosition = 100; + odpspeak.hGroupIcon = IntPtr.Zero; + odpspeak.flags = MainConstants.ODPF_BOLDGROUPS; + odpspeak.hInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]); + IntPtr cmdPtrSpeak = Marshal.AllocHGlobal(Marshal.SizeOf(odpspeak)); + Marshal.StructureToPtr(odpspeak, cmdPtrSpeak, false); + MirandaContext.Current.CallService(API.MS_OPT_ADDPAGE, wparam, cmdPtrSpeak); + #endregion + + #region Announce Page + dlgProcAnnounce = new Win32WndProc(WndProcAnnounce); + OptionsDialogPage odpannounce = new OptionsDialogPage(); + odpannounce.szTitle = Marshal.StringToHGlobalAnsi("Announce"); + odpannounce.cbSize = Marshal.SizeOf(odpannounce); + odpannounce.position = 0; + odpannounce.pszTemplate = new IntPtr((UInt32)((short)IDD_ANNOUNCE_OPTIONS_DIALOG)); + odpannounce.pfnDlgProc = Marshal.GetFunctionPointerForDelegate(dlgProcAnnounce); + odpannounce.szGroup = Marshal.StringToHGlobalAnsi("Speak"); + odpannounce.groupPosition = 101; + odpannounce.hGroupIcon = IntPtr.Zero; + odpannounce.flags = MainConstants.ODPF_BOLDGROUPS; + odpannounce.hInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]); + IntPtr cmdPtrAnnounce = Marshal.AllocHGlobal(Marshal.SizeOf(odpannounce)); + Marshal.StructureToPtr(odpannounce, cmdPtrAnnounce, false); + MirandaContext.Current.CallService(API.MS_OPT_ADDPAGE, wparam, cmdPtrAnnounce); + #endregion + + #region Engine/Voice Page + dlgProcEngine = new Win32WndProc(WndProcEngine); + OptionsDialogPage odpengine = new OptionsDialogPage(); + odpengine.szTitle = Marshal.StringToHGlobalAnsi("Engine/Voice"); + odpengine.cbSize = Marshal.SizeOf(odpengine); + odpengine.position = 0; + odpengine.pszTemplate = new IntPtr((UInt32)((short)IDD_ENGINE_OPTIONS_DIALOG)); + odpengine.pfnDlgProc = Marshal.GetFunctionPointerForDelegate(dlgProcEngine); + odpengine.szGroup = Marshal.StringToHGlobalAnsi("Speak"); + odpengine.groupPosition = 102; + odpengine.hGroupIcon = IntPtr.Zero; + odpengine.flags = MainConstants.ODPF_BOLDGROUPS; + odpengine.hInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]); + IntPtr cmdPtrEngine = Marshal.AllocHGlobal(Marshal.SizeOf(odpengine)); + Marshal.StructureToPtr(odpengine, cmdPtrEngine, false); + MirandaContext.Current.CallService(API.MS_OPT_ADDPAGE, wparam, cmdPtrEngine); + #endregion + + return 0; + } + + private int WndProcEngine(IntPtr hWnd, int Msg, int wParam, int lParam) + { + switch (Msg) + { + case WinApi.WM_INITDIALOG: + InitEngine(hWnd); + return 0; + case WinApi.WM_COMMAND: + return ProcessCommandEngine(hWnd, Util.LoWord(wParam), Util.HiWord(wParam), lParam); + case WinApi.WM_NOTIFY: + return NotifyEngine(hWnd, wParam, lParam); + } + return 0; + } + + private int NotifyEngine(IntPtr hWnd, int wParam, int lParam) + { + NMHDR lParams; + lParams = (NMHDR)Marshal.PtrToStructure((IntPtr)lParam, typeof(NMHDR)); + switch (lParams.idFrom) + { + case IDI_ENGINE_VOLUME: + case IDI_ENGINE_RATE: + case IDI_ENGINE_PITCH: + if (lParams.code == WinApi.WM_HSCROLL) + { + WinApi.SendMessage(WinApi.GetParent(hWnd), WinApi.PSM_CHANGED, 0, 0); + return 0; + } + break; + case 0: + switch (lParams.code) + { + case WinApi.PSN_APPLY: + { + writeDBstring("engine", "speak_config", GetComboText(hWnd, IDI_ENGINE_VOICES)); + + writeDBlong("volume", "speak_config", (uint)GetSlider(hWnd, IDI_ENGINE_VOLUME)); + writeDBlong("rate", "speak_config", (uint)GetSlider(hWnd, IDI_ENGINE_RATE)); + writeDBlong("pitch", "speak_config", (uint)GetSlider(hWnd, IDI_ENGINE_PITCH)); + + writeDBstring("welcome_msg", "speak_config", GetText(hWnd, IDI_ENGINE_WELCOME)); + OnChanged(EventChanged.Engine); + return 1; + } + } + break; + } + return 0; + } + + private int ProcessCommandEngine(IntPtr hwndDlg, Int16 item, Int16 command, Int32 lParam) + { + switch (item) + { + case IDI_ENGINE_TEST: + { + if (command == WinApi.BN_CLICKED) + { + TextToSpeak s = TextToSpeak.getInstance(); + s.setVoice(GetComboText(hwndDlg, IDI_ENGINE_VOICES)); + s.setVolume(GetSlider(hwndDlg, IDI_ENGINE_VOLUME)); + s.setRate(GetSlider(hwndDlg, IDI_ENGINE_RATE)); + s.setPitch(GetSlider(hwndDlg, IDI_ENGINE_PITCH)); + s.speak(GetText(hwndDlg, IDI_ENGINE_WELCOME), "test" + GetText(hwndDlg, IDI_ENGINE_WELCOME) + DateTime.Now); + } + } + break; + case IDI_ENGINE_VOICES: + { + if (command == WinApi.CBN_SELCHANGE) + { + WinApi.SendMessage(WinApi.GetParent(hwndDlg), WinApi.PSM_CHANGED, 0, 0); + return 0; + } + } + break; + case IDI_ENGINE_WELCOME: + if (command == WinApi.EN_CHANGE) + { + WinApi.SendMessage(WinApi.GetParent(hwndDlg), WinApi.PSM_CHANGED, 0, 0); + } + return 0; + } + return 0; + } + + private int GetSlider(IntPtr hwndDlg, int ID) + { + return (int)WinApi.SendDlgItemMessage(hwndDlg, ID, WinApi.TBM_GETPOS, 0, 0); + } + + private string GetComboText(IntPtr hWnd, Int32 ID) + { + int nIndex = WinApi.SendDlgItemMessage(hWnd, ID, WinApi.CB_GETCURSEL, 0, 0); + if (nIndex == -1) + return ""; + int nStrLen = WinApi.SendDlgItemMessage(hWnd, ID, WinApi.CB_GETLBTEXTLEN, nIndex, 0); + IntPtr strPtr = Marshal.AllocHGlobal(nStrLen); + WinApi.SendDlgItemMessage(hWnd, ID, WinApi.CB_GETLBTEXT, nIndex, strPtr); + return Util.GetNormalRussian(strPtr, (uint)nStrLen); ; + } + + private void InitEngine(IntPtr hWnd) + { + ClearComboBox(hWnd, IDI_ENGINE_VOICES); + SetVoices(hWnd, IDI_ENGINE_VOICES, TextToSpeak.getVoices(), readDBString("engine", "speak_config")); + + SetRateSlider(hWnd, IDI_ENGINE_VOLUME, readDBLong("volume", "speak_config")); + SetRateSlider(hWnd, IDI_ENGINE_RATE, readDBLong("rate", "speak_config")); + SetRateSlider(hWnd, IDI_ENGINE_PITCH, readDBLong("pitch", "speak_config")); + + SetText(hWnd, IDI_ENGINE_WELCOME, readDBString("welcome_msg", "speak_config")); + } + + private void SetRateSlider(IntPtr hWnd, int ID, long pos) + { + WinApi.SendDlgItemMessage(hWnd, ID, WinApi.TBM_SETRANGE, 1, WinApi.MakeLParam(1,100)); + WinApi.SendDlgItemMessage(hWnd, ID, WinApi.TBM_SETPOS, 1, int.Parse(pos.ToString())); + } + + private void SetVoices(IntPtr hWnd, int ID, List list, string standart) + { + int i = 0; + int def = -1; + foreach (string item in list) + { + if (item == standart) + def = i; + AddComboText(hWnd, ID, item); + i++; + } + WinApi.SendDlgItemMessage(hWnd, ID, WinApi.CB_SETCURSEL, def, 0); + } + + private void AddComboText(IntPtr hWnd, Int32 ID, string text) + { + int length; + IntPtr str = Util.GetStringPtr(text, out length); + WinApi.SendDlgItemMessage(hWnd, ID, WinApi.CB_ADDSTRING, 0, str); + if (str != IntPtr.Zero) + Marshal.FreeHGlobal(str); + } + + private void ClearComboBox(IntPtr hWnd, Int32 ID) + { + WinApi.SendDlgItemMessage(hWnd, ID, WinApi.CB_RESETCONTENT, 0, 0); + } + + private int WndProcAnnounce(IntPtr hWnd, int Msg, int wParam, int lParam) + { + switch (Msg) + { + case WinApi.WM_INITDIALOG: + InitAnnounce(hWnd); + return 0; + case WinApi.WM_COMMAND: + return ProcessCommandAnnounce(hWnd, Util.LoWord(wParam), Util.HiWord(wParam), lParam); + case WinApi.WM_NOTIFY: + return NotifyAnnounce(hWnd, wParam, lParam); + } + return 0; + } + + private int NotifyAnnounce(IntPtr hwndDlg, int wParam, int lParam) + { + NMHDR lParams; + lParams = (NMHDR)Marshal.PtrToStructure((IntPtr)lParam, typeof(NMHDR)); + switch (lParams.idFrom) + { + case 0: + switch (lParams.code) + { + case WinApi.PSN_APPLY: + { + writeDBBool("status_" + (int)StatusModes.Offline, "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_OFFLINE)); + writeDBBool("status_" + (int)StatusModes.Online, "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_ONLINE)); + writeDBBool("status_" + (int)StatusModes.Away, "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_AWAY)); + writeDBBool("status_" + (int)StatusModes.DND, "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_DND)); + writeDBBool("status_" + (int)StatusModes.NA, "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_NA)); + writeDBBool("status_" + (int)StatusModes.Occupied, "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_OCCUPIED)); + writeDBBool("status_" + (int)StatusModes.FreeForChat, "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_FREEFORCHAT)); + writeDBBool("status_" + (int)StatusModes.Invisible, "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_INVISIBLE)); + + writeDBBool("active_connect", "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_CONNECT)); + writeDBBool("active_disconnect", "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_DISCONNECT)); + writeDBBool("active_shutdown", "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_SHUTDOWN)); + + writeDBBool("active", "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_ACTIVE)); + writeDBBool("ignore_onopen", "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_ONOPEN)); + writeDBBool("ignore_onfocus", "speak_config", IsBtnChecked(hwndDlg, IDI_ANNOUNCE_ONFOCUS)); + + writeDBlong("max_msg_size", "speak_config", UInt32.Parse(GetText(hwndDlg, IDI_ANNOUNCE_LENGTH))); + OnChanged(EventChanged.Announce); + return 1; + } + } + break; + } + return 0; + } + + private string GetText(IntPtr hwndDlg, int ID) + { + int nStrLen = WinApi.SendDlgItemMessage(hwndDlg, ID, WinApi.WM_GETTEXTLENGTH, 0, 0); + IntPtr strPtr = Marshal.AllocHGlobal(nStrLen + 1); + WinApi.SendDlgItemMessage(hwndDlg, ID, WinApi.WM_GETTEXT, nStrLen + 1, strPtr); + return Marshal.PtrToStringAnsi(strPtr, nStrLen); + } + + private bool IsBtnChecked(IntPtr hwndDlg, Int32 ID) + { + return WinApi.SendDlgItemMessage(hwndDlg, ID, WinApi.BM_GETCHECK, 0, 0) == WinApi.BST_CHECKED; + } + + private int ProcessCommandAnnounce(IntPtr hwndDlg, Int16 item, Int16 command, Int32 lParam) + { + switch (item) + { + case IDI_ANNOUNCE_OFFLINE: + case IDI_ANNOUNCE_ONLINE: + case IDI_ANNOUNCE_AWAY: + case IDI_ANNOUNCE_DND: + case IDI_ANNOUNCE_NA: + case IDI_ANNOUNCE_OCCUPIED: + case IDI_ANNOUNCE_FREEFORCHAT: + case IDI_ANNOUNCE_INVISIBLE: + case IDI_ANNOUNCE_CONNECT: + case IDI_ANNOUNCE_DISCONNECT: + case IDI_ANNOUNCE_SHUTDOWN: + case IDI_ANNOUNCE_ACTIVE: + case IDI_ANNOUNCE_ONOPEN: + case IDI_ANNOUNCE_ONFOCUS: + WinApi.SendMessage(WinApi.GetParent(hwndDlg), WinApi.PSM_CHANGED, 0, 0); + return 0; + case IDI_ANNOUNCE_LENGTH: + if (command == WinApi.EN_CHANGE) + { + WinApi.SendMessage(WinApi.GetParent(hwndDlg), WinApi.PSM_CHANGED, 0, 0); + } + return 0; + } + return 0; + } + + private void InitAnnounce(IntPtr hWnd) + { + SetCheckState(hWnd, IDI_ANNOUNCE_OFFLINE, readDBBool("status_" + (int)StatusModes.Offline, "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_ONLINE, readDBBool("status_" + (int)StatusModes.Online, "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_AWAY, readDBBool("status_" + (int)StatusModes.Away, "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_DND, readDBBool("status_" + (int)StatusModes.DND, "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_NA, readDBBool("status_" + (int)StatusModes.NA, "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_OCCUPIED, readDBBool("status_" + (int)StatusModes.Occupied, "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_FREEFORCHAT, readDBBool("status_" + (int)StatusModes.FreeForChat, "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_INVISIBLE, readDBBool("status_" + (int)StatusModes.Invisible, "speak_config")); + + SetCheckState(hWnd, IDI_ANNOUNCE_CONNECT, readDBBool("active_connect", "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_DISCONNECT, readDBBool("active_disconnect", "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_SHUTDOWN, readDBBool("active_shutdown", "speak_config")); + + SetCheckState(hWnd, IDI_ANNOUNCE_ACTIVE, readDBBool("active", "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_ONOPEN, readDBBool("ignore_onopen", "speak_config")); + SetCheckState(hWnd, IDI_ANNOUNCE_ONFOCUS, readDBBool("ignore_onfocus", "speak_config")); + + SetText(hWnd, IDI_ANNOUNCE_LENGTH, readDBLong("max_msg_size","speak_config").ToString()); + } + + private void SetText(IntPtr hWnd, Int32 ID, string text) + { + int length; + IntPtr str = Util.GetStringPtr(text, out length); + WinApi.SendDlgItemMessage(hWnd, ID, WinApi.WM_SETTEXT, 0, Marshal.StringToHGlobalAnsi(text)); + if (str != IntPtr.Zero) + Marshal.FreeHGlobal(str); + } + + private void SetCheckState(IntPtr hWnd, Int32 ID, bool isChecked) + { + WinApi.SendDlgItemMessage(hWnd, ID, WinApi.BM_SETCHECK, isChecked ? WinApi.BST_CHECKED : WinApi.BST_UNCHECKED, 0); + } + + private int WndProcSpeak(IntPtr hWnd, int Msg, int wParam, int lParam) + { + + switch (Msg) + { + case WinApi.WM_INITDIALOG: + initImageLists(); + InitSpeakList(hWnd); + return 0; + case WinApi.WM_SETFOCUS: + WinApi.SetFocus(WinApi.GetDlgItem(hWnd, IDC_SPEAK_LIST)); + break; + case WinApi.WM_NOTIFY: + return NotifySpeak(hWnd, wParam, lParam); + case WinApi.WM_DESTROY: + DestroySpeak(hWnd); + break; + } + return 0; + } + + private int NotifySpeak(IntPtr hwndDlg, int wParam, int lParam) + { + NMHDR lParams; + lParams = (NMHDR)Marshal.PtrToStructure((IntPtr)lParam, typeof(NMHDR)); + switch (lParams.idFrom) + { + case IDC_SPEAK_LIST: + switch (lParams.code) + { + case ContactListConstants.CLN_NEWCONTACT: + case ContactListConstants.CLN_LISTREBUILT: + WinApi.SendMessage(WinApi.GetDlgItem(hwndDlg, IDC_SPEAK_LIST), ContactListConstants.CLM_AUTOREBUILD, 0, 0); + SetAllContactIcons(WinApi.GetDlgItem(hwndDlg, IDC_SPEAK_LIST), imagelistSpeak); + SetListGroupIcons(WinApi.GetDlgItem(hwndDlg, IDC_SPEAK_LIST), WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_GETNEXTITEM, ContactListConstants.CLGN_ROOT, 0), 0, imagelistSpeak, null); + break; + case ContactListConstants.CLN_OPTIONSCHANGED: + SetListGroupIcons(WinApi.GetDlgItem(hwndDlg, IDC_SPEAK_LIST), WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_GETNEXTITEM, ContactListConstants.CLGN_ROOT, 0), 0, imagelistSpeak, null); + break; + case WinApi.NM_CLICK: + { + int hItem; + NMCLISTCONTROL nm; + nm = (NMCLISTCONTROL)Marshal.PtrToStructure((IntPtr)lParam, typeof(NMCLISTCONTROL)); + int iImage; + int itemType; + // Make sure we have an extra column + if (nm.iColumn == -1) + break; + // Find clicked item + hItem = WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_HITTEST, 0, WinApi.MakeLParam(nm.pt.X, nm.pt.Y)); + // Nothing was clicked + if (hItem == 0) + break; + // Get image in clicked column (2=none, 1=online, 0=message) + iImage = WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_GETEXTRAIMAGE, hItem, WinApi.MakeLParam(nm.iColumn, 0)); + if (iImage == imagelistSpeak[StandartIcons.SKINICON_OTHER_SMALLDOT]) + { + iImage = (nm.iColumn == 0) ? imagelistSpeak[StandartIcons.ID_STATUS_ONLINE] : imagelistSpeak[StandartIcons.SKINICON_EVENT_MESSAGE]; + } + else + { + if (iImage == imagelistSpeak[StandartIcons.ID_STATUS_ONLINE] || iImage == imagelistSpeak[StandartIcons.SKINICON_EVENT_MESSAGE]) + { + iImage = imagelistSpeak[StandartIcons.SKINICON_OTHER_SMALLDOT]; + } + } + itemType = WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_GETITEMTYPE, hItem, 0); + if (itemType == ContactListConstants.CLCIT_CONTACT) + { // A contact + WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_SETEXTRAIMAGE, hItem, WinApi.MakeLParam(nm.iColumn, iImage)); + } + else if (itemType == ContactListConstants.CLCIT_INFO) + { + WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_SETEXTRAIMAGE, hItem, WinApi.MakeLParam(nm.iColumn, iImage)); + } + // Update the all/none icons + SetListGroupIcons(WinApi.GetDlgItem(hwndDlg, IDC_SPEAK_LIST), WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_GETNEXTITEM, ContactListConstants.CLGN_ROOT, 0), 0, imagelistSpeak, null); + // Activate Apply button + WinApi.SendMessage(WinApi.GetParent(hwndDlg), WinApi.PSM_CHANGED, 0, 0); + } + break; + } + break; + case 0: + switch (lParams.code) + { + case WinApi.PSN_APPLY: + { + int hContact = MirandaContext.Current.CallService(API.MS_DB_CONTACT_FINDFIRST, IntPtr.Zero, IntPtr.Zero); + do + { + int hItem = WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_FINDCONTACT, hContact, 0); + if (hItem != 0) + { + for (int i = 0; i < 2; i++) + { + int iImage = WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_GETEXTRAIMAGE, hItem, WinApi.MakeLParam(i, 0)); + if (i == 0) + { + if (iImage == imagelistSpeak[StandartIcons.ID_STATUS_ONLINE]) + { + writeDBBool("status", "speak_config", false, (IntPtr)hContact); + } + else + { + writeDBBool("status", "speak_config", true, (IntPtr)hContact); + } + } + if (i == 1) + { + if (iImage == imagelistSpeak[StandartIcons.SKINICON_EVENT_MESSAGE]) + { + writeDBBool("message", "speak_config", false, (IntPtr)hContact); + } + else + { + writeDBBool("message", "speak_config", true, (IntPtr)hContact); + } + } + } + } + } while ((hContact = MirandaContext.Current.CallService(API.MS_DB_CONTACT_FINDNEXT, (IntPtr)hContact, IntPtr.Zero)) != 0); + for (int i = 0; i < 2; i++) + { + int iImageu = WinApi.SendDlgItemMessage(hwndDlg, IDC_SPEAK_LIST, ContactListConstants.CLM_GETEXTRAIMAGE, hItemUnkSpeak, WinApi.MakeLParam(i, 0)); + if (i == 0) + { + if (iImageu == imagelistSpeak[StandartIcons.ID_STATUS_ONLINE]) + { + writeDBBool("status_u", "speak_config", false); + } + else + { + writeDBBool("status_u", "speak_config", true); + } + } + if (i == 1) + { + if (iImageu == imagelistSpeak[StandartIcons.SKINICON_EVENT_MESSAGE]) + { + writeDBBool("message_u", "speak_config", false); + } + else + { + writeDBBool("message_u", "speak_config", true); + } + } + } + OnChanged(EventChanged.Active); + return 1; + } + } + break; + } + return 0; + } + + private void DestroySpeak(IntPtr hWnd) + { + WinApi.DestroyIcon(imagelistSpeak.GetIcon(StandartIcons.SKINICON_EVENT_MESSAGE)); + WinApi.DestroyIcon(imagelistSpeak.GetIcon(StandartIcons.ID_STATUS_ONLINE)); + { + int hIml = WinApi.SendDlgItemMessage(hWnd, IDC_SPEAK_LIST, ContactListConstants.CLM_GETEXTRAIMAGELIST, 0, 0); + WinApi.ImageList_Destroy(hIml); + } + } + + private void InitSpeakList(IntPtr handle) + { + setIcons(handle, IDC_SPEAK_LIST, imagelistSpeak); + setIcons(imagelistSpeak, StandartIcons.SKINICON_EVENT_MESSAGE, IDC_SPEAK_VISIBLEICON, handle); + setIcons(imagelistSpeak, StandartIcons.ID_STATUS_ONLINE, IDC_SPEAK_INVISIBLEICON, handle); + ResetListOptions(WinApi.GetDlgItem(handle, IDC_SPEAK_LIST)); + WinApi.SendDlgItemMessage(handle, IDC_SPEAK_LIST, ContactListConstants.CLM_SETEXTRACOLUMNS, 2, 0); + hItemUnkSpeak = addStringCList(IDC_SPEAK_LIST, "** Unknown contacts **", handle); + SetUnknownIcons(WinApi.GetDlgItem(handle, IDC_SPEAK_LIST), hItemUnkSpeak, imagelistSpeak); + SetAllContactIcons(WinApi.GetDlgItem(handle, IDC_SPEAK_LIST), imagelistSpeak); + SetListGroupIcons(WinApi.GetDlgItem(handle, IDC_SPEAK_LIST), WinApi.SendDlgItemMessage(handle, IDC_SPEAK_LIST, ContactListConstants.CLM_GETNEXTITEM, ContactListConstants.CLGN_ROOT, 0), 0, imagelistSpeak, null); + } + + private void SetUnknownIcons(IntPtr hwndList, int hItem, Win32ImageList imageList) + { + if (WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETEXTRAIMAGE, hItem, WinApi.MakeLParam(0, 0)) == 0xFF) + { + int icon = imageList[StandartIcons.SKINICON_OTHER_SMALLDOT]; + if (!readDBBool("status_u", "speak_config", true)) + { + icon = imageList[StandartIcons.ID_STATUS_ONLINE]; + } + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETEXTRAIMAGE, hItem, WinApi.MakeLParam(0, icon)); + } + if (WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETEXTRAIMAGE, hItem, WinApi.MakeLParam(1, 0)) == 0xFF) + { + int icon = imageList[StandartIcons.SKINICON_OTHER_SMALLDOT]; + if (!readDBBool("message_u", "speak_config", true)) + { + icon = imageList[StandartIcons.SKINICON_EVENT_MESSAGE]; + } + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETEXTRAIMAGE, hItem, WinApi.MakeLParam(1, icon)); + } + } + + private void SetListGroupIcons(IntPtr hwndList, int hFirstItem, int hParentItem, Win32ImageList imageList, int[] groupChildCount) + { + int[] childCount = { 0, 0 }; + int[] iconOn = { 1, 1 }; + int[] iconshow = { imageList[StandartIcons.ID_STATUS_ONLINE], imageList[StandartIcons.SKINICON_EVENT_MESSAGE] }; + int typeOfFirst = WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETITEMTYPE, hFirstItem, 0); + int hItem; + //check groups + if (typeOfFirst == ContactListConstants.CLCIT_GROUP) + { + hItem = hFirstItem; + } + else + { + hItem = WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETNEXTITEM, ContactListConstants.CLGN_NEXTGROUP, hFirstItem); + } + while (hItem != 0) + { + int hChildItem = WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETNEXTITEM, ContactListConstants.CLGN_CHILD, hItem); + if (hChildItem != 0) + { + SetListGroupIcons(hwndList, hChildItem, hItem, imageList, childCount); + } + for (int i = 0; i < iconOn.Length; i++) + { + if (iconOn[i] != 0 && WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETEXTRAIMAGE, hItem, i) != imageList[StandartIcons.SKINICON_OTHER_SMALLDOT]) + { + iconOn[i] = 0; + } + } + hItem = WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETNEXTITEM, ContactListConstants.CLGN_NEXTGROUP, hItem); + } + //check contacts + if (typeOfFirst == ContactListConstants.CLCIT_CONTACT) + { + hItem = hFirstItem; + } + else + { + hItem = WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETNEXTITEM, ContactListConstants.CLGN_NEXTCONTACT, hFirstItem); + } + while (hItem != 0) + { + for (int i = 0; i < iconOn.Length; i++) + { + int iImage = WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETEXTRAIMAGE, hItem, i); + if (iconOn[i] != 0 && iImage != imageList[StandartIcons.SKINICON_OTHER_SMALLDOT]) + { + iconOn[i] = 0; + } + if (iImage != 0xFF) + { + childCount[i]++; + } + } + hItem = WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETNEXTITEM, ContactListConstants.CLGN_NEXTCONTACT, hItem); + } + //set icons + for (int i = 0; i < iconOn.Length; i++) + { + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETEXTRAIMAGE, hParentItem, WinApi.MakeLParam(i, childCount[i] != 0 ? (iconOn[i] == 0 ? iconshow[i] : imageList[StandartIcons.SKINICON_OTHER_SMALLDOT]) : 0xFF)); + if (groupChildCount != null) + { + groupChildCount[i] += childCount[i]; + } + } + } + + private void SetAllContactIcons(IntPtr hwndList, Win32ImageList imageList) + { + WinApi.SendMessage(hwndList, ContactListConstants.CLM_AUTOREBUILD, 0, 0); + int hContact = MirandaContext.Current.CallService(API.MS_DB_CONTACT_FINDFIRST, IntPtr.Zero, IntPtr.Zero); + do + { + int hItem = WinApi.SendMessage(hwndList, ContactListConstants.CLM_FINDCONTACT, hContact, 0); + if (hItem == 0) + { + hItem = WinApi.SendMessage(hwndList, ContactListConstants.CLM_AUTOREBUILD, 0, 0); + } + else + { + if (hItem != 0) + { + int szProto = MirandaContext.Current.CallService(API.MS_PROTO_GETCONTACTBASEPROTO, (IntPtr)hItem, IntPtr.Zero); + if (szProto != 0) + { + if (WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETEXTRAIMAGE, hItem, WinApi.MakeLParam(0, 0)) == 0xFF) + { + int icon = imageList[StandartIcons.SKINICON_OTHER_SMALLDOT]; + if (!readDBBool("status", "speak_config", (IntPtr)hContact, true)) + { + icon = imageList[StandartIcons.ID_STATUS_ONLINE]; + } + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETEXTRAIMAGE, hItem, WinApi.MakeLParam(0, icon)); + } + if (WinApi.SendMessage(hwndList, ContactListConstants.CLM_GETEXTRAIMAGE, hItem, WinApi.MakeLParam(1, 0)) == 0xFF) + { + int icon = imageList[StandartIcons.SKINICON_OTHER_SMALLDOT]; + if (!readDBBool("message", "speak_config", (IntPtr)hContact, true)) + { + icon = imageList[StandartIcons.SKINICON_EVENT_MESSAGE]; + } + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETEXTRAIMAGE, hItem, WinApi.MakeLParam(1, icon)); + } + } + } + } + } while ((hContact = MirandaContext.Current.CallService(API.MS_DB_CONTACT_FINDNEXT, (IntPtr)hContact, IntPtr.Zero)) > 0); + } + + private void ResetListOptions(IntPtr hwndList) + { + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETBKBITMAP, 0, IntPtr.Zero); + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETBKCOLOR, WinApi.GetSysColor(WinApi.COLOR_WINDOW), 0); + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETGREYOUTFLAGS, 0, 0); + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETLEFTMARGIN, 2, 0); + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETINDENT, 10, 0); + for (int i = 0; i <= ContactListConstants.FONTID_MAX; i++) + { + WinApi.SendMessage(hwndList, ContactListConstants.CLM_SETTEXTCOLOR, i, WinApi.GetSysColor(WinApi.COLOR_WINDOWTEXT)); + } + WinApi.SetWindowLong(hwndList, WinApi.GWL_STYLE, WinApi.GetWindowLong(hwndList, WinApi.GWL_STYLE) | ContactListConstants.CLS_SHOWHIDDEN); + } + + private void setIcons(IntPtr handle, int IDC_LIST, Win32ImageList imageList) + { + WinApi.SendDlgItemMessage(handle, IDC_LIST, ContactListConstants.CLM_SETEXTRAIMAGELIST, 0, imageList.Handle); + } + + private void setIcons(Win32ImageList imageList, string iconKey, int ID, IntPtr handle) + { + WinApi.SendDlgItemMessage(handle, ID, WinApi.STM_SETICON, imageList.GetIcon(iconKey), 0); + } + + private int addStringCList(Int32 ID, string text, IntPtr handle) + { + int length; + IntPtr str = Util.GetStringPtr(text, out length); + CLCINFOITEM cii = new CLCINFOITEM(); + cii.cbSize = Marshal.SizeOf(cii); + cii.flags = ContactListConstants.CLCIIF_GROUPFONT; + cii.pszText = Marshal.StringToHGlobalUni(text); + IntPtr cmdPtr = Marshal.AllocHGlobal(Marshal.SizeOf(cii)); + Marshal.StructureToPtr(cii, cmdPtr, false); + int ret = WinApi.SendDlgItemMessage(handle, ID, ContactListConstants.CLM_ADDINFOITEM, 0, cmdPtr); + if (str != IntPtr.Zero) + Marshal.FreeHGlobal(str); + return ret; + } + + /// + /// Read a boolean value from Miranda Databse + /// + /// Name + /// Module + public static bool readDBBool(string name, string owner) + { + return readDBBool(name, owner, false); + } + + /// + /// Read a boolean value from Mirana Database and if it not Present use standart + /// + /// Name + /// Module + /// Default Value + public static bool readDBBool(string name, string owner, bool standart) + { + return readDBBool(name, owner, IntPtr.Zero, standart); + } + + /// + /// Read a value from Miranda Databse from specefic user and use a default value if not present + /// + /// Name + /// Module + /// Default value + /// Userhandle + /// + public static bool readDBBool(string name, string owner, IntPtr contact, bool standart) + { + object value = ContactInfo.FromHandle(contact).ReadSetting(name, owner, DatabaseSettingType.Byte); + if (value != null) + { + if ((byte)value == 1) + { + return true; + } + else + { + return false; + } + } + return standart; + } + + /// + /// Read a value from Miranda Database + /// + /// Name + /// Module + /// Return 0 if not present + public static long readDBLong(string name, string owner) + { + object value = ContactInfo.ReadSetting(IntPtr.Zero, name, owner, DatabaseSettingType.UInt32); + if (value != null) + { + return (UInt32)value; + } + return 0; + } + + /// + /// Read a value from Miranda Databse + /// + /// Name + /// Module + /// Returns an empty String if not presend + public static string readDBString(string name, string owner) + { + object value = ContactInfo.ReadSetting(IntPtr.Zero, name, owner, DatabaseSettingType.AsciiString); + if (value != null) + { + return (string)value; + } + return ""; + } + + /// + /// Write a boolean value into Miranda Databse + /// + /// Name + /// Module + /// Value + public static bool writeDBBool(string name, string owner, bool value) + { + writeDBBool(name, owner, value, IntPtr.Zero); + return readDBBool(name, owner) == value; + } + + /// + /// Write a boolean value into Miranda Database for specific user + /// + /// Name + /// Module + /// Value + /// User handle + public static bool writeDBBool(string name, string owner, bool value, IntPtr contact) + { + byte v = (value) ? (byte)1 : (byte)0; + ContactInfo.FromHandle(contact).WriteSetting(name, owner, v, DatabaseSettingType.Byte); + return readDBBool(name, owner, contact, false) == value; + } + + /// + /// Write a long value into Miranda Databse + /// + /// Name + /// Module + /// long value + public static bool writeDBlong(string name, string owner, uint value) + { + ContactInfo.FromHandle(IntPtr.Zero).WriteSetting(name, owner, (UInt32)value, DatabaseSettingType.UInt32); + return readDBLong(name, owner) == value; + } + + /// + /// Write a string value into Miranda Databse + /// + /// Name + /// Module + /// string value + public static bool writeDBstring(string name, string owner, string value) + { + ContactInfo.FromHandle(IntPtr.Zero).WriteSetting(name, owner, (string)value, DatabaseSettingType.AsciiString); + return readDBString(name, owner) == value; + } + } +} diff --git a/Speak/Speak/Opt/Win32ImageList.cs b/Speak/Speak/Opt/Win32ImageList.cs new file mode 100644 index 0000000..09d3639 --- /dev/null +++ b/Speak/Speak/Opt/Win32ImageList.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using Speak.Interop; + +namespace Speak.Opt +{ + internal class Win32ImageList + { + private IntPtr handle; + private Dictionary icons; + private int defaultIndex; + private string defaultName; + + public Win32ImageList() : this (16, 16, 0) { } + + public Win32ImageList(int width, int height, int count) + { + handle = WinApi.ImageList_Create(width, height, WinApi.ILC_MASK | WinApi.ILC_COLOR32, count, 0); + icons = new Dictionary(); + defaultIndex = -1; + defaultName = "xJuick_Default"; + } + + public int AddIcon(string iconKey, IntPtr hIcon) + { + int result = -1; + if (icons.ContainsKey(iconKey)) + return icons[iconKey]; + result = WinApi.ImageList_ReplaceIcon(handle, -1, hIcon); + + if (result != -1) + { + icons.Add(iconKey, result); + if (defaultName.Equals(iconKey)) + defaultIndex = result; + } + + + return result; + } + + public IntPtr Handle + { + get { return handle; } + } + + public int this[string iconKey] + { + get { return icons.ContainsKey(iconKey) ? icons[iconKey] : defaultIndex; } + } + + public int Length + { + get { return icons.Count; } + } + public int GetIcon(string iconKey) + { + int icon = this.icons[iconKey]; + return WinApi.ImageList_GetIcon(handle, icon, WinApi.ILD_NORMAL); + } + } +} diff --git a/Speak/Speak/Opt/dialog.res b/Speak/Speak/Opt/dialog.res new file mode 100644 index 0000000000000000000000000000000000000000..cf2915767b7364fecb4b5eb405195f2264966aa7 GIT binary patch literal 59368 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 Ryo^vH6@Q+{||M-m7f3r literal 0 HcmV?d00001 diff --git a/Speak/Speak/Properties/AssemblyInfo.cs b/Speak/Speak/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..cb4680c --- /dev/null +++ b/Speak/Speak/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("Speak")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Speak")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("8661d35b-6865-4e4e-a32b-feb32a681897")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Speak/Speak/Properties/Resources.Designer.cs b/Speak/Speak/Properties/Resources.Designer.cs new file mode 100644 index 0000000..cb8b8f9 --- /dev/null +++ b/Speak/Speak/Properties/Resources.Designer.cs @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.18033 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace Speak.Properties { + using System; + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Speak.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + internal static System.Drawing.Icon icon_message { + get { + object obj = ResourceManager.GetObject("icon_message", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + internal static System.Drawing.Icon icon_small_dot { + get { + object obj = ResourceManager.GetObject("icon_small_dot", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + internal static System.Drawing.Icon status_online { + get { + object obj = ResourceManager.GetObject("status_online", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + } +} diff --git a/Speak/Speak/Properties/Resources.resx b/Speak/Speak/Properties/Resources.resx new file mode 100644 index 0000000..1f1cd23 --- /dev/null +++ b/Speak/Speak/Properties/Resources.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\icon_message.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icon_small_dot.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\status_online.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Speak/Speak/Resources/icon_message.ico b/Speak/Speak/Resources/icon_message.ico new file mode 100644 index 0000000000000000000000000000000000000000..6ec8d7301d3e9650bb2ae9beb987b63948e9ea7b GIT binary patch literal 6830 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 literal 0 HcmV?d00001 diff --git a/Speak/Speak/RichEdit/ActionOleObject.cs b/Speak/Speak/RichEdit/ActionOleObject.cs new file mode 100644 index 0000000..f2c6ba0 --- /dev/null +++ b/Speak/Speak/RichEdit/ActionOleObject.cs @@ -0,0 +1,349 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Security.Permissions; +using System.Text; +using System.Windows.Forms; +using System.Runtime.InteropServices; +using Speak.Core; +using Speak.Interop; +using Speak.Structs; +using Speak.UI; + +namespace Speak.RichEdit +{ + [Guid("49b0db79-a3d5-494f-be22-544286053dd9")] + internal class ActionOleObject : Control, IActionOleObject, IActionOleGUID + { + protected Color normalBackColor; + protected Color hoverBackColor; + protected Color hoverForeColor; + protected Color borderColor; + + protected bool pressed; + protected bool onControl; + protected bool isTailObjectSet; + protected string text; + protected int iconWidth; + protected int iconHeight; + protected Size textSize; + + protected TextFormatFlags textFormat; + protected HoverPart currentHover; + protected ActionWordType actionType; + protected ActionObjectType objectType; + + protected enum HoverPart { None, MainWord, Icon } + public static readonly Guid Guid = new Guid("49b0db79-a3d5-494f-be22-544286053dd9"); + + public ActionOleObject() + { + //SetStyle(ControlStyles.SupportsTransparentBackColor, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.UserPaint, true); + + currentHover = HoverPart.None; + iconWidth = Properties.Resources.icon_small_dot.Width; + iconHeight = Properties.Resources.icon_small_dot.Height; + + Width = 18; + Height = 18; + + normalBackColor = Color.Green; + hoverBackColor = Color.White; + hoverForeColor = Color.Black; + borderColor = Color.Black; + BackColor = normalBackColor; + + text = String.Empty; + Text = ""; + + textFormat = new TextFormatFlags(); + textFormat |= TextFormatFlags.Default ; + + onControl = false; + actionType = ActionWordType.None; + objectType = ActionObjectType.Default; + } + + private void DoResize() + { + textSize = TextRenderer.MeasureText(Text, Font, Size, TextFormatFlags.Default); + Size = new Size(textSize.Width + iconWidth, iconHeight > textSize.Height ? iconHeight : textSize.Height); + } + + protected override void OnPaint(PaintEventArgs e) + { + Graphics g = e.Graphics; + TextRenderer.DrawText( + g, Text, Font, + onControl ? new Point(1, (Height - textSize.Height) / 2) : new Point(1, Height - textSize.Height), + onControl ? hoverForeColor : ForeColor, TextFormatFlags.Default); + + + /*using (Bitmap bm = Properties.Resources.power) + { + g.DrawImage(bm, Width - iconWidth, (Height - iconHeight) / 2 + 1); + } */ + } + + protected override void OnPaintBackground(PaintEventArgs pevent) + { + Graphics g = pevent.Graphics; + Rectangle clip = pevent.ClipRectangle; + Rectangle activePart; + + switch (currentHover) + { + case HoverPart.None: + base.OnPaintBackground(new PaintEventArgs(g, clip)); + return; + case HoverPart.MainWord: + activePart = new Rectangle(0, 0, textSize.Width, Height - 1); + break; + case HoverPart.Icon: + activePart = new Rectangle(textSize.Width, 0, iconWidth - 1, Height - 1); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + using (SolidBrush b = new SolidBrush(BackColor)) + { + g.FillRectangle(b, activePart); + } + + using (Pen p = new Pen(borderColor, 1.0f)) + { + g.DrawRectangle(p, activePart); + } + + Rectangle border = new Rectangle(clip.Location, new Size(clip.Width - 1, clip.Height - 1)); + using (Pen p = new Pen(borderColor, 1.0f)) + { + g.DrawRectangle(p, border); + } + } + + private void SetHoverPart(int x, int y) + { + if (x > Left + (Width - iconWidth)) + { + currentHover = HoverPart.Icon; + } + else + { + currentHover = HoverPart.MainWord; + } + } + + new private void Click(IntPtr richEditHwnd, Int32 topOffset) + { + switch (currentHover) + { + case HoverPart.None: + break; + case HoverPart.MainWord: + InvokeAction(text, Point.Empty); + break; + case HoverPart.Icon: + + POINT pt = new POINT(Left, Top); + WinApi.ClientToScreen(richEditHwnd, ref pt); + + InvokeAction(text, new Point(pt.X - Left + Width - iconWidth - (topOffset == Int32.MinValue ? 3 : -1), (topOffset != Int32.MinValue ? topOffset : 0) + pt.Y - Top - 7)); + break; + } + } + + public event EventHandler ActionClicked; + private void InvokeAction(string action, Point menuLocation) + { + EventHandler handler = ActionClicked; + if (handler != null) handler(this, new ActionObjectClickEvent(action, actionType, menuLocation)); + } + + public Guid GUID + { + get { return Guid; } + } + + #region Implementation of IActionOleObject + + public bool IsTailObjectSet + { + get { return isTailObjectSet; } + set { isTailObjectSet = value; } + } + + public ActionObjectType ObjectType + { + get { return objectType; } + set { objectType = value; } + } + + public ActionWordType ActionType + { + get { return actionType; } + set { actionType = value; } + } + + new public int Bottom + { + set { Top = value - Height; } + get { return base.Bottom; } + } + + public void SetLMBDownState() + { + pressed = true; + } + + public void SetLMBUpState(IntPtr hwnd, Int32 topOffset) + { + if (pressed) + { + pressed = false; + Click(hwnd, topOffset); + } + } + + public void MouseMoving(int x, int y) + { + bool isHover = HitTest(x, y); + + if (isHover) + { + HoverPart oldHP = currentHover; + SetHoverPart(x, y); + if (!onControl) + { + BackColor = hoverBackColor; + onControl = true; + Invalidate(); + } + else if (oldHP != currentHover) + { + Invalidate(); + } + Cursor.Current = Cursors.Hand; + } + else + { + if (onControl) + { + currentHover = HoverPart.None; + BackColor = normalBackColor; + onControl = false; + pressed = false; + Invalidate(); + return; + } + } + + } + + new protected virtual void Invalidate() + { + base.Invalidate(); + } + + public bool HitTest(int x, int y) + { + return x >= Left && x < (Left+Width) && y >= Top && y < base.Bottom; + } + + public Color BgColor + { + get { return normalBackColor; } + set + { + if (value != normalBackColor) + { + BackColor = normalBackColor = value; + } + } + } + + new public string Text + { + get { return text; } + set + { + base.Text = value; + if (!text.Equals(value)) + { + text = value; + DoResize(); + } + } + } + + #endregion + + } + + internal enum ActionObjectType + { + Default, + Nick, + FirstNick + } + + internal class ActionObjectClickEvent : EventArgs + { + private string actionText; + private Point menuLocation; + private ActionWordType actionType; + + public ActionObjectClickEvent(string actionText, ActionWordType actionType, Point menuLocation) + { + this.actionText = actionText; + this.menuLocation = menuLocation; + this.actionType = actionType; + } + + public string ActionText + { + get { return actionText; } + set { actionText = value; } + } + + public Point MenuLocation + { + get { return menuLocation; } + set { menuLocation = value; } + } + + public ActionWordType ActionType + { + get { return actionType; } + set { actionType = value; } + } + } + + [Guid("3289a6c9-b670-4840-b297-733372ab26b5")] + internal interface IActionOleObject + { + string Text { get; set; } + int Width { get; } + int Height { get; } + int Left { get; set; } + int Bottom { set; } + ActionObjectType ObjectType { get; set; } + bool IsTailObjectSet { get; set; } + bool HitTest(int x, int y); + void MouseMoving(int x, int y); + Color BgColor { get; set; } + void SetLMBDownState(); + void SetLMBUpState(IntPtr richEditHwnd, Int32 topOffset); + + ActionWordType ActionType { get; set; } + } + + internal interface IActionOleGUID + { + Guid GUID { get; } + } +} diff --git a/Speak/Speak/RichEdit/AvatarObject.cs b/Speak/Speak/RichEdit/AvatarObject.cs new file mode 100644 index 0000000..c13d1d5 --- /dev/null +++ b/Speak/Speak/RichEdit/AvatarObject.cs @@ -0,0 +1,75 @@ +using System; +using System.Drawing; +using System.IO; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Speak.Core; + +namespace Speak.RichEdit +{ + [Guid("a2c9c6c9-aa99-46bd-9f67-c3a8b38c5da2")] + internal class AvatarObject : Control, IActionOleGUID, IDisposable + { + protected Image image; + public static readonly Guid Guid = new Guid("a2c9c6c9-aa99-46bd-9f67-c3a8b38c5da2"); + + public AvatarObject(AvatarProcessor ap, string nick, Color bgColor) + { + SetStyle(ControlStyles.DoubleBuffer, true); + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + BackColor = bgColor; + string imagePath = ap.GetUserAvatar(nick, AvatarCallback); + if (!String.IsNullOrEmpty(imagePath)) + { + try + { + image = Image.FromFile(imagePath); + } + catch (Exception) + { + File.Delete(imagePath); + } + } + + Width = Height = 32; + } + + public virtual void AvatarCallback(string userName, string avatarPath) + { + image = Image.FromFile(avatarPath); + Invalidate(); + } + + protected override void OnPaint(PaintEventArgs e) + { + if (image != null) + { + e.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; + e.Graphics.DrawImage(image, 0, 0, Width, Height); + } + else + { + base.OnPaint(e); + } + } + + new protected virtual void Invalidate() + { + base.Invalidate(); + } + + public Guid GUID + { + get { return Guid; } + } + + new public void Dispose() + { + image = null; + base.Dispose(); + } + } +} diff --git a/Speak/Speak/RichEdit/IRichEditOle.cs b/Speak/Speak/RichEdit/IRichEditOle.cs new file mode 100644 index 0000000..36268a1 --- /dev/null +++ b/Speak/Speak/RichEdit/IRichEditOle.cs @@ -0,0 +1,927 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Text; + +namespace Speak.RichEdit +{ + [Flags(), ComVisible(false)] + public enum STGM : int + { + STGM_DIRECT = 0x0, + STGM_TRANSACTED = 0x10000, + STGM_SIMPLE = 0x8000000, + STGM_READ = 0x0, + STGM_WRITE = 0x1, + STGM_READWRITE = 0x2, + STGM_SHARE_DENY_NONE = 0x40, + STGM_SHARE_DENY_READ = 0x30, + STGM_SHARE_DENY_WRITE = 0x20, + STGM_SHARE_EXCLUSIVE = 0x10, + STGM_PRIORITY = 0x40000, + STGM_DELETEONRELEASE = 0x4000000, + STGM_NOSCRATCH = 0x100000, + STGM_CREATE = 0x1000, + STGM_CONVERT = 0x20000, + STGM_FAILIFTHERE = 0x0, + STGM_NOSNAPSHOT = 0x200000, + } + + // DVASPECT + [Flags(), ComVisible(false)] + public enum DVASPECT : int + { + DVASPECT_CONTENT = 1, + DVASPECT_THUMBNAIL = 2, + DVASPECT_ICON = 4, + DVASPECT_DOCPRINT = 8, + DVASPECT_OPAQUE = 16, + DVASPECT_TRANSPARENT = 32, + } + + // CLIPFORMAT + [ComVisible(false)] + public enum CLIPFORMAT : int + { + CF_TEXT = 1, + CF_BITMAP = 2, + CF_METAFILEPICT = 3, + CF_SYLK = 4, + CF_DIF = 5, + CF_TIFF = 6, + CF_OEMTEXT = 7, + CF_DIB = 8, + CF_PALETTE = 9, + CF_PENDATA = 10, + CF_RIFF = 11, + CF_WAVE = 12, + CF_UNICODETEXT = 13, + CF_ENHMETAFILE = 14, + CF_HDROP = 15, + CF_LOCALE = 16, + CF_MAX = 17, + CF_OWNERDISPLAY = 0x80, + CF_DSPTEXT = 0x81, + CF_DSPBITMAP = 0x82, + CF_DSPMETAFILEPICT = 0x83, + CF_DSPENHMETAFILE = 0x8E, + } + + // Object flags + [Flags(), ComVisible(false)] + public enum REOOBJECTFLAGS : uint + { + REO_NULL = 0x00000000, // No flags + REO_READWRITEMASK = 0x0000003F, // Mask out RO bits + REO_DONTNEEDPALETTE = 0x00000020, // Object doesn't need palette + REO_BLANK = 0x00000010, // Object is blank + REO_DYNAMICSIZE = 0x00000008, // Object defines size always + REO_INVERTEDSELECT = 0x00000004, // Object drawn all inverted if sel + REO_BELOWBASELINE = 0x00000002, // Object sits below the baseline + REO_RESIZABLE = 0x00000001, // Object may be resized + REO_LINK = 0x80000000, // Object is a link (RO) + REO_STATIC = 0x40000000, // Object is static (RO) + REO_SELECTED = 0x08000000, // Object selected (RO) + REO_OPEN = 0x04000000, // Object open in its server (RO) + REO_INPLACEACTIVE = 0x02000000, // Object in place active (RO) + REO_HILITED = 0x01000000, // Object is to be hilited (RO) + REO_LINKAVAILABLE = 0x00800000, // Link believed available (RO) + REO_GETMETAFILE = 0x00400000 // Object requires metafile (RO) + } + + // OLERENDER + [ComVisible(false)] + public enum OLERENDER : int + { + OLERENDER_NONE = 0, + OLERENDER_DRAW = 1, + OLERENDER_FORMAT = 2, + OLERENDER_ASIS = 3, + } + + // TYMED + [Flags(), ComVisible(false)] + public enum TYMED : int + { + TYMED_NULL = 0, + TYMED_HGLOBAL = 1, + TYMED_FILE = 2, + TYMED_ISTREAM = 4, + TYMED_ISTORAGE = 8, + TYMED_GDI = 16, + TYMED_MFPICT = 32, + TYMED_ENHMF = 64, + } + + [StructLayout(LayoutKind.Sequential), ComVisible(false)] + public struct FORMATETC + { + public CLIPFORMAT cfFormat; + public IntPtr ptd; + public DVASPECT dwAspect; + public int lindex; + public TYMED tymed; + } + + [StructLayout(LayoutKind.Sequential), ComVisible(false)] + public struct STGMEDIUM + { + //[MarshalAs(UnmanagedType.I4)] + public int tymed; + public IntPtr unionmember; + public IntPtr pUnkForRelease; + } + + [ComVisible(true), + ComImport(), + Guid("00000103-0000-0000-C000-000000000046"), + InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + public interface IEnumFORMATETC + { + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int Next( + [In, MarshalAs(UnmanagedType.U4)] + int celt, + [Out] + FORMATETC rgelt, + [In, Out, MarshalAs(UnmanagedType.LPArray)] + int[] pceltFetched); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int Skip( + [In, MarshalAs(UnmanagedType.U4)] + int celt); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int Reset(); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int Clone( + [Out, MarshalAs(UnmanagedType.LPArray)] + IEnumFORMATETC[] ppenum); + } + + [ComVisible(true), StructLayout(LayoutKind.Sequential)] + public class COMRECT + { + public int left; + public int top; + public int right; + public int bottom; + + public COMRECT() + { + } + + public COMRECT(int left, int top, int right, int bottom) + { + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } + + public static COMRECT FromXYWH(int x, int y, int width, int height) + { + return new COMRECT(x, y, x + width, y + height); + } + } + + public enum GETOBJECTOPTIONS + { + REO_GETOBJ_NO_INTERFACES = 0x00000000, + REO_GETOBJ_POLEOBJ = 0x00000001, + REO_GETOBJ_PSTG = 0x00000002, + REO_GETOBJ_POLESITE = 0x00000004, + REO_GETOBJ_ALL_INTERFACES = 0x00000007, + } + + public enum GETCLIPBOARDDATAFLAGS + { + RECO_PASTE = 0, + RECO_DROP = 1, + RECO_COPY = 2, + RECO_CUT = 3, + RECO_DRAG = 4 + } + + [StructLayout(LayoutKind.Sequential)] + public struct CHARRANGE + { + public int cpMin; + public int cpMax; + } + + [StructLayout(LayoutKind.Sequential)] + public class REOBJECT + { + public int cbStruct = Marshal.SizeOf(typeof(REOBJECT)); // Size of structure + public int cp; // Character position of object + public Guid clsid; // Class ID of object + public IntPtr poleobj; // OLE object interface + public IStorage pstg; // Associated storage interface + public IOleClientSite polesite; // Associated client site interface + public Size sizel; // Size of object (may be 0,0) + public uint dvAspect; // Display aspect to use + public uint dwFlags; // Object status flags + public uint dwUser; // Dword for user's use + } + + [ComVisible(true), Guid("0000010F-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + public interface IAdviseSink + { + + //C#r: UNDONE (Field in interface) public static readonly Guid iid; + void OnDataChange( + [In] + FORMATETC pFormatetc, + [In] + STGMEDIUM pStgmed); + + void OnViewChange( + [In, MarshalAs(UnmanagedType.U4)] + int dwAspect, + [In, MarshalAs(UnmanagedType.I4)] + int lindex); + + void OnRename( + [In, MarshalAs(UnmanagedType.Interface)] + object pmk); + + void OnSave(); + + + void OnClose(); + } + + [ComVisible(false), StructLayout(LayoutKind.Sequential)] + public sealed class STATDATA + { + + [MarshalAs(UnmanagedType.U4)] + public int advf; + [MarshalAs(UnmanagedType.U4)] + public int dwConnection; + + } + + [ComVisible(false), StructLayout(LayoutKind.Sequential)] + public sealed class tagOLEVERB + { + [MarshalAs(UnmanagedType.I4)] + public int lVerb; + + [MarshalAs(UnmanagedType.LPWStr)] + public String lpszVerbName; + + [MarshalAs(UnmanagedType.U4)] + public int fuFlags; + + [MarshalAs(UnmanagedType.U4)] + public int grfAttribs; + + } + + [ComVisible(true), ComImport(), Guid("00000104-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + public interface IEnumOLEVERB + { + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int Next( + [MarshalAs(UnmanagedType.U4)] + int celt, + [Out] + tagOLEVERB rgelt, + [Out, MarshalAs(UnmanagedType.LPArray)] + int[] pceltFetched); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int Skip( + [In, MarshalAs(UnmanagedType.U4)] + int celt); + + void Reset(); + + + void Clone( + out IEnumOLEVERB ppenum); + + + } + + [ComVisible(true), Guid("00000105-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + public interface IEnumSTATDATA + { + + //C#r: UNDONE (Field in interface) public static readonly Guid iid; + + void Next( + [In, MarshalAs(UnmanagedType.U4)] + int celt, + [Out] + STATDATA rgelt, + [Out, MarshalAs(UnmanagedType.LPArray)] + int[] pceltFetched); + + + void Skip( + [In, MarshalAs(UnmanagedType.U4)] + int celt); + + + void Reset(); + + + void Clone( + [Out, MarshalAs(UnmanagedType.LPArray)] + IEnumSTATDATA[] ppenum); + + + } + + [ComVisible(true), Guid("0000011B-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + public interface IOleContainer + { + + + void ParseDisplayName( + [In, MarshalAs(UnmanagedType.Interface)] object pbc, + [In, MarshalAs(UnmanagedType.BStr)] string pszDisplayName, + [Out, MarshalAs(UnmanagedType.LPArray)] int[] pchEaten, + [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppmkOut); + + + void EnumObjects( + [In, MarshalAs(UnmanagedType.U4)] int grfFlags, + [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppenum); + + + void LockContainer( + [In, MarshalAs(UnmanagedType.I4)] int fLock); + } + + [ComVisible(true), + ComImport(), + Guid("0000010E-0000-0000-C000-000000000046"), + InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + public interface IDataObject + { + [PreserveSig()] + uint GetData( + ref FORMATETC a, + ref STGMEDIUM b); + + [PreserveSig()] + uint GetDataHere( + ref FORMATETC pFormatetc, + out STGMEDIUM pMedium); + + [PreserveSig()] + uint QueryGetData( + ref FORMATETC pFormatetc); + + [PreserveSig()] + uint GetCanonicalFormatEtc( + ref FORMATETC pformatectIn, + out FORMATETC pformatetcOut); + + [PreserveSig()] + uint SetData( + ref FORMATETC pFormatectIn, + ref STGMEDIUM pmedium, + [In, MarshalAs(UnmanagedType.Bool)] + bool fRelease); + + [PreserveSig()] + uint EnumFormatEtc( + uint dwDirection, IEnumFORMATETC penum); + + [PreserveSig()] + uint DAdvise( + ref FORMATETC pFormatetc, + int advf, + [In, MarshalAs(UnmanagedType.Interface)] + IAdviseSink pAdvSink, + out uint pdwConnection); + + [PreserveSig()] + uint DUnadvise( + uint dwConnection); + + [PreserveSig()] + uint EnumDAdvise( + [Out, MarshalAs(UnmanagedType.Interface)] + out IEnumSTATDATA ppenumAdvise); + } + + [ComVisible(true), Guid("00000118-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + public interface IOleClientSite + { + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SaveObject(); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetMoniker( + [In, MarshalAs(UnmanagedType.U4)] int dwAssign, + [In, MarshalAs(UnmanagedType.U4)] int dwWhichMoniker, + [Out, MarshalAs(UnmanagedType.Interface)] out object ppmk); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetContainer([MarshalAs(UnmanagedType.Interface)] out IOleContainer container); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int ShowObject(); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int OnShowWindow( + [In, MarshalAs(UnmanagedType.I4)] int fShow); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int RequestNewObjectLayout(); + } + + [ComVisible(false), StructLayout(LayoutKind.Sequential)] + public sealed class tagLOGPALETTE + { + [MarshalAs(UnmanagedType.U2)/*leftover(offset=0, palVersion)*/] + public short palVersion; + + [MarshalAs(UnmanagedType.U2)/*leftover(offset=2, palNumEntries)*/] + public short palNumEntries; + + // UNMAPPABLE: palPalEntry: Cannot be used as a structure field. + // /** @com.structmap(UNMAPPABLE palPalEntry) */ + // public UNMAPPABLE palPalEntry; + } + + [ComVisible(true), ComImport(), Guid("00000112-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + public interface IOleObject + { + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SetClientSite( + [In, MarshalAs(UnmanagedType.Interface)] + IOleClientSite pClientSite); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetClientSite(out IOleClientSite site); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SetHostNames( + [In, MarshalAs(UnmanagedType.LPWStr)] + string szContainerApp, + [In, MarshalAs(UnmanagedType.LPWStr)] + string szContainerObj); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int Close( + [In, MarshalAs(UnmanagedType.I4)] + int dwSaveOption); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SetMoniker( + [In, MarshalAs(UnmanagedType.U4)] + int dwWhichMoniker, + [In, MarshalAs(UnmanagedType.Interface)] + object pmk); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetMoniker( + [In, MarshalAs(UnmanagedType.U4)] + int dwAssign, + [In, MarshalAs(UnmanagedType.U4)] + int dwWhichMoniker, + out object moniker); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int InitFromData( + [In, MarshalAs(UnmanagedType.Interface)] + IDataObject pDataObject, + [In, MarshalAs(UnmanagedType.I4)] + int fCreation, + [In, MarshalAs(UnmanagedType.U4)] + int dwReserved); + + int GetClipboardData( + [In, MarshalAs(UnmanagedType.U4)] + int dwReserved, + out IDataObject data); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int DoVerb( + [In, MarshalAs(UnmanagedType.I4)] + int iVerb, + [In] + IntPtr lpmsg, + [In, MarshalAs(UnmanagedType.Interface)] + IOleClientSite pActiveSite, + [In, MarshalAs(UnmanagedType.I4)] + int lindex, + [In] + IntPtr hwndParent, + [In] + COMRECT lprcPosRect); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int EnumVerbs(out IEnumOLEVERB e); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int Update(); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int IsUpToDate(); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetUserClassID( + [In, Out] + ref Guid pClsid); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetUserType( + [In, MarshalAs(UnmanagedType.U4)] + int dwFormOfType, + [Out, MarshalAs(UnmanagedType.LPWStr)] + out string userType); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SetExtent( + [In, MarshalAs(UnmanagedType.U4)] + int dwDrawAspect, + [In] + Size pSizel); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetExtent( + [In, MarshalAs(UnmanagedType.U4)] + int dwDrawAspect, + [Out] + Size pSizel); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int Advise([In, MarshalAs(UnmanagedType.Interface)] IAdviseSink pAdvSink, out int cookie); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int Unadvise([In, MarshalAs(UnmanagedType.U4)] int dwConnection); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int EnumAdvise(out IEnumSTATDATA e); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetMiscStatus([In, MarshalAs(UnmanagedType.U4)] int dwAspect, out int misc); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SetColorScheme([In] tagLOGPALETTE pLogpal); + } + + [ComImport] + [Guid("0000000d-0000-0000-C000-000000000046")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IEnumSTATSTG + { + // The user needs to allocate an STATSTG array whose size is celt. + [PreserveSig] + uint + Next( + uint celt, + [MarshalAs(UnmanagedType.LPArray), Out] + System.Runtime.InteropServices.ComTypes.STATSTG[] rgelt, + out uint pceltFetched + ); + + void Skip(uint celt); + + void Reset(); + + [return: MarshalAs(UnmanagedType.Interface)] + IEnumSTATSTG Clone(); + } + + [ComImport] + [Guid("0000000b-0000-0000-C000-000000000046")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IStorage + { + int CreateStream( + /* [string][in] */ string pwcsName, + /* [in] */ uint grfMode, + /* [in] */ uint reserved1, + /* [in] */ uint reserved2, + /* [out] */ out IStream ppstm); + + int OpenStream( + /* [string][in] */ string pwcsName, + /* [unique][in] */ IntPtr reserved1, + /* [in] */ uint grfMode, + /* [in] */ uint reserved2, + /* [out] */ out IStream ppstm); + + int CreateStorage( + /* [string][in] */ string pwcsName, + /* [in] */ uint grfMode, + /* [in] */ uint reserved1, + /* [in] */ uint reserved2, + /* [out] */ out IStorage ppstg); + + int OpenStorage( + /* [string][unique][in] */ string pwcsName, + /* [unique][in] */ IStorage pstgPriority, + /* [in] */ uint grfMode, + /* [unique][in] */ IntPtr snbExclude, + /* [in] */ uint reserved, + /* [out] */ out IStorage ppstg); + + int CopyTo( + /* [in] */ uint ciidExclude, + /* [size_is][unique][in] */ Guid rgiidExclude, + /* [unique][in] */ IntPtr snbExclude, + /* [unique][in] */ IStorage pstgDest); + + int MoveElementTo( + /* [string][in] */ string pwcsName, + /* [unique][in] */ IStorage pstgDest, + /* [string][in] */ string pwcsNewName, + /* [in] */ uint grfFlags); + + int Commit( + /* [in] */ uint grfCommitFlags); + + int Revert(); + + int EnumElements( + /* [in] */ uint reserved1, + /* [size_is][unique][in] */ IntPtr reserved2, + /* [in] */ uint reserved3, + /* [out] */ out IEnumSTATSTG ppenum); + + int DestroyElement( + /* [string][in] */ string pwcsName); + + int RenameElement( + /* [string][in] */ string pwcsOldName, + /* [string][in] */ string pwcsNewName); + + int SetElementTimes( + /* [string][unique][in] */ string pwcsName, + /* [unique][in] */ System.Runtime.InteropServices.ComTypes.FILETIME pctime, + /* [unique][in] */ System.Runtime.InteropServices.ComTypes.FILETIME patime, + /* [unique][in] */ System.Runtime.InteropServices.ComTypes.FILETIME pmtime); + + int SetClass( + /* [in] */ Guid clsid); + + int SetStateBits( + /* [in] */ uint grfStateBits, + /* [in] */ uint grfMask); + + int Stat( + /* [out] */ out System.Runtime.InteropServices.ComTypes.STATSTG pstatstg, + /* [in] */ uint grfStatFlag); + + } + + [ComImport] + [Guid("0000000a-0000-0000-C000-000000000046")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface ILockBytes + { + int ReadAt( + /* [in] */ ulong ulOffset, + /* [unique][out] */ IntPtr pv, + /* [in] */ uint cb, + /* [out] */ out IntPtr pcbRead); + + int WriteAt( + /* [in] */ ulong ulOffset, + /* [size_is][in] */ IntPtr pv, + /* [in] */ uint cb, + /* [out] */ out IntPtr pcbWritten); + + int Flush(); + + int SetSize( + /* [in] */ ulong cb); + + int LockRegion( + /* [in] */ ulong libOffset, + /* [in] */ ulong cb, + /* [in] */ uint dwLockType); + + int UnlockRegion( + /* [in] */ ulong libOffset, + /* [in] */ ulong cb, + /* [in] */ uint dwLockType); + + int Stat( + /* [out] */ out System.Runtime.InteropServices.ComTypes.STATSTG pstatstg, + /* [in] */ uint grfStatFlag); + + } + + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("0c733a30-2a1c-11ce-ade5-00aa0044773d")] + public interface ISequentialStream + { + int Read( + /* [length_is][size_is][out] */ IntPtr pv, + /* [in] */ uint cb, + /* [out] */ out uint pcbRead); + + int Write( + /* [size_is][in] */ IntPtr pv, + /* [in] */ uint cb, + /* [out] */ out uint pcbWritten); + + }; + + [ComImport] + [Guid("0000000c-0000-0000-C000-000000000046")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IStream : ISequentialStream + { + int Seek( + /* [in] */ ulong dlibMove, + /* [in] */ uint dwOrigin, + /* [out] */ out ulong plibNewPosition); + + int SetSize( + /* [in] */ ulong libNewSize); + + int CopyTo( + /* [unique][in] */ [In] IStream pstm, + /* [in] */ ulong cb, + /* [out] */ out ulong pcbRead, + /* [out] */ out ulong pcbWritten); + + int Commit( + /* [in] */ uint grfCommitFlags); + + int Revert(); + + int LockRegion( + /* [in] */ ulong libOffset, + /* [in] */ ulong cb, + /* [in] */ uint dwLockType); + + int UnlockRegion( + /* [in] */ ulong libOffset, + /* [in] */ ulong cb, + /* [in] */ uint dwLockType); + + int Stat( + /* [out] */ out System.Runtime.InteropServices.ComTypes.STATSTG pstatstg, + /* [in] */ uint grfStatFlag); + + int Clone( + /* [out] */ out IStream ppstm); + + }; + + /// + /// Definition for interface IPersist. + /// + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("0000010c-0000-0000-C000-000000000046")] + public interface IPersist + { + /// + /// getClassID + /// + /// + void GetClassID( /* [out] */ out Guid pClassID); + } + + /// + /// Definition for interface IPersistStream. + /// + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000109-0000-0000-C000-000000000046")] + public interface IPersistStream : IPersist + { + /// + /// GetClassID + /// + /// + new void GetClassID(out Guid pClassID); + /// + /// isDirty + /// + /// + [PreserveSig] + int IsDirty(); + /// + /// Load + /// + /// + void Load([In] System.Runtime.InteropServices.ComTypes.IStream pStm); + /// + /// Save + /// + /// + /// + void Save([In] System.Runtime.InteropServices.ComTypes.IStream pStm, [In, MarshalAs(UnmanagedType.Bool)] bool fClearDirty); + /// + /// GetSizeMax + /// + /// + void GetSizeMax(out long pcbSize); + } + + [ComImport(), Guid("00020D00-0000-0000-c000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IRichEditOle + { + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetClientSite(out IOleClientSite site); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetObjectCount(); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetLinkCount(); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetObject(int iob, [In, Out] REOBJECT lpreobject, [MarshalAs(UnmanagedType.U4)]GETOBJECTOPTIONS flags); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int InsertObject(REOBJECT lpreobject); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int ConvertObject(int iob, Guid rclsidNew, string lpstrUserTypeNew); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int ActivateAs(Guid rclsid, Guid rclsidAs); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SetHostNames(string lpstrContainerApp, string lpstrContainerObj); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SetLinkAvailable(int iob, bool fAvailable); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SetDvaspect(int iob, uint dvaspect); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int HandsOffStorage(int iob); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int SaveCompleted(int iob, IStorage lpstg); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int InPlaceDeactivate(); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int ContextSensitiveHelp(bool fEnterMode); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int GetClipboardData([In, Out] ref CHARRANGE lpchrg, [MarshalAs(UnmanagedType.U4)] GETCLIPBOARDDATAFLAGS reco, out IDataObject lplpdataobj); + + [return: MarshalAs(UnmanagedType.I4)] + [PreserveSig] + int ImportDataObject(IDataObject lpdataobj, int cf, IntPtr hMetaPict); + } +} diff --git a/Speak/Speak/RichEdit/ITextDocument.cs b/Speak/Speak/RichEdit/ITextDocument.cs new file mode 100644 index 0000000..a16c6b4 --- /dev/null +++ b/Speak/Speak/RichEdit/ITextDocument.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace Speak.RichEdit +{ + [ComImport] + [DefaultMember("Name")] + [SuppressUnmanagedCodeSecurity] + [Guid("8CC497C0-A1DF-11CE-8098-00AA0047BE5D")] + [TypeLibType(TypeLibTypeFlags.FDispatchable | TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible)] + internal interface ITextDocument + { + string Name { get; } + + ITextSelection Selection { get; } + + int StoryCount { get; } + + ITextStoryRanges StoryRanges { get; } + //void GetStoryRanges(ref IntPtr ppStories); + + int Saved { get; set; } + + float DefaultTabStop { get; set; } + + void New(); + + void Open([In, MarshalAs(UnmanagedType.Struct)] ref object pVar, [In] int Flags, [In] int CodePage); + + void Save([In, MarshalAs(UnmanagedType.Struct)] ref object pVar, [In] int Flags, [In] int CodePage); + + int Freeze(); + + int Unfreeze(); + + void BeginEditCollection(); + + void EndEditCollection(); + + int Undo([In] int Count); + + int Redo([In] int Count); + + ITextRange Range([In] int cp1, [In] int cp2); + + ITextRange RangeFromPoint([In] int x, [In] int y); + } +} diff --git a/Speak/Speak/RichEdit/ITextFont.cs b/Speak/Speak/RichEdit/ITextFont.cs new file mode 100644 index 0000000..0942ba0 --- /dev/null +++ b/Speak/Speak/RichEdit/ITextFont.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace Speak.RichEdit +{ + [ComImport] + [DefaultMember("Duplicate")] + [SuppressUnmanagedCodeSecurity] + [Guid("8CC497C3-A1DF-11CE-8098-00AA0047BE5D")] + [TypeLibType(TypeLibTypeFlags.FDispatchable | TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible)] + public interface ITextFont + { + ITextFont Duplicate { [return: MarshalAs(UnmanagedType.Interface)] get; set; } + + int CanChange(); + + int IsEqual([In, MarshalAs(UnmanagedType.Interface)] ITextFont pFont); + + void Reset([In] int Value); + + int Style { get; set; } + + int AllCaps { get; set; } + + int Animation { get; set; } + + int BackColor { get; set; } + + int Bold { get; set; } + + int Emboss { get; set; } + + int ForeColor { get; set; } + + int Hidden { get; set; } + + int Engrave { get; set; } + + int Italic { get; set; } + + float Kerning { get; set; } + + int LanguageID { get; set; } + + string Name { get; set; } + + int Outline { get; set; } + + float Position { get; set; } + + int Protected { get; set; } + + int Shadow { get; set; } + + float Size { get; set; } + + int SmallCaps { get; set; } + + float Spacing { get; set; } + + int StrikeThrough { get; set; } + + int Subscript { get; set; } + + int Superscript { get; set; } + + int Underline { get; set; } + + int Weight { get; set; } + } + +} diff --git a/Speak/Speak/RichEdit/ITextPara.cs b/Speak/Speak/RichEdit/ITextPara.cs new file mode 100644 index 0000000..b8d15ac --- /dev/null +++ b/Speak/Speak/RichEdit/ITextPara.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace Speak.RichEdit +{ + [ComImport] + [DefaultMember("Duplicate")] + [SuppressUnmanagedCodeSecurity] + [Guid("8CC497C4-A1DF-11CE-8098-00AA0047BE5D")] + [TypeLibType(TypeLibTypeFlags.FDispatchable | TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible)] + public interface ITextPara + { + ITextPara Duplicate { get; set; } + + int CanChange(); + + int IsEqual([In, MarshalAs(UnmanagedType.Interface)] ITextPara pPara); + + void Reset([In] int Value); + + int Style { get; set; } + + int Alignment { get; set; } + + int Hyphenation { get; set; } + + float FirstLineIndent { get; } + + int KeepTogether { get; set; } + + int KeepWithNext { get; set; } + + float LeftIndent { get; } + + float LineSpacing { get; } + + int LineSpacingRule { get; } + + int ListAlignment { get; set; } + + int ListLevelIndex { get; set; } + + int ListStart { get; set; } + + float ListTab { get; set; } + + int ListType { get; set; } + + int NoLineNumber { get; set; } + + int PageBreakBefore { get; set; } + + float RightIndent { get; set; } + + void SetIndents([In] float StartIndent, [In] float LeftIndent, [In] float RightIndent); + + void SetLineSpacing([In] int LineSpacingRule, [In] float LineSpacing); + + float SpaceAfter { get; set; } + + float SpaceBefore { get; set; } + + int WidowControl { get; set; } + + int TabCount { get; } + + void AddTab([In] float tbPos, [In] int tbAlign, [In] int tbLeader); + + void ClearAllTabs(); + + void DeleteTab([In] float tbPos); + + void GetTab([In] int iTab, out float ptbPos, out int ptbAlign, out int ptbLeader); + } + +} diff --git a/Speak/Speak/RichEdit/ITextRange.cs b/Speak/Speak/RichEdit/ITextRange.cs new file mode 100644 index 0000000..c9e6072 --- /dev/null +++ b/Speak/Speak/RichEdit/ITextRange.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace Speak.RichEdit +{ + [ComImport] + [DefaultMember("Text")] + [SuppressUnmanagedCodeSecurity] + [Guid("8CC497C2-A1DF-11CE-8098-00AA0047BE5D")] + [TypeLibType(TypeLibTypeFlags.FDispatchable | TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible)] + public interface ITextRange + { + string Text { get; set; } + + int Char { get; set; } + + ITextRange GetDuplicate(); + + ITextRange FormattedText { get; set; } + + int Start { get; set; } + + int End { get; set; } + + + ITextFont Font { get; set; } + + ITextPara Para { get; set; } + + + int StoryLength { get; } + + int StoryType { get; } + + void Collapse([In] int bStart); + + int Expand([In] int Unit); + + int GetIndex([In] int Unit); + + void SetIndex([In] int Unit, [In] int Index, [In] int Extend); + + void SetRange([In] int cpActive, [In] int cpOther); + + int InRange([In, MarshalAs(UnmanagedType.Interface)] ITextRange pRange); + + int InStory([In, MarshalAs(UnmanagedType.Interface)] ITextRange pRange); + + int IsEqual([In, MarshalAs(UnmanagedType.Interface)] ITextRange pRange); + + void Select(); + + int StartOf([In] int Unit, [In] int Extend); + + int EndOf([In] int Unit, [In] int Extend); + + int Move([In] int Unit, [In] int Count); + + int MoveStart([In] int Unit, [In] int Count); + + int MoveEnd([In] int Unit, [In] int Count); + + int MoveWhile([In, MarshalAs(UnmanagedType.Struct)] ref object Cset, [In] int Count); + + int MoveStartWhile([In, MarshalAs(UnmanagedType.Struct)] ref object Cset, [In] int Count); + + int MoveEndWhile([In, MarshalAs(UnmanagedType.Struct)] ref object Cset, [In] int Count); + + int MoveUntil([In, MarshalAs(UnmanagedType.Struct)] ref object Cset, [In] int Count); + + int MoveStartUntil([In, MarshalAs(UnmanagedType.Struct)] ref object Cset, [In] int Count); + + int MoveEndUntil([In, MarshalAs(UnmanagedType.Struct)] ref object Cset, [In] int Count); + + int FindText([In, MarshalAs(UnmanagedType.BStr)] string bstr, [In] int cch, [In] int Flags); + + int FindTextStart([In, MarshalAs(UnmanagedType.BStr)] string bstr, [In] int cch, [In] int Flags); + + int FindTextEnd([In, MarshalAs(UnmanagedType.BStr)] string bstr, [In] int cch, [In] int Flags); + + int Delete([In] int Unit, [In] int Count); + + void Cut([MarshalAs(UnmanagedType.Struct)] out object pVar); + + void Copy([MarshalAs(UnmanagedType.Struct)] out object pVar); + + void Paste([In, MarshalAs(UnmanagedType.Struct)] ref object pVar, [In] int Format); + + int CanPaste([In, MarshalAs(UnmanagedType.Struct)] ref object pVar, [In] int Format); + + int CanEdit(); + + void ChangeCase([In] int Type); + + void GetPoint([In] int Type, out int px, out int py); + + void SetPoint([In] int x, [In] int y, [In] int Type, [In] int Extend); + + void ScrollIntoView([In] int Value); + + [return: MarshalAs(UnmanagedType.IUnknown)] + object GetEmbeddedObject(); + } +} diff --git a/Speak/Speak/RichEdit/ITextSelection.cs b/Speak/Speak/RichEdit/ITextSelection.cs new file mode 100644 index 0000000..c4589d0 --- /dev/null +++ b/Speak/Speak/RichEdit/ITextSelection.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace Speak.RichEdit +{ + [ComImport] + [DefaultMember("Text")] + [SuppressUnmanagedCodeSecurity] + [Guid("8CC497C1-A1DF-11CE-8098-00AA0047BE5D")] + [TypeLibType(TypeLibTypeFlags.FDispatchable | TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible)] + public interface ITextSelection : ITextRange + { + int Flags { get; set; } + + int Type { get; } + + int MoveLeft([In] int Unit, [In] int Count, [In] int Extend); + + int MoveRight([In] int Unit, [In] int Count, [In] int Extend); + + int MoveUp([In] int Unit, [In] int Count, [In] int Extend); + + int MoveDown([In] int Unit, [In] int Count, [In] int Extend); + + int HomeKey([In] int Unit, [In] int Extend); + + int EndKey([In] int Unit, [In] int Extend); + + void TypeText([In, MarshalAs(UnmanagedType.BStr)] string bstr); + } +} diff --git a/Speak/Speak/RichEdit/ITextStoryRanges.cs b/Speak/Speak/RichEdit/ITextStoryRanges.cs new file mode 100644 index 0000000..0392008 --- /dev/null +++ b/Speak/Speak/RichEdit/ITextStoryRanges.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace Speak.RichEdit +{ + [ComImport] + [DefaultMember("Item")] + [SuppressUnmanagedCodeSecurity] + [Guid("8CC497C5-A1DF-11CE-8098-00AA0047BE5D")] + public interface ITextStoryRanges : IEnumerable + { + [return: MarshalAs(UnmanagedType.Interface)] + ITextRange Item([In] int Index); + + int Count { get; } + } +} diff --git a/Speak/Speak/RichEdit/REConstants.cs b/Speak/Speak/RichEdit/REConstants.cs new file mode 100644 index 0000000..cf21ec9 --- /dev/null +++ b/Speak/Speak/RichEdit/REConstants.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Speak.RichEdit +{ + internal static class REConstants + { + public static Int32 ErrTransparentConst = -9999997; + + public const int WM_USER = 0x0400; + public const int EM_STREAMIN = WM_USER + 73; + public const int EM_STREAMOUT = WM_USER + 74; + + public static int SF_RTF = 0x02; + public static int SF_TEXT = 0x01; + public static int SF_UNICODE = 0x010; + + public const int ES_READONLY = 0x800; + public const int ES_AUTOVSCROLL = 0x40; + + public static int SCF_SELECTION = 0x0001; + public static int SCF_WORD = 0x0002; + public static int SCF_ALL = 0x0004; + + public static UInt32 CFM_LINK = 0x00000020; + public static UInt32 CFE_LINK = 0x0020; + + public static int EM_GETLINE = 0xC4; + public static int EM_LINELENGTH = 0xC1; + public static int EM_POSFROMCHAR = 0xD6; + public static int EM_GETTEXTRANGE = 0x44; + public const int EM_GETCHARFORMAT = WM_USER + 58; + public static int EM_SETCHARFORMAT = WM_USER + 68; + public static int EM_HIDESELECTION = 0x43F; + + public const int EM_CHARFROMPOS = 0x0D7; + public static int EM_LINEINDEX = 0x0BB; + public static int EM_EXLINEFROMCHAR = WM_USER + 54; + + public static int EM_GETOLEINTERFACE = WM_USER + 60; + public static int EM_SETREADONLY = 0x00CF; + + public static int TomStart = 0x20; + public static int TomEnd = 0; + public static int TA_TOP = 0; + public static int TA_BOTTOM = 8; + public static int TA_LEFT = 0; + public static int TA_RIGHT = 2; + } + + public delegate UInt32 EditStreamCallback(IntPtr dwCookie, IntPtr pbBuff, Int32 cb, out IntPtr pcb); + + [StructLayout(LayoutKind.Sequential)] + internal struct EditStream + { + public IntPtr dwCookie; + public UInt32 dwError; + public EditStreamCallback pfnCallback; + } + + [StructLayout(LayoutKind.Sequential)] + public struct CHARFORMAT2_STRUCT + { + public UInt32 cbSize; + public UInt32 dwMask; + public UInt32 dwEffects; + public Int32 yHeight; + public Int32 yOffset; + public Int32 crTextColor; + public byte bCharSet; + public byte bPitchAndFamily; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public char[] szFaceName; + public UInt16 wWeight; + public UInt16 sSpacing; + public int crBackColor; // Color.ToArgb() -> Int32 + public int lcid; + public int dwReserved; + public Int16 sStyle; + public Int16 wKerning; + public byte bUnderlineType; + public byte bAnimation; + public byte bRevAuthor; + public byte bReserved1; + } + + public struct POINTL + { + public POINTL(int x, int y) + { + this.x = x; + this.y = y; + } + + public int x; + public int y; + } +} diff --git a/Speak/Speak/RichEdit/RichEditHandler.cs b/Speak/Speak/RichEdit/RichEditHandler.cs new file mode 100644 index 0000000..d30b62f --- /dev/null +++ b/Speak/Speak/RichEdit/RichEditHandler.cs @@ -0,0 +1,656 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Virtuoso.Miranda.Plugins.Native; +using Speak.Core; +using Speak.Interop; +using Speak.Sites; +using Speak.Structs; +using Speak.UI; +using Speak.Utils; + +namespace Speak.RichEdit +{ + [System.Runtime.InteropServices.GuidAttribute("1EC46826-B20F-4B93-830F-7ABC39F371CC")] + internal class RichEditHandler : IMessageProcessor + { + private IntPtr wHandle; + + private IRichEditOle richEditOle; + private ITextDocument richEdit = null; + private IntPtr richEditPtr = IntPtr.Zero; + private IntPtr pRichEdit; + private IntPtr tmpPtr; + private ISite site; + + private AvatarProcessor ap; + + private SimpleWordAction srmmNickAction; + private SimpleWordAction srmmNumberAction; + + private Subclassing subclass; + private ContextMenu context; + private List btns = new List(); + private bool needRecalc; + + private static Guid IID_ITextDocument = typeof(ITextDocument).GUID; + private static Guid IID_IOleObject = typeof(IOleObject).GUID; + + public RichEditHandler(ISite site, IntPtr wHandle) + { + pRichEdit = IntPtr.Zero; + tmpPtr = IntPtr.Zero; + + this.site = site; + this.wHandle = wHandle; + + string errMessage = String.Empty; + tmpPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(IntPtr))); + Marshal.WriteIntPtr(tmpPtr, IntPtr.Zero); + try + { + richEditOle = RichEditHelpers.SendMessage(this.wHandle, REConstants.EM_GETOLEINTERFACE, 0); + + subclass = new Subclassing(this.wHandle); + int subResult = subclass.StartSubclassing(WndProc); + if (subResult != 0) + throw new Exception( + "Epic fail of RichView subclassing." + Environment.NewLine + + "ErrorCode: " + subResult.ToString() + Environment.NewLine + + "Message: " + new System.ComponentModel.Win32Exception(subResult).Message); + + if (WinApi.SendMessage(this.wHandle, REConstants.EM_GETOLEINTERFACE, IntPtr.Zero, tmpPtr) != 0) + { + pRichEdit = Marshal.ReadIntPtr(tmpPtr); + if (pRichEdit != IntPtr.Zero) + { + try + { + Marshal.QueryInterface(pRichEdit, ref IID_ITextDocument, out richEditPtr); + + richEdit = (ITextDocument)Marshal.GetTypedObjectForIUnknown(richEditPtr, typeof(ITextDocument)); + if (richEdit == null) + errMessage = "Failed to get the object wrapper for the interface."; + } + catch (Exception ex) { errMessage = ex.Message; } + } + else + { + errMessage = "Failed to get the pRichEdit pointer."; + } + } + } + catch (Exception ex) { errMessage = ex.Message; } + + if (richEdit == null) + { + MessageBox.Show( + "Cant connect to SRMM's RichEdit window." + Environment.NewLine + + "Links highlighting will be disabled" + Environment.NewLine + Environment.NewLine + + errMessage, + "[xJuick] SRMM init error", + MessageBoxButtons.OK, + MessageBoxIcon.Error); + return; + } + + srmmNickAction = Settings.Instance.SRMMNickAction; + srmmNumberAction = Settings.Instance.SRMMNumberAction; + + ap = new AvatarProcessor(site); + MakeContextMenu(); + Routine(); + } + + private void MakeContextMenu() + { + context = new ContextMenu(); + foreach (LinkButton lb in Settings.Instance.SRMMLinkButtons) + { + if (!lb.Enabled) + continue; + + ActionMenuItem mi = new ActionMenuItem(lb); + //mi.Image = IconTable.GetActionIcon(lb.IconName); + mi.Click += ActionMenuClick; + context.MenuItems.Add(mi); + } + ActionMenuItem contextAvatar = new ActionMenuItem(new LinkButton(String.Empty, String.Empty, false, LinkDisplayType.Image)); + //contextAvatar.Image = Image.FromFile(ap.GetUserAvatar("xa0c", null)); + context.MenuItems.Add(contextAvatar); + } + + public int WndProc(IntPtr hWnd, int Msg, int wParam, int lParam) + { + bool lmb = false; + switch (Msg) + { + case WinApi.WM_LBUTTONDBLCLK: + case WinApi.WM_LBUTTONDOWN: + case WinApi.WM_LBUTTONUP: + int x = Util.LoWord(lParam); + int y = Util.HiWord(lParam); + + foreach (ActionOleObject btn in btns) + { + if (btn.HitTest(x, y)) + { + if (Msg == WinApi.WM_LBUTTONDOWN) + { + btn.SetLMBDownState(); + } + else if (Msg == WinApi.WM_LBUTTONUP) + { + btn.SetLMBUpState(hWnd, Int32.MinValue); + } + + lmb = true; + break; + } + } + break; + } + + int result = 0; + if (!lmb) + result = subclass.CallParent(hWnd, Msg, wParam, lParam); + + switch (Msg) + { + case WinApi.WM_MOUSEMOVE: + if (needRecalc) + { + SetActionObjectPosition(); + needRecalc = false; + } + + int x = Util.LoWord(lParam); + int y = Util.HiWord(lParam); + + for (int i = 0, iCount = btns.Count; i < iCount; i++) + btns[i].MouseMoving(x, y); + + if (((wParam & WinApi.MK_CONTROL) == WinApi.MK_CONTROL) && Settings.Instance.ShowPreview) + { + string url = GetCurrentURL(x, y); + if (!String.IsNullOrEmpty(url) /*&& ImagePreview.IsImage(url)*/) + { + POINT pt = new POINT(x,y); + WinApi.ClientToScreen(wHandle, ref pt); + ImagePreview.Show(pt.X, pt.Y+10, url); + } + else + { + ImagePreview.Hide(); + } + } + else + { + ImagePreview.Hide(); + } + + break; + case REConstants.EM_STREAMIN: + Routine(); + break; + + case WinApi.WM_SETTEXT: + string text = Marshal.PtrToStringAnsi(new IntPtr(lParam)); + if (String.IsNullOrEmpty(text)) + btns.Clear(); + break; + + case WinApi.WM_PAINT: + needRecalc = true; + break; + + case MainConstants.WM_REMAKERICH: + Routine(); + needRecalc = true; + break; + } + return result; + } + + public void SettingsChanged() + { + MakeContextMenu(); + Avatars(); + } + + public void Update() + { + // well... do nothing :) + } + + public void ShowThreads() + { + // not implemented :) + } + + public void Avatars() + { + bool readOnly = (WinApi.GetWindowLong(wHandle, WinApi.GWL_STYLE) & REConstants.ES_READONLY) != 0; + if (readOnly) + WinApi.SendMessage(wHandle, REConstants.EM_SETREADONLY, 0, 0); + + if (!Settings.Instance.ShowAvatars) + DeleteAvatars(); + else + ShowAvatars(); + + if (readOnly) + WinApi.SendMessage(wHandle, REConstants.EM_SETREADONLY, 1, 0); + } + + private void SetActionObjectPosition() + { + ITextRange range = richEdit.Range(0, Int32.MaxValue); + for (int i = 0, iCount = richEditOle.GetObjectCount(); i < iCount; i++) + { + REOBJECT reoObject = new REOBJECT(); + if (richEditOle.GetObject(i, reoObject, GETOBJECTOPTIONS.REO_GETOBJ_POLEOBJ) == 0) + { + if (reoObject.clsid == ActionOleObject.Guid) + { + int x; + int y; + range.SetRange(reoObject.cp, reoObject.cp); + range.GetPoint(REConstants.TomStart | REConstants.TA_LEFT | REConstants.TA_BOTTOM, out x, out y); + + + IntPtr iaolep; + Marshal.QueryInterface(reoObject.poleobj, ref IID_IOleObject, out iaolep); + + IActionOleObject iao = (IActionOleObject)Marshal.GetTypedObjectForIUnknown(iaolep, typeof(IActionOleObject)); + + + POINT stc = new POINT(x, y); + WinApi.ScreenToClient(wHandle, ref stc); + iao.Left = stc.X; + iao.Bottom = stc.Y; + } + } + } + } + + private void Routine() + { + bool readOnly = (WinApi.GetWindowLong(wHandle, WinApi.GWL_STYLE) & REConstants.ES_READONLY) != 0; + if (readOnly) + WinApi.SendMessage(wHandle, REConstants.EM_SETREADONLY, 0, 0); + + richEdit.Freeze(); + string text = richEdit.Range(0, Int32.MaxValue).Text; + + // posts/comments + Match m = site.NumRegex.Match(text); + while (m.Success) + { + string victimWord = m.Groups["full"].Value; + ActionWordType actionWord = !String.IsNullOrEmpty(m.Groups["cmnt"].Value) + ? ActionWordType.Comments + : ActionWordType.Post; + + + int selStart = text.IndexOf(victimWord); + bool correctID = true; + + if (victimWord.Length < 3) + correctID = false; + + // fucking urls + if (correctID && victimWord.Length < 5) + { + richEdit.Selection.Start = selStart; + richEdit.Selection.End = selStart+1; + CHARFORMAT2_STRUCT cf = new CHARFORMAT2_STRUCT(); + cf.cbSize = (UInt32) Marshal.SizeOf(cf); + cf.szFaceName = new char[32]; + + IntPtr wpar = new IntPtr(REConstants.SCF_SELECTION); + IntPtr lpar = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf)); + Marshal.StructureToPtr(cf, lpar, false); + + new IntPtr(WinApi.SendMessage(wHandle, REConstants.EM_GETCHARFORMAT, wpar, lpar)); + + cf = (CHARFORMAT2_STRUCT) Marshal.PtrToStructure(lpar, typeof (CHARFORMAT2_STRUCT)); + + if ( + ((cf.dwMask & REConstants.CFM_LINK) == REConstants.CFM_LINK) && + ((cf.dwEffects & REConstants.CFE_LINK) == REConstants.CFE_LINK) + ) + { + correctID = false; + } + + Marshal.FreeCoTaskMem(lpar); + } + + if (correctID) + { + AddActionObject(selStart, victimWord, actionWord); + text = richEdit.Range(0, Int32.MaxValue).Text; + } + + + m = m.NextMatch(); + } + + // JIDs + m = Regexps.JidRegEx.Match(text); + while (m.Success) + { + string victimWord = m.Groups["name"].Value; + + AddActionObject(text.IndexOf(victimWord), victimWord, ActionWordType.Nick); + text = richEdit.Range(0, Int32.MaxValue).Text; + + m = m.NextMatch(); + } + + // @nicks + m = site.NameRegex.Match(text); + while (m.Success) + { + string victimWord = m.Groups["name"].Value; + ActionObjectType objectType = !String.IsNullOrEmpty(m.Groups["isFirst"].Value) ? ActionObjectType.FirstNick : ActionObjectType.Nick; + AddActionObject(text.IndexOf(victimWord), victimWord, ActionWordType.Nick, objectType); + text = richEdit.Range(0, Int32.MaxValue).Text; + + m = m.NextMatch(); + } + richEdit.Unfreeze(); + + // avatars + if (Settings.Instance.ShowAvatars) + ShowAvatars(); + + if (readOnly) + WinApi.SendMessage(wHandle, REConstants.EM_SETREADONLY, 1, 0); + } + + private void DeleteAvatars() + { + richEdit.Freeze(); + for (int i = 0, iCount = richEditOle.GetObjectCount(); i < iCount; i++) + { + REOBJECT reoObject = new REOBJECT(); + if (richEditOle.GetObject(i, reoObject, GETOBJECTOPTIONS.REO_GETOBJ_POLEOBJ) == 0) + { + if (reoObject.clsid == AvatarObject.Guid) + { + richEdit.Range(reoObject.cp, reoObject.cp + 2).Text = ""; + } + } + } + + for (int i = 0, iCount = btns.Count; i < iCount; i++) + { + if(btns[i].ObjectType == ActionObjectType.FirstNick) + btns[i].IsTailObjectSet = false; + } + richEdit.Unfreeze(); + + // well... Надо бы инвалидейт вместо скролла сделать, нр-но + //WinApi.SendMessage(wHandle, WinApi.WM_VSCROLL, 7, 0); + WinApi.SendMessage(wHandle, MainConstants.WM_REMAKERICH, 0, 0); + } + + private void ShowAvatars() + { + richEdit.Freeze(); + List> avatars = new List>(); + //Int32 lastLine = -1; + for (int i = 0, iCount = richEditOle.GetObjectCount(); i < iCount; i++) + { + REOBJECT reoObject = new REOBJECT(); + if (richEditOle.GetObject(i, reoObject, GETOBJECTOPTIONS.REO_GETOBJ_POLEOBJ) == 0) + { + if (reoObject.clsid == ActionOleObject.Guid) + { + IntPtr iaolep; + Marshal.QueryInterface(reoObject.poleobj, ref IID_IOleObject, out iaolep); + + IActionOleObject iao = (IActionOleObject)Marshal.GetTypedObjectForIUnknown(iaolep, typeof(IActionOleObject)); + if (!iao.IsTailObjectSet && iao.ObjectType == ActionObjectType.FirstNick) + { + int lineIndex = WinApi.SendMessage(wHandle, REConstants.EM_EXLINEFROMCHAR, 0, reoObject.cp); + // select for yourself + //int charOffset = reoObject.cp - WinApi.SendMessage(wHandle, REConstants.EM_LINEINDEX, lineIndex, 0); + //avatars.Add(new KeyValuePair(iao.Text.Substring(1), reoObject.cp + avatars.Count - (lastLine != lineIndex ? charOffset : 0))); + avatars.Add(new KeyValuePair(iao.Text.Substring(1), reoObject.cp + avatars.Count)); + //lastLine = lineIndex; + iao.IsTailObjectSet = true; + } + } + } + } + int offset = 0; + foreach (KeyValuePair ava in avatars) + { + int index = offset + ava.Value; + richEdit.Selection.Start = index; + richEdit.Selection.End = index; + Color backColor = richEdit.Selection.Font.BackColor != REConstants.ErrTransparentConst ? ColorTranslator.FromWin32(richEdit.Selection.Font.BackColor) : LogWindow.SRMMBackColor; + + RichEditHelpers.InsertControl(richEditOle, new AvatarObject(ap, ava.Key, backColor)); + richEdit.Range(index + 1, index + 1).Text = " "; + offset += 1; + } + ap.Process(); + richEdit.Unfreeze(); + } + + private void ActionMenuClick(object sender, EventArgs e) + { + ActionMenuItem mi = (ActionMenuItem) sender; + InvokeJuick(new ActionClickEvent(mi.Action, mi.AutoSend)); + } + + private void actionObject_JuickClicked(object sender, ActionObjectClickEvent e) + { + + ActionWordType actionWord = e.ActionType; + if (e.MenuLocation != Point.Empty) + { + if (actionWord == ActionWordType.None) + return; + + for (int i = 0, iCount = context.MenuItems.Count; i < iCount; i++) + { + ActionMenuItem btn = (ActionMenuItem)context.MenuItems[i]; + btn.MainWord = e.ActionText; + if (btn.DisplayType != LinkDisplayType.Always) + { + if ( + (btn.DisplayType == LinkDisplayType.Comments && actionWord != ActionWordType.Comments) || + (btn.DisplayType == LinkDisplayType.Posts && actionWord != ActionWordType.Post) || + (btn.DisplayType == LinkDisplayType.Nicks && actionWord != ActionWordType.Nick) + ) + { + btn.Visible = false; + continue; + } + } + + if (btn.DisplayType == LinkDisplayType.Image) + { + if (Settings.Instance.ShowContextAvatars) + { + string avatarPath = ap.GetUserAvatar(btn.MainWord.Substring(1), null); + if (String.IsNullOrEmpty(avatarPath)) + { + ap.Process(); + btn.Visible = false; + continue; + } + else + { + btn.Image = Image.FromFile(avatarPath); + } + } + else + { + btn.Visible = false; + continue; + } + } + + Match m = site.NumRegex.Match(btn.MainWord); + if (m.Success) + { + if (!String.IsNullOrEmpty(m.Groups["cmnt"].Value)) + { + btn.AdditionalWord = m.Groups["full"].Value; + btn.MainWord = m.Groups["post"].Value; + } + } + + btn.Visible = true; + continue; + } + context.Show(sender as Control, e.MenuLocation); + } + else + { + if (actionWord == ActionWordType.Nick) + InvokeJuick(new ActionClickEvent(srmmNickAction.Action.Replace("%NICK%", e.ActionText), srmmNickAction.Autosend)); + else if (actionWord == ActionWordType.Post || actionWord == ActionWordType.Comments) + InvokeJuick(new ActionClickEvent(srmmNumberAction.Action.Replace("%NUMBER%", e.ActionText), srmmNumberAction.Autosend)); + } + } + + private void AddActionObject(int selStart, string fullWord, ActionWordType actionType) + { + AddActionObject(selStart, fullWord, actionType, ActionObjectType.Default); + } + + private void AddActionObject(int selStart, string fullWord, ActionWordType actionType, ActionObjectType objectType) + { + richEdit.Selection.Start = selStart; + richEdit.Selection.End = selStart + fullWord.Length; + + ActionOleObject aoo = new ActionOleObject(); + aoo.ObjectType = objectType; + aoo.ActionType = actionType; + aoo.ActionClicked += actionObject_JuickClicked; + + ITextFont font = richEdit.Selection.Font; + + aoo.BgColor = font.BackColor != REConstants.ErrTransparentConst ? ColorTranslator.FromWin32(font.BackColor) : LogWindow.SRMMBackColor; + aoo.Font = new Font(font.Name, font.Size); + aoo.ForeColor = ColorTranslator.FromWin32(font.ForeColor); + aoo.Text = fullWord; + + btns.Add(aoo); + RichEditHelpers.InsertControl(richEditOle, aoo); + } + + private string GetCurrentURL(int x, int y) + { + POINTL pointl = new POINTL(x, y); + Subclassing.SetLastError(0); + int charIndex = WinApi.SendMessage(wHandle, REConstants.EM_CHARFROMPOS, 0, ref pointl); + int err = Marshal.GetLastWin32Error(); + if (err != 0 && err != 6) + return String.Empty; + + if (charIndex <= 0) + return null; + int lineIndex = WinApi.SendMessage(wHandle, REConstants.EM_EXLINEFROMCHAR, 0, charIndex); + int charOffset = charIndex - WinApi.SendMessage(wHandle, REConstants.EM_LINEINDEX, lineIndex, 0); + int len = WinApi.SendMessage(wHandle, REConstants.EM_LINELENGTH, charIndex, 0); + + string line = richEdit.Range(charIndex - charOffset, (charIndex - charOffset) + len).Text; + + if (String.IsNullOrEmpty(line)) + return null; + + if (charOffset == len) + return null; + + string result = String.Empty; + int i = charOffset - 1; + int j = charOffset - 1; + try + { + + while (i >= 0 && line[i] != ' ') + { + i--; + } + i = i + 1; + + if (j == -1) + return null; + while (j < len && line[j] != ' ') + { + j++; + } + + if (j < i) + return null; + + result = line.Substring(i, j - i).Trim(); + if (result.IndexOf("http://") != -1) + { + return result; + } + } + catch { return String.Empty; } + + return String.Empty; + } + + public event EventHandler JuickClicked; + public void InvokeJuick(ActionClickEvent e) + { + EventHandler handler = JuickClicked; + if (handler != null) handler(this, e); + } + + #region Implementation of IDisposable + + public void Dispose() + { + if (pRichEdit != IntPtr.Zero) + { + Marshal.Release(pRichEdit); + pRichEdit = IntPtr.Zero; + } + + if (tmpPtr != IntPtr.Zero) + { + Marshal.FreeCoTaskMem(tmpPtr); + tmpPtr = IntPtr.Zero; + } + + if (richEditPtr != IntPtr.Zero) + { + Marshal.Release(richEditPtr); + richEditPtr = IntPtr.Zero; + } + + if (richEditOle != null) + { + richEditOle = null; + } + + if (subclass != null) + { + subclass.StopSubclass(); + subclass.Dispose(); + } + + richEdit = null; + } + + #endregion + } +} diff --git a/Speak/Speak/RichEdit/RichEditHelpers.cs b/Speak/Speak/RichEdit/RichEditHelpers.cs new file mode 100644 index 0000000..2b0b0f9 --- /dev/null +++ b/Speak/Speak/RichEdit/RichEditHelpers.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Text; +using Speak.Interop; +using Speak.Structs; + +namespace Speak.RichEdit +{ + internal static class RichEditHelpers + { + private static Guid IID_ITextDocument = typeof(ITextDocument).GUID; + private static Type TFVCNDATAType = typeof(TFVCNDATA_NMHDR); + private static Int32 TFVCNDATASize = Marshal.SizeOf(TFVCNDATAType); + + [DllImport("ole32.dll", PreserveSig = false)] + public static extern int CreateILockBytesOnHGlobal(IntPtr hGlobal, bool fDeleteOnRelease, [Out] out ILockBytes ppLkbyt); + + [DllImport("ole32.dll")] + public static extern int StgCreateDocfileOnILockBytes(ILockBytes plkbyt, uint grfMode, uint reserved, out IStorage ppstgOpen); + + //public static int WM_USER = 0x0400; + //public static int EM_GETOLEINTERFACE = WM_USER + 60; + + [DllImport("User32.dll", CharSet = CharSet.Auto, PreserveSig = false)] + public static extern IRichEditOle SendMessage(IntPtr hWnd, int message, int wParam); + + public static void InsertControl(IRichEditOle richEditOle, IActionOleGUID control) + { + if (control == null || richEditOle == null) + return; + + ILockBytes pLockBytes; + CreateILockBytesOnHGlobal(IntPtr.Zero, true, out pLockBytes); + + IOleClientSite pOleClientSite; + richEditOle.GetClientSite(out pOleClientSite); + + REOBJECT reoObject = new REOBJECT(); + + reoObject.cp = -1;//REO_CP_SELECTION; + + reoObject.clsid = control.GUID; + reoObject.poleobj = Marshal.GetIUnknownForObject(control); + reoObject.polesite = pOleClientSite; + reoObject.dvAspect = (uint)(DVASPECT.DVASPECT_CONTENT); + reoObject.dwFlags = (uint)(REOOBJECTFLAGS.REO_BELOWBASELINE | REOOBJECTFLAGS.REO_BLANK); + + richEditOle.InsertObject(reoObject); + + Marshal.ReleaseComObject(pLockBytes); + Marshal.ReleaseComObject(pOleClientSite); + } + + public static ITextDocument GetIText(IntPtr handle) + { + IntPtr pRichEdit = IntPtr.Zero; + IntPtr tmpPtr = IntPtr.Zero; + IntPtr richEditPtr = IntPtr.Zero; + tmpPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(IntPtr))); + Marshal.WriteIntPtr(tmpPtr, IntPtr.Zero); + ITextDocument richEdit = null; + if (WinApi.SendMessage(handle, REConstants.EM_GETOLEINTERFACE, IntPtr.Zero, tmpPtr) != 0) + { + if ((pRichEdit = Marshal.ReadIntPtr(tmpPtr)) != IntPtr.Zero) + { + Marshal.QueryInterface(pRichEdit, ref IID_ITextDocument, out richEditPtr); + + richEdit = (ITextDocument)Marshal.GetTypedObjectForIUnknown(richEditPtr, typeof(ITextDocument)); + if (richEdit == null) + throw new Exception("Failed to get the object wrapper for the interface."); + } + else + { + throw new Exception("Failed to get the pRichEdit pointer."); + } + } + return richEdit; + } + + public static RichEditInfo GetRichEditInfo(IntPtr owner, IntPtr mainHandle) + { + TFVCNDATA_NMHDR mh = new TFVCNDATA_NMHDR(); + mh.cbSize = TFVCNDATASize; + mh.handleFrom = owner; + mh.code = HppConstaints.NM_FIREVIEWCHANGE; + mh.bEvent = HppConstaints.FVCN_GETINFO; + mh.bAction = HppConstaints.FVCA_NONE; + mh.rcRect = new RECT(0, 0, 0, 0); + + IntPtr cmd = Marshal.AllocHGlobal(TFVCNDATASize); + Marshal.StructureToPtr(mh, cmd, false); + + WinApi.SendMessage(mainHandle, WinApi.WM_NOTIFY, owner, cmd); + + mh = (TFVCNDATA_NMHDR)Marshal.PtrToStructure(cmd, TFVCNDATAType); + + if (mh.bAction == HppConstaints.FVCA_INFO) + return new RichEditInfo(mh.rcRect, mh.clrBackground.GetColor()); + + return RichEditInfo.Empty; + } + } + + internal class RichEditInfo + { + private RECT rect; + private Color bgColor; + + public RichEditInfo(RECT rect, Color bgColor) + { + this.rect = rect; + this.bgColor = bgColor; + } + + public static RichEditInfo Empty + { + get { return new RichEditInfo(RECT.Empty, Color.Empty);} + } + + public bool IsEmpty + { + get { return rect.IsEmpty && bgColor.IsEmpty; } + } + + public RECT Rect + { + get { return rect; } + } + + public Color BgColor + { + get { return bgColor; } + } + } + +} diff --git a/Speak/Speak/Sites/BNWSite.cs b/Speak/Speak/Sites/BNWSite.cs new file mode 100644 index 0000000..02ba99b --- /dev/null +++ b/Speak/Speak/Sites/BNWSite.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml.Serialization; + +namespace Speak.Sites +{ + [Serializable] + public class BNWSite : ISite + { + private string name; + private string mainContact; + private string[] additionalContacts; + private static Regex numRegEx = new Regex( + "(?(?\\#[A-Z\\d]+)(?/[A-Z\\d]+)?)", + RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + private static Regex nameRegEx = new Regex( + "(?\\B@\\w+[-_\\.\\w]*\\w+)(?\\:{1})?", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + public BNWSite() + { + name = "BNW"; + mainContact = "bnw.blasux.ru"; + additionalContacts = new string[0]; + } + + public override ISite CreateDefaultInstance() + { + return new BNWSite(); + } + + #region -=[ Avatars ]=- + public override string GetAvatarPath(string userName) + { + return String.Empty; + } + #endregion + + [XmlIgnore] + public override Regex NumRegex + { + get { return numRegEx; } + } + + [XmlIgnore] + public override Regex NameRegex + { + get { return nameRegEx; } + } + + public override string Name + { + get { return name; } + set { name = value; } + } + + public override string MainContact + { + get { return mainContact; } + set { mainContact = value; } + } + + public override string[] AdditionalContacts + { + get { return additionalContacts; } + set { additionalContacts = value; } + } + } +} diff --git a/Speak/Speak/Sites/ISite.cs b/Speak/Speak/Sites/ISite.cs new file mode 100644 index 0000000..93f5915 --- /dev/null +++ b/Speak/Speak/Sites/ISite.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml.Serialization; + +namespace Speak.Sites +{ + [Serializable] + public abstract class ISite + { + public abstract ISite CreateDefaultInstance(); + + public abstract string GetAvatarPath(string userName); + + [XmlIgnore] + public abstract Regex NumRegex + { + get; + } + + [XmlIgnore] + public abstract Regex NameRegex + { + get; + } + + public abstract string Name + { + get; set; + } + + public abstract string MainContact + { + get; set; + } + + public abstract string[] AdditionalContacts + { + get; set; + } + } +} diff --git a/Speak/Speak/Sites/JuickSite.cs b/Speak/Speak/Sites/JuickSite.cs new file mode 100644 index 0000000..a9456b0 --- /dev/null +++ b/Speak/Speak/Sites/JuickSite.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using Speak.Core; + +namespace Speak.Sites +{ + [Serializable] + public class JuickSite : ISite + { + private string name; + private string mainContact; + private string[] additionalContacts; + private static Regex numRegEx = new Regex( + "(?(?\\#\\d+)(?/\\d+)?)", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + private static Regex nameRegEx = new Regex( + "(?\\B@\\w+[-_\\.\\w]*\\w+)(?\\:{1})?", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + public JuickSite() + { + name = "Juick"; + mainContact = "juick@juick.com"; + additionalContacts = new string[] {"jubo@nologin.ru"}; + } + + public override ISite CreateDefaultInstance() + { + return new JuickSite(); + } + + #region -=[ Avatars ]=- + private static string ava32 = "http://i.juick.com/as/{0}.png"; + //private static string ava96 = "http://i.juick.com/a/{0}.png"; + private static string rss = "http://rss.juick.com/{0}/blog"; + public override string GetAvatarPath(string userName) + { + string userUrl = String.Format(rss, userName); + string avatarUrl = String.Empty; + string rssContent = HTTP.StaticSendGet(userUrl); + XmlDocument doc = new XmlDocument(); + + try + { + doc.LoadXml(rssContent); + } + catch { } + + XmlNodeList nodes = doc.GetElementsByTagName("image"); + if (nodes == null || nodes.Count == 0) + return avatarUrl; + + XmlNodeList childNodes = nodes[0].ChildNodes; + for (int i = 0, iCount = childNodes.Count; i < iCount; i++) + { + if (childNodes[i].Name.Equals("url", StringComparison.InvariantCultureIgnoreCase)) + { + Match m = Regexps.UID.Match(childNodes[i].InnerXml); + if (m.Success) + avatarUrl = String.Format(ava32, m.Groups["uid"].Value); + break; + } + } + + return avatarUrl; + } + #endregion + + [XmlIgnore] + public override Regex NumRegex + { + get { return numRegEx; } + } + + [XmlIgnore] + public override Regex NameRegex + { + get { return nameRegEx; } + } + + public override string Name + { + get { return name; } + set { name = value; } + } + + public override string MainContact + { + get { return mainContact; } + set { mainContact = value; } + } + + public override string[] AdditionalContacts + { + get { return additionalContacts; } + set { additionalContacts = value; } + } + } +} diff --git a/Speak/Speak/Sites/PstoSite.cs b/Speak/Speak/Sites/PstoSite.cs new file mode 100644 index 0000000..9abbb0c --- /dev/null +++ b/Speak/Speak/Sites/PstoSite.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml.Serialization; +using Speak.Core; + +namespace Speak.Sites +{ + [Serializable] + public class PstoSite : ISite + { + private string name; + private string mainContact; + private string[] additionalContacts; + private static Regex numRegEx = new Regex( + "(?(?\\#[A-Za-z\\d]+)(?/[\\d]+)?)", + RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + private static Regex nameRegEx = new Regex( + "(?\\B@\\w+[-_\\.\\w]*\\w+)(?\\:{1}|\\ \\-\\>)?", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + private static Regex AvaIDRegEx = new Regex( + "src=\\\"/(?:.+?)/80/(?\\d+)\\.png\\\"", + RegexOptions.IgnoreCase + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.IgnorePatternWhitespace + | RegexOptions.Compiled + ); + + + public PstoSite() + { + name = "Psto"; + mainContact = "psto@psto.net"; + additionalContacts = new string[0]; + } + + public override ISite CreateDefaultInstance() + { + return new PstoSite(); + } + + #region -=[ Avatars ]=- + private string userPageUrl = "http://{0}.psto.net"; + private string avaUrl = "http://psto.net/img/a/40/{0}.png"; + public override string GetAvatarPath(string userName) + { + string userUrl = String.Format(userPageUrl, userName); + string avatarUrl = String.Empty; + string userPageContent = HTTP.StaticSendGet(userUrl); + + Match m = AvaIDRegEx.Match(userPageContent); + if (m.Success) + avatarUrl = String.Format(avaUrl, m.Groups["avaID"].Value); + + return avatarUrl; + } + #endregion + + [XmlIgnore] + public override Regex NumRegex + { + get { return numRegEx; } + } + + [XmlIgnore] + public override Regex NameRegex + { + get { return nameRegEx; } + } + + public override string Name + { + get { return name; } + set { name = value; } + } + + public override string MainContact + { + get { return mainContact; } + set { mainContact = value; } + } + + public override string[] AdditionalContacts + { + get { return additionalContacts; } + set { additionalContacts = value; } + } + } +} diff --git a/Speak/Speak/Sites/SitesManager.cs b/Speak/Speak/Sites/SitesManager.cs new file mode 100644 index 0000000..e615f8f --- /dev/null +++ b/Speak/Speak/Sites/SitesManager.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Speak.Core; + +namespace Speak.Sites +{ + class SitesManager + { + public static Dictionary Sites; + public static Dictionary SitesInfo; + + static SitesManager() + { + Sites = new Dictionary(); + SitesInfo = new Dictionary(); + + ISite juick = new JuickSite(); + Sites.Add(juick.Name, juick); + ISite bnw = new BNWSite(); + Sites.Add(bnw.Name, bnw); + ISite psto = new PstoSite(); + Sites.Add(psto.Name, psto); + } + + public static ISite CreateDefaultSiteInstance() + { + ISite site = new PstoSite(); + site.AdditionalContacts = new string[0]; + return site; + } + + public static ISite GetContactSite(IntPtr hContact) + { + if (SitesInfo.ContainsKey(hContact)) + return SitesInfo[hContact]; + + return null; + } + + public static ISite GetContactSite(string UID, bool searchInAdditional) + { + for (int i = 0, iCount = Settings.Instance.Sites.Length; i < iCount; i++) + { + if (UID.Equals(Settings.Instance.Sites[i].MainContact, StringComparison.InvariantCultureIgnoreCase)) + { + return Settings.Instance.Sites[i]; + } + + if (!searchInAdditional) + continue; + + + for (int j = 0, jCount = Settings.Instance.Sites[i].AdditionalContacts.Length; j < jCount; j++) + { + if (UID.Equals(Settings.Instance.Sites[i].AdditionalContacts[j], StringComparison.InvariantCultureIgnoreCase)) + { + return Settings.Instance.Sites[i]; + } + } + } + + return null; + } + } +} diff --git a/Speak/Speak/Speak.csproj b/Speak/Speak/Speak.csproj new file mode 100644 index 0000000..9b1d648 --- /dev/null +++ b/Speak/Speak/Speak.csproj @@ -0,0 +1,169 @@ + + + + + Debug + AnyCPU + {EC92954F-19E9-43D6-8871-09C651108FA9} + Library + Properties + Speak + Speak.master + v3.5 + 512 + + + + true + full + false + ..\..\..\..\..\Desktop\Miranda\Plugins\ + DEBUG;TRACE + prompt + 4 + x86 + ..\..\..\..\..\Desktop\Miranda\Plugins\Speak.master.XML + 1591 + + + pdbonly + true + ..\..\..\..\..\Desktop\Miranda\Plugins\ + TRACE + prompt + 4 + x86 + ..\..\..\..\..\Desktop\Miranda\Plugins\Speak.master.XML + 1591 + + + C:\Users\netz\Documents\Visual Studio 2012\Projects\Speak\Speak\Opt\dialog.res + + + + ..\..\..\..\..\Desktop\Miranda\Plugins\Hyphen.dll + False + + + + + + + + + + + + + + + + + + + + + + + + + + + Component + + + Component + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + Component + + + Component + + + + + + + + + + + + + + + + + + + + + + + + Component + + + Form + + + PreviewForm.cs + + + + + + + + + + + Always + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + PreviewForm.cs + + + + + + if not exist IL mkdir IL +"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64\ildasm.exe" /linenum "$(TargetFileName)" /out="IL\$(ProjectName).il" + + + \ No newline at end of file diff --git a/Speak/Speak/Speak.dll b/Speak/Speak/Speak.dll new file mode 100644 index 0000000000000000000000000000000000000000..10705cb829bd81eacfb1b5c0c7d6ba390365fc8d GIT binary patch literal 3584 zcmd^Bdu$YC5TD()*SpddP$;Js*g^}JR@d4pCkpl2YeP$VPl=OwQCgPgj>a#V=uTB{xi z3&DV@YKG7(33^NwWK}4i?H9sYND?zL(sJWl*HjQyb4hgnJ=5ax~X9U2{ zE-6~jij|sRWPa(uA>bh@8={)xMpjn&H$J-}!LXk=*&y|2#Dz;LH5=qZ`A!&MaEtddQLW zWNGn|b=_}tG<({^K)6=J~t}LC8w+8SjZyKtTheBvBGy$_j{Z{mzORpsDc zLr-V^Ws24eodLGs<{}#hYn-!OF=b%^B9=_fWY%}gj53&O*v8~U@5Xs1jfa+Jlfs-E!Q-8d6xSjj4tlmPD@> zj>w9n`z5_i4oXq-1{B4sscqhn6jb8gRM8%kB8IG~0ap<|R_lpeogwG4(!bll15n1FvYe93oaO)iRuCNe|RxXOyXQQ6YJ& z<)~4m%7z?J*Ejqp_ee?>IF1K#I+6r(La;j_*zJWJKaMiTW+$a_PWy{X8|!bl z{rlDSRR=SKim~VBCE2b^NhUmLBTjHQ9k`lcreb%Riamw6vDw*{-PyH+axq`Kh&B^0 zE$c7nwf@rE*cX{y!G+sCop(z*_w{F$bv?IEd2jZzlM@$+1$7;{>o0sGd2jmgq_U~6 zq3^eQrfiB-f4m`mLFX~=lHtp?iF-G^E-Y9%I%CX@!wW|ICE}y%d2OS?)c$_Pxc)y`1p~c6|0^{M3Ut4 tJ2*b#ljCpSLN*MpSrDxMjHjlMdxTqX7rH&}8uvc)AHX$RlWQpPzW^hI1-bwL literal 0 HcmV?d00001 diff --git a/Speak/Speak/Storage/Settings.cs b/Speak/Speak/Storage/Settings.cs new file mode 100644 index 0000000..0ad695d --- /dev/null +++ b/Speak/Speak/Storage/Settings.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Collections.ObjectModel; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Speak.Opt; + +namespace Speak.Storage +{ + class Settings + { + private class Contact + { + public string Status; + public bool message_read; + public bool status_read; + public Contact(string status, bool rmessage, bool rstatus) + { + this.Status = status; + this.message_read = rmessage; + this.status_read = rstatus; + } + } + private static Settings instance; + private Dictionary contactlist; + private long maxTextLength = 0; + private bool globalActive = true; + private bool unknownmessageread = true; + private bool unknownstatusread = true; + + /// + /// Get a Setting Class + /// + /// Settings Object + public static Settings getInstance() + { + if (instance == null) + instance = new Settings(); + return instance; + } + + private Settings() + { + this.contactlist = new Dictionary(); + } + + public void ReadContactList() + { + this.contactlist = new Dictionary(); + ReadOnlyCollection list = MirandaContext.Current.MirandaDatabase.GetContacts(); + foreach (ContactInfo item in list) + { + if (item.UniqueID != null) + { + //System.Windows.Forms.MessageBox.Show("leer"); + Contact c = new Contact(item.Status.ToString(), + Options.readDBBool("message", "speak_config", item.MirandaHandle, true), + Options.readDBBool("status", "speak_config", item.MirandaHandle, true)); + this.contactlist.Add(item.UniqueID.ToString(), c); + } + } + } + public void SetGlobalSettings() + { + this.maxTextLength = Options.readDBLong("max_msg_size", "speak_config"); + this.globalActive = Options.readDBBool("active", "speak_config", true); + this.unknownmessageread = Options.readDBBool("message_u", "speak_config", true); + this.unknownstatusread = Options.readDBBool("status_u", "speak_config", true); + } + + public bool canMessageRead(string text, string uid) + { + if (!this.globalActive) + { + return false; + } + if (text.Length > this.maxTextLength) + { + return false; + } + Contact c; + try + { + c = this.contactlist[uid]; + } + catch (System.Collections.Generic.KeyNotFoundException) + { + return this.unknownmessageread; + } + return c.message_read; + } + + public string getSpeakString() + { + return "{0} meint: {1}"; + } + + public bool hasChangedStatus(string uid, string status) + { + Contact c; + try + { + c = this.contactlist[uid]; + } + catch (System.Collections.Generic.KeyNotFoundException) + { + if (uid != "" && status != "") + { + ReadContactList(); + return true; + } + return false; + } + if (c.Status != status) + { + this.contactlist[uid] = new Contact(status, c.message_read, c.status_read); + return true; + } + return false; + } + + public bool canStatusRead(string uid) + { + Contact c = this.contactlist[uid]; + if (c != null) + { + return c.status_read; + } + return this.unknownstatusread; + } + + public string getStatusString(StatusMode? status) + { + switch (status) + { + case StatusMode.Offline: + return "{0} ist Off"; + case StatusMode.Online: + return "{0} ist da"; + case StatusMode.Away: + return "{0} ist nur mal kurz weg"; + case StatusMode.Invisible: + return "{0} hat sich versteckt"; + case StatusMode.NA: + return "{0} ist nicht mehr da"; + case StatusMode.DND: + return "{0} will in ruhe gelassen werden, schnautze"; + case StatusMode.Occupied: + return "{0} ist beschäftigt"; + case StatusMode.FreeForChat: + return "{0} will chatten"; + } + return "{0} ist {1}"; + } + } +} diff --git a/Speak/Speak/Structs/API.cs b/Speak/Speak/Structs/API.cs new file mode 100644 index 0000000..7d999a5 --- /dev/null +++ b/Speak/Speak/Structs/API.cs @@ -0,0 +1,98 @@ +using System; + +namespace Speak.Structs +{ + internal static class API + { + public static string MS_SYSTEM_GETVERSION = "Miranda/System/GetVersion"; + + public static string MS_DB_EVENT_ADD = "DB/Event/Add"; + public static string MS_DB_EVENT_GET = "DB/Event/Get"; + public static string MS_DB_EVENT_DELETE = "DB/Event/Delete"; + public static string MS_DB_EVENT_GETBLOBSIZE = "DB/Event/GetBlobSize"; + public static string MS_DB_TIME_TIMESTAMPTOLOCAL = "DB/Time/TimestampToLocal"; + + + public static string MS_PROTO_ADDTOCONTACT = "Proto/AddToContact"; + public static string MS_PROTO_ISPROTOONCONTACT = "Proto/IsProtoOnContact"; + public static string MS_PROTO_REGISTERMODULE = "Proto/RegisterModule"; + public static string MS_PROTO_CHAINSEND = "Proto/ChainSend"; + public static string MS_PROTO_CHAINRECV = "Proto/ChainRecv"; + public static string MS_PROTO_CALLCONTACTSERVICE = "Proto/CallContactService"; + public static string MS_PROTO_GETCONTACTBASEPROTO = "Proto/GetContactBaseProto"; + + public static string PS_SETSTATUS = "/SetStatus"; + public static string PS_GETSTATUS = "/GetStatus"; + + public static string PSR_MESSAGE = "/RecvMessage"; + public static string PSR_MESSAGEW = "/RecvMessageW"; + public static string PSS_MESSAGE = "/SendMsg"; + public static string PSS_MESSAGEW = "/SendMsgW"; // instant send msg + + public static string MS_MSG_SENDMESSAGE = "SRMsg/SendCommand"; // type msg + public static string ME_MSG_WINDOWEVENT = "MessageAPI/WindowEvent"; + + public static string MS_SKIN2_ADDICON = "Skin2/Icons/AddIcon"; + public static string MS_SKIN2_GETICON = "Skin2/Icons/GetIcon"; + public static string MS_SKIN2_GETICONBYHANDLE = "Skin2/Icons/GetIconByHandle"; + public static string ME_SKIN2_ICONSCHANGED = "Skin2/IconsChanged"; + + public static string MS_BB_ADDBUTTON = "TabSRMM/ButtonsBar/AddButton"; + public static string MS_BB_REMOVEBUTTON = "TabSRMM/ButtonsBar/RemoveButton"; + public static string MS_BB_GETBUTTONSTATE = "TabSRMM/ButtonsBar/GetButtonState"; + public static string MS_BB_SETBUTTONSTATE = "TabSRMM/ButtonsBar/SetButtonState"; + public static string ME_MSG_TOOLBARLOADED = "TabSRMM/ButtonsBar/ModuleLoaded"; + public static string ME_MSG_BUTTONPRESSED = "TabSRMM/ButtonsBar/ButtonPressed"; + + public static string ME_IEVIEW_OPTIONSCHANGED = "IEVIEW/OptionsChanged"; + public static string ME_DB_CONTACT_SETTINGCHANGED = "DB/Contact/SettingChanged"; + + public static string ME_DB_EVENT_ADDED = "DB/Event/Added"; + + public static string MS_UTILS_OPENURL = "Utils/OpenURL"; + + public static string ME_OPT_INITIALISE = "Opt/Initialise"; + public static string MS_OPT_ADDPAGE = "Opt/AddPage"; + + public static string MS_GC_NEWSESSION = "GChat/NewChat"; + + public static string MS_MSG_GETWINDOWCLASS = "MessageAPI/WindowClass"; + + public static string MS_PROTO_ENUMPROTOS = "Proto/EnumProtos"; + public static string MS_PROTO_ENUMPROTOCOLS = "Proto/EnumProtocols"; + public static string MS_PROTO_ENUMACCOUNTS = "Proto/EnumAccounts"; + + public static string MS_IEVIEW_WINDOW = "IEVIEW/NewWindow"; + + public static string ME_HPP_RICHEDIT_ITEMPROCESS = "History++/RichEdit/ItemProcessEvent"; + public static string MS_HPP_EG_WINDOW = "History++/ExtGrid/NewWindow"; + public static string MS_HPP_GETVERSION = "History++/GetVersion"; + + public static string MS_DB_GETPROFILEPATH = "DB/GetProfilePath"; + public static string MS_DB_GETPROFILENAME = "DB/GetProfileName"; + + public static Int32 CALLSERVICE_NOTFOUND = unchecked((int) 0x80000000); + public static string MS_DB_CONTACT_FINDFIRST = "DB/Contact/FindFirst"; + public static string MS_DB_CONTACT_FINDNEXT = "DB/Contact/FindNext"; + + } + + public enum StatusModes + { + Offline = 40071, + Online = 40072, + Away = 40073, + DND = 40074, + NA = 40075, + Occupied = 40076, + FreeForChat = 40077, + Invisible = 40078, + OnThePhone = 40079, + OutToLunch = 40080, + Idle = 40081 + } + + +} + + diff --git a/Speak/Speak/Structs/IconLib.cs b/Speak/Speak/Structs/IconLib.cs new file mode 100644 index 0000000..8c9337b --- /dev/null +++ b/Speak/Speak/Structs/IconLib.cs @@ -0,0 +1,34 @@ +using System; +using System.Runtime.InteropServices; + +namespace Speak.Structs +{ + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + struct IconName + { + public Int32 cbSize; + + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string szSection; + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string szDescription; + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string pszName; + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string pczDefaultFile; + + public Int32 iDefaultIndex; + public IntPtr hDefaultIcon; + public Int32 cx; + public Int32 cy; + public Int32 flags; + + public void Init() + { + pszName = pczDefaultFile = String.Empty; + cx = cy = 16; + } + } +} + + diff --git a/Speak/Speak/Structs/Miranda.cs b/Speak/Speak/Structs/Miranda.cs new file mode 100644 index 0000000..d38e8e8 --- /dev/null +++ b/Speak/Speak/Structs/Miranda.cs @@ -0,0 +1,462 @@ +using System; +using System.Runtime.InteropServices; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Virtuoso.Miranda.Plugins.Native; +using Speak.Interop; +using Speak.Utils; + +namespace Speak.Structs +{ + public static class MainConstants + { + public const UInt32 MSG_WINDOW_EVT_OPENING = 1; // window is about to be opened + public const UInt32 MSG_WINDOW_EVT_OPEN = 2; // window has been opened + public const UInt32 MSG_WINDOW_EVT_CLOSING = 3; // window is about to be closed + public const UInt32 MSG_WINDOW_EVT_CLOSE = 4; // window has been closed + public const UInt32 MSG_WINDOW_EVT_CUSTOM = 5; // custom event for message plugins to use + // (custom uFlags may be used) + public const Int32 MSG_WINDOW_UFLAG_MSG_FROM = 0x00000001; + public const Int32 MSG_WINDOW_UFLAG_MSG_TO = 0x00000002; + public const Int32 MSG_WINDOW_UFLAG_MSG_BOTH = 0x00000004; + + public const Int32 DBEF_UTF = 16; + + public const Int32 MI_IDC_LOG = 1001; // rich edit + public const Int32 MI_IDC_MESSAGE = 1002; // edit control + public const Int32 MI_IDC_QUOTE = 1034; // button control + public const Int32 MI_IDC_NAME = 1009; // text control + public const Int32 MI_IDC_ADD = 1070; // add button + public const Int32 WM_REMAKERICH = WinApi.WM_USER + 0x3457; + public const uint ODPF_BOLDGROUPS = 4; + } + + public static class ContactListConstants + { + public const int CLM_FIRST = 0x1000; //this is the same as LVM_FIRST + public const int CLN_FIRST = -100; + public const int CLM_ADDINFOITEM = CLM_FIRST + 53; //lParam=&cii, returns hItem + public const int CLM_SETEXTRAIMAGELIST = CLM_FIRST + 32; //lParam=HIMAGELIST, wParam=WideImageList + public const int CLM_SETBKBITMAP = CLM_FIRST + 27; //wParam=mode, lParam=hBitmap (don't delete it), NULL for none + public const int CLM_SETBKCOLOR = CLM_FIRST + 28; //wParam=a COLORREF, default is GetSysColor(COLOR_3DFACE) + public const int CLM_SETGREYOUTFLAGS = CLM_FIRST + 39; //wParam=new flags + public const int CLM_SETLEFTMARGIN = CLM_FIRST + 47; //wParam=pixels + public const int CLM_SETINDENT = CLM_FIRST + 34; //wParam=new indent, default is 3 pixels + public const int FONTID_MAX = 18; + public const int CLM_SETTEXTCOLOR = CLM_FIRST + 52; //wParam=FONTID_, lParam=COLORREF + public const int CLS_SHOWHIDDEN = 0x0002; + public const int CLM_SETEXTRACOLUMNS = CLM_FIRST + 30; //wParam=number of extra columns (zero to MAXEXTRACOLUMNS from clc.h, currently 16) + public const int CLCIIF_GROUPFONT = 0x80; + public const int CLM_FINDCONTACT = CLM_FIRST + 8; //wParam=hContact, returns an hItem + public const int CLM_GETEXTRAIMAGE = CLM_FIRST + 16; ////wParam=hItem, lParam=MAKELPARAM(iColumn (0 based),0), returns iImage or 0xFFa + public const int CLM_SETEXTRAIMAGE = CLM_FIRST + 31; //wParam=hItem, lParam=MAKELPARAM(iColumn (0 based),iImage). iImage=0xFF is a blank + public const int CLM_AUTOREBUILD = CLM_FIRST+2; + public const int CLM_GETNEXTITEM = CLM_FIRST + 50; //wParam=flag, lParam=hItem, returns an hItem + public const int CLGN_ROOT = 0; + public const int CLM_GETITEMTYPE = CLM_FIRST + 49; //wParam=hItem, returns a CLCIT_ + public const int CLCIT_GROUP = 0; + public const int CLGN_NEXTGROUP = 7; + public const int CLGN_CHILD = 1; + public const int CLCIT_CONTACT = 1; + public const int CLGN_NEXTCONTACT = 5; + public const int CLM_GETEXTRAIMAGELIST = CLM_FIRST + 17; //returns HIMAGELIST + public const int CLN_OPTIONSCHANGED = CLN_FIRST - 6; //nothing valid. If you set some extended options they have been overwritten and should be re-set + public const int CLN_NEWCONTACT = CLN_FIRST - 8; //hItem,flags valid. sent when a new contact is added without a full list rebuild + public const int CLN_LISTREBUILT = CLN_FIRST - 9; //hItem,flags valid. sent when contact is moved without a full list rebuild + public const int CLM_HITTEST = CLM_FIRST + 25; //lParam=MAKELPARAM(x,y) (relative to control), wParam=(PDWORD)&hitTest (see encoding of HitTest() in clc.h, can be NULL) returns hItem or NULL + public const int CLCIT_INFO = 3; + } + + public static class StandartIcons + { + public const string SKINICON_OTHER_SMALLDOT = "Small Dot"; + public const string SKINICON_EVENT_MESSAGE = "Message"; + public const string ID_STATUS_ONLINE = "Online"; + } + + public static class HppConstaints + { + public static Version MinumumVersion = new Version(1, 5, 1, 4); + + public const UInt32 IRDHW_CONTACTHISTORY = 0x1; + public const UInt32 IRDHW_GLOBALHISTORY = 0x2; + public const UInt32 IRDHW_GLOBALSEARCH = 0x3; + public const UInt32 IRDHW_EXTERNALGRID = 0x4; + + public const UInt32 IRDF_SELECTED = 0x1; + public const UInt32 IRDF_INLINE = 0x2; + public const UInt32 IRDF_EVENT = 0x4; + + public const Int32 NM_FIREVIEWCHANGE = 1; + + public const Int32 FVCN_PREFIRE = 1; + public const Int32 FVCN_POSTFIRE = 2; + + public const Int32 FVCA_NONE = 0; + public const Int32 FVCA_INFO = 255; + public const Int32 FVCN_GETINFO = 255; + + public const Int32 FVCA_DRAW = 1; + public const Int32 FVCA_CUSTOMDRAW = 2; + + } + + [StructLayout(LayoutKind.Sequential)] + struct MessageWindowEventData + { + public Int32 cbSize; + public IntPtr hContact; + public IntPtr hWnd; // top level window for the contact + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string szModule; // used to get plugin type (which means you could use local if needed) + public UInt32 uType; // see event types below + public UInt32 uFlags; // used to indicate message direction for all event types except custom + public IntPtr pointer; // used to store pointer to custom data + public IntPtr hWndInput; // input area window for the contact (or NULL if there is none) + public IntPtr hLog; // log area window for the contact (or NULL if there is none) + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + internal struct ItemRenderDetails + { + public UInt32 cbSize; + public IntPtr hContact; + public IntPtr hDBEvent; + public UInt32 dwEventTime; + public UInt16 wEventType; + public byte isEventSent; + public UInt32 dwFlags; // ??? + public byte bHistoryWindow; + + public IntPtr pProto; + public IntPtr pModule; + public IntPtr pText; + public IntPtr pExtended; + + public string Proto + { + get { return pProto == IntPtr.Zero ? String.Empty : Marshal.PtrToStringAnsi(pProto); } + } + + public string Module + { + get { return pModule == IntPtr.Zero ? String.Empty : Marshal.PtrToStringAnsi(pModule); } + } + + public string Text + { + get { return pText == IntPtr.Zero ? String.Empty : Marshal.PtrToStringUni(pText); } + } + + public string Extended + { + get { return pExtended == IntPtr.Zero ? String.Empty : Marshal.PtrToStringAnsi(pExtended); } + } + + public bool IsEventSent + { + get { return Convert.ToBoolean(isEventSent); } + } + + } + + [StructLayout(LayoutKind.Sequential)] + internal struct NMCLISTCONTROL + { + public NMHDR hdr; + public int hItem; + public int action; + public int iColumn; + public int flags; + public POINT pt; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct TFVCNDATA_NMHDR + { + public IntPtr handleFrom; + public UInt32 idFrom; + public UInt32 code; + + + public Int32 cbSize; + public byte bEvent; + public byte bAction; + public IntPtr hDC; + public RECT rcRect; + public COLORREF clrBackground; + public bool fTransparent; + public IntPtr lparam; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct DBTimeToString + { + public IntPtr Format; + public IntPtr Output; + public int MaxBytes; + public DBTimeToString(string format) + { + UnmanagedStringHandle str = new UnmanagedStringHandle(format, StringEncoding.Ansi); + this.Format = str.IntPtr; + this.Output = IntPtr.Zero; + this.MaxBytes = 0; + } + + public void Free() + { + if (this.Format != IntPtr.Zero) + { + Marshal.FreeHGlobal(this.Format); + } + } + } + + [StructLayout(LayoutKind.Sequential)] + struct ProtoRecieveEvent + { + public UInt32 flags; + public UInt32 timestamp; + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 2048)] + public string szMessage; + public Int32 lParam; + } + + [StructLayout(LayoutKind.Sequential)] + struct PGDest + { + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string pszModule; //Name of the protocol (same as you registered with) + public IntPtr szID; //Unique identifier of the session, or NULL to broadcast to all sessions as specified above + public Int32 iType; //Use GC_EVENT_* as defined above. Only one event per service call. + + public string ID + { + set { szID = Marshal.StringToHGlobalAnsi(value); } + } + + public void Free() + { + if (szID != IntPtr.Zero) + { + Marshal.FreeHGlobal(szID); + szID = IntPtr.Zero; + } + } + } + + [StructLayout(LayoutKind.Sequential)] + struct GCEvent + { + public Int32 cbSize; + public IntPtr pDest; // pointer to a GCDEST structure which specifies the session to receive the event + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string szText; // usage depends on type of event, max 2048 characters + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string szNick; // usage depends on type of event + public IntPtr szUID; // usage depends on type of event, Do NOT use spaces for unique user identifiers. + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string szStatus; // usage depends on type of event + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string szUserInfo; // Additional user information that is displayed after the nickname. + // IRC use it to display a hostmask for JOIN, PART (and more) events. + public bool bIsMe; // Is this event from the Miranda user? + public UInt32 dwFlags; // event flags: GCEF_ADDTOLOG, GC_UNICODE + // FALSE any other time than when initializing the window (before sending SESSION_INITDONE) + public UInt32 dwItemData; // User specified data. + public UInt32 time; // Timestamp of the event + + public GCEvent(bool z) + { + cbSize = 0; + pDest = new IntPtr(); + szText = null; + szNick = null; + szUID = new IntPtr(); + szStatus = null; + szUserInfo = null; + bIsMe = false; + dwFlags = 0u; + dwItemData = 0u; + time = 0u; + } + + public string UID + { + set { szUID = Marshal.StringToHGlobalAnsi(value); } + } + + public void Free() + { + if (szUID != IntPtr.Zero) + { + Marshal.FreeHGlobal(szUID); + szUID = IntPtr.Zero; + } + } + } + + [StructLayout(LayoutKind.Sequential)] + struct GCRegister + { + public Int32 cbSize; //Set to sizeof(GCREGISTER); + public UInt32 dwFlags; //Use GC_* flags above to indicate features supported + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string pszModule; //This MUST be the protocol name as registered with Miranda IM + public IntPtr pszModuleDispName; //This is the protocol's real name as it will be displayed to the user + public Int32 iMaxText; //Max message length the protocol supports. Will limit the typing area input. 0 = no limit + public Int32 nColors; //Number of colors in the colorchooser menu for the color buttons. Max = 100 + + public IntPtr pColors; // ^TCOLORREF; //pointer to the first item in a static COLORREF array containing the colors + //that should be showed in the colorchooser menu. + //ie: COLORREF crCols[nColors]; + // pColors = &crCols[0]; + + public string ModuleDispName + { + set { pszModuleDispName = Marshal.StringToHGlobalAnsi(value); } + } + + public void Free() + { + if (pszModuleDispName != IntPtr.Zero) + { + Marshal.FreeHGlobal(pszModuleDispName); + pszModuleDispName = IntPtr.Zero; + } + } + } + + [StructLayout(LayoutKind.Sequential)] + struct GSession + { + public Int32 cbSize; //Set to sizeof(GCSESSION); + public Int32 iType; //Use one of the GCW_* flags above to set the type of session + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string pszModule; //The name of the protocol owning the session (the same as pszModule when you register) + public IntPtr szName; //The name of the session as it will be displayed to the user + //[MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public IntPtr szID; //The unique identifier for the session. + public IntPtr szStatusbarText; //Optional text to set in the statusbar of the chat room window, or NULL. + public UInt32 dwFlags; + public UInt32 dwItemData; //Set user defined data for this session. Retrieve it by using the GC_EVENT_GETITEMDATA event + + + public string StatusbarText + { + set { szStatusbarText = Marshal.StringToHGlobalAnsi(value); } + } + + public string Name + { + set { szName = Marshal.StringToHGlobalAnsi(value); } + } + + public string ID + { + set { szID = Marshal.StringToHGlobalAnsi(value); } + } + + public void Free() + { + + if (szStatusbarText != IntPtr.Zero) + { + Marshal.FreeHGlobal(szStatusbarText); + szStatusbarText = IntPtr.Zero; + } + + if (szName != IntPtr.Zero) + { + Marshal.FreeHGlobal(szName); + szName = IntPtr.Zero; + } + + if (szID != IntPtr.Zero) + { + Marshal.FreeHGlobal(szID); + szID = IntPtr.Zero; + } + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct CSSData + { + public IntPtr hContact; + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string szProtoService; + + public IntPtr wParam; + public IntPtr lParam; + } + + /*typedef struct { + int cbSize; + const TCHAR *pszText; + HANDLE hParentGroup; + DWORD flags; + HICON hIcon; //todo + } CLCINFOITEM;*/ + [StructLayout(LayoutKind.Sequential)] + public struct CLCINFOITEM + { + public Int32 cbSize; + public IntPtr pszText; + public IntPtr hParentGroup; + public UInt32 flags; + public IntPtr hIcon; + } + [StructLayout(LayoutKind.Sequential)] + public struct OptionsDialogPage + { + public Int32 cbSize; + public Int32 position; + //[MarshalAsAttribute(UnmanagedType.LPTStr, SizeConst = 64)] + //public string szTitle; + public IntPtr szTitle; + public IntPtr pfnDlgProc; + public IntPtr pszTemplate; + public IntPtr hInstance; // Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]) + public IntPtr hIcon; + //[MarshalAsAttribute(UnmanagedType.LPTStr, SizeConst = 64)] + public IntPtr szGroup; + public Int32 groupPosition; + public IntPtr hGroupIcon; + + + public UInt32 flags; + public Int32 nIDBottomSimpleControl; + public Int32 nIDRightSimpleControl; + public Int32 expertOnlyControls; + public Int32 nExpertOnlyControls; + public Int32 szTab; + + //public IntPtr dwInitParam; + + } + + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct PLUGININFOEX + { + public int Size; + [MarshalAs(UnmanagedType.LPStr)] + public string ShortName; + public uint Version; + [MarshalAs(UnmanagedType.LPStr)] + public string Description; + [MarshalAs(UnmanagedType.LPStr)] + public string Author; + [MarshalAs(UnmanagedType.LPStr)] + public string AuthorEmail; + [MarshalAs(UnmanagedType.LPStr)] + public string Copyright; + [MarshalAs(UnmanagedType.LPStr)] + public string HomePage; + public byte Flags; + public int ReplacesDefaultModule; + [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32+16+16+8)] + public byte[] MUUID; // Ex + } + + +} \ No newline at end of file diff --git a/Speak/Speak/Structs/TabSRMM.cs b/Speak/Speak/Structs/TabSRMM.cs new file mode 100644 index 0000000..6fa5cdb --- /dev/null +++ b/Speak/Speak/Structs/TabSRMM.cs @@ -0,0 +1,63 @@ +using System; +using System.Runtime.InteropServices; +using Speak.Interop; + +namespace Speak.Structs +{ + public static class TabSRMMConstants + { + public const UInt32 BBBF_DISABLED = 0x0001; + public const UInt32 BBBF_HIDDEN = 0x0002; + public const UInt32 BBBF_ISPUSHBUTTON = 0x0004; + public const UInt32 BBBF_ISARROWBUTTON = 0x0008; + public const UInt32 BBBF_ISCHATBUTTON = 0x0010; + public const UInt32 BBBF_ISIMBUTTON = 0x0020; + public const UInt32 BBBF_ISLSIDEBUTTON = 0x0040; + public const UInt32 BBBF_ISRSIDEBUTTON = 0x0080; + public const UInt32 BBBF_CANBEHIDDEN = 0x0100; + public const UInt32 BBBF_ISDUMMYBUTTON = 0x0200; + public const UInt32 BBBF_ANSITOOLTIP = 0x0400; + public const UInt32 BBBF_CREATEBYID = 0x0800; //only for tabsrmm internal use + + public const UInt32 BBSF_DOSNT_EXISTS = 0; // added by xa0c + public const UInt32 BBSF_HIDDEN = 1; + public const UInt32 BBSF_DISABLED = 2; + public const UInt32 BBSF_PUSHED = 4; + public const UInt32 BBSF_RELEASED = 8; + + } + + [StructLayout(LayoutKind.Sequential)] + struct CustomButtonClickData + { + public Int32 cbSize; + + public POINT point; + + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string pszName; + public UInt32 dwButtonID; + public IntPtr hwindForm; + public IntPtr hContact; + public UInt32 flags; + } + + [StructLayout(LayoutKind.Sequential)] + struct BBButton + { + public Int32 cbSize; + public UInt32 dwButtonID; + + [MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 64)] + public string pszModuleName; + [MarshalAsAttribute(UnmanagedType.LPTStr, SizeConst = 64)] + public string szTooltip; + + public UInt32 dwDefPos; + public Int32 iButtonWidth; + public UInt32 bbbFlags; + public IntPtr hIcon; + } +} + + diff --git a/Speak/Speak/TTS/TextToSpeak.cs b/Speak/Speak/TTS/TextToSpeak.cs new file mode 100644 index 0000000..44c0084 --- /dev/null +++ b/Speak/Speak/TTS/TextToSpeak.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Speech.Synthesis; +using System.Collections.ObjectModel; +using System.Threading; + +namespace Speak.TTS +{ + /// + /// Speak Text + /// + class TextToSpeak + { + private SpeechSynthesizer syn; + private Queue quene; + private static TextToSpeak instance; + private List last; + private Boolean runner; + private Thread workerThread; + + /// + /// Returns the Instance of TextToSpeak Class + /// + /// TextToSpeak + public static TextToSpeak getInstance() + { + if (instance == null) + instance = new TextToSpeak(); + return instance; + } + + private TextToSpeak() + { + this.syn = new SpeechSynthesizer(); + this.quene = new Queue(); + this.last = new List(); + this.runner = true; + this.workerThread = new Thread(this.Speaker); + workerThread.Start(); + while (!workerThread.IsAlive) ; + } + + private void Speaker() + { + while (runner) + { + string text = ""; + try + { + text = quene.Dequeue(); + } + catch (InvalidOperationException) { } + if (text != "") + { + syn.Speak(text); + } + else + { + Thread.Sleep(300); + } + } + } + + /// + /// Adds a Text to the to Speak Quene + /// + /// Text that will be spoken + /// Signature of Message, to catch to offten spoken text + public void speak(string text, string signature) + { + if (!last.Contains(signature)) + { + last.Add(signature); + quene.Enqueue(text); + } + if (last.Count > 10) + { + last.RemoveAt(0); + } + } + + /// + /// Returns a list of Installed Voices + /// + /// + public static List getVoices() + { + List ret = new List(); + ReadOnlyCollection voices = new SpeechSynthesizer().GetInstalledVoices(); + foreach (InstalledVoice item in voices) + { + ret.Add(item.VoiceInfo.Name); + } + return ret; + } + + /// + /// Sets a voice to the current Speak Engine + /// + /// Name of the Voice + /// + public bool setVoice(string voice) + { + if (voice == "") + return false; + this.syn.SelectVoice(voice); + return this.syn.Voice.Name == voice; + } + + /// + /// Set a new Volume to the Current Speak Engine + /// + /// + /// from 0 to 100 + public bool setVolume(int volume) + { + if (volume > 100 || volume < 0) + return false; + this.syn.Volume = volume; + return this.syn.Volume == volume; + } + + /// + /// Set a new Rate to the Current Speak engine + /// + /// + /// from 0 to 100 + public bool setRate(int rate) + { + if (rate > 100 || rate < 0) + return false; + rate = rate / 5; + rate = rate - 10; + this.syn.Rate = rate; + return this.syn.Rate == rate; + } + + /// + /// Setting a new Pitch to the current Speak Engine + /// NOT IMPLEMENTED + /// + /// + /// + public bool setPitch(int pitch) + { + return true; + } + + public void Stop() + { + this.workerThread.Abort(); + this.runner = false; + } + } +} diff --git a/Speak/Speak/UI/ActionMenuItem.cs b/Speak/Speak/UI/ActionMenuItem.cs new file mode 100644 index 0000000..77bca77 --- /dev/null +++ b/Speak/Speak/UI/ActionMenuItem.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using Speak.Core; + +namespace Speak.UI +{ + + public class ActionMenuItem : MenuItem + { + private Image itemImage; + private string displayName; + private string action; + private bool autoSend; + private LinkDisplayType displayType; + private string mainWord; + private string additionalWord; + + public ActionMenuItem(LinkButton link) + { + OwnerDraw = true; + Text = displayName = link.DisplayName; + action = link.Action; + autoSend = link.AutoSend; + mainWord = String.Empty; + additionalWord = String.Empty; + displayType = link.DisplayType; + } + + public Image Image + { + get { return itemImage; } + set { itemImage = value; } + } + + public LinkDisplayType DisplayType + { + get { return displayType; } + set { displayType = value; } + } + + public string Action + { + get { return action.Replace("%NUMBER%", mainWord).Replace("%NICK%", mainWord).Replace("%COMMENT%", additionalWord); } + set { action = value; } + } + + public bool AutoSend + { + get { return autoSend; } + set { autoSend = value; } + } + + public string AdditionalWord + { + get { return additionalWord; } + set { additionalWord = value; } + } + + public string MainWord + { + get { return mainWord; } + set + { + mainWord = value; + Text = displayName.Replace("%NUMBER%", mainWord).Replace("%NICK%", mainWord).Replace("%COMMENT%", additionalWord); + } + } + + protected override void OnMeasureItem(MeasureItemEventArgs e) + { + Font menuFont = SystemInformation.MenuFont; + + StringFormat strfmt = new StringFormat(); + + SizeF sizef = e.Graphics.MeasureString(Text, menuFont, 1000, strfmt); + e.ItemWidth = (int)Math.Ceiling(sizef.Width) + itemImage.Width; + e.ItemHeight = itemImage.Height > sizef.Height ? itemImage.Height : (int)Math.Ceiling(sizef.Height); + base.OnMeasureItem(e); + } + + protected override void OnDrawItem(DrawItemEventArgs e) + { + Font menuFont = SystemInformation.MenuFont; + SolidBrush menuBrush = null; + if (Enabled == false) + { + menuBrush = new SolidBrush(SystemColors.GrayText); + } + else + { + menuBrush = (e.State & DrawItemState.Selected) != 0 ? new SolidBrush(SystemColors.HighlightText) : new SolidBrush(SystemColors.MenuText); + } + + StringFormat strfmt = new StringFormat(); + strfmt.LineAlignment = StringAlignment.Center; + + Rectangle rectImage = e.Bounds; + rectImage.Width = itemImage.Width; + rectImage.Height = itemImage.Height; + if (displayType != LinkDisplayType.Image) + { + rectImage.Y = e.Bounds.Top + (e.Bounds.Height - itemImage.Height) / 2; + } + else + { + rectImage.X = e.Bounds.Left + (e.Bounds.Width - itemImage.Width) / 2; + rectImage.Y = e.Bounds.Top + (e.Bounds.Height - itemImage.Height) / 2; + } + + Rectangle rectText = e.Bounds; + + rectText.X += rectImage.Width; + + e.Graphics.FillRectangle( + (e.State & DrawItemState.Selected) != 0 ? SystemBrushes.Highlight : SystemBrushes.Menu, + e.Bounds); + + e.Graphics.DrawImage(itemImage, rectImage); + + e.Graphics.DrawString( + Text, menuFont, menuBrush, + e.Bounds.Left + itemImage.Width, + e.Bounds.Top + ((e.Bounds.Height) / 2), + strfmt); + + menuBrush.Dispose(); + } + } +} diff --git a/Speak/Speak/UI/PreviewForm.cs b/Speak/Speak/UI/PreviewForm.cs new file mode 100644 index 0000000..3b1bbc4 --- /dev/null +++ b/Speak/Speak/UI/PreviewForm.cs @@ -0,0 +1,205 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.IO; +using System.Net; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using Speak.Core; +using Speak.Interop; + +namespace Speak.UI +{ + public partial class PreviewForm : Form + { + private HTTP http; + private Thread downloadThread; + private Image image; + private string url; + private int retryCount; + private int sleep = 1500; + private bool abort; + + public PreviewForm() + { + InitializeComponent(); + url = String.Empty; + http = new HTTP(); + } + + protected override CreateParams CreateParams + { + get + { + const int CS_DROPSHADOW = 0x20000; + CreateParams param = base.CreateParams; + param.ClassStyle += CS_DROPSHADOW; + return param; + } + } + + private void GetImage() + { + Stream imageStream = http.GetImage(url, false); + if (imageStream is MemoryStream && imageStream.Length == 0) + { + SetError("Error while downloading"); + return; + } + + try + { + /* + byte[] bt = new byte[255]; + int read = 0; + FileStream fs = File.OpenWrite("C:\\img.jpg"); + while ((read = imageStream.Read(bt, 0, 255)) != 0) + { + fs.Write(bt, 0, read); + } + fs.Close(); + return; + */ + image = Image.FromStream(imageStream); + if (image.Height == 1) + { + if (abort) + { + SetError("Aborted"); + abort = false; + return; + } + SetError("Uncached, retrying [" + ++retryCount + "]..."); + Thread.Sleep(sleep); + GetImage(); + } + SetError("done"); + CrossInvalidate(); + } + catch + { + SetError("Cant create image"); + } + + } + + private delegate void CrossInvalidateDelegate(); + private void CrossInvalidate() + { + if (this.InvokeRequired) + { + CrossInvalidateDelegate d = CrossInvalidate; + this.Invoke(d, new object[0]); + } + else + { + Draw(Graphics.FromHwnd(Handle)); + } + } + + private delegate void SetErrorDelegate(string errorText); + private void SetError(string errorText) + { + if (lblInfo.InvokeRequired) + { + SetErrorDelegate d = SetError; + lblInfo.Invoke(d, new object[] { errorText }); + } + else + { + lblInfo.Text = errorText; + } + } + + private void Clear() + { + lblInfo.Text = "Loading..."; + lblInfo.Visible = true; + Width = 150; + Height = 80; + retryCount = 0; + abort = false; + url = String.Empty; + } + + new public void Show() + { + Clear(); + base.Show(); + } + + new public void Hide() + { + if (downloadThread != null) + { + //abort = true; + //downloadThread.Abort(); + } + base.Hide(); + } + + private void Draw(Graphics g) + { + Width = image.Width; + Height = image.Height; + g.SmoothingMode = SmoothingMode.AntiAlias; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.CompositingQuality = CompositingQuality.HighQuality; + lblInfo.Visible = false; + g.DrawImage(image, 0, 0, Width, Height); + } + + protected override void OnPaint(PaintEventArgs e) + { + if (image == null || image.Height == 1) + { + base.OnPaint(e); + } + else + { + Draw(e.Graphics); + } + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + if (image == null || image.Height == 1) + { + base.OnPaintBackground(e); + } + else + { + Draw(e.Graphics); + } + } + + + public string Url + { + set + { + if (!url.Equals(value)) + { + Clear(); + + url = value; + + if(downloadThread != null) + { + abort = true; + //downloadThread.Abort(); + } + + + downloadThread = new Thread(GetImage); + downloadThread.IsBackground = false; + downloadThread.Start(); + } + } + } + } +} diff --git a/Speak/Speak/UI/PreviewForm.designer.cs b/Speak/Speak/UI/PreviewForm.designer.cs new file mode 100644 index 0000000..206c52f --- /dev/null +++ b/Speak/Speak/UI/PreviewForm.designer.cs @@ -0,0 +1,66 @@ +namespace Speak.UI +{ + partial class PreviewForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblInfo = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblInfo + // + this.lblInfo.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblInfo.Location = new System.Drawing.Point(0, 0); + this.lblInfo.Name = "lblInfo"; + this.lblInfo.Size = new System.Drawing.Size(150, 80); + this.lblInfo.TabIndex = 0; + this.lblInfo.Text = "Loading..."; + this.lblInfo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // PreviewForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(224)))), ((int)(((byte)(192))))); + this.ClientSize = new System.Drawing.Size(150, 80); + this.Controls.Add(this.lblInfo); + this.DoubleBuffered = true; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "PreviewForm"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + this.TopMost = true; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lblInfo; + } +} \ No newline at end of file diff --git a/Speak/Speak/UI/PreviewForm.resx b/Speak/Speak/UI/PreviewForm.resx new file mode 100644 index 0000000..ff31a6d --- /dev/null +++ b/Speak/Speak/UI/PreviewForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Speak/Speak/Utils/IconTable.cs b/Speak/Speak/Utils/IconTable.cs new file mode 100644 index 0000000..7df7083 --- /dev/null +++ b/Speak/Speak/Utils/IconTable.cs @@ -0,0 +1,30 @@ +using System; +using System.Drawing; +using Speak.Core; +using Speak.Properties; +using Speak.Structs; + +namespace Speak.Utils +{ + internal static class IconTable + { + public static IntPtr GetDefaultIcon(string btnName) + { + switch (btnName) + { + case StandartIcons.SKINICON_OTHER_SMALLDOT: + return Resources.icon_small_dot.Handle; + case StandartIcons.SKINICON_EVENT_MESSAGE: + return Resources.icon_message.Handle; + case StandartIcons.ID_STATUS_ONLINE: + return Resources.status_online.Handle; + } + return Resources.icon_small_dot.Handle; + } + + /*public static Image GetActionIcon(string btnName) + { + return Resources.icon_small_dot; + }*/ + } +} diff --git a/Speak/Speak/Utils/Invokable.cs b/Speak/Speak/Utils/Invokable.cs new file mode 100644 index 0000000..a1b56ba --- /dev/null +++ b/Speak/Speak/Utils/Invokable.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace Speak.Utils +{ + // It's fucking awesome. + // So am I. :) + internal class Invokable + { + private const int GWL_WNDPROC = -4; + private const int WM_USER = 0x0400; + private const int WF_THREADCALLBACKMESSAGE = WM_USER + 123; + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); + [DllImport("user32.dll")] + static extern IntPtr CreateWindowEx(int dwExStyle, string lpClassName, string lpWindowName, uint dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam); + + [DllImport("user32.dll")] + static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); + [DllImport("kernel32.dll")] + static extern uint GetCurrentThreadId(); + + [DllImport("user32")] + private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr newProc); + [DllImport("user32")] + private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, Win32WndProc newProc); + [DllImport("user32")] + private static extern int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, int Msg, int wParam, int lParam); + private delegate int Win32WndProc(IntPtr hWnd, int Msg, int wParam, int lParam); + + [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool DestroyWindow(IntPtr hwnd); + + private Queue callbackDelegates; + + private Win32WndProc wProc; + private IntPtr oldWndProc = IntPtr.Zero; + + private IntPtr handle; + public Invokable(IntPtr parent) + { + callbackDelegates = new Queue(); + handle = CreateWindowEx(0, "#32769", "WF_InvokableNativeWindow", 0, -1, -1, 0, 0, parent, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); + StartSubclass(); + } + + private void StartSubclass() + { + wProc = new Win32WndProc(WndProc); + + if (oldWndProc != IntPtr.Zero) + SetWindowLong(handle, GWL_WNDPROC, wProc); + else + oldWndProc = SetWindowLong(handle, GWL_WNDPROC, wProc); + } + + public void StopSubclass() + { + if (handle != IntPtr.Zero) + { + SetWindowLong(handle, GWL_WNDPROC, oldWndProc); + DestroyWindow(handle); + handle = IntPtr.Zero; + } + } + + public Invokable() : this(IntPtr.Zero) { } + + public object Invoke(Delegate method, object[] args) + { + callbackDelegates.Enqueue(new CallBackDelegate(method, args)); + SendMessage(handle, WF_THREADCALLBACKMESSAGE, IntPtr.Zero, IntPtr.Zero); + return null; + } + + public bool InvokeRequired + { + get { return GetWindowThreadProcessId(handle, IntPtr.Zero) != GetCurrentThreadId(); } + } + + private void InnerInvoke() + { + lock (callbackDelegates) + { + while (callbackDelegates.Count != 0) + { + CallBackDelegate d = callbackDelegates.Dequeue(); + d.Delegate.DynamicInvoke(d.Args); + } + } + } + + protected int WndProc(IntPtr hWnd, int Msg, int wParam, int lParam) + { + switch (Msg) + { + case WF_THREADCALLBACKMESSAGE: + InnerInvoke(); + return 0; + } + return CallWindowProc(oldWndProc, hWnd, Msg, wParam, lParam); + } + + ~Invokable() + { + StopSubclass(); + } + } + + internal class CallBackDelegate + { + private Delegate _delegate; + private object[] _args; + + public CallBackDelegate(Delegate _delegate, object[] args) + { + this._delegate = _delegate; + this._args = args; + } + + public Delegate Delegate + { + get { return _delegate; } + } + + public object[] Args + { + get { return _args; } + } + } +} diff --git a/Speak/Speak/Utils/Util.cs b/Speak/Speak/Utils/Util.cs new file mode 100644 index 0000000..dbead66 --- /dev/null +++ b/Speak/Speak/Utils/Util.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.InteropServices; +using System.Text; +using Virtuoso.Miranda.Plugins.Collections; +using Virtuoso.Miranda.Plugins.Infrastructure; +using Virtuoso.Miranda.Plugins.Native; +using Speak.Core; +using Speak.Fork; +using Speak.Interop; +using Speak.Structs; +using Encoder=System.Text.Encoder; + +namespace Speak.Utils +{ + internal static class Util + { + public static DateTime unixEpoc = new DateTime(1970, 1, 1, 0, 0, 0, 0); + + public static string GetNormalRussian(IntPtr strPtr) + { + return Util.GetNormalRussian(strPtr, 2048); + } + + public static string GetNormalRussian(IntPtr strPtr, uint size) + { + byte[] buff = new byte[size]; + byte letter = 0; + int counter = 0; + while ((letter = Marshal.ReadByte(strPtr, counter)) != 0) + { + buff[counter] = letter; + counter++; + if (counter == size) + break; + } + return Encoding.UTF8.GetString(buff, 0, counter); + } + + public static IntPtr GetStringPtr(string str, out int length) + { + byte[] array = Encoding.UTF8.GetBytes(str); + IntPtr strPtr = Marshal.AllocHGlobal(array.Length+1); + Marshal.Copy(array, 0, strPtr, array.Length); + Marshal.WriteByte(strPtr, array.Length, 0); + length = array.Length + 1; + return strPtr; + } + + public static void OpenURL(string url) + { + UnmanagedStringHandle str = new UnmanagedStringHandle(url, StringEncoding.Ansi); + MirandaContext.Current.CallService(API.MS_UTILS_OPENURL, new IntPtr(1), str); + str.Free(); + } + + public static DateTime GetDateTime(uint timestamp) + { + int ts = MirandaContext.Current.CallService(API.MS_DB_TIME_TIMESTAMPTOLOCAL, new UIntPtr(timestamp), IntPtr.Zero); + return unixEpoc.AddSeconds(ts); + } + + public static List EnumProtocols() + { + List result = new List(); + IntPtr countPtr = Marshal.AllocHGlobal(4); + IntPtr arrayPtr = Marshal.AllocHGlobal(4); + + MirandaContext.Current.CallService(API.MS_PROTO_ENUMPROTOCOLS, countPtr, arrayPtr); + + byte[] intArr = new byte[4]; + Marshal.Copy(countPtr, intArr, 0, 4); + int pCount = BitConverter.ToInt32(intArr, 0); + + intArr = new byte[4]; + Marshal.Copy(arrayPtr, intArr, 0, 4); + Int32 itemPtr = BitConverter.ToInt32(intArr, 0); + + for (int i = 0; i < pCount; i++) + { + intArr = new byte[4]; + Marshal.Copy(new IntPtr(itemPtr+i*4), intArr, 0, 4); + IntPtr pdPtr = new IntPtr(BitConverter.ToInt32(intArr, 0)); + PROTOCOLDESCRIPTOR descriptor = (PROTOCOLDESCRIPTOR)(Marshal.PtrToStructure(pdPtr, typeof(PROTOCOLDESCRIPTOR))); + string name = Marshal.PtrToStringAnsi(descriptor.Name); + result.Add(name); + } + + Marshal.FreeHGlobal(countPtr); + Marshal.FreeHGlobal(arrayPtr); + + return result; + } + + public static StatusMode GetProtocolStatus(string pName) + { + return (StatusMode)MirandaContext.Current.CallService(String.Format("{0}{1}", pName, API.PS_GETSTATUS), IntPtr.Zero, IntPtr.Zero); + } + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr MirandaPluginInfo(UInt32 mirandaVersion); + public static string CurrentMessageEngine() + { + // SRMM + // tabSRMM + // Scriver + int buffSize = 50; + IntPtr buffPtr = Marshal.AllocHGlobal(buffSize); + MirandaContext.Current.CallService(API.MS_MSG_GETWINDOWCLASS, buffPtr, new IntPtr(buffSize)); + byte[] buff = new byte[buffSize]; + byte letter = 0; + int counter = 0; + while ((letter = Marshal.ReadByte(buffPtr, counter)) != 0) + { + buff[counter] = letter; + counter++; + if (counter == buffSize) + break; + } + Marshal.FreeHGlobal(buffPtr); + string engine = Encoding.ASCII.GetString(buff, 0, counter); + + // Scriver 2.8.1.1+ fix + if (engine.Equals(LogWindow.ScriverEngine)) + { + Version vScriver = GetModuleVersion("scriver.dll"); + if (vScriver != null && vScriver > new Version(2, 8, 1, 1)) + { + return LogWindow.ScriverEnginePlus; + } + } + // SRMM 0.9.0.0+ fix + else if (engine.Equals(LogWindow.SRMMEngine)) + { + Version vSRMM = GetModuleVersion("srmm.dll"); + if (vSRMM != null && vSRMM > new Version(0, 9, 0, 0)) + { + return LogWindow.SRMMEnginePlus; + } + } + return engine; + } + + private static Version GetModuleVersion(string moduleName) + { + foreach (System.Diagnostics.ProcessModule module in System.Diagnostics.Process.GetCurrentProcess().Modules) + { + if (module.ModuleName.Equals(moduleName, StringComparison.InvariantCultureIgnoreCase)) + { + UInt32 mirandaVersion = (UInt32)MirandaContext.Current.CallService(API.MS_SYSTEM_GETVERSION, IntPtr.Zero, IntPtr.Zero); + IntPtr pAddressOfFunctionToCall = WinApi.GetProcAddress(module.BaseAddress, "MirandaPluginInfoEx"); + if (pAddressOfFunctionToCall == IntPtr.Zero) + break; + + MirandaPluginInfo pPluginInfo = (MirandaPluginInfo)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(MirandaPluginInfo)); + IntPtr pluginInfo = pPluginInfo(mirandaVersion); + PLUGININFOEX pInfo = (PLUGININFOEX)Marshal.PtrToStructure(pluginInfo, typeof(PLUGININFOEX)); + byte[] vBytes = BitConverter.GetBytes(pInfo.Version); + return new Version(vBytes[3], vBytes[2], vBytes[1], vBytes[0]); + } + } + + return null; + } + + public static Int32 MakeLParam(int LoWord, int HiWord) + { + return (HiWord << 16) | (LoWord & 0xffff); + } + + public static int MakeLong(short lowPart, short highPart) + { + return (int)(((ushort)lowPart) | (uint)(highPart << 16)); + } + + public static short HiWord(int dword) + { + return (short)(dword >> 16); + } + + public static short LoWord(int dword) + { + return (short)dword; + } + } +} diff --git a/Speak/Speak/contributors.txt b/Speak/Speak/contributors.txt new file mode 100644 index 0000000..54c3e4a --- /dev/null +++ b/Speak/Speak/contributors.txt @@ -0,0 +1,53 @@ +Miranda IM is proudly brought to you by: + +Gennady Feldman +Tim Hunter +Kubilay Kocak +Boris Krasnovskiy +Josef Kucera +Aaron Landwehr +Lyon Lim +Tjado Maecke +Piotr Piastucki +Robert Rainwater +Alex Sanda +Adam Strzelecki +Victor Pavlychko +Bartosz Białek + +Retired Members: + +Martin Öberg +Denis Stanishevskiy +Richard Hughes +Emostar +Esnow +Figbug +Tristan_VdV +Crypt0gl +Lowspirit +Glutnix +Santithorn Bunchua +Sam K +Jörgen Persson +George Hazan +Artem Shpynov +Maxim Mluhov +Ricardo Domenecci + +Our plugin developers, too multitudinous to name individually, but whos works are nontheless crucial to our success. +Special mention to Scott Ellis, a welcome part of arguably almost every Miranda IM installation :) + +Our translators, who have done great things to expand our reach, and who are infuriated that +I won't let them change this text. + +Our media developers, who bring us the icons, sounds and skins you love so much. +Special mention to Angeli-Ka, a0x, Faith Healer, Quadrone, and Valkyre for their work on the application icons. + +Our bug reporters and moderators, who strive thanklessly to bring quality into Miranda. +Special mention to Piotr Lukaszewski aka nowotny, not always smiling, but always doing his part. + +Our forum residents, who discover new and exciting ways to break Miranda daily and who are the gestalt + slash 'mob' that shapes how Miranda IM works and evolves. + +Our users, who...er...use it, and without who...well...we love that you love Miranda. \ No newline at end of file diff --git a/Speak/Speak/res/Icon_exit.ico b/Speak/Speak/res/Icon_exit.ico new file mode 100644 index 0000000000000000000000000000000000000000..9a1d7e60e39d3b82e30beb360e8c4754376017d2 GIT binary patch literal 2550 zcmeHJ-AmI^7=E|kY;MkdD4Vuyo6;&XVv4ySsfcDlX0tFaT0xLtbrBd{NS5Kp%8MlX z!0N^e`zwS%x+sO92tv9_Y(+`9VpxjS>3M%2Za+7|o9;aD?40+!@AJOroSmI#L5R>qngiILMgM!V}rDZltRSv{|)pyVCd zy>H1IoTB2udvf`vsbtFxZQhZf@?D=O7)sF2@K>rk_=TEUr|8h}Z*;U}h8j?y4L%hy82RdBR)?zZ~x3#-1>0+ z1lCXBf1iL5BCCYKpgjtT3$|_omNFqpasV3~Ah~q5 zv89cL)&g^$$*9^SRoLyNK3|znjVGzx=}q%dPb%M(&M(*Z>uplk#|7D+Zu$-J5%>WI zux*4W>?f)N>OtBAgw&pGo@ak}glJe0y#(~{Y(Oq^0B>+si^Q5pLzZ(56Oq^*@P&$| zH8AucX}*?6mm`_{C3SX<)j|Vms;cjK^ki5XpBXY1=^PD3=Y?5|32 zePOg*k7ErH75li)T=U}MvJu=$v!j2I<0H}JZ)lt-t5oDWH`C`X``+3NYrFOn$WGX|vrk^o-}Bivn6IpsfPhDxkLl+AE;J0(vZ%B z3)HVEbPqh{9MDYxEf&G*1kPYqw0ES$#VaWRofXj7oP6xxfc;lkUHx&+0sR%waRH6i z?VEj!f1H1*+1}g1G0<@VeV5~LkAgBM^CQRi$8PM!VY2m{;T-rs@P~WwLzz^09Et7c zI|C^9md9%QFg<7PiH{#x1;0kKbN1;RI{w1KlJWrMB&FXN gvjhLvfRF`1Y(NFmx2Y1Kb+HJJU_{7d_2#i~s-t literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/Icon_show_hide.ico b/Speak/Speak/res/Icon_show_hide.ico new file mode 100644 index 0000000000000000000000000000000000000000..fce8d96c0edee5a3c0353ac3308530476ebbf7c7 GIT binary patch literal 2550 zcmeHJ-%Aux6#leK9kc9rrlw`(7Sutg+jODZBWD2R%p2!e`& zzz6BA7f~aOqAbYDM@bEf>OspMR>Kuf-?_W9jB8ncfM@yU+;i_eXYRc_^L+!PAQd?| zpwB=k4Ojuh<06En0$14=&_1Gw(0RsEVlL5+$CZ_psH&<$I2=YzO$}O(1J`ReprLjh z7S*o@u58BKx?R|K>llg~_oJlg5Y|39inDiiV(+yB*m}PfJDQKcX$xch>k|mJpGL*| zGdOp7H|o!A!J~^6XuPro4=x=<$K6dB8aMzSarpBcRDHRJeYc`G zf9WRf-oB0IrY5|4d;x837jW@GAD*_h;`y^@c=_T5-nO^nLuV(tySnhPrw5;Ud-3h- zSM>Mw;pe~r1|t#t8XCgz@GwS4M|~TgY)+oQUL7mVN5 z1o2BS7|bRY3b{kP$dO#hcw_#Qho=Ia`a88lCPF9_ifRq! z2{l2~GhRz%k>iCNF63x~@BRG}i9`~8I;OR~d}@nOE4&(x)-rXsbqMuDs0~8R5Nd)@ zvyAuh1E=alb&Go~}*Avux`D=Lj-ukIKLd}t$?ryUm_5OVB zW2V-iewuYq^UVFJi9*d4>YB7PHw*R5>_@#nUvsIkW1xN1Q_&jKz;Q^<*ZIlt);}~j zXx2>~O?ZF4|GD!1KkBXU8^N46HCd?9qJ6p__5aG(GvhaasiEy;OptHs^An9mWn^UJ zkI*rG)0pSSzjkeN{r~+wa_;Is0w85S{mo_sqI&8D^`&>!|I(67M%tbl4S-=otKChNE@VgH~#m>L=0kEd^^ zN8wr1fjyWxWLz_(1O9wUjjOKF!@iwS7q+X~c|M-Zq<|mR1KzxGqyA0YJ(wCv4}|ee zB9Sn$Sj>wrt@PX5Ur=|JfLe=-6!-M5Tu)rI&t|RL)9AtfQ1-$15h&aKZpw9BZ>2DL z<81zD@p&OPr@QH~?9CUMq3P=Y(uWmbYTya&Rp|pj=4gd6+p(pkRRv!t_(8!J3T}za zb3K3^@!%E(r|_UfgztkG-SD^XHWXZ>;43{pxnkGz2@bQq7R#&lT{k>)rUY1y8Iv{z zoVO#Mu_-~GKaT@DpPTQv|8DUwOg|-b$N1oM1!vp+gQvqiFn8J%@Osz$aTl<2e_DUy znFIHZdqepD(_g8)7S@FGe*J$rfAoR7NT}zKJMJx^;vQrD@T}wfM9x2a*66nft?_&D TPVV3T+8%=jRQz2HH(h8~teYLlS$E$E>hHbSUK1SN^-`_46OZB3(kb71z~IcL6^bLO6%?}&sXETyFa z@ubZWsl{7h`_dK>>BiVPjzN8B2!2*V!DIS;%C5WQ%g)Xk*>$Z}>aQDVNE&JES}%<^ zHb`?SA#vuS15I+`)*(67e?(gE?UU1k$K}lZ{c`p} zvvfVWAiYnnNZ;cQ=^g5j+e267PNq`^hLbWl+$|4Z+?7|kjJzJn%DazmB=`BPeE5=+ zPvavpHZdv_ljAb^ZStoDFTO5TV6g)KvI45QfN-H1p?Apf+;G?lhh5KM{|I@G6OC8; zD;>wPw(Iz7O^vDX9oO37XjQz-D_>)xVQV{aQ|1}3+*Aj6r>fS2?HM!WAIw*n>cHQP zS$y2Y0(*JH#y5T>@UK|v#E?H4afAF`#fsvRk|MWcnT;7OwOs zF2B$EHhcqm@PCwI#EwDP_UBXj(centxz&3U7voRS?{z*+oR4Q#9W84GkTI+Plir;) z3Qkb)gMu>@oT1`F{yc?%)5~9)kwd{-=tb GMC^AO#{s|q literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/_blank.ico b/Speak/Speak/res/_blank.ico new file mode 100644 index 0000000000000000000000000000000000000000..7845f62fedd3f6d82b7667bb21628e45ca060c36 GIT binary patch literal 318 zcmc(ZF%p142m_ZHA3$Yo=`(p6Kf~m%wXzY&h6xQ2>deG-2b^}v$t4Ac2)+1*0u5E$ YM6GnU+=p4ij5kT`$oRSTAO7W=9{a^LqW}N^ literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/arrow_sort_column_down.bmp b/Speak/Speak/res/arrow_sort_column_down.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1fc197f5304cc6805a07e0237314554cf7f1ab46 GIT binary patch literal 150 zcmZumxe$kh1)zY{45 literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/chat_join.ico b/Speak/Speak/res/chat_join.ico new file mode 100644 index 0000000000000000000000000000000000000000..72197fcc239886816dabe88554e1c0b25a7c26c7 GIT binary patch literal 2550 zcmeHIF>4e-6#n-1k~5x1A_yX+I7G!N1}uUQhzM#Sq==1`NU#WKEWE;CA!}!Kwc3aT z@*|Xk>jZ@a3&Fx%b0TP?hlMG`@%v`y9kb_YjGb@~zJ2rFyziUY$MP0PP{Py{==Wh| z3^)OVxQ>-F&}8nUazvd_owp=+{k6qw^SFBZJRaVNPrW}VL9yCboU?VWeU>x$U+vJ^ zh3iC{nA@vH;5vF?F2-(J#y#A;Z2Z{!yYTDJfC{Og?CDLe6=ZIkZ zW80aV-ndpk%xCSQ`1~LFdzhB|>b)!ezS0PszSmvJomE}uRm**NyXoG)dFj2@0{?A& zjlf@y-_iKJk6rie>z4xj2hE4{kKR~lh#zwY&zDAQ{Ga;s#aBN<{fuJ4wCw#YKj^vt zfH+PxY|psA^Q^sVwXwGzYyS`2LQk!i=GALyQe$?QhVt4U)>HLZ`M=@ooL_oM?r!Jn wPP~Kvrs8*x*V-R;_r2!a3(kv-AhAibiH!3E6@s${2N{PMv%}D!d80Y=6Y&ziqyPW_ literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/chat_leave.ico b/Speak/Speak/res/chat_leave.ico new file mode 100644 index 0000000000000000000000000000000000000000..97cd85fa672d48a9408d4e800031396e68e7c6f8 GIT binary patch literal 2550 zcmeHIziU%b7(IC}@wL%FJ18v*W~p{+MJUxtEe=8u1Rb4GhoZ-uL_xQwZIJTsZme_v4&<-xv5UP(gyJDbP+}tp=O{ z3crc9DzM4eykbO?P+eS=+?4ymzkPib5AL;qlN-S4EnsdJmu_wY=YL@5(PO-Qx{VL7 zpX0@|J@mR=^uBbR(0DuUz_p!+n~%K+08BAW330t!n)Zq*<2LYSEue zlBA;gEV}gu*U^bep_epxYzW5^C`-M%0*$(4qc+)E=Bh>+uF3ppxluGH#dI#(umUft ze9kYf9s~9hz5?Mh!P{(c9=;(u+^?S{7Kw}W+rU0!znL@0SNrJSt$5{Rv1ZxeDRDE?eWEj=9e0LBZ9!5Ecm+_Uz|Y<-ot6MsWU5F zIknnSU9;6IF>~Qb5Imo?x5Vdr6z^eLe7~%&w9*>juBe{xSorjQFMNFWDq8LNt_8kx zK{~D3rE3LG{PNp*cI5Nz3qQYq`v-g%W4VA3-*0Z zBYwZd2Q4{wi8-QeIpZE=SvyqIddz&^f9-Xc>+7j{>EXU<#q(@$`~!Q+zUVttXB=;h zKSEE3@})(Mq2F))Q{JC>*nN1J&yao2kWGqoh;{Dc6wGL+=@&ER7hQwqjpocB?(4V@ literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/check_off.ico b/Speak/Speak/res/check_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..7cb0afddd9aed26d4c6fc048502910627cb24725 GIT binary patch literal 2550 zcmeHJy>5dr5dPdG1W<;oY%Hz%7mT*`O+_ zDskr1`Of}qb69r(3NKi%!P>`e0lWd)jP``uBJdw0Kt#94R(;`N<^71{3*|BG zEZ#7CWkkioBFc;S%{9A@JoJi%q2jk~os zoP(bsoTq6l`sWZX=k>vm`S2&unoe1kk?2RT@%g`iT(I$FYzXe%AMuSr|Nj1E|F?PO3w**yQSU5l?Q9aGf=yl^uaH-;QOHa91WAPCA(A3ZYD+7BQ48^3L=Y?l z6$KS1GwYo>e{xYm2my!tn4Q`EX6NRX*#nS32DckXJ0NNUxCGE`FGSA(?#Xw>K7yCP z>x4)vwI1uX$KwHr0bD!*gkQrDd5gf^`yC{cNyz8(P%4$6R;xj$(}B@wWD0T`o+@yv zz<;d(BJQRxnT4h$`=@ZfknBWTiG6L`gkx>nWZ}?l*SW07HkZp~*s`LLLo;kmQ8kqu zsy?p@QDnn*u0(O_^G>H@_2~9iep~tPzTt+4OAu3z2lE)4eby^t-%t`qtQUtMhxGB4-<)mCBIs&q8XJ+1sO(+ z@A!0|i+Zs(!1XH>3L-`-m9pHQ{t0j&a=9F4vsnSF?|0}K+;@K1cMQzu_bY5S_crMadyX5K%;$L!9|yq%fb+ZA!dm3m#Ew`Jms9Ers9mP{%lkFXun2DAYB z8F3<&jN^Ip9+pvCoaalCd0%8P5c#;4i`lIVpYG)5aLA9SG(c&os>3$|pY$ z441l)!oK^|4$T%2-)CveJdrH2K8#D>vn|8i!yUX%dcB?p_&@;Efqh^vp3{yD$_48h zdw_8p=)}4SO-{T5<$`s$GCX<5y&o!et~#GF2lL4758D=Ca^u*nKB$iR!SBLv>zer0G{oDQ#=LKOKputJCyHkcJRg1%PYxU8E69trAdcsQ zJ@?#E`;{Cv43Eac->#qMBaSs^31j_+F2_keRy^$X_gDX-vy|=!^N;e?dUG-MX~sV3 ze*DI3z3a|@t{*%f;5Gja>$CSO8pB7=H~Yacb>YAJ1vbU3h|IEaU45y)cSU{xwgEjQ literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/contact_delete.ico b/Speak/Speak/res/contact_delete.ico new file mode 100644 index 0000000000000000000000000000000000000000..6e39da592b43084489ff2a2b1353a716be7cbf26 GIT binary patch literal 2550 zcmeHIO=uHA6n?wgjW#LUO{qwmge-yD6jMt|EtXsY8YD-1CT)%I2XS>-(>{ZCXoA>71_ujnu-Y_d-h$*fs&_|_h zi<}S%*PgUTM7DvIi9tLF{nRi571`l>Z0x3FvyUa8e<`)vb6H!vC(Fz4q|taU&E^ML zUEP)S^pYb{ewT{Y0gc0PZ-}_WvL155Z~x+-`!Y7k z2XXE{JKH&fbF2Hu{=qhfp9q$WcXJ&4n*0GFZJO^#w1KuU_fi>?I`(kUn nSiE~OhDWg~K{(+%`=R78_zqs9E*vTG(Zxc`Ae?c(-irJIo<)1i literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/contact_groups.ico b/Speak/Speak/res/contact_groups.ico new file mode 100644 index 0000000000000000000000000000000000000000..a05bc55dbba1da4237c41131593c34dbd8b91873 GIT binary patch literal 2550 zcmeHJO-qzf6h5z`Ipr`q@-ls3IEF+}6x1qOH1r4h6_qU-37y=9<&3nF%0fsJicpfK z?}?DgCWIBj+ zEma~rMT{MhmP(NxaJ$F>5rA=eIR#PFjXl^Mm-JA-JWt(}XZLQ&*!^L7`EW!sk4NNH z`i{JQl9D%1@5zI_>&@7d4tP5zYJ)Njd6Ps!}ejLgr@ z%HraJI13_Dve#?ksF`~fLdS+5cJlA&Dh;Q81MtE zWovGNUJo<^dw{(_b6LJ0XTAdO0^Eo7ScA0=^_@F?m42f4Z0jJoviyz7j@U8q+khH? zdsi@ixHox}68D4#b@WpNM^m9hcZ2&ma10K+hn40vn zuO^^4f9U>!Wc!Hi%PTSONAT}Ybi__T9)aCw{dWG~YslfwRk&jn?plRASK%Jk&k6rQ z`iCxeuR4GD1N7rwR&%+W!X2%qe@*Hd{9SA=q;F+*fuRpzf4V4e5F7_MovxxzbybuPq)U+p@C^_(FF*-(9+2c8wD}Ab1r#8J1ncbhyvSIJ za#4yX5i8BDXLrYETPN=U4p->+p}xep2iyRW*BEz!XN}!5rl=LH3+5Vk8b>}H4)HX5 z#OvD&=JPogiv^a;C045y*6TI4+b#C{Jwzm#;4-|Nz~uz~@(FnFf4=-Hmm1LNCDu`1 z6t3%v#>mU6a%HrJmuI|UULQ2(tEzNGLnGJuVnLIS$ynb>?aTe~2vSV-PHY3yoZqu` zc;AEG!T;E5-P@hw{u{W~TK1U9Xf*N$?K}Pxh{Xqk!7RRq{mE-@Y6G!4YEr%SHBWGU z?RCLxp9?X|sTUjPdhLf^dtm_Qpq8-=Vm#MxHXFa&?E*~CSOzhk>#02)4x!%kHece! z#<`wrr=IIGz3nIQV&hy-EkSL1ein~jjOTj&hwuigAwM3ECum%ZXZi_w3rJEk;kWnO RX7>gCyDnzh26`8n?gOV49a{hZ literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/contact_view_details.ico b/Speak/Speak/res/contact_view_details.ico new file mode 100644 index 0000000000000000000000000000000000000000..e66f07983051307c6e199c977af1af9dc4548b3a GIT binary patch literal 6830 zcmeI1YfMx}6vxkk3it}Es8qCKi;=4Ep>0gt^g;WM_;}h|LAmWRAdj6yLazl1qH^_&kPV(ECJ9Ezb zXXf6$J9~!6LayZLNs_zM`1V9YiOAO%*S?f0^{b@rVY@GlZ$~t&Cy~F{NRwDR^pgyQ z=7jR2>(DQU(7ee+i>4AS33I1~li#G}vxrg_67AeYw0`yo+L$tp($l67BG=^zP=nH0h8=vuDkswaLk}{qH2o-k3%?dowAo;2&DL zx02QsSJB*48XYU%N2kk5XkTd=?J29IlJXN&Szbzq%8paP$@5fl`aE5|EY#Fc&9&=P zf9nQatF5D3b+vT={{7~;JS#n0foCh=^a?PuV;>K5BJ%L==c}iF-X7%P@9)#Qw~znB zB-eqRI=H&HbPP}l*X`Zh+}c?JdiCnrGXU3vE$;4?mzvuLcJcD+JRs0$A838PhqZs8 z;s1iQd$+Ep_JBTC&%Q%cd!Y2^7ucNqJY<082YVD1ZLXtYeI!z|G*zaEMXl0QxKexU&^JwY3|37rM2;3f2U z%Aim54Gm}^VH^P0XzL^R3Al}eo-*hYeM19UNSHU)17kw{VBuBaHR1KA4EjXh(0~?_ z>!RtShYDfKqsMYvGG+Ym_>YIZ^0jDU3|I#w*MvF2lT#8V@xHCgfo954ZY@Ti(7+f( z6YGF`fz%FjKCo>S@7fT@NpU}Ff}W$?T2x;-DKSa|TB3>jif0SS(BHB;oYN9RH9^l& zZY@S%n4>-YBYA81SbnloY+4bfIRi8t>0iE4%?%9=kLB{UYBf%*moroxNYm`;qYd+i zcKGMSGe%iB`dd$)G1{BMM|yMgI4MhA*k`0{V4IN?p@HI^DGq_%DQddR{GU)Z?o3M@vol@;L1~_ zJSI7v#|kIPig@a$13353-}uV)E9(9iW-ig30UGx7YpZr>r8`z}lh(vHZ`X5HX(2xs zv6|h(lelB}AKW)$6|dQz#Z~9ea^syl4BL{NcnwsQW;z6R(6Fape_<~dWhct^i@CP( z4iAc6!yoRi-#ftB-Hyo0kr1j<`~h$&U2*Y>89)Sw}0CR{M~p>^XG>cMM&ouCXSW zhbz=Qf^E&o427e6k9OGF(RW2V+H`$+1UTdHDSm75UxqHq>7^C?psC5wzh0Tm&S26v z|Nbid#;b*fzFGwNfY$Z;2EN&NS7|SWJ5jqH+gsx5idv^i8 zKEfNq+fD%c{)sa~f+gO}&N6-Cm{{>220w{8v&5EJV#^MJ9qi#J{=<<=%vmAvYL>XQ z0%g74R&Mr}*fdM5oF#_N5>w~-Q;1_ji6w^461%oZOMi*Mv&7#GBreYqr&qobS7#tG zb_M!u=`XQzWiRo22Jn?Qx=n3c{t|m^A!^JXNk+J$4S@M$I#LrMiRg0ZZWwm zaekKb0G2ZXmN>uix3vc5@xw^Y1Gq|Uc>~M&fbuu%qijoG&Iwq~8d%OJ zSk5VUU2zr58G=oHR6f#I&ySozD7z>9fc+!?{wt$GN1^O2c<$x-b8qo={LftK@z8$( D!faBI literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/cursor_drag_copy.cur b/Speak/Speak/res/cursor_drag_copy.cur new file mode 100644 index 0000000000000000000000000000000000000000..89c7c960d598498ccc41a9373e82a20cd805051f GIT binary patch literal 326 zcmZ{eAr8VY7=>Rq!N6<=f*@HX5{VlLXTT!}3V}o{bif(71g9Vvt}z9Y3y?fs+9s&| z&DYoW{y%Mj1P0au1v1PGFaj_Yim(ty%U6_O{yRyT!3`L$fGp8Xn)G^-K9pa9zWS-= zmSQW85qAe%BciVh;GpOCJ79g*52XG(%Danf5qN(|Pfflif!2~6_2-Tp3mpTwv=o(y Vx%rUklk8o{+>oWTlBe?S`T<~~bNc`Q literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/cursor_drop_user.cur b/Speak/Speak/res/cursor_drop_user.cur new file mode 100644 index 0000000000000000000000000000000000000000..a84b19e28b97fda61a1e51af08278e9f3ed927e2 GIT binary patch literal 1086 zcmchVu~LIT5QcveC!`}~I#M}yrnG|@-$C0{Ru*(nWCEj&T^_|(ptJNf?4-1CvVI2% zM>3g|F8u8NySI0H%St1j#X?A+WguN+9r)Ksdcb$%d>{n@Pb+)X5&tzaPfo2-C51RA zL!C-n_-CpB9c)vLr_w#ko+i?U8aCKv4OmuUJHDPt1%+kL(&~lU&~2gkso_N4&3+!u znp+Tq#3PGsw*ZRm7rh2|tHkD6X=?VEb1Bk9no3}1!MEA?!z_F?ivqJ4oxlzMalfu8 zOscrYd8r5zsj5!##Z+C_XcwTLuBGnSmbv5GJHq}++B*8Pii-c^B`l7^a393F%o~OI z+hDyZAM&WV%;`j)7yJCE?Nrw97B!@6dI&4xuS-#WSkUpKxNB`M#9cx!j`swk%l95Q z&LJne@jFB=-1seAb=}+LxYS|1^$zk|KG>gf&da%3&l1}$Pv<x$=Sy3u&?J1BWJodt zBLXqPoC)gy3t(wZv9;jYj4rf?ewEZ8a=YmZlH%Pe9m@}FY-KyU+2skdlO63~RcdM| mQ^P&v$9*jQ)Imzl2~yPoxq2%)*WB~Fy0E=;_1FI%!%|;nEPY=9 literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/group_closed.ico b/Speak/Speak/res/group_closed.ico new file mode 100644 index 0000000000000000000000000000000000000000..adb48b70a5514e8c37b18f0c086c13ebbf2afadc GIT binary patch literal 2550 zcmeHJJ5Iwu5S_)2?T(aGC>28D5-zCV1i3*jz!fMt0nl>?jzJR%AtHf7WY`vqVPU}XnF5G?s+<9wS(m7OKXBRLd_ z{BqEq_h0X`4Rd6O9{k%Y3_}N~0WRPbfO^`UqFkW&fjV#m92bCk+Ud8&k=f3$p92@b zWe$|7r=1*_Nb3tTrwQmCxXU=0$5urd_x{q>m{S__N{{+IjoGCK-AH%ZPlgw9%!7CH z)=w8-CFJbu5L9GK0< z-{xZPgWPxCpYdFn>n5H&mLof#@36G~pKq@Vg6z}gg8vaV|L?s2CeAMX{%yX`zb><9 OL}*|U60M4SpZNlFEr*!^ literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/group_opened.ico b/Speak/Speak/res/group_opened.ico new file mode 100644 index 0000000000000000000000000000000000000000..f15dbd5427a7c5ec0d788058c5dd1ef0b154529a GIT binary patch literal 2550 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 CYpr7d literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_all.ico b/Speak/Speak/res/icon_all.ico new file mode 100644 index 0000000000000000000000000000000000000000..6f7ca32ce0c89b5f352a305810a7b54e52da3930 GIT binary patch literal 2550 zcmeH|&rcIk5XWbi<<|nG0^PT;ZDA{=P;3f8ASnVxO&|unXhPz_gD3t14@RMefM^UR zdh}+D7ZML#6pcS_2BStepa~ZeFA_s6!3YJr^*e1*3MFvy#wMS>ecv}TeKW6}MNvh6WX)3261Kff~Se$wx{Jf8Wz{ZAc^MO@mycE~>g!Mf!wJ?kP7J z&kfRF>(u_-P3DM6=BP>DF)#VXedHhaQ{Ya3n(sDK%e@u~JPDBJg@?S;UTS?>OD(Tj zNd6#G(YqoNAB#zvl}MSB$UZNT^HVYTKFd_QAW_>FiOlyV_09Bc+uY&nVFeB=@V_gN zNF)yU726vJTx^a^L9Qv>E~u_*w`BVp+Lmvq&Ps{9QSy;>#hz;vY6+=v#}Dr z|5xKV|3zqRK!8G!3$n&w9mt`Rp%U%7wsdULy@_$7v!~+>bdI5cJ!4=kxo=m{*{qL> z4fKDj{;?M0eRPMrd$HaMI2X<>qmr0&Zc1ZUW2NJoV+Hq!Rl7hI?h;Exw73`+%UC}J zn!pjjc_izJF}3fWP%-xVO`FzY${bnR{fdNro-Eu^7W7U1hQ0*bE^rhSgJeC^W1chU ztQR99hI`Et<6=`A)~3aTh)c6%Ii5K-kw?sZ#r**G?LY@y3(i^gw0msWchr1g#vILfPxs!VoYq{ zF13t@hJ}6ognj~W9yTBs_7?_AyGr?d*oX7tF?r5BFCQqc(ns{Q-kIJwYO!uyHKw5R zdAKrvLD^>Q03U2nMDa0&YH>>j&Sj^XR~<%=Ql!+2yYr}JpqZMnC? zG5n|fIgTO6ckF@Bvtn=S>?`o$-%E}w?Bd$zWVbrF8bv>eqL(b@6TLw+CX(eJ#!?~z M-hf3A1?V$>0DAieF#rGn literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_ansi.ico b/Speak/Speak/res/icon_ansi.ico new file mode 100644 index 0000000000000000000000000000000000000000..ff863bf6ff17ed1c4985e54c1278b08874bddfa8 GIT binary patch literal 2550 zcmeHJF-v1X5S~rm8DkW~X<>63L5>406)}azAc$OX#TAxT2Ud!A)hXBrHi}}Qf<@r| z!2Oc^h^qyIR$7ST_wCz#S@Ryk34%f%d~bGV=bPD?7iJ=2Bq!yvK=#V|2a(SrZeNl0 zNaP5*FVq1QfOhsVu}Ic#|EK;*E;kqDYHL|qzgMKS^G$U3yWH-ritew89{dnJ*$_SZ zDcaZ;{d*WV>Mpw#=vLr8RzOu>bZukMIP5E?n~3{d(p^js4)OBNO;4%RR}A*Wj`M!< zgY(Y)Kx9n5koXfbQ0i@)BMkldX#Xc!0*{+x5#oBVjZk+tCUU>fwkPjtpRL&7HT2-u ze5%!I1QdXNpzLH3k_dIQN!tzss23*!ORX^%1zp?FetwT3qbuK6DpX0~*xB2t1pYPyTpz8xt`Mdi! zF~{#Q>ysQX|Mhm~YYTq(P5JHlJ4@Z4{6>A0@#sVGzd-Rn!Pl;Nx;Vb%xS6#hpO5#! zdpk5Q>Z3Kr1fJ!_9^yA_O^ER9t*qHA{-H+^*T~GT?cVAAn&)=~kq7h}-?S^^w3a*f)_!^p$HxtsAT-U>}J`O&Dx`f41AcG_iNt1ot;@CL6U5n z(5GlQL3Dx0n-^(W5#5FCBFjJ#uwAbSxAVvTya~}3l}azEQrV_@{S7TFyo2mLDYb*X zh5mrb)4>A7%jwqFCqyGgo&Cl=B;^GHtG``W&lBSgvO{=S2=!R`rfnf#y#|mhz z2c;$aqoHSEIZjAm6~c3}tU-}nxs)NjX_-b)U^>}g{IO9dJAy;3-_rTKlf}W-Z|R9b z-U-Ze`ND*q>}%2IGMVwfG-k*p=-wjwJ?FyXzh#|Cq9AO`Hca@OE%sKb1yYMynrgM0 z0ce*GICNgR2Oy>SQ$gY9$Q~IOGE$>PAX_^{-RWJquFCc1l zBG;y+an5@&dj97iA3deNQtCTO$T_sMWv$P`?+mcOKdZ=VfRU-GMy*`FQOB5{{VdBs zZ2r&-wlU2|Gr0S({+7<=Zr_CLGT{1g?BK2p6#+U4EFnIAB|11E+Bp&8=^LXXws@v}+Se+n+!uh1h$@ ze!PD;4*n&yVLaZ3E(elq<2ytQ3}ds*G4L+}-y!`O@DpG8AUe>o4_D?7U!wAK literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_changefont.ico b/Speak/Speak/res/icon_changefont.ico new file mode 100644 index 0000000000000000000000000000000000000000..4c8bff603a06ff29776cee397a20a2be3942ba50 GIT binary patch literal 2550 zcmeHIyGjE=6g``4vVkB5v=AEuKCskE8}U(yLIg==so3NL?9v1)D=YuN$|~3@V!+1I zPtZTG5({BGXEQtOZgx#bC*;Cm=048dn|miSfQJHVHE^wF&Wioxr@D#}ZAplMYNe z@E<#1j2W+NPZFbgK@cQ$e|%lJ1M;I!6spYb6Ei5Oz)li(j5J|kGShb0*S`guT z8^}U00Mdv!$$PdQ=HB5QJgPJrjUrL9tJ{ylx12K91!BfximPnJzjDy8Zz^_?*oZ;8 z?0iM?h5llM z6^tKlqy}cK3kV3Ht&K|}xzyJ{G zC5&|dS7;4uSg- z!PGZQ+`opY>jB)m0nWY%aPDP*3ylDi>p|iJd*WUP_B!xCcOVQyTV6VCrRJPU#k!NH zX!H#479cN!;xiq*XRM*6DnjPSD={&83I$zDX6)nWE);r`x|Nf2m$|-josq4}>yp$N z8I0=tvB7w=u8D{;0Henmpm;NaOMvif5?C1lK0gG0t^sOI;d>L3Ws^@ainV#|_iV{< zmQA0U{K?;Pxtu0EA{Qac*{xQc=hZ5{P#z)<5sHz|#+eRKSH5fm#1Wz>op*OAP(DK( zl#P&2F^bKp4$f)RDq(86vPAhbag69qFs>#F3t^EYmKI ze%8N6jt$D4gmRaZD-P-k5gkQLcQwgw|sFp}74-pEFZg z6bEH}Q+~s*TyaqEA+#3tLp}A0!^A1V)XiDkwyqRq!Rq2wf7H_<_s;KIeD6ZRyZvj8 zwi5Br{9t_UHQ&ro*u6OWmiZ4_`P*8X*3nJ0)lXe($uqxU^Mmo(25q*k3}t;+z3C^^ zKXF*UWZC44`)Bu`Htj{xKfk%mw_W{Hoazu~j&FRp<-bvV_I#NAOXTPLk*y`=ii2_b zhSs8Ua&+5UUlhlt-;hrnZRf`u-Km>ga?oeauj4$vnMyr+62!a>c<| z)vLAe7Fy*$bX9B7-l~@DuKQs@9F!Gj|3At7wf*8%7U!238=pnWi5PX@@1Ypr=?!9q Zvd)-lqOE;grkX^%x1}Xxth`$Q{s6l)aC!g$ literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_down_arrow.ico b/Speak/Speak/res/icon_down_arrow.ico new file mode 100644 index 0000000000000000000000000000000000000000..1fd67fdb0f1b4f88bf11ba2d69326922967e3e44 GIT binary patch literal 2550 zcmeHIJ8Hu~5PkY#lR)euMY^bQa2p7u2}DgGg-)OY2;U+)fqUJ~M@Z?yWc{8ziC3~M zTo@9979KPE=A+pW%m4vGOsAk6W03$4fZbCpVqi&bE{;eE`86lli67nWd7h&v3Y2Au zs;W@ewdXjfLkETq{KpPB=YHu~LCi6=KVh6C9ue)1Kdtt@7uM8*WBB?2Hm|_?9{8Lb z_fcGX&ZbRunfI0pm;2|^Wmy&yaR=c!g<5Pxc|}YN(#7@Wklp;QDes6UgLH8xbI{g` z<^JQJgd_h>yb!%PEPh0Jt61*L2A1QE{IhI?d=B0rPB!k`CXV~o3Cd$R9%-M+N514* zM;v#xI|bE5pPRmT+Vs!VBgv!#-*)i*Rx!intPc1yX2W^19&xTjz=~6@3*Yx!-vSC7 BoudE% literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_file.ico b/Speak/Speak/res/icon_file.ico new file mode 100644 index 0000000000000000000000000000000000000000..f47fd1a9c9aecd5fdb1b29c0e28539762a766e6c GIT binary patch literal 6830 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 Po4&w2DMOv)WB~sJ7C}@| literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_help.ico b/Speak/Speak/res/icon_help.ico new file mode 100644 index 0000000000000000000000000000000000000000..e4bb7da7e0fc57f764838c82349b38758d226596 GIT binary patch literal 2550 zcmeH|OK1~O6o${8JCmfTZDPm>L8JlG8aKYcg+fzlNFS!r1f>)qt;?cuzz*TpZE{jlVDSC9M(^oPq7 z&a6-{vqqupCUs73(Zy#wbbWf8`f>&h%oq*DPQsH8oOIxS>wsY#`WqIFM+K2|IBbGE zWzR{5La|K{nsz`?HERV-MkrjanjoBR&Rbh+xpcR=g>d4dR#Lj#G2HbnNORa0 zJS^cB>^&#i?Ww{sYn<U_H#C9E^`ZKaI+&GkGDk==^hK@ zfn#{3t2h6Iy5}p5XYlQt$lXUnTm$@d7nmb)<{SR8!T$T#Os0N!mGr+2O-?&KH%TDK9H+`yr-z z_|rwJM&;bd;%n$`T1=0ga#8Rn|HlubIfmYzbN)u)R;nHSRV3 z+l|n~Z}XW$OM?;iho^Q-IEK~@^aJawxc7~{v7Au}O>CMqOmAkTs%5t-N@T7G?*-6y zz^{1jf64M5&coY3W7uGg@9D`8)9`Zt9F2aCp-J!XQkM5&zBktUgRAJyfA^&pr!a@# zA%0HvbD^OSbj6n{1ih(GvD2wSKRg2ro?WNq<2enMe+qYTW|VP$*uc)pIK-9?VHNrY I=I}YQ4{G}>(EtDd literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_history.ico b/Speak/Speak/res/icon_history.ico new file mode 100644 index 0000000000000000000000000000000000000000..e757b93e54459c8b7b740114efc07c03a5bab258 GIT binary patch literal 6830 zcmeHMdvr}#9^R5-tg(i6E!33C{1LAe3rT9Ic19;%Ivorx#uzH0^{B^Gs?}lXLaSZ0 zRb4BJdW(1@(P}&*-p?Y5M?xYIL4pLy&Ew|gA<4bxo8PzZ!;!caW#%t?t?!{5UFDnW%T+M!=*TqmB-YGRf5&YDs)Yv z8XlRfMy@@j#;i?NVe3w-aZxF1+@>@&X;Z2i6LVg@7n82W{+OYrM4wad$E2x$N2jYP zTQXGG#*1qFmaA&^j;ktsXRi7rj38FF8*y=^W48pw;+Aqy^WtfZxt96v(EDljhb}{4D8aZQHKEC-?2jzpN5Tnns(@@ z`=1Yx(#k)eb3nlJ(yvU@;c1=15FGMVYL4_h3TQ)HK4<*|eFS_Sv&`Xx*L$HCL?glP z1g!+^1pb0fg3gZ#a*&Ih)|sOKlhgrQ$*usL9l>6Fb*u#_I+{E;+fR!I6E4>7sjLi zlD)>00J+FXZu%iw^nr2UwP5jmaq{;e?C<@}cIu+Tr<l$XpW$QZ6!(%ga8|xh7jic-QZ3Z={C7N8%yr)>S{;;T1#vkYJ zL|y!O;U0Vtla5ceX2~%H>rY;eg?=<92B!q7tv@KIfQp(55a=w*@;ujR)z! z^386T5%S%BOxu!yVJlA}=G0Zutc6j12lmQJ4DL5Tqsmf>YO4*7ni|BO&e3COLt8Uf z_pjoO2kDQDNi|;k?f~3)BjT{0cUWXHEY@j+a=7_=MjSS%;Z1*Z+(o1RvJ)T%uSf)Kx20YOYDB-r22_^; zcdT#-3>TdBGLKI^0@sRuA*xGCu>D+~<{%e2Us-m-poTa7u{$ptZ>>B9B6QtpOpQJ7 z)D?KRj9i_BVyn#ArHk@gFl_m7l;0M}+z6W!qlRvDwrjt{KZ%XK zycku51t_wWYc6v3-IQTa!<+t;T{*_+%~=?={v7_bDp}7xbm*IS_n-X$+YK0HH{dAC z^T2)oIm*N@+fAoG^iTYlHu+u5m^@M6C*&gM-=Z%X)bOT1Rr+LKgD{B!*FCC=aq;v) zOnm3>fHfBm>ovi3eLQnyJFZ=jbt=z*(}%Zwn!X^Tc_)1kM3~#ru|?% zZlSg$AEjkh%|*_E(OCvHyy<_q>zbZFWAN8+cO(8BwdI*7nkdc!iZYS7YpvGX8TmC( zm=42o0r63bblb^Cf78cm5n7BL87SmM5a@)+L}IRnOU}n*nf|%U{G{+=jC#yO{w;LE2s2f^;1Zu7A74hkn&s zBn}b-Yf&D?Zb;F#x?L&{xf5M=p$8jc0Vp}M4m33zq zUo2V2v=2HCj6rcWlC$$LaOnxq#;i@Q&@I`ZhD+c4{^i3q>GSyN_L)b?cc7=lq5JGu zycc;A2h*;?RwQez^eP;sIj|Mq!2a_&7_;uA9>cM;F>`31*vneOrEh-!Y{0hgxSV=6 zW{%mxnfYmrEh-!R_(%9d^F^TWB78< z4X^fQu3>9ZG3bXRLx9kYnGa<{ZfbCUA@6+V{fF`kU)jeQgIp}woBvRJ;?F(n)$CuL zxn^|JUjvQ6uL3k3kJ0 zM^GxTOH3ut1Kxzq1%3i|o}v#U>%BCSuJ(@z+9+91;~sTQ{eINkPhDEHhvcFm`R02d zIb}$``JOh(OB)N?xl$1#%2c0a2*U#%}W zZ1k4@Uu-t@)Y-=|l0&a&FZpvw{@wYGB=+Qx9KQ!{5{{AFdp-NfF&U6t zzUv)J-m_fxb$#I&$=}zrmpnb>TLC0T@8O_6?cHD>$4GAfzV`B60rFkJWAA+5<2#=d z?Bke^;_q+I|7H1(0r_45`DWm;lWzyQjeQ(5-HSb+?fie0?;kpD@@)k2Jw(^p=Kk;f zB;NC`<5@rQ-2;q)8S)LpknbM%v`N3gv99&2@1H+RTl2{G4{f-1AGaJ5f;qni@}y-x F^uO<)yr%#F literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_loaded.ico b/Speak/Speak/res/icon_loaded.ico new file mode 100644 index 0000000000000000000000000000000000000000..98f3453450af2b8e66d8050cca4fd2f69d45c792 GIT binary patch literal 2550 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 literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_options.ico b/Speak/Speak/res/icon_options.ico new file mode 100644 index 0000000000000000000000000000000000000000..1cbc247e8bac93e70a922b020add0224f4065aa0 GIT binary patch literal 6830 zcmeHMTWnNC7@oFZ3y6z!V^Bgs~UL{t#v(xMk zSYu3-02T^`2Wd2lKIj8c63XpK4MIQ&2;HT$yWRW!_y6W}mOZDZdv+luJ}{ea|C#wO z-^`rZIp_Q#P#d!!DA{l z6d_8-a*5%@<3c@i}-S zfG^J3YDO&s=P`Qbs^&g1 zYto}Nk4&6+--HP~1SjKe#ux@KCf`W(I&_m682+?j1mc4SeBkCgl^hTHY8W#avxgCg z51z>%tXn>MpWC&T?{jpku;ta6UobbuFtw#|`DpNVcX!+3%H@Blee*(FyL_>(T)rgd z$=q1qX`5F)KMMR_uh$kH9^=}hSJtKMz{zk9XL-`m?ucDUAamA1cAC+)y(XK&WS=UR`~!2kZ+4RZcIpO5U& z*L#h2yjv&j5X;WqtcOouZ;ye0%bFJ@f4|>PcJTXp>6?x7r5$3~*_-w7K@99Swg1%o z1A&0NmIpgNr(Zj_4+8r8{XS~jR8PtlvKZ)N?z7|%27|VHDbVkyUGLSCviIp$En!0%qIpFh!P)b{#E!y(D9Y$3s2vwj90`THoLtpG0U8HKD*IB3ZqkH>AV ze=HiIJ(`P@EhM;=>^gl+)|DP(P*8o*NZ7=$pFfF2oZ_*lE%s^)2)2j|nTwjn8Fci_ zaYJ9O9zO9{#F9UmOpqNC@hI(eFOYVKWoK{J%Q45z{QC7zCX=?;KN*ivhve67;R9d~ zsCqsr$INrcJ%7~xOQ%xVYXv(iq!q>kf&w0{qq9gH%4L1kWMo{By5b zDt~|Jbei}b*%p$YZ4nP_ z_!ynwF_`;RTaGzpe= z(qo#}Ew`OX>-?~7`(*W?HO{rQs<*eU=e05NYp*RC;ODol0!oKgUw~D9lic}h+4<-9 zQCj%kY#HF6#m@i_wKgrQK)X${;jH`>Kj+@F{%Q=67=vn?{S*8QrNFs)OMm4HY2~l@Iqz@q zFJ%6>hb!QD2l2s^JO4uY`9BBgkNZ)IpS=_?e^ob+-+b?aK3_5Wqg@R4@tLLeAL_;4 oV+Q>3n-gch+q9PdgP|g^2EK>)Zot`g!{rcrYBvIAZRQpD52Mv-vj6}9 literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_search_all.ico b/Speak/Speak/res/icon_search_all.ico new file mode 100644 index 0000000000000000000000000000000000000000..08f61cf65a3aa792316ad39a77444cb629b96be1 GIT binary patch literal 2550 zcmeHJe`u6t9RHkqqmZdP57CUcO>JEBb`7%Sd2TxxiwqSBlDdA7o9N1wZMBvbzNbS= ztyXk13LK>_whN0LL?cYD!a=r@7B^zioMwWvjj`3DW4=$H@AKY`JCO6+9X;fBLqN=J2Pdxl6URWQ*OAl6I$Hq0NuC9hzSBE#Y zhS2iNCbT|RgLmsUBhvIN_SM(p*q$bQ^y(|(}dJx@*BlxoYFgiLqa55T2Z!Ct>pLgNA?ij4THvAa>g7Xn1`=hW1qMTzm zaH0nXzwX8NKmUqEB7y#21~D)&fZ=n4n7r5zYqSs6_#lRV8^Yx1d5n+z0c-LitmG*E z{&O6bWo3|Zu5Hv6o)>Zx?CnVt3H8D{-B8 z?B{hf<@fuioKEM8RE+DO?8j-W;Mw05d;b)lNFG-Y7Z(a>={yUFk)g!c+ZFq;;K@=J z-q^o2)Y7m%c!64@s5z>(vh+e|rT3l2#>R#;mc3kK=|4%l9`8NB#Z8S#yuH0fQ8N@Z zLml1oqT-sOCaFjyqD}S`%fw26L-m_~qBbdNjG|sCYMI`jT9y?fl}C}it9|9(;SY8< zDe94;#;H@$ou)O`X+Uro>9;A!i{V`7Jo*!Zd6 zO=^&ikhd($2Xh_ht|nw(~LvTB76v^QWvT1 o{+f;9nLuic{bh(2XW!t9aR>VgJ6xE(2G=t7ov@f27&3u>0XG*AFaQ7m literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_small_dot.ico b/Speak/Speak/res/icon_small_dot.ico new file mode 100644 index 0000000000000000000000000000000000000000..12ffcb1997809d5381bf5b87592d5b6ecc60789f GIT binary patch literal 2550 zcmeHITMEK35S)ez#UFEoe2JePA;;-0%n5qHoJEW~bt^SkNGm8v0>eJC({86>12izO z7GgW}JKzXt?9jKsAh{EB0w-YIxSEG~`WlB25M!KeR<|lp75H}rQcA!2#Q7v*4<=81 zt1(KjgxdummiC!{owIIi+sh2Dt4sm!y%Dq-Oc@(c-d?O#&@cW2$|v`%pudVQ_oti$ pq^*3pdlR1_e7<{a|J1KjOga|pSE_TZ`%Hm+hFlN8JLGj!d)3qo9S2K@>d1BWRTfLf`@^Vjw66 z)Ix|Uk|HUBjS4nmp#;S0;F>gQlR9Zay77B^yE}8ooo+gdo8@EX{d{j`XJ_79AcZu1 zAM6jKY6EA0P%fgH0iIKLPIN?(5Wk?Mnq52&<;vCbn7TEL={uKDo4AhI`(-RVx`M^2 zYnYoH$Eznd@Va&zOEcs6umNmt0^8fb?k=Ddu==!uwS@=Rc<~VL-p=FW@+{u3JVWEt zBI=)4@ca9kF>!C$+kxH={0}>z z*a^L9nhxqM=J*DoOoVajv|l9piEi^}gvb0I@XcOgkT*;mBRcMc=*@Y}@j>{kOD$^< zIVqp@O|dR1;mG{bi=33t+Ssyp(K{sN%Y3Y*inTO`$O-ut>#br9mMa`!Zx5=`XyMBl z>h}H8tl0sdH9X*NZ8iD)50LM7f$)iL=f`HP57sSfh#>F6e+c29B90Jkm#}#VCGP5c z<%h%&$XfVs5pZQ6Y0n8){ETDUGOXSlIZ?Y;eoVZazB~FRLdegM+wts0K_oUI_fY0K kDfqfR_a)@(WlqX7*Zc(j0BSE)hyVZp literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_typing.ico b/Speak/Speak/res/icon_typing.ico new file mode 100644 index 0000000000000000000000000000000000000000..a2dcf7fd1719a5e2254271fdba22b79fa0944aca GIT binary patch literal 2550 zcmeH}Pe>GT6vw|iyF0s+rJMhAcXLfvg%l0+P`I`SFA)SC5{(EX57yElOso#IX+?(+ z579NWE$Hzd!H0Z)W!Q-UD1P z5D0+QkA5#u2iW5X`aQrX=Nfd5M2PN7U#<<4y|>35XHA?KawB^FByjo)qW6KsTstnz zCouM<4`#my2g7E#yp0=*9>VcwlX z)#xi!KL3j5i52)})^RJffZ->C@z;yEJ-dRZZpuY&WZAxsy~@?MZ1ZCj&zY@aIH5K&t~b`z7h$+kM7P{>o( z*g9=?4?HS9c4mxw`$#W2MGlb$QbTG_SYL#- z$f!n!1^V}GmRWo;AIEMZOC)JTl~HV%znW8k-_%c+s)Su)>( z{{DO#tmUFO-f8-~IQ-N9&RiPo0fe<*)Y=-Cxv!N}Wc;1hslh%$*fV7P*)xdJ)YPQ^ zFP@^@S4M-qho}a74q-1L>?zXzfwtih?kUghy)m27(3sgz2zv}+FCwm3>O(Xdjd8so zpTDkUG&E-RG=f;_eK;J}*!8U14OD&=)gT@tHmPSq&!eK}-GtDW`2@@(U_MFGCYei; WOls4dN)oki$SPSQ>qOlo3H$=?b!HL( literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_undo.ico b/Speak/Speak/res/icon_undo.ico new file mode 100644 index 0000000000000000000000000000000000000000..23ecb07f0fd299f79b27ba2ecb19bc56946da807 GIT binary patch literal 2550 zcmeHIO=}ZT6umE#CTS-hQ;N|Vu>n6Q3etj9D5Z&X)18|NwF`-rsacrVg3^u9p@LoM zN@+y|3o5R3CvGAWSN;Kaf-6_z(uHVyJ@@rZI?;(6U0BG2!~K|h?%ek>d51_*j2wqx zQ&jCCI!Fc90`u2F7zHgR@pH2`zpCW!aP5f$>xKSbYfu{@a01Ny55`nx1+A2m zv2AjlmEH|W<&swDG2;HD)hh)%MaogRxRp{WW@3esT-HvQ9=cNA8NBeXtQCm0g%^NhD{Q^%MpDTYOfVu`#oFKvy^cM|F5fDF2{jhAlm`*tm6(0_cZKe1jdmY z0iZz93tGc}0=Ne{@n1aIOb8d6!_Xjx9<}g#xt~`r56*y_1R_63Npsjx2#!F#H&73djI$d(r$xg`thx(gV7v`R>e#1=N;+L)G)cg_TQ%Y51c+U-%>f zKEJ&pJ@gFFSKVXr!qMxfpQ_CsbEOXcSeReCI2Q}%*Y-_?q1Uq}GMC}+1HUyt z{_lCo%URua^XGIA?1dZi3_WLlHp$R^&GqIFPJo*T&n~`j?$PT|(THTo`L^ zUgrLd`)e=LZ~ud9_6T~NS+A!@?_JFff*bk!Me+AaF1TZS+#>-z_#SrZ8;I{&h;iTi Jz_WlO_9u#|lwpv?tC|UX;I0~)~E>2qf4LXQJ(Lo0%!N26_R0KB{ zhj!~wi07nvZSwk|2qH)yoV@#W?z_2p$%}}Rh-5N?IU!A3WL?D9bJDa#?qDm>2IK(7 zc|#4Rq3rAV{FQ8%9^~-gS&on1<^1eJE-$+B^w5s#L(BtcXa&8U`qe-er(uOt^hw(V~T*Q=teaf`a2fYMj zYqgqxc#g8rrul)`#R;}w;p_TwP6uoC);DZf#*QipeD({p1^BdO7>hZy zkNEr;i~j@7=l)3+7`p@hyGd z+M?Z^9opO5OB?jj?a>Sz&A|Vf0cOsjE2p+^sLmQQczV3VIEPfq}-|cb)lF>lVM= zmFM4>?EhiL#yJ_A;AC{1&Dk-AE(0TM&I~hjn$7Ej49(`vYXb~z=LWalEAywmL6g4% zn$6JWtiXPP`+Cks0_|-rJzZUD1A>0MvVNfJSt08X?PdL>ufHPUV^5G3DSj*X@(*E0 mq}Hz{{9KXZ=EGa5L^}CL+d*<%6o4AVFvm0wEDmU|~g2BcZD} zdL%dQ@&{;KrS~szmEpbnVmTyy*HL&*PqVW#Z)a~;JG(#w9@=eCuVWYhyFh05F!X^D z`);a_=n;xbq>-wko!Re)JNWQq52L5I@bTFlj8FRb{PGB2-yY)2=|g-UJ;IOZ6{09Y z9LJbUCb&5NM#Pv-rwzOzfFSJr78aTy z<_5MO!3Unaaq ziaZ(rAkWV`$?Cx6D?jh8S}60E&E55Dom{@wPZC9u@eVCQd8b+q{X6f}1ZBSFUqv)V zzJ~wGub4cqw8XXLclmr9R7qdNh%XNJPW#v7JEPX#X`jU*_denAjl!`njqj0c4`XL9 q(>C8QNnftTAy;R`KRv$jN&R&o4!Jt3I)8qqb(YnxjB-7wYySc=pV(sn literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/icon_windows.ico b/Speak/Speak/res/icon_windows.ico new file mode 100644 index 0000000000000000000000000000000000000000..f6538a9bf302f0e27d255ad068ed2e3d3df9329a GIT binary patch literal 2550 zcmeHJO=uHA82z%F=0`VaOpzQL5Tul%ATc7<5*9?O1q=4#$xFd_QY?7!U?ZWT&>|k% z(n4Fjh#)}(^`Jrv9%?-bwO(uvy;La0dtrQUcDJ1@4c427eDIk0-oE$EWHy;EA`!79 zlM##wDYuCn7xDAFl%paO;JU~Gd4M_{5pUR?`}zD(LEhXR6q&pt$6no(^B?ZZr%GA6 z-5)Y=V_k;tZOHJ-l-&J1E2rMB%eAEqxwWz>UuPf5mxT%W{(3>Gt2L=U`z4PjH)ZbS zwv4ZC$@8DTjRjlN)(Nyu;D0&+rPKkpU(jYt1yaF?`C`*_oVlL9-+b*yLx7ZUi1R>@Y|Nc zeXr-_;JW~H0XRhwdeJWw`ierY(I7`H`bk3#a;N8)YVe)|^w)%1^qGblPGEzKg(FAQ_wi^j2?IS1-9NKFGn}7x+2S&-Kk3UY9jcb%LLLl>^AMo literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/miranda_home.ico b/Speak/Speak/res/miranda_home.ico new file mode 100644 index 0000000000000000000000000000000000000000..2328a8ef16cc175ceffaca12eb2ed98b993cbbde GIT binary patch literal 2550 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 literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/miranda_manager.ico b/Speak/Speak/res/miranda_manager.ico new file mode 100644 index 0000000000000000000000000000000000000000..6706ec2f6c3bf21926291a529505ae2b89bd29b4 GIT binary patch literal 6830 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 J!|1~8^KU^uzSaN$ literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/status_DND.ico b/Speak/Speak/res/status_DND.ico new file mode 100644 index 0000000000000000000000000000000000000000..b362cd34f8b834ae49cab13be9ce7e9bd5c20f82 GIT binary patch literal 6830 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 H9b^9mNAA@8 literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/status_NA.ico b/Speak/Speak/res/status_NA.ico new file mode 100644 index 0000000000000000000000000000000000000000..95324ff88888163c309d70da85092576ba85aaf1 GIT binary patch literal 6830 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 LmoXqdDdh|RnS_@4 literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/status_occupied.ico b/Speak/Speak/res/status_occupied.ico new file mode 100644 index 0000000000000000000000000000000000000000..69f63a6fce2d9e00f955ae8814046c58a6dd3994 GIT binary patch literal 6830 zcmeHMd013O67Ly6ktAqv5Cn!{7+^p^MGhH61~0-XAb6kx3aF^NCQ$(u6+}P|6;Tlo z0y)&g6D5~X6A6mOL^p{WB}5HGklpB-%xeB1#(A|>4@N--!WY>8tnd3xzwWN;Uvj*f55rK1_8zuZU|V~?6-(4*%x?r^_NaqhsL^hR1zkK9 zy6&jUB4o^Kt2^__n!vmZJ(zNjg861oWRps~*|c(B7Pc*nMHEJ`>4*GTM0E&@JQmKP z4$We7Pe!tsGf^z=U>r-XOJd2FS2MBSPNo~bnHeURvSF!}%rx#86ECh}^5rL()v}M7 z{mRqKBlRo`%0A1MWmK_sJ3nJ)Z(m_%2ft(Dsz#=$zQH6P-({0BYFTK`=PV?rj?LNe z1&b-V!~*K>vzU5dDGhBbzx*`YdVM?F-cZPP+$dxP%^bUU@glo=^(t#@Y-D%u-hDdP z=U2~H;Q0!4TLA#*)6x z)R^~%evBQ*IXTHX)lF4I=YxOE0T8Xo!vhLbJ4 z*X*(jDQ(1f51kSdKAsP2cgDLv76XO>MdC&3zSva1l!ce zf@QU`5ZSpd2$r3f`nz3`2IW1p3MdALIUm57=uf-AasEl5K50-%y}8WQs23k--a2|i z^j=D*s)*ube2Ak<`flF*{uOJ<1P-(r?-t%Q`DeJwudh@3@5_K^-8aeJ(Dg_U2uu3ma^u{!ZWygH#SMxAgjMjc<B_?@>ye+Ht!G8YKE@tmPR6QNolb_ZUEzRd3$7>lm(Jzr zIdh8r25#KALDA+=bAGI@*Vv*cLk`2+V&QwO{=g;Q?x;;8HiUYlZhewVm^_L-k_ zd49jb`C9meG=Jr8h1#dclN-Nz97knO81s5G&!1A#47YCG0*>Q)oWEMF1_J5w@8;C} z*R=2ph~IOID=2p=z-yaZuW;Mo$B&g>(F(1tt23X)k+V_R*w>t4TB(xrE*#%0yz<<+QF9Ame)=Uyue=M%#s7lk1$Q7muLb63-bS>* z!Y$3PbbBi#6}Lhf>dan$k$?WoWbRtu!9j+DJn`9oIP*|A7rg%!Zc3RCH@VDPD<&0B z;M`M|aCTv3ux3v^)*HsYs>EPplfQ&fA2md@461Qp=BVSUeeS1$D|>W zAtSvR9CIQfwNLprzOtL0qm*(h%AsmN}K z`XqvzeI%Z9TT}}2@N$UFxD30h9zgL4MD;`T=K;iLT?JYrdhcaUJ}>tYe>E;J+c4WF zKJ55m_wPlw_i`Bx8Qhwy$=sT6SMykZEtT8WRKV?NELX2Qousm#9gXwb@f-hqciMx9 zR~}lrMm}2ECvJ@sc9C`#nso@Q^n;RyipTFZAL9<*sp9cg(*bqXh1}n$kJd^OAo*m3 z{fKcE6W33)n3B8Fa@zJ7iZc}JdWg3gs@_VWZK&;ZNrDKQ52yXKzrycHILJ_hn3>zS3lzaog7N;*%-CWows|2ameRRk6v6^wh#)&Uzw}4Q zf7+7`1oJm67RGI=6DH<@&fm6!&Wb`1F3AO9?8dJIfr~bx&IE)z!U185pz{vd_DATf zq9=^ooJL%RTR#NJiQ8cH(Z9j+*pFa&^cEOyIo|F^#EN3nB_GBiqzF3k^>_Yy!i20D zG-ulnT0mL*3&dXeFT{TR80PXxu9AuymuAi%5c;Oi!U4bHq?ty0g={@|*B3P265H8&c7D>Cn z_r&+Gqd^59{s-XT&j8uiRSm^^E|Ywbf1ut!hR@$=lcXY8dE_k2D*pgn zHkE_(#uEOT>V%nP?}N>TGNAZ?+~$aZia$)4nD3~I^GZHi16xjh0c($+Ne(>l<-cme&eOeq3sYAN#OW8BF(BaBTOW49t(6K^Tz4amGT++E5g zxrV~U+2aHWS{uq_P2A0V%py${rt>v09_PH) z$Wgg*$Oz|f9L^I#=Y?+H`jS9Ng)~%psq;6r*e|aAo228+X6(9jm%eD!9JIIVJch<@ z;lYLKq`KAW}w`wdHsPo zbWX7)khjO2wpM#;Cwn8uDB907_Db?0>hLTs@@V_FFXqBw_N(PEZ`GSmupnh0P&?TV zlZQKN?5RY1evBD~Gt|MGcXF6>2h62+1GUrq^~_y|bhg)A>qe)>3|f%Mb6`#$Fc<#> zR3~mTWd@xEyNT|Cw0Zbn0AOw(Bu9P%@ycpmpKN$cD=5KoWH&=>!2c1f^%thW!n#&? zv*i(w^5#dd==^Pe&omy|Taezy%XfI&vX(!f==LLU+y5nCALvY(bjAy9Y(`HJ+q>&k!B3u zj%??wK0xig5;G3@^V7Bsc8e{(h DUo6Ea literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/status_offline.ico b/Speak/Speak/res/status_offline.ico new file mode 100644 index 0000000000000000000000000000000000000000..1cf8daa5f4ff32cde5363bbf7713b06006d6971a GIT binary patch literal 6830 zcmeHLX-rgC6u!)qB1lDqS{0EI5ure+3syuyDa9=c;!27{j8R&x3%Nq z;zVL%q8L7WxEM2LjL6K)6jP>55!0tn7c*zh6tic~7W3xK6N?rt5{nlv7R#0`6S=v$ zV$GU0V*UE{V)N$BV%xTDB0oQ0Y~Q|J?AoR{J42SI>+o6Wj5#oIRxxh!ddnjj%6JRDK&W9@&xLWs8s);i}I zU>|wuXDz@Wfc}`2OUK)EGCVOnx9|em0i6J76Tv{Y2EZ}S;au{Nmog~N-neKsNSsH| z+TH*nhte5=vM10R=+gi=#yOnZ6(BEVd<__KQEiZn=jME$sHmv;-o1Oz95`^`(S(GA zium~WN|fj71O4X)3>Z+{vuDrWI(6!l3f>=qAAnGRw!oWHYcS-a>6ExevxkSrHxUsL zNqzhFElWyDl8K3lO-4*iOr@`{@7Tb=z@H(D_6P?80NQ~YkUE@FaBwhf?%tj9iA3v^Sa1A#7dK%_0O0wLoQgbKqANcD3BL#7wnsVHf`FZBbU{=4$5l^kOS-FTeoiA zd)g5pZwQoe-?ai7eReJkzRoi`I=YbjICJ{ety^{E(~V-oh7CH-roLmx4voCq!vtPrND_8!zb?cV$c_&Yv)amO8+#U35*RJWeZ{OD7r(SWrhyx`(di0>b zq0RZs&DL#Qfe_dSoeev{2gn;YZoGf^@S*_wH$>rKSIJ%+TGvdv~67WDd=< zxuMfZX@V_AVP6zchcm>+#+FA$Mos~5AV5D){Y~0$nAaHb+z^bRf&TvfF^G-nVPRpD ze0+S8(AOWJk7umoS?>(c*EH$8VV*0Zui$fdAtp^5Hf&hcs8OTj=+UEPT3VW9edy4k zfA{Ox?^n!;17ZOBdiopgy-&3P_m4a7z$>V0&YU@taS8WViI}J`Yt}5a4&)>Sn9DWv z0=fe9Iox|qK6jW~pWN}j)2JJOnE!nT@C>^2_ZV-GQd3g{ z`Rrw7W%BXk$4c*;H*X~I^5sjlo(B&es5QVhDH|Z~N`b%@(U12YgEh$I%a<$tuV24b zx>?%mzjW!6#P<=&xi}kq2ZsH54nNxdBS(&mrOff;$1D3jefm`Cr`>PfyeScHWOjD8 zoIH85%*e=4`Vl)ap|eHypJ9K*K*@N@b=<#yUtYg{U8bj}OT;?0_qhL%?-+Y<5cIdy z`4f2mrOYXj|1uuR2@@tLuxP#((DeP6@eTA!6lUiB9g+?B_Tb znL}}D4rK7<<>hI-Ya-ud-d9`l{!6)>2S&+kVQ)ZIQsT-jGAH23brsve=6HU_WjJZvi!jZChUr`+|hvx6=Os>!f-f literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/status_on_the_phone.ico b/Speak/Speak/res/status_on_the_phone.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc71dd8da85ed9f1ba2168ad4eeeba725a7142cc GIT binary patch literal 6830 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 CW(8#c literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/status_online.ico b/Speak/Speak/res/status_online.ico new file mode 100644 index 0000000000000000000000000000000000000000..91329f0f119d2b2f0906f57fa9328687204712f2 GIT binary patch literal 6830 zcmeHMYg80R7OrkUkto8*C_!KbXYd)KBO(kUgHaSw0cA9r1W-gJy1K>)xDo{)AR}Nz z1yo$jON|mAF~;|<2x78oHpiUEE+!j^k3H+zJ-cko4}5gpy|-stKzSO>EI2QKg=URnAq69usmRE}vPZKq+e29Rt}qspAH!k`Vp-II2o`&E z3Ns&?%4Qvy!QMD&X7OidvBdp}EVU|yrCwRi?B}jys`=}f+u}UdeaU9#oVtU#r0-@v zY1`P4%-=KD++)mm^amDm`bRe7{4Ew=b%)KaxXI>SxXI>J{hckibeFBZa)-TB^MIw* z)Uy?cyy{JCQ%wQe{6hiTbmKlNy!n9by7hpS+fm zlLvA^orbaUu1!(f)7t(hgRy#(^_ln-P#eiooYf-25EPGzGAZ!3pU4pejNHr#p+eAP z(HiTA(6s>SBOc-<8ImO(q)SA!hlr1WCkX3~z>`C^IRr}s!XGiB1yCRH5U&q{WJyOC zgrXN8TO?)P#NX3vgjc9fh-RTKQg>KCSzoT3tgFyX(N#W$$-2sZ6Z;+08ntU(ykH>OTelVx9BX}&cCtUU++NG-*twY+6ZOvb#`J1*GrO?749=L8er?MkZWJVVS zDfVeUY7x$eR@Wc)3uHfNgFl$I7$G=+#4{mmOE3hkAFkLRjCv_@cSF$Hr#;vrsr*zW z!j`OZZ3=F(>{)RM1Jhz>@We1(YkX)v^jSgn9meVx0gd+E+zSe7n1n& zqtQINEP_udo6stv4o2{#^Rs!vi8m#Z^$hbmB|3-{f9VXM_uksR$L=PKHvUxskEXh{XaBb%_Pl<-UcB`c*aUb-X!r z%;#jU1rmLueWNr}G)KusbMTJv{)78S_e7NULQtG1`|Vn9$k!Ipz9G;V>c#r%0|evb zSwdh$98-Ia!?s`q#dtdFXs>%BDAu%Vzad|1M6rVA;Uv7ZYQC7brbr&Dr%N8WAFF!7=&SAaVSi8A6ox(yQO>7^N=7e$T_PkJ_m`{9zfA;4mnntTJ*k`n7k1pah{8>OK{*Whl_Op`>>?3 zWZ#f*4EN=Jp96mZ@)H{{A{q^LihUtzeSo+y9}FKhlto_Gu{hjHPQV7dFI|nm%9RtIfUEsHRyZlUb!t|0aK)ZW{Yfg)_K>& z-2b!k2+!1dJge*QuFx8Y$A+FLqv4EYV45KVGHp=mEtLviIi@FS1%UdlnC1bXAVr6i z7NO)R!rF0S^$F|~;1TL!b~n1e)flQFs&S}_&VRb=H%ppGO{q_`&!3w6rlxl4M?tzn z(a@TZA~$FM94V!0xrFykY5C=4QVN!-U#CckpCwA9m-tYSbTlFAi#-%0MVC$Fn6qvc z(+)+;I#94#dCZ67H_6Br5u6*K$dezM5ZW&vofZ5L^XD9M=}!T3>Kywe+xVaIAimaMc~K8ZH}yAS zZ}HJSF1-lz_@KakW{UFOTF9z3sIre+`8vsAo*yu8518|p_1I5emWy2EcZy-n68=Z% zhyNu2{|Nx*_+?0Fj4tLSCeWT-ePL;CS3j`s2#rw>Jc&z)opEc)P|Wz%9Z{Pqyi>- literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/status_out2lunch.ico b/Speak/Speak/res/status_out2lunch.ico new file mode 100644 index 0000000000000000000000000000000000000000..07443be63b3bad1cde20aad2ab275c3e9eb90b4e GIT binary patch literal 6830 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 Z(CfC~OSu_eI~@3>&_cjy<&zA?{tNHSqYMB5 literal 0 HcmV?d00001 diff --git a/Speak/Speak/res/status_user_online.ico b/Speak/Speak/res/status_user_online.ico new file mode 100644 index 0000000000000000000000000000000000000000..2e1bdfa48542cc6155610628bc0527c40ef593c1 GIT binary patch literal 6830 zcmeI1c~n-%6~OQNfItwDU=am{Paq-+0wT%>D7aKXL8#ykC`TS72VP^-DDhQm}}Ky`J`)i7HZU}P77-lRj1NTbe;kq$+B!PSycc7BQwDxCI`G` z<$>?KT`*^PCipEYhG{GI!h}^tFky8u1g|^>fr+IMm3RQ6k`9AM#(o%;SpW$ec0$Pd z^DueiC5TEs0yA=pVBVgS5PtA7L>~MVEH60)u?NpX+~Erld;Bt3?I;6_eRsg3=q_|C zxeq;#KLAbXw_sgb1J>vM4C-@_L4ElN#N|{#?2cOypLYY6?z{~#C1ntM>ITFSNoQ|> z?dJmgEB*!%-ykGZJ%hBoBapfK1f&;LLPl{FY(4fZY<(me~baZw!Y^*ToGuYePp;5!YYq+e zux$Z;#yXVk!HA&DuRxc#mIhmHrz_Ema3Tj#*?Hwh@Waq>T{w%4qq_BBL*!j3Q_J|wt3710*qn6s{d zxwTtAyZ)hQ>l)H#42`>tC0p);3&Hcznc#)TZF1Y%gyXJfVe8r7s_*E}W-QK@SEpYP zn|6I6HtnfY*pOc-nAC!=#pb=l?k~mKZRKLYihXhqhmmC+I&}@EHav)a1g%h@m8`4- zZS$av-OS3x%)0NGbGukjz}(RWNo<|wZ1}*q34Uz zZpv)KeUK#85c0{}5(k3U0?&iC7^uwD?j6l-Joj-s(W&Jka7pP~F=gdBr4JT%gSijh zkSRPSXTKF*Q**?Sh&;hX!Xzi zb`4BIw{cs9TWAKp3+^Fl!r6a?G7sc)5Wy+2&Hg>6Y?pc5u0iXS7;qfg3ft7hEJyHI z$S>z4&IKP4+QzS9o1f1-AoILyCT379^M!ZB&NksQy+E;H+YvE^4gNXymIUWfZR-!% zf5h_ha%{>)44#pNL9wO6Z+?jwHMe#A<{uT)*IpCB(OI}Wy&S`qe*+wiySeWW3NhEiDKOjXp{3f1h*s5Ac))LEE` zs#%*+HEqo;X>`mQa^gj}6a2pMeua07t*$qEu1z?Gda9`PN$krw{R~>4e2D6^e?qHc z-=Wpf-=p!y6LtLvS(r<@+y~x!^dxx4_rBxTQ$?qY<1v4Hx(0p9{*Ke`{1c~r@szGV z;Ha{{p#6#O(Bj}-r4N#eZ#emE$hW-r;dlOhL{iP#bjddN3Px4Fz?>R^JHIDtWK6mL z9Fy-oQ~Ke0?hzVqIi<`6Ipe)gUxL5+yzhB;nYXovYW5Z!P2*f}PsZZM07ynZ926xrm40PRFfr$@L@%@`05N|%gI{(!I*HItb zuGM1a%uC3+l4cCg0e|l}{`BkN-9?(UNu!#Rj@{$4(D&r;@YAYVJo8t?qQ{7-U)Q4l zg=+LT`v5^(%l5?+xsSWv-b6&gper*u5HXEyEruLVjQ=EYA>wU3L&h`I0 zzpr(oeF_4=hp>K0-_~c8E0|jPZnp$I*I}Kfq)#?Jm<&k@K-bo2(7Q^<6V(#pGkrSd zLF6RGA1O7_a8BXdhA)=a*oBil0~Z|k4qjZwcm*vg=d#Ptsq?8R{;k9Nk7h*^Fn1K4 zEo0>B12Ubl%5=sm(hgVt7?!Z-1=l-zjte8hX4{~%Xdl+0vt&W%#e&X~UqNTbV*JV? zxxS65^=-V?2Y#jr+whXks0E!>zX6?F3r$#xOnzuuls>#+Pv_r)&bnK~Jv@!=dEd=r zcum+poq@~#2_=Hg#+xN*#W7_JWZ0}dwIL$c9F~{nRLHUUx8)@}ZppDbZ_9CcH{{6V zBZ@8idChT?0`+a1CScCLlvr>)ni4SQ-$O#;@I|JQpxKT$siasPU|($0H+i=LmvuuImynv)JuB&&HngGGvF)U|gIwRljn-Sz nw;_D^+M04L?P98FCw%q4;ddSm?TFY41ot6Fv@k4Nd literal 0 HcmV?d00001 diff --git a/Speak/Speak/resource.aps b/Speak/Speak/resource.aps new file mode 100644 index 0000000000000000000000000000000000000000..6819e287c27cbc4aeba25d172996cf9dc6e25974 GIT binary patch literal 484740 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 ?K$3t?U9^vn>Imqc7_6l}1wOe9B?;cCg( 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

D410i4m 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 Mc!%B!KV`xH9|Pk+$p8QV literal 0 HcmV?d00001 diff --git a/Speak/Speak/resource.h b/Speak/Speak/resource.h new file mode 100644 index 0000000..4124284 --- /dev/null +++ b/Speak/Speak/resource.h @@ -0,0 +1,528 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resource.rc +// +#define IDC_AUTHICON 1 +#define IDC_NOTOALL 3 +#define IDC_APPLY 3 +#define IDC_DECIDELATER 3 +#define IDI_MIRANDA 102 +#define IDD_ABOUT 103 +#define IDI_SMS 103 +#define IDI_ONLINE 104 +#define IDI_OFFLINE 105 +#define IDD_CUSTOM_FONT 106 +#define IDD_OPT_FONTS 107 +#define IDD_OPT_GENMENU 108 +#define IDD_OPT_PROTOCOLORDER 109 +#define IDD_OPT_ICOLIB 110 +#define IDD_ICOLIB_IMPORT 111 +#define IDD_MODERNOPT_FONTS 112 +#define IDD_ADDED 115 +#define IDD_URLSEND 119 +#define IDD_URLRECV 120 +#define IDD_AUTHREQ 121 +#define IDD_DETAILS 125 +#define IDD_HISTORY 127 +#define IDI_AWAY 128 +#define IDI_FREE4CHAT 129 +#define IDI_INVISIBLE 130 +#define IDI_NA 131 +#define IDI_LOAD 132 +#define IDD_OPT_SOUND 134 +#define IDI_RECVMSG 136 +#define IDI_URL 138 +#define IDD_MODERNOPT_ACCOUNTS 139 +#define IDD_MODERNOPT_MODULES 140 +#define IDD_MODERNOPT_STATUS 141 +#define IDD_MODERNOPT_IDLE 142 +#define IDD_MODERNOPT_IGNORE 143 +#define IDI_DND 158 +#define IDI_OCCUPIED 159 +#define IDI_USERDETAILS 160 +#define IDI_FINDUSER 161 +#define IDI_HELP 162 +#define IDI_OPTIONS 163 +#define IDI_MIRANDAWEBSITE 172 +#define IDI_RENAME 173 +#define IDI_HISTORY 174 +#define IDI_DELETE 175 +#define IDR_CONTEXT 180 +#define IDR_ICOLIB_CONTEXT 181 +#define IDC_DROP 183 +#define IDD_HISTORY_FIND 192 +#define IDI_SENDEMAIL 193 +#define IDD_FILERECV 194 +#define IDD_PROFILEMANAGER 197 +#define IDR_CLISTMENU 199 +#define IDI_BLANK 200 +#define IDD_FINDADD 201 +#define IDI_USERONLINE 201 +#define IDI_GROUPSHUT 202 +#define IDD_OPTIONS 203 +#define IDI_GROUPOPEN 203 +#define IDD_FILESEND 205 +#define IDI_NOTICK 205 +#define IDD_OPT_PLUGINS 206 +#define IDI_TICK 206 +#define IDD_OPT_ICONS 207 +#define IDI_FILE 207 +#define IDI_ADDCONTACT 210 +#define IDI_SMALLDOT 211 +#define IDI_FILLEDBLOB 212 +#define IDD_READAWAYMSG 213 +#define IDI_EMPTYBLOB 213 +#define IDD_OPT_IGNORE 214 +#define IDC_HYPERLINKHAND 214 +#define IDD_OPT_VISIBILITY 215 +#define IDC_DROPUSER 215 +#define IDD_SETAWAYMSG 216 +#define IDI_DETAILSLOGO 216 +#define IDD_OPT_AWAYMSG 217 +#define IDI_UNICODE 218 +#define IDI_ANSI 219 +#define IDD_INFO_SUMMARY 220 +#define IDI_LOADED 220 +#define IDD_INFO_CONTACT 221 +#define IDR_CREDITS 221 +#define IDI_NOTLOADED 221 +#define IDD_INFO_BACKGROUND 222 +#define IDD_INFO_NOTES 223 +#define IDD_ADDEMAIL 226 +#define IDD_ICONINDEX 227 +#define IDD_INFO_LOCATION 231 +#define IDD_INFO_WORK 232 +#define IDD_ADDPHONE 233 +#define IDD_INSTALLINI 235 +#define IDD_WARNINICHANGE 236 +#define IDD_INIIMPORTDONE 237 +#define IDB_SORTCOLUP 239 +#define IDB_SORTCOLDOWN 240 +#define IDD_OPT_NETLIB 246 +#define IDD_NETLIBLOGOPTS 247 +#define IDD_FILETRANSFERINFO 249 +#define IDD_OPT_FILETRANSFER 250 +#define IDD_FILEEXISTS 251 +#define IDD_DELETECONTACT 254 +#define IDD_ADDCONTACT 257 +#define IDD_OPT_CONTACT 261 +#define IDI_DOWNARROW 264 +#define IDD_OPT_IDLE 268 +#define IDD_PROFILE_SELECTION 269 +#define IDD_PROFILE_NEW 270 +#define IDI_TYPING 274 +#define IDD_UPDATE_NOTIFY 275 +#define IDD_OPT_UPDATENOTIFY 276 +#define IDD_OPT_KEYBINDINGS 277 +#define IDD_OPT_HOTKEYS 278 +#define IDI_UNDO 279 +#define IDI_WINDOW 280 +#define IDI_WINDOWS 281 +#define IDI_ACCMGR 282 +#define IDD_ACCMGR 283 +#define IDD_ACCFORM 284 +#define IDD_WAITRESTART 285 +#define IDD_FTMGR 286 +#define IDD_FTPAGE 287 +#define IDD_OPT_KEYWORDFILTER 288 +#define IDI_JOINCHAT 289 +#define IDD_CHOOSE_FONT_EFFECT 289 +#define IDI_LEAVECHAT 290 +#define IDI_STATUS_LOCKED 291 +#define IDI_SHOWHIDE 292 +#define IDI_EXIT 293 +#define IDD_ERROR_LIST 300 +#define IDD_OPT_ERRORS 301 +#define IDD_OPTIONSPAGE 318 +#define IDI_MOVETOGROUP 319 +#define IDI_ON 320 +#define IDI_OFF 322 +#define IDC_SAVE 1001 +#define IDI_ONTHEPHONE 1002 +#define IDC_MESSAGE 1002 +#define IDI_OUTTOLUNCH 1003 +#define IDC_AUTOCLOSE 1004 +#define IDC_FROM 1005 +#define IDC_AUTOMIN 1005 +#define IDC_DATE 1006 +#define IDC_DUMPRECV 1006 +#define IDC_AUTOCLEAR 1007 +#define IDC_MSG 1008 +#define IDC_PROXYDNS 1008 +#define IDC_NAME 1009 +#define IDC_PROXYTYPE 1009 +#define IDC_STATIC23 1010 +#define IDC_NAMEVAL 1010 +#define IDC_LNK_NETWORK 1010 +#define IDC_LNK_ADDONS 1011 +#define IDC_SPECIFYPORTS 1013 +#define IDC_ST_ENTERMSG 1013 +#define IDC_ST_ENTERURL 1014 +#define IDC_SPECIFYPORTSO 1014 +#define IDC_ENABLEUPNP 1015 +#define IDC_VALIDATESSL 1016 +#define IDC_SHOWNAMES 1024 +#define IDC_ABOUT 1032 +#define IDC_MYNOTES 1033 +#define IDC_URLS 1037 +#define IDC_REPLY 1039 +#define IDC_URL 1041 +#define IDC_FONTGROUP 1042 +#define IDC_BTN_RESET 1045 +#define IDC_REASON 1046 +#define IDC_BTN_UNDO 1047 +#define IDC_DENYREASON 1047 +#define IDC_EMAIL 1048 +#define IDC_NAMENICK 1049 +#define IDC_NAMEFIRST 1050 +#define IDC_NAMELAST 1051 +#define IDC_NICK 1053 +#define IDC_BTN_EXPORT 1054 +#define IDC_FONTLIST 1056 +#define IDC_CHOOSEFONT 1057 +#define IDC_EFFECT 1058 +#define IDC_EFFECT_STATIC 1059 +#define IDC_GENDER 1060 +#define IDC_CITY 1061 +#define IDC_MARITAL 1061 +#define IDC_STATE 1062 +#define IDC_COUNTRY 1063 +#define IDC_AGE 1064 +#define IDC_ZIP 1064 +#define IDC_PHONE 1065 +#define IDC_STREET 1065 +#define IDC_COMPANY 1066 +#define IDC_LANGUAGE1 1066 +#define IDC_TIMEZONE 1067 +#define IDC_DEPARTMENT 1067 +#define IDC_LOCALTIME 1068 +#define IDC_DETAILS 1069 +#define IDC_POSITION 1069 +#define IDC_LANGUAGE2 1069 +#define IDC_ADD 1070 +#define IDC_LANGUAGE3 1070 +#define IDC_TIMEZONESELECT 1071 +#define IDC_MOREOPTIONS 1071 +#define IDC_USERMENU 1071 +#define IDC_EDIT 1078 +#define IDC_LIST 1079 +#define IDC_HISTORY 1080 +#define IDC_MENUOBJECTS 1081 +#define IDC_MENUITEMS 1082 +#define IDC_NOTSUPPORTWARNING 1083 +#define IDC_INSERTSEPARATOR 1084 +#define IDC_GENMENU_SERVICE 1085 +#define IDC_GENMENU_CUSTOMNAME 1086 +#define IDC_GENMENU_SET 1087 +#define IDC_GENMENU_DEFAULT 1089 +#define IDC_CANVAS 1094 +#define IDC_CANVAS2 1095 +#define IDC_BUILDTIME 1108 +#define IDC_CREDITSFILE 1109 +#define IDC_NUMBER 1113 +#define IDC_FINDWHAT 1131 +#define IDC_FIND 1132 +#define IDC_FILE 1133 +#define IDC_PROFILELIST 1134 +#define IDC_EFFECT_COMBO 1140 +#define IDC_TABS 1141 +#define IDC_RESULTS 1142 +#define IDC_STATUS 1144 +#define IDC_USEPROXY 1148 +#define IDC_PROXYAUTH 1149 +#define IDC_PROXYHOST 1150 +#define IDC_PROXYPORT 1151 +#define IDC_PROXYUSER 1152 +#define IDC_PROXYPASS 1153 +#define IDC_STATIC12 1155 +#define IDC_STATIC21 1156 +#define IDC_STATIC22 1157 +#define IDC_STATIC31 1158 +#define IDC_STATIC32 1159 +#define IDC_CHANGE 1164 +#define IDC_PREVIEW 1165 +#define IDC_CHOOSE 1169 +#define IDC_TO 1170 +#define IDC_VERSION 1179 +#define IDC_ICONSET 1183 +#define IDC_BROWSE 1184 +#define IDC_RUNATSTARTBROWSE 1185 +#define IDC_PAGETREE 1186 +#define IDC_RUNNOW 1186 +#define IDC_RETRIEVING 1193 +#define IDC_GETMORE 1200 +#define IDC_VISIBLEICON 1204 +#define IDC_INVISIBLEICON 1205 +#define IDC_FILEICON 1206 +#define IDC_ONLINEICON 1207 +#define IDC_FILENAMES 1208 +#define IDC_ALLICON 1208 +#define IDC_DONTREPLY 1209 +#define IDC_NONEICON 1209 +#define IDC_USEPREVIOUS 1210 +#define IDC_TYPINGICON 1210 +#define IDC_NODIALOG 1211 +#define IDC_USESPECIFIC 1212 +#define IDC_FILEDIR 1213 +#define IDC_TRANSFERCOMPLETED 1214 +#define IDC_ALLFILESPROGRESS 1217 +#define IDC_WHITERECT 1221 +#define IDC_ALLSPEED 1221 +#define IDC_FIRSTNAME 1224 +#define IDC_LASTNAME 1225 +#define IDC_DOBDAY 1226 +#define IDC_DOBMONTH 1227 +#define IDC_WEBPAGE 1228 +#define IDC_DOBYEAR 1228 +#define IDC_UPDATING 1231 +#define IDC_NAMEORDER 1234 +#define IDC_RECONNECTREQD 1239 +#define IDC_IMPORT 1241 +#define IDC_TOMAIN 1243 +#define IDC_TOPROTO 1244 +#define IDC_PROTOLIST 1245 +#define IDC_TODEFICON 1246 +#define IDC_IMPORTMULTI 1247 +#define IDC_EFFECT_COLOUR1 1266 +#define IDC_BKGCOLOUR 1269 +#define IDC_EFFECT_COLOUR2 1269 +#define IDC_FILENAME 1271 +#define IDC_FONTCOLOUR 1282 +#define IDC_INTERESTS 1305 +#define IDC_EMAILS 1306 +#define IDC_PAST 1307 +#define IDC_PHONES 1308 +#define IDC_SMS 1310 +#define IDC_AREA 1312 +#define IDC_UPDATE 1313 +#define IDC_ININAME 1333 +#define IDC_VIEWINI 1334 +#define IDC_SECURITYINFO 1335 +#define IDC_SETTINGNAME 1336 +#define IDC_NEWVALUE 1337 +#define IDC_WARNNOMORE 1338 +#define IDC_DELETE 1339 +#define IDC_RECYCLE 1340 +#define IDC_NEWNAME 1341 +#define IDC_MOVE 1342 +#define IDC_LEAVE 1343 +#define IDC_EXPERT 1346 +#define IDC_CATEGORYLIST 1366 +#define IDC_LOADICONS 1369 +#define IDC_STICONSGROUP 1371 +#define IDC_MSGICON 1375 +#define IDC_URLICON 1376 +#define IDC_STNOPAGE 1377 +#define IDC_STCHECKMARKS 1380 +#define IDC_STATUSBAR 1389 +#define IDC_PROTOIDGROUP 1392 +#define IDC_BYPROTOID 1393 +#define IDC_PROTOID 1394 +#define IDC_EMAILGROUP 1395 +#define IDC_BYEMAIL 1396 +#define IDC_STNAMENICK 1397 +#define IDC_NAMEGROUP 1398 +#define IDC_BYNAME 1399 +#define IDC_STNAMEFIRST 1400 +#define IDC_STNAMELAST 1401 +#define IDC_ADVANCEDGROUP 1402 +#define IDC_BYADVANCED 1403 +#define IDC_ADVANCED 1404 +#define IDC_PROTOCOLORDER 1405 +#define IDC_TINYEXTENDEDGROUP 1406 +#define IDC_RESETPROTOCOLDATA 1407 +#define IDC_BYCUSTOM 1408 +#define IDC_PROTOCOLORDERWARNING 1409 +#define IDC_STSIMPLERIGHT 1440 +#define IDC_NETLIBUSERS 1443 +#define IDC_STOFTENPORT 1445 +#define IDC_STATIC52 1447 +#define IDC_STATIC43 1448 +#define IDC_LOGOPTIONS 1449 +#define IDC_PORTSRANGE 1450 +#define IDC_PORTSRANGEO 1452 +#define IDC_STATIC54 1453 +#define IDC_TOOUTPUTDEBUGSTRING 1455 +#define IDC_TOFILE 1456 +#define IDC_RUNATSTART 1458 +#define IDC_DUMPSENT 1464 +#define IDC_DUMPPROXY 1466 +#define IDC_TEXTDUMPS 1467 +#define IDC_AUTODETECTTEXT 1468 +#define IDC_TIMEFORMAT 1469 +#define IDC_FILENAMEBROWSE 1470 +#define IDC_SHOWTHISDLGATSTART 1471 +#define IDC_DUMPSSL 1473 +#define IDC_FILEDIRBROWSE 1475 +#define IDC_SCANCMDLINEBROWSE 1476 +#define IDC_ALLTRANSFERRED 1477 +#define IDC_OPENFOLDER 1478 +#define IDC_OPENFILE 1479 +#define IDC_TOTALSIZE 1480 +#define IDC_CONTACT 1480 +#define IDC_AUTOACCEPT 1484 +#define IDC_SCANCMDLINE 1485 +#define IDC_WARNBEFOREOPENING 1488 +#define IDC_SCANDURINGDL 1489 +#define IDC_SCANAFTERDL 1490 +#define IDC_NOSCANNER 1491 +#define IDC_ST_CMDLINE 1492 +#define IDC_ST_CMDLINEHELP 1493 +#define IDC_PROPERTIES 1496 +#define IDC_RESUME 1497 +#define IDC_EXISTINGICON 1499 +#define IDC_RESUMEALL 1500 +#define IDC_OVERWRITE 1501 +#define IDC_OVERWRITEALL 1502 +#define IDC_SKIP 1503 +#define IDC_EXISTINGSIZE 1506 +#define IDC_EXISTINGDATE 1507 +#define IDC_EXISTINGTYPE 1508 +#define IDC_NEWICON 1509 +#define IDC_NEWSIZE 1510 +#define IDC_NEWDATE 1511 +#define IDC_NEWTYPE 1512 +#define IDC_SAVEAS 1513 +#define IDC_AUTORENAME 1514 +#define IDC_ASK 1516 +#define IDC_RENAME 1519 +#define IDC_VIRUSSCANNERGROUP 1520 +#define IDC_HIDE 1534 +#define IDC_TOPLINE 1535 +#define IDC_MYHANDLE 1540 +#define IDC_GROUP 1541 +#define IDC_ADDED 1542 +#define IDC_AUTH 1543 +#define IDC_DELETEHISTORY 1560 +#define IDC_AUTHREQ 1577 +#define IDC_AUTHGB 1578 +#define IDC_PROTOCOL 1580 +#define IDC_CONTRIBLINK 1586 +#define IDC_DEVS 1589 +#define IDC_TXT_TITLE1 1592 +#define IDC_TXT_TITLE2 1593 +#define IDC_TXT_TITLE3 1594 +#define IDC_TXT_TITLE4 1595 +#define IDC_TXT_TITLE5 1596 +#define IDC_TXT_TITLE6 1597 +#define IDC_TXT_TITLE7 1598 +#define IDC_TXT_TITLE8 1599 +#define IDC_PREVIEWSMALL 1600 +#define IDC_PREVIEWGENERAL 1601 +#define IDC_PREVIEWHEADER 1602 +#define IDC_CHOOSEFONTHEADER 1603 +#define IDC_CHOOSEFONTGENERAL 1604 +#define IDC_CHOOSEFONTSMALL 1605 +#define IDC_IDLEONWINDOWS 1637 +#define IDC_IDLEONMIRANDA 1638 +#define IDC_SCREENSAVER 1642 +#define IDC_LOCKED 1643 +#define IDC_IDLESHORT 1644 +#define IDC_UPGRADE 1645 +#define IDC_FULLSCREEN 1645 +#define IDC_IDLE1STTIME 1646 +#define IDC_IDLEPRIVATE 1649 +#define IDC_AASTATUS 1650 +#define IDC_AASHORTIDLE 1651 +#define IDC_SOUNDTREE 1657 +#define IDC_LOCATION 1659 +#define IDC_SGROUP 1660 +#define IDC_SLOC 1661 +#define IDC_PROFILENAME 1673 +#define IDC_PROFILEDRIVERS 1674 +#define IDC_PLUGLIST 1676 +#define IDC_PLUGINLONGINFO 1677 +#define IDC_PLUGINAUTHOR 1679 +#define IDC_PLUGININFOFRAME 1680 +#define IDC_PLUGINCPYR 1681 +#define IDC_PLUGINURL 1682 +#define IDC_PLUGINPID 1683 +#define IDC_PLUGINEMAIL 1684 +#define IDC_IDLESPIN 1687 +#define IDC_NODBDRIVERS 1690 +#define IDC_IDLESTATUSLOCK 1691 +#define IDC_RESTART 1692 +#define IDC_TAB 1693 +#define IDC_IDLETERMINAL 1694 +#define IDC_ENABLESOUNDS 1695 +#define IDC_NEWVERSIONLABEL 1696 +#define IDC_CURRENTVERSION 1697 +#define IDC_DOWNLOAD 1699 +#define IDC_ENABLEUPDATES 1700 +#define IDC_ENABLEALPHA 1701 +#define IDC_RESETMENU 1702 +#define IDC_KEYWORD_FILTER 1704 +#define IDC_FILTER 1706 +#define IDC_PATH 1707 +#define IDC_LV_HOTKEYS 1708 +#define IDC_HOTKEY 1709 +#define IDC_SM_COMBO 1710 +#define IDC_SM_LABEL 1711 +#define IDC_REMOVE 1712 +#define IDC_ACCLIST 1713 +#define IDC_ACCNAME 1714 +#define IDC_PROTOTYPECOMBO 1715 +#define IDC_ACCINTERNALNAME 1716 +#define IDC_OPTIONS 1717 +#define IDC_CLEAR 1718 +#define IDC_PROGRESSBAR 1719 +#define IDC_TXT_ACCOUNT 1720 +#define IDC_TXT_ADDITIONAL 1721 +#define IDC_TXT_INFO 1722 +#define IDC_CONTACTNAME 1724 +#define IDC_FRAME 1725 +#define IDC_LST_STATUS 1726 +#define IDC_ALLPRECENTS 1727 +#define IDC_ENABLE_KEYWORDFILTERING 1729 +#define IDC_BKGCOLOUR_STATIC 1730 +#define IDC_LST_ERRORS 1731 +#define IDC_LV_ERRORS 1733 +#define IDC_HEADERBAR 1734 +#define IDC_LV_LEGEND 1735 +#define IDC_ENABLEBETA 1737 +#define IDC_ENABLESTABLE 1738 +#define IDC_STORELASTPROFILE 1739 +#define IDC_RADIO1 1740 +#define IDC_RADIO2 1741 +#define IDC_ADDCHECK 1742 +#define IDC_GETMOREPLUGINS 1744 +#define IDC_DISABLEMENUICONS 1745 +#define IDC_EFFECT_COLOUR_TEXT1 1853 +#define IDC_EFFECT_COLOUR_SPIN1 1854 +#define IDC_EFFECT_COLOUR_TEXT2 11803 +#define IDC_EFFECT_COLOUR_SPIN2 11806 +#define IDI_SEARCHALL 32548 +#define ID_ICQ_EXIT 40001 +#define IDM_COPY 40001 +#define ID_RESET 40002 +#define POPUP_HIDEEMPTYGROUPS 40003 +#define POPUP_NEWSUBGROUP 40004 +#define POPUP_HIDEOFFLINE 40005 +#define POPUP_GROUPHIDEOFFLINE 40006 +#define POPUP_HIDEOFFLINEROOT 40007 +#define POPUP_DISABLEGROUPS 40008 +#define IDC_SENDMESSAGE 40009 +#define IDM_COPYALL 40011 +#define IDM_SELECTALL 40012 +#define IDM_CLEAR 40013 +#define IDM_OPENNEW 40014 +#define IDM_OPENEXISTING 40015 +#define IDM_COPYLINK 40016 +#define POPUP_HIDEMIRANDA 40017 +#define ID_CANCELCHANGE 40018 +#define ID_TRAY_HIDE 40038 +#define ID_TRAY_EXIT 40040 +#define POPUP_NEWGROUP 40050 +#define POPUP_RENAMEGROUP 40052 +#define POPUP_DELETEGROUP 40053 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 323 +#define _APS_NEXT_COMMAND_VALUE 40018 +#define _APS_NEXT_CONTROL_VALUE 1746 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Speak/Speak/resource.rc b/Speak/Speak/resource.rc new file mode 100644 index 0000000..a3f8c63 --- /dev/null +++ b/Speak/Speak/resource.rc @@ -0,0 +1,2042 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include +#include +#include "../include/statusmodes.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ACCFORM DIALOGEX 0, 0, 205, 119 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Enter account name (for example, My Google)",IDC_STATIC,7,7,191,9 + EDITTEXT IDC_ACCNAME,7,18,191,12,ES_AUTOHSCROLL + LTEXT "Choose the protocol type",IDC_STATIC,7,35,191,11 + COMBOBOX IDC_PROTOTYPECOMBO,7,46,191,60,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Specify the internal account name (optional)",IDC_STATIC,7,65,191,8 + EDITTEXT IDC_ACCINTERNALNAME,7,76,191,12,ES_AUTOHSCROLL + PUSHBUTTON "OK",IDOK,92,98,50,14 + PUSHBUTTON "Cancel",IDCANCEL,148,98,50,14 +END + +IDD_AUTHREQ DIALOGEX 0, 0, 271, 197 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Authorization Request" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",IDC_HEADERBAR,"MHeaderbarCtrl",0x0,0,0,271,25 + DEFPUSHBUTTON "&Authorize",IDOK,17,176,50,14 + PUSHBUTTON "&Deny",IDCANCEL,97,176,50,14 + PUSHBUTTON "Decide &Later",IDC_DECIDELATER,175,176,74,14 + CONTROL "&I",IDC_DETAILS,"MButtonClass",WS_TABSTOP,248,29,16,14,WS_EX_NOACTIVATE | 0x10000000L + LTEXT "Reason:",IDC_STATIC,7,39,101,10,SS_CENTERIMAGE + EDITTEXT IDC_REASON,7,50,257,54,ES_MULTILINE | ES_READONLY | NOT WS_BORDER | WS_VSCROLL | WS_HSCROLL,WS_EX_STATICEDGE + LTEXT "Denial Reason:",IDC_STATIC,7,111,89,10,SS_CENTERIMAGE | SS_REALSIZECONTROL + EDITTEXT IDC_DENYREASON,7,124,257,32,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_BORDER,WS_EX_STATICEDGE + CONTROL "Add to contact list if authorized",IDC_ADDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,162,239,10 +END + +IDD_ADDCONTACT DIALOGEX 0, 0, 230, 151 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Add %s" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "&Add",IDOK,20,130,72,14 + PUSHBUTTON "&Cancel",IDCANCEL,139,130,71,14 + EDITTEXT IDC_MYHANDLE,6,16,90,12,ES_AUTOHSCROLL + COMBOBOX IDC_GROUP,112,16,110,60,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CONTROL "Send ""You were added""",IDC_ADDED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,46,204,10 + CONTROL "Send authorization request",IDC_AUTH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,60,204,10 + LTEXT "Custom name:",IDC_STATIC,6,4,70,10 + LTEXT "Group:",IDC_STATIC,112,4,70,10 + GROUPBOX "Options",IDC_STATIC,7,33,216,43 + GROUPBOX "Authorization Request",IDC_AUTHGB,7,79,216,45 + EDITTEXT IDC_AUTHREQ,13,89,204,29,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL +END + +IDD_ADDED DIALOGEX 0, 0, 241, 70 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "You Were Added" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",IDC_HEADERBAR,"MHeaderbarCtrl",0x0,0,0,241,25 + PUSHBUTTON "&Close",IDCANCEL,90,51,60,14 + CONTROL "&I",IDC_DETAILS,"MButtonClass",WS_TABSTOP,217,29,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&U",IDC_ADD,"MButtonClass",WS_TABSTOP,197,29,16,14,WS_EX_NOACTIVATE | 0x10000000L +END + +IDD_ABOUT DIALOGEX 0, 0, 212, 131 +STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "About Miranda IM" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "Miranda IM\n%s",IDC_HEADERBAR,"MHeaderbarCtrl",WS_TABSTOP,0,0,212,25 + LTEXT "",IDC_WHITERECT,0,25,213,81 + DEFPUSHBUTTON "OK",IDOK,152,112,55,14 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,106,213,1 + LTEXT "",IDC_DEVS,5,32,202,42 + EDITTEXT IDC_BUILDTIME,4,91,146,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + PUSHBUTTON "Credits >",IDC_CONTRIBLINK,5,112,55,14 + EDITTEXT IDC_CREDITSFILE,4,32,202,67,ES_CENTER | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | WS_VSCROLL +END + +IDD_DELETECONTACT DIALOGEX 0, 0, 294, 93 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Delete Contact" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + PUSHBUTTON "&Yes",IDYES,58,38,65,14 + DEFPUSHBUTTON "&No",IDNO,172,38,65,14 + CONTROL "Hide from list only, in order to keep their history and ignore/visibility settings",IDC_HIDE, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,7,65,270,9 + LTEXT "Use Options->Ignore (expert mode) to unhide contacts.",IDC_STATIC,20,78,257,8 + CONTROL "Are you sure you want to delete %s?",IDC_TOPLINE,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,7,7,270,8 + LTEXT "This will erase all history and settings for this contact!",IDC_STATIC,7,18,239,14 +END + +IDD_OPT_CONTACT DIALOGEX 0, 0, 199, 147 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Contact Display Options",IDC_STATIC,13,7,176,133 + LTEXT "Instead of displaying contacts by their nickname, drag to choose another order:",IDC_STATIC,19,17,165,27 + CONTROL "Tree1",IDC_NAMEORDER,"SysTreeView32",TVS_NOTOOLTIPS | TVS_FULLROWSELECT | WS_BORDER | WS_HSCROLL | WS_TABSTOP,19,48,164,86 +END + +IDD_PROFILEMANAGER DIALOGEX 0, 0, 400, 211 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Miranda IM Profile Manager" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",IDC_NAME,"MHeaderbarCtrl",0x0,0,0,400,25 + CONTROL "Tab1",IDC_TABS,"SysTabControl32",TCS_HOTTRACK | WS_TABSTOP,4,31,393,160 + PUSHBUTTON "&Run",IDOK,298,194,48,14 + PUSHBUTTON "&Exit",IDCANCEL,348,194,48,14 + RTEXT "Start in Service Mode with",IDC_SM_LABEL,10,196,106,10 + COMBOBOX IDC_SM_COMBO,120,195,123,12,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP +END + +IDD_FINDADD DIALOGEX 0, 0, 427, 257 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Find/Add Contacts" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Search:",IDC_STATIC,5,32,37,8 + CONTROL "",IDC_PROTOLIST,"ComboBoxEx32",CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP,42,30,80,88 + GROUPBOX "",IDC_PROTOIDGROUP,5,46,117,32 + CONTROL "",IDC_BYPROTOID,"Button",BS_AUTORADIOBUTTON,11,46,85,10 + EDITTEXT IDC_PROTOID,11,59,105,12,ES_AUTOHSCROLL + GROUPBOX "",IDC_EMAILGROUP,5,83,117,32 + CONTROL "E-mail address",IDC_BYEMAIL,"Button",BS_AUTORADIOBUTTON,11,83,80,10 + EDITTEXT IDC_EMAIL,11,96,105,12,ES_AUTOHSCROLL + GROUPBOX "",IDC_NAMEGROUP,5,120,117,59 + CONTROL "Name",IDC_BYNAME,"Button",BS_AUTORADIOBUTTON,11,120,49,10 + LTEXT "Nick:",IDC_STNAMENICK,11,135,31,8,NOT WS_GROUP + EDITTEXT IDC_NAMENICK,42,134,74,12,ES_AUTOHSCROLL + LTEXT "First:",IDC_STNAMEFIRST,11,150,31,8,NOT WS_GROUP + EDITTEXT IDC_NAMEFIRST,42,147,74,12,ES_AUTOHSCROLL + LTEXT "Last:",IDC_STNAMELAST,11,163,31,8,NOT WS_GROUP + EDITTEXT IDC_NAMELAST,42,161,74,12,ES_AUTOHSCROLL + GROUPBOX "",IDC_ADVANCEDGROUP,5,184,117,32 + CONTROL "Advanced",IDC_BYADVANCED,"Button",BS_AUTORADIOBUTTON,11,184,62,10 + CONTROL "Advanced >>",IDC_ADVANCED,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,11,196,105,14 + GROUPBOX "",IDC_TINYEXTENDEDGROUP,5,190,117,25 + DEFPUSHBUTTON "&Search",IDOK,5,222,117,17 + CONTROL "List1",IDC_RESULTS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_AUTOARRANGE | WS_BORDER | WS_TABSTOP,129,30,293,191 + CONTROL "More options",IDC_MOREOPTIONS,"MButtonClass",WS_DISABLED | WS_TABSTOP,272,225,77,14,WS_EX_NOACTIVATE | 0x10000000L + PUSHBUTTON "Add to list",IDC_ADD,354,225,68,14,WS_DISABLED + CONTROL "",IDC_STATUSBAR,"msctls_statusbar32",WS_TABSTOP | 0x100,0,244,427,10 + CONTROL "Custom",IDC_BYCUSTOM,"Button",BS_AUTORADIOBUTTON,11,190,89,10 + CONTROL "Find/Add Contacts\nHere you can add contacts to your contact list",IDC_HEADERBAR, + "MHeaderbarCtrl",0x0,0,0,427,25 +END + +IDD_OPTIONS DIALOGEX 0, 0, 428, 303 +STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Options" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + COMBOBOX IDC_KEYWORD_FILTER,336,6,88,79,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CONTROL "Options\nConfigure your Miranda Instant Messenger options",IDC_HEADERBAR, + "MHeaderbarCtrl",0x0,0,0,428,25 + DEFPUSHBUTTON "OK",IDOK,265,283,50,14 + PUSHBUTTON "Cancel",IDCANCEL,319,283,50,14 + PUSHBUTTON "Apply",IDC_APPLY,374,283,50,14 + CONTROL "Tree1",IDC_PAGETREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_TRACKSELECT | TVS_NOHSCROLL | WS_BORDER | WS_TABSTOP,4,30,102,249 + CONTROL "",IDC_TAB,"SysTabControl32",NOT WS_VISIBLE | WS_TABSTOP,111,30,313,249 + CONTROL "Show expert options",IDC_EXPERT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,284,102,10 + CTEXT "Please select a subentry from the list",IDC_STNOPAGE,111,30,313,251,SS_CENTERIMAGE +END + +IDD_OPTIONSPAGE DIALOGEX 0, 0, 321, 303 +STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Options" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + COMBOBOX IDC_KEYWORD_FILTER,336,37,88,79,CBS_DROPDOWN | CBS_SORT | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + CONTROL "Options\nConfigure your Miranda Instant Messenger options",IDC_HEADERBAR, + "MHeaderbarCtrl",0x0,0,0,325,25 + DEFPUSHBUTTON "OK",IDOK,158,283,50,14 + PUSHBUTTON "Cancel",IDCANCEL,212,283,50,14 + PUSHBUTTON "Apply",IDC_APPLY,267,283,50,14 + CONTROL "",IDC_TAB,"SysTabControl32",NOT WS_VISIBLE | WS_TABSTOP,4,32,313,249 + CONTROL "Show expert options",IDC_EXPERT,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,347,254,62,10 + CTEXT "Please select a subentry from the list",IDC_STNOPAGE,4,30,313,251,SS_CENTERIMAGE + CONTROL "",IDC_PAGETREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_TRACKSELECT | TVS_NOHSCROLL | NOT WS_VISIBLE | WS_BORDER | WS_TABSTOP,347,86,52,137 +END + +IDD_READAWAYMSG DIALOGEX 0, 0, 187, 72 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "%s Message for %s" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "&Cancel",IDOK,69,53,50,14 + CTEXT "Retrieving %s message...",IDC_RETRIEVING,5,21,177,8,SS_NOPREFIX + EDITTEXT IDC_MSG,5,5,177,43,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_VISIBLE | WS_VSCROLL +END + +IDD_SETAWAYMSG DIALOGEX 0, 0, 187, 72 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Change %s Message" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Closing in %d",IDOK,61,53,65,14 + EDITTEXT IDC_MSG,5,5,177,43,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL +END + +IDD_DETAILS DIALOGEX 0, 0, 318, 210 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "%s: User Details" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "%s\nView personal user details and more",IDC_HEADERBAR, + "MHeaderbarCtrl",0x0,0,0,318,25 + CONTROL "",IDC_PAGETREE,"SysTreeView32",TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_NOTOOLTIPS | TVS_TRACKSELECT | TVS_FULLROWSELECT | TVS_NONEVENHEIGHT | WS_HSCROLL | WS_TABSTOP,3,30,76,176,WS_EX_STATICEDGE + CONTROL "Tab1",IDC_TABS,"SysTabControl32",TCS_HOTTRACK | TCS_MULTILINE | WS_TABSTOP,85,29,228,158 + PUSHBUTTON "Update Now",IDC_UPDATE,85,191,55,14,WS_DISABLED + CTEXT "Updating",IDC_UPDATING,145,194,113,8,SS_NOPREFIX | SS_CENTERIMAGE + DEFPUSHBUTTON "OK",IDOK,263,191,50,14 +END + +IDD_INFO_SUMMARY DIALOGEX 0, 0, 222, 132 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Nickname:",IDC_STATIC,5,5,46,8 + EDITTEXT IDC_NICK,51,5,166,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "First name:",IDC_STATIC,5,18,46,8 + EDITTEXT IDC_FIRSTNAME,51,18,74,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Gender:",IDC_STATIC,126,18,44,8 + EDITTEXT IDC_GENDER,170,18,47,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Last name:",IDC_STATIC,5,31,46,8 + EDITTEXT IDC_LASTNAME,51,31,74,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Age:",IDC_STATIC,126,31,44,8 + EDITTEXT IDC_AGE,170,31,47,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "E-mail:",IDC_STATIC,5,44,46,8 + CONTROL "",IDC_EMAIL,"Hyperlink",WS_TABSTOP,51,44,166,8 + LTEXT "Date of birth:",IDC_STATIC,5,58,59,8 + EDITTEXT IDC_DOBDAY,66,58,8,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + EDITTEXT IDC_DOBMONTH,76,58,16,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + EDITTEXT IDC_DOBYEAR,94,58,20,8,ES_RIGHT | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Marital status:",IDC_STATIC,5,71,76,8 + EDITTEXT IDC_MARITAL,83,71,87,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER +END + +IDD_INFO_CONTACT DIALOGEX 0, 0, 222, 132 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "E-mail:",IDC_STATIC,5,5,212,8 + CONTROL "List1",IDC_EMAILS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,14,212,50 + LTEXT "Phone:",IDC_STATIC,5,68,212,8 + CONTROL "List1",IDC_PHONES,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,77,212,50 +END + +IDD_INFO_BACKGROUND DIALOGEX 0, 0, 222, 132 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Web page:",IDC_STATIC,5,5,44,8 + CONTROL "",IDC_WEBPAGE,"Hyperlink",WS_TABSTOP,49,5,168,8 + LTEXT "Past background:",IDC_STATIC,5,18,212,8 + CONTROL "List1",IDC_PAST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,27,212,44 + LTEXT "Interests:",IDC_STATIC,5,74,212,8 + CONTROL "List1",IDC_INTERESTS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOLABELWRAP | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,83,212,44 +END + +IDD_INFO_NOTES DIALOGEX 0, 0, 222, 132 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "About:",IDC_STATIC,5,5,212,8 + EDITTEXT IDC_ABOUT,5,13,212,45,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL + LTEXT "My notes:",IDC_STATIC,5,61,212,8 + EDITTEXT IDC_MYNOTES,5,69,212,58,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL +END + +IDD_INFO_LOCATION DIALOGEX 0, 0, 222, 147 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Street:",IDC_STATIC,5,5,51,8 + EDITTEXT IDC_STREET,56,5,161,16,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "City:",IDC_STATIC,5,22,51,8 + EDITTEXT IDC_CITY,56,22,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "State:",IDC_STATIC,5,33,51,8 + EDITTEXT IDC_STATE,56,33,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Postal code:",IDC_STATIC,5,44,51,8 + EDITTEXT IDC_ZIP,56,44,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Country:",IDC_STATIC,5,55,51,8 + EDITTEXT IDC_COUNTRY,56,55,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Spoken languages:",IDC_STATIC,5,70,51,16 + EDITTEXT IDC_LANGUAGE1,56,70,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + EDITTEXT IDC_LANGUAGE2,56,78,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + EDITTEXT IDC_LANGUAGE3,56,86,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Timezone:",IDC_STATIC,5,97,51,8 + EDITTEXT IDC_TIMEZONE,56,97,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Local time:",IDC_STATIC,5,108,51,8 + EDITTEXT IDC_LOCALTIME,56,108,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + COMBOBOX IDC_TIMEZONESELECT,4,132,214,46,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Set custom time zone",IDC_STATIC,5,121,212,8 +END + +IDD_INFO_WORK DIALOGEX 0, 0, 222, 132 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Company:",IDC_STATIC,5,5,51,8 + EDITTEXT IDC_COMPANY,56,5,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Department:",IDC_STATIC,5,17,51,8 + EDITTEXT IDC_DEPARTMENT,56,17,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Position:",IDC_STATIC,5,28,51,8 + EDITTEXT IDC_POSITION,56,28,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Street:",IDC_STATIC,5,48,51,8 + EDITTEXT IDC_STREET,56,48,161,16,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "City:",IDC_STATIC,5,65,51,8 + EDITTEXT IDC_CITY,56,65,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "State:",IDC_STATIC,5,76,51,8 + EDITTEXT IDC_STATE,56,76,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Postal code:",IDC_STATIC,5,87,51,8 + EDITTEXT IDC_ZIP,56,87,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Country:",IDC_STATIC,5,98,51,8 + EDITTEXT IDC_COUNTRY,56,98,161,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Website:",IDC_STATIC,5,109,51,8 + CONTROL "",IDC_WEBPAGE,"Hyperlink",WS_TABSTOP,57,109,160,8 +END + +IDD_ADDEMAIL DIALOGEX 0, 0, 187, 42 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Add E-Mail Address" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + EDITTEXT IDC_EMAIL,5,5,177,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,36,23,50,14 + PUSHBUTTON "Cancel",IDCANCEL,102,23,50,14 +END + +IDD_ADDPHONE DIALOGEX 0, 0, 210, 91 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Add Phone Number" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Enter country, area code and phone number:",IDC_STATIC,5,5,200,8 + COMBOBOX IDC_COUNTRY,21,15,66,120,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_AREA,91,15,36,12,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_NUMBER,131,15,74,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Or enter a full international number:",IDC_STATIC,5,30,200,8 + EDITTEXT IDC_PHONE,21,40,184,12,ES_AUTOHSCROLL + CONTROL "Phone can receive SMS text messages",IDC_SMS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,56,200,10 + DEFPUSHBUTTON "OK",IDOK,47,72,50,14 + PUSHBUTTON "Cancel",IDCANCEL,113,72,50,14 +END + +IDD_INSTALLINI DIALOGEX 0, 0, 213, 103 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Install Database Settings" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Yes",IDOK,26,84,50,14 + PUSHBUTTON "No",IDCANCEL,81,84,50,14 + LTEXT "A file containing new database settings has been placed in the Miranda IM directory.",IDC_STATIC,5,5,203,16 + LTEXT "Do you want to import the settings now?",IDC_STATIC,5,69,203,8 + PUSHBUTTON "No to all",IDC_NOTOALL,136,84,50,14 + LTEXT "",IDC_ININAME,5,24,143,16,SS_NOPREFIX | SS_CENTERIMAGE + PUSHBUTTON "&View contents",IDC_VIEWINI,150,25,58,14 + LTEXT "Security systems to prevent malicious changes are in place and you will be warned before changes that are not known to be safe.",IDC_SECURITYINFO,5,43,203,24 +END + +IDD_WARNINICHANGE DIALOGEX 0, 0, 187, 113 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Database Setting Change" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Database settings are being imported from",IDC_STATIC,5,5,177,8 + CONTROL "",IDC_ININAME,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,5,13,177,8 + LTEXT "This file wishes to change the setting",IDC_STATIC,5,24,177,8 + CONTROL "",IDC_SETTINGNAME,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,12,33,170,8 + LTEXT "to the value",IDC_STATIC,5,42,177,8 + CONTROL "",IDC_NEWVALUE,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,12,51,170,8 + LTEXT "",IDC_SECURITYINFO,5,60,177,8 + LTEXT "Do you want to allow this change?",IDC_STATIC,5,71,177,8 + CONTROL "&Allow all further changes to this section",IDC_WARNNOMORE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,80,169,10 + DEFPUSHBUTTON "&Yes",IDYES,5,94,50,14 + PUSHBUTTON "&No",IDNO,59,94,50,14 + PUSHBUTTON "Cancel Import",IDCANCEL,123,94,59,14 +END + +IDD_INIIMPORTDONE DIALOGEX 0, 0, 186, 73 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Database Import Complete" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "The import has completed from",IDC_STATIC,5,5,176,8 + CONTROL "",IDC_ININAME,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,5,13,176,8 + LTEXT "What do you want to do with the file now?",IDC_STATIC,5,24,176,8 + PUSHBUTTON "&Recycle",IDC_RECYCLE,5,36,50,14 + PUSHBUTTON "&Delete",IDC_DELETE,68,36,50,14 + EDITTEXT IDC_NEWNAME,5,55,117,12,ES_AUTOHSCROLL + PUSHBUTTON "&Move/Rename",IDC_MOVE,124,54,57,14 + PUSHBUTTON "&Leave",IDC_LEAVE,131,36,50,14 +END + +IDD_NETLIBLOGOPTS DIALOGEX 0, 0, 314, 259 +STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Netlib Log Options" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Show",IDC_STATIC,6,2,302,118 + CONTROL "Tree1",IDC_FILTER,"SysTreeView32",TVS_DISABLEDRAGDROP | TVS_NOTOOLTIPS | TVS_NONEVENHEIGHT | WS_BORDER | WS_HSCROLL | WS_TABSTOP,14,13,160,81 + CONTROL "Received bytes",IDC_DUMPRECV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,181,13,122,10 + CONTROL "Sent bytes",IDC_DUMPSENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,181,26,122,10 + CONTROL "Additional data due to proxy communication",IDC_DUMPPROXY, + "Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,181,39,122,18 + CONTROL "Text dumps where available",IDC_TEXTDUMPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,181,69,122,10 + CONTROL "Auto-detect text",IDC_AUTODETECTTEXT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,181,83,122,10 + CONTROL "Calling modules' names",IDC_SHOWNAMES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,181,96,122,10 + COMBOBOX IDC_TIMEFORMAT,14,100,160,69,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Log to",IDC_STATIC,6,122,302,66 + CONTROL "OutputDebugString()",IDC_TOOUTPUTDEBUGSTRING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,132,122,10 + CONTROL "File",IDC_TOFILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,146,44,10 + EDITTEXT IDC_FILENAME,14,159,270,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_FILENAMEBROWSE,288,159,15,12 + LTEXT "",IDC_PATH,14,174,294,10 + GROUPBOX "Run programm when Miranda IM starts (eg tail -f, dbgview, etc):",IDC_STATIC,6,188,302,32 + EDITTEXT IDC_RUNATSTART,14,200,203,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_RUNATSTARTBROWSE,220,200,15,12 + PUSHBUTTON "Run now",IDC_RUNNOW,241,200,60,12 + CONTROL "Show this dialog box when Miranda IM starts",IDC_SHOWTHISDLGATSTART, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,226,294,10 + PUSHBUTTON "Save as default",IDC_SAVE,6,241,79,14 + DEFPUSHBUTTON "Ok",IDOK,173,241,54,14 + PUSHBUTTON "Cancel",IDCANCEL,249,241,54,14 + CONTROL "SSL Traffic",IDC_DUMPSSL,"Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,181,56,122,10 +END + +IDD_HISTORY_FIND DIALOGEX 0, 0, 230, 46 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Find" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + EDITTEXT IDC_FINDWHAT,48,11,115,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "&Find Next",IDOK,173,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,173,24,50,14 + LTEXT "Find What:",IDC_STATIC,7,13,39,9 +END + +IDD_FILESEND DIALOGEX 0, 0, 256, 177 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Send File(s)" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + EDITTEXT IDC_MSG,6,102,245,46,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + DEFPUSHBUTTON "&Send",IDOK,67,157,50,15 + PUSHBUTTON "Cancel",IDCANCEL,140,157,50,15 + LTEXT "To:",IDC_STATIC,6,23,24,9,SS_CENTERIMAGE + CONTROL "",IDC_TO,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,43,24,159,9 + LTEXT "File(s):",IDC_STATIC,7,39,30,8 + EDITTEXT IDC_FILE,38,38,213,31,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY + PUSHBUTTON "&Choose Again...",IDC_CHOOSE,39,74,77,14 + RTEXT "Total size:",IDC_STATIC,119,76,68,8 + CONTROL "",IDC_TOTALSIZE,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,191,76,58,8 + LTEXT "Description:",IDC_STATIC,6,93,96,8 + CONTROL "6",IDC_USERMENU,"MButtonClass",WS_TABSTOP,195,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&D",IDC_DETAILS,"MButtonClass",WS_TABSTOP,213,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&H",IDC_HISTORY,"MButtonClass",WS_TABSTOP,231,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "",IDC_PROTOCOL,"Button",BS_OWNERDRAW | WS_TABSTOP,5,7,12,12 + LTEXT "",IDC_NAME,19,7,151,9,SS_NOPREFIX | SS_CENTERIMAGE +END + +IDD_FILERECV DIALOGEX 0, 0, 256, 174 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Incoming File Transfer" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "A&ccept",IDOK,68,155,50,14 + PUSHBUTTON "&Decline",IDCANCEL,138,155,50,14 + LTEXT "From:",IDC_STATIC,6,20,24,9,SS_CENTERIMAGE + CONTROL "",IDC_FROM,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,39,21,159,9 + LTEXT "Date:",IDC_STATIC,6,35,28,9,SS_CENTERIMAGE + CONTROL "",IDC_DATE,"Static",SS_SIMPLE | SS_NOPREFIX | WS_GROUP,39,34,159,9 + LTEXT "Files:",IDC_STATIC,6,50,28,8 + EDITTEXT IDC_FILENAMES,39,50,210,16,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "Description:",IDC_STATIC,6,69,64,8 + EDITTEXT IDC_MSG,6,79,243,45,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY + LTEXT "Save to:",IDC_STATIC,6,131,34,8 + PUSHBUTTON "...",IDC_FILEDIRBROWSE,235,130,14,10 + COMBOBOX IDC_FILEDIR,45,129,187,108,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + CONTROL "&A",IDC_ADD,"MButtonClass",WS_TABSTOP,177,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "6",IDC_USERMENU,"MButtonClass",WS_TABSTOP,195,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&D",IDC_DETAILS,"MButtonClass",WS_TABSTOP,213,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&H",IDC_HISTORY,"MButtonClass",WS_TABSTOP,231,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "",IDC_PROTOCOL,"Button",BS_OWNERDRAW | WS_TABSTOP,5,7,12,12 + LTEXT "",IDC_NAME,19,7,151,9,SS_NOPREFIX | SS_CENTERIMAGE +END + +IDD_FILETRANSFERINFO DIALOGEX 0, 0, 256, 44 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "Contact menu",IDC_CONTACT,"MButtonClass",WS_TABSTOP,5,1,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "",IDC_CONTACTNAME,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | SS_WORDELLIPSIS | WS_GROUP,25,1,174,14 + CONTROL "Open...",IDC_OPENFILE,"MButtonClass",WS_DISABLED | WS_TABSTOP,203,1,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "Open folder",IDC_OPENFOLDER,"MButtonClass",WS_TABSTOP,219,1,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "Cancel",IDCANCEL,"MButtonClass",WS_TABSTOP,235,1,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "",IDC_ALLFILESPROGRESS,"msctls_progress32",PBS_SMOOTH | NOT WS_VISIBLE | WS_DISABLED,25,16,190,12 + CONTROL "",IDC_STATUS,"Static",SS_LEFTNOWORDWRAP | SS_NOPREFIX | WS_GROUP,25,17,190,10 + ICON "",IDC_FILEICON,25,15,16,14,SS_CENTERIMAGE | SS_REALSIZEIMAGE + CONTROL "Transfer completed, open file(s).",IDC_TRANSFERCOMPLETED, + "Hyperlink",NOT WS_VISIBLE | WS_TABSTOP,42,17,173,10 + LTEXT "No data transferred",IDC_ALLTRANSFERRED,25,29,226,14,SS_NOPREFIX | SS_CENTERIMAGE + RTEXT "",IDC_ALLSPEED,25,29,226,14,SS_NOPREFIX | SS_CENTERIMAGE + LTEXT "",IDC_ALLPRECENTS,218,14,33,14,SS_CENTERIMAGE + CONTROL "",IDC_FRAME,"Static",SS_ETCHEDHORZ,1,43,254,1 +END + +IDD_FILEEXISTS DIALOGEX 0, 0, 288, 181 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "File Already Exists" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + PUSHBUTTON "Resume",IDC_RESUME,5,144,65,14 + PUSHBUTTON "Resume all",IDC_RESUMEALL,5,162,65,14 + PUSHBUTTON "Overwrite",IDC_OVERWRITE,76,144,65,14 + PUSHBUTTON "Overwrite all",IDC_OVERWRITEALL,76,162,65,14 + PUSHBUTTON "Save as...",IDC_SAVEAS,147,144,65,14 + PUSHBUTTON "Auto rename",IDC_AUTORENAME,147,162,65,14 + PUSHBUTTON "Skip",IDC_SKIP,218,144,65,14 + PUSHBUTTON "Cancel transfer",IDCANCEL,218,162,65,14 + LTEXT "You are about to receive the file",IDC_STATIC,5,5,278,8 + EDITTEXT IDC_FILENAME,15,16,268,8,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + GROUPBOX "Existing file",IDC_STATIC,5,29,278,61 + ICON "",IDC_EXISTINGICON,14,45,20,20,SS_NOTIFY + LTEXT "Size:",IDC_STATIC,40,42,27,8 + LTEXT "",IDC_EXISTINGSIZE,67,42,35,8 + RTEXT "Last modified:",IDC_STATIC,103,42,58,8 + LTEXT "",IDC_EXISTINGDATE,166,42,115,8 + LTEXT "Type:",IDC_STATIC,40,55,27,8 + LTEXT "",IDC_EXISTINGTYPE,67,55,214,8 + PUSHBUTTON "Open file",IDC_OPENFILE,12,70,62,13 + PUSHBUTTON "Open folder",IDC_OPENFOLDER,82,70,62,13 + PUSHBUTTON "File properties",IDC_PROPERTIES,201,70,74,13 + GROUPBOX "File being received",IDC_STATIC,5,95,278,42 + ICON "",IDC_NEWICON,14,110,20,20,SS_NOTIFY + LTEXT "Size:",IDC_STATIC,40,108,27,8 + LTEXT "",IDC_NEWSIZE,67,108,35,8 + RTEXT "Last modified:",IDC_STATIC,103,108,58,8 + LTEXT "",IDC_NEWDATE,166,108,115,8 + LTEXT "Type:",IDC_STATIC,40,121,27,8 + LTEXT "",IDC_NEWTYPE,67,121,214,8 +END + +IDD_URLSEND DIALOGEX 0, 0, 215, 126 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + COMBOBOX IDC_URLS,5,30,205,92,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_MESSAGE,5,57,205,44,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + DEFPUSHBUTTON "&Send",IDOK,54,107,50,14 + PUSHBUTTON "&Cancel",IDCANCEL,113,107,50,14 + CONTROL "",IDC_PROTOCOL,"Button",BS_OWNERDRAW | WS_TABSTOP,5,7,12,12 + LTEXT "",IDC_NAME,19,7,118,9,SS_NOPREFIX | SS_CENTERIMAGE + CONTROL "&A",IDC_ADD,"MButtonClass",WS_TABSTOP,140,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "6",IDC_USERMENU,"MButtonClass",WS_TABSTOP,158,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&D",IDC_DETAILS,"MButtonClass",WS_TABSTOP,176,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&H",IDC_HISTORY,"MButtonClass",WS_TABSTOP,194,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + LTEXT "Enter URL:",IDC_ST_ENTERURL,5,20,205,8 + LTEXT "Enter description:",IDC_ST_ENTERMSG,5,47,205,8 +END + +IDD_URLRECV DIALOGEX 0, 0, 215, 140 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "URL Received" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "&Open URL",IDOK,"MButtonClass",WS_TABSTOP,11,120,57,14,WS_EX_NOACTIVATE | 0x10000000L + PUSHBUTTON "&Reply",IDC_REPLY,82,120,50,14 + PUSHBUTTON "&Close",IDCANCEL,148,120,50,14 + CONTROL "",IDC_PROTOCOL,"Button",BS_OWNERDRAW | WS_TABSTOP,5,7,12,12 + LTEXT "",IDC_NAME,19,7,118,9,SS_NOPREFIX | SS_CENTERIMAGE + CONTROL "&A",IDC_ADD,"MButtonClass",WS_TABSTOP,140,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "6",IDC_USERMENU,"MButtonClass",WS_TABSTOP,158,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&D",IDC_DETAILS,"MButtonClass",WS_TABSTOP,176,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&H",IDC_HISTORY,"MButtonClass",WS_TABSTOP,194,5,16,14,WS_EX_NOACTIVATE | 0x10000000L + LTEXT "Date:",IDC_STATIC,5,21,29,8 + EDITTEXT IDC_DATE,34,21,176,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + LTEXT "URL:",IDC_STATIC,5,33,205,8 + EDITTEXT IDC_URL,5,43,205,12,ES_AUTOHSCROLL | ES_READONLY + LTEXT "Description:",IDC_ST_ENTERMSG,5,60,205,8 + EDITTEXT IDC_MSG,5,70,205,44,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL +END + +IDD_HISTORY DIALOGEX 0, 0, 296, 166 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Message History" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Close",IDOK,239,144,50,14 + EDITTEXT IDC_EDIT,7,83,282,52,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL + LISTBOX IDC_LIST,7,7,282,72,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "&Find...",IDC_FIND,7,144,50,14 + PUSHBUTTON "Delete",IDC_DELETEHISTORY,66,144,50,14 +END + +IDD_OPT_SOUND DIALOGEX 0, 0, 285, 240 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Sounds",IDC_STATIC,4,4,277,154 + PUSHBUTTON "&Change...",IDC_CHANGE,16,213,50,14 + PUSHBUTTON "&Preview",IDC_PREVIEW,70,213,50,14 + CONTROL "Download more sounds",IDC_GETMORE,"Hyperlink",WS_TABSTOP | 0x2,127,216,137,8 + CONTROL "Tree1",IDC_SOUNDTREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_BORDER | WS_TABSTOP,12,33,261,119 + GROUPBOX "Sound Information",IDC_SGROUP,4,162,277,71 + LTEXT "Location:",IDC_SLOC,17,190,40,9 + EDITTEXT IDC_LOCATION,65,190,208,13,ES_AUTOHSCROLL | ES_READONLY + LTEXT "Name:",IDC_NAME,17,174,39,9 + LTEXT "",IDC_NAMEVAL,64,174,209,9 + CONTROL "Enable sound events",IDC_ENABLESOUNDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,17,261,10 +END + +IDD_OPT_ICONS DIALOGEX 0, 0, 257, 193 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Icons",IDC_STICONSGROUP,4,4,248,185 + LTEXT "Show category:",IDC_STATIC,12,18,66,16 + LISTBOX IDC_CATEGORYLIST,114,17,129,41,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + CONTROL "List1",IDC_PREVIEW,"SysListView32",LVS_SINGLESEL | LVS_AUTOARRANGE | WS_BORDER | WS_TABSTOP,12,66,231,83 + PUSHBUTTON "&Load icon set...",IDC_LOADICONS,12,158,94,13 + PUSHBUTTON "&Import icons >>",IDC_IMPORT,154,158,89,13 + CONTROL "Download more icons",IDC_GETMORE,"Hyperlink",WS_TABSTOP | 0x1,12,178,232,8 + LTEXT "",IDC_STSIMPLERIGHT,200,104,8,32,NOT WS_VISIBLE +END + +IDD_OPT_IGNORE DIALOGEX 0, 0, 313, 240 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "The following events are being ignored:",IDC_STATIC,8,14,297,8 + ICON IDI_RECVMSG,IDC_MSGICON,8,172,20,20,SS_CENTERIMAGE + LTEXT "Messages",IDC_STATIC,28,178,70,8,SS_NOPREFIX | SS_CENTERIMAGE + ICON IDI_URL,IDC_URLICON,8,187,20,20,SS_CENTERIMAGE + LTEXT "URLs",IDC_STATIC,28,193,70,8,SS_NOPREFIX | SS_CENTERIMAGE + ICON IDI_FILE,IDC_FILEICON,8,202,20,20,SS_CENTERIMAGE + LTEXT "Files",IDC_STATIC,28,208,70,8,SS_NOPREFIX | SS_CENTERIMAGE + ICON IDI_USERONLINE,IDC_ONLINEICON,96,172,20,20,SS_CENTERIMAGE + LTEXT "Online Notification",IDC_STATIC,116,178,107,8,SS_NOPREFIX | SS_CENTERIMAGE + ICON IDI_MIRANDA,IDC_AUTHICON,96,187,20,20,SS_CENTERIMAGE + LTEXT "Auth Requests",IDC_STATIC,116,193,107,8,SS_NOPREFIX | SS_CENTERIMAGE + ICON IDI_FILLEDBLOB,IDC_ALLICON,221,187,20,20,SS_CENTERIMAGE + LTEXT "All Events",IDC_STATIC,241,193,66,8,SS_NOPREFIX | SS_CENTERIMAGE + ICON IDI_EMPTYBLOB,IDC_NONEICON,221,202,20,20,SS_CENTERIMAGE + LTEXT "None",IDC_STATIC,241,208,66,8,SS_NOPREFIX | SS_CENTERIMAGE + CTEXT "Only the ticked contacts will be shown on the main contact list",IDC_STCHECKMARKS,8,227,297,8 + CONTROL "",IDC_LIST,"CListControl",WS_TABSTOP | 0x3da,8,26,297,146,WS_EX_CLIENTEDGE + GROUPBOX "Ignore",IDC_STATIC,0,0,313,240 + ICON IDI_ADDCONTACT,IDC_ADDED,96,202,20,20,SS_CENTERIMAGE + LTEXT "Added Notification",IDC_STATIC,116,208,107,8,SS_NOPREFIX | SS_CENTERIMAGE + ICON IDI_TYPING,IDC_TYPINGICON,221,172,20,20,SS_CENTERIMAGE + LTEXT "Typing",IDC_STATIC,241,178,66,8,SS_NOPREFIX | SS_CENTERIMAGE +END + +IDD_OPT_VISIBILITY DIALOGEX 0, 0, 313, 240 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Visibility",IDC_STATIC,0,0,313,240 + CONTROL "",IDC_LIST,"CListControl",WS_TABSTOP | 0x1d0,8,14,297,183,WS_EX_CLIENTEDGE + ICON IDI_ONLINE,IDC_VISIBLEICON,8,203,20,20,SS_CENTERIMAGE + LTEXT "You are visible to this person even when in invisible mode",IDC_STATIC,26,209,279,8,SS_NOPREFIX | SS_CENTERIMAGE + ICON IDI_INVISIBLE,IDC_INVISIBLEICON,8,218,20,20,SS_CENTERIMAGE + LTEXT "You are never visible to this person",IDC_STATIC,26,224,279,8,SS_NOPREFIX | SS_CENTERIMAGE +END + +IDD_OPT_AWAYMSG DIALOGEX 0, 0, 263, 151 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Status Messages",IDC_STATIC,4,5,255,142 + COMBOBOX IDC_STATUS,12,19,240,97,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Do not reply to requests for this message",IDC_DONTREPLY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,37,227,10 + CONTROL "Do not pop up dialog asking for new message",IDC_NODIALOG, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,50,227,10 + CONTROL "By default, use the same message as last time",IDC_USEPREVIOUS, + "Button",BS_AUTORADIOBUTTON,23,65,227,10 + CONTROL "By default, use this message:",IDC_USESPECIFIC,"Button",BS_AUTORADIOBUTTON,23,78,227,10 + EDITTEXT IDC_MSG,33,91,219,38,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + LTEXT "Use %time% for the current time, %date% for the current date",IDC_STATIC,33,131,219,8 +END + +IDD_ICONINDEX DIALOGEX 0, 0, 219, 197 +STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Icon Index" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + RTEXT "Icon library:",IDC_STATIC,4,6,54,8 + EDITTEXT IDC_ICONSET,60,4,139,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BROWSE,201,5,14,10 + LTEXT "Drag icons to main list to assign them:",IDC_STATIC,4,18,211,8 + CONTROL "List1",IDC_PREVIEW,"SysListView32",LVS_SINGLESEL | LVS_AUTOARRANGE | WS_BORDER | WS_TABSTOP,4,27,211,82 + GROUPBOX "Import multiple",IDC_IMPORTMULTI,4,122,211,61 + CONTROL "To main icons",IDC_TOMAIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,132,74,12 + CONTROL "To",IDC_TOPROTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,165,25,12 + COMBOBOX IDC_PROTOLIST,34,164,79,58,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "<< &Import",IDC_IMPORT,164,164,48,14,WS_DISABLED + CONTROL "Download more icons",IDC_GETMORE,"Hyperlink",WS_TABSTOP | 0x1,4,185,211,8 + CONTROL "To default status icons",IDC_TODEFICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,148,123,12 +END + +IDD_OPT_NETLIB DIALOGEX 0, 0, 313, 235 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + COMBOBOX IDC_NETLIBUSERS,0,1,231,110,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Logging...",IDC_LOGOPTIONS,241,1,60,13 + GROUPBOX "Outgoing Connections",IDC_STATIC12,0,18,313,148 + CONTROL "Use proxy server",IDC_USEPROXY,"Button",BS_3STATE | WS_TABSTOP,7,29,159,9 + LTEXT "Type:",IDC_STATIC21,19,43,57,8,WS_DISABLED + COMBOBOX IDC_PROXYTYPE,80,40,86,62,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP + LTEXT "Host:",IDC_STATIC22,19,58,57,8,WS_DISABLED + EDITTEXT IDC_PROXYHOST,80,56,86,12,ES_AUTOHSCROLL | WS_DISABLED + LTEXT "Port:",IDC_STATIC23,177,58,35,8,WS_DISABLED + EDITTEXT IDC_PROXYPORT,213,56,35,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED + LTEXT "(often %d)",IDC_STOFTENPORT,258,57,48,8,WS_DISABLED + CONTROL "Use Custom Login (Domain login picked up automatically)",IDC_PROXYAUTH, + "Button",BS_3STATE | WS_DISABLED | WS_TABSTOP,20,80,286,10 + LTEXT "Username:",IDC_STATIC31,32,94,47,8,WS_DISABLED + EDITTEXT IDC_PROXYUSER,80,92,86,12,ES_AUTOHSCROLL | WS_DISABLED + LTEXT "Password:",IDC_STATIC32,177,94,49,8,WS_DISABLED + EDITTEXT IDC_PROXYPASS,232,92,74,12,ES_PASSWORD | ES_AUTOHSCROLL | WS_DISABLED + CONTROL "Resolve hostnames through proxy",IDC_PROXYDNS,"Button",BS_3STATE | WS_DISABLED | WS_TABSTOP,20,115,202,10 + CONTROL "Port Range:",IDC_SPECIFYPORTSO,"Button",BS_3STATE | BS_TOP | BS_MULTILINE | WS_TABSTOP,7,130,72,9 + EDITTEXT IDC_PORTSRANGEO,80,129,142,12,ES_AUTOHSCROLL | WS_DISABLED + LTEXT "Example: 1050-1070, 2000-2013, 2500",IDC_STATIC54,80,144,196,8,WS_DISABLED + CONTROL "Validate SSL certificates",IDC_VALIDATESSL,"Button",BS_3STATE | BS_TOP | BS_MULTILINE | WS_TABSTOP,7,154,299,9 + GROUPBOX "Incoming Connections",IDC_STATIC43,0,167,313,52 + CONTROL "Port Range:",IDC_SPECIFYPORTS,"Button",BS_3STATE | BS_TOP | BS_MULTILINE | WS_TABSTOP,7,179,72,9 + EDITTEXT IDC_PORTSRANGE,80,178,142,12,ES_AUTOHSCROLL | WS_DISABLED + LTEXT "Example: 1050-1070, 2000-2013, 2500",IDC_STATIC52,80,193,196,8,WS_DISABLED + CONTROL "Enable UPnP port mapping",IDC_ENABLEUPNP,"Button",BS_3STATE | BS_TOP | BS_MULTILINE | WS_TABSTOP,7,204,299,9 + CTEXT "You will need to reconnect for the changes you have made on this page to take effect.",IDC_RECONNECTREQD,4,224,307,8,NOT WS_VISIBLE +END + +IDD_OPT_FILETRANSFER DIALOGEX 0, 0, 313, 232 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Receiving files",IDC_STATIC,0,0,313,90 + LTEXT "Received files folder:",IDC_STATIC,8,15,82,8 + EDITTEXT IDC_FILEDIR,92,13,190,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_FILEDIRBROWSE,287,14,15,11 + LTEXT "Variables Allowed: %userid%, %nick%, %proto%, %miranda_path%, %userprofile%",IDC_STATIC,8,27,294,11,WS_DISABLED + CONTROL "Auto-accept incoming files from people on my contact list",IDC_AUTOACCEPT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,39,294,10 + CONTROL "Minimize the file transfer window",IDC_AUTOMIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,52,285,10 + CONTROL "Close window when transfer completes",IDC_AUTOCLOSE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,65,294,10 + CONTROL "Clear completed transfers on window closing",IDC_AUTOCLEAR, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,76,294,10 + GROUPBOX "Virus scanner",IDC_VIRUSSCANNERGROUP,0,90,313,93 + LTEXT "Scan files:",IDC_STATIC,8,102,43,9,SS_CENTERIMAGE + CONTROL "Never, do not use virus scanning",IDC_NOSCANNER,"Button",BS_AUTORADIOBUTTON,52,102,250,10 + CONTROL "When all files have been downloaded",IDC_SCANAFTERDL, + "Button",BS_AUTORADIOBUTTON,52,114,250,10 + CONTROL "As each file finishes downloading",IDC_SCANDURINGDL, + "Button",BS_AUTORADIOBUTTON,52,126,250,10 + LTEXT "Command line:",IDC_ST_CMDLINE,7,142,62,8 + COMBOBOX IDC_SCANCMDLINE,70,141,213,71,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDC_SCANCMDLINEBROWSE,287,142,15,11 + LTEXT "%f will be replaced by the file or folder name to be scanned",IDC_ST_CMDLINEHELP,70,155,232,8 + CONTROL "Warn me before opening a file that has not been scanned",IDC_WARNBEFOREOPENING, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,168,294,10 + GROUPBOX "If incoming files already exist",IDC_STATIC,0,187,313,41 + CONTROL "Ask me",IDC_ASK,"Button",BS_AUTORADIOBUTTON,8,200,73,10 + CONTROL "Resume",IDC_RESUME,"Button",BS_AUTORADIOBUTTON,82,200,125,10 + CONTROL "Overwrite",IDC_OVERWRITE,"Button",BS_AUTORADIOBUTTON,8,212,73,10 + CONTROL "Rename (append "" (1)"", etc.)",IDC_RENAME,"Button",BS_AUTORADIOBUTTON,82,212,125,10 + LTEXT "You will always be asked about files from people not on your contact list",IDC_STATIC,212,198,90,24 +END + +IDD_OPT_IDLE DIALOGEX 0, 0, 312, 190 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_BORDER +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "Become idle if the following is left unattended:",IDC_IDLESHORT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,18,259,9 + CONTROL "Windows",IDC_IDLEONWINDOWS,"Button",BS_AUTORADIOBUTTON,45,31,104,9 + CONTROL "Miranda",IDC_IDLEONMIRANDA,"Button",BS_AUTORADIOBUTTON,45,43,103,9 + EDITTEXT IDC_IDLE1STTIME,59,59,27,14,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin2",IDC_IDLESPIN,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,71,55,12,23 + CONTROL "Become idle if the screen saver is active",IDC_SCREENSAVER, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,83,265,9 + CONTROL "Become idle if the computer is locked (2000/XP+ only)",IDC_LOCKED, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,105,265,9 + CONTROL "Become idle if a terminal session is disconnected",IDC_IDLETERMINAL, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,116,265,10 + CONTROL "Do not let protocols report any idle information",IDC_IDLEPRIVATE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,131,251,9 + LTEXT "minute(s)",IDC_STATIC,91,61,76,9 + RTEXT "for",IDC_STATIC,12,59,41,9 + COMBOBOX IDC_AASTATUS,161,146,64,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Change my status mode to:",IDC_AASHORTIDLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,147,132,11 + CONTROL "Do not set status back to online when returning from idle",IDC_IDLESTATUSLOCK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,35,164,254,10 + GROUPBOX "Idle Options",IDC_STATIC,3,3,304,182 + CONTROL "Become idle if application full screen",IDC_FULLSCREEN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,25,94,265,9 +END + +IDD_PROFILE_SELECTION DIALOGEX 0, 0, 386, 142 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "List1",IDC_PROFILELIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_TABSTOP,3,2,382,137 +END + +IDD_PROFILE_NEW DIALOGEX 0, 0, 386, 142 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Please complete the following form to create a new user profile",IDC_STATIC,7,7,231,16 + EDITTEXT IDC_PROFILENAME,67,27,75,12,ES_AUTOHSCROLL + COMBOBOX IDC_PROFILEDRIVERS,67,72,75,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Profile",IDC_STATIC,20,28,40,9 + LTEXT "e.g. Workplace",IDC_STATIC,161,28,77,11 + LTEXT "You can select a different profile driver from the default, it may offer more features or abilities, if in doubt use the default.",IDC_STATIC,7,49,231,17 + LTEXT "e.g. Miranda Database",IDC_STATIC,154,73,84,11 + LTEXT "Driver",IDC_STATIC,20,74,43,9 + LTEXT "Problem: Unable to find any database drivers, this means you can not create a new profile, you need to get dbx_3x.dll",IDC_NODBDRIVERS,7,113,231,22,NOT WS_VISIBLE +END + +IDD_OPT_PLUGINS DIALOGEX 0, 0, 315, 252 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "List1",IDC_PLUGLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,4,4,306,110 + CONTROL "Download more plugins",IDC_GETMOREPLUGINS,"Hyperlink",WS_TABSTOP,4,116,306,8 + GROUPBOX "",IDC_PLUGININFOFRAME,4,125,307,125,BS_RIGHT + EDITTEXT IDC_PLUGINLONGINFO,50,136,253,25,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER + EDITTEXT IDC_PLUGINAUTHOR,50,165,253,18,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER + CONTROL "",IDC_PLUGINEMAIL,"Hyperlink",WS_TABSTOP,50,188,208,10 + CONTROL "",IDC_PLUGINURL,"Hyperlink",WS_TABSTOP,50,201,254,10 + EDITTEXT IDC_PLUGINPID,50,214,254,12,ES_READONLY | ES_WANTRETURN | NOT WS_BORDER + EDITTEXT IDC_PLUGINCPYR,50,227,254,12,ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER + RTEXT "Description:",IDC_STATIC,8,136,38,10 + RTEXT "Author(s):",IDC_STATIC,8,165,38,10 + RTEXT "E-mail:",IDC_STATIC,8,188,38,10 + RTEXT "Homepage:",IDC_STATIC,10,200,38,9 + RTEXT "Unique ID:",IDC_STATIC,7,214,38,10 + RTEXT "Copyright:",IDC_STATIC,8,227,38,10 + CTEXT "Please restart Miranda IM for your changes to take effect.",IDC_RESTART,14,240,288,8,NOT WS_VISIBLE +END + +IDD_OPT_FONTS DIALOGEX 0, 0, 316, 251 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Fonts and Colors",IDC_STATIC,0,0,315,250 + CONTROL "Tree1",IDC_FONTGROUP,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_BORDER | WS_TABSTOP,4,10,102,235 + LISTBOX IDC_FONTLIST,109,10,201,186,LBS_OWNERDRAWVARIABLE | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP + CONTROL "",IDC_BKGCOLOUR,"ColourPicker",WS_TABSTOP,196,199,30,14 + CONTROL "...",IDC_EFFECT,"MButtonClass",NOT WS_VISIBLE | WS_TABSTOP,196,199,30,14 + CONTROL "",IDC_FONTCOLOUR,"ColourPicker",WS_TABSTOP,196,215,30,14 + CONTROL "...",IDC_CHOOSEFONT,"MButtonClass",WS_TABSTOP,196,231,30,14 + PUSHBUTTON "Undo",IDC_BTN_UNDO,109,199,73,14 + PUSHBUTTON "Reset",IDC_BTN_RESET,109,215,73,14 + PUSHBUTTON "Export...",IDC_BTN_EXPORT,109,231,73,14 + LTEXT "Color/Background",IDC_BKGCOLOUR_STATIC,231,199,79,14,SS_CENTERIMAGE + LTEXT "Text Effect",IDC_EFFECT_STATIC,231,199,79,14,SS_CENTERIMAGE | NOT WS_VISIBLE + LTEXT "Text Color",IDC_STATIC,231,215,79,14,SS_CENTERIMAGE + LTEXT "Choose Font",IDC_STATIC,231,231,79,14,SS_CENTERIMAGE +END + +IDD_CUSTOM_FONT DIALOGEX 13, 54, 287, 196 +STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Font" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "&Font:",1088,7,7,40,9 + COMBOBOX 1136,7,16,98,76,CBS_SIMPLE | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP + LTEXT "Font st&yle:",1089,110,7,44,9 + COMBOBOX 1137,110,16,74,76,CBS_SIMPLE | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + LTEXT "\nStyles and effects are disabled for this font.",1095,110,16,74,76 + LTEXT "&Size:",1090,189,7,30,9 + COMBOBOX 1138,190,16,36,76,CBS_SIMPLE | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Effects",1072,7,97,98,72,WS_GROUP + CONTROL "Stri&keout",1040,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,110,49,10 + CONTROL "&Underline",1041,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,123,51,10 + LTEXT "&Color:",1091,13,136,30,9,NOT WS_VISIBLE + COMBOBOX 1139,13,146,82,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_HASSTRINGS | NOT WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Sample",1073,110,97,116,43,WS_GROUP + CTEXT "AaBbYyZz",1092,118,111,100,23,SS_NOPREFIX | NOT WS_VISIBLE + LTEXT "",1093,7,172,219,20,SS_NOPREFIX | NOT WS_GROUP + LTEXT "Sc&ript:",1094,110,147,30,9 + COMBOBOX 1140,110,157,116,30,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,231,16,45,14,WS_GROUP + PUSHBUTTON "Cancel",IDCANCEL,231,32,45,14,WS_GROUP + PUSHBUTTON "&Apply",1026,231,48,45,14,WS_GROUP + PUSHBUTTON "&Help",1038,231,64,45,14,WS_GROUP +END + +IDD_OPT_ICOLIB DIALOGEX 0, 0, 316, 251 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Icons",IDC_STICONSGROUP,0,0,315,250 + CONTROL "List1",IDC_PREVIEW,"SysListView32",LVS_AUTOARRANGE | WS_BORDER | WS_TABSTOP,109,10,201,207 + PUSHBUTTON "&Load icon set...",IDC_LOADICONS,116,220,94,13 + PUSHBUTTON "&Import icons >>",IDC_IMPORT,215,220,89,13 + CONTROL "Download more icons",IDC_GETMORE,"Hyperlink",WS_TABSTOP | 0x1,109,237,201,8 + CONTROL "Tree1",IDC_CATEGORYLIST,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | TVS_NOHSCROLL | WS_BORDER | WS_TABSTOP,4,10,102,235 +END + +IDD_ICOLIB_IMPORT DIALOGEX 0, 0, 217, 194 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_TOOLWINDOW | WS_EX_CONTROLPARENT +CAPTION "Icon Index" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + RTEXT "Icon library:",IDC_STATIC,5,6,44,8 + EDITTEXT IDC_ICONSET,53,4,127,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_BROWSE,186,5,14,10 + LTEXT "Drag icons to main list to assign them:",IDC_STATIC,4,18,207,8 + CONTROL "List1",IDC_PREVIEW,"SysListView32",LVS_SINGLESEL | LVS_AUTOARRANGE | WS_BORDER | WS_TABSTOP,4,27,208,163 +END + +IDD_OPT_GENMENU DIALOGEX 0, 0, 316, 254 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Menu Objects",IDC_STATIC,5,2,140,99 + CONTROL "Tree2",IDC_MENUOBJECTS,"SysTreeView32",TVS_SHOWSELALWAYS | WS_BORDER | WS_HSCROLL | WS_TABSTOP,11,13,128,82 + GROUPBOX "Menu Items",IDC_STATIC,149,2,161,248 + CONTROL "Tree1",IDC_MENUITEMS,"SysTreeView32",TVS_SHOWSELALWAYS | WS_DISABLED | WS_BORDER | WS_HSCROLL | WS_TABSTOP,156,13,148,212 + GROUPBOX "Protocol menus",IDC_STATIC,5,100,140,37 + CONTROL "Move to the main menu",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,11,111,128,8 + CONTROL "Move to the status bar",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,11,123,130,8 + LTEXT "Warning!\r\nThis MenuObject not support user defined options.",IDC_NOTSUPPORTWARNING,10,140,136,32,NOT WS_VISIBLE + PUSHBUTTON "Insert separator",IDC_INSERTSEPARATOR,39,180,97,14,WS_DISABLED + LTEXT "Service:",IDC_STATIC,4,201,29,8 + EDITTEXT IDC_GENMENU_SERVICE,36,199,108,14,ES_AUTOHSCROLL | ES_READONLY + LTEXT "Name:",IDC_STATIC,4,218,29,8 + EDITTEXT IDC_GENMENU_CUSTOMNAME,36,215,108,14,ES_AUTOHSCROLL | WS_DISABLED + PUSHBUTTON "Default",IDC_GENMENU_DEFAULT,18,234,55,15,WS_DISABLED + PUSHBUTTON "Set",IDC_GENMENU_SET,78,234,55,15,WS_DISABLED + CONTROL "Disable icons",IDC_DISABLEMENUICONS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,156,234,91,10 + PUSHBUTTON "Reset",IDC_RESETMENU,254,230,50,14 +END + +IDD_OPT_PROTOCOLORDER DIALOGEX 0, 0, 300, 211 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CTEXT "Note: Miranda IM will have to be restarted for changes to take effect.",IDC_PROTOCOLORDERWARNING,5,190,289,14,NOT WS_VISIBLE + GROUPBOX "Account Order && Visibility",IDC_STATIC,75,0,147,185 + CONTROL "Tree1",IDC_PROTOCOLORDER,"SysTreeView32",TVS_NOTOOLTIPS | WS_BORDER | WS_TABSTOP,85,40,132,95 + LTEXT "Show protocols in the following order, drag to choose another order:",IDC_STATIC,85,15,132,20 + PUSHBUTTON "Reset",IDC_RESETPROTOCOLDATA,120,140,50,14,BS_NOTIFY +END + +IDD_UPDATE_NOTIFY DIALOGEX 0, 0, 259, 103 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Miranda IM v%s Now Available" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "A new version of Miranda IM is now available. Click the download button to download this new update.",IDC_MESSAGE,7,7,245,21 + LTEXT "Latest Version:",IDC_NEWVERSIONLABEL,7,47,65,8 + LTEXT "Your Version:",IDC_STATIC,7,32,65,8 + LTEXT "",IDC_CURRENTVERSION,77,32,97,8 + CONTROL "",IDC_VERSION,"Hyperlink",WS_TABSTOP,77,47,97,8 + LTEXT "",IDC_UPDATE,77,47,97,8 + PUSHBUTTON "&Download Now",IDC_DOWNLOAD,7,61,66,15 + DEFPUSHBUTTON "&Close",IDOK,202,84,50,15 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,80,245,1 +END + +IDD_OPT_UPDATENOTIFY DIALOGEX 0, 0, 268, 94 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Update Notification Options",IDC_STATIC,2,0,265,94 + CONTROL "Automatically check for new versions of Miranda IM",IDC_ENABLEUPDATES, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,13,237,10 + LTEXT "Check for updates for the following:",IDC_STATIC,12,32,230,8 + CONTROL "Stable releases",IDC_ENABLESTABLE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,25,46,230,10 + CONTROL "Preview releases (beta)",IDC_ENABLEBETA,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,25,61,230,10 + CONTROL "Development releases (alpha)",IDC_ENABLEALPHA,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,25,76,230,10 +END + +IDD_OPT_KEYBINDINGS DIALOGEX 0, 0, 316, 251 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Key Bindings",IDC_STATIC,0,0,315,250 + CONTROL "Tree1",IDC_CATEGORYLIST,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_BORDER | WS_TABSTOP,4,10,102,235 + LTEXT "Shortcut:",IDC_STATIC,109,10,146,12 + EDITTEXT IDC_PREVIEW,109,21,146,12 + CONTROL "Add",IDC_ADD,"MButtonClass",WS_TABSTOP,260,19,50,14 + LTEXT "",IDC_MESSAGE,109,37,201,41 + LISTBOX IDC_LIST,109,80,146,52,WS_VSCROLL | WS_TABSTOP + CONTROL "Remove",IDC_DELETE,"MButtonClass",WS_TABSTOP,260,80,50,14 + PUSHBUTTON "Undo Changes",IDC_BTN_UNDO,109,140,96,14 + PUSHBUTTON "Reset To Default",IDC_BTN_RESET,214,140,96,14 +END + +IDD_OPT_HOTKEYS DIALOGEX 0, 0, 316, 251 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Hotkeys",IDC_STICONSGROUP,0,0,315,250 + CONTROL "List1",IDC_LV_HOTKEYS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_AUTOARRANGE | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,4,10,306,202 + EDITTEXT IDC_HOTKEY,192,205,118,14,ES_CENTER | ES_AUTOHSCROLL | NOT WS_VISIBLE + CONTROL "",IDC_CANVAS,"Static",SS_OWNERDRAW,4,217,306,14,WS_EX_TRANSPARENT + CONTROL "",IDC_CANVAS2,"Static",SS_OWNERDRAW,4,231,306,14,WS_EX_TRANSPARENT +END + +IDD_ACCMGR DIALOGEX 0, 0, 350, 245 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Accounts" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + CONTROL "Accounts\nConfigure your IM accounts",IDC_HEADERBAR, + "MHeaderbarCtrl",0x0,0,0,350,25 + LISTBOX IDC_ACCLIST,7,32,130,187,LBS_SORT | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LTEXT "Account information:",IDC_TXT_ACCOUNT,142,32,201,8 + LTEXT "Welcome to Miranda IM's account manager!\nHere you can set up your IM accounts.\n\nSelect an account from the list on the left to see the available options. Alternatively, just click on the Plus sign underneath the list to set up a new IM account.",IDC_TXT_INFO,157,45,186,134 + LTEXT "Additional:",IDC_TXT_ADDITIONAL,142,184,201,8 + CONTROL "Configure network...",IDC_LNK_NETWORK,"Hyperlink",WS_TABSTOP,157,197,186,11 + CONTROL "Get more protocols...",IDC_LNK_ADDONS,"Hyperlink",WS_TABSTOP,157,208,186,11 + CONTROL "&Add...",IDC_ADD,"MButtonClass",WS_TABSTOP,7,224,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&Edit",IDC_EDIT,"MButtonClass",WS_TABSTOP,26,224,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&Options",IDC_OPTIONS,"MButtonClass",WS_TABSTOP,45,224,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&Upgrade",IDC_UPGRADE,"MButtonClass",WS_TABSTOP,64,224,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&Remove...",IDC_REMOVE,"MButtonClass",WS_TABSTOP,83,224,16,14,WS_EX_NOACTIVATE | 0x10000000L + DEFPUSHBUTTON "OK",IDOK,239,224,50,14 + PUSHBUTTON "Cancel",IDCANCEL,293,224,50,14 +END + +IDD_WAITRESTART DIALOGEX 0, 0, 167, 70 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "Miranda IM" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + LTEXT "Miranda IM is being restarted.\nPlease wait...",IDC_STATIC,7,7,153,18 + CONTROL "",IDC_PROGRESSBAR,"msctls_progress32",WS_BORDER,7,30,153,14 + PUSHBUTTON "Close",IDCANCEL,110,49,50,14 +END + +IDD_FTMGR DIALOGEX 0, 0, 276, 255 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +CAPTION "File Transfers" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + CONTROL "",IDC_TABS,"SysTabControl32",0x0,7,7,262,224 + PUSHBUTTON "Clear completed",IDC_CLEAR,7,234,100,14 + PUSHBUTTON "Close",IDCANCEL,219,234,50,14 +END + +IDD_FTPAGE DIALOGEX 0, 0, 320, 183 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VSCROLL | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT | WS_EX_STATICEDGE +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN +END + +IDD_OPT_KEYWORDFILTER DIALOGEX 0, 0, 251, 73 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + CONTROL "Enable keyword search in options dialog",IDC_ENABLE_KEYWORDFILTERING, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,4,243,10 + LTEXT "If this option is checked it allows you to search for option pages that contain the search string or plugin name.",IDC_STATIC,4,20,243,49,NOT WS_GROUP +END + +IDD_ERROR_LIST DIALOGEX 0, 0, 312, 209 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Error Console" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LISTBOX IDC_LST_ERRORS,5,5,301,198,LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP +END + +IDD_OPT_ERRORS DIALOGEX 0, 0, 316, 251 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Error notifications",IDC_STATIC,0,0,315,250 + CONTROL "",IDC_LV_ERRORS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,4,10,306,235 +END + +IDD_MODERNOPT_FONTS DIALOGEX 0, 0, 260, 210 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "Headers:",IDC_TXT_TITLE1,0,0,259,8 + PUSHBUTTON "...",IDC_CHOOSEFONTHEADER,244,30,16,14 + LTEXT "This font is used to display main section titles or text elements.",IDC_STATIC,10,11,249,16,SS_CENTERIMAGE + LTEXT "Normal text:",IDC_TXT_TITLE2,0,55,259,8 + PUSHBUTTON "...",IDC_CHOOSEFONTGENERAL,244,84,16,14 + LTEXT "This font is used to display most text element or section bodies.",IDC_STATIC,10,66,249,16,SS_CENTERIMAGE + LTEXT "Minor notes:",IDC_TXT_TITLE3,0,109,259,8 + PUSHBUTTON "...",IDC_CHOOSEFONTSMALL,244,139,16,14 + LTEXT "This font is used to display various addtional notes.",IDC_STATIC,10,120,249,16,SS_CENTERIMAGE + CONTROL "",IDC_PREVIEWSMALL,"Static",SS_OWNERDRAW,10,139,229,15,WS_EX_STATICEDGE + CONTROL "",IDC_PREVIEWGENERAL,"Static",SS_OWNERDRAW,10,84,229,15,WS_EX_STATICEDGE + CONTROL "",IDC_PREVIEWHEADER,"Static",SS_OWNERDRAW,10,30,229,15,WS_EX_STATICEDGE +END + +IDD_MODERNOPT_ACCOUNTS DIALOGEX 0, 0, 368, 210 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LISTBOX IDC_ACCLIST,0,0,162,192,LBS_SORT | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LTEXT "Account information:",IDC_TXT_ACCOUNT,167,0,201,8 + LTEXT "Welcome to Miranda IM's account manager!\nHere you can set up your IM accounts.\n\nSelect an account from the list on the left to see the available options. Alternatively, just click on the ""New"" button underneath the list to set up a new IM account.",IDC_TXT_INFO,182,13,186,134 + CONTROL "&Add...",IDC_ADD,"MButtonClass",WS_TABSTOP,0,196,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&Edit",IDC_EDIT,"MButtonClass",WS_TABSTOP,22,196,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&Options",IDC_OPTIONS,"MButtonClass",WS_TABSTOP,38,196,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&Upgrade",IDC_UPGRADE,"MButtonClass",WS_TABSTOP,54,196,16,14,WS_EX_NOACTIVATE | 0x10000000L + CONTROL "&Remove...",IDC_REMOVE,"MButtonClass",WS_TABSTOP,76,196,16,14,WS_EX_NOACTIVATE | 0x10000000L + LTEXT "Additional:",IDC_TXT_ADDITIONAL,167,157,201,8 + CONTROL "Configure network...",IDC_LNK_NETWORK,"Hyperlink",WS_TABSTOP,183,170,186,11 + CONTROL "Get more protocols...",IDC_LNK_ADDONS,"Hyperlink",WS_TABSTOP,183,181,186,11 +END + +IDD_MODERNOPT_MODULES DIALOGEX 0, 0, 369, 210 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + EDITTEXT IDC_PLUGINLONGINFO,65,133,304,25,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER + EDITTEXT IDC_PLUGINAUTHOR,65,160,304,12,ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER + CONTROL "",IDC_PLUGINEMAIL,"Hyperlink",WS_TABSTOP,65,172,304,10 + CONTROL "",IDC_PLUGINURL,"Hyperlink",WS_TABSTOP,65,184,304,10 + EDITTEXT IDC_PLUGINCPYR,65,197,304,12,ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER + RTEXT "Description:",IDC_TXT_TITLE1,-1,133,60,10 + RTEXT "Author(s):",IDC_TXT_TITLE2,0,160,60,10 + RTEXT "E-mail:",IDC_TXT_TITLE3,0,172,60,10 + RTEXT "Homepage:",IDC_TXT_TITLE4,0,184,60,9 + RTEXT "Copyright:",IDC_TXT_TITLE6,0,197,60,10 + CONTROL "",IDC_PLUGLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_AUTOARRANGE | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,0,0,369,128 +END + +IDD_MODERNOPT_STATUS DIALOGEX 0, 0, 369, 113 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + COMBOBOX IDC_STATUS,2,54,16,97,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + CONTROL "Do not reply to requests for this message",IDC_DONTREPLY, + "Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,0,33,10,10 + CONTROL "Do not pop up dialog asking for new message",IDC_NODIALOG, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,105,93,264,10 + CONTROL "By default, use the same message as last time",IDC_USEPREVIOUS, + "Button",BS_AUTORADIOBUTTON,105,13,227,10 + CONTROL "By default, use this message:",IDC_USESPECIFIC,"Button",BS_AUTORADIOBUTTON,105,26,227,10 + EDITTEXT IDC_MSG,125,39,244,38,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + CTEXT "Use %time% for the current time, %date% for the current date",IDC_STATIC,125,78,244,8,SS_CENTERIMAGE + LTEXT "Status messages:",IDC_TXT_TITLE1,0,0,246,8 + LISTBOX IDC_LST_STATUS,10,13,90,95,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP +END + +IDD_MODERNOPT_IDLE DIALOGEX 0, 0, 369, 64 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + CONTROL "Become idle if computer is left unattended for:",IDC_IDLESHORT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,13,171,9 + CONTROL "Windows",IDC_IDLEONWINDOWS,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,325,25,26,9 + CONTROL "Miranda",IDC_IDLEONMIRANDA,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,287,37,15,9 + EDITTEXT IDC_IDLE1STTIME,181,11,27,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_IDLESPIN,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,193,7,11,23 + CONTROL "Become idle if the screen saver is active",IDC_SCREENSAVER, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,25,268,9 + CONTROL "Become idle if the computer is locked (2000/XP+ only)",IDC_LOCKED, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,37,249,9 + CONTROL "Become idle if a terminal session is disconnected",IDC_IDLETERMINAL, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,49,265,10 + CONTROL "Do not let protocols report any idle information",IDC_IDLEPRIVATE, + "Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,303,13,22,9 + LTEXT "minute(s)",IDC_STATIC,213,13,76,9,SS_CENTERIMAGE + COMBOBOX IDC_AASTATUS,325,46,23,50,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + CONTROL "Change my status mode to:",IDC_AASHORTIDLE,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,334,11,23,11 + CONTROL "Do not set status back to online when returning from idle",IDC_IDLESTATUSLOCK, + "Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,299,24,16,10 + LTEXT "Idle (auto-away):",IDC_TXT_TITLE1,0,0,246,8 +END + +IDD_MODERNOPT_IGNORE DIALOGEX 0, 0, 369, 210 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + CONTROL "",IDC_LIST,"CListControl",WS_TABSTOP | 0x3da,10,13,358,135,WS_EX_CLIENTEDGE + LTEXT "Event icon legend:",IDC_TXT_TITLE2,0,153,119,8 + LTEXT "Choose events you wish to ingonre:",IDC_TXT_TITLE1,0,0,246,8 + CONTROL "",IDC_LV_LEGEND,"SysListView32",LVS_LIST | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,10,166,358,43 +END + +IDD_CHOOSE_FONT_EFFECT DIALOGEX 13, 54, 226, 103 +STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Font Effect" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Effect:",IDC_STATIC,12,12,66,12,SS_CENTERIMAGE + COMBOBOX IDC_EFFECT_COMBO,84,12,126,30,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "Base colour:",IDC_STATIC,12,30,66,12,SS_CENTERIMAGE + CONTROL "",IDC_EFFECT_COLOUR1,"ColourPicker",WS_TABSTOP,84,30,30,12 + LTEXT "opacity:",IDC_STATIC,126,30,42,12,SS_CENTERIMAGE + EDITTEXT IDC_EFFECT_COLOUR_TEXT1,168,30,42,12,ES_NUMBER + CONTROL "",IDC_EFFECT_COLOUR_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,200,30,11,12 + LTEXT "Secondary colour:",IDC_STATIC,12,48,66,12,SS_CENTERIMAGE + CONTROL "",IDC_EFFECT_COLOUR2,"ColourPicker",WS_TABSTOP,84,48,30,12 + LTEXT "opacity:",IDC_STATIC,126,48,42,12,SS_CENTERIMAGE + EDITTEXT IDC_EFFECT_COLOUR_TEXT2,168,48,42,12,ES_NUMBER + CONTROL "",IDC_EFFECT_COLOUR_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | UDS_HOTTRACK,200,48,11,12 + DEFPUSHBUTTON "OK",IDOK,114,78,45,14,WS_GROUP + PUSHBUTTON "Cancel",IDCANCEL,168,78,45,14,WS_GROUP +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_AUTHREQ, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 264 + BOTTOMMARGIN, 190 + END + + IDD_ADDCONTACT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 223 + TOPMARGIN, 7 + BOTTOMMARGIN, 144 + END + + IDD_ADDED, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 233 + TOPMARGIN, 3 + BOTTOMMARGIN, 65 + END + + IDD_ABOUT, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 207 + TOPMARGIN, 7 + BOTTOMMARGIN, 126 + END + + IDD_DELETECONTACT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 286 + TOPMARGIN, 7 + BOTTOMMARGIN, 88 + END + + IDD_OPT_CONTACT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 192 + TOPMARGIN, 7 + BOTTOMMARGIN, 140 + END + + IDD_FINDADD, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 422 + VERTGUIDE, 11 + VERTGUIDE, 42 + VERTGUIDE, 53 + VERTGUIDE, 116 + VERTGUIDE, 122 + TOPMARGIN, 5 + BOTTOMMARGIN, 252 + END + + IDD_OPTIONS, DIALOG + BEGIN + LEFTMARGIN, 4 + RIGHTMARGIN, 424 + TOPMARGIN, 4 + BOTTOMMARGIN, 297 + END + + IDD_OPTIONSPAGE, DIALOG + BEGIN + LEFTMARGIN, 4 + TOPMARGIN, 4 + BOTTOMMARGIN, 297 + END + + IDD_READAWAYMSG, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 182 + TOPMARGIN, 5 + BOTTOMMARGIN, 67 + END + + IDD_SETAWAYMSG, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 182 + TOPMARGIN, 5 + BOTTOMMARGIN, 67 + END + + IDD_DETAILS, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 233 + TOPMARGIN, 5 + BOTTOMMARGIN, 205 + END + + IDD_INFO_SUMMARY, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 217 + VERTGUIDE, 51 + VERTGUIDE, 126 + VERTGUIDE, 170 + TOPMARGIN, 5 + BOTTOMMARGIN, 127 + HORZGUIDE, 22 + HORZGUIDE, 35 + HORZGUIDE, 48 + HORZGUIDE, 62 + END + + IDD_INFO_CONTACT, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 217 + TOPMARGIN, 5 + BOTTOMMARGIN, 127 + END + + IDD_INFO_BACKGROUND, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 217 + VERTGUIDE, 49 + TOPMARGIN, 5 + BOTTOMMARGIN, 127 + END + + IDD_INFO_NOTES, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 217 + TOPMARGIN, 5 + BOTTOMMARGIN, 127 + END + + IDD_INFO_LOCATION, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 217 + VERTGUIDE, 56 + TOPMARGIN, 5 + BOTTOMMARGIN, 142 + HORZGUIDE, 22 + HORZGUIDE, 33 + HORZGUIDE, 45 + HORZGUIDE, 56 + HORZGUIDE, 70 + HORZGUIDE, 95 + HORZGUIDE, 106 + END + + IDD_INFO_WORK, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 217 + VERTGUIDE, 56 + VERTGUIDE, 126 + VERTGUIDE, 170 + TOPMARGIN, 5 + BOTTOMMARGIN, 127 + HORZGUIDE, 16 + HORZGUIDE, 27 + HORZGUIDE, 44 + HORZGUIDE, 61 + HORZGUIDE, 72 + HORZGUIDE, 83 + HORZGUIDE, 94 + HORZGUIDE, 105 + END + + IDD_ADDEMAIL, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 182 + TOPMARGIN, 5 + BOTTOMMARGIN, 37 + END + + IDD_ADDPHONE, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 205 + TOPMARGIN, 5 + BOTTOMMARGIN, 86 + END + + IDD_INSTALLINI, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 208 + TOPMARGIN, 5 + BOTTOMMARGIN, 98 + END + + IDD_WARNINICHANGE, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 182 + TOPMARGIN, 5 + BOTTOMMARGIN, 108 + END + + IDD_INIIMPORTDONE, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 181 + TOPMARGIN, 5 + BOTTOMMARGIN, 68 + END + + IDD_NETLIBLOGOPTS, DIALOG + BEGIN + LEFTMARGIN, 6 + RIGHTMARGIN, 308 + VERTGUIDE, 14 + VERTGUIDE, 174 + VERTGUIDE, 308 + TOPMARGIN, 5 + BOTTOMMARGIN, 255 + END + + IDD_HISTORY_FIND, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 223 + TOPMARGIN, 7 + BOTTOMMARGIN, 39 + HORZGUIDE, 17 + END + + IDD_FILESEND, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 251 + VERTGUIDE, 7 + VERTGUIDE, 249 + TOPMARGIN, 5 + BOTTOMMARGIN, 172 + END + + IDD_FILERECV, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 249 + VERTGUIDE, 7 + VERTGUIDE, 249 + TOPMARGIN, 5 + BOTTOMMARGIN, 169 + END + + IDD_FILETRANSFERINFO, DIALOG + BEGIN + VERTGUIDE, 5 + VERTGUIDE, 25 + VERTGUIDE, 36 + VERTGUIDE, 120 + VERTGUIDE, 180 + VERTGUIDE, 215 + VERTGUIDE, 218 + VERTGUIDE, 235 + VERTGUIDE, 251 + BOTTOMMARGIN, 43 + HORZGUIDE, 14 + HORZGUIDE, 28 + HORZGUIDE, 42 + END + + IDD_FILEEXISTS, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 283 + TOPMARGIN, 5 + BOTTOMMARGIN, 176 + END + + IDD_URLSEND, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 210 + TOPMARGIN, 5 + BOTTOMMARGIN, 121 + END + + IDD_URLRECV, DIALOG + BEGIN + LEFTMARGIN, 5 + RIGHTMARGIN, 210 + TOPMARGIN, 5 + BOTTOMMARGIN, 135 + END + + IDD_HISTORY, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 289 + TOPMARGIN, 7 + BOTTOMMARGIN, 158 + END + + IDD_OPT_SOUND, DIALOG + BEGIN + LEFTMARGIN, 4 + RIGHTMARGIN, 281 + VERTGUIDE, 12 + VERTGUIDE, 273 + TOPMARGIN, 4 + BOTTOMMARGIN, 236 + END + + IDD_OPT_ICONS, DIALOG + BEGIN + LEFTMARGIN, 4 + RIGHTMARGIN, 253 + VERTGUIDE, 12 + VERTGUIDE, 200 + TOPMARGIN, 4 + BOTTOMMARGIN, 189 + END + + IDD_OPT_IGNORE, DIALOG + BEGIN + VERTGUIDE, 8 + VERTGUIDE, 96 + VERTGUIDE, 221 + VERTGUIDE, 305 + END + + IDD_OPT_VISIBILITY, DIALOG + BEGIN + VERTGUIDE, 8 + VERTGUIDE, 305 + END + + IDD_OPT_AWAYMSG, DIALOG + BEGIN + LEFTMARGIN, 4 + RIGHTMARGIN, 259 + TOPMARGIN, 4 + BOTTOMMARGIN, 147 + END + + IDD_ICONINDEX, DIALOG + BEGIN + LEFTMARGIN, 4 + RIGHTMARGIN, 215 + TOPMARGIN, 4 + BOTTOMMARGIN, 193 + END + + IDD_OPT_NETLIB, DIALOG + BEGIN + VERTGUIDE, 7 + VERTGUIDE, 20 + VERTGUIDE, 80 + VERTGUIDE, 166 + VERTGUIDE, 177 + VERTGUIDE, 306 + HORZGUIDE, 80 + HORZGUIDE, 113 + END + + IDD_OPT_FILETRANSFER, DIALOG + BEGIN + VERTGUIDE, 8 + VERTGUIDE, 302 + END + + IDD_PROFILE_NEW, DIALOG + BEGIN + LEFTMARGIN, 7 + TOPMARGIN, 7 + END + + IDD_OPT_PLUGINS, DIALOG + BEGIN + TOPMARGIN, 4 + END + + IDD_OPT_GENMENU, DIALOG + BEGIN + END + + IDD_UPDATE_NOTIFY, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 179 + TOPMARGIN, 7 + BOTTOMMARGIN, 83 + END + + IDD_OPT_UPDATENOTIFY, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 179 + TOPMARGIN, 7 + END + + IDD_OPT_HOTKEYS, DIALOG + BEGIN + END + + IDD_ACCMGR, DIALOG + BEGIN + VERTGUIDE, 7 + VERTGUIDE, 23 + VERTGUIDE, 28 + VERTGUIDE, 44 + VERTGUIDE, 60 + VERTGUIDE, 76 + VERTGUIDE, 81 + VERTGUIDE, 137 + VERTGUIDE, 142 + VERTGUIDE, 157 + VERTGUIDE, 343 + BOTTOMMARGIN, 238 + HORZGUIDE, 25 + HORZGUIDE, 32 + HORZGUIDE, 40 + HORZGUIDE, 45 + HORZGUIDE, 179 + HORZGUIDE, 184 + HORZGUIDE, 192 + HORZGUIDE, 197 + HORZGUIDE, 208 + HORZGUIDE, 219 + END + + IDD_WAITRESTART, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 160 + VERTGUIDE, 83 + VERTGUIDE, 160 + TOPMARGIN, 7 + BOTTOMMARGIN, 63 + HORZGUIDE, 25 + HORZGUIDE, 30 + HORZGUIDE, 44 + HORZGUIDE, 49 + END + + IDD_FTMGR, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 269 + TOPMARGIN, 7 + BOTTOMMARGIN, 248 + END + + IDD_FTPAGE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 303 + TOPMARGIN, 7 + BOTTOMMARGIN, 176 + END + + IDD_OPT_KEYWORDFILTER, DIALOG + BEGIN + LEFTMARGIN, 4 + RIGHTMARGIN, 247 + TOPMARGIN, 4 + BOTTOMMARGIN, 69 + END + + IDD_MODERNOPT_FONTS, DIALOG + BEGIN + VERTGUIDE, 10 + VERTGUIDE, 239 + VERTGUIDE, 244 + HORZGUIDE, 30 + HORZGUIDE, 45 + HORZGUIDE, 84 + HORZGUIDE, 99 + HORZGUIDE, 139 + HORZGUIDE, 154 + END + + IDD_MODERNOPT_ACCOUNTS, DIALOG + BEGIN + VERTGUIDE, 70 + VERTGUIDE, 162 + VERTGUIDE, 167 + VERTGUIDE, 182 + VERTGUIDE, 274 + HORZGUIDE, 147 + HORZGUIDE, 192 + HORZGUIDE, 196 + END + + IDD_MODERNOPT_MODULES, DIALOG + BEGIN + RIGHTMARGIN, 260 + VERTGUIDE, 60 + VERTGUIDE, 65 + END + + IDD_MODERNOPT_STATUS, DIALOG + BEGIN + VERTGUIDE, 10 + VERTGUIDE, 100 + VERTGUIDE, 105 + VERTGUIDE, 218 + BOTTOMMARGIN, 103 + HORZGUIDE, 8 + HORZGUIDE, 13 + END + + IDD_MODERNOPT_IDLE, DIALOG + BEGIN + VERTGUIDE, 10 + VERTGUIDE, 181 + HORZGUIDE, 8 + HORZGUIDE, 22 + HORZGUIDE, 34 + HORZGUIDE, 46 + END + + IDD_CHOOSE_FONT_EFFECT, DIALOG + BEGIN + HORZGUIDE, 18 + END +END +#endif // APSTUDIO_INVOKED + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include \r\n" + "#include \r\n" + "#include ""../include/statusmodes.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_MIRANDA ICON "res/miranda_logo.ico" +IDI_MIRANDAWEBSITE ICON "res/miranda_home.ico" +IDI_DETAILSLOGO ICON "res/miranda_manager.ico" +IDI_USERDETAILS ICON "res/contact_view_details.ico" +IDI_ADDCONTACT ICON "res/contact_add.ico" +IDI_RENAME ICON "res/contact_rename.ico" +IDI_DELETE ICON "res/contact_delete.ico" +IDI_GROUPSHUT ICON "res/group_closed.ico" +IDI_GROUPOPEN ICON "res/group_opened.ico" +IDI_USERONLINE ICON "res/status_user_online.ico" +IDI_ONLINE ICON "res/status_online.ico" +IDI_AWAY ICON "res/status_away.ico" +IDI_NA ICON "res/status_NA.ico" +IDI_OCCUPIED ICON "res/status_occupied.ico" +IDI_DND ICON "res/status_DND.ico" +IDI_FREE4CHAT ICON "res/status_free4chat.ico" +IDI_INVISIBLE ICON "res/status_invisible.ico" +IDI_ONTHEPHONE ICON "res/status_on_the_phone.ico" +IDI_OUTTOLUNCH ICON "res/status_out2lunch.ico" +IDI_OFFLINE ICON "res/status_offline.ico" +IDI_LOAD ICON "res/icon_connecting.ico" +IDI_TYPING ICON "res/icon_typing.ico" +IDI_FINDUSER ICON "res/icon_find_user.ico" +IDI_SEARCHALL ICON "res/icon_search_all.ico" +IDI_OPTIONS ICON "res/icon_options.ico" +IDI_ACCMGR ICON "res/icon_accmgr.ico" +IDI_HELP ICON "res/icon_help.ico" +IDI_RECVMSG ICON "res/icon_message.ico" +IDI_FILE ICON "res/icon_file.ico" +IDI_HISTORY ICON "res/icon_history.ico" +IDI_URL ICON "res/icon_url.ico" +IDI_SMS ICON "res/icon_sms.ico" +IDI_SENDEMAIL ICON "res/icon_mail.ico" +IDI_SMALLDOT ICON "res/icon_small_dot.ico" +IDI_FILLEDBLOB ICON "res/icon_auth_request.ico" +IDI_EMPTYBLOB ICON "res/icon_all.ico" +IDI_DOWNARROW ICON "res/icon_down_arrow.ico" +IDI_NOTICK ICON "res/check_off.ico" +IDI_TICK ICON "res/check_on.ico" +IDI_UNICODE ICON "res/icon_unicode.ico" +IDI_ANSI ICON "res/icon_ansi.ico" +IDI_LOADED ICON "res/icon_loaded.ico" +IDI_NOTLOADED ICON "res/icon_notloaded.ico" +IDI_BLANK ICON "res/_blank.ico" +IDI_UNDO ICON "res/icon_undo.ico" +IDI_WINDOW ICON "res/icon_window.ico" +IDI_WINDOWS ICON "res/icon_windows.ico" +IDI_JOINCHAT ICON "res/chat_join.ico" +IDI_LEAVECHAT ICON "res/chat_leave.ico" +IDI_STATUS_LOCKED ICON "res/status_locked.ico" +IDI_SHOWHIDE ICON "res/Icon_show_hide.ico" +IDI_EXIT ICON "res/Icon_exit.ico" +IDI_MOVETOGROUP ICON "res/contact_groups.ico" +IDI_ON ICON "res\\On.ico" +IDI_OFF ICON "res\\Off.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Cursor +// + +IDC_HYPERLINKHAND CURSOR "res/cursor_hyperlink.cur" +IDC_DROP CURSOR "res/cursor_drag_copy.cur" +IDC_DROPUSER CURSOR "res/cursor_drop_user.cur" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_CLISTMENU MENU +BEGIN + MENUITEM SEPARATOR +END + +IDR_CONTEXT MENU +BEGIN + POPUP "Tray" + BEGIN + MENUITEM "&Hide/Show", ID_TRAY_HIDE + MENUITEM SEPARATOR + MENUITEM "E&xit", ID_TRAY_EXIT + END + POPUP "Nowhere" + BEGIN + MENUITEM "&New Group", POPUP_NEWGROUP + MENUITEM SEPARATOR + MENUITEM "&Hide Offline Users", POPUP_HIDEOFFLINE + MENUITEM "Hide &Offline Users out here", POPUP_HIDEOFFLINEROOT + MENUITEM "Hide &Empty Groups", POPUP_HIDEEMPTYGROUPS + MENUITEM "Disable &Groups", POPUP_DISABLEGROUPS + MENUITEM SEPARATOR + MENUITEM "Hide Miranda", POPUP_HIDEMIRANDA + END + POPUP "Group" + BEGIN + MENUITEM "&New Subgroup", POPUP_NEWSUBGROUP + MENUITEM "&Hide Offline Users in here", POPUP_GROUPHIDEOFFLINE + MENUITEM SEPARATOR + MENUITEM "&Rename Group", POPUP_RENAMEGROUP + MENUITEM "&Delete Group", POPUP_DELETEGROUP + END + POPUP "IconOptions" + BEGIN + MENUITEM "&Reset to default", ID_RESET + END + POPUP "find/add" + BEGIN + MENUITEM "&Add to List", IDC_ADD + MENUITEM SEPARATOR + MENUITEM "User &Details", IDC_DETAILS + MENUITEM "Send &Message", IDC_SENDMESSAGE + END + POPUP "Log" + BEGIN + MENUITEM "&Copy", IDM_COPY + MENUITEM "Co&py All", IDM_COPYALL + MENUITEM "Select &All", IDM_SELECTALL + MENUITEM SEPARATOR + MENUITEM "C&lear Log", IDM_CLEAR + END + POPUP "LogLink" + BEGIN + MENUITEM "Open in &new window", IDM_OPENNEW + MENUITEM "&Open in existing window", IDM_OPENEXISTING + MENUITEM "&Copy link", IDM_COPYLINK + END +END + +IDR_ICOLIB_CONTEXT MENU +BEGIN + POPUP "IconOptions" + BEGIN + MENUITEM "Cancel Change", ID_CANCELCHANGE + MENUITEM "&Reset To Default", ID_RESET + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// TEXT +// + +IDR_CREDITS TEXT "../docs/contributors.txt" + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_SORTCOLUP BITMAP "res/arrow_sort_column_up.bmp" +IDB_SORTCOLDOWN BITMAP "res/arrow_sort_column_down.bmp" +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Speak/Speak/statusmodes.h b/Speak/Speak/statusmodes.h new file mode 100644 index 0000000..da973ab --- /dev/null +++ b/Speak/Speak/statusmodes.h @@ -0,0 +1,52 @@ +/* + +Miranda IM: the free IM client for Microsoft* Windows* + +Copyright 2000-2008 Miranda ICQ/IM project, +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifndef STATUSMODES_H__ +#define STATUSMODES_H__ 1 + +//add 1 to ID_STATUS_CONNECTING to mark retries (v0.1.0.1+) +//eg ID_STATUS_CONNECTING+2 is the third connection attempt, or the second retry +#define ID_STATUS_CONNECTING 1 + +//max retries is just a marker so that the clist knows what numbers represent +//retries. It does not set any kind of limit on the number of retries you can +//and/or should do. +#define MAX_CONNECT_RETRIES 10000 + +#define ID_STATUS_OFFLINE 40071 +#define ID_STATUS_ONLINE 40072 +#define ID_STATUS_AWAY 40073 +#define ID_STATUS_DND 40074 +#define ID_STATUS_NA 40075 +#define ID_STATUS_OCCUPIED 40076 +#define ID_STATUS_FREECHAT 40077 +#define ID_STATUS_INVISIBLE 40078 +#define ID_STATUS_ONTHEPHONE 40079 +#define ID_STATUS_OUTTOLUNCH 40080 +#define ID_STATUS_IDLE 40081 /* do not use as a status */ + +#define MAX_STATUS_COUNT (ID_STATUS_OUTTOLUNCH-ID_STATUS_OFFLINE+1) + +#endif // STATUSMODES_H__ + +