♻️ 重构代码 重构顶部菜单栏与侧边工具栏
This commit is contained in:
parent
3ab4c4f77e
commit
d2565799ef
@ -24,7 +24,7 @@ module org.jcnc.jnotepad {
|
||||
exports org.jcnc.jnotepad.controller.config;
|
||||
exports org.jcnc.jnotepad.controller.manager;
|
||||
exports org.jcnc.jnotepad.controller.i18n;
|
||||
exports org.jcnc.jnotepad.controller.event.handler.util;
|
||||
exports org.jcnc.jnotepad.controller.event.handler.setting;
|
||||
exports org.jcnc.jnotepad.controller.event.handler.menubar;
|
||||
exports org.jcnc.jnotepad.util;
|
||||
exports org.jcnc.jnotepad.common.interfaces;
|
||||
|
||||
@ -15,7 +15,9 @@ import org.jcnc.jnotepad.controller.config.PluginConfigController;
|
||||
import org.jcnc.jnotepad.controller.manager.Controller;
|
||||
import org.jcnc.jnotepad.plugin.PluginManager;
|
||||
import org.jcnc.jnotepad.util.UiUtil;
|
||||
import org.jcnc.jnotepad.views.manager.ViewManager;
|
||||
import org.jcnc.jnotepad.views.manager.RootManager;
|
||||
import org.jcnc.jnotepad.views.manager.SidebarToolBarManager;
|
||||
import org.jcnc.jnotepad.views.manager.TopMenuBarManager;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@ -60,6 +62,10 @@ public class ApplicationManager {
|
||||
initScene();
|
||||
// 初始化插件
|
||||
PluginManager.getInstance().initializePlugins();
|
||||
// 初始化顶部菜单栏
|
||||
TopMenuBarManager.getInstance().initTopMenuBar();
|
||||
// 初始化侧边工具栏
|
||||
SidebarToolBarManager.getInstance().initSidebarToolBar();
|
||||
// 初始化ui组件
|
||||
initUiComponents();
|
||||
// 初始化primaryStage
|
||||
@ -147,8 +153,8 @@ public class ApplicationManager {
|
||||
*/
|
||||
public void initUiComponents() {
|
||||
// 加载组件
|
||||
ViewManager viewManager = ViewManager.getInstance(scene);
|
||||
viewManager.initScreen(scene);
|
||||
RootManager rootManager = RootManager.getInstance(scene);
|
||||
rootManager.initScreen(scene);
|
||||
}
|
||||
|
||||
public Pane getRoot() {
|
||||
|
||||
@ -22,7 +22,6 @@ import java.util.List;
|
||||
* @author 许轲
|
||||
*/
|
||||
public class NewFile implements EventHandler<ActionEvent> {
|
||||
|
||||
/**
|
||||
* 处理新建文件事件。
|
||||
*
|
||||
|
||||
@ -10,9 +10,9 @@ import org.jcnc.jnotepad.controller.i18n.LocalizationController;
|
||||
import org.jcnc.jnotepad.ui.dialog.factory.impl.BasicFileChooserFactory;
|
||||
import org.jcnc.jnotepad.util.LogUtil;
|
||||
import org.jcnc.jnotepad.util.UiUtil;
|
||||
import org.jcnc.jnotepad.views.manager.TopMenuBarManager;
|
||||
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.slf4j.Logger;
|
||||
|
||||
import java.io.File;
|
||||
@ -56,7 +56,7 @@ public class SaveFile implements EventHandler<ActionEvent> {
|
||||
if (CONFIG_NAME.equals(selectedTab.getText())) {
|
||||
// 重新加载语言包和快捷键
|
||||
AppConfigController.getInstance().loadConfig();
|
||||
TopMenuBar.getInstance().initShortcutKeys();
|
||||
TopMenuBarManager.getInstance().initShortcutKeys();
|
||||
LocalizationController.initLocal();
|
||||
logger.info("已刷新语言包!");
|
||||
logger.info("已刷新快捷键!");
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package org.jcnc.jnotepad.controller.event.handler.util;
|
||||
package org.jcnc.jnotepad.controller.event.handler.setting;
|
||||
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.event.EventHandler;
|
||||
@ -8,15 +8,15 @@ import org.jcnc.jnotepad.views.root.RootBorderPane;
|
||||
import static org.jcnc.jnotepad.views.root.bottom.RootBottomSideBarVerticalBox.initSidebarVerticalBox;
|
||||
|
||||
/**
|
||||
* 视图管理器类,用于管理记事本应用程序的视图组件。
|
||||
* 根布局管理器类,用于管理记事本应用程序的根布局组件。
|
||||
*
|
||||
* <p>该类负责管理应用程序的视图组件,包括主界面布局和标签页索引等。</p>
|
||||
* <p>该类负责管理应用程序的视图组件,包括主界面布局</p>
|
||||
*
|
||||
* @author 许轲
|
||||
*/
|
||||
public class ViewManager {
|
||||
public class RootManager {
|
||||
|
||||
private static ViewManager instance = null;
|
||||
private static RootManager instance = null;
|
||||
|
||||
/**
|
||||
* 主布局
|
||||
@ -28,35 +28,35 @@ public class ViewManager {
|
||||
*
|
||||
* @param scene 与视图相关联的 JavaFX 场景。
|
||||
*/
|
||||
private ViewManager(Scene scene) {
|
||||
private RootManager(Scene scene) {
|
||||
root = new BorderPane();
|
||||
scene.setRoot(root);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 ViewManager 的实例。如果实例不存在,则创建一个新实例。
|
||||
* 获取 RootManager 的实例。如果实例不存在,则创建一个新实例。
|
||||
*
|
||||
* @param scene 与视图相关联的 JavaFX 场景。
|
||||
* @return ViewManager 的实例。
|
||||
* @return RootManager 的实例。
|
||||
*/
|
||||
public static ViewManager getInstance(Scene scene) {
|
||||
public static RootManager getInstance(Scene scene) {
|
||||
if (instance == null) {
|
||||
instance = new ViewManager(scene);
|
||||
instance = new RootManager(scene);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 ViewManager 的实例。
|
||||
* 获取 RootManager 的实例。
|
||||
*
|
||||
* @return ViewManager 的实例。
|
||||
* @return RootManager 的实例。
|
||||
* @throws AppException 如果实例未初始化。
|
||||
*/
|
||||
public static ViewManager getInstance() {
|
||||
public static RootManager getInstance() {
|
||||
if (instance != null) {
|
||||
return instance;
|
||||
} else {
|
||||
throw new AppException("ViewManager 的实例未初始化!");
|
||||
throw new AppException("RootManager 的实例未初始化!");
|
||||
}
|
||||
}
|
||||
|
||||
@ -67,10 +67,8 @@ public class ViewManager {
|
||||
* @param scene 与视图相关联的 JavaFX 场景。
|
||||
*/
|
||||
public void initScreen(Scene scene) {
|
||||
|
||||
// 创建主界面布局
|
||||
root = new BorderPane();
|
||||
/*root.setTop(CustomTitleBar.getInstance());*/
|
||||
root.setCenter(RootBorderPane.getInstance());
|
||||
|
||||
scene.setRoot(root);
|
||||
@ -0,0 +1,51 @@
|
||||
package org.jcnc.jnotepad.views.manager;
|
||||
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.event.EventHandler;
|
||||
import javafx.scene.control.Button;
|
||||
import org.jcnc.jnotepad.controller.event.handler.setting.SetBtn;
|
||||
import org.jcnc.jnotepad.views.root.left.sidebar.tools.SidebarToolBar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 侧边工具栏管理类
|
||||
*
|
||||
* @author gewuyou
|
||||
*/
|
||||
public class SidebarToolBarManager {
|
||||
private static final SidebarToolBarManager INSTANCE = new SidebarToolBarManager();
|
||||
/**
|
||||
* 工具栏
|
||||
*/
|
||||
SidebarToolBar sidebarToolBar = SidebarToolBar.getInstance();
|
||||
List<Button> buttonList = new ArrayList<>();
|
||||
|
||||
public static SidebarToolBarManager getInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
public void initSidebarToolBar() {
|
||||
registerSidebarToolBar();
|
||||
initButtons();
|
||||
}
|
||||
|
||||
private void initButtons() {
|
||||
// 将按钮添加到工具栏
|
||||
sidebarToolBar.getItems().addAll(buttonList);
|
||||
}
|
||||
|
||||
public void registerSidebarToolBar() {
|
||||
registerButton(sidebarToolBar.getSetButton(), new SetBtn());
|
||||
}
|
||||
|
||||
public void registerButton(Button button, EventHandler<ActionEvent> eventHandler) {
|
||||
buttonList.add(button);
|
||||
setButton(button, eventHandler);
|
||||
}
|
||||
|
||||
private void setButton(Button button, EventHandler<ActionEvent> eventHandler) {
|
||||
button.setOnAction(eventHandler);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,353 @@
|
||||
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.input.KeyCombination;
|
||||
import javafx.stage.Stage;
|
||||
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
|
||||
import org.jcnc.jnotepad.controller.config.AppConfigController;
|
||||
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.PluginManagerInterface;
|
||||
import org.jcnc.jnotepad.util.LogUtil;
|
||||
import org.jcnc.jnotepad.util.UiUtil;
|
||||
import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTabPane;
|
||||
import org.jcnc.jnotepad.views.root.top.menu.TopMenuBar;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static org.jcnc.jnotepad.common.constants.TextConstants.*;
|
||||
|
||||
/**
|
||||
* 顶部菜单栏管理类
|
||||
*
|
||||
* @author gewuyou
|
||||
*/
|
||||
public class TopMenuBarManager {
|
||||
private static final TopMenuBarManager INSTANCE = new TopMenuBarManager();
|
||||
private final TopMenuBar topMenuBar = TopMenuBar.getInstance();
|
||||
private final List<Menu> topMenu = 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, RadioMenuItem> languageMenuItems = new HashMap<>();
|
||||
Logger logger = LogUtil.getLogger(this.getClass());
|
||||
AppConfigController appConfigController = AppConfigController.getInstance();
|
||||
|
||||
private TopMenuBarManager() {
|
||||
|
||||
}
|
||||
|
||||
public static TopMenuBarManager getInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化菜单栏
|
||||
*/
|
||||
|
||||
public void initTopMenuBar() {
|
||||
topMenuBar.setPadding(new Insets(-3, 0, -3, 0));
|
||||
registerTopMenuBar();
|
||||
// 初始化文件菜单
|
||||
initFileMenu();
|
||||
// 初始化语言菜单
|
||||
initLanguageMenu();
|
||||
// 设置当前语言选中状态
|
||||
toggleLanguageCheck(appConfigController.getLanguage());
|
||||
// 初始化设置菜单
|
||||
initSettingMenu();
|
||||
// 初始化插件菜单
|
||||
initPluginMenu();
|
||||
// 刷新顶部菜单栏
|
||||
refreshTopMenuBar();
|
||||
// 初始化快捷键
|
||||
initShortcutKeys();
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册顶部菜单栏
|
||||
*/
|
||||
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());
|
||||
|
||||
// 语言菜单
|
||||
registerLanguageMenuItem(topMenuBar.getChineseItem(), UPPER_CHINESE, Locale.CHINESE, this::toggleLanguage);
|
||||
registerLanguageMenuItem(topMenuBar.getEnglishItem(), UPPER_ENGLISH, Locale.ENGLISH, this::toggleLanguage);
|
||||
|
||||
|
||||
// 设置菜单
|
||||
registerSetMenuItem(topMenuBar.getLineFeedItem(), WORD_WRAP, "lineFeedItem", (observableValue, before, after) -> {
|
||||
// 1. 更新全局配置
|
||||
AppConfigController.getInstance().setAutoLineConfig(after);
|
||||
// 2. 对当前tab生效配置
|
||||
CenterTabPane.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.getAddItem(), ADD_PLUGIN, "addItem", event -> {
|
||||
PluginManagerInterface pluginManagerInterface = PluginManagerInterface.getInstance();
|
||||
Stage stage = new Stage();
|
||||
stage.getIcons().add(UiUtil.getAppIcon());
|
||||
pluginManagerInterface.start(stage);
|
||||
});
|
||||
registerPluginMenuItem(topMenuBar.getCountItem(), STATISTICS, "countItem", event -> {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换语言
|
||||
*
|
||||
* @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 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化快捷键
|
||||
*/
|
||||
public void initShortcutKeys() {
|
||||
List<MenuItem> itemsToUnbind = new ArrayList<>();
|
||||
List<ShortcutKey> shortcutKeyConfigs = appConfigController.getShortcutKey();
|
||||
for (ShortcutKey shortcutKey : shortcutKeyConfigs) {
|
||||
// 保证json的key必须和变量名一致
|
||||
MenuItem menuItem = topMenuBar.getItemMap().get(shortcutKey.getButtonName());
|
||||
String shortKeyValue = shortcutKey.getShortcutKeyValue();
|
||||
if (Objects.isNull(menuItem) || "".equals(shortKeyValue)) {
|
||||
itemsToUnbind.add(menuItem);
|
||||
continue;
|
||||
}
|
||||
logger.info("功能名称:{}->快捷键:{}", menuItem.getText(), shortKeyValue);
|
||||
// 动态添加快捷键
|
||||
menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue));
|
||||
}
|
||||
// 解绑需要解绑的快捷键
|
||||
itemsToUnbind.forEach(menuItem -> menuItem.setAccelerator(null));
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化顶部菜单
|
||||
*/
|
||||
private void refreshTopMenuBar() {
|
||||
ObservableList<Menu> menus = topMenuBar.getMenus();
|
||||
menus.clear();
|
||||
menus.addAll(topMenu);
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化插件菜单
|
||||
*/
|
||||
private void initPluginMenu() {
|
||||
logger.info("初始化插件菜单!");
|
||||
var pluginMenu = topMenuBar.getPluginMenu();
|
||||
// 插件菜单
|
||||
UiResourceBundle.bindStringProperty(pluginMenu.textProperty(), PLUGIN);
|
||||
initMenuItems(pluginMenuItems, pluginMenu);
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化设置菜单
|
||||
*/
|
||||
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);
|
||||
});
|
||||
topMenu.add(menu);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -71,6 +71,9 @@ public class CenterTabPane extends TabPane {
|
||||
*/
|
||||
public void fireTabSelected() {
|
||||
CenterTab selectedTab = getSelected();
|
||||
if (selectedTab == null) {
|
||||
return;
|
||||
}
|
||||
selectedTab.setAutoLine(AppConfigController.getInstance().getAutoLineConfig());
|
||||
BottomStatusBox.getInstance().updateWhenTabSelected();
|
||||
}
|
||||
|
||||
@ -42,9 +42,6 @@ public class SidebarToolBar extends javafx.scene.control.ToolBar {
|
||||
setButton.setGraphic(imageView);
|
||||
setButton.setPrefWidth(imageView.getFitWidth() + 20);
|
||||
setButton.setPrefHeight(imageView.getFitHeight() + 20);
|
||||
|
||||
// 将按钮添加到工具栏
|
||||
getItems().addAll(setButton);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1,27 +1,11 @@
|
||||
package org.jcnc.jnotepad.views.root.top.menu;
|
||||
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.input.KeyCombination;
|
||||
import javafx.stage.Stage;
|
||||
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
|
||||
import org.jcnc.jnotepad.controller.config.AppConfigController;
|
||||
import org.jcnc.jnotepad.controller.event.handler.menubar.*;
|
||||
import org.jcnc.jnotepad.controller.event.handler.util.SetBtn;
|
||||
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
|
||||
import org.jcnc.jnotepad.model.entity.ShortcutKey;
|
||||
import org.jcnc.jnotepad.plugin.PluginManagerInterface;
|
||||
import org.jcnc.jnotepad.util.LogUtil;
|
||||
import org.jcnc.jnotepad.util.UiUtil;
|
||||
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.left.sidebar.tools.SidebarToolBar;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static org.jcnc.jnotepad.common.constants.TextConstants.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 封装菜单栏组件。
|
||||
@ -39,295 +23,80 @@ public class TopMenuBar extends MenuBar {
|
||||
* 标签页布局组件封装。
|
||||
*/
|
||||
CenterTabPane centerTabPane = CenterTabPane.getInstance();
|
||||
AppConfigController appConfigController = AppConfigController.getInstance();
|
||||
Logger logger = LogUtil.getLogger(this.getClass());
|
||||
/**
|
||||
* 工具栏
|
||||
*/
|
||||
SidebarToolBar sidebarToolBar = SidebarToolBar.getInstance();
|
||||
/**
|
||||
* 获取工具栏中的setButton
|
||||
*/
|
||||
Button setButton = sidebarToolBar.getSetButton();
|
||||
/**
|
||||
* 文件菜单
|
||||
*/
|
||||
private Menu fileMenu;
|
||||
private final Menu fileMenu = new Menu();
|
||||
/**
|
||||
* 设置菜单
|
||||
*/
|
||||
private Menu setMenu;
|
||||
private final Menu setMenu = new Menu();
|
||||
|
||||
/// 菜单按钮
|
||||
/**
|
||||
* 插件菜单
|
||||
*/
|
||||
private Menu pluginMenu;
|
||||
private final Menu pluginMenu = new Menu();
|
||||
/**
|
||||
* 语言菜单
|
||||
*/
|
||||
private Menu languageMenu;
|
||||
private final Menu languageMenu = new Menu();
|
||||
/**
|
||||
* 新建
|
||||
*/
|
||||
private MenuItem newItem;
|
||||
private final MenuItem newItem = new MenuItem();
|
||||
/**
|
||||
* 打开
|
||||
*/
|
||||
private MenuItem openItem;
|
||||
private final MenuItem openItem = new MenuItem();
|
||||
/**
|
||||
* 另存为
|
||||
*/
|
||||
private MenuItem saveAsItem;
|
||||
private final MenuItem saveAsItem = new MenuItem();
|
||||
/**
|
||||
* 保存
|
||||
*/
|
||||
private MenuItem saveItem;
|
||||
private final MenuItem saveItem = new MenuItem();
|
||||
/**
|
||||
* 重命名
|
||||
*/
|
||||
private MenuItem renameItem;
|
||||
private final MenuItem renameItem = new MenuItem();
|
||||
/**
|
||||
* 增加
|
||||
*/
|
||||
private MenuItem addItem;
|
||||
private final MenuItem addItem = new MenuItem();
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
private MenuItem countItem;
|
||||
private final MenuItem countItem = new MenuItem();
|
||||
/**
|
||||
* 打开配置文件
|
||||
*/
|
||||
private MenuItem openConfigItem;
|
||||
private final MenuItem openConfigItem = new MenuItem();
|
||||
/**
|
||||
* 自动换行点击菜单按钮
|
||||
*/
|
||||
private CheckMenuItem lineFeedItem;
|
||||
private final CheckMenuItem lineFeedItem = new CheckMenuItem();
|
||||
/**
|
||||
* 置顶按钮
|
||||
*/
|
||||
private CheckMenuItem topItem;
|
||||
private final CheckMenuItem topItem = new CheckMenuItem();
|
||||
/**
|
||||
* 中文选项
|
||||
*/
|
||||
private RadioMenuItem chineseItem;
|
||||
private final RadioMenuItem chineseItem = new RadioMenuItem();
|
||||
/**
|
||||
* 英文选项
|
||||
*/
|
||||
private RadioMenuItem englishItem;
|
||||
private final RadioMenuItem englishItem = new RadioMenuItem();
|
||||
|
||||
private TopMenuBar() {
|
||||
initMenuBar();
|
||||
}
|
||||
|
||||
public static TopMenuBar getInstance() {
|
||||
return MENU_BAR;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置当前语言选中状态
|
||||
*
|
||||
* @param language 语言
|
||||
*/
|
||||
public void toggleLanguageCheck(String language) {
|
||||
switch (language) {
|
||||
case CHINESE -> chineseItem.setSelected(true);
|
||||
case ENGLISH -> englishItem.setSelected(true);
|
||||
default -> logger.error("未知语言:{}", language);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 初始化菜单栏
|
||||
*/
|
||||
public void initMenuBar() {
|
||||
setPadding(new Insets(-3,0,-3,0));
|
||||
initFileMenu();
|
||||
initLanguageMenu();
|
||||
initSettingMenu();
|
||||
initPluginMenu();
|
||||
this.getMenus().clear();
|
||||
// 菜单栏
|
||||
this.getMenus().addAll(fileMenu, setMenu, pluginMenu);
|
||||
initEventHandlers();
|
||||
initShortcutKeys();
|
||||
toggleLanguageCheck(appConfigController.getLanguage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化快捷键。
|
||||
*/
|
||||
public void initShortcutKeys() {
|
||||
List<ShortcutKey> shortcutKeyConfigs = appConfigController.getShortcutKey();
|
||||
//FIXME: 如果shortcutKey不存在,需要解绑已绑定的快捷键
|
||||
for (ShortcutKey shortcutKey : shortcutKeyConfigs) {
|
||||
// 保证json的key必须和变量名一致
|
||||
MenuItem menuItem = this.itemMap.get(shortcutKey.getButtonName());
|
||||
String shortKeyValue = shortcutKey.getShortcutKeyValue();
|
||||
if (Objects.isNull(menuItem) || "".equals(shortKeyValue)) {
|
||||
continue;
|
||||
}
|
||||
logger.info("功能名称:{}->快捷键:{}", menuItem.getText(), shortKeyValue);
|
||||
// 动态添加快捷键
|
||||
menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化语言菜单
|
||||
*/
|
||||
private void initLanguageMenu() {
|
||||
logger.info("初始化语言菜单!");
|
||||
// 语言菜单
|
||||
languageMenu = new Menu();
|
||||
UiResourceBundle.bindStringProperty(languageMenu.textProperty(), LANGUAGE);
|
||||
ToggleGroup languageToggleGroup = new ToggleGroup();
|
||||
|
||||
chineseItem = new RadioMenuItem();
|
||||
UiResourceBundle.bindStringProperty(chineseItem.textProperty(), UPPER_CHINESE);
|
||||
chineseItem.setUserData(Locale.CHINESE);
|
||||
itemMap.put("chineseItem", chineseItem);
|
||||
languageToggleGroup.getToggles().add(chineseItem);
|
||||
|
||||
englishItem = new RadioMenuItem();
|
||||
UiResourceBundle.bindStringProperty(englishItem.textProperty(), UPPER_ENGLISH);
|
||||
englishItem.setUserData(Locale.ENGLISH);
|
||||
itemMap.put("englishItem", englishItem);
|
||||
languageToggleGroup.getToggles().add(englishItem);
|
||||
|
||||
languageMenu.getItems().addAll(chineseItem, englishItem);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化文件菜单
|
||||
*/
|
||||
private void initFileMenu() {
|
||||
logger.info("初始化文件菜单!");
|
||||
// 文件菜单
|
||||
fileMenu = new Menu();
|
||||
UiResourceBundle.bindStringProperty(fileMenu.textProperty(), FILE);
|
||||
|
||||
newItem = new MenuItem();
|
||||
UiResourceBundle.bindStringProperty(newItem.textProperty(), NEW);
|
||||
|
||||
itemMap.put("newItem", newItem);
|
||||
|
||||
openItem = new MenuItem();
|
||||
UiResourceBundle.bindStringProperty(openItem.textProperty(), OPEN);
|
||||
itemMap.put("openItem", openItem);
|
||||
|
||||
saveItem = new MenuItem();
|
||||
UiResourceBundle.bindStringProperty(saveItem.textProperty(), SAVE);
|
||||
itemMap.put("saveItem", saveItem);
|
||||
|
||||
saveAsItem = new MenuItem();
|
||||
UiResourceBundle.bindStringProperty(saveAsItem.textProperty(), SAVE_AS);
|
||||
itemMap.put("saveAsItem", saveAsItem);
|
||||
|
||||
renameItem = new MenuItem();
|
||||
UiResourceBundle.bindStringProperty(renameItem.textProperty(), RENAME);
|
||||
itemMap.put("renameItem", renameItem);
|
||||
|
||||
fileMenu.getItems().addAll(newItem, openItem, saveItem, saveAsItem, renameItem);
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化设置菜单
|
||||
*/
|
||||
private void initSettingMenu() {
|
||||
logger.info("初始化设置菜单");
|
||||
// 设置菜单
|
||||
setMenu = new Menu();
|
||||
UiResourceBundle.bindStringProperty(setMenu.textProperty(), SET);
|
||||
|
||||
lineFeedItem = new CheckMenuItem();
|
||||
UiResourceBundle.bindStringProperty(lineFeedItem.textProperty(), WORD_WRAP);
|
||||
itemMap.put("lineFeedItem", lineFeedItem);
|
||||
lineFeedItem.selectedProperty().set(true);
|
||||
|
||||
topItem = new CheckMenuItem();
|
||||
UiResourceBundle.bindStringProperty(topItem.textProperty(), TOP);
|
||||
itemMap.put("topItem", topItem);
|
||||
|
||||
openConfigItem = new MenuItem();
|
||||
UiResourceBundle.bindStringProperty(openConfigItem.textProperty(), OPEN_CONFIGURATION_FILE);
|
||||
itemMap.put("openConfigItem", openConfigItem);
|
||||
|
||||
itemMap.put("languageMenu", languageMenu);
|
||||
setMenu.getItems().addAll(lineFeedItem, openConfigItem, topItem, languageMenu);
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化插件菜单
|
||||
*/
|
||||
private void initPluginMenu() {
|
||||
logger.info("初始化插件菜单!");
|
||||
// 插件菜单
|
||||
pluginMenu = new Menu();
|
||||
UiResourceBundle.bindStringProperty(pluginMenu.textProperty(), PLUGIN);
|
||||
|
||||
addItem = new MenuItem();
|
||||
addItem.setOnAction(event -> {
|
||||
PluginManagerInterface pluginManagerInterface = PluginManagerInterface.getInstance();
|
||||
Stage stage = new Stage();
|
||||
stage.getIcons().add(UiUtil.getAppIcon());
|
||||
pluginManagerInterface.start(stage);
|
||||
});
|
||||
UiResourceBundle.bindStringProperty(addItem.textProperty(), ADD_PLUGIN);
|
||||
itemMap.put("addItem", addItem);
|
||||
|
||||
countItem = new MenuItem();
|
||||
UiResourceBundle.bindStringProperty(countItem.textProperty(), STATISTICS);
|
||||
itemMap.put("countItem", countItem);
|
||||
|
||||
pluginMenu.getItems().addAll(addItem, countItem);
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化事件处理
|
||||
*/
|
||||
private void initEventHandlers() {
|
||||
newItem.setOnAction(new NewFile());
|
||||
openItem.setOnAction(new OpenFile());
|
||||
saveItem.setOnAction(new SaveFile());
|
||||
saveAsItem.setOnAction(new SaveAsFile());
|
||||
openConfigItem.setOnAction(new OpenConfig());
|
||||
renameItem.setOnAction(new RenameFile());
|
||||
setButton.setOnAction(new SetBtn());
|
||||
lineFeedItem.selectedProperty().addListener((observableValue, before, after) -> {
|
||||
// 1. 更新全局配置
|
||||
AppConfigController.getInstance().setAutoLineConfig(after);
|
||||
// 2. 对当前tab生效配置
|
||||
centerTabPane.fireTabSelected();
|
||||
});
|
||||
topItem.selectedProperty().addListener((observableValue, before, after) -> {
|
||||
// 获取窗口容器
|
||||
Stage primaryStage = (Stage) this.getScene().getWindow();
|
||||
// 设置窗口为置顶
|
||||
primaryStage.setAlwaysOnTop(after);
|
||||
});
|
||||
englishItem.setOnAction(this::toggleLanguage);
|
||||
chineseItem.setOnAction(this::toggleLanguage);
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换语言
|
||||
*
|
||||
* @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());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据当前选中tab,更新菜单选项
|
||||
@ -336,4 +105,72 @@ public class TopMenuBar extends MenuBar {
|
||||
CenterTab selectedTab = centerTabPane.getSelected();
|
||||
lineFeedItem.selectedProperty().setValue(selectedTab.isAutoLine());
|
||||
}
|
||||
|
||||
public Menu getFileMenu() {
|
||||
return fileMenu;
|
||||
}
|
||||
|
||||
public Menu getSetMenu() {
|
||||
return setMenu;
|
||||
}
|
||||
|
||||
public Menu getPluginMenu() {
|
||||
return pluginMenu;
|
||||
}
|
||||
|
||||
public Menu getLanguageMenu() {
|
||||
return languageMenu;
|
||||
}
|
||||
|
||||
public Map<String, MenuItem> getItemMap() {
|
||||
return itemMap;
|
||||
}
|
||||
|
||||
public MenuItem getNewItem() {
|
||||
return newItem;
|
||||
}
|
||||
|
||||
public MenuItem getOpenItem() {
|
||||
return openItem;
|
||||
}
|
||||
|
||||
public MenuItem getSaveAsItem() {
|
||||
return saveAsItem;
|
||||
}
|
||||
|
||||
public MenuItem getSaveItem() {
|
||||
return saveItem;
|
||||
}
|
||||
|
||||
public MenuItem getRenameItem() {
|
||||
return renameItem;
|
||||
}
|
||||
|
||||
public MenuItem getAddItem() {
|
||||
return addItem;
|
||||
}
|
||||
|
||||
public MenuItem getCountItem() {
|
||||
return countItem;
|
||||
}
|
||||
|
||||
public MenuItem getOpenConfigItem() {
|
||||
return openConfigItem;
|
||||
}
|
||||
|
||||
public CheckMenuItem getLineFeedItem() {
|
||||
return lineFeedItem;
|
||||
}
|
||||
|
||||
public CheckMenuItem getTopItem() {
|
||||
return topItem;
|
||||
}
|
||||
|
||||
public RadioMenuItem getChineseItem() {
|
||||
return chineseItem;
|
||||
}
|
||||
|
||||
public RadioMenuItem getEnglishItem() {
|
||||
return englishItem;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user