♻️ 重构代码 重构顶部菜单栏管理类,减少耦合方便扩展 🐛 修复 BUG 修复重复点击设置按钮导致重复创建设置页面

This commit is contained in:
gewuyou 2023-10-04 18:25:31 +08:00
parent 9e239a9756
commit 8608ad6e75
54 changed files with 669 additions and 397 deletions

2
.gitignore vendored
View File

@ -15,7 +15,7 @@ test/
### 此处排除证书目录
certificate/
### 此处排除项目文件
### 此处排除项目文件
.jnotepad/
### Eclipse ###

View File

@ -29,8 +29,8 @@ module org.jcnc.jnotepad {
exports org.jcnc.jnotepad.controller.manager;
exports org.jcnc.jnotepad.controller.i18n;
exports org.jcnc.jnotepad.controller.event.handler.setting;
exports org.jcnc.jnotepad.controller.event.handler.menubar;
exports org.jcnc.jnotepad.common.util;
exports org.jcnc.jnotepad.controller.event.handler.menuitem;
exports org.jcnc.jnotepad.api.util;
exports org.jcnc.jnotepad.common.interfaces;
opens org.jcnc.jnotepad.app.config;
exports org.jcnc.jnotepad.plugin.interfaces;
@ -41,7 +41,7 @@ module org.jcnc.jnotepad {
exports org.jcnc.jnotepad.model.entity;
exports org.jcnc.jnotepad.views.root.bottom;
exports org.jcnc.jnotepad.views.root.bottom.status;
exports org.jcnc.jnotepad.plugin.api.core.views.sidebar.bottom;
exports org.jcnc.jnotepad.plugin.api.core.controller.config;
exports org.jcnc.jnotepad.api.core.views.sidebar.bottom;
exports org.jcnc.jnotepad.api.core.controller.config;
}

View File

@ -2,8 +2,8 @@ package org.jcnc.jnotepad;
import javafx.application.Application;
import javafx.stage.Stage;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.app.manager.ApplicationManager;
import org.jcnc.jnotepad.common.util.LogUtil;
/**

View File

@ -1,10 +1,10 @@
package org.jcnc.jnotepad.plugin.api.core.controller.config;
package org.jcnc.jnotepad.api.core.controller.config;
import org.jcnc.jnotepad.common.util.JsonUtil;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.PopUpUtil;
import org.jcnc.jnotepad.api.core.controller.interfaces.ConfigController;
import org.jcnc.jnotepad.api.util.JsonUtil;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.api.util.PopUpUtil;
import org.jcnc.jnotepad.exception.AppException;
import org.jcnc.jnotepad.plugin.api.core.controller.interfaces.ConfigController;
import org.slf4j.Logger;
import java.io.BufferedWriter;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.plugin.api.core.controller.interfaces;
package org.jcnc.jnotepad.api.core.controller.interfaces;
import java.nio.file.Path;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.plugin.api.core.manager;
package org.jcnc.jnotepad.api.core.manager;
import org.jcnc.jnotepad.model.entity.Cache;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.plugin.api.core.ui.stage;
package org.jcnc.jnotepad.api.core.ui.stage;
import javafx.scene.Scene;
import javafx.scene.image.Image;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.plugin.api.core.views.manager;
package org.jcnc.jnotepad.api.core.views.manager;
import java.util.List;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.plugin.api.core.views.manager.builder;
package org.jcnc.jnotepad.api.core.views.manager.builder;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.plugin.api.core.views.sidebar.bottom;
package org.jcnc.jnotepad.api.core.views.sidebar.bottom;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;

View File

@ -0,0 +1,126 @@
package org.jcnc.jnotepad.api.core.views.top.menu;
import javafx.beans.value.ChangeListener;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.CheckMenuItem;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.RadioMenuItem;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.views.root.top.menubar.TopMenuBar;
import org.slf4j.Logger;
import java.util.Map;
/**
* 抽象顶部菜单
*
* @author gewuyou
*/
public abstract class AbstractTopMenu {
protected final TopMenuBar topMenuBar = TopMenuBar.getInstance();
protected Logger logger = LogUtil.getLogger(this.getClass());
/**
* 获取菜单名称
*
* @return 菜单名称
*/
public abstract String getMenuName();
/**
* 获取菜单
*
* @return 菜单
*/
public abstract Menu getMenu();
/**
* 获取菜单项集合
*
* @return 菜单项集合
*/
public abstract Map<String, MenuItem> getMenuItems();
/**
* 注册顶部菜单
*/
protected abstract void registerTopMenu();
/**
* 注册菜单项
*
* @param menuItem 菜单项
* @param menuItemName 菜单项名称
* @param userData 用户数据用来存放必要的数据比如按钮菜单项名称
* @param eventHandler 事件
*/
public void registerMenuItem(MenuItem menuItem, String menuItemName, Object userData, EventHandler<ActionEvent> eventHandler) {
getMenuItems().put(menuItemName, menuItem);
menuItem.setUserData(userData);
menuItem.setOnAction(eventHandler);
}
/**
* 注册检查菜单项
*
* @param checkMenuItem 检查菜单项
* @param menuItemName 菜单项名称
* @param userData 用户数据用来存放必要的数据比如按钮菜单项名称
* @param listener 监听事件
*/
public void registerMenuItem(CheckMenuItem checkMenuItem, String menuItemName, Object userData, ChangeListener<Boolean> listener) {
getMenuItems().put(menuItemName, checkMenuItem);
checkMenuItem.setUserData(userData);
checkMenuItem.selectedProperty().addListener(listener);
}
/**
* 注册单选菜单项
*
* @param radioMenuItem 单选菜单项
* @param menuItemName 菜单项名称
* @param userData 用户数据用来存放必要的数据
* @param eventHandler 操作事件
*/
public void registerRadioMenuItem(Map<String, RadioMenuItem> radioMenuItems, RadioMenuItem radioMenuItem, String menuItemName, Object userData, EventHandler<ActionEvent> eventHandler) {
radioMenuItems.put(menuItemName, radioMenuItem);
radioMenuItem.setUserData(userData);
radioMenuItem.setOnAction(eventHandler);
}
/**
* 初始化菜单栏
*/
public void initMenu() {
registerTopMenu();
logger.info("初始化菜单!");
Menu menu = getMenu();
// 文件菜单
UiResourceBundle.bindStringProperty(menu.textProperty(), getMenuName());
// 初始化菜单项
initMenuItems(getMenuItems(), menu);
}
/**
* 初始化菜单项
*
* @param menuItems 菜单项集合
* @param menu 菜单
*/
private void initMenuItems(Map<String, MenuItem> menuItems, Menu menu) {
logger.info("初始化菜单项!");
var itemMap = topMenuBar.getAllItemMap();
menuItems.forEach((key, value) -> {
UiResourceBundle.bindStringProperty(value.textProperty(), key);
itemMap.put((String) value.getUserData(), value);
menu.getItems().add(value);
});
}
}

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.common.util;
package org.jcnc.jnotepad.api.util;
import com.ibm.icu.text.CharsetDetector;
import com.ibm.icu.text.CharsetMatch;

View File

@ -1,6 +1,6 @@
package org.jcnc.jnotepad.common.util;
package org.jcnc.jnotepad.api.util;
import org.jcnc.jnotepad.controller.event.handler.menubar.OpenFile;
import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenFile;
import org.jcnc.jnotepad.exception.AppException;
import org.jcnc.jnotepad.model.entity.DirFileModel;
import org.kordamp.ikonli.javafx.FontIcon;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.common.util;
package org.jcnc.jnotepad.api.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.common.util;
package org.jcnc.jnotepad.api.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.common.util;
package org.jcnc.jnotepad.api.util;
import org.jcnc.jnotepad.model.enums.DialogType;
import org.jcnc.jnotepad.ui.dialog.AppDialogBuilder;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.common.util;
package org.jcnc.jnotepad.api.util;
import atlantafx.base.theme.Styles;
import javafx.scene.image.Image;

View File

@ -8,12 +8,12 @@ import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.Window;
import org.jcnc.jnotepad.LunchApp;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.common.constants.AppConstants;
import org.jcnc.jnotepad.common.constants.TextConstants;
import org.jcnc.jnotepad.common.manager.ThreadPoolManager;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.controller.ResourceController;
import org.jcnc.jnotepad.controller.cache.CacheController;
import org.jcnc.jnotepad.controller.config.PluginConfigController;

View File

@ -1,6 +1,6 @@
package org.jcnc.jnotepad.common.manager;
import org.jcnc.jnotepad.plugin.api.core.manager.AbstractCacheManager;
import org.jcnc.jnotepad.api.core.manager.AbstractCacheManager;
/**
* 应用程序缓存管理类

View File

@ -1,6 +1,6 @@
package org.jcnc.jnotepad.common.manager;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.slf4j.Logger;
import java.util.concurrent.*;

View File

@ -1,6 +1,6 @@
package org.jcnc.jnotepad.controller;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.controller.config.PluginConfigController;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import org.jcnc.jnotepad.exception.AppException;

View File

@ -1,11 +1,10 @@
package org.jcnc.jnotepad.controller.cache;
import com.fasterxml.jackson.core.type.TypeReference;
import org.jcnc.jnotepad.api.util.JsonUtil;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.common.manager.ApplicationCacheManager;
import org.jcnc.jnotepad.common.util.JsonUtil;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.controller.config.AppConfigController;
import org.jcnc.jnotepad.exception.AppException;
import org.jcnc.jnotepad.model.entity.Cache;
import org.slf4j.Logger;
@ -130,7 +129,7 @@ public class CacheController {
return true;
}
} catch (IOException e) {
throw new AppException(e);
logger.error("清理缓存文件或文件夹出错!", e);
}
return false;
}
@ -164,10 +163,10 @@ public class CacheController {
try {
boolean flag = groupFile.createNewFile();
if (!flag) {
throw new AppException("创建文件失败");
logger.error("创建缓存文件失败:{}", groupFile);
}
} catch (IOException e) {
throw new AppException(e);
logger.error("创建缓存文件失败!", e);
}
}
fileMap.computeIfAbsent(groupFile, k -> new HashMap<>(16));
@ -180,7 +179,7 @@ public class CacheController {
try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
fileOutputStream.write(new byte[0]);
} catch (IOException e) {
throw new AppException(e);
logger.error("清空缓存文件失败!", e);
}
});
// 写入缓存
@ -188,7 +187,7 @@ public class CacheController {
try (FileWriter writer = new FileWriter(entry.getKey(), true)) {
writer.write(JsonUtil.toJsonString(entry.getValue()));
} catch (IOException e) {
throw new AppException(e);
logger.error("写入缓存文件失败!", e);
}
}
}

View File

@ -1,7 +1,7 @@
package org.jcnc.jnotepad.controller.config;
import org.jcnc.jnotepad.api.core.controller.config.BaseConfigController;
import org.jcnc.jnotepad.app.config.AppConfig;
import org.jcnc.jnotepad.plugin.api.core.controller.config.BaseConfigController;
import java.nio.file.Paths;

View File

@ -1,7 +1,7 @@
package org.jcnc.jnotepad.controller.config;
import org.jcnc.jnotepad.api.core.controller.config.BaseConfigController;
import org.jcnc.jnotepad.app.config.PluginConfig;
import org.jcnc.jnotepad.plugin.api.core.controller.config.BaseConfigController;
import java.nio.file.Path;
import java.nio.file.Paths;

View File

@ -1,8 +1,8 @@
package org.jcnc.jnotepad.controller.config;
import org.jcnc.jnotepad.api.core.controller.config.BaseConfigController;
import org.jcnc.jnotepad.app.config.UserConfig;
import org.jcnc.jnotepad.model.entity.ShortcutKey;
import org.jcnc.jnotepad.plugin.api.core.controller.config.BaseConfigController;
import java.nio.file.Paths;
import java.util.ArrayList;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.controller.event.handler.menubar;
package org.jcnc.jnotepad.controller.event.handler.menuitem;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;

View File

@ -1,7 +1,7 @@
package org.jcnc.jnotepad.controller.event.handler.menubar;
package org.jcnc.jnotepad.controller.event.handler.menuitem;
import javafx.event.ActionEvent;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.controller.config.UserConfigController;
import java.io.File;

View File

@ -1,13 +1,13 @@
package org.jcnc.jnotepad.controller.event.handler.menubar;
package org.jcnc.jnotepad.controller.event.handler.menuitem;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import org.jcnc.jnotepad.api.util.FileUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.common.constants.TextConstants;
import org.jcnc.jnotepad.common.manager.ApplicationCacheManager;
import org.jcnc.jnotepad.common.util.FileUtil;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.model.entity.Cache;
import org.jcnc.jnotepad.model.entity.DirFileModel;
import org.jcnc.jnotepad.model.enums.CacheExpirationTime;

View File

@ -1,15 +1,15 @@
package org.jcnc.jnotepad.controller.event.handler.menubar;
package org.jcnc.jnotepad.controller.event.handler.menuitem;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Tab;
import javafx.stage.FileChooser;
import org.jcnc.jnotepad.api.util.EncodingDetector;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.common.constants.TextConstants;
import org.jcnc.jnotepad.common.manager.ApplicationCacheManager;
import org.jcnc.jnotepad.common.util.EncodingDetector;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.model.entity.Cache;
import org.jcnc.jnotepad.model.enums.CacheExpirationTime;
import org.jcnc.jnotepad.ui.dialog.factory.impl.BasicFileChooserFactory;
@ -21,7 +21,7 @@ import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTabPane;
import java.io.File;
import java.nio.charset.Charset;
import static org.jcnc.jnotepad.common.util.FileUtil.getFileText;
import static org.jcnc.jnotepad.api.util.FileUtil.getFileText;
/**
* 打开文件的事件处理程序

View File

@ -1,15 +1,15 @@
package org.jcnc.jnotepad.controller.event.handler.menubar;
package org.jcnc.jnotepad.controller.event.handler.menuitem;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.stage.FileChooser;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.api.util.PopUpUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.common.constants.TextConstants;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.PopUpUtil;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.ui.dialog.factory.impl.BasicFileChooserFactory;
import org.jcnc.jnotepad.views.manager.CenterTabPaneManager;
import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTab;

View File

@ -1,7 +1,7 @@
package org.jcnc.jnotepad.controller.event.handler.menubar;
package org.jcnc.jnotepad.controller.event.handler.menuitem;
import javafx.event.ActionEvent;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.api.util.LogUtil;
/**

View File

@ -1,13 +1,13 @@
package org.jcnc.jnotepad.controller.event.handler.menubar;
package org.jcnc.jnotepad.controller.event.handler.menuitem;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.FileChooser;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.common.constants.TextConstants;
import org.jcnc.jnotepad.common.manager.ApplicationCacheManager;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.controller.config.UserConfigController;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import org.jcnc.jnotepad.model.entity.Cache;

View File

@ -2,8 +2,8 @@ package org.jcnc.jnotepad.controller.manager;
import org.jcnc.jnotepad.common.interfaces.ControllerAble;
import org.jcnc.jnotepad.common.manager.ApplicationCacheManager;
import org.jcnc.jnotepad.controller.event.handler.menubar.NewFile;
import org.jcnc.jnotepad.controller.event.handler.menubar.OpenFile;
import org.jcnc.jnotepad.controller.event.handler.menuitem.NewFile;
import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenFile;
import java.io.File;
import java.util.Collections;

View File

@ -1,8 +1,8 @@
package org.jcnc.jnotepad.plugin;
import org.jcnc.jnotepad.api.util.JsonUtil;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.common.manager.ThreadPoolManager;
import org.jcnc.jnotepad.common.util.JsonUtil;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.controller.config.PluginConfigController;
import org.jcnc.jnotepad.exception.AppException;
import org.jcnc.jnotepad.model.entity.PluginDescriptor;

View File

@ -6,9 +6,9 @@ import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.PopUpUtil;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.api.util.PopUpUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.plugin.manager.PluginManager;
import org.jcnc.jnotepad.ui.dialog.factory.impl.BasicFileChooserFactory;
import org.slf4j.Logger;

View File

@ -1,9 +1,9 @@
package org.jcnc.jnotepad.plugin.manager;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.api.util.PopUpUtil;
import org.jcnc.jnotepad.app.manager.ApplicationManager;
import org.jcnc.jnotepad.common.manager.ThreadPoolManager;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.PopUpUtil;
import org.jcnc.jnotepad.controller.config.PluginConfigController;
import org.jcnc.jnotepad.model.entity.PluginDescriptor;
import org.slf4j.Logger;

View File

@ -5,7 +5,7 @@ import javafx.geometry.Pos;
import javafx.scene.image.Image;
import javafx.stage.Modality;
import javafx.stage.Stage;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.model.enums.DialogType;
import org.jcnc.jnotepad.ui.dialog.interfaces.DialogButtonAction;
import org.kordamp.ikonli.javafx.FontIcon;

View File

@ -7,10 +7,10 @@ import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.api.util.PopUpUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.app.manager.ApplicationManager;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.PopUpUtil;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.slf4j.Logger;
/**

View File

@ -17,9 +17,9 @@ import javafx.scene.input.ClipboardContent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.plugin.api.core.ui.stage.AbstractPaneStage;
import org.jcnc.jnotepad.api.core.ui.stage.AbstractPaneStage;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.views.manager.RootManager;
import static org.jcnc.jnotepad.common.constants.AppConstants.*;

View File

@ -1,10 +1,7 @@
package org.jcnc.jnotepad.ui.setstage;
import atlantafx.base.controls.CustomTextField;
import atlantafx.base.theme.Dracula;
import atlantafx.base.theme.PrimerDark;
import atlantafx.base.theme.Styles;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
@ -17,8 +14,9 @@ import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Modality;
import javafx.stage.Stage;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.plugin.PluginManagerInterface;
import org.jcnc.jnotepad.ui.module.CustomSetButton;
import org.jcnc.jnotepad.ui.module.SettingsComponent;
@ -71,7 +69,8 @@ public class SetStage extends Stage {
Stage primaryStage = new Stage();
primaryStage.getIcons().add(UiUtil.getAppIcon());
primaryStage.setTitle("设置窗口");
// 将窗口设置为模态
primaryStage.initModality(Modality.APPLICATION_MODAL);
contentDisplay = new StackPane();
@ -93,7 +92,6 @@ public class SetStage extends Stage {
cancelButton.setOnAction(event -> {
Stage stage = (Stage) cancelButton.getScene().getWindow();
stage.close();
});
cancelButton.getStyleClass().addAll(Styles.SMALL);
Button applicationButton = new Button(" 应用 ");

View File

@ -25,11 +25,11 @@ import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.PopUpUtil;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.api.core.ui.stage.AbstractPaneStage;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.api.util.PopUpUtil;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.model.entity.PluginDescriptor;
import org.jcnc.jnotepad.plugin.api.core.ui.stage.AbstractPaneStage;
import org.jcnc.jnotepad.plugin.manager.PluginManager;
import org.jcnc.jnotepad.ui.module.CustomSetButton;
import org.slf4j.Logger;

View File

@ -3,15 +3,15 @@ package org.jcnc.jnotepad.views.manager;
import javafx.collections.ObservableList;
import javafx.scene.control.Tab;
import javafx.stage.Stage;
import org.jcnc.jnotepad.api.util.FileUtil;
import org.jcnc.jnotepad.api.util.PopUpUtil;
import org.jcnc.jnotepad.common.manager.ApplicationCacheManager;
import org.jcnc.jnotepad.common.util.FileUtil;
import org.jcnc.jnotepad.common.util.PopUpUtil;
import org.jcnc.jnotepad.controller.config.UserConfigController;
import org.jcnc.jnotepad.model.enums.CacheExpirationTime;
import org.jcnc.jnotepad.ui.module.LineNumberTextArea;
import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTab;
import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTabPane;
import org.jcnc.jnotepad.views.root.top.menu.TopMenuBar;
import org.jcnc.jnotepad.views.root.top.menubar.TopMenuBar;
import java.io.File;
import java.util.ArrayList;

View File

@ -3,9 +3,9 @@ package org.jcnc.jnotepad.views.manager;
import javafx.beans.value.ChangeListener;
import javafx.scene.control.SplitPane;
import javafx.scene.control.TreeItem;
import org.jcnc.jnotepad.api.util.FileUtil;
import org.jcnc.jnotepad.common.manager.ApplicationCacheManager;
import org.jcnc.jnotepad.common.util.FileUtil;
import org.jcnc.jnotepad.controller.event.handler.menubar.OpenDirectory;
import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenDirectory;
import org.jcnc.jnotepad.model.entity.DirFileModel;
import org.jcnc.jnotepad.views.root.center.main.MainBorderPane;
import org.jcnc.jnotepad.views.root.center.main.center.directory.DirectorySidebarPane;

View File

@ -1,7 +1,7 @@
package org.jcnc.jnotepad.views.manager;
import org.jcnc.jnotepad.views.root.top.RootTopBorderPane;
import org.jcnc.jnotepad.views.root.top.menu.TopMenuBar;
import org.jcnc.jnotepad.views.root.top.menubar.TopMenuBar;
/**
* 顶部边界面板管理类

View File

@ -3,10 +3,10 @@ package org.jcnc.jnotepad.views.manager;
import javafx.scene.Node;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import org.jcnc.jnotepad.api.core.views.manager.AbstractManager;
import org.jcnc.jnotepad.api.core.views.manager.builder.SideBarButtonBuilder;
import org.jcnc.jnotepad.controller.event.handler.setting.DirTreeBtn;
import org.jcnc.jnotepad.controller.event.handler.setting.SetBtn;
import org.jcnc.jnotepad.plugin.api.core.views.manager.AbstractManager;
import org.jcnc.jnotepad.plugin.api.core.views.manager.builder.SideBarButtonBuilder;
import org.jcnc.jnotepad.views.root.left.sidebar.tools.SidebarToolBar;
import java.util.ArrayList;
@ -57,8 +57,6 @@ public class SidebarToolBarManager extends AbstractManager<Node> {
}
/**
* 获取节点列表
*

View File

@ -1,29 +1,20 @@
package org.jcnc.jnotepad.views.manager;
import javafx.beans.value.ChangeListener;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.*;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.input.KeyCombination;
import javafx.stage.Stage;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.common.util.UiUtil;
import org.jcnc.jnotepad.api.core.views.manager.AbstractManager;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.controller.config.UserConfigController;
import org.jcnc.jnotepad.controller.event.handler.menubar.*;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import org.jcnc.jnotepad.model.entity.ShortcutKey;
import org.jcnc.jnotepad.plugin.api.core.views.manager.AbstractManager;
import org.jcnc.jnotepad.ui.setstage.HelpPaneStage;
import org.jcnc.jnotepad.ui.setstage.pluginstage.PluginManagementPane;
import org.jcnc.jnotepad.views.root.top.menu.TopMenuBar;
import org.jcnc.jnotepad.views.root.top.menubar.TopMenuBar;
import org.jcnc.jnotepad.views.root.top.menubar.menu.*;
import org.slf4j.Logger;
import java.util.*;
import static org.jcnc.jnotepad.common.constants.TextConstants.*;
import java.util.ArrayList;
import java.util.List;
/**
* 顶部菜单栏管理类
@ -34,18 +25,16 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
private static final TopMenuBarManager INSTANCE = new TopMenuBarManager();
private final TopMenuBar topMenuBar = TopMenuBar.getInstance();
private final List<Menu> nodeList = new ArrayList<>();
private final Map<String, MenuItem> fileMenuItems = new HashMap<>();
private final Map<String, MenuItem> setMenuItems = new HashMap<>();
private final Map<String, MenuItem> pluginMenuItems = new HashMap<>();
private final Map<String, MenuItem> helpMenuItems = new HashMap<>();
private final Map<String, RadioMenuItem> languageMenuItems = new HashMap<>();
Logger logger = LogUtil.getLogger(this.getClass());
UserConfigController userConfigController = UserConfigController.getInstance();
FileTopMenu fileTopMenu = FileTopMenu.getInstance();
LanguageTopMenu languageTopMenu = LanguageTopMenu.getInstance();
SettingTopMenu settingTopMenu = SettingTopMenu.getInstance();
HelpTopMenu helpTopMenu = HelpTopMenu.getInstance();
PluginTopMenu pluginTopMenu = PluginTopMenu.getInstance();
private TopMenuBarManager() {
}
@ -62,17 +51,15 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
topMenuBar.setPadding(new Insets(-3, 0, -3, 0));
registerTopMenuBar();
// 初始化文件菜单
initFileMenu();
fileTopMenu.initMenu();
// 初始化语言菜单
initLanguageMenu();
// 设置当前语言选中状态
toggleLanguageCheck(userConfigController.getLanguage());
languageTopMenu.initMenu();
// 初始化设置菜单
initSettingMenu();
// 初始化设置菜单
initHelpMenu();
settingTopMenu.initMenu();
// 初始化帮助菜单
helpTopMenu.initMenu();
// 初始化插件菜单
initPluginMenu();
pluginTopMenu.initMenu();
// 刷新顶部菜单栏
refreshTopMenuBar();
@ -85,189 +72,16 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
*/
public void registerTopMenuBar() {
// 文件菜单
registerFileMenuItem(topMenuBar.getNewItem(), NEW, "newItem", new NewFile());
registerFileMenuItem(topMenuBar.getOpenItem(), OPEN, "openItem", new OpenFile());
registerFileMenuItem(topMenuBar.getSaveItem(), SAVE, "saveItem", new SaveFile());
registerFileMenuItem(topMenuBar.getSaveAsItem(), SAVE_AS, "saveAsItem", new SaveAsFile());
registerFileMenuItem(topMenuBar.getRenameItem(), RENAME, "renameItem", new RenameFile());
// 打开文件夹按钮
registerFileMenuItem(topMenuBar.getOpenDirItem(), OPEN_DIRECTORY, "openDirItem", new OpenDirectory());
// 语言菜单
registerLanguageMenuItem(topMenuBar.getChineseItem(), UPPER_CHINESE, Locale.CHINESE, this::toggleLanguage);
registerLanguageMenuItem(topMenuBar.getEnglishItem(), UPPER_ENGLISH, Locale.ENGLISH, this::toggleLanguage);
registerNode(fileTopMenu.getMenu());
// 设置菜单
registerSetMenuItem(topMenuBar.getLineFeedItem(), WORD_WRAP, "lineFeedItem", (observableValue, before, after) -> {
// 1. 更新全局配置
UserConfigController.getInstance().setAutoLineConfig(after);
// 2. 对当前tab生效配置
CenterTabPaneManager.getInstance().fireTabSelected();
});
topMenuBar.getLineFeedItem().selectedProperty().set(true);
registerSetMenuItem(topMenuBar.getTopItem(), TOP, "topItem", (observableValue, before, after) -> {
// 获取窗口容器
Stage primaryStage = (Stage) UiUtil.getAppWindow();
// 设置窗口为置顶
primaryStage.setAlwaysOnTop(after);
});
registerSetMenuItem(topMenuBar.getOpenConfigItem(), OPEN_CONFIGURATION_FILE, "openConfigItem", new OpenConfig());
registerSetMenuItem(topMenuBar.getLanguageMenu(), LANGUAGE, "languageMenu", actionEvent -> {
});
//插件菜单
registerPluginMenuItem(topMenuBar.getPluginManagerItem(), MANAGER_PLUGIN, "pluginManagerItem", event -> new PluginManagementPane().run());
registerPluginMenuItem(topMenuBar.getCountItem(), STATISTICS, "countItem", event -> {
});
registerNode(topMenuBar.getSetMenu());
// 帮助菜单
registerHelpMenuItem(topMenuBar.getAboutItem(), ABOUT, "aboutItem", event -> new HelpPaneStage().run(new Stage()));
registerNode(helpTopMenu.getMenu());
// 插件菜单
registerNode(topMenuBar.getPluginMenu());
}
/**
* 切换语言
*
* @param actionEvent 点击事件
*/
private void toggleLanguage(ActionEvent actionEvent) {
if (actionEvent == null) {
return;
}
RadioMenuItem languageItem = (RadioMenuItem) actionEvent.getSource();
if (languageItem == null) {
return;
}
LocalizationController.setCurrentLocal((Locale) languageItem.getUserData());
}
/**
* 设置当前语言选中状态
*
* @param language 语言
*/
public void toggleLanguageCheck(String language) {
languageMenuItems.forEach((k, v) -> v.setSelected(language.toUpperCase().equals(k)));
}
/**
* 注册文件菜单项
*
* @param menuItem 菜单项
* @param menuItemName 菜单项名称
* @param buttonName 按钮名称
* @param eventHandler 操作事件
*/
public void registerFileMenuItem(MenuItem menuItem, String menuItemName, String buttonName, EventHandler<ActionEvent> eventHandler) {
fileMenuItems.put(menuItemName, menuItem);
setMenuItem(menuItem, buttonName, eventHandler);
}
/**
* 注册帮助菜单项
*
* @param menuItem 菜单项
* @param menuItemName 菜单项名称
* @param buttonName 按钮名称
* @param eventHandler 操作事件
*/
public void registerHelpMenuItem(MenuItem menuItem, String menuItemName, String buttonName, EventHandler<ActionEvent> eventHandler) {
helpMenuItems.put(menuItemName, menuItem);
setMenuItem(menuItem, buttonName, eventHandler);
}
/**
* 注册设置菜单项
*
* @param menuItem 菜单项
* @param menuItemName 菜单项名称
* @param buttonName 按钮名称
* @param eventHandler 操作事件
*/
public void registerSetMenuItem(MenuItem menuItem, String menuItemName, String buttonName, EventHandler<ActionEvent> eventHandler) {
setMenuItems.put(menuItemName, menuItem);
setMenuItem(menuItem, buttonName, eventHandler);
}
/**
* 注册设置菜单项
*
* @param checkMenuItem 检查菜单项
* @param menuItemName 菜单项名称
* @param buttonName 按钮名称
* @param listener 监听事件
*/
public void registerSetMenuItem(CheckMenuItem checkMenuItem, String menuItemName, String buttonName, ChangeListener<Boolean> listener) {
setMenuItems.put(menuItemName, checkMenuItem);
setCheckMenuItem(checkMenuItem, buttonName, listener);
}
/**
* 注册语言菜单
*
* @param radioMenuItem 单选菜单项
* @param menuItemName 菜单项名称
* @param locale 语言
* @param eventHandler 操作事件
*/
public void registerLanguageMenuItem(RadioMenuItem radioMenuItem, String menuItemName, Locale locale, EventHandler<ActionEvent> eventHandler) {
languageMenuItems.put(menuItemName, radioMenuItem);
setRadioMenuItem(radioMenuItem, locale, eventHandler);
}
/**
* 注册插件菜单
*
* @param menuItem 菜单项
* @param menuItemName 菜单项名称
* @param buttonName 按钮名称
* @param eventHandler 操作事件
*/
public void registerPluginMenuItem(MenuItem menuItem, String menuItemName, String buttonName, EventHandler<ActionEvent> eventHandler) {
pluginMenuItems.put(menuItemName, menuItem);
setMenuItem(menuItem, buttonName, eventHandler);
}
/**
* 注册菜单项
*
* @param menuItem 菜单项
* @param buttonName 按钮名称
* @param eventHandler 操作事件
*/
private void setMenuItem(MenuItem menuItem, String buttonName, EventHandler<ActionEvent> eventHandler) {
menuItem.setUserData(buttonName);
menuItem.setOnAction(eventHandler);
}
/**
* 注册单选菜单项
*
* @param radioMenuItem 单选菜单项
* @param locale 语言
* @param eventHandler 操作事件
*/
private void setRadioMenuItem(RadioMenuItem radioMenuItem, Locale locale, EventHandler<ActionEvent> eventHandler) {
radioMenuItem.setUserData(locale);
radioMenuItem.setOnAction(eventHandler);
}
/**
* 注册检查菜单项
*
* @param checkMenuItem 检查菜单项
* @param buttonName 按钮名称
* @param listener 监听事件
*/
private void setCheckMenuItem(CheckMenuItem checkMenuItem, String buttonName, ChangeListener<Boolean> listener) {
checkMenuItem.setUserData(buttonName);
checkMenuItem.selectedProperty().addListener(listener);
}
/**
* 初始化快捷键
*/
@ -276,7 +90,7 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
List<ShortcutKey> shortcutKeyConfigs = userConfigController.getShortcutKey();
for (ShortcutKey shortcutKey : shortcutKeyConfigs) {
// 保证json的key必须和变量名一致
MenuItem menuItem = topMenuBar.getItemMap().get(shortcutKey.getButtonName());
MenuItem menuItem = topMenuBar.getAllItemMap().get(shortcutKey.getButtonName());
String shortKeyValue = shortcutKey.getShortcutKeyValue();
if ("".equals(shortKeyValue) && menuItem != null) {
itemsToUnbind.add(menuItem);
@ -293,7 +107,7 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
}
/**
* 初始化顶部菜单
* 刷新顶部菜单
*/
private void refreshTopMenuBar() {
ObservableList<Menu> menus = topMenuBar.getMenus();
@ -301,86 +115,6 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
menus.addAll(nodeList);
}
/**
* 初始化插件菜单
*/
private void initPluginMenu() {
logger.info("初始化插件菜单!");
var pluginMenu = topMenuBar.getPluginMenu();
// 插件菜单
UiResourceBundle.bindStringProperty(pluginMenu.textProperty(), PLUGIN);
initMenuItems(pluginMenuItems, pluginMenu);
}
/**
* 初始化插件菜单
*/
private void initHelpMenu() {
logger.info("初始化帮助菜单!");
var helpMenu = topMenuBar.getHelpMenu();
// 插件菜单
UiResourceBundle.bindStringProperty(helpMenu.textProperty(), HELP);
initMenuItems(helpMenuItems, helpMenu);
}
/**
* 初始化设置菜单
*/
private void initSettingMenu() {
logger.info("初始化设置菜单!");
var setMenu = topMenuBar.getSetMenu();
// 设置菜单
UiResourceBundle.bindStringProperty(setMenu.textProperty(), SET);
// 初始化菜单项
initMenuItems(setMenuItems, setMenu);
}
/**
* 初始化语言菜单
*/
private void initLanguageMenu() {
logger.info("初始化语言菜单!");
// 语言菜单
ToggleGroup languageToggleGroup = new ToggleGroup();
var itemMap = topMenuBar.getItemMap();
languageMenuItems.forEach((key, value) -> {
UiResourceBundle.bindStringProperty(value.textProperty(), key);
itemMap.put(key, value);
languageToggleGroup.getToggles().add(value);
topMenuBar.getLanguageMenu().getItems().add(value);
});
}
/**
* 初始化文件菜单
*/
private void initFileMenu() {
logger.info("初始化文件菜单!");
Menu fileMenu = topMenuBar.getFileMenu();
// 文件菜单
UiResourceBundle.bindStringProperty(fileMenu.textProperty(), FILE);
// 初始化菜单项
initMenuItems(fileMenuItems, fileMenu);
}
/**
* 初始化菜单项
*
* @param menuItems 菜单项集合
* @param menu 菜单
*/
private void initMenuItems(Map<String, MenuItem> menuItems, Menu menu) {
var itemMap = topMenuBar.getItemMap();
menuItems.forEach((key, value) -> {
UiResourceBundle.bindStringProperty(value.textProperty(), key);
itemMap.put((String) value.getUserData(), value);
menu.getItems().add(value);
});
registerNode(menu);
}
/**
* 获取节点列表
*

View File

@ -2,7 +2,7 @@ package org.jcnc.jnotepad.views.root.center.main.center.directory;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import org.jcnc.jnotepad.controller.event.handler.menubar.OpenFile;
import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenFile;
import org.jcnc.jnotepad.model.entity.DirFileModel;
import java.io.File;

View File

@ -2,7 +2,7 @@ package org.jcnc.jnotepad.views.root.center.main.center.tab;
import javafx.scene.control.Tab;
import org.fxmisc.flowless.VirtualizedScrollPane;
import org.jcnc.jnotepad.common.util.LogUtil;
import org.jcnc.jnotepad.api.util.LogUtil;
import org.jcnc.jnotepad.controller.config.UserConfigController;
import org.jcnc.jnotepad.ui.module.LineNumberTextArea;
import org.jcnc.jnotepad.views.manager.BottomStatusBoxManager;

View File

@ -1,4 +1,4 @@
package org.jcnc.jnotepad.views.root.top.menu;
package org.jcnc.jnotepad.views.root.top.menubar;
import javafx.scene.control.*;
import org.jcnc.jnotepad.views.manager.CenterTabPaneManager;
@ -18,7 +18,7 @@ public class TopMenuBar extends MenuBar {
/**
* 按钮集合
*/
private final Map<String, MenuItem> itemMap = new HashMap<>();
private final Map<String, MenuItem> allItemMap = new HashMap<>();
/**
* 标签页布局组件封装
*/
@ -145,8 +145,8 @@ public class TopMenuBar extends MenuBar {
return languageMenu;
}
public Map<String, MenuItem> getItemMap() {
return itemMap;
public Map<String, MenuItem> getAllItemMap() {
return allItemMap;
}
public MenuItem getNewItem() {

View File

@ -0,0 +1,71 @@
package org.jcnc.jnotepad.views.root.top.menubar.menu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
import org.jcnc.jnotepad.controller.event.handler.menuitem.*;
import java.util.HashMap;
import java.util.Map;
import static org.jcnc.jnotepad.common.constants.TextConstants.*;
/**
* 文件菜单
*
* @author gewuyou
*/
public class FileTopMenu extends AbstractTopMenu {
private static final FileTopMenu INSTANCE = new FileTopMenu();
private final Map<String, MenuItem> fileMenuItems = new HashMap<>();
public static FileTopMenu getInstance() {
return INSTANCE;
}
/**
* 获取菜单名称
*
* @return 菜单名称
*/
@Override
public String getMenuName() {
return FILE;
}
/**
* 获取菜单
*
* @return 菜单
*/
@Override
public Menu getMenu() {
return topMenuBar.getFileMenu();
}
/**
* 获取菜单项集合
*
* @return 菜单项集合
*/
@Override
public Map<String, MenuItem> getMenuItems() {
return fileMenuItems;
}
/**
* 注册顶部菜单
*/
@Override
protected void registerTopMenu() {
// 文件菜单
registerMenuItem(topMenuBar.getNewItem(), NEW, "newItem", new NewFile());
registerMenuItem(topMenuBar.getOpenItem(), OPEN, "openItem", new OpenFile());
registerMenuItem(topMenuBar.getSaveItem(), SAVE, "saveItem", new SaveFile());
registerMenuItem(topMenuBar.getSaveAsItem(), SAVE_AS, "saveAsItem", new SaveAsFile());
registerMenuItem(topMenuBar.getRenameItem(), RENAME, "renameItem", new RenameFile());
// 打开文件夹按钮
registerMenuItem(topMenuBar.getOpenDirItem(), OPEN_DIRECTORY, "openDirItem", new OpenDirectory());
}
}

View File

@ -0,0 +1,68 @@
package org.jcnc.jnotepad.views.root.top.menubar.menu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.stage.Stage;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
import org.jcnc.jnotepad.ui.setstage.HelpPaneStage;
import java.util.HashMap;
import java.util.Map;
import static org.jcnc.jnotepad.common.constants.TextConstants.ABOUT;
import static org.jcnc.jnotepad.common.constants.TextConstants.HELP;
/**
* 帮助菜单
*
* @author gewuyou
*/
public class HelpTopMenu extends AbstractTopMenu {
private static final HelpTopMenu INSTANCE = new HelpTopMenu();
private final Map<String, MenuItem> helpMenuItems = new HashMap<>();
public static HelpTopMenu getInstance() {
return INSTANCE;
}
/**
* 获取菜单名称
*
* @return 菜单名称
*/
@Override
public String getMenuName() {
return HELP;
}
/**
* 获取菜单
*
* @return 菜单
*/
@Override
public Menu getMenu() {
return topMenuBar.getHelpMenu();
}
/**
* 获取菜单项集合
*
* @return 菜单项集合
*/
@Override
public Map<String, MenuItem> getMenuItems() {
return helpMenuItems;
}
/**
* 注册顶部菜单
*/
@Override
protected void registerTopMenu() {
registerMenuItem(topMenuBar.getAboutItem(), ABOUT, "aboutItem", event -> new HelpPaneStage().run(new Stage()));
}
}

View File

@ -0,0 +1,123 @@
package org.jcnc.jnotepad.views.root.top.menubar.menu;
import javafx.event.ActionEvent;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.RadioMenuItem;
import javafx.scene.control.ToggleGroup;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
import org.jcnc.jnotepad.controller.config.UserConfigController;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import static org.jcnc.jnotepad.common.constants.TextConstants.*;
/**
* 语言顶部菜单
*
* @author gewuyou
*/
public class LanguageTopMenu extends AbstractTopMenu {
private static final LanguageTopMenu INSTANCE = new LanguageTopMenu();
private final Map<String, RadioMenuItem> languageMenuItems = new HashMap<>();
UserConfigController userConfigController = UserConfigController.getInstance();
public static LanguageTopMenu getInstance() {
return INSTANCE;
}
/**
* 获取菜单名称
*
* @return 菜单名称
*/
@Override
public String getMenuName() {
return LANGUAGE;
}
/**
* 获取菜单
*
* @return 菜单
*/
@Override
public Menu getMenu() {
return topMenuBar.getLanguageMenu();
}
/**
* 获取菜单项集合
*
* @return 菜单项集合
*/
@Override
public Map<String, MenuItem> getMenuItems() {
return Collections.emptyMap();
}
/**
* 初始化菜单栏
*/
@Override
public void initMenu() {
registerTopMenu();
logger.info("初始化语言菜单!");
// 语言菜单
ToggleGroup languageToggleGroup = new ToggleGroup();
var itemMap = topMenuBar.getAllItemMap();
languageMenuItems.forEach((key, value) -> {
UiResourceBundle.bindStringProperty(value.textProperty(), key);
itemMap.put(key, value);
languageToggleGroup.getToggles().add(value);
topMenuBar.getLanguageMenu().getItems().add(value);
});
// 设置当前语言选中状态
toggleLanguageCheck(userConfigController.getLanguage());
}
/**
* 注册顶部菜单
*
* @apiNote 此方法
*/
@Override
protected void registerTopMenu() {
registerRadioMenuItem(languageMenuItems, topMenuBar.getChineseItem(), UPPER_CHINESE, Locale.CHINESE, this::toggleLanguage);
registerRadioMenuItem(languageMenuItems, topMenuBar.getEnglishItem(), UPPER_ENGLISH, Locale.ENGLISH, this::toggleLanguage);
}
/**
* 设置当前语言选中状态
*
* @param language 语言
*/
private void toggleLanguageCheck(String language) {
languageMenuItems.forEach((k, v) -> v.setSelected(language.toUpperCase().equals(k)));
}
/**
* 切换语言
*
* @param actionEvent 点击事件
*/
private void toggleLanguage(ActionEvent actionEvent) {
if (actionEvent == null) {
return;
}
RadioMenuItem languageItem = (RadioMenuItem) actionEvent.getSource();
if (languageItem == null) {
return;
}
LocalizationController.setCurrentLocal((Locale) languageItem.getUserData());
}
}

View File

@ -0,0 +1,68 @@
package org.jcnc.jnotepad.views.root.top.menubar.menu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
import org.jcnc.jnotepad.ui.setstage.pluginstage.PluginManagementPane;
import java.util.HashMap;
import java.util.Map;
import static org.jcnc.jnotepad.common.constants.TextConstants.*;
/**
* 插件菜单
*
* @author gewuyou
*/
public class PluginTopMenu extends AbstractTopMenu {
private static final PluginTopMenu INSTANCE = new PluginTopMenu();
private final Map<String, MenuItem> pluginMenuItems = new HashMap<>();
public static PluginTopMenu getInstance() {
return INSTANCE;
}
/**
* 获取菜单名称
*
* @return 菜单名称
*/
@Override
public String getMenuName() {
return PLUGIN;
}
/**
* 获取菜单
*
* @return 菜单
*/
@Override
public Menu getMenu() {
return topMenuBar.getPluginMenu();
}
/**
* 获取菜单项集合
*
* @return 菜单项集合
*/
@Override
public Map<String, MenuItem> getMenuItems() {
return pluginMenuItems;
}
/**
* 注册顶部菜单
*/
@Override
protected void registerTopMenu() {
registerMenuItem(topMenuBar.getPluginManagerItem(), MANAGER_PLUGIN, "pluginManagerItem", event -> new PluginManagementPane().run());
registerMenuItem(topMenuBar.getCountItem(), STATISTICS, "countItem", event -> {
});
}
}

View File

@ -0,0 +1,87 @@
package org.jcnc.jnotepad.views.root.top.menubar.menu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.stage.Stage;
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
import org.jcnc.jnotepad.api.util.UiUtil;
import org.jcnc.jnotepad.controller.config.UserConfigController;
import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenConfig;
import org.jcnc.jnotepad.views.manager.CenterTabPaneManager;
import java.util.HashMap;
import java.util.Map;
import static org.jcnc.jnotepad.common.constants.TextConstants.*;
/**
* 设置菜单
*
* @author gewuyou
*/
public class SettingTopMenu extends AbstractTopMenu {
private static final SettingTopMenu INSTANCE = new SettingTopMenu();
private final Map<String, MenuItem> setMenuItems = new HashMap<>();
public static SettingTopMenu getInstance() {
return INSTANCE;
}
/**
* 获取菜单名称
*
* @return 菜单名称
*/
@Override
public String getMenuName() {
return SET;
}
/**
* 获取菜单
*
* @return 菜单
*/
@Override
public Menu getMenu() {
return topMenuBar.getSetMenu();
}
/**
* 获取菜单项集合
*
* @return 菜单项集合
*/
@Override
public Map<String, MenuItem> getMenuItems() {
return setMenuItems;
}
/**
* 注册顶部菜单
*
* @apiNote 此方法
*/
@Override
protected void registerTopMenu() {
registerMenuItem(topMenuBar.getLineFeedItem(), WORD_WRAP, "lineFeedItem", (observableValue, before, after) -> {
// 1. 更新全局配置
UserConfigController.getInstance().setAutoLineConfig(after);
// 2. 对当前tab生效配置
CenterTabPaneManager.getInstance().fireTabSelected();
});
topMenuBar.getLineFeedItem().selectedProperty().set(true);
registerMenuItem(topMenuBar.getTopItem(), TOP, "topItem", (observableValue, before, after) -> {
// 获取窗口容器
Stage primaryStage = (Stage) UiUtil.getAppWindow();
// 设置窗口为置顶
primaryStage.setAlwaysOnTop(after);
});
registerMenuItem(topMenuBar.getOpenConfigItem(), OPEN_CONFIGURATION_FILE, "openConfigItem", new OpenConfig());
registerMenuItem(topMenuBar.getLanguageMenu(), LANGUAGE, "languageMenu", actionEvent -> {
});
}
}