Java tutorial
/******************************************************************************* * Copyright (c) 2003, 2010 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 * Joern Dinkla <devnull@dinkla.com> - bug 210264 * Bartosz Michalik <bartosz.michalik@gmail.com> - bug 114080 * EclipseSource Corporation - ongoing enhancements *******************************************************************************/ package com.siteview.mde.internal.ui.wizards.imports; import com.siteview.mde.internal.core.monitor.AbstractMonitorModelBase; import com.siteview.mde.core.monitor.IMonitorModelBase; import java.util.*; import java.util.List; import java.util.regex.Pattern; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.*; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.*; import org.eclipse.osgi.util.NLS; import com.siteview.mde.internal.core.MDECore; import com.siteview.mde.internal.core.WorkspaceModelManager; import com.siteview.mde.internal.core.util.PatternConstructor; import com.siteview.mde.internal.ui.*; import com.siteview.mde.internal.ui.elements.DefaultContentProvider; import com.siteview.mde.internal.ui.util.SWTUtil; import com.siteview.mde.internal.ui.util.SourcePluginFilter; import com.siteview.mde.internal.ui.wizards.ListUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.*; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.WorkbenchJob; import org.osgi.framework.Version; public class PluginImportWizardDetailedPage extends BaseImportWizardSecondPage { class ContentProvider extends DefaultContentProvider implements IStructuredContentProvider { public Object[] getElements(Object element) { return fModels; } } private Label fCountLabel; private int fCountTotal; private TableViewer fAvailableListViewer; private Text fFilterText; private VersionFilter fVersionFilter; private AvailableFilter fAvailableFilter; private SourcePluginFilter fSourceFilter; private ViewerFilter fRepositoryFilter; // fSelected is used to track the selection in a hash set so we can efficiently // filter selected items out of the available item list private Set fSelected; // this job is used to delay the full filter refresh for 200 milliseconds in case the user is still typing private WorkbenchJob fFilterJob; private Button fAddButton; private Button fAddAllButton; private Button fRemoveButton; private Button fRemoveAllButton; private Button fAddRequiredButton; private Button fFilterOldVersionButton; private static final String SETTINGS_SHOW_LATEST = "showLatestPluginsOnly"; //$NON-NLS-1$ private class RepositoryFilter extends ViewerFilter { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public boolean select(Viewer viewer, Object parentElement, Object element) { if (fPage1.getImportType() == PluginImportOperation.IMPORT_FROM_REPOSITORY) { return fPage1.repositoryModels.contains(element); } return true; } } private class AvailableFilter extends ViewerFilter { private Pattern fPattern; public AvailableFilter() { setPattern("*"); //$NON-NLS-1$ } public boolean select(Viewer viewer, Object parentElement, Object element) { // filter out any items that are currently selected // on a full refresh, these will have been added back to the list if (fSelected.contains(element)) return false; if (!(element instanceof AbstractMonitorModelBase)) return false; String itemID = ((AbstractMonitorModelBase) element).getMonitorBase().getId(); if (fPattern.matcher(itemID).matches()) return true; return false; } public boolean setPattern(String newPattern) { if (!newPattern.endsWith("*")) //$NON-NLS-1$ newPattern += "*"; //$NON-NLS-1$ if (!newPattern.startsWith("*")) //$NON-NLS-1$ newPattern = "*" + newPattern; //$NON-NLS-1$ if (fPattern != null) { String oldPattern = fPattern.pattern(); if (newPattern.equals(oldPattern)) return false; } fPattern = PatternConstructor.createPattern(newPattern, true); return true; } } /** * This filter is used to remove older plug-ins from view * */ private class VersionFilter extends ViewerFilter { private HashMap versions = new HashMap(); public void setModel(IMonitorModelBase[] plugins) { if (plugins != null && plugins.length > 0) { versions.clear(); } for (int i = 0; i < plugins.length; ++i) { String name = plugins[i].getBundleDescription().getSymbolicName(); Version version = plugins[i].getBundleDescription().getVersion(); Version oldVersion = (Version) versions.get(name); if (oldVersion == null || oldVersion.compareTo(version) < 0) { versions.put(name, version); } } } public boolean select(Viewer viewer, Object parentElement, Object element) { IMonitorModelBase plugin = (IMonitorModelBase) element; Version hVersion = (Version) versions.get(plugin.getBundleDescription().getSymbolicName()); if (hVersion == null) return true; return hVersion.equals(plugin.getBundleDescription().getVersion()); } } public PluginImportWizardDetailedPage(String pageName, PluginImportWizardFirstPage firstPage) { super(pageName, firstPage); setTitle(MDEUIMessages.ImportWizard_DetailedPage_title); setMessage(MDEUIMessages.ImportWizard_DetailedPage_desc); fSelected = new HashSet(); } public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 3; layout.makeColumnsEqualWidth = false; layout.horizontalSpacing = 5; layout.verticalSpacing = 10; container.setLayout(layout); createScrollArea(container); createAvailableList(container).setLayoutData(new GridData(GridData.FILL_BOTH)); createButtonArea(container); createImportList(container).setLayoutData(new GridData(GridData.FILL_BOTH)); updateCount(); // create container for buttons Composite optionComp = SWTFactory.createComposite(container, 1, 3, GridData.FILL_HORIZONTAL, 5, 0); createComputationsOption(optionComp); createFilterOptions(optionComp); addViewerListeners(); initialize(); addFilters(); setControl(container); Dialog.applyDialogFont(container); PlatformUI.getWorkbench().getHelpSystem().setHelp(container, IHelpContextIds.PLUGIN_IMPORT_SECOND_PAGE); } private void createFilterOptions(Composite container) { fFilterOldVersionButton = SWTFactory.createCheckButton(container, MDEUIMessages.ImportWizard_DetailedPage_filterDesc, null, true, 1); if (getDialogSettings().get(SETTINGS_SHOW_LATEST) != null) fFilterOldVersionButton.setSelection(getDialogSettings().getBoolean(SETTINGS_SHOW_LATEST)); else fFilterOldVersionButton.setSelection(true); fFilterOldVersionButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if (fFilterOldVersionButton.getSelection()) { fAvailableListViewer.addFilter(fVersionFilter); } else { fAvailableListViewer.removeFilter(fVersionFilter); } updateCount(); } }); } private void addFilters() { fVersionFilter = new VersionFilter(); fVersionFilter.setModel(fModels); fSourceFilter = new SourcePluginFilter(fPage1.getState()); fAvailableFilter = new AvailableFilter(); fAvailableListViewer.addFilter(fAvailableFilter); if (fFilterOldVersionButton.getSelection()) { fAvailableListViewer.addFilter(fVersionFilter); } fAvailableListViewer.addFilter(fSourceFilter); fRepositoryFilter = new RepositoryFilter(); fAvailableListViewer.addFilter(fRepositoryFilter); fFilterJob = new WorkbenchJob("FilterJob") { //$NON-NLS-1$ public IStatus runInUIThread(IProgressMonitor monitor) { handleFilter(); return Status.OK_STATUS; } }; fFilterJob.setSystem(true); } private void initialize() { updateButtonEnablement(true, true); setPageComplete(false); } private void addViewerListeners() { fAvailableListViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { handleAdd(); } }); fImportListViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { handleRemove(); } }); fAvailableListViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { updateSelectionBasedEnablement(event.getSelection(), true); } }); fImportListViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { updateSelectionBasedEnablement(event.getSelection(), false); } }); fFilterText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { fFilterJob.cancel(); fFilterJob.schedule(200); } }); } private Composite createAvailableList(Composite parent) { Composite container = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; container.setLayout(layout); container.setLayoutData(new GridData()); Label label = new Label(container, SWT.NONE); label.setText(MDEUIMessages.ImportWizard_DetailedPage_availableList); Table table = new Table(container, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 200; gd.widthHint = 225; table.setLayoutData(gd); fAvailableListViewer = new TableViewer(table); fAvailableListViewer.setLabelProvider(new PluginImportLabelProvider()); fAvailableListViewer.setContentProvider(new ContentProvider()); fAvailableListViewer.setInput(MDECore.getDefault().getModelManager()); fAvailableListViewer.setComparator(ListUtil.PLUGIN_COMPARATOR); return container; } private Composite createButtonArea(Composite parent) { ScrolledComposite comp = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL); GridLayout layout = new GridLayout(); layout.marginWidth = layout.marginHeight = 0; comp.setLayoutData(new GridData(GridData.FILL_VERTICAL)); Composite container = new Composite(comp, SWT.NONE); layout = new GridLayout(); layout.marginWidth = 0; container.setLayout(layout); GridData gd = new GridData(GridData.FILL_VERTICAL); gd.verticalIndent = 15; container.setLayoutData(gd); Button button = new Button(container, SWT.PUSH); button.setText(MDEUIMessages.ImportWizard_DetailedPage_existing); button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleExistingProjects(); } }); SWTUtil.setButtonDimensionHint(button); button = new Button(container, SWT.PUSH); button.setText(MDEUIMessages.ImportWizard_DetailedPage_existingUnshared); button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleExistingUnshared(); } }); SWTUtil.setButtonDimensionHint(button); fAddButton = new Button(container, SWT.PUSH); fAddButton.setText(MDEUIMessages.ImportWizard_DetailedPage_add); fAddButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fAddButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleAdd(); } }); SWTUtil.setButtonDimensionHint(fAddButton); fAddAllButton = new Button(container, SWT.PUSH); fAddAllButton.setText(MDEUIMessages.ImportWizard_DetailedPage_addAll); fAddAllButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fAddAllButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleAddAll(); } }); SWTUtil.setButtonDimensionHint(fAddAllButton); fRemoveButton = new Button(container, SWT.PUSH); fRemoveButton.setText(MDEUIMessages.ImportWizard_DetailedPage_remove); fRemoveButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fRemoveButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleRemove(); } }); SWTUtil.setButtonDimensionHint(fRemoveButton); fRemoveAllButton = new Button(container, SWT.PUSH); fRemoveAllButton.setText(MDEUIMessages.ImportWizard_DetailedPage_removeAll); fRemoveAllButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fRemoveAllButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleRemoveAll(); } }); SWTUtil.setButtonDimensionHint(fRemoveAllButton); button = new Button(container, SWT.PUSH); button.setText(MDEUIMessages.ImportWizard_DetailedPage_swap); button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleSwap(); } }); SWTUtil.setButtonDimensionHint(button); fAddRequiredButton = new Button(container, SWT.PUSH); fAddRequiredButton.setText(MDEUIMessages.ImportWizard_DetailedPage_addRequired); fAddRequiredButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fAddRequiredButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleAddRequiredPlugins(); } }); SWTUtil.setButtonDimensionHint(fAddRequiredButton); fCountLabel = new Label(container, SWT.NONE); fCountLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER)); comp.setContent(container); comp.setMinHeight(250); comp.setExpandHorizontal(true); comp.setExpandVertical(true); return container; } private Composite createScrollArea(Composite parent) { Group container = new Group(parent, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginWidth = layout.marginHeight = 6; container.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; container.setLayoutData(gd); container.setText(MDEUIMessages.ImportWizard_DetailedPage_filter); Label filterLabel = new Label(container, SWT.NONE); filterLabel.setText(MDEUIMessages.ImportWizard_DetailedPage_search); fFilterText = new Text(container, SWT.BORDER); fFilterText.setText(""); //$NON-NLS-1$ gd = new GridData(GridData.FILL_HORIZONTAL); fFilterText.setLayoutData(gd); return container; } public void setVisible(boolean visible) { super.setVisible(visible); if (visible) { fFilterText.setFocus(); setPageComplete(fImportListViewer.getTable().getItemCount() > 0); } } protected void refreshPage() { fAvailableListViewer.addFilter(fSourceFilter); fImportListViewer.getTable().removeAll(); fSelected.clear(); fAvailableFilter.setPattern("*"); //$NON-NLS-1$ fSourceFilter.setState(fPage1.getState()); fVersionFilter.setModel(fModels); fAvailableListViewer.refresh(); pageChanged(); } protected void pageChanged() { pageChanged(false, false); } protected void pageChanged(boolean doAddEnablement, boolean doRemoveEnablement) { updateButtonEnablement(doAddEnablement, doRemoveEnablement); setPageComplete(fImportListViewer.getTable().getItemCount() > 0); setMessage(MDEUIMessages.ImportWizard_DetailedPage_desc); } private void updateCount() { if (fCountTotal <= 0) { // Since we filter the list of available plug-ins the total may differ from the model count fCountTotal = fAvailableListViewer.getTable().getItemCount(); } fCountLabel.setText(NLS.bind(MDEUIMessages.ImportWizard_DetailedPage_count, (new String[] { Integer.toString(fImportListViewer.getTable().getItemCount()), Integer.toString(fCountTotal) }))); fCountLabel.getParent().layout(); } private void updateButtonEnablement(boolean doAddEnablement, boolean doRemoveEnablement) { updateCount(); int availableCount = fAvailableListViewer.getTable().getItemCount(); int importCount = fImportListViewer.getTable().getItemCount(); if (doAddEnablement) updateSelectionBasedEnablement(fAvailableListViewer.getSelection(), true); if (doRemoveEnablement) updateSelectionBasedEnablement(fImportListViewer.getSelection(), false); fAddAllButton.setEnabled(availableCount > 0); fRemoveAllButton.setEnabled(importCount > 0); fAddRequiredButton.setEnabled(importCount > 0); } private void updateSelectionBasedEnablement(ISelection theSelection, boolean available) { if (available) fAddButton.setEnabled(!theSelection.isEmpty()); else fRemoveButton.setEnabled(!theSelection.isEmpty()); } private void handleAdd() { IStructuredSelection ssel = (IStructuredSelection) fAvailableListViewer.getSelection(); if (ssel.size() > 0) { Table table = fAvailableListViewer.getTable(); int index = table.getSelectionIndices()[0]; doAdd(ssel.toList()); table.setSelection(index < table.getItemCount() ? index : table.getItemCount() - 1); pageChanged(true, false); } } private void handleAddAll() { TableItem[] items = fAvailableListViewer.getTable().getItems(); ArrayList data = new ArrayList(); for (int i = 0; i < items.length; i++) { data.add(items[i].getData()); } if (data.size() > 0) { doAdd(data); pageChanged(true, false); } } private void handleFilter() { boolean changed = false; String newFilter; if (fFilterText == null || (newFilter = fFilterText.getText().trim()).length() == 0) newFilter = "*"; //$NON-NLS-1$ changed = fAvailableFilter.setPattern(newFilter); if (changed) { fAvailableListViewer.refresh(); updateButtonEnablement(false, false); } } private void handleRemove() { IStructuredSelection ssel = (IStructuredSelection) fImportListViewer.getSelection(); if (ssel.size() > 0) { Table table = fImportListViewer.getTable(); int index = table.getSelectionIndices()[0]; doRemove(ssel.toList()); table.setSelection(index < table.getItemCount() ? index : table.getItemCount() - 1); pageChanged(false, true); } } private void doAdd(List items) { fImportListViewer.add(items.toArray()); fAvailableListViewer.remove(items.toArray()); fSelected.addAll(items); } private void doRemove(List items) { fSelected.removeAll(items); fImportListViewer.remove(items.toArray()); fAvailableListViewer.add(items.toArray()); } private void handleRemoveAll() { TableItem[] items = fImportListViewer.getTable().getItems(); ArrayList data = new ArrayList(); for (int i = 0; i < items.length; i++) { data.add(items[i].getData()); } if (data.size() > 0) { doRemove(data); pageChanged(false, true); } } private void handleSetImportSelection(ArrayList newSelectionList) { if (newSelectionList.size() == 0) { handleRemoveAll(); pageChanged(); return; } TableItem[] items = fImportListViewer.getTable().getItems(); Object[] oldSelection = new Object[items.length]; for (int i = 0; i < items.length; i++) { oldSelection[i] = items[i].getData(); } // remove items that were in the old selection, but are not in the new one List itemsToRemove = new ArrayList(); for (int i = 0; i < oldSelection.length; i++) { if (newSelectionList.contains(oldSelection[i])) { newSelectionList.remove(oldSelection[i]); } else { itemsToRemove.add(oldSelection[i]); } } doRemove(itemsToRemove); // add items that were not in the old selection and are in the new one doAdd(newSelectionList); pageChanged(); } private void handleSwap() { TableItem[] aItems = fAvailableListViewer.getTable().getItems(); TableItem[] iItems = fImportListViewer.getTable().getItems(); ArrayList data = new ArrayList(); for (int i = 0; i < iItems.length; i++) { data.add(iItems[i].getData()); } if (data.size() > 0) { doRemove(data); } data.clear(); for (int i = 0; i < aItems.length; i++) { data.add(aItems[i].getData()); } if (data.size() > 0) { doAdd(data); } pageChanged(); } private void handleExistingProjects() { ArrayList result = new ArrayList(); for (int i = 0; i < fModels.length; i++) { String id = fModels[i].getMonitorBase().getId(); IProject project = (IProject) MDEPlugin.getWorkspace().getRoot().findMember(id); if (project != null && project.isOpen() && WorkspaceModelManager.isPluginProject(project)) { result.add(fModels[i]); } } handleSetImportSelection(result); } private void handleExistingUnshared() { ArrayList result = new ArrayList(); for (int i = 0; i < fModels.length; i++) { String id = fModels[i].getMonitorBase().getId(); IProject project = (IProject) MDEPlugin.getWorkspace().getRoot().findMember(id); if (project != null && WorkspaceModelManager.isUnsharedProject(project) && WorkspaceModelManager.isPluginProject(project)) { result.add(fModels[i]); } } handleSetImportSelection(result); } private void handleAddRequiredPlugins() { TableItem[] items = fImportListViewer.getTable().getItems(); if (items.length == 0) return; if (items.length == 1) { IMonitorModelBase model = (IMonitorModelBase) items[0].getData(); if (model.getMonitorBase().getId().equals("org.eclipse.core.boot")) { //$NON-NLS-1$ return; } } ArrayList result = new ArrayList(); for (int i = 0; i < items.length; i++) { addPluginAndDependencies((IMonitorModelBase) items[i].getData(), result, fAddFragmentsButton.getSelection()); } handleSetImportSelection(result); } public void dispose() { fFilterJob.cancel(); } public void storeSettings() { IDialogSettings settings = getDialogSettings(); settings.put(SETTINGS_SHOW_LATEST, fFilterOldVersionButton.getSelection()); super.storeSettings(); } }