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:
ducarroz%netscape.com 2000-05-12 05:40:20 +00:00
Родитель 1038627ac0
Коммит f838d96d2f
1 изменённых файлов: 42 добавлений и 42 удалений

Просмотреть файл

@ -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');