de.dal33t.powerfolder.ui.folders.FoldersTab.java Source code

Java tutorial

Introduction

Here is the source code for de.dal33t.powerfolder.ui.folders.FoldersTab.java

Source

/*
 * Copyright 2004 - 2008 Christian Sprajc. All rights reserved.
 *
 * This file is part of PowerFolder.
 *
 * PowerFolder 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.
 *
 * PowerFolder 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 PowerFolder. If not, see <http://www.gnu.org/licenses/>.
 *
 * $Id: FoldersTab.java 5495 2008-10-24 04:59:13Z harry $
 */
package de.dal33t.powerfolder.ui.folders;

import java.awt.event.ActionEvent;
import java.util.concurrent.TimeUnit;

import javax.swing.AbstractAction;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import de.dal33t.powerfolder.ConfigurationEntry;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.PreferencesEntry;
import de.dal33t.powerfolder.clientserver.ServerClient;
import de.dal33t.powerfolder.clientserver.ServerClientEvent;
import de.dal33t.powerfolder.clientserver.ServerClientListener;
import de.dal33t.powerfolder.ui.PFUIComponent;
import de.dal33t.powerfolder.ui.util.UIUtil;
import de.dal33t.powerfolder.ui.widget.ActionLabel;
import de.dal33t.powerfolder.ui.wizard.PFWizard;
import de.dal33t.powerfolder.util.Translation;

/**
 * Class to display the forders tab.
 */
public class FoldersTab extends PFUIComponent {

    private JPanel uiComponent;
    private FoldersList foldersList;
    private JScrollPane scrollPane;
    private JLabel connectingLabel;
    private JLabel couldNotConnect;
    private JLabel notLoggedInLabel;
    private ActionLabel loginActionLabel;
    private ActionLabel newFolderLink;
    private JLabel noFoldersFoundLabel;
    private ActionLabel folderWizardActionLabel;
    private ActionLabel newFolderActionLabel;
    private JPanel emptyPanelOuter;
    private ServerClient client;

