зеркало из https://github.com/mozilla/gecko-dev.git
Fix few problems: Don't autocomplete after user press backspace or delete. If resutl contains only one match and default item is 0, don't show the popup menu. If the default item is -1, don't touch at the user input. Correctly detect when popup menu is open.
This commit is contained in:
Родитель
1038627ac0
Коммит
f838d96d2f
|
@ -12,7 +12,7 @@
|
||||||
<xul:popupset ignorekeys="true"
|
<xul:popupset ignorekeys="true"
|
||||||
oncommand="var me = this.parentNode.parentNode; me.privatefunc.onMenuCommand(me, this);"
|
oncommand="var me = this.parentNode.parentNode; me.privatefunc.onMenuCommand(me, this);"
|
||||||
>
|
>
|
||||||
<xul:popup id="ac_menupopup">
|
<xul:popup id="ac_menupopup" oncreate="this.parentNode.parentNode.parentNode.menuOpen='true'" ondestroy="this.parentNode.parentNode.parentNode.menuOpen='false'">
|
||||||
</xul:popup>
|
</xul:popup>
|
||||||
</xul:popupset>
|
</xul:popupset>
|
||||||
</xul:box>
|
</xul:box>
|
||||||
|
@ -89,31 +89,35 @@
|
||||||
result.defaultItemIndex = 0;
|
result.defaultItemIndex = 0;
|
||||||
|
|
||||||
var inputElement = me.anonymousContent[0].firstChild;
|
var inputElement = me.anonymousContent[0].firstChild;
|
||||||
var item = result.items.QueryElementAt(result.defaultItemIndex, Components.interfaces.nsIAutoCompleteItem);
|
|
||||||
|
|
||||||
//Time to build the new edit field value
|
//Time to build the new edit field value
|
||||||
//First, check if the search string correspond to the current value of the field, else ignore it
|
//First, check if the search string correspond to the current value of the field, else ignore it
|
||||||
if (result.searchString != inputElement.value)
|
if (result.searchString != inputElement.value)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var match = item.value.toLowerCase();
|
var item = null;
|
||||||
var entry = inputElement.value.toLowerCase();
|
if (result.defaultItemIndex != -1)
|
||||||
|
{
|
||||||
|
item = result.items.QueryElementAt(result.defaultItemIndex, Components.interfaces.nsIAutoCompleteItem);
|
||||||
|
var match = item.value.toLowerCase();
|
||||||
|
var entry = inputElement.value.toLowerCase();
|
||||||
|
|
||||||
if (entry != match)
|
if (entry != match)
|
||||||
{
|
{
|
||||||
if (match.substring(0, entry.length) == entry)
|
if (match.substring(0, entry.length) == entry)
|
||||||
{
|
{
|
||||||
inputElement.value = inputElement.value + item.value.substring(entry.length, match.length);
|
inputElement.value = inputElement.value + item.value.substring(entry.length, match.length);
|
||||||
inputElement.setSelectionRange(entry.length, match.length);
|
inputElement.setSelectionRange(entry.length, match.length);
|
||||||
me.noDirectMatch = false;
|
me.noDirectMatch = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
inputElement.value = inputElement.value + " >> " + item.value;
|
inputElement.value = inputElement.value + " >> " + item.value;
|
||||||
inputElement.setSelectionRange(entry.length, inputElement.value.length);
|
inputElement.setSelectionRange(entry.length, inputElement.value.length);
|
||||||
me.noDirectMatch = true;
|
me.noDirectMatch = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Now, build the popup content
|
//Now, build the popup content
|
||||||
if (me.displayMenu == "false")
|
if (me.displayMenu == "false")
|
||||||
|
@ -131,11 +135,14 @@
|
||||||
// dump(" match=" + item.value + "\n");
|
// dump(" match=" + item.value + "\n");
|
||||||
}
|
}
|
||||||
popupset.replaceChild(popupElement, popupset.firstChild);
|
popupset.replaceChild(popupElement, popupset.firstChild);
|
||||||
|
if (result.defaultItemIndex != -1)
|
||||||
|
{
|
||||||
//TODO: Select the default item
|
//TODO: Select the default item
|
||||||
// popupset.selectedItem = result.defaultItemIndex;
|
// popupset.selectedItem = result.defaultItemIndex;
|
||||||
|
}
|
||||||
me.privatefunc.selectedItemIndex = result.defaultItemIndex;
|
me.privatefunc.selectedItemIndex = result.defaultItemIndex;
|
||||||
popupset.firstChild.openPopup(me.anonymousContent[0].firstChild, -1, -1, "popup", "bottomleft", "topleft");
|
if (result.defaultItemIndex != 0 || result.items.Count() != 1)
|
||||||
dump("OPEN POPUP\n");
|
popupset.firstChild.openPopup(me.anonymousContent[0].firstChild, -1, -1, "popup", "bottomleft", "topleft");
|
||||||
},
|
},
|
||||||
|
|
||||||
param: this
|
param: this
|
||||||
|
@ -219,11 +226,8 @@ dump("OPEN POPUP\n");
|
||||||
|
|
||||||
closePopupMenu: function(me) {
|
closePopupMenu: function(me) {
|
||||||
popup = document.getElementById("ac_menupopup");
|
popup = document.getElementById("ac_menupopup");
|
||||||
if (popup /*&& popup.getAttribute("menuactive") == "true"*/) //TODO: need to now if menu is open or not
|
if (popup && me.menuOpen == "true")
|
||||||
{
|
|
||||||
dump("CLOSE POPUP\n");
|
|
||||||
popup.closePopup();
|
popup.closePopup();
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
cleanupInputField: function(me) {
|
cleanupInputField: function(me) {
|
||||||
|
@ -274,19 +278,6 @@ dump("CLOSE POPUP\n");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
processKeyUp: function(me, event) {
|
|
||||||
if (me.disableAutocomplete == "true")
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (event.keyCode)
|
|
||||||
{
|
|
||||||
case 8: /*vk_back*/
|
|
||||||
case 46: /*vk_delete*/
|
|
||||||
me.privatefunc.closePopupMenu(me);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
processKeyPress: function(me, event) {
|
processKeyPress: function(me, event) {
|
||||||
if (me.disableAutocomplete == "true")
|
if (me.disableAutocomplete == "true")
|
||||||
return;
|
return;
|
||||||
|
@ -299,12 +290,16 @@ dump("CLOSE POPUP\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
var popup = document.getElementById("ac_menupopup");
|
var popup = document.getElementById("ac_menupopup");
|
||||||
//TODO: need to now if menu is open or not
|
if (popup && me.menuOpen != "true")
|
||||||
// if (popup && popup.getAttribute("menuactive") != "true")
|
popup = null;
|
||||||
// popup = null;
|
|
||||||
|
|
||||||
switch (event.keyCode)
|
switch (event.keyCode)
|
||||||
{
|
{
|
||||||
|
case 8: /*vk_back*/
|
||||||
|
case 46: /*vk_delete*/
|
||||||
|
me.privatefunc.closePopupMenu(me);
|
||||||
|
return;
|
||||||
|
|
||||||
case 13 /*vk_return*/:
|
case 13 /*vk_return*/:
|
||||||
me.privatefunc.finishAutoComplete(me, event);
|
me.privatefunc.finishAutoComplete(me, event);
|
||||||
return;
|
return;
|
||||||
|
@ -320,6 +315,12 @@ dump("CLOSE POPUP\n");
|
||||||
|
|
||||||
case 37 /*vk_left*/:
|
case 37 /*vk_left*/:
|
||||||
case 39 /*vk_right*/:
|
case 39 /*vk_right*/:
|
||||||
|
if (popup)
|
||||||
|
{
|
||||||
|
me.privatefunc.closePopupMenu(me);
|
||||||
|
event.preventDefault();
|
||||||
|
event.preventBubble();
|
||||||
|
}
|
||||||
me.privatefunc.cleanupInputField(me);
|
me.privatefunc.cleanupInputField(me);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -349,7 +350,6 @@ dump("CLOSE POPUP\n");
|
||||||
<handler type="click" value="this.privatefunc.cleanupInputField(this); //TODO: try to catch menu click here"/>
|
<handler type="click" value="this.privatefunc.cleanupInputField(this); //TODO: try to catch menu click here"/>
|
||||||
<handler type="dblclick" value="this.privatefunc.cleanupInputField(this);"/>
|
<handler type="dblclick" value="this.privatefunc.cleanupInputField(this);"/>
|
||||||
<handler type="keypress" value="this.privatefunc.processKeyPress(this, event);"/>
|
<handler type="keypress" value="this.privatefunc.processKeyPress(this, event);"/>
|
||||||
<handler type="keyup" value="this.privatefunc.processKeyUp(this, event);"/>
|
|
||||||
<handler type="focus" value="dump('FOCUS\n'); this.needToAutocomplete = false;"/>
|
<handler type="focus" value="dump('FOCUS\n'); this.needToAutocomplete = false;"/>
|
||||||
<handler type="blur" value="
|
<handler type="blur" value="
|
||||||
dump('BLURR\n');
|
dump('BLURR\n');
|
||||||
|
|
Загрузка…
Ссылка в новой задаче