Skip to content

Commit 08f032e

Browse files
committed
Added edit as binary action for columns in database view - 1
1 parent e97782a commit 08f032e

12 files changed

Lines changed: 260 additions & 17 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,6 @@ dependencies {
8282
compileOnly(":debugvalue-phpstorm-2022.2.1")
8383
compileOnly(":debugvalue-pycharm-2022.2.1")
8484
compileOnly(":debugvalue-rider-2022.2.1")
85+
compileOnly(":database-plugin-2022.2.1")
8586
compileOnly(":jsr305-2.0.1")
8687
}

changes.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
0.2.8
2+
- Added edit as binary action for columns in database view
23
- Added byte-to-byte compare diff option
34
- Added integration options page
45
- Reworked save on close
4.32 MB
Binary file not shown.

src/main/java/org/exbin/bined/intellij/database/DbEditBinaryAction.java

Lines changed: 191 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,209 @@
1515
*/
1616
package org.exbin.bined.intellij.database;
1717

18-
//import com.intellij.database.datagrid.DataGrid;
19-
//import com.intellij.database.datagrid.DataGridUtil;
20-
//import com.intellij.database.run.actions.GridAction;
18+
import com.intellij.database.datagrid.DataGrid;
19+
import com.intellij.database.datagrid.DataGridUtil;
20+
import com.intellij.database.datagrid.GridColumn;
21+
import com.intellij.database.datagrid.GridModel;
22+
import com.intellij.database.datagrid.GridRow;
23+
import com.intellij.database.datagrid.SelectionModel;
24+
import com.intellij.database.extractors.TextInfo;
25+
import com.intellij.database.run.actions.GridAction;
26+
import com.intellij.database.run.ui.DataAccessType;
27+
import com.intellij.database.run.ui.grid.editors.CoreGridCellEditorHelper;
2128
import com.intellij.openapi.actionSystem.AnAction;
2229
import com.intellij.openapi.actionSystem.AnActionEvent;
30+
import com.intellij.openapi.actionSystem.Presentation;
31+
import com.intellij.openapi.application.ApplicationManager;
2332
import com.intellij.openapi.project.DumbAware;
24-
import org.jetbrains.annotations.NotNull;
33+
import com.intellij.openapi.project.Project;
34+
import com.intellij.openapi.ui.DialogWrapper;
35+
import com.intellij.util.ui.JBUI;
36+
import com.intellij.util.ui.components.BorderLayoutPanel;
37+
import org.exbin.auxiliary.paged_data.BinaryData;
38+
import org.exbin.auxiliary.paged_data.ByteArrayEditableData;
39+
import org.exbin.auxiliary.paged_data.EditableBinaryData;
40+
import org.exbin.bined.EditMode;
41+
import org.exbin.bined.intellij.BinEdPluginStartupActivity;
42+
import org.exbin.bined.intellij.data.ObjectValueConvertor;
43+
import org.exbin.bined.intellij.gui.BinEdComponentFileApi;
44+
import org.exbin.bined.intellij.gui.BinEdComponentPanel;
45+
import org.exbin.framework.bined.FileHandlingMode;
2546

47+
import javax.annotation.Nonnull;
48+
import javax.annotation.Nullable;
2649
import javax.annotation.ParametersAreNonnullByDefault;
50+
import javax.swing.Action;
51+
import javax.swing.JComponent;
52+
import java.util.Objects;
53+
import java.util.logging.Level;
54+
import java.util.logging.Logger;
2755

