Skip to content

Commit a47712e

Browse files
committed
newui: 实现下载插件后立刻更新列表
1 parent 418dd1a commit a47712e

11 files changed

Lines changed: 218 additions & 103 deletions

File tree

.editorconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ indent_size = 4
77

88
[*.{html, xml, yaml, fxml}]
99
indent_size = 2
10+
11+
[*.java]
12+
ij_any_blank_lines_around_field = 1

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
<groupId>org.projectlombok</groupId>
6060
<artifactId>lombok</artifactId>
6161
<version>1.18.6</version>
62-
<scope>provided</scope>
62+
<optional>true</optional>
6363
</dependency>
6464
<!-- dom4j 需要的依赖 -->
6565
<dependency>

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

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,18 @@
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.plugin.PluginManager;
96
import com.xwintop.xJavaFxTool.services.IndexService;
107
import com.xwintop.xJavaFxTool.services.index.PluginManageService;
118
import com.xwintop.xJavaFxTool.services.index.SystemSettingService;
129
import com.xwintop.xJavaFxTool.utils.Config;
13-
import com.xwintop.xJavaFxTool.utils.XJavaFxSystemUtil;
1410
import com.xwintop.xJavaFxTool.view.IndexView;
1511
import com.xwintop.xcore.util.ConfigureUtil;
1612
import com.xwintop.xcore.util.HttpClientUtil;
1713
import com.xwintop.xcore.util.javafx.AlertUtil;
1814
import com.xwintop.xcore.util.javafx.JavaFxSystemUtil;
1915
import com.xwintop.xcore.util.javafx.JavaFxViewUtil;
20-
import java.io.File;
21-
import java.io.InputStream;
22-
import java.net.URL;
23-
import java.util.ArrayList;
24-
import java.util.Date;
25-
import java.util.HashMap;
26-
import java.util.List;
27-
import java.util.Map;
28-
import java.util.ResourceBundle;
29-
import java.util.jar.JarEntry;
30-
import java.util.jar.JarFile;
3116
import javafx.application.Platform;
3217
import javafx.event.ActionEvent;
3318
import javafx.fxml.FXML;
@@ -49,6 +34,16 @@
4934
import org.dom4j.Element;
5035
import org.dom4j.io.SAXReader;
5136

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+
5247
/**
5348
* @ClassName: IndexController
5449
* @Description: 主页
@@ -274,7 +269,6 @@ private void pluginManageAction() throws Exception {
274269
PluginManageController pluginManageController = fXMLLoader.getController();
275270
pluginManageController.setOnPluginDownloaded(jarFile -> {
276271
try {
277-
XJavaFxSystemUtil.addJarClass(jarFile);
278272
this.addToolMenu(jarFile);
279273
PluginManager.getInstance().loadLocalPlugins();
280274
} catch (Exception e) {

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

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,35 @@
11
package com.xwintop.xJavaFxTool.controller.index;
22

33
import com.xwintop.xJavaFxTool.controller.IndexController;
4+
import com.xwintop.xJavaFxTool.event.AppEvents;
5+
import com.xwintop.xJavaFxTool.event.PluginEvent;
6+
import com.xwintop.xJavaFxTool.model.PluginJarInfo;
47
import com.xwintop.xJavaFxTool.plugin.PluginManager;
58
import com.xwintop.xJavaFxTool.services.index.PluginManageService;
9+
import com.xwintop.xJavaFxTool.utils.XJavaFxSystemUtil;
610
import com.xwintop.xJavaFxTool.view.index.PluginManageView;
711
import com.xwintop.xcore.util.javafx.JavaFxViewUtil;
812
import com.xwintop.xcore.util.javafx.TooltipUtil;
9-
import java.io.File;
10-
import java.net.URL;
11-
import java.util.Map;
12-
import java.util.ResourceBundle;
13-
import java.util.function.Consumer;
1413
import javafx.collections.FXCollections;
1514
import javafx.collections.ObservableList;
1615
import javafx.collections.transformation.FilteredList;
1716
import javafx.event.ActionEvent;
1817
import javafx.fxml.FXML;
1918
import javafx.fxml.FXMLLoader;
20-
import javafx.scene.control.Button;
21-
import javafx.scene.control.ContentDisplay;
22-
import javafx.scene.control.ContextMenu;
23-
import javafx.scene.control.MenuItem;
24-
import javafx.scene.control.TableCell;
25-
import javafx.scene.control.TableColumn;
19+
import javafx.scene.control.*;
2620
import javafx.stage.Window;
2721
import javafx.util.Callback;
2822
import lombok.Getter;
2923
import lombok.Setter;
3024
import lombok.extern.slf4j.Slf4j;
3125

26+
import java.io.File;
27+
import java.io.IOException;
28+
import java.net.URL;
29+
import java.util.Map;
30+
import java.util.ResourceBundle;
31+
import java.util.function.Consumer;
32+
3233
/**
3334
* @ClassName: PluginManageController
3435
* @Description: 插件管理
@@ -96,21 +97,7 @@ protected void updateItem(String item, boolean empty) {
9697
downloadButton.setDisable(true);
9798
}
9899
this.setContentDisplay(ContentDisplay.CENTER);
99-
downloadButton.setOnMouseClicked((me) -> {
100-
try {
101-
pluginManageService.downloadPluginJar(dataRow);
102-
dataRow.put("isEnableTableColumn", "true");
103-
dataRow.put("isDownloadTableColumn", "已下载");
104-
downloadButton.setText("已下载");
105-
downloadButton.setDisable(true);
106-
pluginDataTableView.refresh();
107-
PluginManager.getInstance().saveToFile();
108-
TooltipUtil.showToast("插件 " + dataRow.get("nameTableColumn") + " 下载完成");
109-
} catch (Exception e) {
110-
log.error("下载插件失败:", e);
111-
TooltipUtil.showToast("下载插件失败:" + e.getMessage());
112-
}
113-
});
100+
downloadButton.setOnMouseClicked(event -> downloadPlugin(dataRow, downloadButton));
114101
this.setGraphic(downloadButton);
115102
}
116103
}
@@ -121,6 +108,35 @@ protected void updateItem(String item, boolean empty) {
121108
pluginDataTableView.setItems(pluginDataTableData);
122109
}
123110

111+
private void downloadPlugin(Map<String, String> dataRow, Button downloadButton) {
112+
try {
113+
PluginJarInfo pluginJarInfo = pluginManageService.downloadPluginJar(dataRow);
114+
afterDownload(dataRow, downloadButton, pluginJarInfo);
115+
} catch (Exception e) {
116+
log.error("下载插件失败:", e);
117+
TooltipUtil.showToast("下载插件失败:" + e.getMessage());
118+
}
119+
}
120+
121+
private void afterDownload(
122+
Map<String, String> dataRow, Button downloadButton, PluginJarInfo pluginJarInfo
123+
) throws IOException {
124+
125+
dataRow.put("isEnableTableColumn", "true");
126+
dataRow.put("isDownloadTableColumn", "已下载");
127+
128+
downloadButton.setText("已下载");
129+
downloadButton.setDisable(true);
130+
131+
XJavaFxSystemUtil.addJarClass(pluginJarInfo.getFile());
132+
133+
pluginDataTableView.refresh();
134+
PluginManager.getInstance().saveToFile();
135+
TooltipUtil.showToast("插件 " + dataRow.get("nameTableColumn") + " 下载完成");
136+
137+
AppEvents.fire(new PluginEvent(PluginEvent.PLUGIN_DOWNLOADED, pluginJarInfo));
138+
}
139+
124140
private void initEvent() {
125141

126142
// 右键菜单
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.xwintop.xJavaFxTool.event;
2+
3+
import javafx.event.Event;
4+
import javafx.event.EventTarget;
5+
import javafx.event.EventType;
6+
7+
public abstract class AppEvent extends Event {
8+
public AppEvent(EventType<? extends Event> eventType) {
9+
super(eventType);
10+
}
11+
12+
public AppEvent(Object source, EventTarget target, EventType<? extends Event> eventType) {
13+
super(source, target, eventType);
14+
}
15+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.xwintop.xJavaFxTool.event;
2+
3+
import javafx.event.EventType;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.concurrent.ConcurrentHashMap;
9+
import java.util.function.Consumer;
10+
11+
/**
12+
* 应用全局事件注册和触发
13+
*/
14+
@SuppressWarnings({"unchecked", "rawtypes"})
15+
public class AppEvents {
16+
17+
private static final AppEvents instance = new AppEvents();
18+
19+
/**
20+
* 触发事件
21+
*
22+
* @param appEvent 事件对象
23+
*/
24+
public static void fire(AppEvent appEvent) {
25+
List<Consumer> handlers = instance.listeners.get(appEvent.getEventType());
26+
for (Consumer handler : handlers) {
27+
handler.accept(appEvent);
28+
}
29+
}
30+
31+
/**
32+
* 注册事件侦听
33+
*
34+
* @param eventType 事件类型
35+
* @param handler 侦听器
36+
* @param <T> 事件对象类型
37+
*/
38+
public static <T extends AppEvent> void addEventHandler(EventType<T> eventType, Consumer<T> handler) {
39+
instance.listeners.computeIfAbsent(eventType, __ -> new ArrayList<>()).add(handler);
40+
}
41+
42+
private final Map<EventType, List<Consumer>> listeners = new ConcurrentHashMap<>();
43+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.xwintop.xJavaFxTool.event;
2+
3+
import com.xwintop.xJavaFxTool.model.PluginJarInfo;
4+
import javafx.event.Event;
5+
import javafx.event.EventType;
6+
7+
public class PluginEvent extends AppEvent {
8+
9+
public static final EventType<PluginEvent> PLUGIN_DOWNLOADED = new EventType<>(Event.ANY, "PLUGIN_DOWNLOADED");
10+
11+
private final PluginJarInfo pluginJarInfo;
12+
13+
public PluginEvent(EventType<PluginEvent> eventType, PluginJarInfo pluginJarInfo) {
14+
super(eventType);
15+
this.pluginJarInfo = pluginJarInfo;
16+
}
17+
18+
public PluginJarInfo getPluginJarInfo() {
19+
return pluginJarInfo;
20+
}
21+
}

src/main/java/com/xwintop/xJavaFxTool/newui/NewLauncherController.java

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,37 @@
33
import com.xwintop.xJavaFxTool.Main;
44
import com.xwintop.xJavaFxTool.controller.IndexController;
55
import com.xwintop.xJavaFxTool.controller.index.PluginManageController;
6+
import com.xwintop.xJavaFxTool.event.AppEvents;
7+
import com.xwintop.xJavaFxTool.event.PluginEvent;
68
import com.xwintop.xJavaFxTool.model.PluginJarInfo;
79
import com.xwintop.xJavaFxTool.newui.creator.CreatePluginProjectService;
810
import com.xwintop.xJavaFxTool.newui.creator.PluginProjectInfo;
911
import com.xwintop.xJavaFxTool.plugin.PluginManager;
12+
import com.xwintop.xJavaFxTool.plugin.PluginParser;
1013
import com.xwintop.xJavaFxTool.services.index.SystemSettingService;
1114
import com.xwintop.xcore.javafx.FxApp;
1215
import com.xwintop.xcore.javafx.dialog.FxAlerts;
1316
import com.xwintop.xcore.javafx.dialog.FxDialog;
1417
import com.xwintop.xcore.util.javafx.JavaFxViewUtil;
15-
import java.awt.Desktop;
16-
import java.io.File;
17-
import java.io.IOException;
18-
import java.net.URI;
19-
import java.util.ArrayList;
20-
import java.util.HashMap;
21-
import java.util.List;
22-
import java.util.Map;
23-
import java.util.ResourceBundle;
2418
import javafx.beans.Observable;
2519
import javafx.fxml.FXMLLoader;
2620
import javafx.scene.Parent;
27-
import javafx.scene.control.ButtonType;
28-
import javafx.scene.control.CheckMenuItem;
29-
import javafx.scene.control.ContextMenu;
30-
import javafx.scene.control.Hyperlink;
31-
import javafx.scene.control.TabPane;
3221
import javafx.scene.control.TextField;
22+
import javafx.scene.control.*;
3323
import javafx.scene.layout.VBox;
3424
import javafx.scene.web.WebView;
3525
import lombok.extern.slf4j.Slf4j;
3626
import org.apache.commons.lang3.StringUtils;
3727

28+
import java.awt.*;
29+
import java.io.File;
30+
import java.io.IOException;
31+
import java.net.URI;
32+
import java.util.ArrayList;
33+
import java.util.HashMap;
34+
import java.util.List;
35+
import java.util.Map;
36+
3837
@Slf4j
3938
public class NewLauncherController {
4039

@@ -55,12 +54,22 @@ public class NewLauncherController {
5554
// 实现搜索用
5655
private final List<PluginItemController> pluginItemControllers = new ArrayList<>();
5756

57+
private final Map<String, PluginCategoryController> categoryControllers = new HashMap<>();
58+
5859
public void initialize() {
5960
NewLauncherService.getInstance().setController(this);
6061
txtSearch.textProperty().addListener(this::onSearchKeywordChanged);
62+
6163
initContextMenu();
6264
loadPlugins(); // 加载插件列表到界面上
65+
6366
startWebView.getEngine().load(IndexController.QQ_URL); // 额外再打开一个反馈页面,可关闭
67+
68+
AppEvents.addEventHandler(PluginEvent.PLUGIN_DOWNLOADED, pluginEvent -> {
69+
PluginJarInfo pluginJarInfo = pluginEvent.getPluginJarInfo();
70+
PluginParser.parse(pluginJarInfo.getFile(), pluginJarInfo);
71+
loadPlugins();
72+
});
6473
}
6574

6675
private void initContextMenu() {
@@ -101,35 +110,34 @@ private void loadPlugins() {
101110

102111
this.pluginCategories.getChildren().clear();
103112
this.pluginItemControllers.clear();
113+
this.categoryControllers.clear();
104114

105115
List<PluginJarInfo> pluginList = PluginManager.getInstance().getPluginList();
106-
ResourceBundle menuResourceBundle = Main.RESOURCE_BUNDLE;
107-
108-
Map<String, PluginCategoryController> categoryControllers = new HashMap<>();
116+
pluginList.forEach(this::loadPlugin);
117+
}
109118

110-
for (PluginJarInfo jarInfo : pluginList) {
111-
String menuParentTitle = jarInfo.getMenuParentTitle();
112-
if (menuParentTitle != null) {
119+
public void loadPlugin(PluginJarInfo jarInfo) {
120+
String menuParentTitle = jarInfo.getMenuParentTitle();
121+
if (menuParentTitle != null) {
113122

114-
String categoryName = jarInfo.getIsFavorite() ?
115-
FAVORITE_CATEGORY_NAME : menuResourceBundle.getString(menuParentTitle);
123+
String categoryName = jarInfo.getIsFavorite() ?
124+
FAVORITE_CATEGORY_NAME : Main.RESOURCE_BUNDLE.getString(menuParentTitle);
116125

117-
PluginCategoryController category = categoryControllers.computeIfAbsent(
118-
categoryName, __ -> {
119-
PluginCategoryController _category =
120-
PluginCategoryController.newInstance(categoryName);
121-
addCategory(_category);
122-
return _category;
123-
}
124-
);
126+
PluginCategoryController category = categoryControllers.computeIfAbsent(
127+
categoryName, __ -> {
128+
PluginCategoryController _category =
129+
PluginCategoryController.newInstance(categoryName);
130+
addCategory(_category);
131+
return _category;
132+
}
133+
);
125134

126-
PluginItemController item = PluginItemController.newInstance(jarInfo);
127-
item.setContextMenu(itemContextMenu);
128-
category.addItem(item);
135+
PluginItemController item = PluginItemController.newInstance(jarInfo);
136+
item.setContextMenu(itemContextMenu);
137+
category.addItem(item);
129138

130-
if (!pluginItemControllers.contains(item)) {
131-
pluginItemControllers.add(item);
132-
}
139+
if (!pluginItemControllers.contains(item)) {
140+
pluginItemControllers.add(item);
133141
}
134142
}
135143
}

0 commit comments

Comments
 (0)