/* * Created on 29 nov. 2004 * Created by Olivier Chalouhi * * 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.pluginsinstaller; import java.util.*; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.gudy.azureus2.core3.html.HTMLUtils; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.util.AERunnable; import org.gudy.azureus2.core3.util.AEThread2; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.plugins.installer.InstallablePlugin; import org.gudy.azureus2.plugins.installer.StandardPlugin; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.components.LinkArea; import org.gudy.azureus2.ui.swt.shells.CoreWaiterSWT; import org.gudy.azureus2.ui.swt.shells.CoreWaiterSWT.TriggerInThread; import org.gudy.azureus2.ui.swt.wizard.AbstractWizardPanel; import org.gudy.azureus2.ui.swt.wizard.IWizardPanel; import com.aelitis.azureus.core.AzureusCore; import com.aelitis.azureus.core.AzureusCoreRunningListener; /** * @author Olivier Chalouhi * */ public class IPWListPanel extends AbstractWizardPanel<InstallPluginWizard> { Table pluginList; LinkArea link_area; public IPWListPanel( InstallPluginWizard wizard, IWizardPanel<InstallPluginWizard> previous ) { super(wizard, previous); } public void show() { wizard.setTitle(MessageText.getString("installPluginsWizard.list.title")); wizard.setErrorMessage(""); Composite rootPanel = wizard.getPanel(); GridLayout layout = new GridLayout(); layout.numColumns = 1; rootPanel.setLayout(layout); Composite panel = new Composite(rootPanel, SWT.NULL); GridData gridData = new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.FILL_HORIZONTAL); panel.setLayoutData(gridData); layout = new GridLayout(); layout.numColumns = 1; panel.setLayout(layout); final Label lblStatus = new Label(panel,SWT.NULL); GridData data = new GridData(GridData.FILL_HORIZONTAL); lblStatus.setLayoutData(data); Messages.setLanguageText(lblStatus,"installPluginsWizard.list.loading"); pluginList = new Table(panel,SWT.BORDER | SWT.V_SCROLL | SWT.CHECK | SWT.FULL_SELECTION | SWT.SINGLE); pluginList.setHeaderVisible(true); data = new GridData(GridData.FILL_HORIZONTAL); data.heightHint = 120; pluginList.setLayoutData(data); TableColumn tcName = new TableColumn(pluginList,SWT.LEFT); Messages.setLanguageText(tcName,"installPluginsWizard.list.name"); tcName.setWidth(200); TableColumn tcVersion = new TableColumn(pluginList,SWT.LEFT); Messages.setLanguageText(tcVersion,"installPluginsWizard.list.version"); tcVersion.setWidth(150); Label lblDescription = new Label(panel,SWT.NULL); Messages.setLanguageText(lblDescription,"installPluginsWizard.list.description"); link_area = new LinkArea( panel ); data = new GridData(GridData.FILL_HORIZONTAL); data.heightHint = 100; link_area.getComponent().setLayoutData(data); CoreWaiterSWT.waitForCore(TriggerInThread.NEW_THREAD, new AzureusCoreRunningListener() { public void azureusCoreRunning(AzureusCore core) { final StandardPlugin plugins[]; try { plugins = wizard.getStandardPlugins(core); Arrays.sort( plugins, new Comparator<StandardPlugin>() { public int compare( StandardPlugin o1, StandardPlugin o2) { return( o1.getName().compareToIgnoreCase( o2.getName())); } }); } catch(final Exception e) { Debug.printStackTrace(e); wizard.getDisplay().asyncExec(new AERunnable() { public void runSupport() { link_area.addLine( Debug.getNestedExceptionMessage(e)); } }); return; } wizard.getDisplay().asyncExec(new AERunnable() { public void runSupport() { lblStatus.setText( ((InstallPluginWizard)wizard).getListTitleText()); List<InstallablePlugin> selected_plugins = wizard.getPluginList(); for(int i = 0 ; i < plugins.length ; i++) { StandardPlugin plugin = plugins[i]; if(plugin.getAlreadyInstalledPlugin() == null) { if(pluginList == null || pluginList.isDisposed()) return; TableItem item = new TableItem(pluginList,SWT.NULL); item.setData(plugin); item.setText(0,plugin.getName()); boolean selected = false; for (int j=0;j<selected_plugins.size();j++){ if ( selected_plugins.get(j).getId() == plugin.getId()){ selected = true; } } item.setChecked( selected ); item.setText(1,plugin.getVersion()); } } // if there's only one entry then we might as well pull it in (this is really to // support explicit install directions in the wizard as opposed to selection from // the SF list ) if ( plugins.length == 1 && pluginList.getItemCount() > 0 ){ pluginList.select(0); loadPluginDetails( pluginList.getItem(0)); } } }); } }); pluginList.addListener(SWT.Selection,new Listener() { public void handleEvent(Event e) { if(pluginList.getSelectionCount() > 0) { loadPluginDetails( pluginList.getSelection()[0]); } updateList(); } }); } protected void loadPluginDetails( final TableItem selected_item ) { link_area.reset(); link_area.addLine( MessageText.getString( "installPluginsWizard.details.loading")); final StandardPlugin plugin = (StandardPlugin) selected_item.getData(); AEThread2 detailsLoader = new AEThread2("Detail Loader") { public void run() { final String description = HTMLUtils.convertListToString(HTMLUtils.convertHTMLToText(plugin.getDescription(),"")); wizard.getDisplay().asyncExec(new AERunnable() { public void runSupport() { if(pluginList == null || pluginList.isDisposed() || pluginList.getSelectionCount() ==0) return; if(pluginList.getSelection()[0] != selected_item) return; link_area.reset(); link_area.setRelativeURLBase( plugin.getRelativeURLBase()); link_area.addLine(description); } }); } }; detailsLoader.start(); } public boolean isNextEnabled() { return(((InstallPluginWizard)wizard).getPluginList().size() > 0 ); } public IWizardPanel<InstallPluginWizard> getNextPanel() { return new IPWInstallModePanel(wizard,this); } public void updateList() { ArrayList<InstallablePlugin> list = new ArrayList<InstallablePlugin>(); TableItem[] items = pluginList.getItems(); for(int i = 0 ; i < items.length ; i++) { if(items[i].getChecked()){ list.add((InstallablePlugin)items[i].getData()); } } wizard.setPluginList( list ); wizard.setNextEnabled( isNextEnabled() ); } }