/************************************************************************************* * Copyright (c) 2010-2013 Red Hat, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * JBoss by Red Hat - Initial implementation. ************************************************************************************/ package org.jboss.tools.runtime.ui.internal.wizard; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Table; import org.jboss.tools.foundation.ui.util.BrowserUtility; import org.jboss.tools.foundation.ui.xpl.taskwizard.IWizardHandle; import org.jboss.tools.foundation.ui.xpl.taskwizard.WizardFragment; import org.jboss.tools.runtime.core.RuntimeCoreActivator; import org.jboss.tools.runtime.core.model.DownloadRuntime; import org.jboss.tools.runtime.ui.RuntimeUIActivator; import org.jboss.tools.runtime.ui.RuntimeUIExtensionManager; import org.jboss.tools.runtime.ui.internal.Messages; import org.jboss.tools.runtime.ui.internal.dialogs.AutoResizeTableLayout; import org.jboss.tools.runtime.ui.wizard.DownloadRuntimesTaskWizard; /** * * @author snjeza * */ public class SelectDownloadRuntimeFragment extends WizardFragment { private Map<String, DownloadRuntime> downloadRuntimes; private TableViewer viewer; private Link urlLink, projectLink; private Label restrictionsLabel; private DownloadRuntime selectedRuntime; private String projectLinkText = null; private String urlLinkText = null; private String restrictionsLabelText = null; private IWizardHandle handle; /** * This method is unsafe because it provides the opportunity to block during the call to getDownloadRuntimes() * @deprecated */ public SelectDownloadRuntimeFragment() { this(RuntimeCoreActivator.getDefault().getDownloadRuntimes()); } public SelectDownloadRuntimeFragment(Map<String, DownloadRuntime> downloadRuntimes) { this.downloadRuntimes = downloadRuntimes; } @Override public boolean hasComposite() { return true; } @Override public Composite createComposite(final Composite parent, IWizardHandle handle) { this.handle = handle; getPage().setTitle(Messages.DownloadRuntimesWizardFirstPage_Download_Runtimes); getPage().setDescription(Messages.DownloadRuntimesWizardFirstPage_Please_select_a_runtime); Composite contentsWrapper = new Composite(parent, SWT.BORDER); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); contentsWrapper.setLayoutData(gd); contentsWrapper.setLayout(new FormLayout()); SashForm contents = new SashForm(contentsWrapper, SWT.VERTICAL); FormData contentsData = new FormData(); contentsData.top = new FormAttachment(0,0); contentsData.bottom = new FormAttachment(100,0); contentsData.left = new FormAttachment(0,0); contentsData.right = new FormAttachment(100,0); contentsData.width = 200; contentsData.height = 400; contents.setLayoutData(contentsData); if (downloadRuntimes == null || downloadRuntimes.isEmpty()) { new Label(contents, SWT.NONE).setText(Messages.DownloadRuntimesWizardFirstPage_No_available_runtime); setComplete(false); return contentsWrapper; } viewer = createTable(contents, parent.getFont()); final Group g = new Group(contents, SWT.DEFAULT); g.setText("Selected Runtime Details"); g.setLayout(new GridLayout(2, false)); Label pUrlLabel = new Label(g, SWT.NONE); pUrlLabel.setText("Project URL: "); projectLink = new Link(g, SWT.NONE); Label dUrlLabel = new Label(g, SWT.NONE); dUrlLabel.setText("Download URL: "); urlLink = new Link(g, SWT.NONE); GridData plGD = new GridData(SWT.FILL, SWT.FILL, true, false); GridData dlGD = new GridData(SWT.FILL, SWT.FILL, true, true); GridData lGD = new GridData(SWT.FILL, SWT.FILL, false, false); pUrlLabel.setLayoutData(lGD); dUrlLabel.setLayoutData(lGD); urlLink.setLayoutData(dlGD); projectLink.setLayoutData(plGD); restrictionsLabel = new Label(g, SWT.WRAP); GridData restrictionLabelGD = new GridData(SWT.FILL, SWT.FILL, true, true); restrictionLabelGD.horizontalSpan = 2; restrictionsLabel.setLayoutData(restrictionLabelGD); urlLink.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { new BrowserUtility().checkedCreateExternalBrowser(selectedRuntime.getUrl(), RuntimeUIActivator.PLUGIN_ID, RuntimeUIActivator.getDefault().getLog()); } }); projectLink.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { new BrowserUtility().checkedCreateExternalBrowser(selectedRuntime.getHumanUrl(), RuntimeUIActivator.PLUGIN_ID, RuntimeUIActivator.getDefault().getLog()); } }); contents.setWeights(new int[]{5,2}); StructuredSelection ss = new StructuredSelection(); viewer.setSelection(ss); return contentsWrapper; } protected TableViewer createTable(Composite contents, Font font) { TableViewer viewer = new TableViewer(contents, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); table.setFont(font); viewer.setContentProvider(new DownloadRuntimesContentProvider()); String[] columnHeaders = {Messages.DownloadRuntimesWizardFirstPage_Name, Messages.DownloadRuntimesWizardFirstPage_Version}; for (int i = 0; i < columnHeaders.length; i++) { TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); column.setLabelProvider(new DownloadRuntimesLabelProvider(i)); column.getColumn().setText(columnHeaders[i]); column.getColumn().setResizable(true); column.getColumn().setMoveable(true); } ColumnLayoutData[] runtimePathsLayouts= { new ColumnWeightData(100,100), new ColumnWeightData(50,50), }; TableLayout layout = new AutoResizeTableLayout(table); for (int i = 0; i < runtimePathsLayouts.length; i++) { layout.addColumnData(runtimePathsLayouts[i]); } viewer.setInput(downloadRuntimes); viewer.getTable().setLayout(layout); viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { ISelection sel = event.getSelection(); selectRuntime(sel); } }); return viewer; } private HashMap<DownloadRuntime, WizardFragment[]> fragmentMap; public List<WizardFragment> getChildFragments() { ArrayList<WizardFragment> list = new ArrayList<WizardFragment>(); if( selectedRuntime != null ) { if( fragmentMap == null ) { fragmentMap = new HashMap<DownloadRuntime, WizardFragment[]>(); } WizardFragment[] frags = fragmentMap.get(selectedRuntime); if( frags == null ) { frags = RuntimeUIExtensionManager.createFragmentsForRuntime(selectedRuntime); fragmentMap.put(selectedRuntime, frags); } WizardFragment[] nullSafe = (frags == null ? new WizardFragment[0] : frags); list.addAll(Arrays.asList(nullSafe)); } return list; } private void selectRuntime(ISelection sel, boolean updateWidgets) { selectedRuntime = null; setComplete(false); if (sel instanceof IStructuredSelection) { selectedRuntime = (DownloadRuntime) ((IStructuredSelection) sel).getFirstElement(); if( selectedRuntime != null ) { String projectUrl = selectedRuntime.getHumanUrl(); String dlUrl = selectedRuntime.getUrl(); if( projectLink != null ) { projectLinkText = projectUrl == null ? "None" : "<a>" + projectUrl + "</a>"; } if( urlLink != null ) { urlLinkText = dlUrl == null ? "None" : "<a>" + dlUrl + "</a>"; } if( restrictionsLabel != null ) { Object subscription = selectedRuntime.getProperty(DownloadRuntime.PROPERTY_REQUIRES_CREDENTIALS); if( subscription != null && Boolean.parseBoolean(subscription.toString())) { restrictionsLabelText = "Registration required. Downloads require accepting the terms and conditions of the JBoss Developer Program which provides $0 subscriptions for development use only."; } else { restrictionsLabelText = ""; } } } } setComplete(selectedRuntime != null); getTaskModel().putObject(DownloadRuntimesTaskWizard.DL_RUNTIME_PROP, selectedRuntime); handle.update(); if( updateWidgets) { projectLink.setText(projectLinkText == null ? "" : projectLinkText); urlLink.setText(urlLinkText == null ? "" : urlLinkText); restrictionsLabel.setText(restrictionsLabelText == null ? "" : restrictionsLabelText); } } private void selectRuntime(ISelection sel) { selectRuntime(sel, true); } class DownloadRuntimesContentProvider implements IStructuredContentProvider { @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public Object[] getElements(Object inputElement) { DownloadRuntime[] runtimes = downloadRuntimes.values().toArray(new DownloadRuntime[0]); Arrays.sort(runtimes, new Comparator<DownloadRuntime>() { @Override public int compare(DownloadRuntime o1, DownloadRuntime o2) { if (o1 == null && o2 == null) { return 0; } if (o1 == null) { return 1; } if (o2 == null) { return -1; } String s1 = o1.getName(); String s2 = o2.getName(); if (s1 == null && s2 == null) { return 0; } if (s1 == null) { return 1; } if (s2 == null) { return -1; } return s1.compareTo(s2); } }); return runtimes; } @Override public void dispose() { } } class DownloadRuntimesLabelProvider extends ColumnLabelProvider { private int columnIndex; public DownloadRuntimesLabelProvider(int i) { this.columnIndex = i; } public String getText(Object element) { if (element instanceof DownloadRuntime) { DownloadRuntime downloadRuntime = (DownloadRuntime) element; switch (columnIndex) { case 0: return downloadRuntime.getName(); case 1: return downloadRuntime.getVersion(); case 2: return downloadRuntime.getUrl(); } } return null; } } }