/*
* 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: MainTabbedPane.java 5495 2008-10-24 04:59:13Z harry $
*/
package de.dal33t.powerfolder.ui;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.PreferencesEntry;
import de.dal33t.powerfolder.event.FolderRepositoryEvent;
import de.dal33t.powerfolder.ui.computers.ComputersTab;
import de.dal33t.powerfolder.ui.folders.FoldersTab;
import de.dal33t.powerfolder.ui.util.CursorUtils;
import de.dal33t.powerfolder.util.Translation;
/**
* This is the main tabbed pain component in the PowerFolder GUI. In expert
* mode, it shows the status, folders and computers tab. In non-expert mode, it
* just returns the FolderTab.
*/
public class MainTabbedPane extends PFUIComponent {
public static final int FOLDERS_INDEX = 0;
public static final int COMPUTERS_INDEX = 1;
private FoldersTab foldersTab;
private ComputersTab computersTab;
private JTabbedPane tabbedPane;
private final boolean showComputersTab;
private final boolean expertMode;
private final AtomicBoolean initialized;
/**
* Constructor. Creates the main tabbed pane.
*
* @param controller
*/
public MainTabbedPane(Controller controller) {
super(controller);
initialized = new AtomicBoolean();
showComputersTab = !getController().isBackupOnly();
expertMode = PreferencesEntry.EXPERT_MODE
.getValueBoolean(getController());
}
/**
* @return the ui main tabbed pane.
*/
public JComponent getUIComponent() {
if (!initialized.getAndSet(true)) {
// Initalize components
initComponents();
if (expertMode) {
tabbedPane.add(Translation.getTranslation(
"main_tabbed_pane.folders.name"),
foldersTab.getUIComponent());
if (showComputersTab) {
tabbedPane.add(Translation
.getTranslation("main_tabbed_pane.computers.name"),
computersTab.getUIComponent());
} else {
// Do not display computers tab in backup only mode, BUT
// need to create it anyways to prevent UI events breaking.
computersTab.getUIComponent();
}
String key = Translation
.getTranslation("main_tabbed_pane.folders.key");
tabbedPane.setMnemonicAt(FOLDERS_INDEX,
(int) Character.toUpperCase(key.charAt(0)));
tabbedPane.setToolTipTextAt(FOLDERS_INDEX, Translation
.getTranslation("main_tabbed_pane.folders.description"));
if (showComputersTab) {
key = Translation
.getTranslation("main_tabbed_pane.computers.key");
tabbedPane.setMnemonicAt(COMPUTERS_INDEX,
(int) Character.toUpperCase(key.charAt(0)));
tabbedPane.setToolTipTextAt(COMPUTERS_INDEX,
Translation.getTranslation(""
+ "main_tabbed_pane.computers.description"));
}
tabbedPane.addChangeListener(new MyChangelistener());
CursorUtils.setHandCursor(tabbedPane);
CursorUtils.setDefaultCursor(foldersTab.getUIComponent());
CursorUtils.setDefaultCursor(computersTab.getUIComponent());
setActiveTab(FOLDERS_INDEX);
}
foldersTab.populate();
}
if (expertMode) {
return tabbedPane;
} else {
return foldersTab.getUIComponent();
}
}
public int getSelectedTabIndex() {
if (expertMode) {
return tabbedPane.getSelectedIndex();
} else {
// Why is someone asking for the tab index,
// when only the folder tab is showing?
throw new IllegalStateException("Expert mode == " + expertMode);
}
}
/**
* Initialize the components of the pane.
*/
private void initComponents() {
foldersTab = new FoldersTab(getController());
if (expertMode) {
tabbedPane = new JTabbedPane();
tabbedPane.setOpaque(false);
computersTab = new ComputersTab(getController());
}
}
/**
* Add a change listener to the main tabbed pane.
*
* @param l
*/
public void addTabbedPaneChangeListener(ChangeListener l) {
if (expertMode) {
tabbedPane.addChangeListener(l);
}
}
/**
* Remove a change listener from the main tabbed pane.
*
* @param l
*/
public void removeTabbedPaneChangeListener(ChangeListener l) {
if (expertMode) {
tabbedPane.removeChangeListener(l);
}
}
/**
* @param tabIndex
* the select tab index
*/
public void setActiveTab(int tabIndex) {
if (expertMode) {
tabbedPane.setSelectedIndex(tabIndex);
}
}
public void folderCreated(FolderRepositoryEvent e) {
foldersTab.folderCreated(e);
}
/**
* Listener to populate the folders and computers the first time the tabs
* are selected.
*/
private class MyChangelistener implements ChangeListener {
private AtomicBoolean done = new AtomicBoolean();
public void stateChanged(ChangeEvent e) {
if (!done.getAndSet(true)) {
foldersTab.populate();
computersTab.populate();
}
}
}
}