Как программно добавить столбец ко всем представлениям списка сообщений в Thunderbird - PullRequest
1 голос
/ 22 апреля 2011

Я создал расширение, которое добавляет новый столбец в основной список сообщений, в основном следуя инструкции New Column . Теперь я хотел бы поместить столбец непосредственно перед столбцом темы, что оказалось возможным, если не сохранить порядковое поле и добавить атрибут insertbefore. Однако мне все еще нужно вручную выбрать столбец в окне выбора столбцов, чтобы сделать его видимым, и мне также нужно сделать это для каждой папки. Есть ли способ вставить это автоматически во все просмотры сообщений непосредственно перед темой столбца? Моя цель заключается в том, чтобы этот столбец автоматически отображался во всех возможных сообщениях при установке расширения.

Мой оверлей XUL сейчас выглядит так:

<overlay id="colovl"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/x-javascript" src="chrome://myext/content/column_overlay.js"/>
  <tree id="threadTree">
    <treecols id="threadCols">
    <splitter class="tree-splitter" />
    <treecol id="MyCol" insertbefore="subjectCol" fixed="true" 
           flex="2" hidden="false"
           class="treecol-image"
           label="MyCol" tooltiptext="Click to sort by MyCol" />
    </treecols>
  </tree>
</overlay>

1 Ответ

1 голос
/ 26 апреля 2011

В Thunderbird 3.1 предусмотрено действие, предоставляемое пользователем, для применения макета столбца текущей папки к другим папкам и их подпапкам. Как пользователь вы можете использовать это действие через действие «Применить столбцы к ...» в меню конфигурации папки.

Это означает, что то, что вы хотите сделать, выполнимо.

Реализация этого действия содержится в threadPaneColumnPicker.xml . Просматривая исходный код, я бы сказал, что интересная часть начинается со строки 167. Я скопировал части кода:

let destFolder = event.originalTarget._folder;
let parent = event.originalTarget.parentNode;
while (parent != noChildrenPopup && parent != yesChildrenPopup) {
   parent = parent.parentNode;
}

// Get the current folder's column state.
let propName = gFolderDisplay.PERSISTED_COLUMN_PROPERTY_NAME;
let dbFolderInfo =
  gFolderDisplay.displayedFolder.msgDatabase.dBFolderInfo;
let columnStateString = dbFolderInfo.getCharProperty(propName);
// Now propagate appropriately...
if (useChildren) {
  // Generate an observer notification when we have finished configuring
  // all folders.  This is currently done for the benefit of our mozmill
  // tests.
  function observerCallback() {
    let obsService =
       Components.classes["@mozilla.org/observer-service;1"]
                 .getService(Components.interfaces.nsIObserverService);
    obsService.notifyObservers(gFolderDisplay.displayedFolder,
                               "msg-folder-columns-propagated", "");
  }
  MailUtils.setStringPropertyOnFolderAndDescendents(propName,
                                                    columnStateString,
                                                    destFolder,
                                                    observerCallback);
}

Я не уверен, что вы можете использовать код как есть, но он должен вдохновить вас на отправную точку.

...