lunedì 12 ottobre 2009

Creare un menu popup

Oggi ho imparato a creare popup menu...

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PopupMenuExamle {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(100, 100);

        final JPopupMenu popup = new JPopupMenu() {{

            add(new JMenuItem("aaa"));
            add(new JMenuItem("bbb"));
            add(new JMenuItem("ccc"));
        }};

        addPopupMenuTo(popup, frame);

    }

    private static void addPopupMenuTo(final JPopupMenu popup, Container dest) {
        dest.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
                maybeShowPopup(e);
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                maybeShowPopup(e);
            }

            private void maybeShowPopup(MouseEvent e) {
                if (e.isPopupTrigger()) {
                    popup.show(e.getComponent(),
                            e.getX(), e.getY());
                }
            }
        });
    }
}

Creare una finestra trascinabile in Java

Oggi ho fatto un po' di esercizio con Swing di Java. Swing è uno dei GUI toolkit di Java ed è utile conoscerlo perché è compreso nella piattaforma Java. Swing non è l'unica scelta, ne esistono altre, sul web ci sono alcune risorse che vi possono aiutare nella scelta.

Pero' io ho provato con Swing. Volevo provare una draggable window, una finestra senza bordi che si può spostare trascinandola con il mouse. Ecco il risultato:

import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JWindow;

public class DraggableBorderlessWindow {

    public static void main(String[] args) {
        final JWindow win = new JWindow();

        makeDraggable(win);

        win.setSize(100, 100);
        win.setVisible(true);
        win.setLocation(100, 100);
    }

    private static void makeDraggable(final Container window) {
        MouseAdapter dragger = new Dragger(window);
        window.addMouseMotionListener(dragger);
        window.addMouseListener(dragger);
    }

    private static class Dragger extends MouseAdapter {

        private int offsetX;
        private int offsetY;
        private final Container window;

        public Dragger(Container window) {
            this.window = window;
        }

        @Override
        public void mousePressed(MouseEvent e) {
            offsetX = window.getX() - e.getXOnScreen();
            offsetY = window.getY() - e.getYOnScreen();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            window.setLocation(e.getXOnScreen() + offsetX,
                               e.getYOnScreen() + offsetY);
        }

    }
}

martedì 6 ottobre 2009

Fuffa

Sapreste spiegare cosa fa il vostro prodotto in modo conciso e chiaro in modo da invogliare i potenziali clienti? Oppure vi vergognate tanto di dire cosa realmente fa il vostro prodotto da
sembrarvi riduttivo dirlo e ci girate intorno?

Facciamo un esempio preso dalla pagina ufficiale di un prodotto a caso.
Il target di questo prodotto sono sviluppatori Java. Il nome del prodotto è stato nascosto sotto delle anonime XXXXX. (Non voglio problemi e quindi cancellerò qualsiasi commento che dica il nome vero del prodotto)

Ecco l'esempio:
XXXXX is an award-winning productivity tool for Java EE development. It enables your team to complete more features, fix more bugs, and release quality software on schedule and under budget by eliminating time-wasting build and redeploy phases. Your whole team can use the free 30-day evaluation.

In tutto ci sono 296 caratteri, vediamo quanti di questi sono utili.
I primi sei caratteri (contando lo spazio) sono utili, dicono il nome del prodotto.
Analizziamo il resto.

"is an award-winning productivity tool ".
Bene. Si tratta un prodotto che ha vinto premi (tipo l'oscar immagino) ed un productivity tool. Probabilmente un tool che "aumenta la produttività" ... di solito i tool si comprano pensando che la produttività aumenti. Insomma 38 caratteri di fuffa.

"for Java EE development. ".
Ahh sappiamo almeno il campo di applicazione! Caratteri utili: 25.
Totale parziale: 31 utili, 38 fuffa.

"It enables your team to complete more features, fix more bugs, and release quality software on schedule and under budget ".
Wow! Ma che cosa è una nuova metodologia di sviluppo?
E' una sfera di cristallo che legge nella mente del committente?
E' una sorta di tempo liofilizzato da usare quando si arriva la scadenza?
O sono le solite balle, un po' come quando ci ha detto che è un tool che aumenta la produttività? Insomma: 121 caratteri sprecati.
Totale parziale: 31 utili, 159 fuffa.

by eliminating time-wasting build and redeploy phases. "
Ahh, finalmente. Qualcosa si capisce. Ha a che fare con la fase di build e redeploy.
Non ho ancora capito a cosa serve ma un idea ce l'ho.
Caratteri utili: 55
Totale parziale: 86 utili, 159 fuffa.

"Your whole team can use the free 30-day evaluation. "
Questa è un informazione sul periodo di prova, è utile ma non entra nel conteggio, ne in bene ne in male.

Tirando le somme abbiamo:
Caratteri utili: 86
Caratteri fuffa: 159
Percentuale fuffa: 86/159 = 54%

Adesso miglioriamolo

Le parti utili sono:
  • XXXXX is a tool
  • for Java EE development
  • eliminating time-wasting build and redeploy phases.

Facciamo una prova:

XXXXX is a tool that eliminates the build and redeploy phases in Java EE development.

E' ancora oscuro ma è molto meno rumoroso. Possiamo fare di meglio. Studiamo cosa fa realmente e magari facciamoci aiutare da wikipedia.
XXXXX is a plugin for the Java Virtual Machine that enables on-the-fly reloading of changes made to Java class files.

Mettiamo tutto assieme:
XXXXX is a plugin for the Java Virtual Machine that enables on-the-fly reloading of changes made to Java class files. This is great because you can actually change source code when debugging and, more importantly, works also with Java EE applications servers.

Conteggio fuffa:
  • "XXXXX is a plugin for the Java Virtual Machine that enables on-the-fly reloading of changes made to Java class files. " -> 118 utili
  • "This is great because " -> 22 fuffa
  • "you can actually change source code when debugging and, " -> 56 utili
  • "more importantly, " -> 18 fuffa
  • "works also with Java EE applications servers." -gt; 45 utili

Caratteri utili: 118+56+45 = 219
Caratteri fuffa: 22+18 = 40
Percentuale fuffa: 40/219 = 18%

PS: Se pensate che ho sbagliato qualche conto probabilmente avete ragione

domenica 4 ottobre 2009

Utilities for managing svn:ignore properties

I've just created a few commands for simplifying the usage of svn:ignore property of Subversion from command line. You can download, and see the sources on the project page.

The usage is simple, typing:
svn-ignore-add path/to/file-to-ignore
will append to the current svn:ignore property of "path/to" the string "file-to-ignore".

The project was written in Bash with TDD.
The xUnit framework used is an modified version of shunit2 that I hacked sometime ago for the trash-cli project.

sabato 3 ottobre 2009

My Small Software Pomodoro Timer

I've just created my own home made software Pomodoro Timer. 
Unlike other timers has a very simple interface.

Features/bugs:
  • Left time always visible.
  • You can drag the window where you want.
  • The interface is minimalist (less features, simpler interface)
  • The window waste less than 3k pixel of your screen.
  • Only three actions: start, stop, close
  • No Sounds
  • Works on Windows Only
  • Sources available.
  • Free download

Screenshots:
  • Start!
  • Running: