com.github.cmisbox.ui.UI.java Source code

Java tutorial

Introduction

Here is the source code for com.github.cmisbox.ui.UI.java

Source

/*  
 *   CMISBox - Synchronize and share your files with your CMIS Repository
 *
 *   Copyright (C) 2011 - Andrea Agili 
 *  
 *    CMISBox is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 * 
 *  CMISBox 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
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with CMISBox.  If not, see <http://www.gnu.org/licenses/>.
 * 
 */

package com.github.cmisbox.ui;

import java.awt.Desktop;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.UIManager;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ch.swingfx.twinkle.NotificationBuilder;
import ch.swingfx.twinkle.style.theme.DarkDefaultNotification;

import com.github.cmisbox.core.Config;
import com.github.cmisbox.core.Main;
import com.github.cmisbox.core.Messages;

public class UI {
    public static enum Status {
        NONE, OK, KO, SYNCH;
    }

    private static final String NOTIFY_TITLE = "CMISBox";

    private static final DarkDefaultNotification DARK_DEFAULT_NOTIFICATION = new DarkDefaultNotification();

    private static final ImageIcon NOTIFY_ICON = new ImageIcon(UI.class.getResource("images/cmisbox-ok.png"));

    private static UI instance = new UI();

    public static UI getInstance() {
        return UI.instance;
    }

    private boolean available = false;

    private SystemTray tray;

    private Log log;

    private PopupMenu popup;

    private UI() {
        this.log = LogFactory.getLog(this.getClass());
        try {
            this.available = !GraphicsEnvironment.isHeadless();

            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

            if (SystemTray.isSupported()) {

                this.tray = SystemTray.getSystemTray();
                Image image = ImageIO.read(this.getClass().getResource("images/cmisbox.png"));

                ActionListener exitListener = new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        Main.exit(0);
                    }
                };

                this.popup = new PopupMenu();
                MenuItem defaultItem = new MenuItem(Messages.exit);
                defaultItem.addActionListener(exitListener);
                this.popup.add(defaultItem);

                MenuItem loginItem = new MenuItem(Messages.login);
                loginItem.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent arg0) {
                        new LoginDialog();
                    }
                });
                this.popup.add(loginItem);

                MenuItem treeItem = new MenuItem(Messages.showTree);
                treeItem.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent arg0) {
                        new TreeSelect();
                    }
                });

                this.popup.add(treeItem);

                final TrayIcon trayIcon = new TrayIcon(image, UI.NOTIFY_TITLE, this.popup);

                trayIcon.setImageAutoSize(true);

                this.tray.add(trayIcon);

                this.notify(Messages.startupComplete);

            }

        } catch (Exception e) {
            this.log.error(e);
        }
    }

    public void addWatch(String path) {
        final MenuItem mi = new MenuItem(path.replaceAll("/", ""));
        mi.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                try {
                    Desktop.getDesktop().open(new File(Config.getInstance().getWatchParent(), mi.getLabel()));
                } catch (IOException e) {
                    UI.this.log.error(e);
                }

            }
        });
        this.popup.add(mi);
    }

    public File getWatchFolder() {
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser.setAcceptAllFileFilterUsed(false);
        chooser.showOpenDialog(null);
        return chooser.getSelectedFile();
    }

    public boolean isAvailable() {
        return this.available;
    }

    public void notify(final String msg) {

        new NotificationBuilder().withStyle(UI.DARK_DEFAULT_NOTIFICATION).withTitle(UI.NOTIFY_TITLE)
                .withMessage(msg).withIcon(UI.NOTIFY_ICON).showNotification();

    }

    public LoginDialog openRemoteLoginDialog() {
        LoginDialog ld = new LoginDialog();
        ld.waitFor();
        return ld;
    }

    public void setStatus(Status status) {
        if (!this.isAvailable()) {
            return;
        }
        try {
            if (status == Status.SYNCH) {
                this.tray.getTrayIcons()[0]
                        .setImage(ImageIO.read(this.getClass().getResource("images/cmisbox-synch.png")));
            }
            if (status == Status.OK) {
                this.tray.getTrayIcons()[0]
                        .setImage(ImageIO.read(this.getClass().getResource("images/cmisbox-ok.png")));
            }
            if (status == Status.KO) {
                this.tray.getTrayIcons()[0]
                        .setImage(ImageIO.read(this.getClass().getResource("images/cmisbox-error.png")));
            }
            if (status == Status.NONE) {
                this.tray.getTrayIcons()[0]
                        .setImage(ImageIO.read(this.getClass().getResource("images/cmisbox.png")));
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}