/// <summary> /// Sets the data to _dataContent, for all supported formats. /// </summary> /// <param name="Data">Data received in Drop event</param> public void SetDroppedData(IDataObject Data) { ClipFormats clipFormat = ClipFormats.FORMAT_UNKNOWN; String tmpData; Clean(); // Clear the previously dropped data. foreach (String format in Data.GetFormats()) { tmpData = String.Empty; clipFormat = GetClipFormatFromFormat(format); if (clipFormat != ClipFormats.FORMAT_UNKNOWN) { if (format.Equals(DataFormats.FileDrop)) { if (Data.GetData(format) != null) { String[] files = (String[])Data.GetData(format); tmpData = String.Join("|", files); } } else { tmpData = Data.GetData(format).ToString(); } // Update data to Dropped Data. if (tmpData.Length != 0) { GuiUtils.DroppedData.SetData(tmpData, format); } } } }
/// <summary> /// check Magic specific format is supported or not. /// </summary> /// <param name = "format"></param> /// <returns></returns> public static bool IsFormatSupported(ClipFormats format) { if (GetFormatFromClipFormat(format) != null) { return(true); } return(false); }
/// <summary> /// Adds text. /// Returns this. /// </summary> /// <param name="text">Text.</param> /// <param name="format"> /// Clipboard format id. Default: <see cref="ClipFormats.Text"/> (CF_UNICODETEXT). /// Text encoding (UTF-16, ANSI, etc) depends on format; default UTF-16. See <see cref="ClipFormats.Register"/>. /// </param> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentException">Invalid format.</exception> /// <exception cref="Exception">Exceptions of <see cref="Encoding.GetBytes(string)"/>, which is called if encoding is not UTF-16.</exception> public AClipboardData AddText(string text, int format = ClipFormats.Text) { Encoding enc = ClipFormats.GetTextEncoding_(format, out bool unknown); if (enc == null) { return(_Add(text, format == 0 ? Api.CF_UNICODETEXT : format)); } return(_Add(enc.GetBytes(text + "\0"), format)); }
/// <summary> /// Translate the standard clipboard format into magic clip format. /// It also check whether the UserFormat is supported or not. /// </summary> /// <param name = "format">Standard format</param> /// <returns>ClipFormat corrosponds to Standard format</returns> internal static ClipFormats GetClipFormatFromFormat(String format) { ClipFormats clipFormat = ClipFormats.FORMAT_UNKNOWN; if (format == DataFormats.UnicodeText) { clipFormat = ClipFormats.FORMAT_UNICODE_TEXT; } else if (format == DataFormats.Text) { clipFormat = ClipFormats.FORMAT_TEXT; } else if (format == DataFormats.OemText) { clipFormat = ClipFormats.FORMAT_OEM_TEXT; } else if (format == DataFormats.Rtf) { clipFormat = ClipFormats.FORMAT_RICH_TEXT; } else if (format == DataFormats.Html) { clipFormat = ClipFormats.FORMAT_HTML_TEXT; } else if (format == DataFormats.FileDrop) { clipFormat = ClipFormats.FORMAT_DROP_FILES; } else if (format == "HyperLink") { clipFormat = ClipFormats.FORMAT_HYPERLINK_TEXT; } else { // Format can be a User-defined format. // Get Environment to check whether a format is a user-defined format or not. String usrFormat = Events.GetDropUserFormats(); if (usrFormat.Length > 0) { String[] userFormats = usrFormat.Split(','); foreach (String userStr in userFormats) { if (format == userStr) { clipFormat = ClipFormats.FORMAT_USER; break; } } } } return(clipFormat); }
/// <summary> /// Check whether format is available in dropped data or not. /// </summary> /// <param name = "clipFormat"></param> /// <param name="userFormatStr">if userFormat is specified, then use it as a format string</param> /// <returns></returns> public bool CheckDropFormatPresent(ClipFormats clipFormat, String userFormatStr) { bool DataPresent = false; String format = GetFormatFromClipFormat(clipFormat); if (clipFormat == ClipFormats.FORMAT_USER && !String.IsNullOrEmpty(userFormatStr)) { format = userFormatStr; } if (_dataContent != null && _dataContent.GetDataPresent(format)) { DataPresent = true; } return(DataPresent); }
/// <summary> /// Returns the string format for a ClipFormat. /// </summary> /// <param name = "format">Magic specific format</param> /// <returns></returns> internal static String GetFormatFromClipFormat(ClipFormats format) { String Format = null; switch (format) { case ClipFormats.FORMAT_UNICODE_TEXT: Format = DataFormats.UnicodeText; break; case ClipFormats.FORMAT_TEXT: Format = DataFormats.Text; break; case ClipFormats.FORMAT_OEM_TEXT: Format = DataFormats.OemText; break; case ClipFormats.FORMAT_RICH_TEXT: Format = DataFormats.Rtf; break; case ClipFormats.FORMAT_HTML_TEXT: Format = DataFormats.Html; break; case ClipFormats.FORMAT_HYPERLINK_TEXT: Format = "HyperLink"; break; case ClipFormats.FORMAT_DROP_FILES: Format = DataFormats.FileDrop; break; case ClipFormats.FORMAT_USER: Format = "UserFormat"; break; } return(Format); }
///<summary> /// Get the Data according to Format. ///</summary> ///<param name = "clipFormat">Magic specific format</param> /// <param name="userFormatStr">if userFormat is specified, then use it as a format string</param> ///<returns></returns> public String GetData(ClipFormats clipFormat, String userFormatStr) { String format = null; String strData = null; if (_dataContent == null) { return(""); } format = GetFormatFromClipFormat(clipFormat); if (clipFormat == ClipFormats.FORMAT_USER && !String.IsNullOrEmpty(userFormatStr)) { format = userFormatStr; } if (format != null && _dataContent.GetDataPresent(format)) { strData = _dataContent.GetData(format).ToString(); } return(strData); }
/// <summary> /// Set the data to be dragged to DataObject with its format. /// </summary> /// <param name="Data"> data to be set for drag</param> /// <param name="Format"> magic format of the data </param> /// <param name="userFormatStr">if userFormat is specified, then use it as a format string</param> internal void SetData(String Data, ClipFormats clipFormat, String userFormatStr) { if (_DataContent == null) { _DataContent = new DataObject(); } String formatStr = DroppedData.GetFormatFromClipFormat(clipFormat); if (clipFormat == ClipFormats.FORMAT_USER && !String.IsNullOrEmpty(userFormatStr)) { formatStr = userFormatStr; } if (clipFormat == ClipFormats.FORMAT_DROP_FILES) { String[] files = Data.Split(','); GuiUtils.DraggedData._DataContent.SetData(formatStr, files); } else { GuiUtils.DraggedData._DataContent.SetData(formatStr, Data); } }
private static extern IntPtr DdeClientTransaction(byte[] Bytes, int DataLen, IntPtr hConv, IntPtr ItemNameStr, ClipFormats Format, DDETransactionType Type, int TimeOut, out int Result);
/// <summary> /// Gets clipboard text without open/close. /// If format is 0, tries CF_UNICODETEXT and CF_HDROP. /// </summary> internal static unsafe string GetText_(int format) { IntPtr h = default; if (format == 0) { h = Api.GetClipboardData(Api.CF_UNICODETEXT); if (h == default) { format = Api.CF_HDROP; } } if (format == 0) { format = Api.CF_UNICODETEXT; } else { h = Api.GetClipboardData(format); if (h == default) { return(null); } if (format == Api.CF_HDROP) { return(string.Join("\r\n", _HdropToFiles(h))); } } using (new _GlobalLock(h, out var mem, out int len)) { if (mem == default) { return(null); } var s = (char *)mem; var b = (byte *)s; Encoding enc = ClipFormats.GetTextEncoding_(format, out bool unknown); if (unknown) { if ((len & 1) != 0 || Util.BytePtr_.Length(b, len) > len - 2) { enc = Encoding.Default; //autodetect } } if (enc == null) { len /= 2; while (len > 0 && s[len - 1] == '\0') { len--; } return(new string(s, 0, len)); } else { //most apps add single '\0' at the end. Some don't add. Some add many, eg Dreamweaver. Trim all. int charLen = enc.GetByteCount("\0"); switch (charLen) { case 1: while (len > 0 && b[len - 1] == '\0') { len--; } break; case 2: for (int k = len / 2; k > 0 && s[k - 1] == '\0'; k--) { len -= 2; } break; case 4: var ip = (int *)s; for (int k = len / 4; k > 0 && ip[k - 1] == '\0'; k--) { len -= 4; } break; } return(enc.GetString(b, len)); //note: don't parse HTML format here. Let caller use GetHtml or parse itself. } } }