Prompt service: Difference between revisions

From MozillaZine Knowledge Base
Jump to navigationJump to search
m (bug fix in confirmEx() code)
Line 74: Line 74:
  return check.value;
  return check.value;
  return button;
  return button;
ConfirmEx is designed to be customizable so you can make your own messages. You can have upto 3 buttons with a variety of special values (that depend on the system language) and string values and a checkbox if you want to. If you don't want the checkbox put null in the last two parameters. Flag is an integer that is the sum of some constants. Below is a table that explains how it is done:
ConfirmEx is designed to be customizable so you can make your own messages. You can have upto 3 buttons with a variety of special values (that depend on the system language) and string values and a checkbox if you want to. If you don't want the checkbox put null in the eighth (second to last) parameter. Flag is an integer that is the sum of some constants. Below is a table that explains how it is done:
{| border=1 cellspacing=0
{| border=1 cellspacing=0
!  
!  

Revision as of 18:56, 10 April 2005

Prompt Tutorial

Adding message boxes to extensions - 14/3-2005

You may think this is a stupid idea to write about since there are three simple functions that will let you post messages, prompt and confirm in javascript. The problem is that from Firefox 1.0.1 these functions are depreciated and won't work in later versions. Well, alert() will work but prompt and confirm will return an error. And they are also very simple functions that can't be customized enough.

nsIPromptService

nsIPromptService is an XPCOM Interface which means that you can only use it in javascript handled by mozilla. It will let you use special functions especially for mozilla software and there are lots of useful interfaces that you can use in extensions. nsIPromptService has 9 functions and a few constants that are important to understand. I will explain some of these functions but you wil get code snippets for all of them. You can find more about the prompt functions here.

Using nsIPromptService

//netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);

This will create a prompt object which you can use to show messages. As you can see I have commmented out a function. If you put this in your code you will be allowed to call components and use their special functions outside of mozilla. That is, if your javascript is not part of an extension or the mozilla (firefox, thunderbird or suite) source code, you will have to include it. Don't include it for extensions.

prompts is the instance we will use to call the functions.

alert()

prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
prompts.alert(window, 'title','Text');

This is the simplest function and it will simply show a message box with a title and a message.

alertCheck()

prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
check = {value:false};
prompts.alertCheck(window, 'title', 'Text', 'Check?', check);
return check.value;

This function will popup a message box with a checkbox. The checkbox can be a 'Do not show this message again' option or something simelar. Notice how we get the result of the checkbox. The function will change the value of the check object, so to get the result we return check.value.

confirm()

prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
okorcancel = prompts.confirm(window, 'title', 'Text');
return okorcancel;

Confirm is also simple. You can put it straight into an if sentence if you are not saving the answer for later. Below is a confirm message with a checkbox. It is just as straight forward as the confirm and alertCheck so it shouldn't be a problem.

prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
check = {value:false};
okorcancel = prompts.confirmCheck(window, 'title', 'Text', 'Check?', check);
return check.value;
return okorcancel;

prompt()

prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
input = {value:"default"};
check = {value:false};
okorcancel = prompts.prompt(window, 'title', 'Text', input, 'Check?', check);
return input.value;
return check.value;
return okorcancel;

Prompt can be very important and useful in lots of cases, at it accepts user input. Instead of making an xul dialog or adding more textboxes you can simply call a prompt function. As you can see the first few arguments are the same as the others but it has an extra object. This object is the default value before the function is called and the new value after the function has been called. Below are other versions of prompt, promptPassword() with a password textbox and promptUsernameAndPassword which has a username and password field.

//promptPassword
prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
input = {value:"password"};
check = {value:false};
okorcancel = prompts.promptPassword(window, 'title', 'Text', input, 'Check?', check);
return input.value;
return check.value;
return okorcancel;

//promptUsernameAndPassword
prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
username = {value:"ihoss"};
password = {value:"password"};
check = {value:false};
okorcancel = prompts.promptUsernameAndPassword(window, 'title', 'Text', username, password, 'Check?', check);
return username.value;
return password.value;
return check.value;
return okorcancel;

confirmEx()

prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
check = {value:false};
flag = 0;
button = prompts.confirmEx(window, 'title', 'Text', flag, 'Button_0', 'Button_1', 'Button_2', 'Check?', check);
return check.value;
return button;

ConfirmEx is designed to be customizable so you can make your own messages. You can have upto 3 buttons with a variety of special values (that depend on the system language) and string values and a checkbox if you want to. If you don't want the checkbox put null in the eighth (second to last) parameter. Flag is an integer that is the sum of some constants. Below is a table that explains how it is done:

BUTTON_POS_0

1

BUTTON_POS_1

256

BUTTON_POS_2

65536

BUTTON_TITLE_OK

1

1*1 256*1 65536*1
BUTTON_TITLE_CANCEL

2

1*2 256*2 65536*2
BUTTON_TITLE_YES

3

1*3 256*1 65536*3
BUTTON_TITLE_NO

4

1*4 256*4 65536*4
BUTTON_TITLE_SAVE

5

1*5 256*5 65536*5
BUTTON_TITLE_DONT_SAVE

6

1*6 256*6 65536*6
BUTTON_TITLE_REVERT

7

1*7 256*7 65536*7
BUTTON_TITLE_IS_STRING

127

1*127 256*127 65536*127
STD_OK_CANCEL_BUTTONS

513

1*513 256*513 65536*513

This simply means that if you want Button_1 to be YES then you take 256*3. If you want Button_0 to be SAVE, Button_1 to be DONT SAVE and Button_2 to have a string value then you set flag to be 1*5+256*6+65536*127. The third button will now get the string value of Button_2 in the function.

select()

prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
list = new Array("ihoss","internet","firefox","xul","stupid entry","out of ideas");
selected = {value:2};
okorcancel = prompts.select(window, 'title', 'Text', 6, list, selected);
return selected.value;
return okorcancel;

select will give you a listbox with options and you can select one of the values. Selected will get the index of the item you selected and you can get its calue with list[selected.value]; The 4th parameter is the number of entries you want. This integer has to be less than or equal to the length of the array. If it is less then only the items up to that index will be in the listbox.

Not working?

Ok, so you have added everything and it still does not work?

  • It can not be used on a web page, only as a local file or in an extension
  • Make sure you have everything as the right data type.

Finaly

That's it. Add the code where it is needed and test your extension. You can download this tutorial and a javascript file here. If you have any questions or ideas send me a mail and I will gladly help you.

Ihoss - March/2005

This tutorial is originaly on my extension and tutorial page: nsIPrompt tutorial