/************************************************************************** * 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(); } }