/******************************************************************************* * Copyright (c) 2007, 2016 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.ui.examples.contributions.view; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.commands.NotEnabledException; import org.eclipse.core.commands.NotHandledException; import org.eclipse.core.commands.common.NotDefinedException; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.contexts.IContextService; import org.eclipse.ui.examples.contributions.ContributionMessages; import org.eclipse.ui.examples.contributions.model.IPersonService; import org.eclipse.ui.examples.contributions.model.Person; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.part.ViewPart; /** * Our example view. * * @since 3.3 */ public class InfoView extends ViewPart { public static final String ID = "org.eclipse.ui.examples.contributions.view"; //$NON-NLS-1$ private static final String VIEW_COUNT_ID = "org.eclipse.ui.examples.contributions.view.count"; //$NON-NLS-1$ private static final String VIEW_CONTEXT_ID = "org.eclipse.ui.examples.contributions.view.context"; //$NON-NLS-1$ private ListViewer viewer; private IHandler countHandler; private ArrayList<Object> viewerInput; private IPropertyChangeListener personListener = event -> { if (IPersonService.PROP_CHANGE.equals(event.getProperty())) { refresh(); } else if (IPersonService.PROP_ADD.equals(event.getProperty())) { viewerInput.add(event.getNewValue()); viewer.add(event.getNewValue()); } }; private static class ContentProvider implements IStructuredContentProvider { @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // nothing to do here } @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof List) { return ((List<?>) inputElement).toArray(); } return null; } } @Override public void createPartControl(Composite parent) { viewer = new ListViewer(parent); viewer.setContentProvider(new ContentProvider()); viewer.setLabelProvider(new LabelProvider()); viewer.addDoubleClickListener(event -> editSelection()); IPersonService service = getSite().getService( IPersonService.class); viewerInput = new ArrayList<>(service.getPeople()); service.addPersonChangeListener(personListener); viewer.setInput(viewerInput); getSite().setSelectionProvider(viewer); MenuManager contextMenu = new MenuManager(); contextMenu.setRemoveAllWhenShown(true); getSite().registerContextMenu(contextMenu, viewer); Control control = viewer.getControl(); Menu menu = contextMenu.createContextMenu(control); control.setMenu(menu); activateContext(); createHandlers(); } @Override public void setFocus() { viewer.getControl().setFocus(); } /** * Activate a context that this view uses. It will be tied to this view * activation events and will be removed when the view is disposed. */ private void activateContext() { IContextService contextService = getSite() .getService(IContextService.class); // this will get cleaned up automatically when the site // is disposed contextService.activateContext(VIEW_CONTEXT_ID); } /** * Instantiate any handlers specific to this view and activate them. */ private void createHandlers() { IHandlerService handlerService = getSite().getService(IHandlerService.class); countHandler = new AbstractHandler() { @Override public Object execute(ExecutionEvent event) { List<?> elements = (List<?>) viewer.getInput(); MessageDialog.openInformation(getSite().getShell(), ContributionMessages.SampleHandler_plugin_name, NLS.bind(ContributionMessages.InfoView_countElements, elements.size())); return null; } }; handlerService.activateHandler(VIEW_COUNT_ID, countHandler); } @Override public void dispose() { if (countHandler != null) { // we must dispose our handlers, although in this case it will // be a no-op countHandler.dispose(); countHandler = null; } super.dispose(); } /** * Swap the 2 given elements from the model. * * @param p1 * @param p2 */ public void swap(Person p1, Person p2) { List<?> elements = viewerInput; int i1 = elements.indexOf(p1); int i2 = elements.indexOf(p2); Collections.swap(elements, i1, i2); viewer.refresh(); } /** * Refresh the viewer from the model. */ public void refresh() { viewer.refresh(); } private void editSelection() { IHandlerService handlerService = getSite() .getService(IHandlerService.class); try { handlerService.executeCommand(EditInfoHandler.ID, null); } catch (ExecutionException e) { // perhaps some logging here } catch (NotDefinedException e) { } catch (NotEnabledException e) { } catch (NotHandledException e) { } } }