2856
/**
29-
* Edit cell value as binary data action.
57+
* Edit database cell value as binary data action.
3058
*
3159
* @author ExBin Project (https://exbin.org)
3260
*/
3361
@ParametersAreNonnullByDefault
34-
public class DbEditBinaryAction extends AnAction implements DumbAware { // , GridAction
62+
public class DbEditBinaryAction extends AnAction implements DumbAware, GridAction {
3563

36-
public void actionPerformed(AnActionEvent e) {
37-
// DataGrid grid = DataGridUtil.getDataGrid(e.getDataContext());
38-
// if (grid != null) {
39-
// grid.cancelEditing();
40-
// grid.setCells(grid.getSelectionModel().getSelectedRows(), grid.getSelectionModel().getSelectedColumns(), this.myValue);
41-
// }
64+
private boolean actionVisible = true;
65+
private ObjectValueConvertor objectValueConvertor = new ObjectValueConvertor();
4266

67+
public DbEditBinaryAction() {
68+
BinEdPluginStartupActivity.addIntegrationOptionsListener(integrationOptions -> actionVisible =
69+
integrationOptions.isRegisterEditAsBinaryForDbColumn());
70+
}
71+
72+
public void actionPerformed(AnActionEvent event) {
73+
DataGrid grid = DataGridUtil.getDataGrid(event.getDataContext());
74+
if (grid != null) {
75+
SelectionModel<GridRow, GridColumn> selectionModel = grid.getSelectionModel();
76+
GridModel<GridRow, GridColumn> dataModel = grid.getDataModel(DataAccessType.DATA_WITH_MUTATIONS);
77+
GridColumn column = Objects.requireNonNull(dataModel.getColumn(selectionModel.getSelectedColumn()));
78+
GridRow row = Objects.requireNonNull(dataModel.getRow(selectionModel.getSelectedRow()));
79+
Object value = column.getValue(row);
80+
81+
// TODO detect BLOB types somehow? column.getType()
82+
// switch (CoreGridCellEditorHelper.get(grid).guessJdbcTypeForEditing(grid, row, column)) {
83+
// case -4:
84+
// case -3:
85+
// case -2:
86+
// case 2004:
87+
// return 1;
88+
// default:
89+
// return 0;
90+
// }
91+
92+
BinaryData binaryData;
93+
if (value instanceof byte[] || value == null) {
94+
binaryData = value == null ? new ByteArrayEditableData() : new ByteArrayEditableData((byte[]) value);
95+
} else if (value instanceof TextInfo) {
96+
binaryData = new ByteArrayEditableData(((TextInfo) value).bytes);
97+
} else {
98+
binaryData = objectValueConvertor.process(value).orElse(null);
99+
}
100+
101+
if (binaryData != null) {
102+
Project project = grid.getProject();
103+
ApplicationManager.getApplication().invokeLater(() -> {
104+
DataDialog dialog = new DataDialog(project, grid, binaryData);
105+
boolean editable = binaryData instanceof EditableBinaryData;
106+
dialog.setTitle(editable ? "Edit Binary Data" : "View Binary Data");
107+
dialog.show();
108+
});
109+
}
110+
}
111+
}
112+
113+
@Override
114+
public void update(AnActionEvent event) {
115+
super.update(event);
116+
Presentation presentation = event.getPresentation();
117+
presentation.setVisible(actionVisible);
118+
if (actionVisible) {
119+
boolean enabled = false;
120+
DataGrid grid = DataGridUtil.getDataGrid(event.getDataContext());
121+
if (grid != null) {
122+
SelectionModel<GridRow, GridColumn> selectionModel = grid.getSelectionModel();
123+
enabled = selectionModel.getSelectedColumnCount() == 1 && selectionModel.getSelectedRowCount() == 1;
124+
}
125+
presentation.setEnabled(enabled);
126+
}
127+
}
128+
129+
@ParametersAreNonnullByDefault
130+
private static class DataDialog extends DialogWrapper {
131+
132+
private final BinEdComponentPanel viewPanel;
133+
private final DataGrid grid;
134+
135+
private DataDialog(Project project, DataGrid grid, @Nullable BinaryData binaryData) {
136+
super(project, false);
137+
this.grid = grid;
138+
setModal(false);
139+
setCancelButtonText("Close");
140+
setOKButtonText("Set");
141+
boolean editable = binaryData instanceof EditableBinaryData;
142+
setOKActionEnabled(editable);
143+
setCrossClosesWindow(true);
144+
145+
viewPanel = new BinEdComponentPanel();
146+
viewPanel.setFileApi(new BinEdComponentFileApi() {
147+
@Override
148+
public boolean isSaveSupported() {
149+
return false;
150+
}
151+
152+
@Override
153+
public void saveDocument() {
154+
throw new IllegalStateException("Save not supported");
155+
}
156+
157+
@Override
158+
public void switchFileHandlingMode(FileHandlingMode newHandlingMode) {
159+
throw new IllegalStateException("Save not supported");
160+
}
161+
162+
@Override
163+
public void closeData() {
164+
// Ignore
165+
}
166+
});
167+
viewPanel.setContentData(binaryData);
168+
if (!editable) {
169+
viewPanel.getCodeArea().setEditMode(EditMode.READ_ONLY);
170+
}
171+
init();
172+
}
173+
174+
@Override
175+
protected void doOKAction() {
176+
super.doOKAction();
177+
178+
try {
179+
SelectionModel<GridRow, GridColumn> selectionModel = grid.getSelectionModel();
180+
grid.cancelEditing();
181+
BinaryData contentData = viewPanel.getContentData();
182+
int size = contentData != null ? (int) contentData.getDataSize() : 0;
183+
byte[] resultData = new byte[size];
184+
if (size > 0) {
185+
contentData.copyToArray(0, resultData, 0, size);
186+
}
187+
grid.setCells(
188+
selectionModel.getSelectedRows(),
189+
selectionModel.getSelectedColumns(),
190+
resultData
191+
);
192+
} catch (Exception ex) {
193+
Logger.getLogger(DbEditBinaryAction.class.getName()).log(Level.SEVERE, "Unable to set value", ex);
194+
}
195+
}
196+
197+
@Nonnull
198+
@Override
199+
protected Action[] createActions() {
200+
return new Action[] { getOKAction(), getCancelAction() };
201+
}
202+
203+
@Nullable
204+
@Override
205+
public JComponent getPreferredFocusedComponent() {
206+
return viewPanel;
207+
}
208+
209+
@Nullable
210+
@Override
211+
protected String getDimensionServiceKey() {
212+
return "#org.exbin.bined.intellij.database.ViewBinaryAction";
213+
}
214+
215+
@Nullable
216+
@Override
217+
protected JComponent createCenterPanel() {
218+
BorderLayoutPanel panel = JBUI.Panels.simplePanel(viewPanel);
219+
panel.setPreferredSize(JBUI.size(600, 400));
220+
return panel;
221+
}
43222
}
44223
}

src/main/java/org/exbin/bined/intellij/options/IntegrationOptions.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,6 @@ public interface IntegrationOptions {
3636
boolean isRegisterDebugViewAsBinary();
3737

3838
boolean isRegisterByteToByteDiffTool();
39+
40+
boolean isRegisterEditAsBinaryForDbColumn();
3941
}

src/main/java/org/exbin/bined/intellij/options/gui/IntegrationOptionsPanel.form

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
<Component id="binaryEditorInContextOpenInCheckBox" alignment="0" max="32767" attributes="0"/>
2727
<Component id="openAsBinaryInDebugViewCheckBox" alignment="0" max="32767" attributes="0"/>
2828
<Component id="byteToByteDiffToolCheckBox" alignment="0" max="32767" attributes="0"/>
29+
<Component id="editAsBinaryForDbColumnCheckBox" alignment="1" max="32767" attributes="0"/>
2930
</Group>
3031
<EmptySpace max="-2" attributes="0"/>
3132
</Group>
@@ -46,6 +47,8 @@
4647
<Component id="openAsBinaryInDebugViewCheckBox" min="-2" max="-2" attributes="0"/>
4748
<EmptySpace max="-2" attributes="0"/>
4849
<Component id="byteToByteDiffToolCheckBox" min="-2" max="-2" attributes="0"/>
50+
<EmptySpace max="-2" attributes="0"/>
51+
<Component id="editAsBinaryForDbColumnCheckBox" min="-2" max="-2" attributes="0"/>
4952
<EmptySpace max="32767" attributes="0"/>
5053
</Group>
5154
</Group>
@@ -116,5 +119,16 @@
116119
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="byteToByteDiffToolCheckBoxStateChanged"/>
117120
</Events>
118121
</Component>
122+
<Component class="javax.swing.JCheckBox" name="editAsBinaryForDbColumnCheckBox">
123+
<Properties>
124+
<Property name="selected" type="boolean" value="true"/>
125+
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
126+
<ResourceString bundle="org/exbin/bined/intellij/options/gui/resources/IntegrationOptionsPanel.properties" key="IntegrationOptionsPanel.editAsBinaryForDbColumnCheckBox.text" replaceFormat="resourceBundle.getString(&quot;{key}&quot;)"/>
127+
</Property>
128+
</Properties>
129+
<Events>
130+
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="editAsBinaryForDbColumnCheckBoxStateChanged"/>
131+
</Events>
132+
</Component>
119133
</SubComponents>
120134
</Form>

src/main/java/org/exbin/bined/intellij/options/gui/IntegrationOptionsPanel.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public void saveToOptions(IntegrationOptionsImpl options) {
5353
options.setRegisterContextOpenInBinaryEditor(binaryEditorInContextOpenInCheckBox.isSelected());
5454
options.setRegisterDebugViewAsBinary(openAsBinaryInDebugViewCheckBox.isSelected());
5555
options.setRegisterByteToByteDiffTool(byteToByteDiffToolCheckBox.isSelected());
56+
options.setRegisterEditAsBinaryForDbColumn(editAsBinaryForDbColumnCheckBox.isSelected());
5657
}
5758

5859
@Override
@@ -63,6 +64,7 @@ public void loadFromOptions(IntegrationOptionsImpl options) {
6364
binaryEditorInContextOpenInCheckBox.setSelected(options.isRegisterContextOpenInBinaryEditor());
6465
openAsBinaryInDebugViewCheckBox.setSelected(options.isRegisterDebugViewAsBinary());
6566
byteToByteDiffToolCheckBox.setSelected(options.isRegisterByteToByteDiffTool());
67+
editAsBinaryForDbColumnCheckBox.setSelected(options.isRegisterEditAsBinaryForDbColumn());
6668
}
6769

6870
/**
@@ -80,6 +82,7 @@ private void initComponents() {
8082
binaryEditorInContextOpenInCheckBox = new javax.swing.JCheckBox();
8183
openAsBinaryInDebugViewCheckBox = new javax.swing.JCheckBox();
8284
byteToByteDiffToolCheckBox = new javax.swing.JCheckBox();
85+
editAsBinaryForDbColumnCheckBox = new javax.swing.JCheckBox();
8386

8487
openFileAsBinaryCheckBox.setText(resourceBundle.getString("openFileAsBinaryCheckBox.text")); // NOI18N
8588
openFileAsBinaryCheckBox.addChangeListener(new javax.swing.event.ChangeListener() {
@@ -127,6 +130,14 @@ public void stateChanged(javax.swing.event.ChangeEvent evt) {
127130
}
128131
});
129132

133+
editAsBinaryForDbColumnCheckBox.setSelected(true);
134+
editAsBinaryForDbColumnCheckBox.setText(resourceBundle.getString("IntegrationOptionsPanel.editAsBinaryForDbColumnCheckBox.text")); // NOI18N
135+
editAsBinaryForDbColumnCheckBox.addChangeListener(new javax.swing.event.ChangeListener() {
136+
public void stateChanged(javax.swing.event.ChangeEvent evt) {
137+
editAsBinaryForDbColumnCheckBoxStateChanged(evt);
138+
}
139+
});
140+
130141
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
131142
this.setLayout(layout);
132143
layout.setHorizontalGroup(
@@ -139,7 +150,8 @@ public void stateChanged(javax.swing.event.ChangeEvent evt) {
139150
.addComponent(contextOpenAsBinaryCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
140151
.addComponent(binaryEditorInContextOpenInCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
141152
.addComponent(openAsBinaryInDebugViewCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
142-
.addComponent(byteToByteDiffToolCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
153+
.addComponent(byteToByteDiffToolCheckBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
154+
.addComponent(editAsBinaryForDbColumnCheckBox, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
143155
.addContainerGap())
144156
);
145157
layout.setVerticalGroup(
@@ -157,6 +169,8 @@ public void stateChanged(javax.swing.event.ChangeEvent evt) {
157169
.addComponent(openAsBinaryInDebugViewCheckBox)
158170
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
159171
.addComponent(byteToByteDiffToolCheckBox)
172+
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
173+
.addComponent(editAsBinaryForDbColumnCheckBox)
160174
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
161175
);
162176
}// </editor-fold>//GEN-END:initComponents
@@ -185,6 +199,10 @@ private void byteToByteDiffToolCheckBoxStateChanged(javax.swing.event.ChangeEven
185199
setModified(true);
186200
}//GEN-LAST:event_byteToByteDiffToolCheckBoxStateChanged
187201

202+
private void editAsBinaryForDbColumnCheckBoxStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_editAsBinaryForDbColumnCheckBoxStateChanged
203+
setModified(true);
204+
}//GEN-LAST:event_editAsBinaryForDbColumnCheckBoxStateChanged
205+
188206
/**
189207
* Test method for this panel.
190208
*
@@ -198,6 +216,7 @@ public static void main(String[] args) {
198216
private javax.swing.JCheckBox binaryEditorInContextOpenInCheckBox;
199217
private javax.swing.JCheckBox byteToByteDiffToolCheckBox;
200218
private javax.swing.JCheckBox contextOpenAsBinaryCheckBox;
219+
private javax.swing.JCheckBox editAsBinaryForDbColumnCheckBox;
201220
private javax.swing.JCheckBox openAsBinaryInDebugViewCheckBox;
202221
private javax.swing.JCheckBox openFileAsBinaryCheckBox;
203222
private javax.swing.JCheckBox openFileToolbarBinaryCheckBox;

0 commit comments

Comments
 (0)