Skip to content

Commit 23b3d71

Browse files
committed
newui: 实现插件置顶操作;修复加载和解析 jar 的顺序问题
1 parent a86e37f commit 23b3d71

11 files changed

Lines changed: 165 additions & 40 deletions

File tree

src/main/java/com/xwintop/xJavaFxTool/Main.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ public class Main extends Application {
3838
private static Stage stage;
3939

4040
public static void main(String[] args) {
41+
42+
XJavaFxSystemUtil.initSystemLocal(); // 初始化本地语言
43+
XJavaFxSystemUtil.addJarByLibs(); // 添加外部jar包
44+
4145
launch(args);
4246
}
4347

@@ -50,9 +54,6 @@ public void start(Stage primaryStage) throws Exception {
5054
FxApp.setupIcon(primaryStage);
5155
FxApp.styleSheets.add(Main.class.getResource("/css/jfoenix-main.css").toExternalForm());
5256

53-
XJavaFxSystemUtil.initSystemLocal();//初始化本地语言
54-
XJavaFxSystemUtil.addJarByLibs();//添加外部jar包
55-
5657
primaryStage.setResizable(true);
5758
primaryStage.setTitle(RESOURCE_BUNDLE.getString("Title") + Config.xJavaFxToolVersions);
5859
primaryStage.setOnCloseRequest(this::confirmExit);

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

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
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+
36
import com.xwintop.xJavaFxTool.controller.index.PluginManageController;
47
import com.xwintop.xJavaFxTool.model.ToolFxmlLoaderConfiguration;
58
import com.xwintop.xJavaFxTool.services.IndexService;
69
import com.xwintop.xJavaFxTool.services.index.PluginManageService;
710
import com.xwintop.xJavaFxTool.services.index.SystemSettingService;
811
import com.xwintop.xJavaFxTool.utils.Config;
9-
import com.xwintop.xJavaFxTool.utils.XJavaFxSystemUtil;
1012
import com.xwintop.xJavaFxTool.view.IndexView;
1113
import com.xwintop.xcore.util.ConfigureUtil;
1214
import com.xwintop.xcore.util.HttpClientUtil;
1315
import com.xwintop.xcore.util.javafx.AlertUtil;
1416
import com.xwintop.xcore.util.javafx.JavaFxSystemUtil;
1517
import com.xwintop.xcore.util.javafx.JavaFxViewUtil;
18+
import java.io.File;
19+
import java.io.InputStream;
20+
import java.net.URL;
21+
import java.util.ArrayList;
22+
import java.util.Date;
23+
import java.util.HashMap;
24+
import java.util.List;
25+
import java.util.Map;
26+
import java.util.ResourceBundle;
27+
import java.util.jar.JarEntry;
28+
import java.util.jar.JarFile;
1629
import javafx.application.Platform;
1730
import javafx.event.ActionEvent;
1831
import javafx.fxml.FXML;
@@ -34,16 +47,6 @@
3447
import org.dom4j.Element;
3548
import org.dom4j.io.SAXReader;
3649

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-
4750
/**
4851
* @ClassName: IndexController
4952
* @Description: 主页
@@ -122,7 +125,6 @@ private void initService() {
122125
}
123126

124127
public void addToolMenu(File file) throws Exception {
125-
XJavaFxSystemUtil.addJarClass(file);
126128
Map<String, ToolFxmlLoaderConfiguration> toolMap = new HashMap<>();
127129
List<ToolFxmlLoaderConfiguration> toolList = new ArrayList<>();
128130

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public class PluginJarInfo {
3333

3434
private Boolean isEnable; // 是否启用
3535

36+
private Boolean isFavorite; // 是否置顶
37+
3638
private Integer localVersionNumber; // 插件本地版本
3739

3840
///////////////////////////////////////// 下面的属性来自插件描述文件 toolFxmlLoaderConfiguration.xml
@@ -59,6 +61,12 @@ public class PluginJarInfo {
5961

6062
////////////////////////////////////////////////////////////
6163

64+
public boolean getIsFavorite() {
65+
return this.isFavorite != null && this.isFavorite;
66+
}
67+
68+
////////////////////////////////////////////////////////////
69+
6270
@JSONField(serialize = false)
6371
public File getFile() {
6472
return new File("libs/", getJarName() + "-" + getVersion() + ".jar");

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

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import javafx.beans.Observable;
1818
import javafx.fxml.FXMLLoader;
1919
import javafx.scene.Parent;
20+
import javafx.scene.control.CheckMenuItem;
21+
import javafx.scene.control.ContextMenu;
2022
import javafx.scene.control.TabPane;
2123
import javafx.scene.control.TextField;
2224
import javafx.scene.layout.VBox;
@@ -27,6 +29,8 @@
2729
@Slf4j
2830
public class NewLauncherController {
2931

32+
public static final String FAVORITE_CATEGORY_NAME = "置顶";
33+
3034
public VBox pluginCategories;
3135

3236
public WebView startWebView;
@@ -35,24 +39,58 @@ public class NewLauncherController {
3539

3640
public TextField txtSearch;
3741

42+
private ContextMenu itemContextMenu;
43+
3844
// 实现搜索用
3945
private List<PluginItemController> pluginItemControllers = new ArrayList<>();
4046

4147
public void initialize() {
4248
NewLauncherService.getInstance().setController(this);
4349
txtSearch.textProperty().addListener(this::onSearchKeywordChanged);
50+
initContextMenu();
4451
loadPlugins(); // 加载插件列表到界面上
4552
startWebView.getEngine().load(IndexController.QQ_URL); // 额外再打开一个反馈页面,可关闭
4653
}
4754

55+
private void initContextMenu() {
56+
CheckMenuItem chkFavorite = new CheckMenuItem("置顶");
57+
chkFavorite.setStyle("-fx-padding: 0 35 0 0");
58+
59+
this.itemContextMenu = new ContextMenu(chkFavorite);
60+
61+
chkFavorite.setOnAction(event -> {
62+
CheckMenuItem _this = (CheckMenuItem) event.getSource();
63+
PluginItemController pluginItemController =
64+
NewLauncherService.getInstance().getCurrentPluginItem();
65+
setFavorite(pluginItemController, _this.isSelected());
66+
});
67+
}
68+
4869
public void onSearchKeywordChanged(Observable ob, String _old, String keyword) {
4970
boolean notSearching = StringUtils.isBlank(keyword);
5071
pluginItemControllers.forEach(itemController -> {
5172
itemController.setVisible(notSearching || itemController.matchKeyword(keyword));
5273
});
5374
}
5475

76+
private void setFavorite(PluginItemController itemController, boolean isFavorite) {
77+
if (itemController == null) {
78+
return;
79+
}
80+
81+
itemController.getPluginJarInfo().setIsFavorite(isFavorite);
82+
PluginManager.getInstance().saveToFileQuietly();
83+
loadPlugins();
84+
}
85+
86+
/**
87+
* 加载/刷新插件列表
88+
*/
5589
private void loadPlugins() {
90+
91+
this.pluginCategories.getChildren().clear();
92+
this.pluginItemControllers.clear();
93+
5694
List<PluginJarInfo> pluginList = PluginManager.getInstance().getPluginList();
5795
ResourceBundle menuResourceBundle = Main.RESOURCE_BUNDLE;
5896

@@ -61,7 +99,10 @@ private void loadPlugins() {
6199
for (PluginJarInfo jarInfo : pluginList) {
62100
String menuParentTitle = jarInfo.getMenuParentTitle();
63101
if (menuParentTitle != null) {
64-
String categoryName = menuResourceBundle.getString(menuParentTitle);
102+
103+
String categoryName = jarInfo.getIsFavorite()?
104+
FAVORITE_CATEGORY_NAME : menuResourceBundle.getString(menuParentTitle);
105+
65106
PluginCategoryController category = categoryControllers.computeIfAbsent(
66107
categoryName, __ -> {
67108
PluginCategoryController _category =
@@ -72,6 +113,7 @@ private void loadPlugins() {
72113
);
73114

74115
PluginItemController item = PluginItemController.newInstance(jarInfo);
116+
item.setContextMenu(itemContextMenu);
75117
category.addItem(item);
76118

77119
if (!pluginItemControllers.contains(item)) {
@@ -82,7 +124,11 @@ private void loadPlugins() {
82124
}
83125

84126
private void addCategory(PluginCategoryController category) {
85-
this.pluginCategories.getChildren().add(category.root);
127+
if (category.lblCategoryName.getText().equals(FAVORITE_CATEGORY_NAME)) {
128+
this.pluginCategories.getChildren().add(0, category.root);
129+
} else {
130+
this.pluginCategories.getChildren().add(category.root);
131+
}
86132
}
87133

88134
public TabPane getTabPane() {

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public class NewLauncherService {
1919

2020
private Map<Tab, PluginJarInfo> jarInfoMap = new HashMap<>();
2121

22+
private PluginItemController currentPluginItem;
23+
2224
public static NewLauncherService getInstance() {
2325
return instance;
2426
}
@@ -31,6 +33,14 @@ public void setController(NewLauncherController newLauncherController) {
3133
this.newLauncherController = newLauncherController;
3234
}
3335

36+
public void setCurrentPluginItem(PluginItemController currentPluginItem) {
37+
this.currentPluginItem = currentPluginItem;
38+
}
39+
40+
public PluginItemController getCurrentPluginItem() {
41+
return currentPluginItem;
42+
}
43+
3444
public void loadPlugin(PluginJarInfo pluginJarInfo) {
3545
TabPane tabPane = this.newLauncherController.getTabPane();
3646

@@ -46,4 +56,6 @@ public void loadPlugin(PluginJarInfo pluginJarInfo) {
4656
jarInfoMap.put(tab, pluginJarInfo);
4757
}
4858
}
59+
60+
4961
}

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import com.xwintop.xcore.javafx.helper.FxmlHelper;
66
import java.net.URL;
77
import javafx.fxml.FXMLLoader;
8+
import javafx.scene.control.CheckMenuItem;
9+
import javafx.scene.control.ContextMenu;
810
import javafx.scene.control.Label;
911
import javafx.scene.image.Image;
1012
import javafx.scene.image.ImageView;
@@ -29,6 +31,8 @@ public static PluginItemController newInstance(PluginJarInfo pluginJarInfo) {
2931

3032
private PluginJarInfo pluginJarInfo;
3133

34+
private ContextMenu contextMenu;
35+
3236
public Label pluginName;
3337

3438
public VBox root;
@@ -49,7 +53,10 @@ public void initialize() {
4953
}
5054

5155
private void onMouseRightClicked(MouseEvent event) {
52-
56+
NewLauncherService.getInstance().setCurrentPluginItem(this);
57+
CheckMenuItem chkFavorite = (CheckMenuItem) this.contextMenu.getItems().get(0);
58+
chkFavorite.setSelected(this.pluginJarInfo.getIsFavorite());
59+
this.contextMenu.show(this.root, event.getScreenX(), event.getScreenY());
5360
}
5461

5562
private void onMouseLeftClicked(MouseEvent event) {
@@ -72,12 +79,20 @@ private void updateIcon() {
7279
}
7380
}
7481

82+
public void setContextMenu(ContextMenu contextMenu) {
83+
this.contextMenu = contextMenu;
84+
}
85+
7586
private void setPluginInfo(PluginJarInfo pluginJarInfo) {
7687
this.pluginJarInfo = pluginJarInfo;
7788
this.pluginName.setText(pluginJarInfo.getName());
7889
updateIcon();
7990
}
8091

92+
public PluginJarInfo getPluginJarInfo() {
93+
return pluginJarInfo;
94+
}
95+
8196
public boolean matchKeyword(String keyword) {
8297
return this.pluginJarInfo.getName().toLowerCase().contains(keyword.toLowerCase());
8398
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ public static Tab loadPluginAsTab(PluginJarInfo plugin, TabPane tabPane) {
5656
tab.setGraphic(imageView);
5757
}
5858

59-
tab.setText(plugin.getName());
6059
tab.setContent(generatingCodeFXMLLoader.load());
6160
tabPane.getTabs().add(tab);
6261
tabPane.getSelectionModel().select(tab);

0 commit comments

Comments
 (0)