Skip to content

Commit fd6ba53

Browse files
committed
newui:实现读取已下载的插件并显示在主界面上
1 parent 332ef98 commit fd6ba53

8 files changed

Lines changed: 114 additions & 61 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@
44
/xJavaFxTool.iml
55
/logs
66
/target
7+
8+
libs/
9+
system_plugin_list.json

src/main/java/com/xwintop/xJavaFxTool/controller/IndexController.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.xwintop.xJavaFxTool.controller;
22

3-
import static com.xwintop.xJavaFxTool.Main.RESOURCE_BUNDLE;
4-
import static com.xwintop.xJavaFxTool.utils.Config.Keys.NotepadEnabled;
5-
63
import com.xwintop.xJavaFxTool.controller.index.PluginManageController;
74
import com.xwintop.xJavaFxTool.model.ToolFxmlLoaderConfiguration;
85
import com.xwintop.xJavaFxTool.services.IndexService;
@@ -16,17 +13,6 @@
1613
import com.xwintop.xcore.util.javafx.AlertUtil;
1714
import com.xwintop.xcore.util.javafx.JavaFxSystemUtil;
1815
import com.xwintop.xcore.util.javafx.JavaFxViewUtil;
19-
import java.io.File;
20-
import java.io.InputStream;
21-
import java.net.URL;
22-
import java.util.ArrayList;
23-
import java.util.Date;
24-
import java.util.HashMap;
25-
import java.util.List;
26-
import java.util.Map;
27-
import java.util.ResourceBundle;
28-
import java.util.jar.JarEntry;
29-
import java.util.jar.JarFile;
3016
import javafx.application.Platform;
3117
import javafx.event.ActionEvent;
3218
import javafx.fxml.FXML;
@@ -48,6 +34,16 @@
4834
import org.dom4j.Element;
4935
import org.dom4j.io.SAXReader;
5036

