/* * Created on Mar 6, 2009 * Created by Paul Gardner * * Copyright 2009 Vuze, Inc. 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; version 2 of the License only. * * 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. */ package org.gudy.azureus2.ui.swt.update; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.ProgressBar; import org.gudy.azureus2.core3.util.AEThread2; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.plugins.update.Update; import org.gudy.azureus2.plugins.update.UpdateCheckInstance; import org.gudy.azureus2.plugins.utils.resourcedownloader.ResourceDownloader; import org.gudy.azureus2.plugins.utils.resourcedownloader.ResourceDownloaderAdapter; import org.gudy.azureus2.ui.swt.Utils; public class SimpleInstallUI { private UpdateMonitor monitor; private UpdateCheckInstance instance; private boolean cancelled; private ResourceDownloader current_downloader; protected SimpleInstallUI( UpdateMonitor _monitor, UpdateCheckInstance _instance ) { monitor = _monitor; instance = _instance; try{ monitor.addDecisionHandler(_instance ); Utils.execSWTThread( new Runnable() { public void run() { try{ build(); }catch( Throwable e ){ Debug.out( e ); instance.cancel(); } } }); }catch( Throwable e ){ Debug.out( e ); instance.cancel(); } } protected void build() { Composite parent = (Composite)instance.getProperty( UpdateCheckInstance.PT_UI_PARENT_SWT_COMPOSITE ); if ( parent != null ){ if (parent.isDisposed()) { throw( new RuntimeException( "cancelled" )); } build( parent ); }else{ throw( new RuntimeException( "borkeroo" )); } } protected void build( Composite parent ) { parent.setLayout(new FormLayout()); Button cancel_button = new Button( parent, SWT.NULL ); cancel_button.setText( "Cancel" ); cancel_button.addListener( SWT.Selection, new Listener() { public void handleEvent( Event arg0 ) { synchronized( SimpleInstallUI.this ){ cancelled = true; if ( current_downloader != null ){ current_downloader.cancel(); } } instance.cancel(); } }); FormData data = new FormData(); data.right = new FormAttachment(100,0); data.top = new FormAttachment(0,0); data.bottom = new FormAttachment(100,0); cancel_button.setLayoutData( data ); final Label label = new Label(parent, SWT.NULL ); label.setText( "blah blah " ); data = new FormData(); data.left = new FormAttachment(0,0); data.top = new FormAttachment(cancel_button,0, SWT.CENTER); label.setLayoutData( data ); final ProgressBar progress = new ProgressBar(parent, SWT.NULL ); progress.setMinimum( 0 ); progress.setMaximum( 100 ); progress.setSelection( 0 ); data = new FormData(); data.left = new FormAttachment(label,4); data.top = new FormAttachment(cancel_button, 0, SWT.CENTER); data.right = new FormAttachment(cancel_button,-4); progress.setLayoutData( data ); parent.layout( true, true ); new AEThread2( "SimpleInstallerUI", true ) { public void run() { try{ Update[] updates = instance.getUpdates(); for ( Update update: updates ){ String name = update.getName(); int pos = name.indexOf('/'); if ( pos >= 0 ){ name = name.substring( pos+1 ); } setLabel( name ); ResourceDownloader[] downloaders = update.getDownloaders(); for ( ResourceDownloader downloader: downloaders ){ synchronized( SimpleInstallUI.this ){ if ( cancelled ){ return; } current_downloader = downloader; } setProgress( 0 ); downloader.addListener( new ResourceDownloaderAdapter() { public void reportPercentComplete( ResourceDownloader downloader, int percentage ) { setProgress( percentage ); } public void reportAmountComplete( ResourceDownloader downloader, long amount ) { } }); downloader.download(); } } boolean restart_required = false; for (int i=0;i<updates.length;i++){ if ( updates[i].getRestartRequired() == Update.RESTART_REQUIRED_YES ){ restart_required = true; } } if ( restart_required ){ monitor.handleRestart(); } }catch( Throwable e ){ Debug.out( "Install failed", e ); instance.cancel(); } } protected void setLabel( final String str ) { Utils.execSWTThread( new Runnable() { public void run() { if (label != null && !label.isDisposed()) { label.setText( str ); label.getParent().layout(); } } }); } protected void setProgress( final int percent ) { Utils.execSWTThread( new Runnable() { public void run() { if (progress != null && !progress.isDisposed()) { progress.setSelection( percent ); } } }); } }.start(); } }