/**
* Copyright (c) 2005-2007 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 - Initial API and implementation
*/
package org.eclipse.emf.importer.ui.contribution.base;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.emf.common.ui.dialogs.WorkspaceResourceDialog;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.converter.ui.contribution.base.ModelConverterURIPage;
import org.eclipse.emf.converter.util.ConverterUtil;
import org.eclipse.emf.importer.ImporterPlugin;
import org.eclipse.emf.importer.ModelImporter;
/**
* @since 2.2.0
*/
public class ModelImporterDetailPage extends ModelConverterURIPage implements IModelImporterPage
{
protected Button loadButton;
protected Text genModelNameText;
protected String[] filterExtensions;
protected boolean showGenModel = false;
protected boolean usingInternalSetName = true;
public ModelImporterDetailPage(ModelImporter modelImporter, String pageName)
{
super(modelImporter, pageName);
showGenModel = getModelImporter().getGenModelFileName() == null;
}
public ModelImporter getModelImporter()
{
return (ModelImporter)getModelConverter();
}
@Override
public void dispose()
{
if (loadButton != null)
{
loadButton.removeListener(SWT.Selection, this);
loadButton = null;
}
if (genModelNameText != null)
{
genModelNameText.removeListener(SWT.Modify, this);
genModelNameText = null;
}
super.dispose();
}
public boolean showGenModel()
{
return showGenModel;
}
@Override
protected void pageActivated(boolean firstTime, int cause)
{
if (firstTime)
{
if (getModelImporter().getOriginalGenModelPath() != null)
{
getControl().getDisplay().asyncExec(new Runnable()
{
public void run()
{
handleOriginalModelFile();
}
});
}
}
}
protected void handleOriginalModelFile()
{
refreshModel();
}
@Override
protected void addControl(Composite parent)
{
addDetailControl(parent);
if (showGenModel())
{
createGenModelNameControl(parent);
}
adjustLoadButton();
}
protected void addDetailControl(Composite parent)
{
// Subclasses may override
}
@Override
protected String getURITextInitialValue()
{
String uri = getModelImporter().getModelLocation();
return uri != null ? uri : super.getURITextInitialValue();
}
@Override
protected void addURIControl(Composite parent)
{
loadButton = new Button(parent, SWT.PUSH);
loadButton.setText(ImporterPlugin.INSTANCE.getString("_UI_Load_label"));
loadButton.setLayoutData(new GridData(GridData.END));
loadButton.addListener(SWT.Selection, this);
}
protected void createGenModelNameControl(Composite parent)
{
Label genModelNameLabel = new Label(parent, SWT.LEFT);
genModelNameLabel.setText(ImporterPlugin.INSTANCE.getString("_UI_GeneratorModelName_label"));
genModelNameText = new Text(parent, SWT.SINGLE | SWT.BORDER);
genModelNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
genModelNameText.addListener(SWT.Modify, this);
}
@Override
protected void doHandleEvent(Event event)
{
if (event.type == SWT.Selection && event.widget == loadButton)
{
refreshModel();
getContainer().updateButtons();
}
else if (event.type == SWT.Modify && event.widget == genModelNameText)
{
usingInternalSetName = false;
getModelImporter().setGenModelFileName(genModelNameText.getText());
Diagnostic diagnostic = getModelImporter().checkGenModelFileName();
handleDiagnostic(diagnostic);
getContainer().updateButtons();
}
else
{
super.doHandleEvent(event);
}
}
@Override
protected void uriTextModified(String text)
{
super.uriTextModified(text);
getModelImporter().setModelLocation(null);
getModelImporter().clearEPackagesCollections();
adjustLoadButton();
}
protected void adjustLoadButton()
{
if (loadButton != null)
{
String text = uriText.getText();
loadButton.setEnabled(text != null && text.trim().length() > 0);
}
}
@Override
protected String getURITextLabel()
{
return supportMultipleURIs() ?
ImporterPlugin.INSTANCE.getString("_UI_ModelURIs_label") :
ImporterPlugin.INSTANCE.getString("_UI_ModelURI_label");
}
protected String getSelectModelLabel()
{
return ImporterPlugin.INSTANCE.getString("_UI_SelectModel_label");
}
@Override
protected boolean supportMultipleURIs()
{
return true;
}
protected String[] getFilterExtensions()
{
if (filterExtensions == null)
{
List<String> fileExtensions = getModelImporter().getFileExtensions();
if (fileExtensions.isEmpty())
{
filterExtensions = new String []{ "*.*" };
}
else if (fileExtensions.size() == 1)
{
filterExtensions = new String[]{"*." + fileExtensions.get(0)};
}
else
{
StringBuffer allFilterExtensions = new StringBuffer();
String[] extensions = new String [fileExtensions.size() + 1];
for (int i = 1, lenght=extensions.length; i < lenght; i++)
{
extensions[i] = "*." + fileExtensions.get(i-1);
allFilterExtensions.append(";").append(extensions[i]);
}
allFilterExtensions.deleteCharAt(0);
extensions[0] = allFilterExtensions.toString();
filterExtensions = extensions;
}
}
return filterExtensions;
}
protected boolean isValidWorkspaceResource(IResource resource)
{
if (resource.getType() == IResource.FILE)
{
String[] filterExtensions = getFilterExtensions();
if (filterExtensions.length > 0)
{
for (int i = 0; i < filterExtensions.length; i++)
{
if (filterExtensions[i].endsWith(".*") || filterExtensions[i].endsWith("." + resource.getFileExtension()))
{
return true;
}
}
}
}
return false;
}
@Override
protected boolean browseFileSystem()
{
FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN | (supportMultipleURIs() ? SWT.MULTI : SWT.SINGLE));
fileDialog.setFilterExtensions(getFilterExtensions());
URI modelURI = getModelImporter().getFirstModelLocationURI(true);
if (modelURI != null)
{
fileDialog.setFileName(modelURI.toFileString());
}
if (fileDialog.open() != null && fileDialog.getFileNames().length > 0)
{
String[] fileNames = fileDialog.getFileNames();
StringBuffer text = new StringBuffer();
for (int i = 0; i < fileNames.length; ++i)
{
String filePath = fileDialog.getFilterPath() + File.separator + fileNames[i];
text.append(URI.createFileURI(filePath).toString());
text.append(" ");
}
setURIText(text.toString());
refreshModel();
return true;
}
return false;
}
@Override
protected boolean browseWorkspace()
{
ViewerFilter extensionFilter = null;
if (!getModelImporter().getFileExtensions().isEmpty())
{
extensionFilter = new ViewerFilter()
{
@Override
public boolean select(Viewer viewer, Object parentElement, Object element)
{
return !(element instanceof IFile) || getModelImporter().getFileExtensions().contains(((IFile)element).getFileExtension());
}
};
}
IFile[] files = WorkspaceResourceDialog.openFileSelection(getShell(), null, null, supportMultipleURIs(), null, extensionFilter == null ? null : Collections.singletonList(extensionFilter));
if (files.length > 0)
{
StringBuffer text = new StringBuffer();
for (int i = 0; i < files.length; ++i)
{
if (isValidWorkspaceResource(files[i]))
{
text.append(URI.createPlatformResourceURI(files[i].getFullPath().toString(), true));
text.append(" ");
}
}
setURIText(text.toString());
refreshModel();
return true;
}
return false;
}
protected void refreshModel()
{
WorkspaceModifyOperation initializeOperation = new WorkspaceModifyOperation()
{
@Override
protected void execute(IProgressMonitor progressMonitor) throws CoreException
{
Diagnostic errorDiagnostic = null;
setErrorMessage(null);
setMessage(null);
Monitor monitor = BasicMonitor.toMonitor(progressMonitor);
try
{
refreshModel(monitor);
}
catch (Exception exception)
{
ImporterPlugin.INSTANCE.log(exception);
errorDiagnostic = ConverterUtil.createErrorDiagnostic(exception, true);
}
finally
{
monitor.done();
}
if (errorDiagnostic != null)
{
handleDiagnostic(errorDiagnostic, errorDiagnostic.getMessage(), ImporterPlugin.INSTANCE.getString("_UI_LoadProblem_title"), ImporterPlugin.INSTANCE.getString("_UI_ProblemsEncounteredProcessing_message"));
}
}
};
getModelImporter().setModelLocation(uriText.getText());
try
{
getContainer().run(false, false, initializeOperation);
}
catch (Exception exception)
{
ImporterPlugin.INSTANCE.log(exception);
}
if (isPageComplete())
{
setPageComplete(true);
}
else
{
setPageComplete(false);
uriText.selectAll();
uriText.setFocus();
}
}
@Override
public boolean isPageComplete()
{
return super.isPageComplete()
&& !getModelImporter().getEPackages().isEmpty()
&& !getModelImporter().getModelLocationURIs().isEmpty();
}
protected void refreshModel(Monitor monitor) throws Exception
{
Diagnostic diagnostic = null;
try
{
diagnostic = getModelImporter().computeEPackages(monitor);
getModelImporter().adjustEPackages(monitor);
}
catch (WrappedException wrappedException)
{
if (wrappedException.exception() instanceof FileNotFoundException)
{
setMessage(null);
setErrorMessage(ImporterPlugin.INSTANCE.getString("_UI_SpecifyAValidModel_message"));
return;
}
else
{
throw wrappedException.exception();
}
}
internalSetGenModelFileName(getDefaultGenModelFileName());
Diagnostic nameDiagnostic = getModelImporter().checkGenModelFileName();
if (nameDiagnostic.getSeverity() != Diagnostic.OK)
{
if (diagnostic.getSeverity() == Diagnostic.OK)
{
diagnostic = nameDiagnostic;
}
else
{
diagnostic = ConverterUtil.mergeDiagnostic(diagnostic, nameDiagnostic);
}
}
handleDiagnostic(diagnostic);
}
protected String getDefaultGenModelFileName()
{
return getModelImporter().computeDefaultGenModelFileName();
}
protected void internalSetGenModelFileName(String name)
{
if (usingInternalSetName && showGenModel() && name != null)
{
getModelImporter().setGenModelFileName(name);
setHandlingEvent(false);
genModelNameText.setText(getModelImporter().getGenModelFileName());
setHandlingEvent(true);
}
}
}