@@ -33,66 +33,38 @@ final class TableRowViewWithMenu: NSTableRowView {
3333 ) . target = self
3434 }
3535
36- // Normal row menu (or additional items for inserted rows)
3736 if !coordinator. changeManager. isRowDeleted ( rowIndex) {
38- // Edit actions (if editable)
39- if coordinator. isEditable && dataColumnIndex >= 0 {
40- let setValueMenu = NSMenu ( )
41-
42- let emptyItem = NSMenuItem (
43- title: String ( localized: " Empty " ) , action: #selector( setEmptyValue ( _: ) ) , keyEquivalent: " " )
44- emptyItem. representedObject = dataColumnIndex
45- emptyItem. target = self
46- setValueMenu. addItem ( emptyItem)
47-
48- let nullItem = NSMenuItem (
49- title: String ( localized: " NULL " ) , action: #selector( setNullValue ( _: ) ) , keyEquivalent: " " )
50- nullItem. representedObject = dataColumnIndex
51- nullItem. target = self
52- setValueMenu. addItem ( nullItem)
53-
54- let defaultItem = NSMenuItem (
55- title: String ( localized: " Default " ) , action: #selector( setDefaultValue ( _: ) ) , keyEquivalent: " " )
56- defaultItem. representedObject = dataColumnIndex
57- defaultItem. target = self
58- setValueMenu. addItem ( defaultItem)
59-
60- let setValueItem = NSMenuItem ( title: String ( localized: " Set Value " ) , action: nil , keyEquivalent: " " )
61- setValueItem. submenu = setValueMenu
62- menu. addItem ( setValueItem)
37+ // Copy
38+ let copyItem = NSMenuItem (
39+ title: String ( localized: " Copy " ) , action: #selector( copySelectedOrCurrentRow) , keyEquivalent: " c " )
40+ copyItem. keyEquivalentModifierMask = . command
41+ copyItem. target = self
42+ menu. addItem ( copyItem)
6343
64- menu . addItem ( NSMenuItem . separator ( ) )
65- }
44+ // "Copy as" submenu — always includes Cell Value + With Headers, conditionally adds SQL statements
45+ let copyAsMenu = NSMenu ( )
6646
67- // Copy actions
6847 if dataColumnIndex >= 0 {
6948 let copyCellItem = NSMenuItem (
70- title: String ( localized: " Copy Cell Value" ) , action: #selector( copyCellValue ( _: ) ) ,
49+ title: String ( localized: " Cell Value " ) , action: #selector( copyCellValue ( _: ) ) ,
7150 keyEquivalent: " " )
7251 copyCellItem. representedObject = dataColumnIndex
7352 copyCellItem. target = self
74- menu . addItem ( copyCellItem)
53+ copyAsMenu . addItem ( copyCellItem)
7554 }
7655
77- let copyItem = NSMenuItem (
78- title: String ( localized: " Copy " ) , action: #selector( copySelectedOrCurrentRow) , keyEquivalent: " c " )
79- copyItem. keyEquivalentModifierMask = . command
80- copyItem. target = self
81- menu. addItem ( copyItem)
82-
8356 let copyWithHeadersItem = NSMenuItem (
84- title: String ( localized: " Copy with Headers" ) ,
57+ title: String ( localized: " With Headers" ) ,
8558 action: #selector( copySelectedOrCurrentRowWithHeaders) ,
8659 keyEquivalent: " c " )
8760 copyWithHeadersItem. keyEquivalentModifierMask = [ . command, . shift]
8861 copyWithHeadersItem. target = self
89- menu . addItem ( copyWithHeadersItem)
62+ copyAsMenu . addItem ( copyWithHeadersItem)
9063
91- // "Copy as" submenu — only for SQL databases with a known table
9264 if let dbType = coordinator. databaseType,
9365 dbType != . mongodb && dbType != . redis,
9466 coordinator. tableName != nil {
95- let copyAsMenu = NSMenu ( )
67+ copyAsMenu. addItem ( NSMenuItem . separator ( ) )
9668
9769 let insertItem = NSMenuItem (
9870 title: String ( localized: " INSERT Statement(s) " ) ,
@@ -107,24 +79,54 @@ final class TableRowViewWithMenu: NSTableRowView {
10779 keyEquivalent: " " )
10880 updateItem. target = self
10981 copyAsMenu. addItem ( updateItem)
110-
111- let copyAsItem = NSMenuItem (
112- title: String ( localized: " Copy as " ) ,
113- action: nil ,
114- keyEquivalent: " " )
115- copyAsItem. submenu = copyAsMenu
116- menu. addItem ( copyAsItem)
11782 }
11883
84+ let copyAsItem = NSMenuItem ( title: String ( localized: " Copy as " ) , action: nil , keyEquivalent: " " )
85+ copyAsItem. submenu = copyAsMenu
86+ menu. addItem ( copyAsItem)
87+
88+ // Paste
11989 if coordinator. isEditable {
12090 let pasteItem = NSMenuItem (
12191 title: String ( localized: " Paste " ) , action: #selector( pasteRows) , keyEquivalent: " v " )
12292 pasteItem. keyEquivalentModifierMask = . command
12393 pasteItem. target = self
12494 menu. addItem ( pasteItem)
95+ }
12596
97+ if coordinator. isEditable {
12698 menu. addItem ( NSMenuItem . separator ( ) )
99+ }
100+
101+ // Set Value (editable + column clicked)
102+ if coordinator. isEditable && dataColumnIndex >= 0 {
103+ let setValueMenu = NSMenu ( )
127104
105+ let emptyItem = NSMenuItem (
106+ title: String ( localized: " Empty " ) , action: #selector( setEmptyValue ( _: ) ) , keyEquivalent: " " )
107+ emptyItem. representedObject = dataColumnIndex
108+ emptyItem. target = self
109+ setValueMenu. addItem ( emptyItem)
110+
111+ let nullItem = NSMenuItem (
112+ title: String ( localized: " NULL " ) , action: #selector( setNullValue ( _: ) ) , keyEquivalent: " " )
113+ nullItem. representedObject = dataColumnIndex
114+ nullItem. target = self
115+ setValueMenu. addItem ( nullItem)
116+
117+ let defaultItem = NSMenuItem (
118+ title: String ( localized: " Default " ) , action: #selector( setDefaultValue ( _: ) ) , keyEquivalent: " " )
119+ defaultItem. representedObject = dataColumnIndex
120+ defaultItem. target = self
121+ setValueMenu. addItem ( defaultItem)
122+
123+ let setValueItem = NSMenuItem ( title: String ( localized: " Set Value " ) , action: nil , keyEquivalent: " " )
124+ setValueItem. submenu = setValueMenu
125+ menu. addItem ( setValueItem)
126+ }
127+
128+ // Duplicate & Delete
129+ if coordinator. isEditable {
128130 let duplicateItem = NSMenuItem (
129131 title: String ( localized: " Duplicate " ) , action: #selector( duplicateRow) , keyEquivalent: " d " )
130132 duplicateItem. keyEquivalentModifierMask = . command
0 commit comments