package org.jactr.eclipse.ui.wizards.pages; /* * default logging */ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.Set; import java.util.function.Supplier; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.core.resources.IProject; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.pde.core.plugin.IPluginModelBase; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; import org.jactr.eclipse.core.bundles.descriptors.CommonExtensionDescriptor; import org.jactr.eclipse.core.bundles.meta.ManifestTools; public class CommonExtensionWizardPage extends WizardPage { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(CommonExtensionWizardPage.class); private Text _description; private CheckboxTableViewer _descriptorList; private final Supplier<Collection<? extends CommonExtensionDescriptor>> _descriptorProvider; private final ILabelProvider _labelProvider; private final IContentProvider _contentProvider; private Set<CommonExtensionDescriptor> _checkedItems = new HashSet<CommonExtensionDescriptor>(); public CommonExtensionWizardPage( Supplier<Collection<? extends CommonExtensionDescriptor>> descriptorProvider, ILabelProvider labelProvider, String name, String title, String desc) { super(name); setTitle(title); setMessage(desc); _descriptorProvider = descriptorProvider; _labelProvider = labelProvider; _contentProvider = new ArrayContentProvider(); } @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.BORDER); GridLayout layout = new GridLayout(); layout.numColumns = 3; container.setLayout(layout); Composite listGroup = new Composite(container, SWT.BORDER); listGroup.setLayout(new GridLayout()); listGroup .setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true, 1, 2)); _descriptorList = CheckboxTableViewer.newCheckList(listGroup, SWT.BORDER); _descriptorList .addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent e) { descriptorSelected(getSelectedDescriptor()); } }); // _descriptorList.setComparator(new ViewerComparator( // new Comparator<CommonExtensionDescriptor>() { // // @Override // public int compare(CommonExtensionDescriptor o1, // CommonExtensionDescriptor o2) // { // /* // * comparing by name // */ // String name1 = o1.getName(); // String name2 = o2.getName(); // return name1.compareTo(name2); // } // })); _descriptorList.setComparator(new ViewerComparator( new Comparator<String>() { @Override public int compare(String o1, String o2) { /* * comparing by name */ return o1.compareTo(o2); } })); _descriptorList.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { if (event.getChecked()) _checkedItems.add((CommonExtensionDescriptor) event.getElement()); else _checkedItems.remove(event.getElement()); } }); // content and label providers.. _descriptorList.setContentProvider(_contentProvider); _descriptorList.setLabelProvider(_labelProvider); GridData gd = new GridData(GridData.FILL_BOTH); _descriptorList.getTable().setLayoutData(gd); Composite descriptionGroup = new Composite(container, SWT.BORDER); descriptionGroup.setLayout(new GridLayout()); descriptionGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 2)); // two wide _description = new Text(descriptionGroup, SWT.WRAP | SWT.READ_ONLY | SWT.MULTI | SWT.VERTICAL); _description.setLayoutData(new GridData(GridData.FILL_BOTH)); _description.setText("Description"); setDescriptorData(); setControl(container); } protected void descriptorSelected(CommonExtensionDescriptor selectedDescriptor) { // update the display String description = ""; if (selectedDescriptor != null) description = selectedDescriptor.getDescription(); if (description == null) description = ""; _description.setText(description); } private CommonExtensionDescriptor getSelectedDescriptor() { Object item = ((IStructuredSelection) _descriptorList.getSelection()) .getFirstElement(); if (item instanceof CommonExtensionDescriptor) return (CommonExtensionDescriptor) item; return null; } protected void setDescriptorData() { _descriptorList.setInput(_descriptorProvider.get()); } /** * called at the during finish and it will verify that required deps are met * * @param project */ public void ensureDependencies(IProject project) { IPluginModelBase base = ManifestTools.getModelBase(project); if (base == null) { LOGGER.error("Null plugin model? "); return; } boolean shouldSave = false; for (Object obj : _checkedItems) { shouldSave = true; CommonExtensionDescriptor desc = (CommonExtensionDescriptor) obj; String dependency = desc.getContributor(); // make sure it's in there Collection<String> singlton = Collections.singleton(dependency); ManifestTools.addEclipseBuddies(base, singlton); try { ManifestTools.addPluginReferences(base, singlton); } catch (Exception e) { LOGGER.error(String.format("Could not add %s to %s as dependency? ", dependency, project), e); } } if (shouldSave) ManifestTools.save(base); } public Collection<CommonExtensionDescriptor> getSelectedDescriptors() { return _checkedItems; } }