/**************************************************************************
* ERA - Eclipse Requirements Analysis
* ==============================================
* Copyright (C) 2009-2013 by Georg Blaschke, Christoph P. Neumann
* and Bernd Haberstumpf (http://era.origo.ethz.ch)
**************************************************************************
* Licensed under the Eclipse Public License - v 1.0 (the "License");
* you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.eclipse.org/org/documents/epl-v10.html
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**************************************************************************
*/
package era.foss.typeeditor;
import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.ui.util.EditUIUtil;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.IEditorPart;
import era.foss.erf.DatatypeDefinition;
import era.foss.erf.ERF;
import era.foss.erf.EraToolExtension;
import era.foss.erf.ErfPackage;
import era.foss.erf.SpecType;
import era.foss.erf.ToolExtension;
import era.foss.objecteditor.EraCommandStack;
import era.foss.objecteditor.contrib.IAllowViewerSchemaChange;
import era.foss.typeeditor.datatype.DatatypeDefinitionsForm;
import era.foss.typeeditor.spectype.SpecTypeForm;
import era.foss.typeeditor.view.ViewForm;
/**
* The topmost UI class of the typeeditor plug-in: representing the overall dialog.
* <p>
* Structured by a tab folder for which it instantiates forms for DatatypeDefinitions and SpecificationTypes.
* <p>
* Instantiates the {@link EraCommandStack} for handling the OK and Cancel buttons.
*
*/
public class TypeDialog extends TitleAreaDialog {
/** The editor. */
private IEditorPart editor = null;
/** The editing domain. */
private EditingDomain editingDomain = null;
// commandStack is required for Ok and Cancel Buttons
/** The era command stack. */
private EraCommandStack eraCommandStack = null;
/** The type editor activator. */
private Activator typeEditorActivator = null;
private ERF erfModel;
private Resource erfResource;
/**
* Era Tool extension model object
*/
private EraToolExtension toolExtension;
/**
* Creates a editor for Datatype, Attributes and Spectypes.
*
* @param activeShell the active shell
* @param editor the editor
*/
public TypeDialog( Shell activeShell, IEditorPart editor ) {
super( activeShell );
setShellStyle( getShellStyle() | SWT.RESIZE | SWT.MAX );
// set-up context
this.editor = editor;
this.editingDomain = ((IEditingDomainProvider)editor).getEditingDomain();
URI resourceURI = EditUIUtil.getURI( editor.getEditorInput() );
this.erfResource = editingDomain.getResourceSet().getResource( resourceURI, true );
this.erfModel = (ERF)erfResource.getContents().get( 0 );
this.eraCommandStack = (EraCommandStack)editingDomain.getCommandStack();
this.typeEditorActivator = era.foss.typeeditor.Activator.INSTANCE;
// find Era specific tool extensions
for( ToolExtension toolExtension : this.erfModel.getToolExtensions() ) {
if( toolExtension.eClass().getClassifierID() == ErfPackage.ERA_TOOL_EXTENSION ) {
this.toolExtension = (EraToolExtension)toolExtension;
}
}
assert (this.toolExtension != null);
// plant an initial checkpoint
this.eraCommandStack.plantCheckpoint();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell( Shell shell ) {
super.configureShell( shell );
shell.setText( typeEditorActivator.getString( "_UI_Type_Editor_label" ) );
shell.setMinimumSize( 1000, 400 );
}
/*
* (non-Javadoc) Method declared on Dialog.
*/
protected Control createDialogArea( Composite parent ) {
Composite composite = (Composite)super.createDialogArea( parent );
TabFolder typeEditorTabFolder = new TabFolder( composite, SWT.NONE );
typeEditorTabFolder.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
// Lists for TabItems: Controls and Labels
Control[] listOfControls = {
new ViewForm( typeEditorTabFolder, this.editor ),
new SpecTypeForm( typeEditorTabFolder, this.editor ),
new DatatypeDefinitionsForm( typeEditorTabFolder, this.editor )};
String[] listOfTabLabels = {
typeEditorActivator.getString( "_UI_ViewTab_label" ),
typeEditorActivator.getString( "_UI_SpecTypeTab_label" ),
typeEditorActivator.getString( "_UI_DataTypeDefinitionTab_label" )};
TabItem additionalTabItem = null;
for( int iter = 0; iter < listOfControls.length; ++iter ) {
additionalTabItem = new TabItem( typeEditorTabFolder, SWT.NONE );
additionalTabItem.setText( listOfTabLabels[iter] );
additionalTabItem.setControl( listOfControls[iter] );
}
additionalTabItem = null;
// (font of parent will be applied recursively to the newly added controls!)
applyDialogFont( composite );
return composite;
}
/**
* Ok pressed.
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
* @since 03.03.2010
*/
protected void okPressed() {
// validate model
BasicDiagnostic diagnostic = Diagnostician.INSTANCE.createDefaultDiagnostic( erfModel.getCoreContent() );
for( DatatypeDefinition dataType : erfModel.getCoreContent().getDataTypes() ) {
Diagnostician.INSTANCE.validate( dataType, diagnostic );
}
for( SpecType specType : erfModel.getCoreContent().getSpecTypes() ) {
Diagnostician.INSTANCE.validate( specType, diagnostic );
}
Diagnostician.INSTANCE.validate( toolExtension, diagnostic );
if( !diagnostic.getChildren().isEmpty() ) {
MessageDialog dialog = new MessageDialog(
this.getShell(),
typeEditorActivator.getString( "_UI_ValidationErrorDialog_title" ),
null,
typeEditorActivator.getString( "_UI_ValidationErrorDialog_text" ),
MessageDialog.ERROR,
new String[]{"OK"},
0 );
dialog.open();
String errorMessage = "";
for( Diagnostic diagnosticChildren : diagnostic.getChildren() ) {
errorMessage += diagnosticChildren.getMessage() + "\n";
}
this.setErrorMessage( errorMessage );
} else {
super.okPressed();
// the performed commands should not be available for undo after OK.
eraCommandStack.inhibitUndos();
// redraw the SpecObject editor
if( editor instanceof IViewerProvider ) {
Viewer viewer = ((IViewerProvider)editor).getViewer();
if( viewer instanceof IAllowViewerSchemaChange ) {
((IAllowViewerSchemaChange)viewer).recreateViewerSchema();
}
}
}
}
/**
* Cancel pressed.
*
* @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
* @since 03.03.2010
*/
protected void cancelPressed() {
super.cancelPressed();
// undo the complete CommandStack:
eraCommandStack.rollback();
}
}