terça-feira, 27 de novembro de 2007

O grande livrão verde do SWT

Eu tava procurando coisas sobre SWT na internet.. Tem muita coisa legal, e muita coisa espalhada, além do grande guia do site do eclipse.
Daí eu tava pensando, vou criar um grande livrão verde, ensinando aos usuários de Swing como portar as aplicações pra SWT sem maiores dificuldades, relacionando cada item do Swing ao seu correspondente em SWT.

Deve ficar pronto até o dia 15.

Té mais o/

segunda-feira, 19 de novembro de 2007

Exibindo (e dimensionando) uma imagem no SWT

Existe um monte de jeito de fazer isso, esse aqui é o mais fofinho... Ele exibe a imagem dentro de um Canvas, e toda vez que ele precisa repintar a imagem, ele dimensiona de acordo com o tamanho do "container" (composite) pai.

Eis o código:


final Composite composite = new Composite(shell, SWT.NONE);
final Image image = SWTResourceManager.getImage(PrincipalSWT.class, "/com/trabalho/imgs/imagem.jpg");
final int width = image.getBounds().width;
final int height = image.getBounds().height;

Canvas canvas = new Canvas(composite, SWT.NONE);
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
e.gc.drawImage( image, 0, 0, width, height, 0, 0,
(int) composite.getSize().x, (int)composite.getSize().y );
}
});

Peguei o código e adaptei daqui

Por hoje, é isso...
Té mais o/

sexta-feira, 16 de novembro de 2007

Autoincrement no Firebird

Uma das coisas chatas de usar o Firebird é que ele não tem o campo autoincrement (ou pelo menos não tinha até essa postagem). Isso é particularmente chato, porque o autoincrement é legal, e facilita a vida do programador.

Tá, vamos aos códigos.

Primeiro, deve-se criar um Generator. Um generator é um gerador de números que o banco de dados usa pra fazer o controle dessas coisas.

Importante: Se houver mais de um campo autoincrement no banco de dados, será necessária a criação de um generator pra cada um.

Suponhamos que queira o campo "codigo" da tabela "aluno" seja autoincrement. Primeiro cria-se o gerador "gen_cod_aluno":

CREATE GENERATOR gen_cod_aluno;

Agora deve-ser criar uma trigger para que esse gerador seja incrementado cada vez que o usuário tentar inserir algum valor no banco de dados:

CREATE TRIGGER FOR aluno
ACTIVE BEFORE INSERT POSITION 0 AS
BEGIN
NEW.codigo = GEN_ID(gen_cod_aluno,1);
END;

Traduzindo, criou-se uma trigger para a tabela aluno, que será ativada antes que um registro seja inserido, atribuindo ao campo "codigo" o valor armazenado em "gen_cod_aluno", somado a 1.

De novo, pra cada campo autoincrement, uma trigger e um generator.

Té mais o/

terça-feira, 13 de novembro de 2007

Retirando a seleção em uma tabela no SWT

Hoje, quando eu tava mexendo com uma Table no SWT, percebi que quando a pessoa clica em um item, esse item fica selecionado até que o usuário clique em outro item. Isso pode ser útil pra alguém, mas acho mais legal que o item continue selecionado até que o usuário clique em outro componente, ou quando o usuário clicar em uma linha vazia da tabela.

Pra resolver isso, tem essa gambiarrinha aqui ó:


Table table = new Table(shell, SWT.FULL_SELECTION
| SWT.BORDER);

table.addMouseListener(new MouseAdapter() {
public void mouseDown(final MouseEvent arg0) {
if (table.getItem(new Point(arg0.x, arg0.y)) == null) {
//Se o usuário clica em uma linha vazia
table.deselectAll();
}
}
});
table.addFocusListener(new FocusAdapter() {
public void focusLost(final FocusEvent arg0) {
//Se o usuário clica em outro componente
table.deselectAll();
}
});


Era isso, Té mais o/

segunda-feira, 12 de novembro de 2007

Multithreading com SWT

Antes de mais nada, um pequeno comentário de um usuário de Swing, em relação ao SWT:

Ô coisa complicada do demo!


Tá. Desespero de lado, vamos ao que interessa: Acessando elementos gráficos do SWT através de uma outra thread.

