/*
 * java-gnome, a UI library for writing GTK and GNOME programs from Java!
 *
 * Copyright © 2009-2010 Operational Dynamics Consulting, Pty Ltd
 *
 * The code in this file, and the program it is a part of, is made available
 * to you by its authors as open source software: you can redistribute it
 * and/or modify it under the terms of the GNU General Public License version
 * 2 ("GPL") as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GPL for more details.
 *
 * You should have received a copy of the GPL along with this program. If not,
 * see http://www.gnu.org/licenses/. The authors of this program may be
 * contacted through http://java-gnome.sourceforge.net/.
 */
package unique;

import org.gnome.gtk.Gtk;
import org.gnome.unique.Application;
import org.gnome.unique.Command;
import org.gnome.unique.MessageData;
import org.gnome.unique.Response;

import static java.lang.System.currentTimeMillis;
import static org.freedesktop.bindings.Time.formatTime;

/**
 * Attempt to demonstrate LibUnique in action.
 * 
 * @author Andrew Cowie
 * @since 4.0.12
 */
/*
 * TODO This example works, but is trivial and not very interesting.
 */
public class ExampleThereCanBeOnlyOne
{
    public static void main(String[] args) {
        final Application app;
        final MessageData data;
        final long when;
        final String str;

        Gtk.init(args);

        /*
         * Create an instance of probing for our unique application name.
         */

        app = new Application("com.example.ThereCanBeOnlyOne", null);

        /*
         * Find out if there is already one running. If there is, send it a
         * message, then terminate. Sending a payload with the message is
         * optional; we'll send along the time.
         */

        if (app.isRunning()) {
            when = currentTimeMillis() / 1000;
            str = formatTime("%H:%M:%S", when);

            data = new MessageData();
            data.setText("At " + str + ", all is well");

            app.sendMessage(Command.ACTIVATE, data);
            return;
        }

        /*
         * If there isn't one running, then we are the first instance, and
         * need to become the unique application. We can register a signal
         * handler to listen for commands coming from other instances
         * attempting to start.
         */

        app.connect(new Application.MessageReceived() {
            public Response onMessageReceived(Application source, Command cmd, MessageData data, int time) {

                if (cmd == Command.ACTIVATE) {
                    /*
                     * Do something trivial in reaction to the activation
                     * request.
                     */
                    System.out.println(data.getText());

                    return Response.OK;
                } else if (cmd == Command.CLOSE) {
                    /*
                     * If another instance else wants to tell us to close
                     * that's their business. Up to us whether we decide to do
                     * so, but if we did, then this is what we might do:
                     */
                    Gtk.mainQuit();
                    return Response.OK;
                } else {
                    /*
                     * Well, we didn't do anything, but that's ok too
                     */
                    return Response.OK;
                }
            }
        });

        /*
         * Now carry on with normal application setup, finally running the
         * main loop, which blocks.
         */

        Gtk.main();
    }
}
