Skip to content

Commit e2857cd

Browse files
committed
Implement gateway connection panel
- the one that will be opened (or minimized in the tray) when a session is opened.
1 parent b237a67 commit e2857cd

File tree

4 files changed

+105
-4
lines changed

4 files changed

+105
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,50 @@
11
package com.coder.gateway
22

3+
import com.coder.gateway.views.CoderGatewayConnectionComponent
34
import com.jetbrains.gateway.api.ConnectionRequestor
45
import com.jetbrains.gateway.api.GatewayConnectionHandle
56
import com.jetbrains.gateway.api.GatewayConnectionProvider
7+
import com.jetbrains.rd.util.lifetime.LifetimeDefinition
8+
import java.util.logging.Logger
9+
import javax.swing.JComponent
610

7-
class CoderGatewayConnectionProvider: GatewayConnectionProvider {
11+
class CoderGatewayConnectionProvider : GatewayConnectionProvider {
12+
private val connections = mutableSetOf<CoderConnectionMetadata>()
813
override suspend fun connect(parameters: Map<String, String>, requestor: ConnectionRequestor): GatewayConnectionHandle? {
9-
TODO("Not yet implemented")
14+
val coderUrl = parameters["coder_url"]
15+
val workspaceId = parameters["workspace_id"]
16+
17+
if (coderUrl != null && workspaceId != null) {
18+
val connection = CoderConnectionMetadata(coderUrl, workspaceId)
19+
if (connection in connections) {
20+
logger.warning("There is already a connection started on ${connection.url} using the workspace ${connection.workspaceId}")
21+
return null
22+
}
23+
val clientLifetime = LifetimeDefinition()
24+
return object : GatewayConnectionHandle(clientLifetime) {
25+
override fun createComponent(): JComponent {
26+
return CoderGatewayConnectionComponent(clientLifetime, coderUrl, workspaceId)
27+
}
28+
29+
override fun getTitle(): String {
30+
return "Connection to Coder Workspaces"
31+
}
32+
33+
override fun hideToTrayOnStart(): Boolean {
34+
return false
35+
}
36+
}
37+
}
38+
return null
1039
}
1140

1241
override fun isApplicable(parameters: Map<String, String>): Boolean {
13-
TODO("Not yet implemented")
42+
return parameters["type"] == "coder"
1443
}
15-
}
44+
45+
companion object {
46+
val logger = Logger.getLogger(CoderGatewayConnectionProvider::class.java.simpleName)
47+
}
48+
}
49+
50+
internal data class CoderConnectionMetadata(val url: String, val workspaceId: String)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.coder.gateway.views
2+
3+
import com.intellij.openapi.util.Disposer
4+
import com.intellij.ui.IconManager
5+
import com.intellij.ui.components.JBLabel
6+
import com.intellij.ui.components.JBLoadingPanel
7+
import com.intellij.util.ui.components.BorderLayoutPanel
8+
import com.jetbrains.rd.util.lifetime.Lifetime
9+
import com.jetbrains.rd.util.lifetime.onTermination
10+
import java.awt.BorderLayout
11+
12+
class CoderGatewayConnectionComponent(val lifetime: Lifetime, val url: String, val workspaceId: String) : BorderLayoutPanel() {
13+
private val disposable = Disposer.newDisposable()
14+
private val contentPanel = BorderLayoutPanel().apply {
15+
add(JBLabel(IconManager.getInstance().getIcon("coder_logo_52.svg", CoderGatewayConnectionComponent::class.java)), "Center")
16+
}
17+
val loadingPanel = JBLoadingPanel(BorderLayout(), disposable).apply {
18+
startLoading()
19+
add(contentPanel, "Center")
20+
}
21+
22+
init {
23+
24+
lifetime.onTermination {
25+
Disposer.dispose(disposable)
26+
}
27+
}
28+
29+
var isLoading: Boolean
30+
get() = loadingPanel.isLoading
31+
set(value) = if (value) {
32+
loadingPanel.startLoading()
33+
} else {
34+
loadingPanel.stopLoading()
35+
}
36+
}

src/main/resources/coder_logo_52.svg

+15
Loading
+15
Loading

0 commit comments

Comments
 (0)