Criando um navegador avançado usando Gecko - Final

Para finalizar nosso projeto do Bluefox, nesta matéria vamos inserir toda a programação para o funcionamento do navegador.

Simplificando o desenvolvimento de APIs PHP com Swagger

Para finalizar nosso projeto, vamos programar agora todas as funcionalidades para que nosso navegador possa operar corretamente, para isto é exigido que você preste muita atenção, os códigos estão todos comentados.

Botão Voltar, de um duplo clique no botão para acessar o método Click:

Código 01:

//Volta uma página anterior.
//Back last page.
 geckoBrowser1.GoBack();

Botão Atualizar, de um duplo clique no botão para acessar o método Click:

Código 02:

//Atualiza a página.
//Refresh page.
geckoBrowser1.Refresh();

Botão Avançar, de um duplo clique no botão para acessar o método Click:

Código 03:

//Avança uma página.
//Foward one page
geckoBrowser1.GoForward();

Botão Home, este botão servirá para que quando o usuário clicar sobre ele, a página atual será definida como a página inicial, que é carregada quando o Browser é aberto.
Para isto é necessário declarar duas variáveis e atribuir como valor, o nome dos dois arquivos de texto.

Antes do método construtor (public frmBrowser()), insira os códigos abaixo.

Código 04:

//Definimos os nomes dos arquivos.
//Define neme from files.
string url  = "url.txt";
string home = "home.txt";

E por fim no método Click do botão Home insira o código responsável por gravar a URL definida como HOME em nosso Arquivo.

Código 05:

/*
Inclua using System.IO;
 Abre o arquivo para leitura, apagando o que esta escrito e escreve novamente, ao finalizar fecha a 'conexão' o arquivo.
*/

 StreamWriter sw = new StreamWriter(home); //Open file to write, and clear file before.
sw.WriteLine(txtUrl.Text); //write in file
 sw.Close(); //close file

Agora vamos criar um método responsável por salvar a URL, estas URL vão aparecer no ComboBox ou txtUrl, isto é um simples sistema de histórico, porém bem básico.

Abaixo todo o código comentado em português dentro de um summary, que está antes do método, isto ajuda muito, pois quando for chamar o método aparece uma descrição sobre o mesmo.

Código 06:

/// <summary>
        /// O Summary adiciona um comentário para o Método.
        /// O método abaixo verifica se a URL não existe no arquivo e se não é uma página em branco, se isto ocorrer
        /// a URL é gravada no arquivo.
        /// Primeiro é lido todo o arquivo em seguida comparado.
        /// Por último se a variável achou for igual a falso, então entra no IF.
        /// </summary>
        public void saveUrl()
        {

            string pagina = txtUrl.Text; //Pegamos o valor do endereço | Get value of Adress.
            bool achou = false; //The URL Dont exists in file, set Default.

            StreamReader sr = new StreamReader(url); //Open file to Read

            while (sr.EndOfStream == false) //While not find the end
            {
                string tempPage = sr.ReadLine();//Save value of line in Temp var.

                if (tempPage == pagina & tempPage != "about:blank")//Verify if URL don't exits or is not blank page
                {
                    achou = true; //If exists or is Blank page the value is true
                }
            }

            sr.Close(); //Close file

            if (!achou)//If URL don't exists, enter in IF
            {
                StreamWriter rw = new StreamWriter(url, true);//Open file to Write and not clear file
                rw.WriteLine(txtUrl.Text); //Save URL in new line
                rw.Close();//Close file
            }

        }

Agora de um duplo clique no evento KeyDown do componente txtUrl, vamos inserir os códigos de carregar a URL no Browser, Chamar o método de salvar URL.

Como vamos precisar carregar várias vezes a URL, vamos criar um método para isto, então é só chamar o mesmo, ele preenche o txtUrl com os endereços gravados no arquivo url.txt.

Código 07:

/// <summary>
/// Verificamos se a URL existe no arquivo, se existir exibe a mesma no txtUrl
/// </summary>
        public void carregarUrl()
        {
             StreamReader sr = new StreamReader(url); //Open file to Read

            while (sr.EndOfStream == false)//while file don't end.
            {
                string tempPage = sr.ReadLine();//Read the line and save in temp variable

                if (tempPage != null || tempPage != "about:blank")//if variable not null and not blank...
                {
                    txtUrl.Items.Add(tempPage);//Insert the line in txtUrl
                }
            }

            sr.Close();//Close file
        }