    /**
     * Constructor
     *
     * @param controller
     */
    public FoldersTab(Controller controller) {
        super(controller);
        connectingLabel = new JLabel(Translation.getTranslation("folders_tab.connecting"));
        couldNotConnect = new JLabel(Translation.getTranslation("folders_tab.could_not_connect"));
        notLoggedInLabel = new JLabel(Translation.getTranslation("folders_tab.not_logged_in"));
        loginActionLabel = new ActionLabel(getController(), new MyLoginAction());
        loginActionLabel.setText(Translation.getTranslation("folders_tab.login"));
        noFoldersFoundLabel = new JLabel(Translation.getTranslation("folders_tab.no_folders_found"));
        foldersList = new FoldersList(getController(), this);
        folderWizardActionLabel = new ActionLabel(getController(),
                getApplicationModel().getActionModel().getFolderWizardAction());
        folderWizardActionLabel.setText(Translation.getTranslation("folders_tab.folder_wizard"));
        newFolderActionLabel = new ActionLabel(getController(),
                getApplicationModel().getActionModel().getNewFolderAction());
        newFolderActionLabel.setText(Translation.getTranslation("folders_tab.new_folder"));
        client = getApplicationModel().getServerClientModel().getClient();

        controller.getThreadPool().scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        updateEmptyLabel();
                    }
                });
            }
        }, 0, 30, TimeUnit.SECONDS);
    }

    public FoldersList getFoldersList() {
        return foldersList;
    }

    /**
     * Returns the ui component.
     *
     * @return
     */
    public JPanel getUIComponent() {
        if (uiComponent == null) {
            buildUI();
        }
        return uiComponent;
    }

    /**
     * Builds the ui component.
     */
    private void buildUI() {
        // Build ui
        FormLayout layout = new FormLayout("pref:grow", "3dlu, pref, 3dlu, pref, 3dlu, fill:0:grow");
        PanelBuilder builder = new PanelBuilder(layout);
        CellConstraints cc = new CellConstraints();

        JPanel toolbar = createToolBar();
        builder.add(toolbar, cc.xy(1, 2));
        builder.addSeparator(null, cc.xy(1, 4));
        scrollPane = new JScrollPane(foldersList.getUIComponent());
        scrollPane.getVerticalScrollBar().setUnitIncrement(10);
        foldersList.setScroller(scrollPane);
        UIUtil.removeBorder(scrollPane);

        // emptyLabel and scrollPane occupy the same slot.
        buildEmptyPanel();
        builder.add(emptyPanelOuter, cc.xywh(1, 6, 1, 1));
        builder.add(scrollPane, cc.xywh(1, 6, 1, 1));
        int row = 6;

        if (!PreferencesEntry.EXPERT_MODE.getValueBoolean(getController())) {
            builder.appendRow("3dlu");
            builder.appendRow("pref");
            row += 2;
            builder.addSeparator("", cc.xy(1, row));
        }

        uiComponent = builder.getPanel();

        updateEmptyLabel();

    }

    private void buildEmptyPanel() {
        FormLayout layoutOuter = new FormLayout("center:pref:grow", "center:pref:grow");
        PanelBuilder builderOuter = new PanelBuilder(layoutOuter);
        FormLayout layoutInner = new FormLayout("fill:pref:grow, 3dlu, fill:pref:grow, 3dlu, fill:pref:grow",
                "pref");
        PanelBuilder builderInner = new PanelBuilder(layoutInner);
        CellConstraints cc = new CellConstraints();
        builderInner.add(connectingLabel, cc.xy(1, 1));
        builderInner.add(couldNotConnect, cc.xy(1, 1));
        builderInner.add(notLoggedInLabel, cc.xy(1, 1));
        builderInner.add(loginActionLabel.getUIComponent(), cc.xy(3, 1));
        builderInner.add(noFoldersFoundLabel, cc.xy(1, 1));
        builderInner.add(newFolderActionLabel.getUIComponent(), cc.xy(3, 1));
        if (PreferencesEntry.EXPERT_MODE.getValueBoolean(getController())) {
            builderInner.add(folderWizardActionLabel.getUIComponent(), cc.xy(5, 1));
        }
        JPanel emptyPanelInner = builderInner.getPanel();
        builderOuter.add(emptyPanelInner, cc.xy(1, 1));
        emptyPanelOuter = builderOuter.getPanel();
    }

    public void updateEmptyLabel() {
        if (foldersList == null) {
            return;
        }
        if (emptyPanelOuter != null) {
            if (foldersList.isEmpty()) {
                String username = client.getUsername();
                if (client.getServer().isUnableToConnect() && !client.isConnected()) {
                    connectingLabel.setVisible(false);
                    couldNotConnect.setVisible(true);
                    notLoggedInLabel.setVisible(false);
                    loginActionLabel.setVisible(false);
                    noFoldersFoundLabel.setVisible(false);
                    if (getController().getOSClient().isAllowedToCreateFolders()) {
                        folderWizardActionLabel.setVisible(false);
                        newFolderActionLabel.setVisible(false);
                        if (newFolderLink != null) {
                            newFolderLink.setEnabled(false);
                        }
                    }
                } else if (!client.isConnected()) {
                    connectingLabel.setVisible(true);
                    couldNotConnect.setVisible(false);
                    notLoggedInLabel.setVisible(false);
                    loginActionLabel.setVisible(false);
                    noFoldersFoundLabel.setVisible(false);
                    if (getController().getOSClient().isAllowedToCreateFolders()) {
                        folderWizardActionLabel.setVisible(false);
                        newFolderActionLabel.setVisible(false);
                        if (newFolderLink != null) {
                            newFolderLink.setEnabled(false);
                        }
                    }
                } else if (username == null || username.trim().length() == 0 || client.isPasswordEmpty()
                        || !client.isLoggedIn()) {
                    connectingLabel.setVisible(false);
                    couldNotConnect.setVisible(false);
                    notLoggedInLabel.setVisible(true);
                    loginActionLabel.setVisible(true);
                    noFoldersFoundLabel.setVisible(false);
                    if (getController().getOSClient().isAllowedToCreateFolders()) {
                        folderWizardActionLabel.setVisible(false);
                        newFolderActionLabel.setVisible(false);
                        if (newFolderLink != null) {
                            newFolderLink.setEnabled(false);
                        }
                    }
                } else {
                    connectingLabel.setVisible(false);
                    couldNotConnect.setVisible(false);
                    notLoggedInLabel.setVisible(false);
                    loginActionLabel.setVisible(false);
                    noFoldersFoundLabel.setVisible(true);
                    if (getController().getOSClient().isAllowedToCreateFolders()) {
                        folderWizardActionLabel.setVisible(true);
                        newFolderActionLabel.setVisible(true);
                        if (newFolderLink != null) {
                            newFolderLink.setEnabled(true);
                        }
                    } else {
                        folderWizardActionLabel.setVisible(false);
                        newFolderActionLabel.setVisible(false);
                        if (newFolderLink != null) {
                            newFolderLink.setEnabled(false);
                        }
                    }
                }
            }
            emptyPanelOuter.setVisible(foldersList.isEmpty());
        }
        if (scrollPane != null) {
            scrollPane.setVisible(!foldersList.isEmpty());
        }
    }

    /**
     * @return the toolbar
     */
    private JPanel createToolBar() {
        newFolderLink = new ActionLabel(getController(),
                getApplicationModel().getActionModel().getNewFolderAction());
        getController().getOSClient().addListener(new MyServerClientListener(newFolderLink));
        newFolderLink.convertToBigLabel();
        newFolderLink.setEnabled(getController().getOSClient().isAllowedToCreateFolders());
        FormLayout layout = new FormLayout("3dlu, pref, 3dlu:grow", "pref");

        PanelBuilder builder = new PanelBuilder(layout);
        CellConstraints cc = new CellConstraints();

        if (ConfigurationEntry.SHOW_CREATE_FOLDER.getValueBoolean(getController())) {
            builder.add(newFolderLink.getUIComponent(), cc.xy(2, 1));
        }
        return builder.getPanel();
    }

    /**
     * Populates the folders in the list.
     */
    public void populate() {
        foldersList.populate();
    }

    // ////////////////
    // Inner classes //
    // ////////////////

    private class MyLoginAction extends AbstractAction {
        MyLoginAction() {
            boolean changeLoginAllowed = ConfigurationEntry.SERVER_CONNECT_CHANGE_LOGIN_ALLOWED
                    .getValueBoolean(getController());
            setEnabled(changeLoginAllowed);
        }

        public void actionPerformed(ActionEvent e) {
            boolean changeLoginAllowed = ConfigurationEntry.SERVER_CONNECT_CHANGE_LOGIN_ALLOWED
                    .getValueBoolean(getController());
            if (changeLoginAllowed) {
                PFWizard.openLoginWizard(getController(), getController().getOSClient());
            }
        }
    }

    private class MyServerClientListener implements ServerClientListener {
        ActionLabel label;

        MyServerClientListener(ActionLabel label) {
            this.label = label;
        }

        public void accountUpdated(ServerClientEvent event) {
            label.setEnabled(getController().getOSClient().isAllowedToCreateFolders());
            updateEmptyLabel();
        }

        public void login(ServerClientEvent event) {
            label.setEnabled(getController().getOSClient().isAllowedToCreateFolders());
            updateEmptyLabel();
        }

        public void nodeServerStatusChanged(ServerClientEvent event) {
            label.setEnabled(getController().getOSClient().isAllowedToCreateFolders());
            updateEmptyLabel();
        }

        public void serverConnected(ServerClientEvent event) {
            label.setEnabled(getController().getOSClient().isAllowedToCreateFolders());
            updateEmptyLabel();
        }

        public void serverDisconnected(ServerClientEvent event) {
            label.setEnabled(getController().getOSClient().isAllowedToCreateFolders());
            updateEmptyLabel();
        }

        public boolean fireInEventDispatchThread() {
            return true;
        }
    }

}