From 8931e85658b69e4b60a2079996be4aad859bb9d3 Mon Sep 17 00:00:00 2001 From: JFronny Date: Sat, 4 May 2024 13:09:22 +0200 Subject: [PATCH] feat: scaffold --- .gitignore | 42 ++++++++++++ .idea/.gitignore | 10 +++ .idea/gradle.xml | 18 +++++ .idea/kotlinc.xml | 6 ++ .idea/misc.xml | 25 +++++++ .idea/vcs.xml | 12 ++++ .run/Run IDE with Plugin.run.xml | 24 +++++++ README.md | 8 +++ build.gradle.kts | 52 +++++++++++++++ gradle.properties | 6 ++ settings.gradle.kts | 8 +++ .../io/gitlab/jfronny/sdom/SDCredentials.kt | 30 +++++++++ .../io/gitlab/jfronny/sdom/SDSettings.kt | 11 ++++ .../kotlin/io/gitlab/jfronny/sdom/SDom.kt | 66 +++++++++++++++++++ .../jfronny/sdom/actions/SDLoginAction.kt | 30 +++++++++ .../jfronny/sdom/actions/SDLogoutAction.kt | 16 +++++ .../jfronny/sdom/model/SDLoginResult.kt | 23 +++++++ .../jfronny/sdom/toolwindow/SDToolWindow.kt | 36 ++++++++++ .../sdom/toolwindow/SDToolWindowFactory.kt | 44 +++++++++++++ .../gitlab/jfronny/sdom/ui/SDActionToolBar.kt | 25 +++++++ .../jfronny/sdom/ui/SDLoginDialogWrapper.kt | 35 ++++++++++ .../gitlab/jfronny/sdom/ui/SDResultPanel.kt | 24 +++++++ .../gitlab/jfronny/sdom/ui/SDSubmitPanel.kt | 17 +++++ .../jfronny/sdom/ui/SDToolWindowPanel.kt | 21 ++++++ src/main/resources/META-INF/plugin.xml | 32 +++++++++ src/main/resources/META-INF/pluginIcon.svg | 12 ++++ 26 files changed, 633 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/gradle.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 .run/Run IDE with Plugin.run.xml create mode 100644 README.md create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 settings.gradle.kts create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/SDCredentials.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/SDSettings.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/SDom.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDLoginAction.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDLogoutAction.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/model/SDLoginResult.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/toolwindow/SDToolWindow.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/toolwindow/SDToolWindowFactory.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDActionToolBar.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDLoginDialogWrapper.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDResultPanel.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDSubmitPanel.kt create mode 100644 src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDToolWindowPanel.kt create mode 100644 src/main/resources/META-INF/plugin.xml create mode 100644 src/main/resources/META-INF/pluginIcon.svg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..44ea16f --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +/checkstyle-idea.xml +/git_toolbox_prj.xml \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..b53f857 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..8d81632 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..7852957 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + Checkstyle + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..4c6280e --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.run/Run IDE with Plugin.run.xml b/.run/Run IDE with Plugin.run.xml new file mode 100644 index 0000000..7747a29 --- /dev/null +++ b/.run/Run IDE with Plugin.run.xml @@ -0,0 +1,24 @@ + + + + + + + + true + true + false + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..c83d426 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# S-DOM + + +## References +- [DOMjudge](https://www.domjudge.org/documentation) +- [DOMjudge API](https://www.domjudge.org/demoweb/api/doc) +- [SimpleCodeTester plugin](https://github.com/Mr-Pine/SimpleCodeTester-IntelliJ-Plugin) +- [Example Route](https://domjudge.iti.kit.edu/main/api/v4/contests/5/problems) \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..567bb6f --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,52 @@ +plugins { + id("java") + id("org.jetbrains.kotlin.jvm") version "1.9.22" + id("org.jetbrains.intellij") version "1.17.2" + kotlin("plugin.serialization") version "1.9.22" +} + +group = "io.gitlab.jfronny" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} + +// Configure Gradle IntelliJ Plugin +// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html +intellij { + version.set("2023.2.5") + type.set("IC") // Target IDE Platform + + plugins.set(listOf(/* Plugin Dependencies */)) +} + +dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") +} + +tasks { + // Set the JVM compatibility versions + withType { + sourceCompatibility = "17" + targetCompatibility = "17" + } + withType { + kotlinOptions.jvmTarget = "17" + } + + patchPluginXml { + sinceBuild.set("232") + untilBuild.set("242.*") + } + + signPlugin { + certificateChain.set(System.getenv("CERTIFICATE_CHAIN")) + privateKey.set(System.getenv("PRIVATE_KEY")) + password.set(System.getenv("PRIVATE_KEY_PASSWORD")) + } + + publishPlugin { + token.set(System.getenv("PUBLISH_TOKEN")) + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..24630b3 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,6 @@ +# Opt-out flag for bundling Kotlin standard library -> https://jb.gg/intellij-platform-kotlin-stdlib +kotlin.stdlib.default.dependency=false +# Enable Gradle Configuration Cache -> https://docs.gradle.org/current/userguide/configuration_cache.html +org.gradle.configuration-cache=true +# Enable Gradle Build Cache -> https://docs.gradle.org/current/userguide/build_cache.html +org.gradle.caching=true diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..77735ed --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,8 @@ +pluginManagement { + repositories { + mavenCentral() + gradlePluginPortal() + } +} + +rootProject.name = "s-dom" \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/SDCredentials.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/SDCredentials.kt new file mode 100644 index 0000000..111080b --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/SDCredentials.kt @@ -0,0 +1,30 @@ +package io.gitlab.jfronny.sdom + +import com.intellij.credentialStore.CredentialAttributes +import com.intellij.credentialStore.Credentials +import com.intellij.credentialStore.generateServiceName +import com.intellij.ide.passwordSafe.PasswordSafe +import com.intellij.openapi.application.ApplicationManager + +object SDCredentials { + private fun createCredentialAttributes(): CredentialAttributes { + return CredentialAttributes(generateServiceName("s-dom", "httpAuth")) + } + + var credentials: Pair + get() = PasswordSafe.instance.get(createCredentialAttributes()) + .run { this?.userName to this?.getPasswordAsString() } + set(value) { + PasswordSafe.instance[createCredentialAttributes()] = Credentials(value.first, value.second) + } + + fun logOut() { + PasswordSafe.instance.set(createCredentialAttributes(), null) + } + + var url: String + get() = ApplicationManager.getApplication().getService(SDSettings::class.java).state.url ?: "https://domjudge.iti.kit.edu/main/api" + set(value) { + ApplicationManager.getApplication().getService(SDSettings::class.java).state.url = value + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/SDSettings.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/SDSettings.kt new file mode 100644 index 0000000..f0c7813 --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/SDSettings.kt @@ -0,0 +1,11 @@ +package io.gitlab.jfronny.sdom + +import com.intellij.openapi.components.* + +@Service +@State(name = "S-DOM", storages = [Storage("s-dom.xml")]) +class SDSettings : SimplePersistentStateComponent(SDState()) { + class SDState : BaseState() { + var url by string("https://domjudge.iti.kit.edu/main/api") + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/SDom.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/SDom.kt new file mode 100644 index 0000000..b46628b --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/SDom.kt @@ -0,0 +1,66 @@ +package io.gitlab.jfronny.sdom + +import com.intellij.ide.util.PropertiesComponent +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.diagnostic.LogLevel +import com.intellij.openapi.diagnostic.Logger +import io.gitlab.jfronny.sdom.model.SDLoginResult +import io.ktor.client.* +import io.ktor.client.call.* +import io.ktor.client.engine.cio.* +import io.ktor.client.plugins.auth.* +import io.ktor.client.plugins.auth.providers.* +import io.ktor.client.plugins.contentnegotiation.* +import io.ktor.client.request.* +import io.ktor.http.* +import io.ktor.serialization.kotlinx.json.* +import kotlinx.serialization.json.Json + +object SDom { + private val logger = Logger.getInstance(SDom.javaClass).apply { setLevel(LogLevel.DEBUG) } + private var propertiesComponent: PropertiesComponent? = null + + private val client = HttpClient(CIO) { + install(ContentNegotiation) { + json(Json { + ignoreUnknownKeys = true + }) + } + install(Auth) { + basic { + credentials { + BasicAuthCredentials(SDCredentials.credentials.first ?: "", SDCredentials.credentials.second ?: "") + } + } + } + } + + private val loginListeners: MutableList<() -> Unit> = mutableListOf() //TODO add listener for refreshing tasks + private val logoutListeners: MutableList<() -> Unit> = mutableListOf() + + fun registerLoginListener(listener: () -> Unit) { + loginListeners.add(listener) + } + + fun registerLogoutListener(listener: () -> Unit) { + logoutListeners.add(listener) + } + + suspend fun login(username: String, password: String, url: String) { + val fixedApi = url.trimEnd('/') + "/v4/" + val result: SDLoginResult = client.get(url = Url(fixedApi + "user")).body() + if (!result.enabled) throw Exception("User is not enabled") + SDCredentials.credentials = Pair(username, password) + SDCredentials.url = fixedApi + + loginListeners.forEach { ApplicationManager.getApplication().invokeLater(it) } + logger.debug("Logged in as $username") + } + + fun logout() { + SDCredentials.logOut() + logoutListeners.forEach { ApplicationManager.getApplication().invokeLater(it) } + } + val loggedIn: Boolean + get() = SDCredentials.credentials.first != null && SDCredentials.credentials.second != null +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDLoginAction.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDLoginAction.kt new file mode 100644 index 0000000..6dbb739 --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDLoginAction.kt @@ -0,0 +1,30 @@ +package io.gitlab.jfronny.sdom.actions + +import com.intellij.notification.Notification +import com.intellij.notification.NotificationAction +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnActionEvent +import io.gitlab.jfronny.sdom.SDom +import io.gitlab.jfronny.sdom.ui.SDLoginDialogWrapper +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch + +class SDLoginAction(text: String) : NotificationAction(text) { + override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT + + constructor() : this("") + + override fun actionPerformed(e: AnActionEvent, notification: Notification) = actionPerformed(e) + + override fun actionPerformed(e: AnActionEvent) { + val dialogWrapper = SDLoginDialogWrapper() + + if (dialogWrapper.showAndGet()) { + CoroutineScope(Job() + Dispatchers.IO).launch { + SDom.login(username = dialogWrapper.username, password = dialogWrapper.password, url = dialogWrapper.url) + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDLogoutAction.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDLogoutAction.kt new file mode 100644 index 0000000..b5dc10a --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/actions/SDLogoutAction.kt @@ -0,0 +1,16 @@ +package io.gitlab.jfronny.sdom.actions + +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.DumbAwareAction +import io.gitlab.jfronny.sdom.SDom + +class SDLogoutAction : DumbAwareAction() { + override fun actionPerformed(e: AnActionEvent) = SDom.logout() + + override fun update(e: AnActionEvent) { + e.presentation.isVisible = SDom.loggedIn + } + + override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/model/SDLoginResult.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/model/SDLoginResult.kt new file mode 100644 index 0000000..43d50ac --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/model/SDLoginResult.kt @@ -0,0 +1,23 @@ +package io.gitlab.jfronny.sdom.model + +import kotlinx.datetime.LocalDateTime +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SDLoginResult( + @SerialName("last_login_time") val lastLoginTime: LocalDateTime, + @SerialName("last_api_login_time") val lastApiLoginTime: LocalDateTime, + @SerialName("first_login_time") val firstLoginTime: LocalDateTime, + val team: String, + @SerialName("team_id") val teamId: Int, + val roles: List, + val type: String, + val id: String, + val username: String, + val name: String, + val email: String, + @SerialName("last_ip") val lastIp: String, + val ip: String, + val enabled: Boolean +) diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/toolwindow/SDToolWindow.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/toolwindow/SDToolWindow.kt new file mode 100644 index 0000000..12d5650 --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/toolwindow/SDToolWindow.kt @@ -0,0 +1,36 @@ +package io.gitlab.jfronny.sdom.toolwindow + +import com.intellij.openapi.actionSystem.ActionManager +import com.intellij.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.DataContext +import com.intellij.openapi.actionSystem.Presentation +import com.intellij.openapi.ui.DialogPanel +import com.intellij.ui.dsl.builder.Align +import com.intellij.ui.dsl.builder.AlignY +import com.intellij.ui.dsl.builder.panel +import io.gitlab.jfronny.sdom.actions.SDLoginAction + +fun SDToolWindow(): DialogPanel = panel { + row { + panel { + row { + label("You are not logged in. Please log in to use this tool.").align(Align.CENTER) + } + row { + button("Log In") { + SDLoginAction().actionPerformed( + AnActionEvent( + null, + DataContext.EMPTY_CONTEXT, + ActionPlaces.UNKNOWN, + Presentation(), + ActionManager.getInstance(), + 0 + ) + ) + }.align(Align.CENTER) + } + }.resizableColumn().align(AlignY.CENTER) + }.resizableRow() +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/toolwindow/SDToolWindowFactory.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/toolwindow/SDToolWindowFactory.kt new file mode 100644 index 0000000..7effa93 --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/toolwindow/SDToolWindowFactory.kt @@ -0,0 +1,44 @@ +package io.gitlab.jfronny.sdom.toolwindow + +import com.intellij.openapi.project.DumbAware +import com.intellij.openapi.project.Project +import com.intellij.openapi.wm.ToolWindow +import com.intellij.openapi.wm.ToolWindowFactory +import io.gitlab.jfronny.sdom.SDom +import io.gitlab.jfronny.sdom.ui.SDSubmitPanel + +class SDToolWindowFactory : ToolWindowFactory, DumbAware { + override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { + val contentManager = toolWindow.contentManager + val loggedOutContent = contentManager.factory.createContent(loggedOutDialogPanel(), null, false).apply { + isCloseable = false + } + val submitContent = contentManager.factory.createContent(SDSubmitPanel(), "Submit", false).apply { + isCloseable = false + } + + fun showSubmitContent() { + contentManager.addContent(submitContent) + contentManager.removeContent(loggedOutContent, true) + } + + fun showLoggedOutContent() { + contentManager.removeContent(submitContent, true) + contentManager.addContent(loggedOutContent) + } + + fun showResultContent() { + // TODO + } + + SDom.registerLoginListener(::showSubmitContent) + SDom.registerLogoutListener(::showLoggedOutContent) + SDom.registerResultFlowListener(::showResultContent) + + if (SDom.loggedIn) { + showSubmitContent() + } else { + contentManager.addContent(loggedOutContent) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDActionToolBar.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDActionToolBar.kt new file mode 100644 index 0000000..1f4a6eb --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDActionToolBar.kt @@ -0,0 +1,25 @@ +package io.gitlab.jfronny.sdom.ui + +import com.intellij.openapi.actionSystem.ActionGroup +import com.intellij.openapi.actionSystem.ActionManager +import org.jetbrains.annotations.NonNls +import javax.swing.Box +import javax.swing.JComponent + +class SDActionToolBar(orientation: ToolBarOrientation, place: @NonNls String = "???") { + private val actionGroup = ActionManager.getInstance() + .getAction("io.gitlab.jfronny.sdom.actions.SDToolbarActions") as ActionGroup + + private val toolbar = ActionManager.getInstance().createActionToolbar(place, actionGroup, orientation.value) + + fun setTargetComponent(component: JComponent) { + toolbar.targetComponent = component + } + + val component: Box + get() = Box.createHorizontalBox().apply { add(toolbar.component) } +} + +enum class ToolBarOrientation(val value: Boolean) { + HORIZONTAL(true), VERTICAL(false) +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDLoginDialogWrapper.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDLoginDialogWrapper.kt new file mode 100644 index 0000000..d2f98cb --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDLoginDialogWrapper.kt @@ -0,0 +1,35 @@ +package io.gitlab.jfronny.sdom.ui + +import com.intellij.openapi.ui.DialogWrapper +import com.intellij.ui.dsl.builder.AlignX +import com.intellij.ui.dsl.builder.bindText +import com.intellij.ui.dsl.builder.panel +import io.gitlab.jfronny.sdom.SDCredentials +import javax.swing.JComponent + +class SDLoginDialogWrapper : DialogWrapper(true) { + var username = "" + var password = "" + var url = "" + + init { + title = "Log in to DOMjudge" + url = SDCredentials.url + init() + } + + override fun createCenterPanel(): JComponent = panel { + row { + label("Username") + textField().align(AlignX.FILL).bindText(this@SDLoginDialogWrapper::username) + } + row { + label("Password") + passwordField().align(AlignX.FILL).bindText(this@SDLoginDialogWrapper::password) + } + row { + label("API URL") + textField().align(AlignX.FILL).bindText(this@SDLoginDialogWrapper::url) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDResultPanel.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDResultPanel.kt new file mode 100644 index 0000000..a2e3927 --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDResultPanel.kt @@ -0,0 +1,24 @@ +package io.gitlab.jfronny.sdom.ui + +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.ComponentContainer +import io.gitlab.jfronny.sdom.model.SDResult +import kotlinx.coroutines.flow.Flow +import javax.swing.JComponent + +class SDResultPanel( + val project: Project, + resultFlow: Flow> +) : ComponentContainer { + override fun dispose() { + TODO("Not yet implemented") + } + + override fun getComponent(): JComponent { + TODO("Not yet implemented") + } + + override fun getPreferredFocusableComponent(): JComponent { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDSubmitPanel.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDSubmitPanel.kt new file mode 100644 index 0000000..9671220 --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDSubmitPanel.kt @@ -0,0 +1,17 @@ +package io.gitlab.jfronny.sdom.ui + +import com.intellij.ui.components.JBLabel +import java.awt.BorderLayout +import javax.swing.JPanel + +class SDSubmitPanel : JPanel(BorderLayout()) { + init { + val label = JBLabel("Nothing to see here (yet)") + val toolWindowPanel = SDToolWindowPanel( + topComponent = SDActionToolBar(ToolBarOrientation.HORIZONTAL).apply { setTargetComponent(label) }.component, + mainComponent = label + ) + add(toolWindowPanel.getPanel()) + isVisible = true + } +} \ No newline at end of file diff --git a/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDToolWindowPanel.kt b/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDToolWindowPanel.kt new file mode 100644 index 0000000..9084d3a --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/sdom/ui/SDToolWindowPanel.kt @@ -0,0 +1,21 @@ +package io.gitlab.jfronny.sdom.ui + +import com.intellij.util.ui.components.BorderLayoutPanel +import java.awt.BorderLayout +import javax.swing.JComponent + +class SDToolWindowPanel( + private val topComponent: JComponent? = null, + private val leftComplement: JComponent? = null, + private val mainComponent: JComponent? = null, + private val rightComplement: JComponent? = null +) { + private val basePanel = BorderLayoutPanel(1, 1).apply { + mainComponent?.let { add(it, BorderLayout.CENTER) } + topComponent?.let { add(it, BorderLayout.NORTH) } + leftComplement?.let { add(it, BorderLayout.WEST) } + rightComplement?.let { add(it, BorderLayout.EAST) } + } + + fun getPanel() = basePanel +} \ No newline at end of file diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml new file mode 100644 index 0000000..33f540c --- /dev/null +++ b/src/main/resources/META-INF/plugin.xml @@ -0,0 +1,32 @@ + + + + io.gitlab.jfronny.s-dom + + + S-dom + + + JFronny + + + + Intended mostly for use in the context of the KITs "Basispraktikum zum ICPC-Programmierwettbewerb" course.
+ ]]>
+ + + com.intellij.modules.platform + + + + + + +
\ No newline at end of file diff --git a/src/main/resources/META-INF/pluginIcon.svg b/src/main/resources/META-INF/pluginIcon.svg new file mode 100644 index 0000000..dcf6b99 --- /dev/null +++ b/src/main/resources/META-INF/pluginIcon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file