Agora precisamos de mais um método, um responsável por chamar os demais, alterar título e carregar a página, crie um método como mostrado no código a baixo.

Código 08:

      /// <summary>
        /// O método abaixo é responsável por abrir a página no Browser, 
        /// adicionar o link da página no título, chamar o método saveUrl e
        /// chamar o método carregarUrl.
        /// </summary>
        private void openPage()
        {
            geckoBrowser1.Navigate(txtUrl.Text); //Navigate to URL
            frmBluefox.ActiveForm.Text = txtUrl.Text + " - Gecko Browser"; //Set link to Title
            saveUrl(); //call method saveUrl
            carregarUrl(); //call method carregarUrl, fill txtUrl with values
        }

Finalmente no evento KeyDown do txtUrl insira o código a baixo, o mesmo executa as operações quando é pressionado o botão Enter.

Código 09:

        private void txtUrl_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)// Se pressionar a tecla enter, if press key Enter...
            {
                openPage(); //Chama o métod openPage, call method openPage()
            }
        }

No método Load do formulário, insira o código abaixo, logo que o Formulário é aberto preenchemos os endereços visitados no txtUrl e verificamos se tem alguma página definida como Home, se tiver carregamos a mesma.

Código 10:

/// <summary>
        /// O método load é quando o formulário é carregado.
        /// Aqui carregamos os links no txtUrl;
        /// Verificamos se contém alguma página definida como Home, se sim, abrimos ela quando o browser é carregado.
        /// </summary>
        private void frmBluefox_Load(object sender, EventArgs e)
        {
            carregarUrl();//Call method carregarUrl().

            StreamReader sr = new StreamReader(home); //Open file to read.

            while (sr.EndOfStream == false)//while not end file...
            {
                string temp = sr.ReadLine();//Read line and save in temp variable.

                if (temp != null) //if variable is not null and have one value..
                {
                    geckoBrowser1.Navigate(temp); //Navigate to page
                    txtUrl.Text = temp; //set txtUrl text with value of temp variable
                }
            }

            sr.Close(); //Close file
        }

Conforme vamos navegando pela imensidão da internet, os Links vão mudando, então demos ir atualizando o Link atual do txtUrl, para isto clique no geckoBrowser1 e no evento documentCompleted, que nada mais é do que quando a página termina de ser carregada.

Código 11:

        /// <summary>
        /// Após a página ser carregada, pegamos o link atual e inserimos no txtUrl.
        /// </summary>
        private void geckoBrowser1_DocumentCompleted(object sender, EventArgs e)
        {
            txtUrl.Text = geckoBrowser1.Url.ToString(); // Get Current Link and send to txtUrl
        }

Nosso navegador está quase pronto, só temos um pequeno problema, se selecionarmos algum item no txtUrl, precisamos pressionar Enter para navegar, isto não é legal nem mesmo usado pelo Browser, para resolver isto, quando for selecionado algum item, vamos carregar aquela URL.

No método txtUrl_SelectedIndexChanged(), precisamos chamar o método openPage().

Código 12:

        private void txtUrl_SelectedIndexChanged(object sender, EventArgs e)
        {
            openPage();//Call method openPage().
        }

E assim terminamos nosso projeto do Bluefox, espero que você tenha gostado.

Código 13:

