/******************************************************************************* * Copyright (c) 2007, 2008 IBM Corporation 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: * IBM Corporation - Initial API and implementation *******************************************************************************/ package org.eclipse.wst.server.discovery.internal.wizard; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.*; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.wst.server.discovery.internal.ExtensionUtility; import org.eclipse.wst.server.discovery.internal.ImageResource; import org.eclipse.wst.server.discovery.internal.Messages; import org.eclipse.wst.server.discovery.internal.Trace; import org.eclipse.wst.server.discovery.internal.model.Extension; /** * */ public class ExtensionComposite extends Composite { private static final String ROOT = "root"; public interface ExtensionSelectionListener { public void extensionSelected(Extension extension); } protected Table table; protected TableViewer tableViewer; protected Font font; protected HashMap<String, Image> images; protected String progress; protected int totalWork; protected double currentWork; protected int count; public ExtensionSelectionListener listener; public ExtensionComposite(Composite parent, int style, ExtensionSelectionListener listener) { super(parent, style); this.listener = listener; GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 5; layout.horizontalSpacing = 5; //layout.numColumns = 2; setLayout(layout); Font currentFont = getFont(); FontData[] fd = currentFont.getFontData(); int size2 = fd.length; for (int i = 0; i < size2; i++) { fd[i].setHeight(fd[i].getHeight() + 2); fd[i].setStyle(SWT.BOLD); } font = new Font(getDisplay(), fd); table = new Table(this, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI | SWT.FULL_SELECTION); GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL); //data.horizontalSpan = 2; //data.heightHint = 250; data.widthHint = 350; table.setLayoutData(data); //table.setLinesVisible(true); table.setHeaderVisible(false); tableViewer = new TableViewer(table); table.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { disposeResources(); } }); TableLayout tableLayout = new TableLayout(); table.setLayout(tableLayout); /*tableLayout.addColumnData(new ColumnPixelData(90, false)); //tableLayout.addColumnData(new ColumnWeightData(8, 80, true)); TableColumn col2 = new TableColumn(table, SWT.NONE); col2.setText("null"); */ tableLayout.addColumnData(new ColumnWeightData(10, 250, false)); final TableColumn col = new TableColumn(table, SWT.NONE); col.setText("null"); /*col.setWidth(300); col.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { col.pack(); } });*/ //tableLayout.addColumnData(new ColumnWeightData(30, 250, false)); //TableColumn col2 = new TableColumn(table, SWT.NONE); //col2.setText("null2"); final int TEXT_MARGIN = 3; table.addListener(SWT.MeasureItem, new Listener() { public void handleEvent(Event event) { //System.out.println(event.width); /*TableItem item = (TableItem) event.item; Object obj = item.getData(); //System.out.println("measure " + obj); if (obj instanceof CoreException) { event.gc.setFont(font); Point size = event.gc.textExtent("A"); event.gc.setFont(null); //event.height = Math.max(event.height, TEXT_MARGIN * 2 + size.y); event.height = TEXT_MARGIN * 2 + size.y; System.out.println(event.height); return; }*/ event.gc.setFont(font); Point size = event.gc.textExtent("A"); int h = TEXT_MARGIN * 3 + size.y; size = event.gc.textExtent("A"); event.gc.setFont(null); h += size.y; h = Math.max(h, 40 + TEXT_MARGIN * 2); //event.width = 400; event.height = Math.max(event.height, h); //System.out.println(event.height); //event.width = 300; } }); table.addListener(SWT.EraseItem, new Listener() { public void handleEvent(Event event) { //if (event.index == 0) // return; event.detail &= ~SWT.FOREGROUND; //event.detail &= ~SWT.BACKGROUND; } }); table.addListener(SWT.PaintItem, new Listener() { public void handleEvent(Event event) { //if (event.index == 0) // return; TableItem item = (TableItem) event.item; Object obj = item.getData(); int width = table.getColumn(0).getWidth(); GC gc = event.gc; if (obj instanceof String) { String s = (String) obj; if (progress != null) s = progress; int h = event.y + event.height / 2; Point size = event.gc.textExtent(s); gc.drawText(s, event.x + TEXT_MARGIN, h - size.y/2, true); int hh = event.y + event.height - 5 - TEXT_MARGIN - 1; gc.setLineWidth(2); Color color = getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION); gc.setBackground(color); int width2 = 0; int step = 9; if (totalWork > 0) width2 = (int) ((width - step * 2 - 15 - TEXT_MARGIN * 2) * currentWork / totalWork); for (int i = 0; i < width2; i+= step) { gc.fillRectangle(event.x + TEXT_MARGIN + i, hh, step - 2, 5); } return; } else if (obj instanceof List) { List<String> list = (List<String>) obj; int size = list.size(); String[] hosts = new String[size]; list.toArray(hosts); StringBuffer sb = new StringBuffer(); for (int i = 0; i < size; i++) { if (i > 0) sb.append(", "); sb.append(hosts[i]); } String s = NLS.bind(Messages.discoverSiteError, sb.toString()); gc.drawText(s, event.x + TEXT_MARGIN, event.y + TEXT_MARGIN, true); return; } Extension ei = (Extension) obj; if (ei == null) return; //if ((event.detail & SWT.SELECTED) == 0) { // //event.gc.setForeground(); // //event.gc.fillRectangle(0, 0, width, 5); // event.gc.setBackground(getBackground()); // event.gc.setForeground(getForeground()); // event.gc.fillRectangle(event.x, event.y, width, event.height); //} //System.out.println(width + " " + event.width + " " + event.x); String name = ei.getName(); String provider = "" + ei.getProvider(); //String provider = "" + ei.getImage(); //String provider = "" + ExtensionUtility.getDescription(ei); String version = ei.getVersion().toString(); /*int ind = ver.indexOf("_"); if (ind >= 0) ver = ver.substring(ind+1); String version = "v" + ver;*/ //Image image = getImage(ei.getImage()); Image image = ei.getImage(); if (image == null) image = ImageResource.getImage(ImageResource.IMG_WIZARD); // TODO int iw = image.getBounds().width; int ih = image.getBounds().height; gc.drawImage(image, 0, 0, iw, ih, event.x + TEXT_MARGIN, event.y + TEXT_MARGIN, 40, 40); iw = 40 + TEXT_MARGIN * 2; int yOffset = TEXT_MARGIN; gc.setFont(font); Point size = new Point(0, 0); if (name != null) { gc.drawText(name, event.x + iw, event.y + yOffset, true); size = event.gc.textExtent(name); } gc.setFont(null); yOffset += size.y + TEXT_MARGIN; gc.drawText(provider, event.x + iw, event.y + yOffset, true); size = event.gc.textExtent(version); gc.drawText(version, event.x + width - TEXT_MARGIN * 3 - size.x, event.y + yOffset, true); } }); tableViewer.setSorter(new ViewerSorter() { public int compare(Viewer viewer, Object e1, Object e2) { if ((e1 instanceof Extension) && !(e2 instanceof Extension)) return -1; if (!(e1 instanceof Extension) && (e2 instanceof Extension)) return 1; try { Extension f1 = (Extension) e1; Extension f2 = (Extension) e2; return (f1.getName().compareToIgnoreCase(f2.getName())); } catch (Exception e) { return 0; } } }); /*Composite buttonComp = new Composite(this, SWT.NONE); buttonComp.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING)); layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; buttonComp.setLayout(layout); Button install = SWTUtil.createButton(buttonComp, "Find Updates"); install.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { // } });*/ final Label description = new Label(this, SWT.WRAP); description.setText("Multi\nLine\nMessage"); Dialog.applyDialogFont(this); Point p = description.computeSize(SWT.DEFAULT, SWT.DEFAULT); description.setText(""); data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER); data.horizontalSpan = 2; if (p.y > 10) data.heightHint = p.y; else data.heightHint = 42; description.setLayoutData(data); /*final Label download = new Label(this, SWT.NONE); data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER); data.horizontalSpan = 2; download.setLayoutData(data); download.setText("Download size: ");*/ tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { StructuredSelection sel = (StructuredSelection) tableViewer.getSelection(); Object obj = sel.getFirstElement(); Extension extension = null; if (obj instanceof Extension) extension = (Extension) obj; handleSelection(extension); if (extension != null) description.setText(extension.getDescription()); else description.setText(""); /*long size = feature.getDownloadSize(); String s = "<unknown>"; if (size > 0) s = size + " Kb"; download.setText("Download size: " + s);*/ } }); deferInitialization(); } protected Image getImage(URL url) { if (url == null) return null; try { Image image = images.get(url.toString()); if (image != null) return image; } catch (Exception e) { // ignore } try { ImageDescriptor id = ImageDescriptor.createFromURL(url); Image image = id.createImage(); if (images == null) images = new HashMap<String, Image>(); images.put(url.toString(), image); return image; } catch (Exception e) { Trace.trace(Trace.INFO, "Could not create image", e); } return null; } protected void disposeResources() { try { font.dispose(); if (images != null) { Iterator iterator = images.values().iterator(); while (iterator.hasNext()) { Image image = (Image) iterator.next(); image.dispose(); } } } catch (Exception e) { Trace.trace(Trace.WARNING, "Could not dispose - possible resource leak", e); } } protected void handleSelection(Extension extension) { listener.extensionSelected(extension); } protected void deferInitialization() { final List<Object> list = Collections.synchronizedList(new ArrayList<Object>()); list.add(Messages.viewInitializing); tableViewer.setContentProvider(new ExtensionContentProvider(list)); tableViewer.setLabelProvider(new ExtensionTableLabelProvider()); tableViewer.setInput(ROOT); final Thread t = new Thread("Deferred Initialization") { public void run() { deferredInitialize(list, new IProgressMonitor() { public void beginTask(String name, int totalWork2) { totalWork = totalWork2; progress = name; } public void setTaskName(String name) { progress = name; } public void subTask(String name) { progress = name; } public void done() { // } public void internalWorked(double work) { currentWork += work; } public boolean isCanceled() { return false; } public void setCanceled(boolean value) { // } public void worked(int work) { currentWork += work; } }); } }; t.setDaemon(true); t.start(); final Display display = getDisplay(); final int SLEEP = 100; final Runnable[] animator = new Runnable[1]; animator[0] = new Runnable() { public void run() { if (t.isAlive()) { count++; if (!table.isDisposed()) tableViewer.refresh(ROOT); display.timerExec(SLEEP, animator[0]); } } }; display.timerExec(SLEEP, animator[0]); } public void deferredInitialize(final List<Object> list, IProgressMonitor monitor) { final List<String> failedSites = new ArrayList<String>(); ExtensionUtility.ExtensionListener listener2 = new ExtensionUtility.ExtensionListener() { public void extensionFound(Extension extension) { list.add(extension); if (progress != null) list.set(0, progress); } public void extensionRemoved(Extension feature) { list.remove(feature); } public void siteFailure(String host) { synchronized (failedSites) { if (!list.contains(failedSites)) list.add(failedSites); failedSites.add(host); } } }; String id = "org.eclipse.wst.server.core.serverAdapter"; // TODO try { ExtensionUtility.getAllExtensions(id, listener2, monitor); } catch (CoreException ce) { Trace.trace(Trace.WARNING, "Error downloading server adapter info", ce); } list.remove(0); Display.getDefault().asyncExec(new Runnable() { public void run() { if (!table.isDisposed()) tableViewer.refresh(ROOT); } }); } protected Object getSelection(ISelection sel2) { IStructuredSelection sel = (IStructuredSelection) sel2; return sel.getFirstElement(); } }