Prionace - Gerenciador de Arquivos em Java

Olá, pessoal!

Quero apresentar a vocês um projeto que comecei já faz algum tempo para uso pessoal e que agora resolvi compartilhar. Trata-se de um gerenciador de arquivos inspirado no Nautilus e no Thunar que desenvolvi (e ainda está em desenvolvimento) utilizando Java com JFC/Swing.

Para baixar a última versão estável: https://prionace.googlecode.com/files/prionace-0.8.3.jar

Por que Java?

A ideia de desenvolver um gerenciador de arquivos veio quando tive que trocar de computador no trabalho. No processo, tive que copiar alguns arquivos manualmente por conta de um descuido no backup do antigo para o novo. Foi aí que me dei conta do quão ineficiente é o Windows Explorer e seu modo de navegação por um diretório de cada vez. O antigo Gerenciador de Arquivos do Windows 3.1 era melhor nesse aspecto, pois permitia que a janela fosse dividida e mostrasse o conteúdo de várias pastas ao mesmo tempo. Então eu pensei: “Será que existe para Windows algum gerenciador de arquivos similar aos que existem para Linux?”

Tive que recorrer à Internet para ver o que eu podia encontrar. O aplicativo tinha que ser aberto ou, no mínimo gratuito, mas infelizmente não encontrei nada que me agradasse ou que tivesse as características que eu precisava. Então me fiz a pergunta: “Por que não fazer um?” Dessa forma eu estaria resolvendo o meu problema, melhorando as minhas aptidões quanto à programação e ainda me divertindo no processo.

Inicialmente, pensei em desenvolver o gerenciador de arquivos em C++ utilizando Qt, mas havia um pequeno problema nessa abordagem: a intenção de criar o gerenciador era usar no computador do trabalho, só que lá eu não tenho compilador para essa linguagem, e em casa só uso Linux, não possuo (nem pretendo possuir) uma licença do Windows. Minha alternativa foi usar Java, cujo lema ?compile once, run anywhere? permitia que eu usasse meu laptop pessoal para o desenvolvimento com a garantia de que funcionaria no computador do trabalho, onde todos os PCs possuem pelo menos JRE 6.

Prionace

Todo software precisa de um nome e, quando o projeto estava em sua fase inicial, ainda não tinha um, era chamado apenas de “Navegador de Arquivos”. Um amigo sugeriu que eu usasse o nome de algum animal da nossa fauna. Gostei da ideia e fiz uma rápida pesquisa para saber que tipo de bicho poderia representar um navegador de arquivos. O escolhido foi o Tubarão Azul, que é capaz de navegar grandes distâncias. Podendo ser encontrado em águas de todo o mundo, um deles foi monitorado por biólogos em Nova York e recapturado pouco tempo depois no Brasil, percorrendo uma distância de mais de 6 mil quilômetros[1]. O nome científico do tubarão azul é Prionace Glauca, daí o nome do projeto.

Características

Ao abrir Prionace, aparecerá um ícone na barra de tarefas com o qual o usuário poderá abrir outras janelas, acessar atalhos ou finalizar o programa. A janela possui interface de navegação por abas. Na parte superior da janela fica a barra de caminho e do lado esquerdo a barra de atalhos. A barra de atalhos tem o objetivo de facilitar o acesso a pastas que são muito acessadas e que possuem caminho muito longo. Para criar um atalho basta arrastar uma pasta até lá. Do lado direito da janela estão os arquivos, que são visualizados em ícones ou miniaturas (thumbnails, no caso de arquivos de imagens), mas um programador pode facilmente criar outras formas de visualização, como a visualização por detalhes ou por lista, útil para muitas pessoas (e que ainda não fiz por falta de tempo, mas aceito ajuda). Para criar uma visualização nova basta estender a classe Viewer, no pacote org.fba.prionace.ui.viewer e basicamente trabalhar em cima do método refreshFiles(), que é responsável por efetivamente mostrar os arquivos na janela. Quem estiver disposto, pode usar a imaginação e criar visualizações totalmente novas. Quem sabe fazer algo parecido com o que aparece no computador da Stark Industries no primeiro filme do Homem de Ferro quando a personagem Pepper Potts copia arquivos em um pen drive?

Os arquivos são identificados por seu mime type[2], e não por sua extensão como é comum no Windows. Isso significa que extensões de nome de arquivo são praticamente irrelevantes. Um arquivo de imagem JPEG não se transforma em música se for renomeado para .MP3, porém o Windows Explorer é não é capaz de saber esse detalhe e abrirá o tocador de música padrão para processar o arquivo, resultando em erro. O reconhecimento de um arquivo pelo seu conteúdo, e não apenas pelo nome, faz com que esse tipo de engano não aconteça.

