Skip to content

Commit 19a7dda

Browse files
makejavasmakejava
authored andcommitted
升级到1.2.7版本,并修复已知BUG
1 parent 66aabee commit 19a7dda

12 files changed

Lines changed: 130 additions & 62 deletions

File tree

src/main/java/com/sjhy/plugin/dict/GlobalDict.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public interface GlobalDict {
1515
/**
1616
* 版本号
1717
*/
18-
String VERSION = "1.2.6";
18+
String VERSION = "1.2.7";
1919
/**
2020
* 作者名称
2121
*/

src/main/java/com/sjhy/plugin/dto/ColumnInfoDTO.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ public ColumnInfoDTO(PsiField field) {
3030
this.comment = DocCommentUtils.getComment(field.getDocComment());
3131
this.type = field.getType().getCanonicalText();
3232
this.custom = false;
33-
this.ext = new HashMap<>();
33+
this.ext = "{}";
3434
}
3535

3636
public ColumnInfoDTO(DasColumn column) {
3737
this.name = NameUtils.getInstance().getJavaName(column.getName());
3838
this.comment = column.getComment();
3939
this.type = getJavaType(column.getDataType().toString());
4040
this.custom = false;
41-
this.ext = new HashMap<>();
41+
this.ext = "{}";
4242
}
4343

4444
private String getJavaType(String dbType) {
@@ -74,7 +74,7 @@ private String getJavaType(String dbType) {
7474
*/
7575
private Boolean custom;
7676
/**
77-
* 扩展数据
77+
* 扩展数据(JSON字符串)
7878
*/
79-
private Map<String, Object> ext;
79+
private String ext;
8080
}

src/main/java/com/sjhy/plugin/dto/TableInfoDTO.java

Lines changed: 59 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ private TableInfoDTO(DbTable dbTable) {
7070
}
7171

7272
private static void merge(TableInfoDTO oldData, TableInfoDTO newData) {
73-
if (oldData == null) {
73+
if (oldData == null || CollectionUtil.isEmpty(oldData.getFullColumn())) {
7474
return;
7575
}
7676
if (!StringUtils.isEmpty(oldData.getPreName())) {
@@ -88,32 +88,66 @@ private static void merge(TableInfoDTO oldData, TableInfoDTO newData) {
8888
if (!StringUtils.isEmpty(oldData.getSaveModelName())) {
8989
newData.saveModelName = oldData.getSaveModelName();
9090
}
91-
if (CollectionUtil.isEmpty(oldData.getFullColumn())) {
92-
return;
93-
}
94-
// 补充自定义列
95-
for (ColumnInfoDTO oldColumn : oldData.getFullColumn()) {
96-
if (!oldColumn.getCustom()) {
97-
continue;
91+
List<String> allNewColumnNames = newData.getFullColumn().stream().map(ColumnInfoDTO::getName).collect(Collectors.toList());
92+
// 列出旧的顺序,并删除已经不存在的列,不包括自定义列
93+
List<ColumnInfoDTO> oldSequenceColumn = oldData.getFullColumn().stream()
94+
.filter(item -> allNewColumnNames.contains(item.getName()) || Boolean.TRUE.equals(item.getCustom()))
95+
.collect(Collectors.toList());
96+
// 尽可能的保留原始顺序(把自定义列按原始位置插入)
97+
Map<String, String> nameMap = new HashMap<>(oldSequenceColumn.size());
98+
for (int i = 0; i < oldSequenceColumn.size(); i++) {
99+
ColumnInfoDTO columnInfo = oldSequenceColumn.get(i);
100+
if (columnInfo.getCustom()) {
101+
// 如果原本是自定义列,现在变成了数据库列,则忽略调原本的自定义列
102+
if (allNewColumnNames.contains(columnInfo.getName())) {
103+
continue;
104+
}
105+
// 获取当前自定义列的前一个名称
106+
String beforeName = "";
107+
if (i > 0) {
108+
beforeName = oldSequenceColumn.get(i - 1).getName();
109+
}
110+
nameMap.put(beforeName, columnInfo.getName());
98111
}
99-
newData.getFullColumn().add(oldColumn);
100112
}
101-
// 保持旧列的顺序
102-
Map<String, ColumnInfoDTO> map = newData.getFullColumn().stream().collect(Collectors.toMap(ColumnInfoDTO::getName, val -> val));
113+
// 将自定义列按顺序插入到新表中
114+
nameMap.forEach((k, v) -> {
115+
if (StringUtils.isEmpty(k)) {
116+
allNewColumnNames.add(0, v);
117+
} else {
118+
for (int i = 0; i < allNewColumnNames.size(); i++) {
119+
if (allNewColumnNames.get(i).equals(k)) {
120+
allNewColumnNames.add(i + 1, v);
121+
return;
122+
}
123+
}
124+
}
125+
});
126+
// 按顺序依次重写数据
127+
Map<String, ColumnInfoDTO> oldColumnMap = oldData.getFullColumn().stream().collect(Collectors.toMap(ColumnInfoDTO::getName, v -> v));
128+
Map<String, ColumnInfoDTO> newColumnMap = newData.getFullColumn().stream().collect(Collectors.toMap(ColumnInfoDTO::getName, v -> v));
103129
List<ColumnInfoDTO> tmpList = new ArrayList<>();
104-
for (ColumnInfoDTO columnInfo : oldData.getFullColumn()) {
105-
ColumnInfoDTO newColumn = map.get(columnInfo.getName());
106-
if (newColumn != null) {
107-
// ext属性转移
108-
newColumn.setExt(columnInfo.getExt());
109-
tmpList.add(newColumn);
130+
for (String name : allNewColumnNames) {
131+
ColumnInfoDTO newColumnInfo = newColumnMap.get(name);
132+
if (newColumnInfo == null) {
133+
newColumnInfo = oldColumnMap.get(name);
134+
if (newColumnInfo == null) {
135+
throw new NullPointerException("找不到列信息");
136+
}
137+
tmpList.add(newColumnInfo);
138+
continue;
110139
}
111-
}
112-
// 补充剩余列
113-
for (ColumnInfoDTO columnInfoDTO : newData.getFullColumn()) {
114-
if (!tmpList.contains(columnInfoDTO)) {
115-
tmpList.add(columnInfoDTO);
140+
ColumnInfoDTO oldColumnInfo = oldColumnMap.get(name);
141+
if (oldColumnInfo == null) {
142+
tmpList.add(newColumnInfo);
143+
continue;
144+
}
145+
// 需要进行合并操作
146+
newColumnInfo.setExt(oldColumnInfo.getExt());
147+
if (StringUtils.isEmpty(newColumnInfo.getComment())) {
148+
newColumnInfo.setComment(oldColumnInfo.getComment());
116149
}
150+
tmpList.add(newColumnInfo);
117151
}
118152
// list数据替换
119153
newData.getFullColumn().clear();
@@ -187,6 +221,7 @@ public TableInfo toTableInfo(PsiClass psiClass) {
187221
return tableInfo;
188222
}
189223

224+
@SuppressWarnings("unchecked")
190225
public TableInfo toTableInfo(DbTable dbTable) {
191226
TableInfo tableInfo = new TableInfo();
192227
tableInfo.setObj(dbTable);
@@ -216,7 +251,7 @@ public TableInfo toTableInfo(DbTable dbTable) {
216251
columnInfo.setShortType(split[split.length - 1]);
217252
columnInfo.setComment(dto.getComment());
218253
columnInfo.setCustom(dto.getCustom());
219-
columnInfo.setExt(dto.getExt());
254+
columnInfo.setExt(JSON.parse(dto.getExt(), HashMap.class));
220255
tableInfo.getFullColumn().add(columnInfo);
221256
if (columnInfo.getObj() != null && DasUtil.isPrimary(columnInfo.getObj())) {
222257
tableInfo.getPkColumn().add(columnInfo);
@@ -242,7 +277,7 @@ public static TableInfoDTO valueOf(TableInfo tableInfo) {
242277
ColumnInfoDTO columnInfoDTO = new ColumnInfoDTO();
243278
columnInfoDTO.setName(columnInfo.getName());
244279
columnInfoDTO.setType(columnInfo.getType());
245-
columnInfoDTO.setExt(columnInfo.getExt());
280+
columnInfoDTO.setExt(JSON.toJson(columnInfo.getExt()));
246281
columnInfoDTO.setCustom(columnInfo.getCustom());
247282
columnInfoDTO.setComment(columnInfo.getComment());
248283
dto.getFullColumn().add(columnInfoDTO);

src/main/java/com/sjhy/plugin/factory/CellEditorFactory.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,6 @@
2121
*/
2222
public class CellEditorFactory {
2323

24-
/**
25-
* 创建下拉框编辑器
26-
*
27-
* @param editable 可编辑的
28-
* @return {@link TableCellEditor}
29-
*/
30-
public static TableCellEditor createComboBoxEditor(boolean editable, Class<? extends Enum> enumCls) {
31-
Enum[] enumConstants = enumCls.getEnumConstants();
32-
return createComboBoxEditor(editable, Stream.of(enumConstants).map(Enum::name).toArray(value -> new String[enumConstants.length]));
33-
}
34-
3524
/**
3625
* 创建下拉框编辑器
3726
*
@@ -42,11 +31,6 @@ public static TableCellEditor createComboBoxEditor(boolean editable, Class<? ext
4231
public static TableCellEditor createComboBoxEditor(boolean editable, String... items) {
4332
ComboBox<String> comboBox = new ComboBox<>(items);
4433
comboBox.setEditable(editable);
45-
// 配色
46-
if (comboBox.getPopup() != null) {
47-
comboBox.getPopup().getList().setBackground(JBColor.WHITE);
48-
comboBox.getPopup().getList().setForeground(JBColor.GREEN);
49-
}
5034
if (!editable) {
5135
transmitFocusEvent(comboBox);
5236
}

src/main/java/com/sjhy/plugin/ui/ColumnConfigSettingForm.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.fasterxml.jackson.core.type.TypeReference;
44
import com.intellij.openapi.options.Configurable;
5+
import com.intellij.openapi.ui.ComboBoxTableRenderer;
56
import com.sjhy.plugin.dict.GlobalDict;
67
import com.sjhy.plugin.dto.SettingsStorageDTO;
78
import com.sjhy.plugin.entity.ColumnConfig;
@@ -15,19 +16,21 @@
1516

1617
import javax.swing.*;
1718
import javax.swing.table.TableCellEditor;
19+
import javax.swing.table.TableCellRenderer;
1820
import java.awt.*;
1921
import java.util.Arrays;
2022
import java.util.List;
2123
import java.util.Map;
2224
import java.util.function.Consumer;
25+
import java.util.stream.Stream;
2326

2427
/**
2528
* @author makejava
2629
* @version 1.0.0
2730
* @date 2021/08/10 13:27
2831
*/
2932
public class ColumnConfigSettingForm implements Configurable, BaseSettings {
30-
private JPanel mainPanel;
33+
private final JPanel mainPanel;
3134
/**
3235
* 列配置
3336
*/
@@ -51,14 +54,16 @@ public ColumnConfigSettingForm() {
5154

5255
private void initTable() {
5356
// 第一列,类型
54-
TableCellEditor typeEditor = CellEditorFactory.createComboBoxEditor(false, ColumnConfigType.class);
55-
TableComponent.Column<ColumnConfig> typeColumn = new TableComponent.Column<>("type", item -> item.getType().name(), (entity, val) -> entity.setType(ColumnConfigType.valueOf(val)), typeEditor);
57+
String[] columnConfigTypeNames = Stream.of(ColumnConfigType.values()).map(ColumnConfigType::name).toArray(String[]::new);
58+
TableCellEditor typeEditor = CellEditorFactory.createComboBoxEditor(false, columnConfigTypeNames);
59+
TableCellRenderer typeRenderer = new ComboBoxTableRenderer<>(columnConfigTypeNames);
60+
TableComponent.Column<ColumnConfig> typeColumn = new TableComponent.Column<>("type", item -> item.getType().name(), (entity, val) -> entity.setType(ColumnConfigType.valueOf(val)), typeEditor, typeRenderer);
5661
// 第二列标题
5762
TableCellEditor titleEditor = CellEditorFactory.createTextFieldEditor();
58-
TableComponent.Column<ColumnConfig> titleColumn = new TableComponent.Column<>("title", ColumnConfig::getTitle, ColumnConfig::setTitle, titleEditor);
63+
TableComponent.Column<ColumnConfig> titleColumn = new TableComponent.Column<>("title", ColumnConfig::getTitle, ColumnConfig::setTitle, titleEditor, null);
5964
// 第三列选项
6065
TableCellEditor selectValueEditor = CellEditorFactory.createTextFieldEditor();
61-
TableComponent.Column<ColumnConfig> selectValueColumn = new TableComponent.Column<>("selectValue", ColumnConfig::getSelectValue, ColumnConfig::setSelectValue, selectValueEditor);
66+
TableComponent.Column<ColumnConfig> selectValueColumn = new TableComponent.Column<>("selectValue", ColumnConfig::getSelectValue, ColumnConfig::setSelectValue, selectValueEditor, null);
6267
List<TableComponent.Column<ColumnConfig>> columns = Arrays.asList(typeColumn, titleColumn, selectValueColumn);
6368

6469
// 表格初始化

src/main/java/com/sjhy/plugin/ui/ConfigTableDialog.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.sjhy.plugin.ui;
22

3+
import com.intellij.openapi.ui.ComboBoxTableRenderer;
34
import com.intellij.openapi.ui.DialogWrapper;
5+
import com.intellij.ui.BooleanTableCellRenderer;
46
import com.intellij.ui.ToolbarDecorator;
57
import com.intellij.ui.table.JBTable;
68
import com.sjhy.plugin.dict.GlobalDict;
@@ -18,6 +20,8 @@
1820
import javax.swing.*;
1921
import javax.swing.table.TableColumn;
2022
import java.awt.*;
23+
import java.util.ArrayList;
24+
import java.util.Arrays;
2125

2226
/**
2327
* 表配置窗口
@@ -30,7 +34,7 @@ public class ConfigTableDialog extends DialogWrapper {
3034
/**
3135
* 主面板
3236
*/
33-
private JPanel mainPanel;
37+
private final JPanel mainPanel;
3438
/**
3539
* 表信息对象
3640
*/
@@ -52,8 +56,10 @@ private void initPanel() {
5256

5357
// 配置列编辑器
5458
table.getColumn("name").setCellEditor(CellEditorFactory.createTextFieldEditor());
55-
table.getColumn("type").setCellEditor(CellEditorFactory.createComboBoxEditor(true, GlobalDict.DEFAULT_JAVA_TYPE_LIST));
56-
table.getColumn("type").setMinWidth(120);
59+
TableColumn typeColumn = table.getColumn("type");
60+
typeColumn.setCellRenderer(new ComboBoxTableRenderer<>(GlobalDict.DEFAULT_JAVA_TYPE_LIST));
61+
typeColumn.setCellEditor(CellEditorFactory.createComboBoxEditor(true, GlobalDict.DEFAULT_JAVA_TYPE_LIST));
62+
typeColumn.setMinWidth(120);
5763
table.getColumn("comment").setCellEditor(CellEditorFactory.createTextFieldEditor());
5864
// 其他附加列
5965
for (ColumnConfig columnConfig : CurrGroupUtils.getCurrColumnConfigGroup().getElementList()) {
@@ -66,10 +72,17 @@ private void initPanel() {
6672
if (StringUtils.isEmpty(columnConfig.getSelectValue())) {
6773
column.setCellEditor(CellEditorFactory.createTextFieldEditor());
6874
} else {
69-
column.setCellEditor(CellEditorFactory.createComboBoxEditor(false, columnConfig.getSelectValue().split(",")));
75+
String[] split = columnConfig.getSelectValue().split(",");
76+
ArrayList<String> list = new ArrayList<>(Arrays.asList(split));
77+
// 添加一个空值作为默认值
78+
list.add(0, "");
79+
split = list.toArray(new String[0]);
80+
column.setCellRenderer(new ComboBoxTableRenderer<>(split));
81+
column.setCellEditor(CellEditorFactory.createComboBoxEditor(false, split));
7082
}
7183
break;
7284
case BOOLEAN:
85+
column.setCellRenderer(new BooleanTableCellRenderer());
7386
column.setCellEditor(CellEditorFactory.createBooleanEditor());
7487
break;
7588
default:

src/main/java/com/sjhy/plugin/ui/MainSettingForm.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.intellij.openapi.options.Configurable;
44
import com.intellij.openapi.options.ConfigurationException;
5+
import com.sjhy.plugin.dict.GlobalDict;
56
import com.sjhy.plugin.dto.SettingsStorageDTO;
67
import com.sjhy.plugin.service.impl.ClipboardExportImportSettingsServiceImpl;
78
import com.sjhy.plugin.service.impl.LocalFileExportImportSettingsServiceImpl;
@@ -151,7 +152,7 @@ public void apply() throws ConfigurationException {
151152
*/
152153
@Override
153154
public void loadSettingsStore(SettingsStorageDTO settingsStorage) {
154-
this.versionLabel.setText(settingsStorage.getVersion());
155+
this.versionLabel.setText(GlobalDict.VERSION);
155156
this.authorEditor.setText(settingsStorage.getAuthor());
156157
this.userSecureEditor.setText(settingsStorage.getUserSecure());
157158
if (StringUtils.isEmpty(settingsStorage.getUserSecure())) {

src/main/java/com/sjhy/plugin/ui/TypeMapperSettingForm.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.sjhy.plugin.ui;
22

33
import com.fasterxml.jackson.core.type.TypeReference;
4+
import com.intellij.openapi.ui.ComboBoxTableRenderer;
45
import com.sjhy.plugin.dict.GlobalDict;
56
import com.sjhy.plugin.dto.SettingsStorageDTO;
67
import com.sjhy.plugin.entity.TypeMapper;
@@ -14,19 +15,21 @@
1415

1516
import javax.swing.*;
1617
import javax.swing.table.TableCellEditor;
18+
import javax.swing.table.TableCellRenderer;
1719
import java.awt.*;
1820
import java.util.Arrays;
1921
import java.util.List;
2022
import java.util.Map;
2123
import java.util.function.Consumer;
24+
import java.util.stream.Stream;
2225

2326
/**
2427
* @author makejava
2528
* @version 1.0.0
2629
* @date 2021/08/07 15:33
2730
*/
2831
public class TypeMapperSettingForm implements BaseSettings {
29-
private JPanel mainPanel;
32+
private final JPanel mainPanel;
3033
/**
3134
* 类型映射配置
3235
*/
@@ -50,18 +53,22 @@ public TypeMapperSettingForm() {
5053

5154
private void initTable() {
5255
// 第一列仅适用下拉框
53-
TableCellEditor matchTypeEditor = CellEditorFactory.createComboBoxEditor(false, MatchType.class);
56+
String[] matchTypeNames = Stream.of(MatchType.values()).map(MatchType::name).toArray(String[]::new);
57+
TableCellEditor matchTypeEditor = CellEditorFactory.createComboBoxEditor(false, matchTypeNames);
58+
TableCellRenderer matchTypeRenderer = new ComboBoxTableRenderer<>(matchTypeNames);
5459
TableComponent.Column<TypeMapper> matchTypeColumn = new TableComponent.Column<>("matchType",
5560
item -> item.getMatchType() != null ? item.getMatchType().name() : MatchType.REGEX.name(),
5661
(entity, val) -> entity.setMatchType(MatchType.valueOf(val)),
57-
matchTypeEditor
62+
matchTypeEditor,
63+
matchTypeRenderer
5864
);
5965
// 第二列监听输入状态,及时修改属性值
6066
TableCellEditor columnTypeEditor = CellEditorFactory.createTextFieldEditor();
61-
TableComponent.Column<TypeMapper> columnTypeColumn = new TableComponent.Column<>("columnType", TypeMapper::getColumnType, TypeMapper::setColumnType, columnTypeEditor);
67+
TableComponent.Column<TypeMapper> columnTypeColumn = new TableComponent.Column<>("columnType", TypeMapper::getColumnType, TypeMapper::setColumnType, columnTypeEditor, null);
6268
// 第三列支持下拉框
6369
TableCellEditor javaTypeEditor = CellEditorFactory.createComboBoxEditor(true, GlobalDict.DEFAULT_JAVA_TYPE_LIST);
64-
TableComponent.Column<TypeMapper> javaTypeColumn = new TableComponent.Column<>("javaType", TypeMapper::getJavaType, TypeMapper::setJavaType, javaTypeEditor);
70+
TableCellRenderer javaTypeRenderer = new ComboBoxTableRenderer<>(GlobalDict.DEFAULT_JAVA_TYPE_LIST);
71+
TableComponent.Column<TypeMapper> javaTypeColumn = new TableComponent.Column<>("javaType", TypeMapper::getJavaType, TypeMapper::setJavaType, javaTypeEditor, javaTypeRenderer);
6572
List<TableComponent.Column<TypeMapper>> columns = Arrays.asList(matchTypeColumn, columnTypeColumn, javaTypeColumn);
6673
// 表格初始化
6774
this.tableComponent = new TableComponent<>(columns, this.currTypeMapperGroup.getElementList(), TypeMapper.class);

0 commit comments

Comments
 (0)