Vamos dizer que eu tenho um programa, que tem que monitorar o banco de dados, de 5 em 5 segundos, e colocar o valor de um campo em um Text (o equivalente SWT ao JTextField).
Primeiro, criamos o Text:


Text campoText = new Text(composite, SWT.BORDER);


Beleza. Agora, se a gente tenta acessar ele através de uma outra Thread, o maldito "Invalid Thread access" aparece, indicando que a gente tem que mudar de estratégia.

O que deve ser feito? Criar uma Thread mais ou menos assim:


final Thread t = new Thread(){
public void run(){
while(true){
Display display = shell.getDisplay();
if(display == null || display.isDisposed()) return;
display.asyncExec(new Runnable() { //Início do Runnable
public void run() {
String str = pegaCampoDaTabelaTal();
campoText.setText(str);
}
}); //Fim do Runnable
try { // Tenta dormir (FORA do Runnable)
sleep(5000); // 5 segundos
} catch (InterruptedException e) {}
} // Fim do while
} //Fim do método run
}; // Fim da Thread
t.start(); // Inicia a Thread \o/


Com o trecho de código acima, é possível acessar campoText através da Thread t, sem dor, só alegria!

Um pequeno parênteses: Existe uma diferença bem grande entre os métodos asyncExec() e syncExec().
O primeiro é executado pela segunda Thread sem que a primeira Thread (a principal) seja notificada. Já o segundo vai suspender a thread principal até que o segundo Runnable (linha 6) seja finalizada. Como no nosso caso, é mais interessante que o programa continue lépido e fagueiro.

Té mais o/

segunda-feira, 5 de novembro de 2007

Negrito e itálico no Google Talk

Eu sei que muita gente sabe, e acha que é banal, mas muita gente não sabe que dá pra escrever em negrito e itálico no GTalk. Eu e o Highlander descobrimos o código meio que no susto (o negrito eu descobri por sorte; o itálico, o Highlander descobriu por tentativa e erro).

Negrito: Escreva a frase entre *.
Exemplo: *Texto* = Texto

Itálico: Escreva a frase entre _.
Exemplo: _Texto_ = Texto

Edit: Agora existe também o riscado (tachado). Basta escrever a frase entre -.
Exemplo: -Texto- = Texto



Espero que mudem a vida de vocês como mudou a minha... :P

Té mais o/

sábado, 3 de novembro de 2007

Meme - Livro das revelações [Parte II ]

Bom ja que fui desafiado e meu blog se auto-destroiu-se a si próprio, postarei aqui o desafio.

Também encontrei um problema semelhante ao do preco ao pegar o livro mais proximo, o livro mais proximo na página 161 tinha apenas uma frase e era "anotações" era um guia prático de dreamweaver o_O enfim, ai peguei o que tava embaixo dele e la vai:


Você não pode levá-lo dessa vida, de modo que é melhor se dar os parabéns por um trabalho bem-feito.

do livro Mulheres boazinhas não enriquecem de Lois P. Frankel

ta, eu sei que é parece desculpa, mas, o livro é da minha mãe!!
;)

sexta-feira, 2 de novembro de 2007

Meme - Livro das revelações

AHuhauhahua
O Sacolão me convidou pra um meme. Mais ou menos assim:

1. Pegar o livro mais próximo.
2. Abrir na página 161;
3. Procurar a 5ª frase completa;
4. Colocar a frase no blog;
5. Sem escolher a melhor frase nem o melhor livro (usar o mais próximo);
6. Passar o desafio a cinco pessoas.


Tá, vamo lá.
Os dois livros mais próximos daqui do pc não tinham 161 páginas, então acho que eles não contam como livros mais próximos. Daí eu fui na prateleira dos livros e peguei o que estava relativamente mais próximo, usando um cálculo Bayesiano que demorou 2 dias e meio. O resultado premiou o livro "Os segredos da mente milionária", do T. Harv Eker. A frase foi a seguinte:

Quando identificar tais pensamentos, comece a substituí-los de forma consciente por outros que o fortaleçam.


Confesso que não é a frase mais marcante do livro, mas regras são regras.

Agora repasso o meme (memes têm um quê de corrente, não?) para os amigos:

Mor
Guilherme
Niler
Tabexa