blob: fbd657513d6f19a3d575ff8c530817c0aa2e3f10 [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.nls.doc
import com.intellij.lang.documentation.AbstractDocumentationProvider
import com.intellij.lang.documentation.DocumentationMarkup
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import org.eclipse.scout.sdk.core.s.nls.ITranslationEntry
import org.eclipse.scout.sdk.core.util.Strings.escapeHtml
import org.eclipse.scout.sdk.s2i.containingModule
import org.eclipse.scout.sdk.s2i.nls.TranslationStoreStackLoader.Companion.createStack
abstract class AbstractNlsDocumentationProvider : AbstractDocumentationProvider() {
override fun getCustomDocumentationElement(editor: Editor, file: PsiFile, contextElement: PsiElement?): PsiElement? {
if (accept(contextElement)) {
return contextElement
}
return null
}
override fun generateDoc(element: PsiElement?, originalElement: PsiElement?): String? {
if (element == null || !accept(element)) {
return null
}
val translation = findTranslationFor(element) ?: return null
return generateDoc(translation)
}
private fun findTranslationFor(element: PsiElement): ITranslationEntry? {
val module = element.containingModule() ?: return null
val stack = createStack(module) ?: return null
val key = psiElementToKey(element) ?: return null
return stack.translation(key).orElse(null)
}
protected abstract fun psiElementToKey(element: PsiElement): String?
private fun generateDoc(translation: ITranslationEntry): String {
val doc = StringBuilder()
.append(DocumentationMarkup.CONTENT_START)
.append(escapeHtml("'${translation.key()}' defined in '${translation.store().service().type().elementName()}'"))
.append(DocumentationMarkup.CONTENT_END)
.append("<font size='1'>&nbsp;</font>")
.append(DocumentationMarkup.SECTIONS_START)
translation.texts().entries.forEach {
doc.append(DocumentationMarkup.SECTION_HEADER_START).append(escapeHtml(it.key.displayName() + ":")).append("</p>")
.append(DocumentationMarkup.SECTION_SEPARATOR).append(escapeHtml(it.value.trim())).append(DocumentationMarkup.SECTION_END).append("</tr>")
}
doc.append(DocumentationMarkup.SECTIONS_END)
return doc.toString()
}
protected abstract fun accept(element: PsiElement?): Boolean
}