[mozbr-desenvolvimento] dúvida - programação em XUL

Fernando Pereira Silveira fernandopsilveira em yahoo.com.br
Terça Abril 3 14:19:26 BRT 2007


Citando Jeferson Hultmann:
> Acredito que o problema está relacionado a chamada/implementação do 
> QueryInterface. Mas sem ver o código todo não dá pra dizer.  :-)

O código (esboço) é o seguinte:

ARQUIVO 1
-----------------

var controledescripts = {
    adicionarEvento: function() {
        if (this.listaDisponiveis.selectedItem) {
            var lower = 
this.listaDisponiveis.selectedItem.getAttribute("label").toLowerCase();

            if (!estaNaLista(lower, this.eventosValidos)) {
                this.eventosValidos.push(lower);
                this.eventosValidos = this.eventosValidos.sort();
                this.carregarEventos(true);
            }
            else
                
alert(this.stringset.getString("controledescripts.eventOnList"));
        }
    },

    adicionarPermissao: function() {
        var perm = new Permissao("Window.status", "sameOrigin");

        this.arvore.view.adicionarItem(perm);
    },

    atualizarBotoesEventos: function() {
        if (this.listaDisponiveis.selectedItem)
            this.botaoAdicionarEvento.disabled = false;
        else
            this.botaoAdicionarEvento.disabled = true;

        if (this.listaPermitidos.selectedItem)
            this.botaoRemoverEvento.disabled = false;
        else
            this.botaoRemoverEvento.disabled = true;
    },

    atualizarCaixa: function() {
        this.caixaIcones.disabled = this.caixaFerramentas.checked;
    },

    carregarArvore: function(categoria) {
        var nomes = 
obterString("controledescripts.policy."+categoria).split(",");
        var itens = new Array();
       
        if (listaEstaVazia(nomes))
            nomes.splice(0, 1);

        for (i in nomes) {
            var status = 
obterString("capability.policy."+categoria+"."+nomes[i]);
            var item = new Permissao(nomes[i], status);
            itens.push(item);
        }

        this.arvore.view = new Arvore(itens);
    },

    carregarCaixas: function() {
        var caixas   = document.getElementsByTagName("checkbox");
        var inversas = document.getElementsByAttribute("inverted", "true");

        for (var i = 0; i < caixas.length; i++)
            if (estaNaLista(caixas[i], inversas))
                caixas[i].checked = 
!obterBooleana(caixas[i].getAttribute("preference"));
            else
                caixas[i].checked =  
obterBooleana(caixas[i].getAttribute("preference"));

        this.atualizarCaixa();
    },

    carregarCategorias: function() {
        var itens = this.popupCategorias.childNodes;
        var padrao = document.createElement("menuitem");

        for (var i = itens.length - 2; i > 0; i--)
            
this.popupCategorias.removeChild(this.popupCategorias.lastChild);

        if (!listaEstaVazia(this.categorias)) {
            this.separador.hidden = false;

            this.categorias = this.categorias.sort();
            for (i in this.categorias) {
                var menuitem = document.createElement("menuitem");
                menuitem.setAttribute("label", this.categorias[i]);
                menuitem.setAttribute("oncommand", 
"controledescripts.carregarArvore(\""+this.categorias[i]+"\");");
                this.popupCategorias.appendChild(menuitem);
            }
        }
        else
            this.separador.hidden = true;
    },

    carregarEventos: function(recarga) {
        if (recarga)
            for (var i = 0; i < this.tamanhoAnteriorEventos; i++)
                if (this.listaPermitidos.hasChildNodes)
                    
this.listaPermitidos.removeChild(this.listaPermitidos.lastChild);

        for (i in this.eventosValidos)
            this.listaPermitidos.appendItem(this.eventosValidos[i]);

        this.tamanhoAnteriorEventos = this.eventosValidos.length;
        this.atualizarBotoesEventos();
    },

    criarCategoria: function() {
       
    },

    iniciar: function() {
        this.iniciarItens();

        this.eventosValidos = 
obterString("dom.popup_allowed_events").split(" ");
        this.categorias = 
obterString("capability.policy.policynames").split(" ");

        if (listaEstaVazia(this.eventosValidos))
            this.eventosValidos.splice(0, 1);

        if (listaEstaVazia(this.categorias))
            this.categorias.splice(0, 1);

        this.tamanhoAnteriorEventos = this.eventosValidos.length;

        this.carregarCaixas();
        this.carregarEventos(false);
        this.carregarCategorias();
        this.carregarArvore("default");

        this.tempomaximo.value = obterInteiro("dom.max_script_run_time");
    },

    iniciarItens: function() {
        this.stringset = document.getElementById("prefs-strings");
        this.tabbox    = document.getElementById("prefs-tabbox");
        this.botaoAdicionarEvento = 
document.getElementById("basico-adicionar");
        this.botaoRemoverEvento   = 
document.getElementById("basico-remover");
        this.caixaContexto        = 
document.getElementById("outros-ocultarcontexto");
        this.caixaFerramentas     = 
document.getElementById("outros-ocultarmenu");
        this.caixaIcones          = 
document.getElementById("outros-exibiricones");
        this.listaDisponiveis     = 
document.getElementById("basico-disponiveis");
        this.listaPermitidos      = 
document.getElementById("basico-permitidos");
        this.tempomaximo          = 
document.getElementById("outros-tempomaximo");
        this.arvore          = document.getElementById("avancado-arvore");
        this.menuCategorias  = 
document.getElementById("avancado-categorias");
        this.popupCategorias = 
document.getElementById("avancado-categorias-popup");
        this.separador       = 
document.getElementById("avancado-separador");
    },

    removerEvento: function() {
        if (this.listaPermitidos.selectedItem) {
            var i = 
posicaoNaLista(this.listaPermitidos.selectedItem.getAttribute("label"), 
this.eventosValidos);
            this.eventosValidos.splice(i, 1);
            this.carregarEventos(true);
        }
    },

    removerPermissao: function() {
        if 
(confirm(this.stringset.getString("controledescripts.deletePermission")))
            this.arvore.view.removerItem();
    },

    salvar: function() {
        if (this.tempoValido()) {
            this.salvarCaixas();

            salvarString("dom.popup_allowed_events", 
this.eventosValidos.join(" "));
            salvarString("capability.policy.policynames", 
this.categorias.join(" "));
            salvarInteiro("dom.max_script_run_time", 
this.tempomaximo.value);

            return true;
        }

        return false;
    },

    salvarCaixas: function()
    {
        var caixas   = document.getElementsByTagName("checkbox");
        var inversas = document.getElementsByAttribute("inverted", "true");

        for (var i = 0; i < caixas.length; i++)
            if (estaNaLista(caixas[i], inversas))
                
salvarBooleana(caixas[i].getAttribute("preference"),!caixas[i].checked);
            else
                salvarBooleana(caixas[i].getAttribute("preference"), 
caixas[i].checked);
    },

    sobreEvento: function()
    {
        if (this.listaDisponiveis.selectedItem)
            openDialog("chrome://controledescripts/content/evento.xul",
                       "controledescripts-sobre", 
"chrome,centerscreen,modal",
                       
this.listaDisponiveis.selectedItem.getAttribute("label"));
    },

    tempoValido: function()
    {
        var valor   = this.tempomaximo.value;
        var inteiro = new RegExp(/^-?\d+$/);

        if (!valor || !inteiro.test(valor)) {
            this.tabbox.selectedIndex = 2;
            this.tempomaximo.focus();

            if (valor)
                
alert(this.stringset.getString("controledescripts.invalidInteger"));
            else
                
alert(this.stringset.getString("controledescripts.emptyBox"));

            return false;
        }

        return true;
    }
}


