commit
5659fc8591
@ -26,12 +26,16 @@ public class JnotepadApp extends Application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(Stage primaryStage) {
|
public void init() {
|
||||||
// 获取当前启动位置a
|
// 获取当前启动位置a
|
||||||
String currentWorkingDirectory = System.getProperty("user.dir");
|
String currentWorkingDirectory = System.getProperty("user.dir");
|
||||||
LogUtil.getLogger(this.getClass()).info("当前启动位置:{}", currentWorkingDirectory);
|
LogUtil.getLogger(this.getClass()).info("当前启动位置:{}", currentWorkingDirectory);
|
||||||
// 设置参数
|
// 设置参数
|
||||||
APPLICATION_MANAGER.setApplication(this);
|
APPLICATION_MANAGER.setApplication(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start(Stage primaryStage) {
|
||||||
APPLICATION_MANAGER.setPrimaryStage(primaryStage);
|
APPLICATION_MANAGER.setPrimaryStage(primaryStage);
|
||||||
// 加载应用程序资源
|
// 加载应用程序资源
|
||||||
APPLICATION_MANAGER.loadAppResources();
|
APPLICATION_MANAGER.loadAppResources();
|
||||||
|
|||||||
@ -0,0 +1,65 @@
|
|||||||
|
package org.jcnc.jnotepad.api.core.views.menu;
|
||||||
|
|
||||||
|
import javafx.scene.control.Menu;
|
||||||
|
import javafx.scene.control.MenuItem;
|
||||||
|
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
|
||||||
|
import org.jcnc.jnotepad.controller.config.UserConfigController;
|
||||||
|
import org.jcnc.jnotepad.ui.views.root.top.menubar.TopMenuBar;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 抽象基础菜单类
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* 此抽象类用于创建基础菜单,包括菜单项的注册和初始化。
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author gewuyou
|
||||||
|
*/
|
||||||
|
public abstract class AbstractBaseMenu extends AbstractMenu<Menu> {
|
||||||
|
protected final TopMenuBar topMenuBar = TopMenuBar.getInstance();
|
||||||
|
protected final UserConfigController userConfigController = UserConfigController.getInstance();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取菜单名称
|
||||||
|
*
|
||||||
|
* @return 菜单名称
|
||||||
|
*/
|
||||||
|
public abstract String getMenuName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化菜单项
|
||||||
|
*
|
||||||
|
* @param menuItems 菜单项集合
|
||||||
|
* @param menu 菜单
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void initMenuItems(Map<String, MenuItem> menuItems, Menu menu) {
|
||||||
|
logger.info("初始化菜单项!");
|
||||||
|
Map<String, MenuItem> menuItemMap = new HashMap<>(16);
|
||||||
|
// 本地化
|
||||||
|
menuItems.forEach((key, value) -> {
|
||||||
|
UiResourceBundle.bindStringProperty(value.textProperty(), key);
|
||||||
|
menuItemMap.put((String) value.getUserData(), value);
|
||||||
|
menu.getItems().add(value);
|
||||||
|
});
|
||||||
|
userConfigController.getMenuItems().add(menuItemMap);
|
||||||
|
userConfigController.initShortcutKeys(menuItemMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化菜单栏
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void initMenu() {
|
||||||
|
registerMenu();
|
||||||
|
logger.info("初始化菜单!");
|
||||||
|
Menu menu = getMenu();
|
||||||
|
// 菜单名称国际化
|
||||||
|
UiResourceBundle.bindStringProperty(menu.textProperty(), getMenuName());
|
||||||
|
// 初始化菜单项
|
||||||
|
initMenuItems(getMenuItems(), menu);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package org.jcnc.jnotepad.api.core.views.top.menu;
|
package org.jcnc.jnotepad.api.core.views.menu;
|
||||||
|
|
||||||
import javafx.beans.value.ChangeListener;
|
import javafx.beans.value.ChangeListener;
|
||||||
import javafx.event.ActionEvent;
|
import javafx.event.ActionEvent;
|
||||||
@ -7,40 +7,25 @@ import javafx.scene.control.CheckMenuItem;
|
|||||||
import javafx.scene.control.Menu;
|
import javafx.scene.control.Menu;
|
||||||
import javafx.scene.control.MenuItem;
|
import javafx.scene.control.MenuItem;
|
||||||
import javafx.scene.control.RadioMenuItem;
|
import javafx.scene.control.RadioMenuItem;
|
||||||
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
|
|
||||||
import org.jcnc.jnotepad.app.utils.LogUtil;
|
import org.jcnc.jnotepad.app.utils.LogUtil;
|
||||||
import org.jcnc.jnotepad.ui.views.root.top.menubar.TopMenuBar;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 抽象顶部菜单类
|
* 抽象菜单类
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* 此抽象类用于创建顶部菜单,包括菜单项的注册和初始化。
|
|
||||||
* </p>
|
|
||||||
*
|
*
|
||||||
* @author gewuyou
|
* @author gewuyou
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractTopMenu {
|
public abstract class AbstractMenu<T> {
|
||||||
protected final TopMenuBar topMenuBar = TopMenuBar.getInstance();
|
|
||||||
|
|
||||||
protected Logger logger = LogUtil.getLogger(this.getClass());
|
protected Logger logger = LogUtil.getLogger(this.getClass());
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取菜单名称
|
|
||||||
*
|
|
||||||
* @return 菜单名称
|
|
||||||
*/
|
|
||||||
public abstract String getMenuName();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取菜单
|
* 获取菜单
|
||||||
*
|
*
|
||||||
* @return 菜单
|
* @return 菜单
|
||||||
*/
|
*/
|
||||||
public abstract Menu getMenu();
|
public abstract T getMenu();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取菜单项集合
|
* 获取菜单项集合
|
||||||
@ -50,9 +35,15 @@ public abstract class AbstractTopMenu {
|
|||||||
public abstract Map<String, MenuItem> getMenuItems();
|
public abstract Map<String, MenuItem> getMenuItems();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册顶部菜单
|
* 注册菜单
|
||||||
*/
|
*/
|
||||||
protected abstract void registerTopMenu();
|
protected abstract void registerMenu();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化菜单
|
||||||
|
*/
|
||||||
|
protected abstract void initMenu();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册菜单项
|
* 注册菜单项
|
||||||
@ -68,6 +59,20 @@ public abstract class AbstractTopMenu {
|
|||||||
menuItem.setOnAction(eventHandler);
|
menuItem.setOnAction(eventHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册菜单项
|
||||||
|
*
|
||||||
|
* @param menuItem 菜单项
|
||||||
|
* @param menuItemName 菜单项名称
|
||||||
|
* @param userData 用户数据,用来存放必要的数据,比如按钮菜单项名称
|
||||||
|
* @param eventHandler 事件处理器
|
||||||
|
*/
|
||||||
|
public void registerMenuItem(MenuItem menuItem, String menuItemName, Object userData, EventHandler<ActionEvent> eventHandler, boolean isDisable) {
|
||||||
|
if (!isDisable) {
|
||||||
|
registerMenuItem(menuItem, menuItemName, userData, eventHandler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册检查菜单项
|
* 注册检查菜单项
|
||||||
*
|
*
|
||||||
@ -82,6 +87,32 @@ public abstract class AbstractTopMenu {
|
|||||||
checkMenuItem.selectedProperty().addListener(listener);
|
checkMenuItem.selectedProperty().addListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在给定菜单映射中注册具有指定名称、用户数据和事件处理程序的菜单项。
|
||||||
|
*
|
||||||
|
* @param menu 菜单项映射
|
||||||
|
* @param menuItemName 要注册的菜单项的名称
|
||||||
|
* @param userData 与菜单项关联的用户数据
|
||||||
|
*/
|
||||||
|
public void registerMenu(Menu menu, String menuItemName, Object userData) {
|
||||||
|
getMenuItems().put(menuItemName, menu);
|
||||||
|
menu.setUserData(userData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a menu item in the specified menu with the given name and user data.
|
||||||
|
*
|
||||||
|
* @param menu the menu to register the item in
|
||||||
|
* @param menuItemName the name of the menu item
|
||||||
|
* @param userData the user data associated with the menu item
|
||||||
|
* @param isDisable whether the menu item is disabled
|
||||||
|
*/
|
||||||
|
public void registerMenu(Menu menu, String menuItemName, Object userData, boolean isDisable) {
|
||||||
|
if (!isDisable) {
|
||||||
|
registerMenu(menu, menuItemName, userData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册单选菜单项
|
* 注册单选菜单项
|
||||||
*
|
*
|
||||||
@ -96,32 +127,12 @@ public abstract class AbstractTopMenu {
|
|||||||
radioMenuItem.setOnAction(eventHandler);
|
radioMenuItem.setOnAction(eventHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化菜单栏
|
|
||||||
*/
|
|
||||||
public void initMenu() {
|
|
||||||
registerTopMenu();
|
|
||||||
logger.info("初始化菜单!");
|
|
||||||
Menu menu = getMenu();
|
|
||||||
// 菜单名称国际化
|
|
||||||
UiResourceBundle.bindStringProperty(menu.textProperty(), getMenuName());
|
|
||||||
// 初始化菜单项
|
|
||||||
initMenuItems(getMenuItems(), menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 初始化菜单项
|
* 初始化菜单项
|
||||||
*
|
*
|
||||||
* @param menuItems 菜单项集合
|
* @param menuItems 菜单项集合
|
||||||
* @param menu 菜单
|
* @param menu 菜单
|
||||||
*/
|
*/
|
||||||
private void initMenuItems(Map<String, MenuItem> menuItems, Menu menu) {
|
protected abstract void initMenuItems(Map<String, MenuItem> menuItems, T 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);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -19,7 +19,6 @@ import org.jcnc.jnotepad.ui.component.module.TextCodeArea;
|
|||||||
import org.jcnc.jnotepad.ui.component.stage.dialog.factory.impl.BasicFileChooserFactory;
|
import org.jcnc.jnotepad.ui.component.stage.dialog.factory.impl.BasicFileChooserFactory;
|
||||||
import org.jcnc.jnotepad.ui.views.manager.BottomStatusBoxManager;
|
import org.jcnc.jnotepad.ui.views.manager.BottomStatusBoxManager;
|
||||||
import org.jcnc.jnotepad.ui.views.manager.CenterTabPaneManager;
|
import org.jcnc.jnotepad.ui.views.manager.CenterTabPaneManager;
|
||||||
import org.jcnc.jnotepad.ui.views.manager.TopMenuBarManager;
|
|
||||||
import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTab;
|
import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTab;
|
||||||
import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTabPane;
|
import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTabPane;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -63,7 +62,7 @@ public class TabUtil {
|
|||||||
if (CONFIG_NAME.equals(tab.getText())) {
|
if (CONFIG_NAME.equals(tab.getText())) {
|
||||||
// 重新加载语言包和快捷键
|
// 重新加载语言包和快捷键
|
||||||
UserConfigController.getInstance().loadConfig();
|
UserConfigController.getInstance().loadConfig();
|
||||||
TopMenuBarManager.getInstance().initShortcutKeys();
|
UserConfigController.getInstance().initAllShortcutKeys();
|
||||||
LocalizationController.initLocal();
|
LocalizationController.initLocal();
|
||||||
logger.info("已刷新语言包!");
|
logger.info("已刷新语言包!");
|
||||||
logger.info("已刷新快捷键!");
|
logger.info("已刷新快捷键!");
|
||||||
@ -365,13 +364,9 @@ public class TabUtil {
|
|||||||
.addMenu(
|
.addMenu(
|
||||||
new MenuBuilder("复制")
|
new MenuBuilder("复制")
|
||||||
.addMenuItem("文件名", e -> {
|
.addMenuItem("文件名", e -> {
|
||||||
ClipboardUtil.writeTextToClipboard(tab.getText());
|
ClipboardUtil.writeTextToClipboard(file.getName());
|
||||||
NotificationUtil.infoNotification("已复制文件名!");
|
NotificationUtil.infoNotification("已复制文件名!");
|
||||||
}, tab.isRelevance())
|
}, tab.isRelevance())
|
||||||
.addMenuItem("标签页名", e -> {
|
|
||||||
ClipboardUtil.writeTextToClipboard(tab.getText());
|
|
||||||
NotificationUtil.infoNotification("已复制标签页名!");
|
|
||||||
}, !tab.isRelevance())
|
|
||||||
.addMenuItem("文件路径", e -> {
|
.addMenuItem("文件路径", e -> {
|
||||||
ClipboardUtil.writeTextToClipboard(file.getAbsolutePath());
|
ClipboardUtil.writeTextToClipboard(file.getAbsolutePath());
|
||||||
NotificationUtil.infoNotification("已复制文件路径!");
|
NotificationUtil.infoNotification("已复制文件路径!");
|
||||||
|
|||||||
@ -1,12 +1,17 @@
|
|||||||
package org.jcnc.jnotepad.controller.config;
|
package org.jcnc.jnotepad.controller.config;
|
||||||
|
|
||||||
|
import javafx.scene.control.MenuItem;
|
||||||
|
import javafx.scene.input.KeyCombination;
|
||||||
import org.jcnc.jnotepad.api.core.controller.config.BaseConfigController;
|
import org.jcnc.jnotepad.api.core.controller.config.BaseConfigController;
|
||||||
import org.jcnc.jnotepad.app.config.UserConfig;
|
import org.jcnc.jnotepad.app.config.UserConfig;
|
||||||
|
import org.jcnc.jnotepad.app.utils.LogUtil;
|
||||||
import org.jcnc.jnotepad.model.entity.ShortcutKey;
|
import org.jcnc.jnotepad.model.entity.ShortcutKey;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.jcnc.jnotepad.app.common.constants.AppConstants.PROGRAM_FILE_DIRECTORY;
|
import static org.jcnc.jnotepad.app.common.constants.AppConstants.PROGRAM_FILE_DIRECTORY;
|
||||||
import static org.jcnc.jnotepad.app.common.constants.TextConstants.CHINESE;
|
import static org.jcnc.jnotepad.app.common.constants.TextConstants.CHINESE;
|
||||||
@ -31,11 +36,16 @@ public class UserConfigController extends BaseConfigController<UserConfig> {
|
|||||||
private static final UserConfigController INSTANCE = new UserConfigController();
|
private static final UserConfigController INSTANCE = new UserConfigController();
|
||||||
private String configDir;
|
private String configDir;
|
||||||
|
|
||||||
|
private final List<Map<String, MenuItem>> menuItems = new ArrayList<>();
|
||||||
|
|
||||||
|
Logger logger = LogUtil.getLogger(this.getClass());
|
||||||
|
|
||||||
private UserConfigController() {
|
private UserConfigController() {
|
||||||
configDir = Paths.get(AppConfigController.getInstance().getConfig().getRootPath(), PROGRAM_FILE_DIRECTORY, ROOT_CONFIG_DIR).toString();
|
configDir = Paths.get(AppConfigController.getInstance().getConfig().getRootPath(), PROGRAM_FILE_DIRECTORY, ROOT_CONFIG_DIR).toString();
|
||||||
loadConfig();
|
loadConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取 UserConfigController 的实例。
|
* 获取 UserConfigController 的实例。
|
||||||
*
|
*
|
||||||
@ -164,4 +174,35 @@ public class UserConfigController extends BaseConfigController<UserConfig> {
|
|||||||
return getConfig().getShortcutKey();
|
return getConfig().getShortcutKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void initAllShortcutKeys() {
|
||||||
|
menuItems.forEach(this::initShortcutKeys);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化快捷键
|
||||||
|
*/
|
||||||
|
public void initShortcutKeys(Map<String, MenuItem> menuItemMap) {
|
||||||
|
List<MenuItem> itemsToUnbind = new ArrayList<>();
|
||||||
|
List<ShortcutKey> shortcutKeyConfigs = getShortcutKey();
|
||||||
|
for (ShortcutKey shortcutKey : shortcutKeyConfigs) {
|
||||||
|
// 保证json的key必须和变量名一致
|
||||||
|
MenuItem menuItem = menuItemMap.get(shortcutKey.getButtonName());
|
||||||
|
String shortKeyValue = shortcutKey.getShortcutKeyValue();
|
||||||
|
if ("".equals(shortKeyValue) && menuItem != null) {
|
||||||
|
itemsToUnbind.add(menuItem);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (menuItem != null) {
|
||||||
|
logger.info("功能名称:{}->快捷键:{}", menuItem.getText(), shortKeyValue);
|
||||||
|
// 动态添加快捷键
|
||||||
|
menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 解绑需要解绑的快捷键
|
||||||
|
itemsToUnbind.forEach(menuItem -> menuItem.setAccelerator(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Map<String, MenuItem>> getMenuItems() {
|
||||||
|
return menuItems;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,12 +3,9 @@ package org.jcnc.jnotepad.ui.views.manager;
|
|||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import javafx.geometry.Insets;
|
import javafx.geometry.Insets;
|
||||||
import javafx.scene.control.Menu;
|
import javafx.scene.control.Menu;
|
||||||
import javafx.scene.control.MenuItem;
|
|
||||||
import javafx.scene.input.KeyCombination;
|
|
||||||
import org.jcnc.jnotepad.api.core.views.manager.AbstractManager;
|
import org.jcnc.jnotepad.api.core.views.manager.AbstractManager;
|
||||||
import org.jcnc.jnotepad.app.utils.LogUtil;
|
import org.jcnc.jnotepad.app.utils.LogUtil;
|
||||||
import org.jcnc.jnotepad.controller.config.UserConfigController;
|
import org.jcnc.jnotepad.controller.config.UserConfigController;
|
||||||
import org.jcnc.jnotepad.model.entity.ShortcutKey;
|
|
||||||
import org.jcnc.jnotepad.ui.views.root.top.menubar.TopMenuBar;
|
import org.jcnc.jnotepad.ui.views.root.top.menubar.TopMenuBar;
|
||||||
import org.jcnc.jnotepad.ui.views.root.top.menubar.menu.*;
|
import org.jcnc.jnotepad.ui.views.root.top.menubar.menu.*;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -28,6 +25,7 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
|
|||||||
Logger logger = LogUtil.getLogger(this.getClass());
|
Logger logger = LogUtil.getLogger(this.getClass());
|
||||||
UserConfigController userConfigController = UserConfigController.getInstance();
|
UserConfigController userConfigController = UserConfigController.getInstance();
|
||||||
|
|
||||||
|
|
||||||
FileTopMenu fileTopMenu = FileTopMenu.getInstance();
|
FileTopMenu fileTopMenu = FileTopMenu.getInstance();
|
||||||
LanguageTopMenu languageTopMenu = LanguageTopMenu.getInstance();
|
LanguageTopMenu languageTopMenu = LanguageTopMenu.getInstance();
|
||||||
|
|
||||||
@ -63,13 +61,12 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
|
|||||||
helpTopMenu.initMenu();
|
helpTopMenu.initMenu();
|
||||||
// 初始化插件菜单
|
// 初始化插件菜单
|
||||||
pluginTopMenu.initMenu();
|
pluginTopMenu.initMenu();
|
||||||
|
// 初始化运行菜单
|
||||||
runTopMenu.initMenu();
|
runTopMenu.initMenu();
|
||||||
|
|
||||||
// 刷新顶部菜单栏
|
// 刷新顶部菜单栏
|
||||||
refreshTopMenuBar();
|
refreshTopMenuBar();
|
||||||
// 初始化快捷键
|
|
||||||
initShortcutKeys();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -93,30 +90,6 @@ public class TopMenuBarManager extends AbstractManager<Menu> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化快捷键
|
|
||||||
*/
|
|
||||||
public void initShortcutKeys() {
|
|
||||||
List<MenuItem> itemsToUnbind = new ArrayList<>();
|
|
||||||
List<ShortcutKey> shortcutKeyConfigs = userConfigController.getShortcutKey();
|
|
||||||
for (ShortcutKey shortcutKey : shortcutKeyConfigs) {
|
|
||||||
// 保证json的key必须和变量名一致
|
|
||||||
MenuItem menuItem = topMenuBar.getAllItemMap().get(shortcutKey.getButtonName());
|
|
||||||
String shortKeyValue = shortcutKey.getShortcutKeyValue();
|
|
||||||
if ("".equals(shortKeyValue) && menuItem != null) {
|
|
||||||
itemsToUnbind.add(menuItem);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (menuItem != null) {
|
|
||||||
logger.info("功能名称:{}->快捷键:{}", menuItem.getText(), shortKeyValue);
|
|
||||||
// 动态添加快捷键
|
|
||||||
menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 解绑需要解绑的快捷键
|
|
||||||
itemsToUnbind.forEach(menuItem -> menuItem.setAccelerator(null));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 刷新顶部菜单
|
* 刷新顶部菜单
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -4,9 +4,6 @@ import javafx.scene.control.*;
|
|||||||
import org.jcnc.jnotepad.ui.views.manager.CenterTabPaneManager;
|
import org.jcnc.jnotepad.ui.views.manager.CenterTabPaneManager;
|
||||||
import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTab;
|
import org.jcnc.jnotepad.ui.views.root.center.main.center.tab.CenterTab;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 封装菜单栏组件。
|
* 封装菜单栏组件。
|
||||||
*
|
*
|
||||||
@ -15,10 +12,6 @@ import java.util.Map;
|
|||||||
public class TopMenuBar extends MenuBar {
|
public class TopMenuBar extends MenuBar {
|
||||||
|
|
||||||
private static final TopMenuBar MENU_BAR = new TopMenuBar();
|
private static final TopMenuBar MENU_BAR = new TopMenuBar();
|
||||||
/**
|
|
||||||
* 按钮集合
|
|
||||||
*/
|
|
||||||
private final Map<String, MenuItem> allItemMap = new HashMap<>();
|
|
||||||
/**
|
/**
|
||||||
* 标签页布局组件封装。
|
* 标签页布局组件封装。
|
||||||
*/
|
*/
|
||||||
@ -153,8 +146,6 @@ public class TopMenuBar extends MenuBar {
|
|||||||
return helpMenu;
|
return helpMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public Menu getPluginMenu() {
|
public Menu getPluginMenu() {
|
||||||
return pluginMenu;
|
return pluginMenu;
|
||||||
}
|
}
|
||||||
@ -164,9 +155,6 @@ public class TopMenuBar extends MenuBar {
|
|||||||
return languageMenu;
|
return languageMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, MenuItem> getAllItemMap() {
|
|
||||||
return allItemMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MenuItem getNewItem() {
|
public MenuItem getNewItem() {
|
||||||
return newItem;
|
return newItem;
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package org.jcnc.jnotepad.ui.views.root.top.menubar.menu;
|
|||||||
|
|
||||||
import javafx.scene.control.Menu;
|
import javafx.scene.control.Menu;
|
||||||
import javafx.scene.control.MenuItem;
|
import javafx.scene.control.MenuItem;
|
||||||
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
|
import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
|
||||||
import org.jcnc.jnotepad.controller.event.handler.menuitem.*;
|
import org.jcnc.jnotepad.controller.event.handler.menuitem.*;
|
||||||
import org.jcnc.jnotepad.controller.event.handler.toolbar.OpenDirectory;
|
import org.jcnc.jnotepad.controller.event.handler.toolbar.OpenDirectory;
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.*;
|
|||||||
*
|
*
|
||||||
* @author gewuyou
|
* @author gewuyou
|
||||||
*/
|
*/
|
||||||
public class FileTopMenu extends AbstractTopMenu {
|
public class FileTopMenu extends AbstractBaseMenu {
|
||||||
private static final FileTopMenu INSTANCE = new FileTopMenu();
|
private static final FileTopMenu INSTANCE = new FileTopMenu();
|
||||||
private final Map<String, MenuItem> fileMenuItems = new HashMap<>();
|
private final Map<String, MenuItem> fileMenuItems = new HashMap<>();
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ public class FileTopMenu extends AbstractTopMenu {
|
|||||||
* 注册顶部菜单
|
* 注册顶部菜单
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void registerTopMenu() {
|
protected void registerMenu() {
|
||||||
// 文件菜单
|
// 文件菜单
|
||||||
registerMenuItem(topMenuBar.getNewItem(), NEW, "newItem", new NewFile());
|
registerMenuItem(topMenuBar.getNewItem(), NEW, "newItem", new NewFile());
|
||||||
registerMenuItem(topMenuBar.getOpenItem(), OPEN, "openItem", new OpenFile());
|
registerMenuItem(topMenuBar.getOpenItem(), OPEN, "openItem", new OpenFile());
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package org.jcnc.jnotepad.ui.views.root.top.menubar.menu;
|
|||||||
import javafx.scene.control.Menu;
|
import javafx.scene.control.Menu;
|
||||||
import javafx.scene.control.MenuItem;
|
import javafx.scene.control.MenuItem;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
|
import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
|
||||||
import org.jcnc.jnotepad.ui.component.stage.topmenu.help.DeveloperDebugPaneStage;
|
import org.jcnc.jnotepad.ui.component.stage.topmenu.help.DeveloperDebugPaneStage;
|
||||||
import org.jcnc.jnotepad.ui.component.stage.topmenu.help.HelpPaneStage;
|
import org.jcnc.jnotepad.ui.component.stage.topmenu.help.HelpPaneStage;
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.*;
|
|||||||
*
|
*
|
||||||
* @author gewuyou
|
* @author gewuyou
|
||||||
*/
|
*/
|
||||||
public class HelpTopMenu extends AbstractTopMenu {
|
public class HelpTopMenu extends AbstractBaseMenu {
|
||||||
|
|
||||||
private static final HelpTopMenu INSTANCE = new HelpTopMenu();
|
private static final HelpTopMenu INSTANCE = new HelpTopMenu();
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ public class HelpTopMenu extends AbstractTopMenu {
|
|||||||
* 注册顶部菜单
|
* 注册顶部菜单
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void registerTopMenu() {
|
protected void registerMenu() {
|
||||||
registerMenuItem(topMenuBar.getAboutItem(), ABOUT, "aboutItem", event -> new HelpPaneStage().run(new Stage()));
|
registerMenuItem(topMenuBar.getAboutItem(), ABOUT, "aboutItem", event -> new HelpPaneStage().run(new Stage()));
|
||||||
registerMenuItem(topMenuBar.getDeveloperItem(), DEVELOPER, "developerItem", event -> new DeveloperDebugPaneStage().run());
|
registerMenuItem(topMenuBar.getDeveloperItem(), DEVELOPER, "developerItem", event -> new DeveloperDebugPaneStage().run());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import javafx.scene.control.Menu;
|
|||||||
import javafx.scene.control.MenuItem;
|
import javafx.scene.control.MenuItem;
|
||||||
import javafx.scene.control.RadioMenuItem;
|
import javafx.scene.control.RadioMenuItem;
|
||||||
import javafx.scene.control.ToggleGroup;
|
import javafx.scene.control.ToggleGroup;
|
||||||
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
|
import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
|
||||||
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
|
import org.jcnc.jnotepad.app.i18n.UiResourceBundle;
|
||||||
import org.jcnc.jnotepad.controller.config.UserConfigController;
|
import org.jcnc.jnotepad.controller.config.UserConfigController;
|
||||||
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
|
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
|
||||||
@ -22,7 +22,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.*;
|
|||||||
*
|
*
|
||||||
* @author gewuyou
|
* @author gewuyou
|
||||||
*/
|
*/
|
||||||
public class LanguageTopMenu extends AbstractTopMenu {
|
public class LanguageTopMenu extends AbstractBaseMenu {
|
||||||
|
|
||||||
private static final LanguageTopMenu INSTANCE = new LanguageTopMenu();
|
private static final LanguageTopMenu INSTANCE = new LanguageTopMenu();
|
||||||
|
|
||||||
@ -69,14 +69,12 @@ public class LanguageTopMenu extends AbstractTopMenu {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void initMenu() {
|
public void initMenu() {
|
||||||
registerTopMenu();
|
registerMenu();
|
||||||
logger.info("初始化语言菜单!");
|
logger.info("初始化语言菜单!");
|
||||||
// 语言菜单
|
// 语言菜单
|
||||||
ToggleGroup languageToggleGroup = new ToggleGroup();
|
ToggleGroup languageToggleGroup = new ToggleGroup();
|
||||||
var itemMap = topMenuBar.getAllItemMap();
|
|
||||||
languageMenuItems.forEach((key, value) -> {
|
languageMenuItems.forEach((key, value) -> {
|
||||||
UiResourceBundle.bindStringProperty(value.textProperty(), key);
|
UiResourceBundle.bindStringProperty(value.textProperty(), key);
|
||||||
itemMap.put(key, value);
|
|
||||||
languageToggleGroup.getToggles().add(value);
|
languageToggleGroup.getToggles().add(value);
|
||||||
topMenuBar.getLanguageMenu().getItems().add(value);
|
topMenuBar.getLanguageMenu().getItems().add(value);
|
||||||
});
|
});
|
||||||
@ -91,7 +89,7 @@ public class LanguageTopMenu extends AbstractTopMenu {
|
|||||||
* @apiNote 此方法
|
* @apiNote 此方法
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void registerTopMenu() {
|
protected void registerMenu() {
|
||||||
registerRadioMenuItem(languageMenuItems, topMenuBar.getChineseItem(), UPPER_CHINESE, Locale.CHINESE, this::toggleLanguage);
|
registerRadioMenuItem(languageMenuItems, topMenuBar.getChineseItem(), UPPER_CHINESE, Locale.CHINESE, this::toggleLanguage);
|
||||||
registerRadioMenuItem(languageMenuItems, topMenuBar.getEnglishItem(), UPPER_ENGLISH, Locale.ENGLISH, this::toggleLanguage);
|
registerRadioMenuItem(languageMenuItems, topMenuBar.getEnglishItem(), UPPER_ENGLISH, Locale.ENGLISH, this::toggleLanguage);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package org.jcnc.jnotepad.ui.views.root.top.menubar.menu;
|
|||||||
|
|
||||||
import javafx.scene.control.Menu;
|
import javafx.scene.control.Menu;
|
||||||
import javafx.scene.control.MenuItem;
|
import javafx.scene.control.MenuItem;
|
||||||
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
|
import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
|
||||||
import org.jcnc.jnotepad.ui.component.stage.topmenu.plugin.PluginManagementPane;
|
import org.jcnc.jnotepad.ui.component.stage.topmenu.plugin.PluginManagementPane;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -15,7 +15,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.*;
|
|||||||
*
|
*
|
||||||
* @author gewuyou
|
* @author gewuyou
|
||||||
*/
|
*/
|
||||||
public class PluginTopMenu extends AbstractTopMenu {
|
public class PluginTopMenu extends AbstractBaseMenu {
|
||||||
|
|
||||||
private static final PluginTopMenu INSTANCE = new PluginTopMenu();
|
private static final PluginTopMenu INSTANCE = new PluginTopMenu();
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ public class PluginTopMenu extends AbstractTopMenu {
|
|||||||
* 注册顶部菜单
|
* 注册顶部菜单
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void registerTopMenu() {
|
protected void registerMenu() {
|
||||||
registerMenuItem(topMenuBar.getPluginManagerItem(), MANAGER_PLUGIN, "pluginManagerItem", event -> new PluginManagementPane().run());
|
registerMenuItem(topMenuBar.getPluginManagerItem(), MANAGER_PLUGIN, "pluginManagerItem", event -> new PluginManagementPane().run());
|
||||||
registerMenuItem(topMenuBar.getCountItem(), STATISTICS, "countItem", event -> {
|
registerMenuItem(topMenuBar.getCountItem(), STATISTICS, "countItem", event -> {
|
||||||
});
|
});
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import javafx.event.ActionEvent;
|
|||||||
import javafx.event.EventHandler;
|
import javafx.event.EventHandler;
|
||||||
import javafx.scene.control.Menu;
|
import javafx.scene.control.Menu;
|
||||||
import javafx.scene.control.MenuItem;
|
import javafx.scene.control.MenuItem;
|
||||||
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
|
import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
|
||||||
import org.jcnc.jnotepad.app.utils.LogUtil;
|
import org.jcnc.jnotepad.app.utils.LogUtil;
|
||||||
import org.jcnc.jnotepad.ui.component.module.vbox.BuildPanel;
|
import org.jcnc.jnotepad.ui.component.module.vbox.BuildPanel;
|
||||||
import org.jcnc.jnotepad.ui.views.manager.BuildPanelManager;
|
import org.jcnc.jnotepad.ui.views.manager.BuildPanelManager;
|
||||||
@ -23,7 +23,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.RUN;
|
|||||||
*
|
*
|
||||||
* @author gewuyou
|
* @author gewuyou
|
||||||
*/
|
*/
|
||||||
public class RunTopMenu extends AbstractTopMenu {
|
public class RunTopMenu extends AbstractBaseMenu {
|
||||||
private static final BuildPanelManager BUILD_PANEL_MANAGER = BuildPanelManager.getInstance();
|
private static final BuildPanelManager BUILD_PANEL_MANAGER = BuildPanelManager.getInstance();
|
||||||
private static final BuildPanel BUILD_PANEL = BuildPanel.getInstance();
|
private static final BuildPanel BUILD_PANEL = BuildPanel.getInstance();
|
||||||
private static final RunTopMenu INSTANCE = new RunTopMenu();
|
private static final RunTopMenu INSTANCE = new RunTopMenu();
|
||||||
@ -134,7 +134,7 @@ public class RunTopMenu extends AbstractTopMenu {
|
|||||||
* 注册顶部菜单
|
* 注册顶部菜单
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void registerTopMenu() {
|
protected void registerMenu() {
|
||||||
|
|
||||||
// 运行
|
// 运行
|
||||||
registerMenuItem(topMenuBar.getRunItem(), RUN, "runItem", codeRun);
|
registerMenuItem(topMenuBar.getRunItem(), RUN, "runItem", codeRun);
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package org.jcnc.jnotepad.ui.views.root.top.menubar.menu;
|
|||||||
import javafx.scene.control.Menu;
|
import javafx.scene.control.Menu;
|
||||||
import javafx.scene.control.MenuItem;
|
import javafx.scene.control.MenuItem;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu;
|
import org.jcnc.jnotepad.api.core.views.menu.AbstractBaseMenu;
|
||||||
import org.jcnc.jnotepad.app.utils.UiUtil;
|
import org.jcnc.jnotepad.app.utils.UiUtil;
|
||||||
import org.jcnc.jnotepad.controller.config.UserConfigController;
|
import org.jcnc.jnotepad.controller.config.UserConfigController;
|
||||||
import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenConfig;
|
import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenConfig;
|
||||||
@ -19,7 +19,7 @@ import static org.jcnc.jnotepad.app.common.constants.TextConstants.*;
|
|||||||
*
|
*
|
||||||
* @author gewuyou
|
* @author gewuyou
|
||||||
*/
|
*/
|
||||||
public class SettingTopMenu extends AbstractTopMenu {
|
public class SettingTopMenu extends AbstractBaseMenu {
|
||||||
|
|
||||||
private static final SettingTopMenu INSTANCE = new SettingTopMenu();
|
private static final SettingTopMenu INSTANCE = new SettingTopMenu();
|
||||||
private final Map<String, MenuItem> setMenuItems = new HashMap<>();
|
private final Map<String, MenuItem> setMenuItems = new HashMap<>();
|
||||||
@ -64,7 +64,7 @@ public class SettingTopMenu extends AbstractTopMenu {
|
|||||||
* @apiNote 此方法
|
* @apiNote 此方法
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void registerTopMenu() {
|
protected void registerMenu() {
|
||||||
registerMenuItem(topMenuBar.getLineFeedItem(), WORD_WRAP, "lineFeedItem", (observableValue, before, after) -> {
|
registerMenuItem(topMenuBar.getLineFeedItem(), WORD_WRAP, "lineFeedItem", (observableValue, before, after) -> {
|
||||||
// 1. 更新全局配置
|
// 1. 更新全局配置
|
||||||
UserConfigController.getInstance().setAutoLineConfig(after);
|
UserConfigController.getInstance().setAutoLineConfig(after);
|
||||||
|
|||||||
@ -28,3 +28,20 @@ MANAGER_PLUGIN=管理插件
|
|||||||
ENCODE=编码
|
ENCODE=编码
|
||||||
DE_BUG=调试
|
DE_BUG=调试
|
||||||
RUN=运行
|
RUN=运行
|
||||||
|
COPY=复制
|
||||||
|
FILE_NAME=文件名
|
||||||
|
FILE_PATH=文件路径
|
||||||
|
FOLDER_PATH=所在文件夹
|
||||||
|
EXPLORER=资源管理器
|
||||||
|
CLOSE=关闭
|
||||||
|
CLOSE_ALL_TABS=关闭所有标签页
|
||||||
|
CLOSE_LEFT_TABS=关闭左侧标签页
|
||||||
|
CLOSE_RIGHT_TABS=关闭右侧标签页
|
||||||
|
CLOSE_OTHER_TABS=关闭其他标签页
|
||||||
|
FIXED_TAB=固定标签页
|
||||||
|
UNFIXED_TAB=取消固定
|
||||||
|
READ_ONLY=只读
|
||||||
|
UNREAD_ONLY=取消只读
|
||||||
|
OPEN_ON=打开于
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user