From 302bf1b523012e11b60425d6eee1221ebc2724eb Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Sun, 3 Nov 2019 00:17:46 -0400 Subject: Issue #1258 - Part 1: Import mailnews, ldap, and mork from comm-esr52.9.1 --- mailnews/db/gloda/content/glodacomplete.css | 94 ++++ mailnews/db/gloda/content/glodacomplete.xml | 644 +++++++++++++++++++++++ mailnews/db/gloda/content/overlay.js | 6 + mailnews/db/gloda/content/thunderbirdOverlay.xul | 9 + 4 files changed, 753 insertions(+) create mode 100644 mailnews/db/gloda/content/glodacomplete.css create mode 100644 mailnews/db/gloda/content/glodacomplete.xml create mode 100644 mailnews/db/gloda/content/overlay.js create mode 100644 mailnews/db/gloda/content/thunderbirdOverlay.xul (limited to 'mailnews/db/gloda/content') diff --git a/mailnews/db/gloda/content/glodacomplete.css b/mailnews/db/gloda/content/glodacomplete.css new file mode 100644 index 000000000..4e52bff21 --- /dev/null +++ b/mailnews/db/gloda/content/glodacomplete.css @@ -0,0 +1,94 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +textbox[type="glodacomplete"] { + -moz-binding: url("chrome://global/content/bindings/autocomplete.xml#autocomplete"); +} + +panel[type="glodacomplete-richlistbox"] { + -moz-binding: url("chrome://gloda/content/glodacomplete.xml#glodacomplete-rich-result-popup"); +} + +.autocomplete-richlistbox { + -moz-binding: url("chrome://global/content/bindings/autocomplete.xml#autocomplete-richlistbox"); + -moz-user-focus: ignore; + -moz-appearance: none; +} + +.autocomplete-richlistbox > scrollbox { + overflow-x: hidden !important; +} + +.explanation, .gloda-single-identity { + margin-inline-start: 1em; + margin-top: 2px; + margin-bottom: 2px; +} + +.ac-comment { + font-size: 1.1em; + margin-inline-start: 0; +} + +.ac-url-text { + color: -moz-nativehyperlinktext; + font-size: 0.95em; +} + +span.ac-emphasize-text { + font-weight: bold; +} + +.ac-url-text[selected="true"] { + color: inherit !important; +} + +.gloda-single-identity[selected="true"] .ac-url{ + color: white; +} + +.parameters { + font-style: italic; + margin-inline-start: 1em; +} + +.autocomplete-richlistitem[type="gloda-single-tag"] { + -moz-binding: url("chrome://gloda/content/glodacomplete.xml#gloda-single-tag-item"); + overflow: -moz-hidden-unscrollable; +} + +.autocomplete-richlistitem[type="gloda-single-identity"] { + -moz-binding: url("chrome://gloda/content/glodacomplete.xml#gloda-single-identity-item"); + -moz-box-orient: vertical; + overflow: -moz-hidden-unscrollable; +} + +.autocomplete-richlistitem[type="gloda-fulltext-single"] { + -moz-binding: url("chrome://gloda/content/glodacomplete.xml#gloda-fulltext-single-item"); + overflow: -moz-hidden-unscrollable; +} + +.autocomplete-richlistitem[type="gloda-fulltext-any"] { + -moz-binding: url("chrome://gloda/content/glodacomplete.xml#gloda-fulltext-any-item"); + overflow: -moz-hidden-unscrollable; +} + +.autocomplete-richlistitem[type="gloda-fulltext-all"] { + -moz-binding: url("chrome://gloda/content/glodacomplete.xml#gloda-fulltext-all-item"); + overflow: -moz-hidden-unscrollable; +} + +richlistitem[type="gloda-contact-chunk"] { + -moz-binding: url("chrome://gloda/content/glodacomplete.xml#gloda-contact-chunk"); + -moz-box-orient: vertical; + overflow: -moz-hidden-unscrollable; +} + +.autocomplete-richlistitem[type="gloda-multi"] { + -moz-binding: url("chrome://gloda/content/glodacomplete.xml#gloda-multi-item"); + -moz-box-orient: vertical; + overflow: -moz-hidden-unscrollable; +} + +/* .autocomplete-history-dropmarker wants to be optional, but we don't care */ \ No newline at end of file diff --git a/mailnews/db/gloda/content/glodacomplete.xml b/mailnews/db/gloda/content/glodacomplete.xml new file mode 100644 index 000000000..6c6b2f59d --- /dev/null +++ b/mailnews/db/gloda/content/glodacomplete.xml @@ -0,0 +1,644 @@ + + + + + + + + + + + = this._matchCount) + return; + + var existingItemsCount = this.richlistbox.childNodes.length; + var item; + + // trim the leading/trailing whitespace + var trimmedSearchString = controller.searchString.trim(); + + // Unescape the URI spec for showing as an entry in the popup + let url = Components.classes["@mozilla.org/intl/texttosuburi;1"]. + getService(Components.interfaces.nsITextToSubURI). + unEscapeURIForUI("UTF-8", controller.getValueAt(this._currentIndex)); + + // Unlike our superclass, we create nodes every time because we have + // heterogeneous results and we cannot rely on the XBL bindings to + // to change fast enough. + item = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "richlistitem"); + + var glodaCompleter = Components. + classes["@mozilla.org/autocomplete/search;1?name=gloda"]. + getService(). //Components.interfaces.nsIAutoCompleteSearch) + wrappedJSObject; + var result = glodaCompleter.curResult; + + // set these attributes before we set the class + // so that we can use them from the contructor + var row = result.getObjectAt(this._currentIndex); + var obj = row.item; + item.setAttribute("text", trimmedSearchString); + item.setAttribute("type", result.getStyleAt(this._currentIndex)); + + item.row = row; + + // set the class at the end so we can use the attributes + // in the xbl constructor + item.className = "autocomplete-richlistitem"; + this.richlistbox.appendChild(item); + + this._currentIndex++; + } + + // yield after each batch of items so that typing the url bar is responsive + setTimeout(() => this._appendCurrentResult(), 0); + ]]> + + + + + this.adjustHeight(), 0); + + // remove all child nodes because we never want to reuse them. + while (this.richlistbox.hasChildNodes()) + this.richlistbox.lastChild.remove(); + + this._currentIndex = 0; + this._appendCurrentResult(); + ]]> + + + + + + + + + null + + + + + + + + + + + + = 0) { + // Start the next search from where this one finished + startIndex = matchIndex + searchLen; + regions.push([matchIndex, startIndex]); + } + } + + // Sort the regions by start position then end position + regions = regions.sort(function(a, b) { + let start = a[0] - b[0]; + return (start == 0) ? a[1] - b[1] : start; + }); + + // Generate the boundary indices from each region + let start = 0; + let end = 0; + let boundaries = []; + let len = regions.length; + for (let i = 0; i < len; i++) { + // We have a new boundary if the start of the next is past the end + let region = regions[i]; + if (region[0] > end) { + // First index is the beginning of match + boundaries.push(start); + // Second index is the beginning of non-match + boundaries.push(end); + + // Track the new region now that we've stored the previous one + start = region[0]; + } + + // Push back the end index for the current or new region + end = Math.max(end, region[1]); + } + + // Add the last region + boundaries.push(start); + boundaries.push(end); + + // Put on the end boundary if necessary + if (end < aText.length) + boundaries.push(aText.length); + + // Skip the first item because it's always 0 + return boundaries.slice(1); + ]]> + + + + + + + + + + + + + + = 0; ) { + let charCode = aText.charCodeAt(i); + // Arabic, Syriac, Indic languages are likely to have ligatures + // that are broken when using the main emphasis styling + if (0x0600 <= charCode && charCode <= 0x109F) + return true; + } + + return false; + ]]> + + + + + + + + + + + + + + + + 0) { + // Subtract a little less to account for subpixel rounding + widthDiff -= childWidth - .5; + + // Add to the tooltip if it's not hidden and has text + let childText = children[i].textContent; + if (childText) + tooltip.push(childText); + } + } + + // If the children take up more space than the parent.. overflow! + if (widthDiff < 0) { + // Re-show the ellipsis now that we know it's needed + aEllipsis.hidden = false; + + // Separate text components with a ndash -- + aParentBox.tooltipText = tooltip.join(" \u2013 "); + } + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + var node = document.createElementNS( + "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", + "richlistitem"); + + node.obj = aObj; + node.setAttribute("type", + "gloda-" + this.row.nounDef.name + "-chunk"); + + this._identityHolder.appendChild(node); + + + + + + + + + + + + + diff --git a/mailnews/db/gloda/content/overlay.js b/mailnews/db/gloda/content/overlay.js new file mode 100644 index 000000000..a4220be90 --- /dev/null +++ b/mailnews/db/gloda/content/overlay.js @@ -0,0 +1,6 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// get the core +Components.utils.import("resource:///modules/gloda/public.js"); diff --git a/mailnews/db/gloda/content/thunderbirdOverlay.xul b/mailnews/db/gloda/content/thunderbirdOverlay.xul new file mode 100644 index 000000000..1f2d65a30 --- /dev/null +++ b/mailnews/db/gloda/content/thunderbirdOverlay.xul @@ -0,0 +1,9 @@ + + + + +