/**
* <copyright>
*
* 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
*
* </copyright>
*
* $Id: RoseDetailPage.java,v 1.16 2009/05/10 17:31:07 davidms Exp $
*/
package com.sap.emf.importer.moin.rose.ui;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
import org.eclipse.emf.common.ui.celleditor.SingleColumnTableEditor;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.edit.provider.ItemProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.importer.ModelImporter;
import org.eclipse.emf.importer.ui.contribution.base.ModelImporterDetailPage;
import org.eclipse.emf.converter.ConverterPlugin;
import org.eclipse.emf.converter.util.ConverterUtil;
import com.sap.emf.importer.moin.rose.RoseImporter;
import com.sap.emf.importer.moin.rose.RoseImporterPlugin;
/**
* @since 2.1.0
*/
public class RoseDetailPage extends ModelImporterDetailPage
{
protected Button loadPathMapSymbolsButton;
protected Button browsePathMapLocationButton;
protected Table pathMapTable;
protected TableViewer pathMapTableViewer;
protected boolean isCellEditing = false;
public RoseDetailPage(ModelImporter modelImporter, String pageName)
{
super(modelImporter, pageName);
setTitle(RoseImporterPlugin.INSTANCE.getString("_UI_RoseModelImport_title"));
setDescription(RoseImporterPlugin.INSTANCE.getString(showGenModel() ?
"_UI_RoseModelImportNewProject_description" : "_UI_RoseModelImportFile_description"));
}
@Override
public void dispose()
{
if (loadPathMapSymbolsButton != null)
{
loadPathMapSymbolsButton.removeListener(SWT.Selection, this);
loadPathMapSymbolsButton = null;
}
if (browsePathMapLocationButton != null)
{
browsePathMapLocationButton.removeListener(SWT.Selection, this);
browsePathMapLocationButton = null;
}
if (pathMapTable != null)
{
pathMapTable.removeListener(SWT.Selection, this);
pathMapTable = null;
}
if (pathMapTableViewer != null)
{
pathMapTableViewer = null;
}
super.dispose();
}
@Override
protected boolean supportMultipleURIs()
{
return false;
}
public RoseImporter getRoseImporter()
{
return (RoseImporter)getModelImporter();
}
@Override
protected void addDetailControl(Composite parent)
{
Group pathMapGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
{
FormLayout layout = new FormLayout();
layout.marginTop = 10;
layout.spacing = 10;
pathMapGroup.setLayout(layout);
}
pathMapGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
pathMapGroup.setText(RoseImporterPlugin.INSTANCE.getString("_UI_PathMap_label"));
pathMapTable = new Table(pathMapGroup, SWT.BORDER | SWT.FULL_SELECTION);
Composite buttonComposite = new Composite(pathMapGroup, SWT.NONE);
{
FormData data = new FormData();
data.top = new FormAttachment(0, -10);
data.right = new FormAttachment(100, -5);
buttonComposite.setLayoutData(data);
GridLayout layout = new GridLayout(2, true);
buttonComposite.setLayout(layout);
}
{
FormData data = new FormData();
data.top = new FormAttachment(buttonComposite, 0, SWT.BOTTOM);
data.bottom = new FormAttachment(100, -10);
data.left = new FormAttachment(0, 10);
data.right = new FormAttachment(100, -10);
pathMapTable.setLayoutData(data);
}
loadPathMapSymbolsButton = new Button(buttonComposite, SWT.PUSH);
loadPathMapSymbolsButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
loadPathMapSymbolsButton.setText(RoseImporterPlugin.INSTANCE.getString("_UI_LoadSymbols_label"));
loadPathMapSymbolsButton.addListener(SWT.Selection, this);
browsePathMapLocationButton = new Button(buttonComposite, SWT.PUSH);
browsePathMapLocationButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
browsePathMapLocationButton.setText(RoseImporterPlugin.INSTANCE.getString("_UI_Browse_label"));
browsePathMapLocationButton.setEnabled(false);
browsePathMapLocationButton.addListener(SWT.Selection, this);
pathMapTableViewer = new TableViewer(pathMapTable);
pathMapTable.setHeaderVisible(true);
pathMapTable.setLinesVisible(true);
{
TableLayout layout = new TableLayout();
TableColumn variableNameColumn = new TableColumn(pathMapTable, SWT.NONE);
layout.addColumnData(new ColumnWeightData(2, true));
variableNameColumn.setText(RoseImporterPlugin.INSTANCE.getString("_UI_SymbolName_label"));
variableNameColumn.setResizable(true);
TableColumn locationColumn = new TableColumn(pathMapTable, SWT.NONE);
layout.addColumnData(new ColumnWeightData(3, true));
locationColumn.setText(RoseImporterPlugin.INSTANCE.getString("_UI_ActualLocation_label"));
locationColumn.setResizable(true);
pathMapTable.setLayout(layout);
}
pathMapTable.addListener(SWT.Selection, this);
new SingleColumnTableEditor(pathMapTable)
{
@Override
protected Control createEditor(TableItem item, int column)
{
isCellEditing = true;
setPageComplete(false);
return createTextEditor(item, column);
}
@Override
protected void endEditing(TableItem item, int column, Control editor, boolean accept)
{
super.endEditing(item, column, editor, accept);
isCellEditing = false;
setErrorMessage(null);
setMessage(null);
setPageComplete(isPageComplete());
}
@Override
protected void update(TableItem item, int column, Control editor)
{
item.setText(column, ((Text)editor).getText());
String key = item.getText(0);
String value = item.getText(1);
if ("".equals(value))
{
value = null;
}
getRoseImporter().getPathMap().put(key, value);
}
};
AdapterFactory adapterFactory = new AdapterFactoryImpl();
pathMapTableViewer.setColumnProperties(new String []{ "a", "b" });
pathMapTableViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
pathMapTableViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)
{
@Override
public Image getColumnImage(Object o, int columnIndex)
{
switch (columnIndex)
{
default: {
return null;
}
}
}
@Override
public String getColumnText(Object o, int columnIndex)
{
switch (columnIndex)
{
case 0: {
return (String)o;
}
default:
case 1: {
String result = getRoseImporter().getPathMap().get(o);
return result == null ? "" : result;
}
}
}
});
}
@Override
protected void doHandleEvent(Event event)
{
if (event.type == SWT.Selection && event.widget == loadPathMapSymbolsButton)
{
if (uriText.getText().trim().length() > 0)
{
getControl().getDisplay().syncExec(new Runnable()
{
public void run()
{
loadPathMapSymbols();
}
});
}
}
else if (event.type == SWT.Selection && event.widget == pathMapTable)
{
browsePathMapLocationButton.setEnabled(pathMapTable.getSelectionIndex() != -1);
}
else if (event.type == SWT.Selection && event.widget == browsePathMapLocationButton)
{
int index = pathMapTable.getSelectionIndex();
String symbol = pathMapTable.getItem(index).getText();
DirectoryDialog directoryDialog = new DirectoryDialog(getShell());
directoryDialog.setMessage(RoseImporterPlugin.INSTANCE.getString("_UI_PathMapDirectoryDialog_message", new Object[] { symbol }));
String path = directoryDialog.open();
if (path != null && path.length() > 0)
{
getRoseImporter().getPathMap().put(symbol, path);
setPageComplete(false);
pathMapTableViewer.refresh();
if (++index < pathMapTable.getItemCount())
{
pathMapTable.select(index);
}
}
}
else
{
super.doHandleEvent(event);
}
getContainer().updateButtons();
}
@Override
public boolean isPageComplete()
{
return !isCellEditing && super.isPageComplete();
}
@Override
protected void adjustLoadButton()
{
super.adjustLoadButton();
loadPathMapSymbolsButton.setEnabled(loadButton.isEnabled());
}
@Override
protected void refreshModel()
{
super.refreshModel();
pathMapTableViewer.setInput(new ItemProvider(getRoseImporter().getPathMap().keySet()));
}
protected void loadPathMapSymbols()
{
Diagnostic diagnostic = null;
try
{
diagnostic = getRoseImporter().loadPathMap(new BasicMonitor());
}
catch (Exception exception)
{
diagnostic = ConverterUtil.createErrorDiagnostic(exception, false);
}
internalSetGenModelFileName(diagnostic.getSeverity() == Diagnostic.OK ?
getRoseImporter().getGenModelFileName() :
getRoseImporter().computeDefaultGenModelFileName());
Diagnostic nameDiagnostic = getRoseImporter().checkGenModelFileName();
if (nameDiagnostic.getSeverity() != Diagnostic.OK)
{
if (diagnostic.getSeverity() == Diagnostic.OK)
{
diagnostic = nameDiagnostic;
}
else
{
diagnostic = ConverterUtil.mergeDiagnostic(diagnostic, nameDiagnostic);
}
}
if (diagnostic.getSeverity() == Diagnostic.OK && getRoseImporter().getPathMap().isEmpty())
{
diagnostic = new BasicDiagnostic(Diagnostic.INFO, ConverterPlugin.ID,
ConverterUtil.ACTION_DEFAULT, RoseImporterPlugin.INSTANCE.getString("_UI_NoPathMap_message"), null);
}
pathMapTableViewer.setInput(new ItemProvider(getRoseImporter().getPathMap().keySet()));
handleDiagnostic(diagnostic, null, RoseImporterPlugin.INSTANCE.getString("_UI_LoadProblem_title"), RoseImporterPlugin.INSTANCE.getString("_UI_RoseLoadFailed_message"));
}
}