Skip to content

Commit 7bcf4c0

Browse files
committed
add node menu items
1 parent 87cc58d commit 7bcf4c0

File tree

6 files changed

+115
-191
lines changed

6 files changed

+115
-191
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.mussonindustrial.ignition.embr.periscope.icons
2+
3+
import com.inductiveautomation.ignition.designer.navtree.icon.InteractiveSvgIcon
4+
import com.mussonindustrial.ignition.embr.periscope.Meta
5+
6+
object PeriscopeIcons {
7+
private fun icon(name: String) = InteractiveSvgIcon(Meta::class.java, "images/svgicons/$name")
8+
9+
val tsx = icon("tsx.svg")
10+
val folderClosed = icon("folder-closed.svg")
11+
}

modules/periscope/designer/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/navtree/model/HiddenActionResourceNode.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.inductiveautomation.ignition.designer.model.DesignerContext
55
import com.inductiveautomation.ignition.designer.navtree.model.AbstractNavTreeNode
66
import com.inductiveautomation.ignition.designer.tabbedworkspace.ResourceNode
77
import com.inductiveautomation.ignition.designer.tabbedworkspace.TabbedResourceWorkspace
8+
import javax.swing.JMenuItem
89
import javax.swing.JPopupMenu
910
import javax.swing.tree.TreePath
1011