Os mime types de Prionace seguem o padrão IANA[3] e são identificados por intermédio do projeto Apache Tika[4]. Ao clicar duas vezes sobre um arquivo, seu mime type será identificado e um box se abrirá para que o usuário informe o caminho do executável que deve ser usado para abrir esse tipo de arquivo. Essa informação será gravada para que, da próxima vez que o usuário clicar em um arquivo de mesmo tipo, o software correto para manipulá-lo seja aberto. Nos primeiros usos isso pode ser meio chato, mas depois de abrir alguns arquivos de tipos diferentes essa sintonia fina será feita e a ação torna-se-á desnecessária, porém aqui temos um problema: esse processo não é muito amigável e usuários comuns e de pouco conhecimento terão dificuldades. Se alguém tiver alguma ideia de como contornar isso e que funcione multiplataformamente (acabei de inventar essa palavra hehe), por favor, me ajude, estou aberto a sugestões. Para saber quais são os mime types reconhecidos pelo Apache Tika (e consequentemente pelo Prionace), consulte o arquivo mimetypes, em anexo.

Configurações são armazenadas no diretório padrão do usuário (/home/<usuário> no Linux e Mac; Documents And Settings<usuário> no Windows) em um subdiretório chamado .prionace. Lá estão guardadas informações de associações de arquivos, atalhos, miniaturas e ícones personalizados. Associações e atalhos são gravados em arquivos XML fáceis de entender e editar no seu editor de textos favorito. Miniaturas são criadas para arquivos de imagem, e têm por objetivo agilizar o processo de exibição delas dentro do gerenciador. Um diretório com muitas imagens grandes poderia se tornar lento para acessar se as miniaturas fossem criadas todas as vezes no momento do acesso. Pensando nisso, criei um subdiretório para as miniaturas. Na primeira vez que pastas contendo arquivos de imagens forem abertas, ícones genéricos de imagem serão exibidos enquanto uma thread é iniciada com a função de criar as miniaturas. Na próxima vez que a pasta for acessada, os ícones serão substituídos pelas miniaturas correspondentes.

Um terceiro subdiretório pode ser criado pelo usuário dentro de .prionace para a personalização de ícones. Este subdiretório deverá chamar-se mimetypes e ser populado com arquivos de imagem PNG com o nome do mime type correspondente, ou folder.png para ícones de pastas, ou file.png para ícones de arquivos cujo mime type não pôde ser identificado. Por exemplo, caso o usuário não goste do ícone padrão para pastas, basta procurar uma outra imagem na Internet (preferencialmente de tamanho 48x48 pixels), gravar essa imagem no subdiretório mimetypes e renomeá-lo para folder.png. Depois é só dar um refresh (tecla F5) na janela do Prionace e voilà, os ícones para representar pastas passam a ser o escolhido pelo usuário. Outro exemplo, eu sei que o tipo mime de arquivos MP3 é audio/mpeg. Para alterar o ícone padrão desse tipo de arquivo o processo é o mesmo, ou seja, basta procurar um arquivo que combine com MP3, gravá-lo no subdiretório mimetypes e renomeá-lo para audio-mpeg.png. Atenção apenas para o detalhe da troca da barra (/) de audio/mpeg por um sinal de menos (-), além da terminação .png. Para criar as miniaturas, o projeto imgscalr[6] foi utilizado. Em anexo está um arquivo de ícones que empacotei como exemplo. Basta descompactá-lo em seu diretório padrão de usuário. Os ícones fazem parte do projeto Faenza Icon Theme[5]. Dica: o site http://gnome-look.org/ está repleto de temas de ícones (dentre outras coisas). É uma boa fonte para criar temas de ícones para o Prionace bastando apenas renomear arquivos quando necessário.

Algumas teclas de atalho são utilizadas na navegação:

F1 - Abre janela de diálogo com informações sobre o software.
F2 - Renomeia o arquivo selecionado. Se mais de um arquivo estiver selecionado, renomeia o primeiro.
F5 - Atualiza a janela (também Ctrl+R).
Del - Remove um arquivo do disco. Importante: não possui lixeira!
Ctrl+W - Fecha a aba atual.
Ctrl+R - Atualiza a janela (também F5).
Ctrl+I - Inverte a seleção atual.
Ctrl+A - Seleciona todos os arquivos.
Ctrl+Shift+A - Desmarca a seleção ativa.
Ctrl+S - Abre uma janela de diálogo para que o usuário informe um padrão Regex[7] e uma seleção de arquivos com base nele será feita.
Ctrl+H - Exibe/esconde arquivos de sistema ocultos.
Ctrl+L - Abre uma janela de diálogo para que o usuário informe o caminho para o qual deseja mudar.

