blob: 54201c194c18b5bd6472ba1b53e5ef70675d261a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2018 Obeo and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Obeo - initial API and implementation
* references WizardNewFileCreationPage, ResourceDialog and ExtendedLoadResourceDialog
*******************************************************************************/
package org.eclipse.ocl.xtext.base.ui.wizards;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.presentation.EcoreActionBarContributor.ExtendedLoadResourceAction.ExtendedLoadResourceDialog;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.ocl.xtext.base.ui.BaseUiPluginHelper;
import org.eclipse.ocl.xtext.base.ui.messages.BaseUIMessages;
import org.eclipse.ocl.xtext.base.ui.ripoffs.ResourceAndContainerGroup;
import org.eclipse.osgi.util.NLS;
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.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
public abstract class AbstractFileDialog extends ExtendedLoadResourceDialog
{
private static final int SIZING_CONTAINER_GROUP_HEIGHT = 120;
public static final String PREFIX = BaseUiPluginHelper.PLUGIN_ID + "."; //$NON-NLS-1$
private static final String NEW_FILE_WIZARD_PAGE = PREFIX
+ BaseUIMessages.NewWizardPage_newFileWizardContextId;
// the current resource selection
protected final @Nullable IResource initialSelection;
private AbstractFileNewWizardPage wizardPage;
protected final @NonNull AbstractFileNewWizard wizard;
// widgets
private @Nullable ResourceAndContainerGroup resourceGroup;
/**
* Creates an extended new complete OCL file creation dialog. If the initial
* resource selection contains exactly one container resource then it will
* be used as the default container resource.
*/
public AbstractFileDialog(@NonNull AbstractFileNewWizard wizard, @NonNull AbstractFileNewWizardPage wizardPage, @Nullable IResource initialSelection) {
super(wizardPage.getShell(), null);
this.initialSelection = initialSelection;
this.wizardPage = wizardPage;
this.wizard = wizard;
}
@Override
public Composite createDialogArea(Composite parent) {
initializeDialogUnits(parent);
// top level group
Composite topLevel = new Composite(parent, SWT.NONE);
topLevel.setLayout(new GridLayout());
topLevel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
topLevel.setFont(parent.getFont());
PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel, NEW_FILE_WIZARD_PAGE);
resourceGroup = createResourceAndContainerArea(topLevel);
createMetamodelsArea(topLevel);
initSelection(initialSelection);
return topLevel;
}
protected void createMetamodelsArea(Composite topLevel) {
super.createDialogArea(topLevel);
}
protected @Nullable ResourceAndContainerGroup createResourceAndContainerArea(Composite parent) {
// resource and container group
ResourceAndContainerGroup resourceGroup = new ResourceAndContainerGroup(parent, wizardPage,
wizard.getNewFileLabel(), BaseUIMessages.NewWizardPage_file, false, SIZING_CONTAINER_GROUP_HEIGHT);
resourceGroup.setAllowExistingResources(false);
resourceGroup.setResourceExtension(wizard.getNewFileExtension());
return resourceGroup;
}
/**
* Returns the current file name as entered by the user, or its anticipated
* initial value. <br>
* <br>
* The current file name will include the file extension if the
* preconditions are met.
*
* @see WizardNewFileCreationPage#setFileExtension(String)
*
* @return the file name, its anticipated initial value, or
* <code>null</code> if no file name is known
*/
public String getFileName() {
return getGroup().getResource();
}
/**
* @return the resource group
*/
protected @NonNull ResourceAndContainerGroup getGroup() {
ResourceAndContainerGroup resourceGroup2 = resourceGroup;
assert resourceGroup2 != null;
return resourceGroup2;
}
public IFile getNewFile() {
IPath newFilePath = getNewFilePath();
return ResourcesPlugin.getWorkspace().getRoot().getFile(newFilePath);
}
public IPath getNewFilePath() {
ResourceAndContainerGroup group = getGroup();
IPath containerPath = group.getContainerFullPath();
return containerPath.append(group.getResource());
}
@Override
public Shell getShell() {
return wizard.getShell();
}
public void initSelection(IResource initialSelection) {
ResourceAndContainerGroup resourceGroup2 = resourceGroup;
if (resourceGroup2 != null) {
IResource resourceSelection2 = initialSelection;
if (resourceSelection2 instanceof IFile) {
IPath fullPath = resourceSelection2.getFullPath();
if (uriField != null) {
URI uri = URI.createPlatformResourceURI(fullPath.toString(), true);
uriField.setText(String.valueOf(uri));
}
IPath removeFileExtension = fullPath.removeFileExtension();
IPath addFileExtension = removeFileExtension.addFileExtension(wizard.getNewFileExtension());
resourceGroup2.setResource(addFileExtension.lastSegment());
}
else {
resourceGroup2.setResource(wizard.getNewFileName());
}
if (resourceSelection2 != null) {
initialPopulateContainerNameField(resourceSelection2);
}
}
}
/**
* Sets the initial contents of the container name entry field, based upon
* either a previously-specified initial value or the ability to determine
* such a value.
*/
@SuppressWarnings("null")
private void initialPopulateContainerNameField(@NonNull IResource resourceSelection) {
ResourceAndContainerGroup resourceGroup2 = getGroup();
if (resourceSelection.getType() == IResource.FILE) {
resourceSelection = resourceSelection.getParent();
}
if (resourceSelection.isAccessible()) {
resourceGroup2.setContainerFullPath(resourceSelection.getFullPath());
}
}
/**
* Returns true if this selected resource would be filtered from view.
*
* {@link IWorkspace#validateFiltered(IResource)}
*/
protected boolean isFilteredByParent() {
ResourceAndContainerGroup group = getGroup();
IPath containerPath = group.getContainerFullPath();
if (containerPath == null)
return false;
String resourceName = group.getResource();
if (resourceName == null)
return false;
if (resourceName.length() > 0) {
// IPath newFolderPath = containerPath.append(resourceName);
// IFile newFileHandle = createFileHandle(newFolderPath);
IFile newFileHandle = getNewFile();
IWorkspace workspace = newFileHandle.getWorkspace();
return !workspace.validateFiltered(newFileHandle).isOK();
}
return false;
}
public boolean isURIFieldValid() {
return (uriField == null) || (uriField.getText() != "");//$NON-NLS-1$
}
public boolean validateGroup() {
boolean valid = true;
ResourceAndContainerGroup group = getGroup();
if (!group.areAllValuesValid()) {
// if blank name then fail silently
int problemType = group.getProblemType();
String problemMessage = group.getProblemMessage();
if (problemType == ResourceAndContainerGroup.PROBLEM_RESOURCE_EMPTY
|| problemType == ResourceAndContainerGroup.PROBLEM_CONTAINER_EMPTY) {
wizardPage.setMessage(problemMessage);
wizardPage.setErrorMessage(null);
} else {
wizardPage.setErrorMessage(problemMessage);
}
valid = false;
}
String resourceName = group.getResource();
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IStatus result = workspace.validateName(resourceName, IResource.FILE);
if (!result.isOK()) {
wizardPage.setErrorMessage(result.getMessage());
return false;
}
if (group.getAllowExistingResources()) {
String problemMessage = NLS.bind(
BaseUIMessages.NewWizardPage_nameExists,
getFileName());
IPath resourcePath = group.getContainerFullPath().append(getFileName());
IWorkspaceRoot root = workspace.getRoot();
if (root.getFolder(resourcePath).exists()) {
wizardPage.setErrorMessage(problemMessage);
valid = false;
}
if (root.getFile(resourcePath).exists()) {
wizardPage.setMessage(problemMessage, IMessageProvider.WARNING);
}
}
if (isFilteredByParent()) {
wizardPage.setMessage(
BaseUIMessages.NewWizardPage_resourceWillBeFilteredWarning,
IMessageProvider.ERROR);
valid = false;
}
return valid;
}
}