@@ -13,6 +14,14 @@ abstract class HiddenActionResourceNode(
1314
workspace: TabbedResourceWorkspace,
1415
resource: ProjectResource,
1516
) : ResourceNode(context, workspace, resource) {
17+
18+
fun JPopupMenu.item(text: String, action: (JMenuItem) -> Unit): JMenuItem {
19+
val item = JMenuItem(text)
20+
item.addActionListener { action(item) }
21+
add(item)
22+
return item
23+
}
24+
1625
override fun initPopupMenu(
1726
menu: JPopupMenu,
1827
paths: Array<TreePath>,

modules/periscope/designer/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/navtree/model/TypeScriptResourceFolder.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,21 @@ import com.inductiveautomation.ignition.designer.tabbedworkspace.ResourceFolderN
77
import com.inductiveautomation.ignition.designer.tabbedworkspace.TabbedResourceWorkspace
88

99
class TypeScriptResourceFolder : ResourceFolderNode {
10+
constructor(
11+
context: DesignerContext,
12+
workspace: TabbedResourceWorkspace,
13+
) : super(context, workspace)
14+
1015
constructor(
1116
context: DesignerContext,
1217
workspace: TabbedResourceWorkspace,
1318
resource: ProjectResource,
1419
) : super(context, workspace, resource)
1520

1621
override fun createChildNode(resource: ProjectResource): AbstractNavTreeNode? {
17-
return if (workspace.descriptor.resourceType == resource.resourceType) {
18-
if (resource.isFolder) TypeScriptResourceFolder(this.context, this.workspace, resource)
19-
else TypeScriptResourceNode(this.context, this.workspace, resource)
20-
} else {
21-
null
22+
return when (resource.isFolder) {
23+
true -> TypeScriptResourceFolder(context, workspace, resource)
24+
false -> TypeScriptResourceNode(context, workspace, resource)
2225
}
2326
}
2427
}

modules/periscope/designer/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/navtree/model/TypeScriptResourceNode.kt

Lines changed: 72 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,92 @@ import com.inductiveautomation.ignition.common.project.resource.ProjectResource
44
import com.inductiveautomation.ignition.designer.model.DesignerContext
55
import com.inductiveautomation.ignition.designer.navtree.model.AbstractNavTreeNode
66
import com.inductiveautomation.ignition.designer.tabbedworkspace.TabbedResourceWorkspace
7-
import javax.swing.JMenuItem
7+
import com.mussonindustrial.embr.common.logging.getLogger
8+
import com.mussonindustrial.ignition.embr.periscope.icons.PeriscopeIcons
9+
import com.mussonindustrial.ignition.embr.periscope.resources.TypeScriptResource
10+
import java.awt.Toolkit
11+
import java.awt.datatransfer.DataFlavor
12+
import java.awt.datatransfer.StringSelection
13+
import java.awt.event.InputEvent
14+
import java.awt.event.KeyEvent
815
import javax.swing.JPopupMenu
16+
import javax.swing.KeyStroke
917
import javax.swing.tree.TreePath
1018

1119
class TypeScriptResourceNode(
1220
context: DesignerContext,
1321
workspace: TabbedResourceWorkspace,
14-
resource: ProjectResource,
22+
val resource: ProjectResource,
1523
) : HiddenActionResourceNode(context, workspace, resource) {
24+
25+
private val logger = this.getLogger()
26+
27+
override fun initPopupMenu(
28+
menu: JPopupMenu,
29+
paths: Array<TreePath>,
30+
selection: List<AbstractNavTreeNode>,
31+
modifiers: Int,
32+
) {
33+
34+
menu
35+
.item("Recompile") { logger.info("TODO: Implement recompile from menu.") }
36+
.apply {
37+
icon = PeriscopeIcons.tsx
38+
mnemonic = KeyEvent.VK_R
39+
accelerator = KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK)
40+
}
41+
42+
menu
43+
.item("Format") { logger.info("TODO: Implement format from menu.") }
44+
.apply {
45+
icon = PeriscopeIcons.tsx
46+
mnemonic = KeyEvent.VK_F
47+
accelerator =
48+
KeyStroke.getKeyStroke(
49+
KeyEvent.VK_F,
50+
InputEvent.CTRL_DOWN_MASK or InputEvent.ALT_DOWN_MASK,
51+
)
52+
}
53+
54+
menu.addSeparator()
55+
56+
super.initPopupMenu(menu, paths, selection, modifiers)
57+
}
58+
1659
override fun addShiftClickMenuItems(
1760
menu: JPopupMenu,
1861
paths: Array<TreePath>,
1962
selection: List<AbstractNavTreeNode>,
2063
modifiers: Int,
2164
) {
2265

23-
val copyJavaScript = JMenuItem("Copy JavaScript")
24-
val pasteJavaScript = JMenuItem("Paste JavaScript")
2566
menu.addSeparator()
26-
menu.add(copyJavaScript)
27-
menu.add(pasteJavaScript)
67+
68+
menu
69+
.item("Copy Source") {
70+
val typescriptResource = TypeScriptResource.fromResource(resource)
71+
Toolkit.getDefaultToolkit()
72+
.systemClipboard
73+
.setContents(StringSelection(typescriptResource.source), null)
74+
}
75+
.apply { icon = PeriscopeIcons.tsx }
76+
77+
menu
78+
.item("Paste Source") {
79+
val clipboard = Toolkit.getDefaultToolkit().systemClipboard
80+
val contents = clipboard.getContents(null)
81+
82+
val text =
83+
if (contents?.isDataFlavorSupported(DataFlavor.stringFlavor) == true)
84+
contents.getTransferData(DataFlavor.stringFlavor) as String
85+
else null
86+
87+
if (text == null) return@item
88+
89+
context.project?.createOrModify(resource.resourcePath) { builder ->
90+
builder.putData(TypeScriptResource.SOURCE_KEY, text.toByteArray())
91+
}
92+
}
93+
.apply { icon = PeriscopeIcons.tsx }
2894
}
2995
}

modules/periscope/designer/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/resources/typescript/TypeScriptResourceWorkspace.kt

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.inductiveautomation.ignition.common.project.resource.ProjectResourceB
66
import com.inductiveautomation.ignition.common.project.resource.ResourcePath
77
import com.inductiveautomation.ignition.designer.model.DesignerContext
88
import com.inductiveautomation.ignition.designer.navtree.icon.InteractiveSvgIcon
9+
import com.inductiveautomation.ignition.designer.navtree.model.AbstractNavTreeNode
910
import com.inductiveautomation.ignition.designer.navtree.model.MutableNavTreeNode
1011
import com.inductiveautomation.ignition.designer.tabbedworkspace.*
1112
import com.inductiveautomation.ignition.designer.workspacewelcome.RecentlyModifiedTablePanel
@@ -14,6 +15,8 @@ import com.inductiveautomation.ignition.designer.workspacewelcome.ResourceBuilde
1415
import com.inductiveautomation.ignition.designer.workspacewelcome.WorkspaceWelcomePanel
1516
import com.mussonindustrial.embr.common.logging.getLogger
1617
import com.mussonindustrial.ignition.embr.periscope.Meta
18+
import com.mussonindustrial.ignition.embr.periscope.icons.PeriscopeIcons
19+
import com.mussonindustrial.ignition.embr.periscope.navtree.model.TypeScriptResourceFolder
1720
import com.mussonindustrial.ignition.embr.periscope.resources.TypeScriptResource
1821
import java.util.*
1922
import java.util.function.Consumer
@@ -31,8 +34,8 @@ class TypeScriptResourceWorkspace(
3134
.resourceType(TypeScriptResource.type)
3235
.rootFolderText("TypeScript")
3336
.nounKey("periscope.typescript.noun")
34-
.rootIcon(InteractiveSvgIcon(Meta::class.java, "images/svgicons/folder-closed.svg"))
35-
.icon(InteractiveSvgIcon(Meta::class.java, "images/svgicons/tsx.svg"))
37+
.rootIcon(PeriscopeIcons.folderClosed)
38+
.icon(PeriscopeIcons.tsx)
3639
.navTreeLocation(9999999)
3740
.scope(ApplicationScope.GATEWAY)
3841
.build(),
@@ -57,6 +60,10 @@ class TypeScriptResourceWorkspace(
5760
return this.parent
5861
}
5962

63+
override fun createRootNavTreeNode(): AbstractNavTreeNode {
64+
return TypeScriptResourceFolder(context, this)
65+
}
66+
6067
override fun newResourceEditor(resourcePath: ResourcePath): ResourceEditor<*> {
6168
return TypeScriptResourceEditor(this, resourcePath)
6269
}
@@ -66,10 +73,7 @@ class TypeScriptResourceWorkspace(
6673
object : NewResourceAction(this, folderNode, resourceConstructor) {
6774
init {
6875
putValue(NAME, "New TypeScript Module")
69-
putValue(
70-
SMALL_ICON,
71-
InteractiveSvgIcon(Meta::class.java, "images/svgicons/tsx.svg"),
72-
)
76+
putValue(SMALL_ICON, PeriscopeIcons.tsx)
7377
}
7478

7579
override fun newResourceName() = "NewTypeScriptModule"
@@ -93,16 +97,14 @@ class TypeScriptResourceWorkspace(
9397
resourceConstructor,
9498
)
9599
),
96-
) { path: ResourcePath ->
97-
open(path)
98-
},
100+
this@TypeScriptResourceWorkspace::open,
101+
),
99102
RecentlyModifiedTablePanel(
100103
context,
101104
TypeScriptResource.type,
102105
BundleUtil.i18n("periscope.typescript.nouns-long"),
103-
) { path: ResourcePath ->
104-
open(path)
105-
},
106+
this@TypeScriptResourceWorkspace::open,
107+
),
106108
)
107109
}
108110
}

0 commit comments

Comments
 (0)