Аддон Thunderbird: отключить кнопку панели инструментов программно

Я создал небольшой аддон Thunderbird, который добавляет кнопку на панель инструментов. Он работает так, как ожидалось.

изображение

Однако бывают случаи, когда кнопка должна выглядеть отключенной. Это похоже на кнопки «Ответить» и «Ответить всем» в Thunderbird. Если электронная почта не выбрана, эти кнопки выглядят отключенными.

изображение

Я хочу сделать то же самое с моим аддоном. Я написал алгоритм для обновления кнопки, но я не знаю, как его вызвать. Как я могу вызвать его при изменении выбора в списке адресов электронной почты?

Код проверен и работает:

var OpenConversation = {
    refresh: function () {
        document.getElementById("open-conversation").disabled = ! OpenConversation.isEnabled()
    },

    // Based on: https://github.com/mozilla/releases-comm-central/blob/9ba3a1faeb6db90254d7e67d9d0dd630fd1a90be/mail/base/content/mail3PaneWindowCommands.js#L330-L360
    isEnabled: function () {
        let numSelected = GetNumSelectedMessages();

        if (numSelected == 1) {
            if (! gFolderDisplay.getCommandStatus(nsMsgViewCommandType.cmdRequiringMsgBody))
                return false;

            // Check if we have a collapsed thread selected and are summarizing it.
            // If so, selectedIndices.length won't match numSelected. Also check
            // that we're not displaying a message, which handles the case
            // where we failed to summarize the selection and fell back to
            // displaying a message.
            if (gFolderDisplay.selectedIndices.length != numSelected &&
                    command != "cmd_applyFiltersToSelection" &&
                    gDBView && gDBView.currentlyDisplayedMessage == nsMsgViewIndex_None)
                return false;

            return true;
        }

        return false;
    }
};

/*
 * Instead of this, events should be used. Whenever user selects/deselects mails in
 * the list, `OpenConversation.refresh()` should be triggered.
 */
window.setInterval(OpenConversation.refresh, 50);

person maliayas    schedule 03.08.2014    source источник
comment
Загрузите дополнение DOMInspector и ElementInspector и Shift+щелчок правой кнопкой мыши по отключенной кнопке. Вероятно, вы найдете атрибут disabled=true, а затем сделаете то же самое, чтобы отключить кнопку. кстати турецкий да? круто :) таркан!   -  person Noitidart    schedule 04.08.2014
comment
Спасибо, я уже могу это сделать (строка 3 в приведенном выше коде). Чего я не могу сделать, так это запускать этот код всякий раз, когда меняется выбор электронной почты (см. setInterval использование внизу). Как я могу это сделать? Есть ли специальное мероприятие для этого?   -  person maliayas    schedule 04.08.2014


Ответы (1)


Панель инструментов почты обновляется, прослушивая уведомления, созданные UpdateMailToolbar(). Есть два уведомления:

  1. <commandset commandupdater="true" events="mail-toolbar" oncommandupdate="..."> запустит обновление команды. Набор команд в mailWindowOverlay.xul содержит группу <command> элементов и обновляет их, используя goUpdateCommand для каждого из них. Если вы не используете командный контроллер, вы можете создать свой собственный элемент <commandset> с собственной логикой обновления.
  2. Существует также уведомление наблюдателя для темы "mail:updateToolbarItems". Темой уведомления является окно, панель инструментов которого нуждается в обновлении. (Если ваш код уже находится в окне, вы должны убедиться, что тема является текущим окном, прежде чем выполнять какую-либо ненужную работу.) Вы можете обнаружить, что это уведомление легче подключить.
person Neil    schedule 04.08.2014