public void addCard(Card card) {
        if (listener.getType() == Zone.HAND) {

            /* Add a non-basic land card in a proper lixicographical position
             * or before the first found basic land. Basic lands are always added
             * at the end.
             */
            boolean done = false;
            if (!Card.isBasicLand(card.getCardName())) {
                for (int i = 0; i < cards.size(); i++) {
                    if (card.compareTo(cards.get(i)) <= 0
                            || Card.isBasicLand(cards.get(i).getCardName())) {
                        cards.add(i, card);
                        done = true;
                        break;
                    }
                }
            }
            if (!done) {
                cards.add(card);
            }

        } else {
            cards.add(card);
        }
        
        for (MouseListener e : card.getMouseListeners()) {
            card.removeMouseListener(e);
        }
        for (MouseMotionListener e : card.getMouseMotionListeners()) {
            card.removeMouseMotionListener(e);
        }
        card.addMouseListener(listener);
    }