// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// This program 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 2 of the License, or (at your option) any later version.
//
// This program 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 this program;
// if not, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id $
//
package com.salas.bb.core;
import com.jgoodies.uif.AbstractDialog;
import com.jgoodies.forms.factories.ButtonBarFactory;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.salas.bb.utils.uif.ComponentsFactory;
import com.salas.bb.utils.uif.BBFormBuilder;
import com.salas.bb.utils.uif.UifUtilities;
import com.salas.bb.utils.uif.HeaderPanelExt;
import com.salas.bb.utils.DateUtils;
import com.salas.bb.utils.i18n.Strings;
import javax.swing.*;
import java.io.File;
import java.awt.*;
import java.util.Date;
import java.text.MessageFormat;
/**
* Data recovery dialog.
*/
class DataRecoverySelectionDialog extends AbstractDialog
{
private static final String LAYOUT_COLUMNS = "14dlu, p, 2dlu, max(50dlu;p), 0:grow";
private final Date lastSuccessfulSync;
private final File[] availableBackups;
protected JRadioButton rbLoadFromBackup;
protected JRadioButton rbLoadFromService;
protected JComboBox cbBackups;
/**
* Creates data recovery dialog.
*
* @param frame parent frame.
* @param lastSuccessfulSync the date of last successful synchronization attempt.
* @param availableBackups the list of available backup files.
*/
private DataRecoverySelectionDialog(Frame frame, Date lastSuccessfulSync,
File[] availableBackups)
{
super(frame, Strings.message("data.recovery.title"));
this.lastSuccessfulSync = lastSuccessfulSync;
this.availableBackups = availableBackups;
}
/**
* Builds header panel.
*
* @return header panel.
*/
protected JComponent buildHeader()
{
return new HeaderPanelExt(
Strings.message("data.recovery.title"),
Strings.message("data.recovery.header"));
}
/**
* Builds contents pane.
*
* @return pane.
*/
protected JComponent buildContent()
{
JPanel panel = new JPanel(new BorderLayout());
panel.add(buildMainPanel(), BorderLayout.CENTER);
panel.add(buildButtonsBar(), BorderLayout.SOUTH);
return panel;
}
/**
* Biilds main panel.
*
* @return panel.
*/
private Component buildMainPanel()
{
JRadioButton rbLeaveClean = ComponentsFactory.createRadioButton(Strings.message("data.recovery.leave.clean"));
// From Backups
rbLoadFromBackup = ComponentsFactory.createRadioButton(Strings.message("data.recovery.load.from.backup"));
rbLoadFromBackup.setEnabled(availableBackups.length > 0);
JLabel lbFile = ComponentsFactory.createLabel(Strings.message("data.recovery.file"));
lbFile.setLabelFor(cbBackups);
lbFile.setEnabled(availableBackups.length > 0);
cbBackups = new JComboBox();
initBackupsBox();
cbBackups.setEnabled(availableBackups.length > 0);
// From Service
rbLoadFromService = ComponentsFactory.createRadioButton(
Strings.message("data.recovery.load.from.service.account"));
rbLoadFromService.setEnabled(lastSuccessfulSync != null);
JLabel lbDate = new JLabel(Strings.message("data.recovery.date"));
JLabel lbDateValue = new JLabel(lastSuccessfulSync == null
? Strings.message("data.recovery.never.synchronized")
: DateUtils.dateToString(lastSuccessfulSync));
lbDate.setEnabled(lastSuccessfulSync != null);
lbDateValue.setEnabled(lastSuccessfulSync != null);
// Grouping
ButtonGroup bg = new ButtonGroup();
bg.add(rbLeaveClean);
bg.add(rbLoadFromBackup);
bg.add(rbLoadFromService);
// Select the best choice
if (rbLoadFromBackup.isEnabled()) rbLoadFromBackup.setSelected(true);
else if (rbLoadFromService.isEnabled()) rbLoadFromService.setSelected(true);
else rbLeaveClean.setSelected(true);
// ---
BBFormBuilder builder = new BBFormBuilder(LAYOUT_COLUMNS);
builder.setDefaultDialogBorder();
builder.append(rbLoadFromBackup, 5);
builder.setLeadingColumnOffset(1);
builder.nextLine();
builder.append(lbFile);
builder.append(cbBackups, 2);
builder.setLeadingColumnOffset(0);
builder.nextLine();
builder.append(rbLoadFromService, 5);
builder.setLeadingColumnOffset(1);
builder.nextLine();
builder.append(lbDate);
builder.append(lbDateValue);
builder.setLeadingColumnOffset(0);
builder.nextLine();
builder.append(rbLeaveClean, 5);
return builder.getPanel();
}
/** Loads backup files from the set to the drop-down box. */
private void initBackupsBox()
{
if (availableBackups.length > 0)
{
for (int i = 0; i < availableBackups.length; i++)
{
File file = availableBackups[i];
BackupFileItem item = new BackupFileItem(file);
if (item.getSize() > 0) cbBackups.addItem(item);
}
} else
{
cbBackups.addItem(Strings.message("data.recovery.no.backups.available"));
}
}
/**
* Creates OK-bar.
*
* @return bar.
*/
private Component buildButtonsBar()
{
return ButtonBarFactory.buildOKBar(createOKButton(true));
}
/**
* Invokes dialog, waits for the choice and returns the results. The dialog is
* opened in EDT.
*
* @param frame parent frame.
* @param lastSuccessfulSync the date of last successful synchronization attempt.
* @param availableBackups the list of available backup files.
*
* @return data recovery choice.
*/
public static DataRecoveryChoice ask(final Frame frame, final Date lastSuccessfulSync,
final File[] availableBackups)
{
final DataRecoveryChoice choice = new DataRecoveryChoice();
UifUtilities.invokeAndWait(new Runnable()
{
public void run()
{
DataRecoverySelectionDialog dialog = new DataRecoverySelectionDialog(frame,
lastSuccessfulSync, availableBackups);
dialog.open();
if (dialog.hasBeenCanceled())
{
choice.setMode(DataRecoveryChoice.MODE_LEAVE);
} else
{
// Set resulting mode
choice.setMode(dialog.rbLoadFromBackup.isSelected()
? DataRecoveryChoice.MODE_FROM_BACKUP
: dialog.rbLoadFromService.isSelected()
? DataRecoveryChoice.MODE_FROM_SERVICE
: DataRecoveryChoice.MODE_LEAVE);
// Set resulting item
Object selectedItem = dialog.cbBackups.getSelectedItem();
choice.setBackupFile(selectedItem instanceof BackupFileItem
? ((BackupFileItem)selectedItem).getFile()
: null);
}
}
});
return choice;
}
/**
* Item, representing backup file in the list.
*/
private static class BackupFileItem
{
private final File file;
private final String text;
protected final long size;
/**
* Creates backup file item.
*
* @param file file.
*/
public BackupFileItem(File file)
{
this.file = file;
size = file != null && file.exists() ? file.length() : -1;
long date = file.lastModified();
text = MessageFormat.format(Strings.message("data.recovery.backup.item.name"),
new Object[] { DateUtils.dateToString(new Date(date)), new Long(size / 1024) });
}
/**
* Returns associated file.
*
* @return file.
*/
public File getFile()
{
return file;
}
/**
* Returns size of the file.
*
* @return size.
*/
public long getSize()
{
return size;
}
/**
* Returns a string representation of the object.
*
* @return a string representation of the object.
*/
public String toString()
{
return text;
}
}
/**
* Data recovery choice holder.
*/
static class DataRecoveryChoice
{
public static final int MODE_FROM_BACKUP = 0;
public static final int MODE_FROM_SERVICE = 1;
public static final int MODE_LEAVE = 2;
private int mode;
private File backupFile;
/**
* Sets mode.
*
* @param mode mode.
*/
public void setMode(int mode)
{
this.mode = mode;
}
/**
* Sets backup file selected.
*
* @param backupFile file.
*/
public void setBackupFile(File backupFile)
{
this.backupFile = backupFile;
}
/**
* Returns mode.
*
* @return mode.
*/
public int getMode()
{
return mode;
}
/**
* Returns backup file selected.
*
* @return file.
*/
public File getBackupFile()
{
return backupFile;
}
}
}