Виджет <tree>
использует объект nsITreeView для извлечения или манипулирования данными, которые необходимо отобразить. Существуют предопределенные nsITreeView
реализации, считывающие данные из источников данных DOM или RDF, но можно использовать его собственное древовидное представление. Адресная книга Thunderbird выбирает последнее:
gAbView = Components.classes["@mozilla.org/addressbook/abview;1"]
.createInstance(Components.interfaces.nsIAbView);
...
gAbResultsTree.treeBoxObject.view =
gAbView.QueryInterface(Components.interfaces.nsITreeView);
К сожалению для вас, рассматриваемый компонент реализован на C ++, в файле nsAbView.cpp . Это означает, что изменить его без перекомпиляции Thunderbird невозможно. А в существующем компоненте не реализованы методы isEditable()
и setCellText()
, которые потребуются для редактирования ячеек дерева.
Если вы еще не хотите связываться с C ++, вы можете обернуть этот компонент в свой собственный объект. Примерно так:
gAbView = Components.classes["@mozilla.org/addressbook/abview;1"]
.createInstance(Components.interfaces.nsIAbView);
gAbViewWrapper = {
__proto__: gAbView,
QueryInterface: function(iid)
{
gAbView.QueryInterface(iid);
return this;
},
isEditable: function(row, col)
{
// Do something here
},
setCellText: function(row, col, value)
{
// Do something here
}
};
...
gAbResultsTree.treeBoxObject.view =
gAbViewWrapper.QueryInterface(Components.interfaces.nsITreeView);
Метод isEditable()
должен еще раз проверить, является ли данная ячейка редактируемой - даже если столбец редактируемый, отдельные ячейки не должны быть. И setCellText()
должен хранить новое значение для ячейки.