/*
* 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 javax.swing.AbstractAction;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
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.event.FolderRepositoryEvent;
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 notLoggedInLabel;
private ActionLabel loginActionLabel;
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"));
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();
client.addListener(new MyServerClientListener());
}
/**
* 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(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) {
if (emptyPanelOuter != null) {
if (foldersList.isEmpty()) {
String username = client.getUsername();
if (!client.isConnected()) {
connectingLabel.setVisible(true);
notLoggedInLabel.setVisible(false);
loginActionLabel.setVisible(false);
noFoldersFoundLabel.setVisible(false);
folderWizardActionLabel.setVisible(false);
newFolderActionLabel.setVisible(false);
} else if (username == null
|| username.trim().length() == 0
|| client.isPasswordEmpty() || !client.isLoggedIn())
{
connectingLabel.setVisible(false);
notLoggedInLabel.setVisible(true);
loginActionLabel.setVisible(true);
noFoldersFoundLabel.setVisible(false);
folderWizardActionLabel.setVisible(false);
newFolderActionLabel.setVisible(false);
} else {
connectingLabel.setVisible(false);
notLoggedInLabel.setVisible(false);
loginActionLabel.setVisible(false);
noFoldersFoundLabel.setVisible(true);
folderWizardActionLabel.setVisible(true);
newFolderActionLabel.setVisible(true);
}
}
emptyPanelOuter.setVisible(foldersList.isEmpty());
}
if (scrollPane != null) {
scrollPane.setVisible(!foldersList.isEmpty());
}
}
}
/**
* @return the toolbar
*/
private JPanel createToolBar() {
ActionLabel newFolderLink = new ActionLabel(getController(),
getApplicationModel().getActionModel().getNewFolderAction());
newFolderLink.convertToBigLabel();
ActionLabel folderWizardLink = null;
Boolean expertMode = PreferencesEntry.EXPERT_MODE
.getValueBoolean(getController());
if (expertMode) {
folderWizardLink = new ActionLabel(getController(),
getApplicationModel().getActionModel().getFolderWizardAction());
folderWizardLink.convertToBigLabel();
}
FormLayout layout;
if (expertMode) {
layout = new FormLayout("3dlu, pref, 3dlu, pref, 3dlu:grow", "pref");
} else {
layout = new FormLayout("3dlu, pref, 3dlu:grow", "pref");
}
PanelBuilder builder = new PanelBuilder(layout);
CellConstraints cc = new CellConstraints();
builder.add(newFolderLink.getUIComponent(), cc.xy(2, 1));
if (expertMode) {
builder.add(folderWizardLink.getUIComponent(), cc.xy(4, 1));
}
return builder.getPanel();
}
/**
* Populates the folders in the list.
*/
public void populate() {
foldersList.populate();
}
public void folderCreated(FolderRepositoryEvent e) {
foldersList.folderCreated(e);
}
// ////////////////
// 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 {
public void accountUpdated(ServerClientEvent event) {
updateEmptyLabel();
}
public boolean fireInEventDispatchThread() {
return true;
}
public void login(ServerClientEvent event) {
updateEmptyLabel();
}
public void nodeServerStatusChanged(ServerClientEvent event) {
updateEmptyLabel();
}
public void serverConnected(ServerClientEvent event) {
updateEmptyLabel();
}
public void serverDisconnected(ServerClientEvent event) {
updateEmptyLabel();
}
}
}