Código-fonte

Prionace está disponível sob GPLv3 no Google Code. Para fazer o download do código-fonte, crie um diretório e digite o seguinte comando em uma janela de terminal ou prompt de comando:

$ git clone https://code.google.com/p/prionace/

O programa git pode ser baixado no site http://git-scm.com/ ou através do repositório de sua distribuição GNU/Linux, caso esteja utilizando uma. Também é possível obter o código-fonte de Prionace diretamente da página do projeto[8].

O projeto Prionace utiliza o Apache Maven[9] como ferramenta de automação. Ele permite que os projetos de terceiros Imgscalr e Apache Tika não tenham a necessidade de ser empacotados junto com o código-fonte de Prionace. Em vez disso, eles são baixados da Internet no momento da compilação.

Algumas classes interessantes para começar a explorar são as classes Viewer e IconsViewer, responsáveis diretas pela apresentação dos arquivos na tela. A classe TransitionEffect também é bem interessante. Como o nome indica, é ela que faz o efeito de transição ao mudar de diretório utilizando recursos Java2D. Extensões desta classe podem ser feitas com efeitos criados por você (quem sabe usando JOGL[10] :wink: ) e usadas por seus Viewers.

Problemas existem, outras coisas podem ser melhoradas, mas seria melhor se eu não tivesse que fazer tudo sozinho. Se alguém se dispor a ajudar, eu agradeço. Por exemplo, um menu pop-up poderia ser bastante útil com opções para criar pastas, abrir arquivos com outros executáveis, etc.

Também não descobri como fazer para que os arquivos sejam atualizados automaticamente caso haja alteração (remoção ou criação de arquivos) no diretório atual.

É preciso criar uma forma de excluir ou mudar a ordem dos atalhos da barra de atalhos, talvez com uma janela gerenciadora do tipo “organizar favoritos”.

Enfim, algumas coisas ainda precisam ser feitas e farei quando tiver algum tempo. Mas o fato é que Prionace já está bastante funcional e pode ser usado (com algumas restrições) em ambientes de produção. Espero que vocês se divirtam com ele da mesma forma que eu me diverti escrevendo seu código. Se tiverem quaisquer dúvidas ou sugestões, sintam-se à vontade para se manifestarem.

Um abraço a todos,
Francivan Bezerra

[1] Discovery Brasil: http://discoverybrasil.uol.com.br/tubaroes/mergulhovirtual/
[2] Wikipédia: http://pt.wikipedia.org/wiki/MIME
[3] IANA Media Types: http://www.iana.org/assignments/media-types
[4] Apache Tika: http://tika.apache.org/
[5] Faenza Icon Theme: https://code.google.com/p/faenza-icon-theme/
[6] imgscalr: http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/
[7] Wikipédia: http://pt.wikipedia.org/wiki/Expressão_regular
[8] Prionace (código-fonte): http://code.google.com/p/prionace/source/browse/
[9] Apache Maven: http://maven.apache.org/
[10] Java Binding for OpenGL API: https://jogamp.org/jogl/www/

Fiz o download aqui e achei bem interessante! Parabéns!!! Quanto tempo levou para desenvolver?

Do início do desenvolvimento até o estágio em que está levei aproximadamente 11 meses. Mas não trabalhei nele o tempo todo. Nesse período houve meses que eu nem toquei no código.

Para os iniciantes em Java preparei três pequenos tutoriais com instruções de como configurar com Maven os IDEs Eclipse, NetBeans e IntelliJ Idea.
Em anexo, o primeiro, com instruções sobre como configurar o Eclipse.

E aqui, os outros dois que mostram como configurar o NetBeans e o IntelliJ IDEA.

Opa, blza?
Parabéns.

Sugestão: Coloca no github e em vez de pdf cria a wiki.

Abraço.

Já estou testando.

Muito legal…

Parabéns!! Parece ser bem interessante msm. Quando chegar em casa vou baixar para testar!

cara eu não li tudo oq vc escreveu ali, mais oq ele faz que o windows ou linux não fazem que eu não entendi

[color=olive]barbariade , Paraabéns fba.rio !
Realmente parece ser muito interessante , quando chegar
em casa vou dar um teste também :shock: [/color]

Cara, parabéns!

Acabei de testar. Show de bola.

Quando chegar em casa vou baixar o código fonte!