/*
* 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$
*/
package de.dal33t.powerfolder.ui.dialog;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.SwingWorker;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.factories.ButtonBarFactory;
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.clientserver.ServerClient;
import de.dal33t.powerfolder.disk.Folder;
import de.dal33t.powerfolder.disk.FolderRepository;
import de.dal33t.powerfolder.disk.FolderSettings;
import de.dal33t.powerfolder.light.FolderInfo;
import de.dal33t.powerfolder.security.FolderRemovePermission;
import de.dal33t.powerfolder.util.Reject;
import de.dal33t.powerfolder.util.Translation;
import de.dal33t.powerfolder.ui.dialog.BaseDialog;
import de.dal33t.powerfolder.ui.util.SimpleComponentFactory;
/**
* Panel displayed when wanting to remove a folder
*
* @author <a href="mailto:hglasgow@powerfolder.com">Harry Glasgow</a>
* @version $Revision: 2.00 $
*/
public class FolderRemoveDialog extends BaseDialog {
private final FolderInfo foInfo;
private Folder folder;
private boolean localFolder;
private boolean onlineFolder;
private JButton removeButton;
private JButton cancelButton;
private JLabel messageLabel;
private JCheckBox removeFromLocalBox;
private JCheckBox removeFromServerBox;
private JCheckBox deleteSystemSubFolderBox;
/**
* Contructor when used on choosen folder
*
* @param controller
* @param foInfo
*/
public FolderRemoveDialog(Controller controller, FolderInfo foInfo) {
super(Senior.MAIN_FRAME, controller, true);
Reject.ifNull(foInfo, "FolderInfo");
this.foInfo = foInfo;
folder = foInfo.getFolder(getController());
onlineFolder = getController().getOSClient().getAccount()
.hasReadPermissions(foInfo);
localFolder = folder != null;
}
// UI Building ************************************************************
/**
* Initalizes all ui components
*/
private void initComponents() {
boolean allowRemove = !ConfigurationEntry.SECURITY_PERMISSIONS_STRICT
.getValueBoolean(getController())
|| getController().getOSClient().getAccount()
.hasPermission(FolderRemovePermission.INSTANCE);
// Create folder leave dialog message
boolean syncFlag = folder != null && folder.isTransferring();
String folderLeaveText;
String removeKey = onlineFolder && !localFolder
? "folder_remove.dialog.online_text"
: "folder_remove.dialog.text";
if (syncFlag) {
folderLeaveText = Translation
.getTranslation(removeKey, foInfo.name)
+ '\n'
+ Translation
.getTranslation("folder_remove.dialog.sync_warning");
} else {
folderLeaveText = Translation
.getTranslation(removeKey, foInfo.name);
}
messageLabel = new JLabel(folderLeaveText);
removeFromLocalBox = SimpleComponentFactory.createCheckBox(Translation
.getTranslation("folder_remove.dialog.remove_from_local"));
removeFromLocalBox.setSelected(true);
removeFromLocalBox.addActionListener(new ConvertActionListener());
deleteSystemSubFolderBox = SimpleComponentFactory
.createCheckBox(Translation
.getTranslation("folder_remove.dialog.delete"));
deleteSystemSubFolderBox.setEnabled(allowRemove);
removeFromServerBox = SimpleComponentFactory.createCheckBox(Translation
.getTranslation("folder_remove.dialog.remove_from_os"));
removeFromServerBox.addActionListener(new ConvertActionListener());
removeFromServerBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
getApplicationModel().getServerClientModel()
.checkAndSetupAccount();
}
});
removeFromServerBox.setSelected(!localFolder && onlineFolder);
removeFromServerBox.setEnabled(allowRemove);
// Buttons
createRemoveButton(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removeButton.setEnabled(false);
confirmedFolderLeave(removeFromLocalBox.isSelected(),
deleteSystemSubFolderBox.isSelected(),
removeFromServerBox.isSelected());
}
});
cancelButton = createCancelButton(new ActionListener() {
public void actionPerformed(ActionEvent e) {
close();
}
});
}
private void createRemoveButton(ActionListener listener) {
removeButton = new JButton(
Translation.getTranslation("folder_remove.dialog.button.name"));
removeButton
.setMnemonic(Translation
.getTranslation("folder_remove.dialog.button.key").trim()
.charAt(0));
removeButton.addActionListener(listener);
}
// Methods for BaseDialog *************************************************
public String getTitle() {
return Translation.getTranslation("folder_remove.dialog.title");
}
protected Icon getIcon() {
return null;
}
protected JComponent getContent() {
initComponents();
FormLayout layout;
// ----- | ------ | ---------------------- | ---------------- |
// local | online | remove/delete local cb | remove server cb |
// ----- | ------ | ---------------------- | ---------------- |
// Y | Y | Y | Y |
// Y | N | Y | N |
// N | Y | N | N |
// N | N | ? | ? |
// ----- | ------ | ---------------------- | ---------------- |
// Remove unnecessary gaps if cbs not visible.
if (localFolder) {
if (onlineFolder) {
// Local and online cbs
layout = new FormLayout("pref:grow, 3dlu, pref:grow",
"pref, 3dlu, pref, 3dlu, pref, 3dlu, pref");
} else {
// Local two cbs only
layout = new FormLayout("pref:grow, 3dlu, pref:grow",
"pref, 3dlu, pref, 3dlu, pref");
}
} else {
// Just online. Don't need the online cb; obvious.
layout = new FormLayout("pref:grow, 3dlu, pref:grow",
"pref");
}
PanelBuilder builder = new PanelBuilder(layout);
CellConstraints cc = new CellConstraints();
int row = 1;
builder.add(messageLabel, cc.xyw(1, row, 3));
row += 2;
if (localFolder) {
builder.add(removeFromLocalBox, cc.xyw(1, row, 3));
row += 2;
builder.add(deleteSystemSubFolderBox, cc.xyw(1, row, 3));
row += 2;
}
// Don't need to show this if just online.
if (onlineFolder && localFolder) {
builder.add(removeFromServerBox, cc.xyw(1, row, 3));
row += 2;
}
configureComponents();
return builder.getPanel();
}
protected Component getButtonBar() {
return ButtonBarFactory.buildCenteredBar(removeButton, cancelButton);
}
protected JButton getDefaultButton() {
return removeButton;
}
private void configureComponents() {
if (!localFolder && !onlineFolder) {
// Should never be.
removeButton.setEnabled(false);
}
removeButton.setEnabled(removeFromLocalBox.isSelected()
|| removeFromServerBox.isSelected());
if (!removeFromLocalBox.isSelected()) {
deleteSystemSubFolderBox.setSelected(false);
}
}
private void confirmedFolderLeave(final boolean removeLocal,
boolean deleteSystemSubFolder, boolean removeFromOS)
{
// Dispose before closing parent frame (when folder is deleted),
// otherwise parent closes and this is orphanned, and reappears next
// time Info window displays.
close();
FolderRepository folderRepository = getController()
.getFolderRepository();
if (removeLocal) {
Folder f = foInfo.getFolder(getController());
if (f != null) {
folderRepository.removeFolder(f, deleteSystemSubFolder);
}
}
if (removeFromOS) {
// If remove local means = total removal of folder, also remove
// permissions.
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
ServerClient client = getController().getOSClient();
client.getFolderService().removeFolder(foInfo, true,
removeLocal);
return null;
}
};
worker.execute();
if (!removeLocal) {
// TODO For what is that?
FolderSettings folderSettings = FolderSettings.load(
getController(), folder.getConfigEntryId());
folderRepository.saveFolderConfig(foInfo, folderSettings, true);
}
}
}
// ////////////////
// Inner Classes //
// ////////////////
private class ConvertActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
configureComponents();
}
}
}