37+
import java.io.File;
38+
import java.io.InputStream;
39+
import java.net.URL;
40+
import java.util.*;
41+
import java.util.jar.JarEntry;
42+
import java.util.jar.JarFile;
43+
44+
import static com.xwintop.xJavaFxTool.Main.RESOURCE_BUNDLE;
45+
import static com.xwintop.xJavaFxTool.utils.Config.Keys.NotepadEnabled;
46+
5147
/**
5248
* @ClassName: IndexController
5349
* @Description: 主页
@@ -272,7 +268,13 @@ private void pluginManageAction() throws Exception {
272268
FXMLLoader fXMLLoader = PluginManageController.getFXMLLoader();
273269
Parent root = fXMLLoader.load();
274270
PluginManageController pluginManageController = fXMLLoader.getController();
275-
pluginManageController.setIndexController(this);
271+
pluginManageController.setOnPluginDownloaded(jarFile -> {
272+
try {
273+
this.addToolMenu(jarFile);
274+
} catch (Exception e) {
275+
log.error("加载工具出错:", e);
276+
}
277+
});
276278
JavaFxViewUtil.openNewWindow(bundle.getString("plugin_manage"), root);
277279
}
278280

src/main/java/com/xwintop/xJavaFxTool/controller/index/PluginManageController.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,24 @@
66
import com.xwintop.xJavaFxTool.view.index.PluginManageView;
77
import com.xwintop.xcore.util.javafx.JavaFxViewUtil;
88
import com.xwintop.xcore.util.javafx.TooltipUtil;
9-
import java.net.URL;
10-
import java.util.Map;
11-
import java.util.ResourceBundle;
129
import javafx.collections.FXCollections;
1310
import javafx.collections.ObservableList;
1411
import javafx.collections.transformation.FilteredList;
1512
import javafx.event.ActionEvent;
1613
import javafx.fxml.FXML;
1714
import javafx.fxml.FXMLLoader;
18-
import javafx.scene.control.Button;
19-
import javafx.scene.control.ContentDisplay;
20-
import javafx.scene.control.ContextMenu;
21-
import javafx.scene.control.MenuItem;
22-
import javafx.scene.control.TableCell;
23-
import javafx.scene.control.TableColumn;
15+
import javafx.scene.control.*;
2416
import javafx.util.Callback;
2517
import lombok.Getter;
2618
import lombok.Setter;
2719
import lombok.extern.slf4j.Slf4j;
2820

21+
import java.io.File;
22+
import java.net.URL;
23+
import java.util.Map;
24+
import java.util.ResourceBundle;
25+
import java.util.function.Consumer;
26+
2927
/**
3028
* @ClassName: PluginManageController
3129
* @Description: 插件管理
@@ -46,8 +44,6 @@ public class PluginManageController extends PluginManageView {
4644

4745
private FilteredList<Map<String, String>> pluginDataTableData = new FilteredList<>(originPluginData, m -> true);
4846

49-
private IndexController indexController;
50-
5147
public static FXMLLoader getFXMLLoader() {
5248
return new FXMLLoader(IndexController.class.getResource(FXML));
5349
}
@@ -59,15 +55,18 @@ public void initialize(URL location, ResourceBundle resources) {
5955
initService();
6056
}
6157

58+
public void setOnPluginDownloaded(Consumer<File> onPluginDownloaded) {
59+
this.pluginManageService.setOnPluginDownloaded(onPluginDownloaded);
60+
}
61+
6262
private void initView() {
6363
JavaFxViewUtil.setTableColumnMapValueFactory(nameTableColumn, "nameTableColumn");
6464
JavaFxViewUtil.setTableColumnMapValueFactory(synopsisTableColumn, "synopsisTableColumn");
6565
JavaFxViewUtil.setTableColumnMapValueFactory(versionTableColumn, "versionTableColumn");
6666
JavaFxViewUtil.setTableColumnMapValueFactory(isDownloadTableColumn, "isDownloadTableColumn");
6767
JavaFxViewUtil.setTableColumnMapAsCheckBoxValueFactory(isEnableTableColumn, "isEnableTableColumn",
68-
(mouseEvent, index) -> {
69-
pluginManageService.setIsEnableTableColumn(index);
70-
});
68+
(mouseEvent, index) -> pluginManageService.setIsEnableTableColumn(index)
69+
);
7170

7271
// TODO 实现插件的启用禁用
7372

src/main/java/com/xwintop/xJavaFxTool/model/PluginJarInfo.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.xwintop.xJavaFxTool.model;
22

3+
import com.alibaba.fastjson.annotation.JSONField;
34
import lombok.Data;
45

6+
import java.io.File;
7+
58
/**
69
* 插件信息
710
*
@@ -55,4 +58,10 @@ public class PluginJarInfo {
5558

5659
private String controllerType = "Node"; // 内容类型(Node/WebView)
5760

61+
////////////////////////////////////////////////////////////
62+
63+
@JSONField(serialize = false)
64+
public File getFile() {
65+
return new File("libs/", getJarName() + "-" + getVersion() + ".jar");
66+
}
5867
}
Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
package com.xwintop.xJavaFxTool.newui;
22

33
import com.xwintop.xJavaFxTool.Main;
4+
import com.xwintop.xJavaFxTool.controller.index.PluginManageController;
45
import com.xwintop.xJavaFxTool.model.PluginJarInfo;
56
import com.xwintop.xJavaFxTool.plugin.PluginManager;
67
import com.xwintop.xJavaFxTool.services.index.SystemSettingService;
8+
import com.xwintop.xcore.javafx.dialog.FxAlerts;
9+
import com.xwintop.xcore.util.javafx.JavaFxViewUtil;
10+
import javafx.fxml.FXMLLoader;
11+
import javafx.scene.Parent;
712
import javafx.scene.layout.VBox;
813
import lombok.extern.slf4j.Slf4j;
914

15+
import java.io.IOException;
16+
import java.util.HashMap;
1017
import java.util.List;
18+
import java.util.Map;
1119
import java.util.ResourceBundle;
1220

1321
@Slf4j
@@ -19,37 +27,46 @@ public void openConfigDialog() {
1927
SystemSettingService.openSystemSettings("设置");
2028
}
2129

30+
public void openPluginManager() {
31+
try {
32+
FXMLLoader fXMLLoader = PluginManageController.getFXMLLoader();
33+
Parent root = fXMLLoader.load();
34+
JavaFxViewUtil.openNewWindow(Main.RESOURCE_BUNDLE.getString("plugin_manage"), root);
35+
} catch (IOException e) {
36+
FxAlerts.error("打开插件管理对话框失败", e);
37+
}
38+
}
39+
2240
public void initialize() {
2341

2442
List<PluginJarInfo> pluginList = PluginManager.getInstance().getPluginList();
2543
ResourceBundle menuResourceBundle = Main.RESOURCE_BUNDLE;
2644

45+
Map<String, PluginCategoryController> categoryControllers = new HashMap<>();
46+
2747
for (PluginJarInfo jarInfo : pluginList) {
28-
String parentId = jarInfo.getMenuParentId();
29-
if (parentId.startsWith("p-")) {
30-
parentId = parentId.substring(2);
31-
String categoryName = menuResourceBundle.getString(parentId);
32-
String pluginName = jarInfo.getName();
33-
log.info("plugin: {} - {}", categoryName, pluginName);
34-
}
35-
}
48+
String menuParentTitle = jarInfo.getMenuParentTitle();
49+
if (menuParentTitle != null) {
3650

37-
for (int i = 0; i < 5; i++) {
38-
PluginCategoryController category = PluginCategoryController.newInstance("最近使用");
39-
addCategory(category);
51+
String categoryName = menuResourceBundle.getString(menuParentTitle);
52+
String pluginName = jarInfo.getName();
4053

41-
for (int j = 0; j < 10; j++) {
42-
PluginItemController item =
43-
PluginItemController.newInstance("临时记事本");
54+
PluginCategoryController category = categoryControllers.computeIfAbsent(
55+
categoryName, __ -> {
56+
PluginCategoryController _category =
57+
PluginCategoryController.newInstance(categoryName);
58+
addCategory(_category);
59+
return _category;
60+
}
61+
);
4462

63+
PluginItemController item = PluginItemController.newInstance(pluginName);
4564
category.addItem(item);
4665
}
47-
4866
}
4967
}
5068

5169
private void addCategory(PluginCategoryController category) {
5270
this.pluginCategories.getChildren().add(category.root);
5371
}
54-
5572
}

src/main/java/com/xwintop/xJavaFxTool/plugin/PluginManager.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import cn.hutool.http.HttpUtil;
44
import com.alibaba.fastjson.JSON;
55
import com.xwintop.xJavaFxTool.model.PluginJarInfo;
6+
import com.xwintop.xcore.javafx.dialog.FxAlerts;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.apache.commons.lang.StringUtils;
9+
610
import java.io.File;
711
import java.io.IOException;
812
import java.nio.charset.Charset;
@@ -16,8 +20,6 @@
1620
import java.util.Objects;
1721
import java.util.concurrent.CompletableFuture;
1822
import java.util.function.Consumer;
19-
import lombok.extern.slf4j.Slf4j;
20-
import org.apache.commons.lang.StringUtils;
2123

2224
@Slf4j
2325
public class PluginManager {
@@ -76,6 +78,16 @@ public void loadLocalPlugins() {
7678
exist.setIsEnable(plugin.getIsEnable());
7779
});
7880
});
81+
82+
this.pluginList.forEach(plugin -> {
83+
if (plugin.getIsDownload() != null && plugin.getIsDownload()) {
84+
try {
85+
PluginParser.parse(plugin.getFile(), plugin);
86+
} catch (Exception e) {
87+
FxAlerts.error("解析本地插件文件失败", e);
88+
}
89+
}
90+
});
7991
} catch (IOException e) {
8092
log.error("读取插件配置失败", e);
8193
}
@@ -103,7 +115,14 @@ public CompletableFuture<Void> loadServerPluginsAsync() {
103115
return CompletableFuture.runAsync(this::loadServerPlugins);
104116
}
105117

106-
private void addOrUpdatePlugin(PluginJarInfo pluginJarInfo, Consumer<PluginJarInfo> ifExists) {
118+
/**
119+
* 向插件列表添加插件信息或更改插件列表中已有的插件信息
120+
*
121+
* @param pluginJarInfo 需要添加的插件信息
122+
* @param ifExists 如果插件已存在,则不会将 pluginJarInfo 加入,
123+
* 而是提供已有的插件信息对象供调用者更新其属性
124+
*/
125+
private void addOrUpdatePlugin(PluginJarInfo pluginJarInfo, Consumer<PluginJarInfo> ifExists) {
107126
PluginJarInfo exists = getPlugin(pluginJarInfo.getJarName());
108127
if (exists == null) {
109128
this.pluginList.add(pluginJarInfo);
@@ -120,7 +139,7 @@ public File downloadPlugin(PluginJarInfo pluginJarInfo) throws IOException {
120139
throw new IllegalStateException("没有找到插件 " + pluginJarInfo.getJarName());
121140
}
122141

123-
File file = new File("libs/", pluginJarInfo.getJarName() + "-" + pluginJarInfo.getVersion() + ".jar");
142+
File file = pluginJarInfo.getFile();
124143
HttpUtil.downloadFile(pluginJarInfo.getDownloadUrl(), file);
125144

126145
plugin.setIsDownload(true);

src/main/java/com/xwintop/xJavaFxTool/services/index/PluginManageService.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package com.xwintop.xJavaFxTool.services.index;
22

3-
import static org.apache.commons.lang3.StringUtils.substringBeforeLast;
4-
53
import com.xwintop.xJavaFxTool.controller.index.PluginManageController;
64
import com.xwintop.xJavaFxTool.model.PluginJarInfo;
75
import com.xwintop.xJavaFxTool.plugin.PluginManager;
8-
import java.io.File;
9-
import java.util.HashMap;
10-
import java.util.Map;
116
import lombok.Getter;
127
import lombok.Setter;
138
import lombok.extern.slf4j.Slf4j;
149
import org.apache.commons.lang3.StringUtils;
1510

11+
import java.io.File;
12+
import java.util.HashMap;
13+
import java.util.Map;
14+
import java.util.function.Consumer;
15+
16+
import static org.apache.commons.lang3.StringUtils.substringBeforeLast;
17+
1618
/**
17-
* @ClassName: PluginManageService
18-
* @Description: 插件管理
19-
* @author: xufeng
20-
* @date: 2020/1/19 17:41
19+
* 插件管理
20+
*
21+
* @author xufeng
2122
*/
22-
2323
@Getter
2424
@Setter
2525
@Slf4j
@@ -33,6 +33,8 @@ public class PluginManageService {
3333

3434
private PluginManager pluginManager = PluginManager.getInstance();
3535

36+
private Consumer<File> onPluginDownloaded;
37+
3638
public PluginManageService(PluginManageController pluginManageController) {
3739
this.pluginManageController = pluginManageController;
3840
}
@@ -80,8 +82,9 @@ public void downloadPluginJar(Map<String, String> dataRow) throws Exception {
8082
pluginJarInfo.setIsEnable(true);
8183

8284
File file = pluginManager.downloadPlugin(pluginJarInfo);
83-
84-
pluginManageController.getIndexController().addToolMenu(file);
85+
if (onPluginDownloaded != null) {
86+
onPluginDownloaded.accept(file);
87+
}
8588
}
8689

8790
public void setIsEnableTableColumn(Integer index) {

src/main/resources/com/xwintop/xJavaFxTool/fxmlView/newui/main.fxml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<TextField prefWidth="200" styleClass="search-text"/>
2525
<Pane HBox.hgrow="ALWAYS"/>
2626
<Hyperlink onAction="#openConfigDialog" text="设置"/>
27+
<Hyperlink onAction="#openPluginManager" text="插件管理"/>
2728
</HBox>
2829
<VBox fx:id="pluginCategories" alignment="TOP_CENTER">
2930
</VBox>

0 commit comments

Comments
 (0)