IActiveLink.java
package com.itmill.toolkit.demo.sampler.gwt.client.ui;

import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.MouseListener;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.ui.ILink;

public class IActiveLink extends ILink {

    String id;
    ApplicationConnection client;
    boolean listening = false;

    public IActiveLink() {
        addMouseListener(new MouseListener() {
            public void onMouseDown(Widget sender, int x, int y) {
            }

            public void onMouseEnter(Widget sender) {
            }

            public void onMouseLeave(Widget sender) {
            }

            public void onMouseMove(Widget sender, int x, int y) {
            }

            public void onMouseUp(Widget sender, int x, int y) {
                Event e = DOM.eventGetCurrentEvent();
                if (e.getButton() == Event.BUTTON_MIDDLE) {
                    sendVariables();
                }
            }
        });
    }

    /**
     * Sends variables, returns true if default handler should be called (i.e if
     * server is listening and the link was claimed to be opened by the client)
     
     @return
     */
    private boolean sendVariables() {
        Event e = DOM.eventGetCurrentEvent();
        boolean opened = (e.getCtrlKey() || e.getAltKey() || e.getShiftKey()
                || e.getMetaKey() || e.getButton() == Event.BUTTON_MIDDLE);

        // Works as ILink if no-one is listening
        if (listening) {
            if (opened) {
                // ILink will open, notify server
                client.updateVariable(id, "opened", true, false);
            else {
                e.preventDefault();
            }
            client.updateVariable(id, "activated", true, true);
        }
        return !listening || opened;
    }

    @Override
    public void onClick(Widget sender) {

        if (sendVariables()) {
            // run default if not listening, or we claimed link was opened
            super.onClick(sender);
        }
    }

    @Override
    public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
        // Ensure correct implementation,
        // but don't let container manage caption etc.
        if (client.updateComponent(this, uidl, false)) {
            return;
        }

        // Save details
        this.client = client;
        id = uidl.getId();
        listening = uidl.hasVariable("activated");

        super.updateFromUIDL(uidl, client);
    }

}