/*
* File : ProgressWindow.java
* Created : 15-Jan-2004
* By : parg
*
* Azureus - a Java Bittorrent client
*
* 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
*/
package org.gudy.azureus2.ui.swt.sharing.progress;
/**
* @author parg
*
*/
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.*;
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.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.animations.Animator;
import org.gudy.azureus2.ui.swt.animations.shell.AnimableShell;
import org.gudy.azureus2.ui.swt.animations.shell.LinearAnimator;
import org.gudy.azureus2.ui.swt.mainwindow.SWTThread;
import org.gudy.azureus2.ui.swt.shells.PopupShell;
import org.gudy.azureus2.plugins.sharing.ShareException;
import org.gudy.azureus2.plugins.sharing.ShareManager;
import org.gudy.azureus2.plugins.sharing.ShareManagerListener;
import org.gudy.azureus2.plugins.sharing.ShareResource;
public class
ProgressWindow
implements ShareManagerListener
{
private ShareManager share_manager;
private progressDialog dialog = null;
private Display display;
private StyledText tasks;
private ProgressBar progress;
private Button cancel_button;
private boolean shell_opened;
private boolean manually_hidden;
public
ProgressWindow()
{
try{
share_manager = PluginInitializer.getDefaultInterface().getShareManager();
display = SWTThread.getInstance().getDisplay();
if ( display.isDisposed()){
return;
}
share_manager.addListener(this);
}catch( ShareException e ){
Debug.printStackTrace( e );
}
}
private class
progressDialog
extends PopupShell
implements AnimableShell
{
protected
progressDialog(
Display dialog_display )
{
super(dialog_display);
if ( dialog_display.isDisposed()){
return;
}
shell.setText(MessageText.getString("sharing.progress.title"));
tasks = new StyledText(shell, SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
tasks.setBackground(dialog_display.getSystemColor(SWT.COLOR_WHITE));
progress = new ProgressBar(shell, SWT.NULL);
progress.setMinimum(0);
progress.setMaximum(100);
Button hide_button = new Button(shell,SWT.PUSH);
hide_button.setText(MessageText.getString("sharing.progress.hide"));
cancel_button = new Button(shell,SWT.PUSH);
cancel_button.setText(MessageText.getString("sharing.progress.cancel"));
cancel_button.setEnabled( false );
//Layout :
//Progress Bar on bottom, with Hide button next to it.
FormData formData;
formData = new FormData();
formData.right = new FormAttachment(100,-5);
formData.bottom = new FormAttachment(100,-10);
hide_button.setLayoutData(formData);
formData = new FormData();
formData.right = new FormAttachment(hide_button,-5);
formData.bottom = new FormAttachment(100,-10);
cancel_button.setLayoutData(formData);
formData = new FormData();
formData.right = new FormAttachment(cancel_button,-5);
formData.left = new FormAttachment(0,50);
formData.bottom = new FormAttachment(100,-10);
progress.setLayoutData(formData);
formData = new FormData();
formData.right = new FormAttachment(100,-5);
formData.bottom = new FormAttachment(100,-50);
formData.top = new FormAttachment(0,5);
formData.left = new FormAttachment(0,5);
tasks.setLayoutData(formData);
layout();
cancel_button.addListener(SWT.Selection,new Listener() {
public void handleEvent(Event e) {
cancel_button.setEnabled( false );
share_manager.cancelOperation();
}
});
hide_button.addListener(SWT.Selection,new Listener() {
public void handleEvent(Event e) {
hidePanel();
}
});
shell.setDefaultButton( hide_button );
shell.addListener(SWT.Traverse, new Listener() {
public void handleEvent(Event e) {
if ( e.character == SWT.ESC){
hidePanel();
}
}
});
Rectangle bounds = dialog_display.getClientArea();
x0 = bounds.x + bounds.width - 255;
x1 = bounds.x + bounds.width;
y0 = bounds.y + bounds.height;
y1 = bounds.y + bounds.height - 155;
shell.setLocation(x0,y0);
}
protected void
hidePanel()
{
manually_hidden = true;
currentAnimator = new LinearAnimator(this,new Point(x0,y1),new Point(x1,y1),15,30);
currentAnimator.start();
hideAfter = true;
}
protected void
showPanel()
{
manually_hidden = false;
boolean animate = false ;
if ( !shell_opened ){
shell_opened = true;
shell.open();
animate = true ;
}
Shell otherShell = Utils.findAnyShell();
if (otherShell != null) {
shell.moveAbove(otherShell);
}
if ( !shell.isVisible()){
shell.setVisible(true);
animate = true ;
}
if(animate && currentAnimator == null) {
currentAnimator = new LinearAnimator(this,new Point(x0,y0),new Point(x0,y1),15,30);
currentAnimator.start();
}
}
protected boolean
isShown()
{
return( shell.isVisible());
}
//Animation properties
Animator currentAnimator;
int x0,y0,x1,y1;
boolean isAnimated;
boolean hideAfter;
public void animationEnded(Animator source) {
if(source != currentAnimator)
return;
isAnimated = false;
currentAnimator = null;
if(hideAfter) {
hideAfter = false;
if(display == null || display.isDisposed())
return;
display.asyncExec(new AERunnable() {
public void runSupport() {
shell.setVisible(false);
}
});
}
}
public void animationStarted(Animator source) {
}
public Shell getShell() {
return shell;
}
public void reportPercent(int percent) {
}
}
public void
resourceAdded(
ShareResource resource )
{
// we don't want to pick these additions up
if ( !share_manager.isInitialising()){
reportCurrentTask( "Resource added: " + resource.getName());
}
}
public void
resourceModified(
ShareResource resource )
{
reportCurrentTask( "Resource modified: " + resource.getName());
}
public void
resourceDeleted(
ShareResource resource )
{
reportCurrentTask( "Resource deleted: " + resource.getName());
}
public void
reportProgress(
final int percent_complete )
{
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (progress != null && !progress.isDisposed()) {
if (dialog == null) {
dialog = new progressDialog(display);
if (dialog == null) {
return;
}
}
// only allow percentage updates to make the window visible
// if it hasn't been manually hidden
if (!dialog.isShown() && !manually_hidden) {
dialog.showPanel();
}
cancel_button.setEnabled(percent_complete < 100);
progress.setSelection(percent_complete);
}
}
});
}
public void
reportCurrentTask(
final String task_description )
{
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (dialog == null) {
dialog = new progressDialog(display);
if (dialog == null) {
return;
}
}
if (tasks != null && !tasks.isDisposed()) {
dialog.showPanel();
tasks.append(task_description + Text.DELIMITER);
int lines = tasks.getLineCount();
// tasks(nbLines - 2, 1, colors[_color]);
tasks.setTopIndex(lines - 1);
}
}
});
}
}