| /* |
| * 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'> </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 |
| } |