/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.transformation.ui.builder;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.query.sql.lang.ILanguageObject;
import org.teiid.query.ui.builder.model.CompositeLanguageObjectEditorModel;
import org.teiid.query.ui.builder.model.ILanguageObjectEditorModel;
import org.teiid.query.ui.builder.model.ILanguageObjectEditorModelListener;
import org.teiid.query.ui.builder.model.LanguageObjectEditorModelEvent;
/**
* The <code>AbstractCompositeLanguageObjectEditor</code> manages a set of
*
* @since 8.0
*/
public abstract class AbstractCompositeLanguageObjectEditor extends AbstractLanguageObjectEditor {
// /////////////////////////////////////////////////////////////////////////////////////////////
// CONSTANTS
// /////////////////////////////////////////////////////////////////////////////////////////////
private static final String PREFIX = "AbstractCompositeLanguageObjectEditor."; //$NON-NLS-1$
// /////////////////////////////////////////////////////////////////////////////////////////////
// FIELDS
// /////////////////////////////////////////////////////////////////////////////////////////////
private ViewController controller;
private ILanguageObjectEditor currentEditor;
private List<ILanguageObjectEditor> editors;
// /////////////////////////////////////////////////////////////////////////////////////////////
// CONSTRUCTORS
// /////////////////////////////////////////////////////////////////////////////////////////////
public AbstractCompositeLanguageObjectEditor( Composite theParent,
Class theEditorType,
CompositeLanguageObjectEditorModel theModel ) {
super(theParent, theEditorType, theModel);
controller = new ViewController();
theModel.addModelListener(controller);
}
// /////////////////////////////////////////////////////////////////////////////////////////////
// METHODS
// /////////////////////////////////////////////////////////////////////////////////////////////
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.ILanguageObjectEditor#acceptFocus()
*/
@Override
public void acceptFocus() {
if (currentEditor != null) {
currentEditor.acceptFocus();
}
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.ILanguageObjectEditor#clear()
*/
@Override
public void clear() {
for (int size = editors.size(), i = 0; i < size; i++) {
ILanguageObjectEditor editor = editors.get(i);
editor.clear();
}
super.clear();
setCurrentEditor(getDefaultEditor());
}
/**
* Subclasses must return a non-empty list of <code>ILanguageObjectEditor</code>s.
*
* @param theParent the widget container to be used by the editor
* @return a collection of editors
*/
protected abstract List createEditors( Composite theParent );
protected void displayModelChanged() {
CompositeLanguageObjectEditorModel model = (CompositeLanguageObjectEditorModel)getModel();
ILanguageObjectEditorModel subModel = model.getCurrentModel();
Class modelType = subModel.getModelType();
for (int size = editors.size(), i = 0; i < size; i++) {
ILanguageObjectEditor editor = editors.get(i);
if (editor.getEditorType().isAssignableFrom(modelType)) {
setCurrentEditor(editor);
break;
}
}
}
/**
* Subclasses must implement {@link #createEditors(Composite)} to create their UI.
*
* @throws com.metamatrix.core.util.AssertionError if editor collection is <code>null</code> or empty
* @see org.teiid.designer.transformation.ui.builder.AbstractLanguageObjectEditor
*/
@Override
final protected void createUi( Composite theControl ) {
ViewForm form = new ViewForm(theControl, SWT.BORDER);
form.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite pnl = new Composite(form, SWT.NONE);
form.setContent(pnl);
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
pnl.setLayout(layout);
pnl.setLayoutData(new GridData(GridData.FILL_BOTH));
editors = createEditors(pnl);
CoreArgCheck.isNotEmpty(editors);
}
/**
* Gets the editor currently selected.
*
* @return the selected editor
*/
protected ILanguageObjectEditor getCurrentEditor() {
return currentEditor;
}
/**
* Gets the editor to use when no editor is currently selected. This is called after <code>clear()</code> is called.
*
* @return the default editor
*/
protected abstract ILanguageObjectEditor getDefaultEditor();
/**
* Gets the collection of editors being managed.
*
* @return the editors
*/
protected List getEditors() {
return editors;
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.ILanguageObjectEditor#getTitle()
*/
@Override
public abstract String getTitle();
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.ILanguageObjectEditor#getToolTipText()
*/
@Override
public abstract String getToolTipText();
/**
* Sets the given editor as being the current editor.
*
* @param theEditor the editor to make the current editor
* @throws IllegalArgumentException if editor is <code>null</code> or not found in editor collection
*/
protected void setCurrentEditor( ILanguageObjectEditor theEditor ) {
CoreArgCheck.isNotNull(theEditor);
CoreArgCheck.contains(editors, theEditor);
currentEditor = theEditor;
CompositeLanguageObjectEditorModel model = (CompositeLanguageObjectEditorModel)getModel();
model.setCurrentModel(currentEditor.getModel());
currentEditor.acceptFocus();
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.AbstractLanguageObjectEditor#setModel(org.teiid.query.ui.builder.model.ILanguageObjectEditorModel)
*/
@Override
public void setModel( ILanguageObjectEditorModel theModel ) {
super.setModel(theModel);
if (!CompositeLanguageObjectEditorModel.class.isAssignableFrom(theModel.getClass())) {
CoreArgCheck.isTrue(CompositeLanguageObjectEditorModel.class.isAssignableFrom(theModel.getClass()),
Util.getString(PREFIX + "wrongModelType", //$NON-NLS-1$
new Object[] {theModel.getClass().getName()}));
}
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.ILanguageObjectEditor#setLanguageObject(org.teiid.query.sql.LanguageObject)
*/
@Override
public void setLanguageObject( ILanguageObject theLanguageObject ) {
getModel().setLanguageObject(theLanguageObject);
}
// /////////////////////////////////////////////////////////////////////////////////////////////
// ViewController INNER CLASS
// /////////////////////////////////////////////////////////////////////////////////////////////
/**
* The <code>ViewController</code> class is a view controller for the <code>ConstantEditor</code>.
*/
class ViewController implements ILanguageObjectEditorModelListener {
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.ILanguageObjectEditorModelListener#modelChanged(org.teiid.query.ui.builder.model.LanguageObjectEditorModelEvent)
*/
@Override
public void modelChanged( LanguageObjectEditorModelEvent theEvent ) {
String type = theEvent.getType();
if (type.equals(CompositeLanguageObjectEditorModel.MODEL_CHANGE)) {
displayModelChanged();
}
}
}
}