Bug 990009 - Rework imipbar buttons to offer more options to the user. r=philipp

This commit is contained in:
MakeMyDay 2014-04-23 11:56:08 +02:00
Родитель bf75e11a65
Коммит 3e50775372
9 изменённых файлов: 459 добавлений и 82 удалений

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

@ -216,19 +216,13 @@ cal.itip = {
/**
* Scope: iTIP message receiver
*
* Gets localized texts about the message state. This returns a JS object
* with the following structure:
* Gets localized toolbar label about the message state and triggers buttons to show.
* This returns a JS object with the following structure:
*
* {
* label: "This is a desciptive text about the itip item",
* button1: {
* label: "What to show on the first button, i.e 'Decline'" +
* "This can be null if the button is not to be shown"
* actionMethod: "The method this triggers, i.e DECLINED",
* },
* // Same structure for button2/3
* button2: { ... }
* button3: { ... }
* buttons: ["imipXXXButton", ...],
* hideMenuItem: ["imipXXXButton_Option", ...]
* }
*
* @see processItipItem This takes the same parameters as its optionFunc.
@ -244,10 +238,7 @@ cal.itip = {
if (itipItem.receivedMethod) {
imipLabel = cal.itip.getMethodText(itipItem.receivedMethod);
}
let data = { label: imipLabel };
for each (let btn in ["button1", "button2", "button3"]) {
data[btn] = { label: null, actionMethod: "" };
}
let data = { label: imipLabel, buttons: [], hideMenuItems: [] };
if (rc == Components.interfaces.calIErrors.CAL_IS_READONLY) {
// No writable calendars, tell the user about it
@ -257,9 +248,8 @@ cal.itip = {
// added/updated, we want to tell them that.
data.label = _gs("imipBarAlreadyProcessedText");
if (foundItems && foundItems.length) {
data.button1.label = _gs("imipDetails.label");
// Not a real method, but helps us decide
data.button1.actionMethod = "X-SHOWDETAILS";
data.buttons.push("imipDetailsButton");
}
} else if (Components.isSuccessCode(rc)) {
@ -270,10 +260,10 @@ cal.itip = {
case "PUBLISH:UPDATE":
case "REQUEST:UPDATE-MINOR":
data.label = _gs("imipBarUpdateText");
data.button1.label = _gs("imipUpdate.label");
data.buttons.push("imipUpdateButton");
break;
case "PUBLISH":
data.button1.label = _gs("imipAddToCalendar.label");
data.buttons.push("imipAddButton");
break;
case "REQUEST:UPDATE":
case "REQUEST:NEEDS-ACTION":
@ -284,20 +274,42 @@ cal.itip = {
data.label = _gs("imipBarProcessedNeedsAction");
}
data.button1.label = _gs("imipAcceptInvitation.label");
data.button1.actionMethod = "ACCEPTED";
data.button2.label = _gs("imipDeclineInvitation.label");
data.button2.actionMethod = "DECLINED";
data.button3.label = _gs("imipAcceptTentativeInvitation.label");
data.button3.actionMethod = "TENTATIVE";
let isRecurringMaster = false;
for (let item of itipItem.getItemList({})) {
if (item.recurrenceInfo) {
isRecurringMaster = true;
}
}
if (itipItem.getItemList({}).length > 1 || isRecurringMaster) {
data.buttons.push("imipAcceptRecurrencesButton");
data.buttons.push("imipDeclineRecurrencesButton");
// if imipMoreButton is used, the following should be removed to not
// extend the number of buttons:
data.buttons.push("imipTentativeRecurrencesButton");
data.hideMenuItems.push("imipAcceptRecurrencesButton_Tentative");
} else {
data.buttons.push("imipAcceptButton");
data.buttons.push("imipDeclineButton");
// if imipMoreButton is used, the following should be removed to not
// extend the number of buttons:
data.buttons.push("imipTentativeButton");
data.hideMenuItems.push("imipAcceptButton_Tentative");
}
// Add here data.buttons.push("imipMoreButton") once additional
// options are implemented.
// Use data.hideMenuItems.push("idOfMenuItem") to hide specific menuitems
// from the dropdown menu of a button. This might be useful to to remove
// a generally available option for a specific invitation, because the
// respective feature is not available for the calendar, the invitation
// is in or the feature is prohibited by the organizer
break;
}
case "CANCEL": {
data.button1.label = _gs("imipCancelInvitation.label");
data.buttons.push("imipCancelledButton");
break;
}
case "REFRESH": {
data.button1.label = _gs("imipSend.label");
data.buttons.push("imipReconfirmButton");
break;
}
default:

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

@ -47,17 +47,36 @@
list-style-image: url(chrome://lightning/skin/mode-switch-icons-inverted.png);
}
.imip-button[action="ACCEPTED"] {
.imipAcceptButton {
list-style-image: url(chrome://lightning/skin/imip-aero.png);
-moz-image-region: rect(0px 16px 16px 0px);
}
.imip-button[action="DECLINED"] {
.imipDeclineButton {
list-style-image: url(chrome://lightning/skin/imip-aero.png);
-moz-image-region: rect(0px 32px 16px 16px);
}
.imip-button[action="TENTATIVE"] {
.imipTentativeButton {
list-style-image: url(chrome://lightning/skin/imip-aero.png);
-moz-image-region: rect(0px 48px 16px 32px);
}
/* These buttons may also deserve an icon:
.imipDetailsButton
(-> open the event or summary dialog)
.imipMoreButton
(-> dropdown button to offer more options to the user)
.imipAddButton
(-> add an event to the calendar)
.imipUpdateButton
(-> ipdate an event in the calendar)
.imipDeleteButton
(-> delete an event from the calendar)
.imipReconfirmButton
(-> re-confirm the own participation status on organizer's request)
.imipAcceptRecurrencesButton
.imipDeclineRecurrencesButton
.imipTentativeRecurrencesButton
(-> the same functionality as above, but for recurring events)
*/

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

@ -37,21 +37,36 @@
}
/* ::: imip button icons ::: */
.imip-button[action="ACCEPTED"] {
.imipAcceptButton {
list-style-image: url(chrome://lightning/skin/imip.png);
-moz-image-region: rect(0px 16px 16px 0px);
}
.imip-button[action="DECLINED"] {
.imipDeclineButton {
list-style-image: url(chrome://lightning/skin/imip.png);
-moz-image-region: rect(0px 32px 16px 16px);
}
.imip-button[action="TENTATIVE"] {
.imipTentativeButton {
list-style-image: url(chrome://lightning/skin/imip.png);
-moz-image-region: rect(0px 48px 16px 32px);
}
.imip-button > .button-box > .button-icon {
-moz-margin-end: 2px;
}
/* These buttons may also deserve an icon:
.imipDetailsButton
(-> open the event or summary dialog)
.imipMoreButton
(-> dropdown button to offer more options to the user)
.imipAddButton
(-> add an event to the calendar)
.imipUpdateButton
(-> ipdate an event in the calendar)
.imipDeleteButton
(-> delete an event from the calendar)
.imipReconfirmButton
(-> re-confirm the own participation status on organizer's request)
.imipAcceptRecurrencesButton
.imipDeclineRecurrencesButton
.imipTentativeRecurrencesButton
(-> the same functionality as above, but for recurring events)
*/

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

@ -34,15 +34,217 @@
collapsed="true"
insertbefore="msgHeaderView"
label="&lightning.imipbar.description;">
<button id="imip-button1"
class="imip-button"
hidden="true"/>
<button id="imip-button2"
class="imip-button"
hidden="true"/>
<button id="imip-button3"
class="imip-button"
hidden="true"/>
<!-- Some Toolbox implementation notes:
-
- css style:
- classes within toolbox are making use of existing TB css definitions - as used in
- /comm-central/source/mail/base/content/msgHdrViewOverlay.xul, only icon defining
- classes like imipAcceptButton are noted separately and OS specific within
- skin/lightning.css (resp. the OS-specific theme folders)
-
- The toolbarbuttons will be adjusted dynamically in imip-bar.js based on their
- content of menuitems. To avoid breaking this, the following should be considered
- if adding/changing toolbarbutton definitions.
- general:
- * the toolbarbuttons will appear in order of definition
- within the toolbar if visible
- * must be hidden by default
- * menuitem inside must not be hidden by default
- simple button:
- * must not have a type attribute
- * may have menupopup/menuitem within (not displayed though)
- dropdown only:
- * must have type=menu
- * should have a menupopup with at least one menuitem
- smart-dropdown:
- * must have type=menu-button
- * should have a menupopup with at least one menuitem
- * bubbling up of events from menuitems to toolbarbutton must be prevented
- by adding a trailing "if (event.target.id == this.id) " to the respective
- ltnImipBar.executeAction(...)
- * toolbarbutton's oncommand should end with the first menuitem's oncommand
- to not break automated conforming
- e.g. "if (event.target.id == this.id) ltnImipBar.executeAction('ACCEPTED');"
- and "ltnImipBar.executeAction('ACCEPTED');"
//-->
<toolbox id="imip-view-toolbox"
class="inline-toolbox"
defaulticonsize="small"
minwidth="50px"
defaultlabelalign="end"
labelalign="end"
defaultmode="full"
inlinetoolbox="true">
<toolbar id="imip-view-toolbar" class="inline-toolbar" align="start"
customizable="false" mode="full"
defaulticonsize="small" defaultmode="full">
<!-- show event/invitation details -->
<toolbarbutton id="imipDetailsButton"
label="&lightning.imipbar.btnDetails.label;"
tooltiptext="&lightning.imipbar.btnDetails.tooltiptext;"
class="toolbarbutton-1 msgHeaderView-button imipDetailsButton"
oncommand="ltnImipBar.executeAction('X-SHOWDETAILS')"
hidden="true"/>
<!-- add published events -->
<toolbarbutton id="imipAddButton"
label="&lightning.imipbar.btnAdd.label;"
tooltiptext="&lightning.imipbar.btnAdd.tooltiptext;"
class="toolbarbutton-1 msgHeaderView-button imipAddButton"
oncommand="ltnImipBar.executeAction()"
hidden="true"/>
<!-- update published events and invitations -->
<toolbarbutton id="imipUpdateButton"
label="&lightning.imipbar.btnUpdate.label;"
tooltiptext="&lightning.imipbar.btnUpdate.tooltiptext;"
class="toolbarbutton-1 msgHeaderView-button imipUpdateButton"
oncommand="ltnImipBar.executeAction()"
hidden="true"/>
<!-- delete cancelled events from calendar -->
<toolbarbutton id="imipDeleteButton"
label="&lightning.imipbar.btnDelete.label;"
tooltiptext="&lightning.imipbar.btnDelete.tooltiptext;"
class="toolbarbutton-1 msgHeaderView-button imipDeleteButton"
oncommand="ltnImipBar.executeAction()"
hidden="true"/>
<!-- re-confirm partstat -->
<toolbarbutton id="imipReconfirmButton"
label="&lightning.imipbar.btnReconfirm.label;"
tooltiptext="&lightning.imipbar.btnReconfirm.tooltiptext;"
class="toolbarbutton-1 msgHeaderView-button imipReconfirmButton"
oncommand="ltnImipBar.executeAction()"
hidden="true"/>
<!-- accept -->
<toolbarbutton id="imipAcceptButton"
tooltiptext="&lightning.imipbar.btnAccept.tooltiptext;"
label="&lightning.imipbar.btnAccept.label;"
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('ACCEPTED');"
type="menu-button"
class="imip-button toolbarbutton-1 msgHeaderView-button imipAcceptButton"
hidden="true">
<menupopup id="imipAcceptDropdown">
<menuitem id="imipAcceptButton_Accept"
tooltiptext="&lightning.imipbar.btnAccept.tooltiptext;"
label="&lightning.imipbar.btnAccept.label;"
oncommand="ltnImipBar.executeAction('ACCEPTED');"/>
<menuitem id="imipAcceptButton_Tentative"
tooltiptext="&lightning.imipbar.btnTentative.tooltiptext;"
label="&lightning.imipbar.btnTentative.label;"
oncommand="ltnImipBar.executeAction('TENTATIVE');"/>
<!-- add here more menuitem as needed -->
</menupopup>
</toolbarbutton>
<!-- accept recurrences -->
<toolbarbutton id="imipAcceptRecurrencesButton"
tooltiptext="&lightning.imipbar.btnAcceptRecurrences.tooltiptext;"
label="&lightning.imipbar.btnAcceptRecurrences.label;"
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('ACCEPTED');"
type="menu-button"
class="imip-button toolbarbutton-1 msgHeaderView-button imipAcceptRecurrencesButton"
hidden="true">
<menupopup id="imipAcceptRecurrencesDropdown">
<menuitem id="imipAcceptRecurrencesButton_Accept"
tooltiptext="&lightning.imipbar.btnAcceptRecurrences.tooltiptext;"
label="&lightning.imipbar.btnAcceptRecurrences.label;"
oncommand="ltnImipBar.executeAction('ACCEPTED');"/>
<menuitem id="imipAcceptRecurrencesButton_Tentative"
tooltiptext="&lightning.imipbar.btnTentativeRecurrences.tooltiptext;"
label="&lightning.imipbar.btnTentativeRecurrences.label;"
oncommand="ltnImipBar.executeAction('TENTATIVE');"/>
<!-- add here more menuitem as needed -->
</menupopup>
</toolbarbutton>
<!-- tentative; should only be used, if no imipMoreButton is used and
- imipDeclineButton/imipAcceptButton have no visible menuitems //-->
<toolbarbutton id="imipTentativeButton"
label="&lightning.imipbar.btnTentative.label;"
tooltiptext="&lightning.imipbar.btnTentative.tooltiptext;"
class="toolbarbutton-1 msgHeaderView-button imipTentativeButton"
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('TENTATIVE');"
type="menu-button"
hidden="true">
<menupopup id="imipTentativeDropdown">
<menuitem id="imipTentativeButton_Tentative"
tooltiptext="&lightning.imipbar.btnTentative.tooltiptext;"
label="&lightning.imipbar.btnTentative.label;"
oncommand="ltnImipBar.executeAction('TENTATIVE');"/>
<!-- add here more menuitem as needed -->
</menupopup>
</toolbarbutton>
<!-- tentative recurrences; should only be used, if no imipMoreButton is used and
- imipDeclineRecurrencesButton/imipAcceptRecurrencesButton have no visible menuitems //-->
<toolbarbutton id="imipTentativeRecurrencesButton"
label="&lightning.imipbar.btnTentativeRecurrences.label;"
tooltiptext="&lightning.imipbar.btnTentativeRecurrences.tooltiptext;"
class="toolbarbutton-1 msgHeaderView-button imipTentativeRecurrencesButton"
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('TENTATIVE');"
type="menu-button"
hidden="true">
<menupopup id="imipTentativeRecurrencesDropdown">
<menuitem id="imipTentativeRecurrencesButton_Tentative"
tooltiptext="&lightning.imipbar.btnTentativeRecurrences.tooltiptext;"
label="&lightning.imipbar.btnTentativeRecurrences.label;"
oncommand="ltnImipBar.executeAction('TENTATIVE');"/>
<!-- add here more menuitem as needed -->
</menupopup>
</toolbarbutton>
<!-- decline -->
<toolbarbutton id="imipDeclineButton"
tooltiptext="&lightning.imipbar.btnDecline.tooltiptext;"
label="&lightning.imipbar.btnDecline.label;"
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('DECLINED');"
type="menu-button"
class="toolbarbutton-1 msgHeaderView-button imipDeclineButton"
hidden="true">
<menupopup id="imipDeclineDropdown">
<menuitem id="imipDeclineButton_Decline"
tooltiptext="&lightning.imipbar.btnDecline.tooltiptext;"
label="&lightning.imipbar.btnDecline.label;"
oncommand="ltnImipBar.executeAction('DECLINED');"/>
<!-- add here more menuitem as needed -->
</menupopup>
</toolbarbutton>
<!-- decline recurrences -->
<toolbarbutton id="imipDeclineRecurrencesButton"
tooltiptext="&lightning.imipbar.btnDeclineRecurrences.tooltiptext;"
label="&lightning.imipbar.btnDeclineRecurrences.label;"
oncommand="if (event.target.id == this.id) ltnImipBar.executeAction('DECLINED');"
type="menu-button"
class="toolbarbutton-1 msgHeaderView-button imipDeclineRecurrencesButton"
hidden="true">
<menupopup id="imipDeclineRecurrencesDropdown">
<menuitem id="imipDeclineRecurrencesButton_DeclineAll"
tooltiptext="&lightning.imipbar.btnDeclineRecurrences.tooltiptext;"
label="&lightning.imipbar.btnDeclineRecurrences.label;"
oncommand="ltnImipBar.executeAction('DECLINED');"/>
<!-- add here more menuitem as needed -->
</menupopup>
</toolbarbutton>
<!-- more options -->
<toolbarbutton id="imipMoreButton"
type="menu"
tooltiptext="&lightning.imipbar.btnMore.tooltiptext;"
label="&lightning.imipbar.btnMore.label;"
class="toolbarbutton-1 msgHeaderView-button imipMoreButton"
hidden="true">
<menupopup id="imipMoreDropdown">
<!-- add here a menuitem as needed -->
</menupopup>
</toolbarbutton>
</toolbar>
</toolbox>
</lightning-notification-bar>
</vbox>
</vbox>

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

@ -19,7 +19,7 @@ var ltnImipBar = {
* Thunderbird Message listener interface, hide the bar before we begin
*/
onStartHeaders: function onImipStartHeaders() {
ltnImipBar.hideBar();
ltnImipBar.resetBar();
},
/**
@ -42,7 +42,7 @@ var ltnImipBar = {
// changing folders.
ltnImipBar.tbHideMessageHeaderPane = HideMessageHeaderPane;
HideMessageHeaderPane = function ltnHideMessageHeaderPane() {
ltnImipBar.hideBar();
ltnImipBar.resetBar();
ltnImipBar.tbHideMessageHeaderPane.apply(null, arguments);
};
@ -58,7 +58,7 @@ var ltnImipBar = {
removeEventListener("messagepane-loaded", ltnImipBar.load, true);
removeEventListener("messagepane-unloaded", ltnImipBar.unload, true);
ltnImipBar.hideBar();
ltnImipBar.resetBar();
Services.obs.removeObserver(ltnImipBar, "onItipItemCreation");
},
@ -95,17 +95,81 @@ var ltnImipBar = {
/**
* Hide the imip bar and reset the itip item.
*/
hideBar: function ltnHideImipBar() {
resetBar: function ltnResetImipBar() {
document.getElementById("imip-bar").collapsed = true;
hideElement("imip-button1");
hideElement("imip-button2");
hideElement("imip-button3");
ltnImipBar.resetButtons();
// Clear our iMIP/iTIP stuff so it doesn't contain stale information.
cal.itip.cleanupItipItem(ltnImipBar.itipItem);
ltnImipBar.itipItem = null;
},
/**
* Resets all buttons and its menuitems, all buttons are hidden thereafter
*/
resetButtons: function ltnResetImipButtons() {
let buttons = ltnImipBar.getButtons();
buttons.forEach(hideElement);
buttons.forEach(function(aButton) ltnImipBar.getMenuItems(aButton).forEach(showElement));
},
/**
* Provides a list of all available buttons
*/
getButtons: function ltnGetButtons() {
let buttons = [];
let nl = document.getElementById("imip-view-toolbar")
.getElementsByTagName("toolbarbutton");
if (nl != null && nl.length > 0) {
for (let button of nl) {
buttons.push(button);
}
}
return buttons;
},
/**
* Provides a list of available menuitems of a button
*
* @param aButton button node
*/
getMenuItems: function ltnGetMenuItems(aButton) {
let items = [];
let mitems = document.getElementById(aButton.id)
.getElementsByTagName("menuitem");
if (mitems != null && mitems.length > 0) {
for (let mitem of mitems) {
items.push(mitem);
}
}
return items;
},
/**
* Checks and converts button types based on available menuitems of the buttons
* to avoid dropdowns which are empty or only replicating the default button action
* Should be called once the buttons are set up
*/
conformButtonType: function ltnConformButtonType() {
// check only needed on visible and not simple buttons
let buttons = ltnImipBar.getButtons()
.filter(function(aElement) aElement.hasAttribute("type") && !aElement.hidden);
// change button if appropriate
for (let button in buttons) {
let items = ltnImipBar.getMenuItems(button).filter(function(aItem) !aItem.hidden);
if (button.type == "menu" && items.length == 0) {
// hide non functional buttons
button.hidden = true;
} else if (button.type == "menu-button") {
if (items.length == 0 ||
(items.length == 1 && button.oncommand.endsWith(items[0].oncommand))) {
// convert to simple button
button.removeAttribute("type");
}
}
}
},
/**
* This is our callback function that is called each time the itip bar UI needs updating.
* NOTE: This function is called without a valid this-context!
@ -127,20 +191,19 @@ var ltnImipBar = {
}
imipBar.setAttribute("label", data.label);
for each (let button in ["button1", "button2", "button3"]) {
let buttonElement = document.getElementById("imip-" + button);
if (data[button].label) {
buttonElement.setAttribute("label", data[button].label);
buttonElement.setAttribute("oncommand",
"ltnImipBar.executeAction('" + data[button].actionMethod + "')");
buttonElement.setAttribute("action", data[button].actionMethod);
showElement(buttonElement);
}
}
// menu items are visible by default, let's hide what's not available
data.hideMenuItems.forEach(function(aElementId) hideElement(document.getElementById(aElementId)));
// buttons are hidden by default, let's make required buttons visible
data.buttons.forEach(function(aElementId) showElement(document.getElementById(aElementId)));
// adjust button style if necessary
ltnImipBar.conformButtonType();
},
executeAction: function ltnExecAction(partStat) {
executeAction: function ltnExecAction(partStat, extendResponse) {
if (partStat == null) {
partStat = '';
}
if (partStat == "X-SHOWDETAILS") {
let items = ltnImipBar.foundItems;
if (items && items.length) {
@ -148,6 +211,16 @@ var ltnImipBar = {
modifyEventWithDialog(item);
}
} else {
if (extendResponse) {
// Open an extended response dialog to enable the user to add a comment, make a
// counter proposal, delegate the event or interact in another way.
// Instead of a dialog, this might be implemented as a separate container inside the
// imip-overlay as proposed in bug 458578
//
// If implemented as a dialog, the OL compatibility decision should be incorporated
// therein too and the itipItems's autoResponse set to auto subsequently
// to prevent a second popup during imip transport processing.
}
let delmgr = Components.classes["@mozilla.org/calendar/deleted-items-manager;1"]
.getService(Components.interfaces.calIDeletedItems);
let items = ltnImipBar.itipItem.getItemList({});
@ -162,9 +235,7 @@ var ltnImipBar = {
if (cal.itip.promptCalendar(ltnImipBar.actionFunc.method, ltnImipBar.itipItem, window)) {
// hide the buttons now, to disable pressing them twice...
hideElement("imip-button1");
hideElement("imip-button2");
hideElement("imip-button3");
ltnImipBar.resetButtons();
let opListener = {
onOperationComplete: function ltnItipActionListener_onOperationComplete(aCalendar,

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

@ -199,17 +199,36 @@ radio[pane=paneLightning] {
margin-top: 3px;
}
.imip-button[action="ACCEPTED"] {
.imipAcceptButton {
list-style-image: url(chrome://lightning/skin/imip.png);
-moz-image-region: rect(0px 16px 16px 0px);
}
.imip-button[action="DECLINED"] {
.imipDeclineButton {
list-style-image: url(chrome://lightning/skin/imip.png);
-moz-image-region: rect(0px 32px 16px 16px);
}
.imip-button[action="TENTATIVE"] {
.imipTentativeButton {
list-style-image: url(chrome://lightning/skin/imip.png);
-moz-image-region: rect(0px 48px 16px 32px);
}
/* These buttons may also deserve an icon:
.imipDetailsButton
(-> open the event or summary dialog)
.imipMoreButton
(-> dropdown button to offer more options to the user)
.imipAddButton
(-> add an event to the calendar)
.imipUpdateButton
(-> ipdate an event in the calendar)
.imipDeleteButton
(-> delete an event from the calendar)
.imipReconfirmButton
(-> re-confirm the own participation status on organizer's request)
.imipAcceptRecurrencesButton
.imipDeclineRecurrencesButton
.imipTentativeRecurrencesButton
(-> the same functionality as above, but for recurring events)
*/

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

@ -205,29 +205,51 @@ radio[pane=paneLightning] {
-moz-margin-end: -3px !important;
}
.imip-button[action="ACCEPTED"] {
.imipAcceptButton {
list-style-image: url(chrome://lightning/skin/imip.png);
-moz-image-region: rect(0px 16px 16px 0px);
}
.imip-button[action="ACCEPTED"]:active {
.imipAcceptButton:active {
-moz-image-region: rect(16px 16px 32px 0px);
}
.imip-button[action="DECLINED"] {
.imipDeclineButton {
list-style-image: url(chrome://lightning/skin/imip.png);
-moz-image-region: rect(0px 32px 16px 16px);
}
.imip-button[action="DECLINED"]:active {
.imipDeclineButton:active {
-moz-image-region: rect(16px 32px 32px 16px);
}
.imip-button[action="TENTATIVE"] {
.imipTentativeButton {
list-style-image: url(chrome://lightning/skin/imip.png);
-moz-image-region: rect(0px 48px 16px 32px);
}
.imip-button[action="TENTATIVE"]:active {
.imipTentativeButton:active {
-moz-image-region: rect(16px 48px 32px 32px);
}
/* Are the separate icons for :active state of the imipButtons
above still required with the button redesign?
These buttons may also deserve an icon:
.imipDetailsButton
(-> open the event or summary dialog)
.imipMoreButton
(-> dropdown button to offer more options to the user)
.imipAddButton
(-> add an event to the calendar)
.imipUpdateButton
(-> ipdate an event in the calendar)
.imipDeleteButton
(-> delete an event from the calendar)
.imipReconfirmButton
(-> re-confirm the own participation status on organizer's request)
.imipAcceptRecurrencesButton
.imipDeclineRecurrencesButton
.imipTentativeRecurrencesButton
(-> the same functionality as above, but for recurring events)
*/

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

@ -40,7 +40,31 @@
<!ENTITY lightning.calendarproperties.email.label "E-Mail:">
<!-- iMIP Bar (meeting support) -->
<!ENTITY lightning.imipbar.description "This message contains an invitation to an event.">
<!ENTITY lightning.imipbar.btnAccept.label "Accept">
<!ENTITY lightning.imipbar.btnAccept.tooltiptext "Accept event participation">
<!ENTITY lightning.imipbar.btnAcceptRecurrences.label "Accept all">
<!ENTITY lightning.imipbar.btnAcceptRecurrences.tooltiptext "Accept event participation for all recurrences of the event">
<!ENTITY lightning.imipbar.btnAdd.label "Add">
<!ENTITY lightning.imipbar.btnAdd.tooltiptext "Add the event to the calendar">
<!ENTITY lightning.imipbar.btnDecline.label "Decline">
<!ENTITY lightning.imipbar.btnDecline.tooltiptext "Decline event participation">
<!ENTITY lightning.imipbar.btnDeclineRecurrences.label "Decline all">
<!ENTITY lightning.imipbar.btnDeclineRecurrences.tooltiptext "Accept event participation for all recurrences of the event">
<!ENTITY lightning.imipbar.btnDelete.label "Delete">
<!ENTITY lightning.imipbar.btnDelete.tooltiptext "Delete from calendar">
<!ENTITY lightning.imipbar.btnDetails.label "Details…">
<!ENTITY lightning.imipbar.btnDetails.tooltiptext "Show event details">
<!ENTITY lightning.imipbar.btnMore.label "More">
<!ENTITY lightning.imipbar.btnMore.tooltiptext "Click to show more options">
<!ENTITY lightning.imipbar.btnReconfirm.label "Send">
<!ENTITY lightning.imipbar.btnReconfirm.tooltiptext "Sends a re-confirmation to the organizer">
<!ENTITY lightning.imipbar.btnTentative.label "Tentative">
<!ENTITY lightning.imipbar.btnTentative.tooltiptext "Accept event participation tentatively">
<!ENTITY lightning.imipbar.btnTentativeRecurrences.label "Tentative all">
<!ENTITY lightning.imipbar.btnTentativeRecurrences.tooltiptext "Accept event participation tentatively for all recurrences of the event">
<!ENTITY lightning.imipbar.btnUpdate.label "Update">
<!ENTITY lightning.imipbar.btnUpdate.tooltiptext "Update event in calendar">
<!ENTITY lightning.imipbar.description "This message contains an invitation to an event.">
<!-- Lightning specific keybindings -->
<!ENTITY lightning.keys.event.showCalendar.key "C">

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

@ -45,13 +45,6 @@ imipBarReplyText=This message contains a reply to an invitation.
imipBarUnsupportedText=This message contains an event that this version of Lightning cannot process.
imipBarProcessingFailed=Processing message failed. Status: %1$S.
imipBarNotWritable=No writable calendars are configured for invitations, please check the calendar properties.
imipAcceptInvitation.label=Accept
imipCancelInvitation.label=Delete
imipDeclineInvitation.label=Decline
imipUpdate.label=Update
imipDetails.label=Details…
imipAcceptTentativeInvitation.label=Tentative
imipSend.label=Send
imipSendMail.title=E-Mail Notification
imipSendMail.text=Would you like to send out notification E-Mail now?
imipSendMail.Outlook2000CompatMode.text=Support Outlook 2000 and Outlook 2002/XP