Reinventando a roda: criando um editor de texto (quase) do zero

Boa tarde, amigos.

2014 chegando e eu estou querendo iniciar um projeto pessoal que há muito tenho imaginado mas pelo qual pouco tenho feito. Pois bem, estou me organizando para começá-lo em breve, além de estudar coisas que poderão me ser úteis, como C++, Java, Qt e Android.

Sem mais delongas (ou com mais delongas), preciso de dicas, ajudas e afins em dois tópicos distintos mas complementares. O meu objetivo, basicamente, é criar um Editor de Textos.

Claro, há algumas diferenças significativas, senão seria apenas uma questão de me basear em ferramentas já existentes (como JEditorPane/JTextPane do Java) e fazer as devidas alterações, ou mesmo utilizar um editor já existente (LibreOffice, Abiword). A motivação por trás desse software e as diferenças não são o foco aqui porque, embora existam boas opções similares ao que pretendo por aí, eu irei desenvolver mesmo assim (por isso o “reinventar a roda” no título :slight_smile: ).

Os dois assuntos nos quais quero recomendações são:

1 - Criar uma especificação de documento

Falando a grosso modo, quero criar a especificação que diz como o documento deve ser estruturado, validado e armazenado. Algo como o Open Document ou o Office OpenXML, mas obviamente mais simples, e que irá crescer com o tempo. Minha ideia é utilizar uma notação XML como base, mas não fui além de definir isso. Pretendo suportar mais de um idioma (ao menos os que possuem um alfabeto próximo do nosso), então a especificação deve prever esse suporte. Provavelmente o formato não precisará embutir elementos que não sejam texto (como imagens) e outros elementos (como tabelas e linhas) serão definidos como tags, ficando a cargo do aplicativo interpretá-los e fazer a renderização de acordo.

2 - Criar um editor para a especificação de documento

Como pretendo suportar mais de um tipo de dispositivo (computadores, smartphones e tablets), provavelmente utilizarei um framework multiplataforma (como o Qt), mas a questão principal nesse caso é saber os conceitos envolvidos em um aplicativo desse tipo, sendo que ele vai ser desenvolvido desde as bases (ou seja, desenhando os elementos em 2D, atualizando esses elementos, fazendo rolagem de tela, visualização, copiar/colar/recortar, seleção, cursor, etc). Gostaria de dicas e técnicas para lidar com esse tipo de coisa. Por exemplo, como exibir o cursor do texto piscante, ou como destacar um trecho selecionado do texto, etc.

Considerações Finais:

Sei que este não é um assunto exatamente simples e rápido. Não é algo que pretendo terminar em pouco tempo nem fazer às pressas, será um projeto de longo prazo (alguns anos). Não é também muito fácil de se achar referências fazendo buscas (principalmente porque assuntos como “criar editor de textos” e “document model” direcionam para coisas diversas do que eu espero), por isso estou pedindo ajuda diretamente.

O que eu desejo não é tanto dicas, mas bibliografias e afins que me permitam pesquisar por conta própria esses assuntos, sejam livros, artigos, publicações, etc. Outra forma de ajudar seria indicar fóruns e grupos de discussão aos quais eu possa consultar a respeito.

Material tanto em português quanto inglês será bem vindo.

Abraço.

Que tal estudar os fontes do OpenOffice?

http://download.openoffice.org/source/

Já que vai criar um editor de texto, desenha as letras por pixels também.

Recomendo que leia a série sobre fontes do Java:
http://docs.oracle.com/javase/tutorial/2d/text/fontconcepts.html

Já tem conceitos bem legais.

Também é bem importante ler sobre codificação Unicode:

Se for fazer bem no braço, o básico seria ver como desenhar fontes na OpenGL:
http://www.opengl.org/archives/resources/features/fontsurvey/

Agora, faz tempo que não vejo artigos sobre textos. Provavelmente valeria a pena dar uma olhada em livros de computação gráfica específicos para esse assunto.

[quote=cristianogro]Que tal estudar os fontes do OpenOffice?

http://download.openoffice.org/source/[/quote]

Se for pra estudar fontes, é melhor pegar o fonte de um editor de textos bem menor e com o código menos bagunçado, como o Abiword.

Ou mesmo pelo componente de textos do richfaces ou primefaces.

É um bom aprendizado, hoje em dia a maioria das pessoas só querem pegar coisas prontas e quase ninguém mais tem o espírito aventureiro de criar algo do zero só pra ver como é.

Agradeço desde já as dicas. Como eu disse e me reforçaram, é um trabalho longo. Para ficar mais claro (e talvez menos complicado), digo que não pretendo criar um editor top (MS Word, OO Writer), mas algo razoavelmente complexo, ao nível de Notepad++, Scintilla ou no máximo Wordpad.

Levarei um tempo para digerir a coisa toda, mas estou tomando nota do que estão me passando. Posso não postar a respeito, mas estará andando, ainda que devagar :slight_smile: .

Como citado pelo marcosalex, o fonte do OO é bastante complexo (até por englobar vários projetos - Writer, Base, Calc, etc). Poderá ser sim uma referência, mas não creio que seja uma muito viável nessa etapa inicial (até porque meu conhecimento de C++ ainda engatinha).

Eu sinceramente não entendi o que você quis dizer com esse comentário. Poderia explicar melhor? Tem a ver com o que o ViniGodoy postou abaixo a respeito de fontes?

ViniGodoy
Agradeço as dicas. Imaginei que você viria com boas referências. Lerei com calma no decorrer do tempo.

