// RAP [bm] AboutDialog left out for now
///*******************************************************************************
// * Copyright (c) 2000, 2009 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
// * Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog
// * font should be activated and used by other components.
// *******************************************************************************/
//package org.eclipse.ui.internal.about;
//
//import java.io.IOException;
//import java.net.URL;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.LinkedList;
//import java.util.List;
//import java.util.Map;
//import org.eclipse.core.runtime.IPath;
//import org.eclipse.core.runtime.IProgressMonitor;
//import org.eclipse.core.runtime.IStatus;
//import org.eclipse.core.runtime.Path;
//import org.eclipse.core.runtime.Platform;
//import org.eclipse.core.runtime.Status;
//import org.eclipse.core.runtime.jobs.Job;
//import org.eclipse.jface.dialogs.IDialogConstants;
//import org.eclipse.jface.util.ConfigureColumns;
//import org.eclipse.jface.viewers.ArrayContentProvider;
//import org.eclipse.jface.viewers.IBaseLabelProvider;
//import org.eclipse.jface.viewers.ISelectionChangedListener;
//import org.eclipse.jface.viewers.IStructuredSelection;
//import org.eclipse.jface.viewers.ITableLabelProvider;
//import org.eclipse.jface.viewers.LabelProvider;
//import org.eclipse.jface.viewers.LabelProviderChangedEvent;
//import org.eclipse.jface.viewers.SelectionChangedEvent;
//import org.eclipse.jface.viewers.TableViewer;
//import org.eclipse.jface.viewers.Viewer;
//import org.eclipse.jface.viewers.ViewerComparator;
//import org.eclipse.osgi.util.NLS;
//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.Image;
//import org.eclipse.swt.layout.FillLayout;
//import org.eclipse.swt.layout.GridData;
//import org.eclipse.swt.widgets.Button;
//import org.eclipse.swt.widgets.Composite;
//import org.eclipse.swt.widgets.Control;
//import org.eclipse.swt.widgets.Label;
//import org.eclipse.swt.widgets.Table;
//import org.eclipse.swt.widgets.TableColumn;
//import org.eclipse.ui.PlatformUI;
//import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
//import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
//import org.eclipse.ui.internal.WorkbenchImages;
//import org.eclipse.ui.internal.WorkbenchMessages;
//import org.eclipse.ui.internal.WorkbenchPlugin;
//import org.eclipse.ui.internal.misc.StatusUtil;
//import org.eclipse.ui.internal.util.BundleUtility;
//import org.eclipse.ui.progress.WorkbenchJob;
//import org.eclipse.ui.statushandlers.StatusManager;
//import org.osgi.framework.Bundle;
//
///**
// * Displays information about the product plugins.
// *
// * PRIVATE this class is internal to the ide
// */
//public class AboutPluginsPage extends ProductInfoPage {
//
// public class BundleTableLabelProvider extends LabelProvider implements
// ITableLabelProvider {
//
// /**
// * Queue containing bundle signing info to be resolved.
// */
// private LinkedList resolveQueue = new LinkedList();
//
// /**
// * Queue containing bundle data that's been resolve and needs updating.
// */
// private List updateQueue = new ArrayList();
//
// /*
// * this job will attempt to discover the signing state of a given bundle
// * and then send it along to the update job
// */
// private Job resolveJob = new Job(AboutPluginsPage.class.getName()) {
// {
// setSystem(true);
// setPriority(Job.SHORT);
// }
//
// protected IStatus run(IProgressMonitor monitor) {
// while (true) {
// // If the UI has not been created, nothing to do.
// if (vendorInfo == null)
// return Status.OK_STATUS;
// // If the UI has been disposed since we were asked to
// // render, nothing to do.
// Table table = vendorInfo.getTable();
// // the table has been disposed since we were asked to render
// if (table == null || table.isDisposed())
// return Status.OK_STATUS;
// AboutBundleData data = null;
// synchronized (resolveQueue) {
// if (resolveQueue.isEmpty())
// return Status.OK_STATUS;
// data = (AboutBundleData) resolveQueue.removeFirst();
// }
// try {
// // following is an expensive call
// data.isSigned();
//
// synchronized (updateQueue) {
// updateQueue.add(data);
// }
// // start the update job
// updateJob.schedule();
// } catch (IllegalStateException e) {
// // the bundle we're testing has been unloaded. Do
// // nothing.
// }
// }
// }
// };
//
// /*
// * this job is responsible for feeding label change events into the
// * viewer as they become available from the resolve job
// */
// private Job updateJob = new WorkbenchJob(PlatformUI.getWorkbench()
// .getDisplay(), AboutPluginsPage.class.getName()) {
// {
// setSystem(true);
// setPriority(Job.DECORATE);
// }
//
// /*
// * (non-Javadoc)
// *
// * @see
// * org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.
// * runtime.IProgressMonitor)
// */
// public IStatus runInUIThread(IProgressMonitor monitor) {
// while (true) {
// Control page = getControl();
// // the page has gone down since we were asked to render
// if (page == null || page.isDisposed())
// return Status.OK_STATUS;
// AboutBundleData[] data = null;
// synchronized (updateQueue) {
// if (updateQueue.isEmpty())
// return Status.OK_STATUS;
//
// data = (AboutBundleData[]) updateQueue
// .toArray(new AboutBundleData[updateQueue.size()]);
// updateQueue.clear();
//
// }
// fireLabelProviderChanged(new LabelProviderChangedEvent(
// BundleTableLabelProvider.this, data));
// }
// }
// };
//
// /*
// * (non-Javadoc)
// *
// * @see
// * org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java
// * .lang.Object, int)
// */
// public Image getColumnImage(Object element, int columnIndex) {
// if (columnIndex == 0) {
// if (element instanceof AboutBundleData) {
// final AboutBundleData data = (AboutBundleData) element;
// if (data.isSignedDetermined()) {
// return WorkbenchImages
// .getImage(data.isSigned() ? IWorkbenchGraphicConstants.IMG_OBJ_SIGNED_YES
// : IWorkbenchGraphicConstants.IMG_OBJ_SIGNED_NO);
// }
//
// synchronized (resolveQueue) {
// resolveQueue.add(data);
// }
// resolveJob.schedule();
//
// return WorkbenchImages
// .getImage(IWorkbenchGraphicConstants.IMG_OBJ_SIGNED_UNKNOWN);
// }
// }
// return null;
// }
//
// /*
// * (non-Javadoc)
// *
// * @see
// * org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.
// * lang.Object, int)
// */
// public String getColumnText(Object element, int columnIndex) {
// if (element instanceof AboutBundleData) {
// AboutBundleData data = (AboutBundleData) element;
// switch (columnIndex) {
// case 1:
// return data.getProviderName();
// case 2:
// return data.getName();
// case 3:
// return data.getVersion();
// case 4:
// return data.getId();
// }
// }
// return ""; //$NON-NLS-1$
// }
// }
//
// // This id is used when the page is created inside its own dialog
// private static final String ID = "productInfo.plugins"; //$NON-NLS-1$
//
// /**
// * Table height in dialog units (value 200).
// */
// private static final int TABLE_HEIGHT = 200;
//
// private final static int MORE_ID = IDialogConstants.CLIENT_ID + 1;
// private final static int SIGNING_ID = MORE_ID + 1;
// private final static int COLUMNS_ID = MORE_ID + 2;
//
// private static final IPath baseNLPath = new Path("$nl$"); //$NON-NLS-1$
//
// private static final String PLUGININFO = "about.html"; //$NON-NLS-1$
//
// private static final int PLUGIN_NAME_COLUMN_INDEX = 2;
//
// private static final int SIGNING_AREA_PERCENTAGE = 30;
//
// private TableViewer vendorInfo;
//
// private Button moreInfo, signingInfo;
//
// private String message;
//
// private String helpContextId = IWorkbenchHelpContextIds.ABOUT_PLUGINS_DIALOG;
//
// private String columnTitles[] = {
// WorkbenchMessages.AboutPluginsDialog_signed,
// WorkbenchMessages.AboutPluginsDialog_provider,
// WorkbenchMessages.AboutPluginsDialog_pluginName,
// WorkbenchMessages.AboutPluginsDialog_version,
// WorkbenchMessages.AboutPluginsDialog_pluginId,
//
// };
// private Bundle[] bundles = WorkbenchPlugin.getDefault().getBundles();
// private AboutBundleData[] bundleInfos;
// private SashForm sashForm;
// private BundleSigningInfo signingArea;
//
// public void setBundles(Bundle[] bundles) {
// this.bundles = bundles;
// }
//
// public void setHelpContextId(String id) {
// this.helpContextId = id;
// }
//
// public void setMessage(String message) {
// this.message = message;
// }
//
// /**
// */
// protected void handleSigningInfoPressed() {
// if (signingArea == null) {
// signingArea = new BundleSigningInfo();
// AboutBundleData bundleInfo = (AboutBundleData) ((IStructuredSelection) vendorInfo
// .getSelection()).getFirstElement();
// signingArea.setData(bundleInfo);
//
// signingArea.createContents(sashForm);
// sashForm.setWeights(new int[] { 100 - SIGNING_AREA_PERCENTAGE,
// SIGNING_AREA_PERCENTAGE });
// signingInfo
// .setText(WorkbenchMessages.AboutPluginsDialog_signingInfo_hide);
//
// } else {
// // hide
// signingInfo
// .setText(WorkbenchMessages.AboutPluginsDialog_signingInfo_show);
// signingArea.dispose();
// signingArea = null;
// sashForm.setWeights(new int[] { 100 });
// }
// }
//
// public void createPageButtons(Composite parent) {
//
// moreInfo = createButton(parent, MORE_ID,
// WorkbenchMessages.AboutPluginsDialog_moreInfo);
// moreInfo.setEnabled(false);
//
// signingInfo = createButton(parent, SIGNING_ID,
// WorkbenchMessages.AboutPluginsDialog_signingInfo_show);
// signingInfo.setEnabled(false);
//
// createButton(parent, COLUMNS_ID,
// WorkbenchMessages.AboutPluginsDialog_columns);
// }
//
// public void createControl(Composite parent) {
// initializeDialogUnits(parent);
//
// // create a data object for each bundle, remove duplicates, and include
// // only resolved bundles (bug 65548)
// Map map = new HashMap();
// for (int i = 0; i < bundles.length; ++i) {
// AboutBundleData data = new AboutBundleData(bundles[i]);
// if (BundleUtility.isReady(data.getState())
// && !map.containsKey(data.getVersionedId())) {
// map.put(data.getVersionedId(), data);
// }
// }
// bundleInfos = (AboutBundleData[]) map.values().toArray(
// new AboutBundleData[0]);
// WorkbenchPlugin.class.getSigners();
//
// sashForm = new SashForm(parent, SWT.HORIZONTAL | SWT.SMOOTH);
// FillLayout layout = new FillLayout();
// sashForm.setLayout(layout);
// layout.marginHeight = 0;
// layout.marginWidth = 0;
// GridData data = new GridData(GridData.FILL_BOTH);
// sashForm.setLayoutData(data);
//
// Composite outer = createOuterComposite(sashForm);
// PlatformUI.getWorkbench().getHelpSystem().setHelp(outer, helpContextId);
//
// if (message != null) {
// Label label = new Label(outer, SWT.NONE);
// label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// label.setFont(parent.getFont());
// label.setText(message);
// }
//
// createTable(outer);
// setControl(outer);
// }
//
// /**
// * Create the table part of the dialog.
// *
// * @param parent
// * the parent composite to contain the dialog area
// */
// protected void createTable(Composite parent) {
// vendorInfo = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL
// | SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER);
// vendorInfo.setUseHashlookup(true);
// vendorInfo.getTable().setHeaderVisible(true);
// vendorInfo.getTable().setLinesVisible(true);
// vendorInfo.getTable().setFont(parent.getFont());
// vendorInfo.addSelectionChangedListener(new ISelectionChangedListener() {
//
// public void selectionChanged(SelectionChangedEvent event) {
// checkEnablement();
// }
// });
//
// final TableComparator comparator = new TableComparator();
// vendorInfo.setComparator(comparator);
// int[] columnWidths = {
// convertHorizontalDLUsToPixels(30), // signature
// convertHorizontalDLUsToPixels(120),
// convertHorizontalDLUsToPixels(120),
// convertHorizontalDLUsToPixels(70),
// convertHorizontalDLUsToPixels(130), };
//
// // create table headers
// for (int i = 0; i < columnTitles.length; i++) {
// TableColumn column = new TableColumn(vendorInfo.getTable(),
// SWT.NULL);
// if (i == PLUGIN_NAME_COLUMN_INDEX) { // prime initial sorting
// updateTableSorting(i);
// }
// column.setWidth(columnWidths[i]);
// column.setText(columnTitles[i]);
// final int columnIndex = i;
// column.addSelectionListener(new SelectionAdapter() {
// public void widgetSelected(SelectionEvent e) {
// updateTableSorting(columnIndex);
// }
// });
// }
//
// vendorInfo.setContentProvider(new ArrayContentProvider());
// vendorInfo.setLabelProvider(new BundleTableLabelProvider());
//
// GridData gridData = new GridData(GridData.FILL, GridData.FILL, true,
// true);
// gridData.heightHint = convertVerticalDLUsToPixels(TABLE_HEIGHT);
// vendorInfo.getTable().setLayoutData(gridData);
//
// vendorInfo.setInput(bundleInfos);
// }
//
// /**
// * Update the sort information on both the comparator and the table.
// *
// * @param columnIndex
// * the index to sort by
// * @since 3.4
// */
// private void updateTableSorting(final int columnIndex) {
// TableComparator comparator = (TableComparator) vendorInfo
// .getComparator();
// // toggle direction if it's the same column
// if (columnIndex == comparator.getSortColumn()) {
// comparator.setAscending(!comparator.isAscending());
// }
// comparator.setSortColumn(columnIndex);
// vendorInfo.getTable().setSortColumn(
// vendorInfo.getTable().getColumn(columnIndex));
// vendorInfo.getTable().setSortDirection(
// comparator.isAscending() ? SWT.UP : SWT.DOWN);
// vendorInfo.refresh(false);
// }
//
// /**
// * Return an url to the plugin's about.html file (what is shown when
// * "More info" is pressed) or null if no such file exists. The method does
// * nl lookup to allow for i18n.
// *
// * @param bundleInfo
// * the bundle info
// * @param makeLocal
// * whether to make the about content local
// * @return the url or <code>null</code>
// */
// private URL getMoreInfoURL(AboutBundleData bundleInfo, boolean makeLocal) {
// Bundle bundle = Platform.getBundle(bundleInfo.getId());
// if (bundle == null) {
// return null;
// }
//
// URL aboutUrl = Platform.find(bundle, baseNLPath.append(PLUGININFO),
// null);
// if (!makeLocal) {
// return aboutUrl;
// }
// if (aboutUrl != null) {
// try {
// URL result = Platform.asLocalURL(aboutUrl);
// try {
// // Make local all content in the "about" directory.
// // This is needed to handle jar'ed plug-ins.
// // See Bug 88240 [About] About dialog needs to extract
// // subdirs.
// URL about = new URL(aboutUrl, "about_files"); //$NON-NLS-1$
// if (about != null) {
// Platform.asLocalURL(about);
// }
// } catch (IOException e) {
// // skip the about dir if its not found or there are other
// // problems.
// }
// return result;
// } catch (IOException e) {
// // do nothing
// }
// }
// return null;
// }
//
// /*
// * (non-Javadoc)
// *
// * @see org.eclipse.ui.internal.about.ProductInfoPage#getId()
// */
// String getId() {
// return ID;
// }
//
// private void checkEnablement() {
// // enable if there is an item selected and that
// // item has additional info
// IStructuredSelection selection = (IStructuredSelection) vendorInfo
// .getSelection();
// if (selection.getFirstElement() instanceof AboutBundleData) {
// AboutBundleData selected = (AboutBundleData) selection
// .getFirstElement();
// moreInfo.setEnabled(selectionHasInfo(selected));
// signingInfo.setEnabled(true);
// if (signingArea != null) {
// signingArea.setData(selected);
// }
// } else {
// signingInfo.setEnabled(false);
// moreInfo.setEnabled(false);
// }
// }
//
// protected void buttonPressed(int buttonId) {
// switch (buttonId) {
// case MORE_ID:
// handleMoreInfoPressed();
// break;
// case SIGNING_ID:
// handleSigningInfoPressed();
// break;
// case COLUMNS_ID:
// handleColumnsPressed();
// break;
// default:
// super.buttonPressed(buttonId);
// break;
// }
// }
//
// /**
// * Check if the currently selected plugin has additional information to
// * show.
// *
// * @param bundleInfo
// *
// * @return true if the selected plugin has additional info available to
// * display
// */
// private boolean selectionHasInfo(AboutBundleData bundleInfo) {
//
// URL infoURL = getMoreInfoURL(bundleInfo, false);
//
// // only report ini problems if the -debug command line argument is used
// if (infoURL == null && WorkbenchPlugin.DEBUG) {
// WorkbenchPlugin.log("Problem reading plugin info for: " //$NON-NLS-1$
// + bundleInfo.getName());
// }
//
// return infoURL != null;
// }
//
// /**
// * The More Info button was pressed. Open a browser showing the license
// * information for the selected bundle or an error dialog if the browser
// * cannot be opened.
// */
// protected void handleMoreInfoPressed() {
// if (vendorInfo == null) {
// return;
// }
//
// if (vendorInfo.getSelection().isEmpty())
// return;
//
// AboutBundleData bundleInfo = (AboutBundleData) ((IStructuredSelection) vendorInfo
// .getSelection()).getFirstElement();
//
// if (!AboutUtils.openBrowser(getShell(),
// getMoreInfoURL(bundleInfo, true))) {
// String message = NLS.bind(
// WorkbenchMessages.AboutPluginsDialog_unableToOpenFile,
// PLUGININFO, bundleInfo.getId());
// StatusUtil.handleStatus(
// WorkbenchMessages.AboutPluginsDialog_errorTitle
// + ": " + message, StatusManager.SHOW, getShell()); //$NON-NLS-1$
// }
// }
//
// /**
// *
// */
// private void handleColumnsPressed() {
// ConfigureColumns.forTable(vendorInfo.getTable(), this);
// }
//}
//
//class TableComparator extends ViewerComparator {
//
// private int sortColumn = 0;
// private int lastSortColumn = 0;
// private boolean ascending = true;
// private boolean lastAscending = true;
//
// /*
// * (non-Javadoc)
// *
// * @see
// * org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.
// * viewers.Viewer, java.lang.Object, java.lang.Object)
// */
// public int compare(Viewer viewer, Object e1, Object e2) {
// if (sortColumn == 0 && e1 instanceof AboutBundleData
// && e2 instanceof AboutBundleData) {
// AboutBundleData d1 = (AboutBundleData) e1;
// AboutBundleData d2 = (AboutBundleData) e2;
// int diff = getSignedSortValue(d1) - getSignedSortValue(d2);
// // If values are different, or there is no secondary column defined,
// // we are done
// if (diff != 0 || lastSortColumn == 0)
// return ascending ? diff : -diff;
// // try a secondary sort
// if (viewer instanceof TableViewer) {
// TableViewer tableViewer = (TableViewer) viewer;
// IBaseLabelProvider baseLabel = tableViewer.getLabelProvider();
// if (baseLabel instanceof ITableLabelProvider) {
// ITableLabelProvider tableProvider = (ITableLabelProvider) baseLabel;
// String e1p = tableProvider
// .getColumnText(e1, lastSortColumn);
// String e2p = tableProvider
// .getColumnText(e2, lastSortColumn);
// int result = getComparator().compare(e1p, e2p);
// return lastAscending ? result : (-1) * result;
// }
// }
// // we couldn't determine a secondary sort, call it equal
// return 0;
// }
// if (viewer instanceof TableViewer) {
// TableViewer tableViewer = (TableViewer) viewer;
// IBaseLabelProvider baseLabel = tableViewer.getLabelProvider();
// if (baseLabel instanceof ITableLabelProvider) {
// ITableLabelProvider tableProvider = (ITableLabelProvider) baseLabel;
// String e1p = tableProvider.getColumnText(e1, sortColumn);
// String e2p = tableProvider.getColumnText(e2, sortColumn);
// int result = getComparator().compare(e1p, e2p);
// // Secondary column sort
// if (result == 0) {
// if (lastSortColumn != 0) {
// e1p = tableProvider.getColumnText(e1, lastSortColumn);
// e2p = tableProvider.getColumnText(e2, lastSortColumn);
// result = getComparator().compare(e1p, e2p);
// return lastAscending ? result : (-1) * result;
// } // secondary sort is by column 0
// if (e1 instanceof AboutBundleData
// && e2 instanceof AboutBundleData) {
// AboutBundleData d1 = (AboutBundleData) e1;
// AboutBundleData d2 = (AboutBundleData) e2;
// int diff = getSignedSortValue(d1)
// - getSignedSortValue(d2);
// return lastAscending ? diff : -diff;
// }
// }
// // primary column sort
// return ascending ? result : (-1) * result;
// }
// }
//
// return super.compare(viewer, e1, e2);
// }
//
// /**
// * @param data
// * @return a sort value depending on the signed state
// */
// private int getSignedSortValue(AboutBundleData data) {
// if (!data.isSignedDetermined()) {
// return 0;
// } else if (data.isSigned()) {
// return 1;
// } else {
// return -1;
// }
// }
//
// /**
// * @return Returns the sortColumn.
// */
// public int getSortColumn() {
// return sortColumn;
// }
//
// /**
// * @param sortColumn
// * The sortColumn to set.
// */
// public void setSortColumn(int sortColumn) {
// if (this.sortColumn != sortColumn) {
// lastSortColumn = this.sortColumn;
// lastAscending = this.ascending;
// this.sortColumn = sortColumn;
// }
// }
//
// /**
// * @return Returns the ascending.
// */
// public boolean isAscending() {
// return ascending;
// }
//
// /**
// * @param ascending
// * The ascending to set.
// */
// public void setAscending(boolean ascending) {
// this.ascending = ascending;
// }
//}