blob: 0d253e24655c1547a5a35c7e7bd309ce11383df7 [file] [log] [blame]
/*
* Copyright (c) 2010-2020 BSI Business Systems Integration AG.
* 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:
* BSI Business Systems Integration AG - initial API and implementation
*/
package org.eclipse.scout.sdk.s2i.template
import com.intellij.psi.PsiClass
import com.intellij.psi.util.InheritanceUtil
import com.intellij.util.containers.ContainerUtil.emptyList
import org.eclipse.scout.sdk.core.s.IScoutRuntimeTypes
import org.eclipse.scout.sdk.core.s.ScoutModelHierarchy
import org.eclipse.scout.sdk.s2i.EclipseScoutBundle.Companion.message
import java.util.concurrent.ConcurrentHashMap
object Templates {
const val VALUE_FIELD_TYPE_VARIABLE_NAME = "type"
private lateinit var m_templateProvider: (PsiClass) -> Map<String, TemplateDescriptor>
private val m_builtInTemplates = ConcurrentHashMap<String, TemplateDescriptor>()
private val m_valueFieldTypes = listOf<String>(java.lang.Long::class.java.name, java.lang.String::class.java.name)
init {
registerFormFieldTemplate(IScoutRuntimeTypes.IStringField, TemplateDescriptor("templates.StringField")
.withName(message("template.StringField"))
.withAliasName(message("template.TextField"))
.withSuperClassInfo(IScoutRuntimeTypes.IStringField, IScoutRuntimeTypes.AbstractStringField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyString")
.withVariable("max", "128"))
registerFormFieldTemplate(IScoutRuntimeTypes.IBigDecimalField, TemplateDescriptor("templates.BigDecimalField")
.withName(message("template.BigDecimalField"))
.withAliasNames(message("template.NumberField"), message("template.DoubleField"), message("template.FloatField"))
.withSuperClassInfo(IScoutRuntimeTypes.IBigDecimalField, IScoutRuntimeTypes.AbstractBigDecimalField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyBigDecimal")
.withVariable("min", "-999999999999999999")
.withVariable("max", "999999999999999999"))
registerFormFieldTemplate(IScoutRuntimeTypes.IBooleanField, TemplateDescriptor("templates.BooleanField")
.withName(message("template.BooleanField"))
.withAliasNames(message("template.CheckboxField"), message("template.TristateField"))
.withSuperClassInfo(IScoutRuntimeTypes.IBooleanField, IScoutRuntimeTypes.AbstractBooleanField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyBoolean"))
registerFormFieldTemplate(IScoutRuntimeTypes.IButton, TemplateDescriptor("templates.Button")
.withName(message("template.Button"))
.withSuperClassInfo(IScoutRuntimeTypes.IButton, IScoutRuntimeTypes.AbstractButton)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "My"))
registerFormFieldTemplate(IScoutRuntimeTypes.ICalendarField, TemplateDescriptor("templates.CalendarField")
.withName(message("template.CalendarField"))
.withSuperClassInfo(IScoutRuntimeTypes.ICalendarField, IScoutRuntimeTypes.AbstractCalendarField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyCalendar")
.withVariable("boolLabelVisible", "false"))
registerFormFieldTemplate(IScoutRuntimeTypes.IDateField, TemplateDescriptor("templates.DateField")
.withName(message("template.DateField"))
.withAliasNames(message("template.DateTimeField"), message("template.TimeField"))
.withSuperClassInfo(IScoutRuntimeTypes.IDateField, IScoutRuntimeTypes.AbstractDateField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyDate"))
registerFormFieldTemplate(IScoutRuntimeTypes.IFileChooserField, TemplateDescriptor("templates.FileChooserField")
.withName(message("template.FileChooserField"))
.withSuperClassInfo(IScoutRuntimeTypes.IFileChooserField, IScoutRuntimeTypes.AbstractFileChooserField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyFileChooser"))
registerFormFieldTemplate(IScoutRuntimeTypes.IGroupBox, TemplateDescriptor("templates.GroupBox")
.withName(message("template.GroupBox"))
.withSuperClassInfo(IScoutRuntimeTypes.IGroupBox, IScoutRuntimeTypes.AbstractGroupBox)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyGroup"))
registerFormFieldTemplate(IScoutRuntimeTypes.IHtmlField, TemplateDescriptor("templates.HtmlField")
.withName(message("template.HtmlField"))
.withSuperClassInfo(IScoutRuntimeTypes.IHtmlField, IScoutRuntimeTypes.AbstractHtmlField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyHtml"))
registerFormFieldTemplate(IScoutRuntimeTypes.ILabelField, TemplateDescriptor("templates.LabelField")
.withName(message("template.LabelField"))
.withSuperClassInfo(IScoutRuntimeTypes.ILabelField, IScoutRuntimeTypes.AbstractLabelField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyLabel"))
registerFormFieldTemplate(IScoutRuntimeTypes.IListBox, TemplateDescriptor("templates.ListBox")
.withName(message("template.ListBox"))
.withSuperClassInfo(IScoutRuntimeTypes.IListBox, IScoutRuntimeTypes.AbstractListBox)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyList")
.withVariable(VALUE_FIELD_TYPE_VARIABLE_NAME, valueFieldTypes()))
registerFormFieldTemplate(IScoutRuntimeTypes.IProposalField, TemplateDescriptor("templates.ProposalField")
.withName(message("template.ProposalField"))
.withSuperClassInfo(IScoutRuntimeTypes.IProposalField, IScoutRuntimeTypes.AbstractProposalField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyProposal")
.withVariable(VALUE_FIELD_TYPE_VARIABLE_NAME, valueFieldTypes()))
registerFormFieldTemplate(IScoutRuntimeTypes.ISmartField, TemplateDescriptor("templates.SmartField")
.withName(message("template.SmartField"))
.withAliasNames(message("template.ComboBox"))
.withSuperClassInfo(IScoutRuntimeTypes.ISmartField, IScoutRuntimeTypes.AbstractSmartField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MySmart")
.withVariable(VALUE_FIELD_TYPE_VARIABLE_NAME, valueFieldTypes()))
registerFormFieldTemplate(IScoutRuntimeTypes.ILongField, TemplateDescriptor("templates.LongField")
.withName(message("template.LongField"))
.withAliasNames(message("template.NumberField"), message("template.IntegerField"))
.withSuperClassInfo(IScoutRuntimeTypes.ILongField, IScoutRuntimeTypes.AbstractLongField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyLong")
.withVariable("min", "-999999999999")
.withVariable("max", "999999999999"))
registerFormFieldTemplate(IScoutRuntimeTypes.IRadioButtonGroup, TemplateDescriptor("templates.RadioButtonGroup")
.withName(message("template.RadioButtonGroup"))
.withSuperClassInfo(IScoutRuntimeTypes.IRadioButtonGroup, IScoutRuntimeTypes.AbstractRadioButtonGroup)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyRadioButton")
.withVariable(VALUE_FIELD_TYPE_VARIABLE_NAME, valueFieldTypes()))
registerFormFieldTemplate(IScoutRuntimeTypes.ISequenceBox, TemplateDescriptor("templates.SequenceBox")
.withName(message("template.SequenceBox"))
.withSuperClassInfo(IScoutRuntimeTypes.ISequenceBox, IScoutRuntimeTypes.AbstractSequenceBox)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MySequence")
.withVariable("boolAutoCheckFromTo", "false"))
registerFormFieldTemplate(IScoutRuntimeTypes.ITabBox, TemplateDescriptor("templates.TabBox")
.withName(message("template.TabBox"))
.withSuperClassInfo(IScoutRuntimeTypes.ITabBox, IScoutRuntimeTypes.AbstractTabBox)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyTab"))
registerFormFieldTemplate(IScoutRuntimeTypes.ITableField, TemplateDescriptor("templates.TableField")
.withName(message("template.TableField"))
.withSuperClassInfo(IScoutRuntimeTypes.ITableField, IScoutRuntimeTypes.AbstractTableField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyTable"))
registerFormFieldTemplate(IScoutRuntimeTypes.ITreeField, TemplateDescriptor("templates.TreeField")
.withName(message("template.TreeField"))
.withSuperClassInfo(IScoutRuntimeTypes.ITreeField, IScoutRuntimeTypes.AbstractTreeField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyTree"))
registerFormFieldTemplate(IScoutRuntimeTypes.IRadioButton, TemplateDescriptor("templates.RadioButton")
.withName(message("template.RadioButton"))
.withSuperClassInfo(IScoutRuntimeTypes.IRadioButton, IScoutRuntimeTypes.AbstractRadioButton)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyRadio"))
registerFormFieldTemplate(IScoutRuntimeTypes.IImageField, TemplateDescriptor("templates.ImageField")
.withName(message("template.ImageField"))
.withSuperClassInfo(IScoutRuntimeTypes.IImageField, IScoutRuntimeTypes.AbstractImageField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyImage")
.withVariable("width", "2")
.withVariable("boolAutoFit", "true")
.withVariable("boolLabelVisible", "false"))
registerFormFieldTemplate(IScoutRuntimeTypes.IFileChooserButton, TemplateDescriptor("templates.FileChooserButton")
.withName(message("template.FileChooserButton"))
.withSuperClassInfo(IScoutRuntimeTypes.IFileChooserButton, IScoutRuntimeTypes.AbstractFileChooserButton)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyFileChooser"))
registerFormFieldTemplate(IScoutRuntimeTypes.ITagField, TemplateDescriptor("templates.TagField")
.withName(message("template.TagField"))
.withSuperClassInfo(IScoutRuntimeTypes.ITagField, IScoutRuntimeTypes.AbstractTagField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyTag"))
registerFormFieldTemplate(IScoutRuntimeTypes.IModeSelectorField, TemplateDescriptor("templates.ModeSelectorField")
.withName(message("template.ModeSelectorField"))
.withSuperClassInfo(IScoutRuntimeTypes.IModeSelectorField, IScoutRuntimeTypes.AbstractModeSelectorField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyModeSelector")
.withVariable("width", "2")
.withVariable(VALUE_FIELD_TYPE_VARIABLE_NAME, valueFieldTypes()))
registerFormFieldTemplate(IScoutRuntimeTypes.IBrowserField, TemplateDescriptor("templates.BrowserField")
.withName(message("template.BrowserField"))
.withSuperClassInfo(IScoutRuntimeTypes.IBrowserField, IScoutRuntimeTypes.AbstractBrowserField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyBrowser")
.withVariable("width", "2")
.withVariable("height", "6")
.withVariable("boolLabelVisible", "false")
.withVariable("boolScrollBarEnabled", "true"))
registerFormFieldTemplate(IScoutRuntimeTypes.ITileField, TemplateDescriptor("templates.TileField")
.withName(message("template.TileField"))
.withSuperClassInfo(IScoutRuntimeTypes.ITileField, IScoutRuntimeTypes.AbstractTileField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyTile"))
registerFormFieldTemplate(IScoutRuntimeTypes.IAccordionField, TemplateDescriptor("templates.AccordionField")
.withName(message("template.AccordionField"))
.withSuperClassInfo(IScoutRuntimeTypes.IAccordionField, IScoutRuntimeTypes.AbstractAccordionField)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "MyAccordion")
.withVariable("boolLabelVisible", "false"))
registerTemplate(IScoutRuntimeTypes.IMenu, TemplateDescriptor("templates.Menu")
.withName(message("template.Menu"))
.withOrderDefinitionType(IScoutRuntimeTypes.IMenu)
.withSuperClassInfo(IScoutRuntimeTypes.IMenu, IScoutRuntimeTypes.AbstractMenu)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "My")
.withVariable(TemplateDescriptor.VARIABLE_PREFIX_NLS, "MyMenuName"))
registerTemplate(IScoutRuntimeTypes.IKeyStroke, TemplateDescriptor("templates.KeyStroke")
.withName(message("template.KeyStroke"))
.withOrderDefinitionType(IScoutRuntimeTypes.IKeyStroke)
.withSuperClassInfo(IScoutRuntimeTypes.IKeyStroke, IScoutRuntimeTypes.AbstractKeyStroke)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "My"))
registerTemplate(IScoutRuntimeTypes.ICode, TemplateDescriptor("templates.Code")
.withName(message("template.Code"))
.withOrderDefinitionType(IScoutRuntimeTypes.ICode)
.withSuperClassInfo(IScoutRuntimeTypes.ICode, IScoutRuntimeTypes.AbstractCode)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "My")
.withVariable(TemplateDescriptor.VARIABLE_PREFIX_NLS, "MyCodeName"))
registerTemplate(IScoutRuntimeTypes.IFormHandler, TemplateDescriptor("templates.FormHandler")
.withName(message("template.FormHandler"))
.withSuperClassInfo(IScoutRuntimeTypes.IFormHandler, IScoutRuntimeTypes.AbstractFormHandler)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "My"))
registerTemplate(IScoutRuntimeTypes.IColumn, TemplateDescriptor("templates.Column")
.withName(message("template.Column"))
.withInnerTypeGetterContainer(IScoutRuntimeTypes.ITable, "getColumnSet().getColumnByClass")
.withOrderDefinitionType(IScoutRuntimeTypes.IColumn)
.withSuperClassInfo(IScoutRuntimeTypes.IColumn, IScoutRuntimeTypes.AbstractStringColumn)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "My")
.withVariable(TemplateDescriptor.VARIABLE_PREFIX_NLS, "MyColumnName")
.withVariable("width", "100"))
registerTemplate(IScoutRuntimeTypes.IExtension, TemplateDescriptor("templates.Extension")
.withName(message("template.Extension"))
.withSuperClassInfo(IScoutRuntimeTypes.IExtension, IScoutRuntimeTypes.AbstractStringColumn)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "My"))
registerTemplate(IScoutRuntimeTypes.ITile, TemplateDescriptor("templates.Tile")
.withName(message("template.Tile"))
.withOrderDefinitionType(IScoutRuntimeTypes.ITile)
.withSuperClassInfo(IScoutRuntimeTypes.ITile, IScoutRuntimeTypes.AbstractTile)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "My"))
registerTemplate(IScoutRuntimeTypes.IGroup, TemplateDescriptor("templates.Group")
.withName(message("template.Group"))
.withOrderDefinitionType(IScoutRuntimeTypes.IGroup)
.withSuperClassInfo(IScoutRuntimeTypes.IGroup, IScoutRuntimeTypes.AbstractGroup)
.withVariable(TemplateDescriptor.VARIABLE_NAME, "My"))
registerTemplateProvider { m_builtInTemplates }
}
private fun registerFormFieldTemplate(definitionInterface: String, descriptor: TemplateDescriptor) =
registerTemplate(definitionInterface, descriptor
.withInnerTypeGetterContainer(IScoutRuntimeTypes.IForm, "getFieldByClass")
.withOrderDefinitionType(IScoutRuntimeTypes.IFormField)
.withVariable(TemplateDescriptor.VARIABLE_PREFIX_NLS, "MyNlsKey"))
private fun registerTemplate(definitionInterface: String, descriptor: TemplateDescriptor) = m_builtInTemplates.put(definitionInterface, descriptor)
private fun isTemplateValidFor(definitionInterface: String, possibleChildrenIfcFqn: Set<String>) = possibleChildrenIfcFqn.any { ScoutModelHierarchy.isSubtypeOf(definitionInterface, it) }
private fun valueFieldTypes() = m_valueFieldTypes
/**
* Replace the template provider with a custom instance. The provider will be used by [templatesFor].
* @param newProvider the new provider
* @see [templateProvider]
*/
fun registerTemplateProvider(newProvider: (PsiClass) -> Map<String, TemplateDescriptor>) = apply { m_templateProvider = newProvider }
/**
* @return The active template provider.
* The [Map] returned by a provider contains the fully qualified class name defining the template as key (e.g. ICode for a template creating Scout Codes).
* The value contains the [TemplateDescriptor] used to create the lookup element and to create the source if selected.
*/
fun templateProvider() = m_templateProvider
/**
* Invokes the active [templateProvider] and returns all [TemplateDescriptor] instances matching the given [declaringClass].
* @param declaringClass The [PsiClass] in which the templates will be created.
* @return All templates from the [templateProvider] that may be created within the [declaringClass].
*/
fun templatesFor(declaringClass: PsiClass): List<TemplateDescriptor> {
val allSuperTypes = InheritanceUtil.getSuperClasses(declaringClass).map { it.qualifiedName }
val possibleChildrenIfcFqn: Set<String> = ScoutModelHierarchy.getPossibleChildren(allSuperTypes)
if (possibleChildrenIfcFqn.isEmpty()) return emptyList()
return templateProvider().invoke(declaringClass)
.filter { isTemplateValidFor(it.key, possibleChildrenIfcFqn) }
.map { it.value }
}
}