ARQUIVO 2
-----------------

function Arvore(itens) {
    this.itens = itens;
}

Arvore.prototype = {
    getCellText: function(linha,coluna) {
        var texto = new String();

        if (coluna.id == "avancado-propriedade")
            texto = this.itens[linha].propriedade;
        else
            switch (this.itens[linha].status) {
                case "noAccess":   texto = 
controledescripts.stringset.getString("controledescripts.block");break;
                case "allAccess":  texto = 
controledescripts.stringset.getString("controledescripts.allow");break;
                case "sameOrigin": texto = 
controledescripts.stringset.getString("controledescripts.sameorigin");break;
            }

        return texto;
    },

    adicionarItem: function(novoItem) {
        this.itens.push(novoItem);
        this.treebox.rowCountChanged(this.rowCount, 1);
    },

    removerItem: function() {
        var linha = this.selection.currentIndex;

        if (linha >= 0) {
            this.itens.splice(linha, 1);
            this.treebox.rowCountChanged(linha, -1);
        }
    },

    get rowCount(){ return this.itens.length; },
    getCellProperties: function(linha,coluna,props){},
    getColumnProperties: function(colid,coluna,props){},
    getImageSrc: function(linha,coluna){ return null; },
    getRowProperties: function(linha,props){},
    isContainer: function(linha){ return false; },
    isSeparator: function(linha){ return false; },
    isSorted: function(){ return false; },
    setTree: function(treebox){ this.treebox = treebox; }
}



		
_______________________________________________________ 
Yahoo! Mail - Sempre a melhor opção para você! 
Experimente já e veja as novidades. 
http://br.yahoo.com/mailbeta/tudonovo/
 



Mais detalhes sobre a lista de discussão mozbr-desenvolvimento