/*
* File : ConfigPanel*.java
* Created : 11 mar. 2004
* By : TuxPaper
*
* Copyright (C) 2004, 2005, 2006 Aelitis SAS, All rights Reserved
*
* 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.
*
* 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 ( see the LICENSE file ).
*
* 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
*
* AELITIS, SAS au capital de 46,603.30 euros,
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/
package org.gudy.azureus2.ui.swt.views.configsections;
import java.io.File;
import java.util.Date;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.plugins.ui.config.ConfigSection;
import org.gudy.azureus2.ui.swt.Messages;
import org.gudy.azureus2.ui.swt.TextViewerWindow;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.config.BooleanParameter;
import org.gudy.azureus2.ui.swt.config.ChangeSelectionActionPerformer;
import org.gudy.azureus2.ui.swt.config.IntParameter;
import org.gudy.azureus2.ui.swt.config.StringParameter;
import org.gudy.azureus2.ui.swt.mainwindow.Colors;
import org.gudy.azureus2.ui.swt.plugins.UISWTConfigSection;
import org.gudy.azureus2.ui.swt.shells.MessageBoxShell;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.backup.BackupManager;
import com.aelitis.azureus.core.backup.BackupManagerFactory;
import com.aelitis.azureus.ui.UserPrompterResultListener;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.UIFunctionsSWT;
import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;
public class ConfigSectionBackupRestore implements UISWTConfigSection {
public String configSectionGetParentSection() {
return ConfigSection.SECTION_ROOT;
}
public String configSectionGetName() {
return "backuprestore";
}
public void configSectionSave() {
}
public void configSectionDelete() {
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.releaseImage("openFolderButton");
}
public int maxUserMode() {
return 0;
}
public Composite
configSectionCreate(
final Composite parent)
{
ImageLoader imageLoader = ImageLoader.getInstance();
Image imgOpenFolder = imageLoader.getImage("openFolderButton");
GridData gridData;
GridLayout layout;
final Composite cBR = new Composite( parent, SWT.NULL );
gridData = new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL);
cBR.setLayoutData(gridData);
layout = new GridLayout();
layout.numColumns = 1;
cBR.setLayout(layout);
Label info_label = new Label( cBR, SWT.WRAP );
Messages.setLanguageText( info_label, "ConfigView.section.br.overview" );
gridData = Utils.getWrappableLabelGridData(1, GridData.HORIZONTAL_ALIGN_FILL );
info_label.setLayoutData( gridData );
// wiki link
final Label linkLabel = new Label(cBR, SWT.NULL);
linkLabel.setText(MessageText.getString("ConfigView.label.please.visit.here"));
linkLabel.setData("http://wiki.vuze.com/w/Backup_And_Restore");
linkLabel.setCursor(linkLabel.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
linkLabel.setForeground(Colors.blue);
gridData = Utils.getWrappableLabelGridData(1, 0);
linkLabel.setLayoutData(gridData);
linkLabel.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent arg0) {
Utils.launch((String) ((Label) arg0.widget).getData());
}
public void mouseDown(MouseEvent arg0) {
Utils.launch((String) ((Label) arg0.widget).getData());
}
});
final BackupManager backup_manager = BackupManagerFactory.getManager( AzureusCoreFactory.getSingleton());
// backup
Group gBackup = new Group(cBR, SWT.NULL);
Messages.setLanguageText(gBackup, "br.backup");
layout = new GridLayout(2, false);
gBackup.setLayout(layout);
gBackup.setLayoutData(new GridData( GridData.FILL_HORIZONTAL ));
// info
Label last_backup_label = new Label(gBackup, SWT.NULL );
Messages.setLanguageText(last_backup_label, "br.backup.last.time");
final Label last_backup_time = new Label(gBackup, SWT.NULL );
Label last_backup_error_label = new Label(gBackup, SWT.NULL );
Messages.setLanguageText(last_backup_error_label, "br.backup.last.error");
final Label last_backup_error = new Label(gBackup, SWT.NULL );
final Runnable stats_updater =
new Runnable()
{
public void
run()
{
long backup_time = backup_manager.getLastBackupTime();
last_backup_time.setText( backup_time==0?"":String.valueOf( new Date( backup_time )));
last_backup_error.setText( backup_manager.getLastBackupError());
};
};
stats_updater.run();
// manual button
Label backup_manual_label = new Label(gBackup, SWT.NULL );
Messages.setLanguageText(backup_manual_label, "br.backup.manual.info");
Button backup_button = new Button(gBackup, SWT.PUSH);
Messages.setLanguageText(backup_button, "br.backup");
backup_button.addListener(SWT.Selection,
new Listener()
{
public void
handleEvent(Event event)
{
String def_dir = COConfigurationManager.getStringParameter( "br.backup.folder.default" );
DirectoryDialog dialog = new DirectoryDialog(parent.getShell(), SWT.APPLICATION_MODAL);
if ( def_dir != null ){
dialog.setFilterPath( def_dir );
}
dialog.setMessage(MessageText.getString("br.backup.folder.info"));
dialog.setText(MessageText.getString("br.backup.folder.title"));
String path = dialog.open();
if ( path != null ){
COConfigurationManager.setParameter( "br.backup.folder.default", path );
runBackup( backup_manager, path, stats_updater );
}
}
});
final BooleanParameter auto_backup_enable = new BooleanParameter( gBackup, "br.backup.auto.enable", "br.backup.auto.enable" );
gridData = new GridData();
gridData.horizontalSpan = 2;
auto_backup_enable.setLayoutData( gridData );
Composite gDefaultDir = new Composite(gBackup, SWT.NONE);
layout = new GridLayout();
layout.numColumns = 3;
layout.marginHeight = 2;
gDefaultDir.setLayout(layout);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 2;
gDefaultDir.setLayoutData(gridData);
Label lblDefaultDir = new Label(gDefaultDir, SWT.NONE);
Messages.setLanguageText(lblDefaultDir, "ConfigView.section.file.defaultdir.ask");
lblDefaultDir.setLayoutData(new GridData());
gridData = new GridData(GridData.FILL_HORIZONTAL);
final StringParameter pathParameter = new StringParameter(gDefaultDir, "br.backup.auto.dir", "" );
pathParameter.setLayoutData(gridData);
if ( pathParameter.getValue().length() == 0 ){
String def_dir = COConfigurationManager.getStringParameter( "br.backup.folder.default" );
pathParameter.setValue( def_dir );
}
Button browse = new Button(gDefaultDir, SWT.PUSH);
browse.setImage(imgOpenFolder);
imgOpenFolder.setBackground(browse.getBackground());
browse.setToolTipText(MessageText.getString("ConfigView.button.browse"));
browse.addListener(SWT.Selection, new Listener() {
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event event) {
DirectoryDialog dialog = new DirectoryDialog(parent.getShell(),
SWT.APPLICATION_MODAL);
dialog.setFilterPath(pathParameter.getValue());
dialog.setMessage(MessageText.getString("br.backup.auto.dir.select"));
dialog.setText(MessageText.getString("ConfigView.section.file.defaultdir.ask"));
String path = dialog.open();
if (path != null) {
pathParameter.setValue(path);
COConfigurationManager.setParameter( "br.backup.folder.default", path );
}
}
});
Label lbl_backup_days = new Label(gDefaultDir, SWT.NULL);
Messages.setLanguageText(lbl_backup_days, "br.backup.auto.everydays" );
IntParameter backup_everydays = new IntParameter( gDefaultDir, "br.backup.auto.everydays", 1, Integer.MAX_VALUE );
gridData = new GridData();
gridData.horizontalSpan = 2;
backup_everydays.setLayoutData( gridData );
Label lbl_backup_retain = new Label(gDefaultDir, SWT.NULL);
Messages.setLanguageText(lbl_backup_retain, "br.backup.auto.retain" );
IntParameter backup_retain = new IntParameter( gDefaultDir, "br.backup.auto.retain", 1, Integer.MAX_VALUE );
gridData = new GridData();
gridData.horizontalSpan = 2;
backup_retain.setLayoutData( gridData );
BooleanParameter chkNotify = new BooleanParameter(gDefaultDir, "br.backup.notify", "br.backup.notify");
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
chkNotify.setLayoutData(gridData);
Label backup_auto_label = new Label(gDefaultDir, SWT.NULL );
Messages.setLanguageText(backup_auto_label, "br.backup.auto.now");
Button backup_auto_button = new Button(gDefaultDir, SWT.PUSH);
Messages.setLanguageText(backup_auto_button, "br.test");
backup_auto_button.addListener(SWT.Selection,
new Listener()
{
public void
handleEvent(Event event)
{
runBackup( backup_manager, null, stats_updater );
}
});
auto_backup_enable.setAdditionalActionPerformer(new ChangeSelectionActionPerformer(gDefaultDir));
// restore
Group gRestore = new Group(cBR, SWT.NULL);
Messages.setLanguageText(gRestore, "br.restore");
layout = new GridLayout(2, false);
gRestore.setLayout(layout);
gRestore.setLayoutData(new GridData( GridData.FILL_HORIZONTAL ));
Label restore_label = new Label(gRestore, SWT.NULL );
Messages.setLanguageText(restore_label, "br.restore.info");
Button restore_button = new Button(gRestore, SWT.PUSH);
Messages.setLanguageText(restore_button, "br.restore");
restore_button.addListener(SWT.Selection,
new Listener()
{
public void
handleEvent(Event event)
{
String def_dir = COConfigurationManager.getStringParameter( "br.backup.folder.default" );
DirectoryDialog dialog = new DirectoryDialog(parent.getShell(), SWT.APPLICATION_MODAL );
if ( def_dir != null ){
dialog.setFilterPath( def_dir );
}
dialog.setMessage(MessageText.getString("br.restore.folder.info"));
dialog.setText(MessageText.getString("br.restore.folder.title"));
final String path = dialog.open();
if ( path != null ){
MessageBoxShell mb = new MessageBoxShell(
SWT.ICON_WARNING | SWT.OK | SWT.CANCEL,
MessageText.getString("br.restore.warning.title"),
MessageText.getString("br.restore.warning.info"));
mb.setDefaultButtonUsingStyle(SWT.CANCEL);
mb.setParent(parent.getShell());
mb.open(new UserPrompterResultListener() {
public void prompterClosed(int returnVal) {
if (returnVal != SWT.OK) {
return;
}
final TextViewerWindow viewer =
new TextViewerWindow(
MessageText.getString( "br.backup.progress" ),
null, "", true, true );
viewer.setEditable( false );
viewer.setOKEnabled( false );
backup_manager.restore(
new File( path ),
new BackupManager.BackupListener()
{
public boolean
reportProgress(
String str )
{
return( append( str, false ));
}
public void
reportComplete()
{
append( "Restore Complete!", true );
Utils.execSWTThread(
new AERunnable()
{
public void
runSupport()
{
MessageBoxShell mb = new MessageBoxShell(
SWT.ICON_INFORMATION | SWT.OK,
MessageText.getString( "ConfigView.section.security.restart.title" ),
MessageText.getString( "ConfigView.section.security.restart.msg" ));
mb.setParent(parent.getShell());
mb.open(
new UserPrompterResultListener()
{
public void
prompterClosed(
int returnVal)
{
UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if ( uiFunctions != null ){
uiFunctions.dispose(true, false);
}
}
});
}
});
}
public void
reportError(
Throwable error )
{
append( "Restore Failed: " + Debug.getNestedExceptionMessage( error ), true );
}
private boolean
append(
final String str,
final boolean complete )
{
if ( viewer.isDisposed()){
return( false );
}
Utils.execSWTThread(
new AERunnable()
{
public void
runSupport()
{
if ( str.endsWith( "..." )){
viewer.append( str );
}else{
viewer.append( str + "\r\n" );
}
if ( complete ){
viewer.setOKEnabled( true );
}
}
});
return( true );
}
});
viewer.goModal();
}
});
}
}
});
return( cBR );
}
private void
runBackup(
BackupManager backup_manager,
String path,
final Runnable stats_updater )
{
final TextViewerWindow viewer =
new TextViewerWindow(
MessageText.getString( "br.backup.progress" ),
null, "", true, true );
viewer.setEditable( false );
viewer.setOKEnabled( false );
BackupManager.BackupListener listener =
new BackupManager.BackupListener()
{
public boolean
reportProgress(
String str )
{
return( append( str, false ));
}
public void
reportComplete()
{
append( "Backup Complete!", true );
}
public void
reportError(
Throwable error )
{
append( "Backup Failed: " + Debug.getNestedExceptionMessage( error ), true );
}
private boolean
append(
final String str,
final boolean complete )
{
if ( viewer.isDisposed()){
return( false );
}
Utils.execSWTThread(
new AERunnable()
{
public void
runSupport()
{
if ( str.endsWith( "..." )){
viewer.append( str );
}else{
viewer.append( str + "\r\n" );
}
if ( complete ){
viewer.setOKEnabled( true );
stats_updater.run();
}
}
});
return( true );
}
};
if ( path == null ){
backup_manager.runAutoBackup( listener );
}else{
backup_manager.backup( new File( path ), listener );
}
viewer.goModal();
}
}