using Skybound.Gecko;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Bluefox_Browser
{
    public partial class frmBluefox : Form
    {
        //Definimos os nomes dos arquivos.
        //Define neme from files.
        string url = "url.txt";
        string home = "home.txt";
        public frmBluefox()
        {
            InitializeComponent();
            Xpcom.Initialize(Environment.CurrentDirectory + "/xulrunner");
        }


        /// <summary>
        /// O método load é quando o formulário é carregado.
        /// Aqui carregamos os links no txtUrl;
        /// Verificamos se contém alguma página definida como Home, se sim, abrimos ela quando o browser é carregado.
        /// </summary>
        private void frmBluefox_Load(object sender, EventArgs e)
        {
            carregarUrl();//Call method carregarUrl().

            StreamReader sr = new StreamReader(home); //Open file to read.

            while (sr.EndOfStream == false)//while not end file...
            {
                string temp = sr.ReadLine();//Read line and save in temp variable.

                if (temp != null) //if variable is not null and have one value..
                {
                    geckoBrowser1.Navigate(temp); //Navigate to page
                    txtUrl.Text = temp; //set txtUrl text with value of temp variable
                }
            }

            sr.Close(); //Close file
        }

        private void btnBack_Click(object sender, EventArgs e)
        {
            //Volta uma página anterior.
            //Back last page.
            geckoBrowser1.GoBack();
        }

        private void btnRefresh_Click(object sender, EventArgs e)
        {
            //Atualiza a página.
            //Refresh page.
            geckoBrowser1.Refresh();
        }

        private void btnFoward_Click(object sender, EventArgs e)
        {
            //Avança uma página.
            //Foward one page
            geckoBrowser1.GoForward();
        }

        private void btnSetHome_Click(object sender, EventArgs e)
        {
            /*
             * Inclua using System.IO;
                Abre o arquivo para leitura, apagando o que esta escrito e escreve novamente, ao finalizar fecha a 'conexão' o arquivo.
             */
            StreamWriter sw = new StreamWriter(home); //Open file to write, and clear file before.
            sw.WriteLine(txtUrl.Text); //write in file
            sw.Close(); //close file
        }

        /// <summary>
        /// O Summary adiciona um comentário para o Método.
        /// O método abaixo verifica se a URL não existe no arquivo e se não é uma página em branco, se isto ocorrer
        /// a URL é gravada no arquivo.
        /// Primeiro é lido todo o arquivo em seguida comparado.
        /// Por último se a variável achou for igual a falso, então entra no IF.
        /// </summary>
        public void saveUrl()
        {

            string pagina = txtUrl.Text; //Pegamos o valor do endereço | Get value of Adress.
            bool achou = false; //The URL Dont exists in file, set Default.

            StreamReader sr = new StreamReader(url); //Open file to Read

            while (sr.EndOfStream == false) //While not find the end
            {
                string tempPage = sr.ReadLine();//Save value of line in Temp var.

                if (tempPage == pagina & tempPage != "about:blank")//Verify if URL don't exits or is not blank page
                {
                    achou = true; //If exists or is Blank page the value is true
                }
            }

            sr.Close(); //Close file

            if (!achou)//If URL don't exists, enter in IF
            {
                StreamWriter rw = new StreamWriter(url, true);//Open file to Write and not clear file
                rw.WriteLine(txtUrl.Text); //Save URL in new line
                rw.Close();//Close file
            }

        }

        private void geckoBrowser1_Click(object sender, EventArgs e)
        {

        }

        private void txtUrl_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)// Se pressionar a tecla enter, if press key Enter...
            {
                openPage(); //Chama o métod openPage, call method openPage()
            }
        }

        /// <summary>
        /// Verificamos se a URL existe no arquivo, se existir exibe a mesma no txtUrl
        /// </summary>
        public void carregarUrl()
        {
            StreamReader sr = new StreamReader(url); //Open file to Read

            while (sr.EndOfStream == false)//while file don't end.
            {
                string tempPage = sr.ReadLine();//Read the line and save in temp variable

                if (tempPage != null || tempPage != "about:blank")//if variable not null and not blank...
                {
                    txtUrl.Items.Add(tempPage);//Insert the line in txtUrl
                }
            }

            sr.Close();//Close file
        }

        /// <summary>
        /// O método abaixo é responsável por abrir a página no Browser, 
        /// adicionar o link da página no título, chamar o método saveUrl e
        /// chamar o método carregarUrl.
        /// </summary>
        private void openPage()
        {
            geckoBrowser1.Navigate(txtUrl.Text); //Navigate to URL
            frmBluefox.ActiveForm.Text = txtUrl.Text + " - Gecko Browser"; //Set link to Title
            saveUrl(); //call method saveUrl
            carregarUrl(); //call method carregarUrl, fill txtUrl with values
        }

        private void txtUrl_SelectedIndexChanged(object sender, EventArgs e)
        {
            openPage();
        }

        /// <summary>
        /// Após a página ser carregada, pegamos o link atual e inserimos no txtUrl.
        /// </summary>
        private void geckoBrowser1_DocumentCompleted(object sender, EventArgs e)
        {
            txtUrl.Text = geckoBrowser1.Url.ToString(); // Get Current Link and send to txtUrl
        }

    }
}