É uma das possibilidades que imagino, mas me pergunto se o uso de OpenGL não possa ser um fator limitante (apesar que o OpenGL é praticamente padronizado, mesmo em dispositivos móveis). Não creio que haverá problemas de desempenho por utilizar OpenGL, já que o foco será textos (provavelmente não haverá sequer figuras/imagens). Só me pergunto se desenhar diretamente cada caracter com OpenGL é um trabalho que compensa.

Esse é um ponto importante. Poderia recomendar alguma obra a respeito? Pois estou meio que sem referências ainda e não tive a oportunidade de consultar uma biblioteca mais completa e ver o que há a respeito (espero que me deixem entrar na da faculdade ainda :slight_smile: ).

É um caminho que pretendo seguir, mas quero testar algumas coisas por conta própria antes disso, para evitar me influenciar demais por código dos outros. Será interessante quando estiver na fase de “como implementar um recurso X” e quiser exemplos.

Essa é uma parte importante da coisa toda. E ter um projeto próprio é uma motivação a mais para evoluir. Agradeço o apoio.

Abraços.

O quão “baixo nível” você pretende ir? Pergunto isso porque o Qt oferece alguns recursos já prontos para facilitar tarefas como renderização de texto, copy paste, etc. Isso está dentro do que você espera, ou a idéia é ir para um trabalho mais manual ainda? (renderizar os elementos diretamente pela API do Windows ou X11? :slight_smile: )

Considerando que você queira usar essa pequena ajuda do framework, uma maneira de começar pode ser pelo componente QTextLayout. É o que está por trás daqueles componentes que são editores prontos como QTextEdit.

Andei estudando o código da ferramenta KDiff3 (um comparador de arquivos estilo WinMerge), os painéis de visualização das diferenças são baseados nesse componente. O objeto basicamente recebe um texto e instruções de formatação (que podem variar caracter a caracter, e incluir um cursor em determinada posição), e renderiza esse texto em um canvas.
Combinando esse cara com os eventos de mouse e teclado você terá um pequeno editor de textos (pelo menos a parte da GUI)

A sugestão do OpenGL é porque não sabia o quão “cabelos no peito” seria esse seu estudo. Se não for fazer um editor com figuras, texto que gira, etc. eu recomendaria usar os componentes do próprio QT mesmo.

Sei disso sobre o Qt (e outros frameworks). Há um pequeno impasse nesse momento, porque eu ainda não estou certo de qual nível pretendo seguir. Mas não pretendo codificar em cima as API’s dos sistemas (Windows/X11). Imagino que isso seria contraprodutivo (existe essa palavra?), além de pouco portável e mais complexo do que o necessário. Seria praticamente recriar um toolkit só pra fazer um editor de texto (de certa forma, foi o que o pessoal do OpenOfffice fez).

Parece uma boa base, verei com calma quando estiver mais seguro quanto ao Qt.

[quote]Andei estudando o código da ferramenta KDiff3 (um comparador de arquivos estilo WinMerge), os painéis de visualização das diferenças são baseados nesse componente. O objeto basicamente recebe um texto e instruções de formatação (que podem variar caracter a caracter, e incluir um cursor em determinada posição), e renderiza esse texto em um canvas.
Combinando esse cara com os eventos de mouse e teclado você terá um pequeno editor de textos (pelo menos a parte da GUI) [/quote]
Agradeço a dica. Irei anotar isso para estudar no futuro.

“Cabelos no peito” foi ótimo. :slight_smile:

Não acho que eu vou chegar a um nível tão baixo a ponto de usar OpenGL, mas isso não quer dizer que não seja uma possibilidade, nem que eu não pretenda estudar a respeito (afinal, muitos dos conceitos parecem se aplicar a outras tecnologias). Haverá uma “implementação padrão” digamos (em C++/Qt), mas pretendo deixar a possibilidade tanto de usar outros frameworks (mesmo com o trabalho de certa forma redundante que isso gera). E um editor em OpenGL seria uma experiência interessante.

Mas, colocando os pés no chão, meu objetivo seria um editor construído em cima de uma superfície de desenho (um canvas, por assim dizer). Em cima disso, eu teria que desenhar os caracteres, provendo alguma capacidade de formatação, seleção, cópia, controlar paginação, zoom, barras de rolagem, cursor (caret) e afins. Outras funcionalidades incluiriam algumas figuras em 2D (colunas, linhas, tabelas, etc), nada muito complexo nem que vá permitir um ajuste fino (como selecionar estilo de bordas e afins), ao menos não num primeiro momento.

Abraços.

Uma das coisas lindas do QT é que ele permite combinar componentes e opengl:
http://qt-project.org/doc/qt-5.0/qtquick/scenegraph-openglunderqml.html

Usa a WinAPI direto tem vários problemas. Além de ser super pouco produtivo, vai gerar uma aplicação para uma só plataforma. O ideal é mesmo usar um framework para encapsular o SO, nem que seja algo leve como wxWidgets ou a SDL.

Interessante. Isso permitiria utilizar OpenGL e ainda poder utilizar componentes prontos (botões, caixas de texto e afins). Parece um bom caminho a se seguir.

Ficar limitado a uma só plataforma é algo que eu certamente pretendo evitar (por isso considero usar Qt). Além disso, se tiver que aprender a WinAPI pra fazer as coisas, vou ficar mais maluco que o necessário.

Duas boas opções, pensarei a respeito quando for começar de fato a interface do programa. Por hora, é aprender C++ e planejar a estrutura da aplicação.

Sugestões anotadas, agora é estudar muito. Agradeço a todos pelas dicas, e mais dicas são bem vindas.

Abraços.