[comment encoding = UTF-8
 *******************************************************************************
 * Copyright (c) 2008-2009 Obeo.
 * 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:
 *     Obeo - initial API and implementation
 *******************************************************************************
 /]
[module multivaluededitorFormImpl('http://www.eclipse.org/emf/eef/views/1.0.0', 'http://www.eclipse.org/emf/eef/components/1.0.0', 'http://www.eclipse.org/emf/eef/generation/1.0.0', 'http://www.eclipse.org/emf/2002/Ecore') extends org::eclipse::emf::eef::codegen::widgets::api::widgetFormImpl/]

[import org::eclipse::emf::eef::codegen::services::common /]
[import org::eclipse::emf::eef::codegen::services::naming /]
[import org::eclipse::emf::eef::codegen::services::viewCommon /]
[import org::eclipse::emf::eef::codegen::services::imports/]

[template public manageImports(widget : Widget, pec : PropertiesEditionComponent, view : View, basePackage : String) overrides manageImports ? (widget.name = 'MultiValuedEditor')]
[pec.addImports(Sequence{
	'org.eclipse.ui.forms.widgets.FormToolkit',
	'org.eclipse.emf.common.util.BasicEList',
	'org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider',
	'org.eclipse.emf.eef.runtime.impl.notify.PropertiesEditionEvent',
	'org.eclipse.emf.eef.runtime.ui.utils.EditingUtils',
	'org.eclipse.emf.eef.runtime.ui.widgets.EEFFeatureEditorDialog',
	'org.eclipse.jface.window.Window',
	'org.eclipse.swt.events.SelectionAdapter',
	'org.eclipse.swt.events.SelectionEvent',
	'org.eclipse.swt.SWT',
	'org.eclipse.swt.widgets.Composite',
	'org.eclipse.swt.layout.GridData'})/]
[/template]

[template public widgetDeclaration(editor : ElementEditor) overrides widgetDeclaration ? (editor.representation.name = 'MultiValuedEditor')]
	protected [include('org.eclipse.swt.widgets.Text')/] [editor.elementEditorName()/];
	protected [include('org.eclipse.swt.widgets.Button')/] edit[editor.name.toJavaClassifier().disambiguation('view')/];
	protected [include('org.eclipse.emf.common.util.EList')/] [editor.elementEditorName()/]List;
[/template]

[template public implementation(editor : ElementEditor) overrides implementation ? (editor.representation.name = 'MultiValuedEditor')]
return create[editor.name.toJavaClassifier()/]MultiValuedEditor(widgetFactory, parent);
[/template]

[template public additionalImplementation(editor : ElementEditor, pec : PropertiesEditionComponent, inputPEC: PropertiesEditionComponent) overrides additionalImplementation ? (editor.representation.name = 'MultiValuedEditor')]
	/**
	 * [editor.owningViewsRepository().associatedGenModel().generationMark()/]
	 */
	protected Composite create[editor.name.toJavaClassifier()/]MultiValuedEditor(FormToolkit widgetFactory, Composite parent) {
		[editor.elementEditorName()/] = widgetFactory.createText(parent, "", SWT.READ_ONLY); //$NON-NLS-1$
		GridData [editor.elementEditorName()/]Data = new GridData(GridData.FILL_HORIZONTAL);
		[editor.elementEditorName()/]Data.horizontalSpan = 2;
		[editor.elementEditorName()/].setLayoutData([editor.elementEditorName()/]Data);
		EditingUtils.setID([editor.elementEditorName()/], [editor.editorID()/]);
		EditingUtils.setEEFtype([editor.elementEditorName()/], "eef::[editor.representation.name/]::field"); //$NON-NLS-1$
		edit[editor.name.toJavaClassifier()/] = widgetFactory.createButton(parent, getDescription([editor.editorID()/], [include(editor.owningViewsRepository().qualifiedMessagesProvider())/].[editor.editorKey(editor.owningView())/]), SWT.NONE);
		[if (editor.readOnly)]
		edit[editor.name.toJavaClassifier()/].setEnabled(false);
		[/if]
		GridData edit[editor.name.toJavaClassifier()/]Data = new GridData();
		edit[editor.name.toJavaClassifier()/].setLayoutData(edit[editor.name.toJavaClassifier()/]Data);
		edit[editor.name.toJavaClassifier()/].addSelectionListener(new SelectionAdapter() {

			/**
			 * {@inheritDoc}
			 * 
			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
			 * [editor.owningViewsRepository().associatedGenModel().generationMark()/]
			 */
			public void widgetSelected(SelectionEvent e) {
				EEFFeatureEditorDialog dialog = new EEFFeatureEditorDialog(
						[editor.elementEditorName()/].getShell(), "[pec.pecModelClass()/]", new AdapterFactoryLabelProvider(adapterFactory), //$NON-NLS-1$
						[editor.elementEditorName()/]List, [editor.involvedPropertiesEditionElement().metamodelGetter()/].getEType(), null,
						false, true, 
						null, null);
				if (dialog.open() == Window.OK) {
					[editor.elementEditorName()/]List = dialog.getResult();
					if ([editor.elementEditorName()/]List == null) {
						[editor.elementEditorName()/]List = new BasicEList();
					}
					[editor.elementEditorName()/].setText([editor.elementEditorName()/]List.toString());
					propertiesEditionComponent.firePropertiesChanged(new PropertiesEditionEvent([editor.editionPart()/].this, [editor.editorID()/], PropertiesEditionEvent.COMMIT, PropertiesEditionEvent.SET, null, new BasicEList([editor.elementEditorName()/]List)));
					setHasChanged(true);
				}
			}
		});
		EditingUtils.setID(edit[editor.name.toJavaClassifier()/], [editor.editorID()/]);
		EditingUtils.setEEFtype(edit[editor.name.toJavaClassifier()/], "eef::[editor.representation.name/]::browsebutton"); //$NON-NLS-1$
		// [protected ('for create'.concat(editor.name.toJavaClassifier()).concat('MultiValuedEditor'))]

		// [/protected]
		return parent;
	}
[/template]
