Skip to content

Content of file EcorePathsRenderer.java

/*******************************************************************************
 * Copyright (c) 2011-2018 EclipseSource Muenchen GmbH and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Eugen Neufeld - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.ecp.view.internal.editor.controls;

import java.io.IOException;
import java.text.MessageFormat;

import javax.inject.Inject;

import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecp.ide.spi.util.EcoreHelper;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
import org.eclipse.emf.ecp.view.spi.model.VControl;
import org.eclipse.emf.ecp.view.spi.util.swt.ImageRegistryService;
import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
import org.eclipse.emfforms.spi.common.report.AbstractReport;
import org.eclipse.emfforms.spi.common.report.ReportService;
import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
import org.eclipse.emfforms.spi.localization.LocalizationServiceHelper;
import org.eclipse.emfforms.spi.view.control.multiattribute.MultiAttributeSWTRenderer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;

/**
 * Custom Renderer for the EcorePath List of a View. This Renderer changes the behavior of the add and remove button so
 * that a user gets a Dialog to select an Ecore from the Workspace in the case of an add. In the case of a remove the
 * Ecore is deregistered.
 *
 * @author Eugen Neufeld
 *
 */
public class EcorePathsRenderer extends MultiAttributeSWTRenderer {

	private Composite parent;
	private IObservableList list;

	/**
	 * Default constructor.
	 *
	 * @param vElement The {@link VControl} of the Renderer
	 * @param viewContext The {@link ViewModelContext} of the Renderer
	 * @param reportService The {@link ReportService} to use for logging
	 * @param emfFormsDatabinding The {@link EMFFormsDatabinding} to use
	 * @param emfFormsLabelProvider The {@link EMFFormsLabelProvider} to use
	 * @param vtViewTemplateProvider The {@link VTViewTemplateProvider} to use
	 * @param imageRegistryService The {@link ImageRegistryService} to use
	 */
	@Inject
	public EcorePathsRenderer(VControl vElement, ViewModelContext viewContext, ReportService reportService,
		EMFFormsDatabinding emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider,
		VTViewTemplateProvider vtViewTemplateProvider, ImageRegistryService imageRegistryService) {
		super(vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider,
			imageRegistryService);
	}

	@Override
	public void finalizeRendering(Composite parent) {
		super.finalizeRendering(parent);
		this.parent = parent;
	}

	@Override
	protected void initButtons(IObservableList list) {
		this.list = list;
		super.initButtons(list);
	}

	@Override
	protected Object getValueForNewRow(EAttribute attribute) {
		final ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(parent.getShell(),
			new WorkbenchLabelProvider(), new BaseWorkbenchContentProvider());
		dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
		dialog.setAllowMultiple(false);
		dialog.setValidator(new ISelectionStatusValidator() {

			@Override
			public IStatus validate(Object[] selection) {
				if (selection.length == 1 && selection[0] instanceof IFile) {
					final IFile file = (IFile) selection[0];
					if (file.getType() == IResource.FILE && "ecore".equalsIgnoreCase(file.getFileExtension())) { //$NON-NLS-1$
						if (list.contains(file.getFullPath().toString())) {
							return new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR,
								MessageFormat.format(LocalizationServiceHelper.getString(EcorePathsRenderer.class,
									"EcorePath_AddDialog_Status_AlreadyAdded"), file.getName()), //$NON-NLS-1$
								null);
						}
						return new Status(IStatus.OK, Activator.PLUGIN_ID, IStatus.OK, null, null);
					}
				}
				return new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR,
					LocalizationServiceHelper.getString(EcorePathsRenderer.class,
						"EcorePath_AddDialog_Status_NotEcore"), //$NON-NLS-1$
					null);
			}
		});

		dialog.setTitle(LocalizationServiceHelper.getString(EcorePathsRenderer.class, "EcorePath_AddDialog_Title")); //$NON-NLS-1$
		dialog.setMessage(LocalizationServiceHelper.getString(EcorePathsRenderer.class, "EcorePath_AddDialog_Message")); //$NON-NLS-1$

		if (dialog.open() == Window.OK) {
			final String path = ((IFile) dialog.getFirstResult()).getFullPath().toString();
			try {
				EcoreHelper.registerEcore(path);
			} catch (final IOException ex) {
				getReportService().report(new AbstractReport(ex));
				return null;
			}
			return path;
		}
		return null;
	}

	@Override
	protected void postRemove(IStructuredSelection selection) {
		for (final Object toDelete : selection.toList()) {
			EcoreHelper.unregisterEcore(toDelete.toString());
		}
	}

	@Override
	protected void createUpDownButtons(Composite composite, IObservableList list) {
// do nothing } }