From 18fe8b624a5700da59b10975e5d1167974eb7f9d Mon Sep 17 00:00:00 2001 From: hejl Date: Tue, 17 Jun 2025 15:28:22 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=8F=8C=E5=87=BBOK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/config/words_classes.yaml | 2 +- .../framework/controllers/file_provider.dart | 1 + .../controllers/tab_items_controller.dart | 5 +- .../lib/framework/widgets/app_scaffold.dart | 23 +++++- win_text_editor/lib/menus/app_menu.dart | 12 +-- .../controllers/call_function_controller.dart | 2 +- .../content_search_controller.dart | 2 +- .../controllers/data_compare_controller.dart | 2 +- .../controllers/data_extract_controller.dart | 2 +- .../controllers/data_format_controller.dart | 2 +- .../demo/controllers/demo_controller.dart | 2 +- .../controllers/memory_table_controller.dart | 2 +- .../lib/modules/module_router.dart | 4 - .../controllers/outline_controller.dart | 13 ---- .../outline/controllers/outline_provider.dart | 15 +++- .../modules/outline/models/outline_node.dart | 44 +++++------ .../outline/services/outline_service.dart | 63 +++++++++++++++- .../outline/widgets/outline_explorer.dart | 47 ++++++++++-- .../modules/outline/widgets/outline_view.dart | 73 ------------------- .../template_parser_controller.dart | 2 +- .../controllers/uft_component_controller.dart | 15 +++- .../services/uft_component_service.dart | 15 +++- .../controllers/xml_search_controller.dart | 2 +- .../shared/base/base_content_controller.dart | 2 +- 24 files changed, 198 insertions(+), 154 deletions(-) delete mode 100644 win_text_editor/lib/modules/outline/controllers/outline_controller.dart delete mode 100644 win_text_editor/lib/modules/outline/widgets/outline_view.dart diff --git a/win_text_editor/assets/config/words_classes.yaml b/win_text_editor/assets/config/words_classes.yaml index f69fc18..61b6446 100644 --- a/win_text_editor/assets/config/words_classes.yaml +++ b/win_text_editor/assets/config/words_classes.yaml @@ -1,2 +1,2 @@ outline_name_black_list: - - 历史,日志,名称,比例,数量,金额,次数,属性,对应,分类,姓名,单位,总数,行使,子项,占比,记录,列表,目标,字段,字符串,动作 \ No newline at end of file + - 历史,日志,名称,比例,数量,金额,次数,属性,对应,分类,姓名,单位,总数,行使,子项,占比,记录,列表,目标,字段,字符串,动作,方式 \ No newline at end of file diff --git a/win_text_editor/lib/framework/controllers/file_provider.dart b/win_text_editor/lib/framework/controllers/file_provider.dart index 1830dab..cb2d7ae 100644 --- a/win_text_editor/lib/framework/controllers/file_provider.dart +++ b/win_text_editor/lib/framework/controllers/file_provider.dart @@ -23,6 +23,7 @@ class FileProvider with ChangeNotifier { // 新增方法:手动设置根路径 Future setRootPath(String path) async { _currentRootPath = path; + notifyListeners(); await _loadRootDirectory(); } diff --git a/win_text_editor/lib/framework/controllers/tab_items_controller.dart b/win_text_editor/lib/framework/controllers/tab_items_controller.dart index 48c7d05..125aba4 100644 --- a/win_text_editor/lib/framework/controllers/tab_items_controller.dart +++ b/win_text_editor/lib/framework/controllers/tab_items_controller.dart @@ -111,7 +111,8 @@ class TabItemsController with ChangeNotifier { activeContentController?.onOpenFolder(folderPath); } - void handleFileDoubleTap(String filePath) { + void handleFileDoubleTap(String filePath, dynamic appendArg) { + Logger().debug('双击事件参数:filePath:$filePath,appendArg:$appendArg'); final fileName = filePath.split(Platform.pathSeparator).last; if (fileName == "component.xml") { openOrActivateTab("标准组件", RouterKey.uftComponent, Icons.extension); @@ -133,7 +134,7 @@ class TabItemsController with ChangeNotifier { } } - activeContentController?.onOpenFile(filePath); + activeContentController?.onOpenFile(filePath, appendArg: appendArg); } bool hasController(String tabId) { diff --git a/win_text_editor/lib/framework/widgets/app_scaffold.dart b/win_text_editor/lib/framework/widgets/app_scaffold.dart index ab1360a..872be02 100644 --- a/win_text_editor/lib/framework/widgets/app_scaffold.dart +++ b/win_text_editor/lib/framework/widgets/app_scaffold.dart @@ -6,6 +6,8 @@ import 'package:win_text_editor/framework/widgets/tab_view.dart'; import 'package:win_text_editor/menus/app_menu.dart'; import 'package:win_text_editor/framework/controllers/file_provider.dart'; import 'package:win_text_editor/framework/widgets/console_panel.dart'; +import 'package:win_text_editor/modules/outline/controllers/outline_provider.dart'; +import 'package:win_text_editor/modules/outline/widgets/outline_explorer.dart'; class AppScaffold extends StatelessWidget { const AppScaffold({super.key}); @@ -16,6 +18,7 @@ class AppScaffold extends StatelessWidget { providers: [ ChangeNotifierProvider(create: (_) => FileProvider()), ChangeNotifierProvider(create: (_) => TabItemsController()), + ChangeNotifierProvider(create: (_) => OutlineProvider()), // Add OutlineProvider ], child: Scaffold( backgroundColor: Colors.grey[100], @@ -29,7 +32,7 @@ class AppScaffold extends StatelessWidget { Consumer( builder: (context, tabManager, child) { return FileExplorerPane( - onFileDoubleTap: (path) => tabManager.handleFileDoubleTap(path), + onFileDoubleTap: (path) => tabManager.handleFileDoubleTap(path, null), onFolderDoubleTap: (path) => tabManager.handleFolderDoubleTap(path), ); }, @@ -42,6 +45,24 @@ class AppScaffold extends StatelessWidget { TabView(tabs: manager.tabs, currentTabId: manager.activeTabId), ), ), + // 右侧大纲视图 + SizedBox( + width: 300, + child: Consumer( + builder: (context, tabManager, child) { + return OutlineExplorer( + onFileDoubleTap: (path, dynamic appendArg) { + // Handle file double tap if needed + tabManager.handleFileDoubleTap(path, appendArg); + }, + onFolderDoubleTap: (path) { + // Handle folder double tap if needed + tabManager.handleFolderDoubleTap(path); + }, + ); + }, + ), + ), ], ), ), diff --git a/win_text_editor/lib/menus/app_menu.dart b/win_text_editor/lib/menus/app_menu.dart index 42f76e7..4a75804 100644 --- a/win_text_editor/lib/menus/app_menu.dart +++ b/win_text_editor/lib/menus/app_menu.dart @@ -72,11 +72,11 @@ class AppMenu extends StatelessWidget { value: MenuConstants.callFunction, child: ListTile(leading: Icon(Icons.functions), title: Text('功能号调用')), ), - const PopupMenuDivider(), - const PopupMenuItem( - value: MenuConstants.outline, - child: ListTile(leading: Icon(Icons.outlined_flag_rounded), title: Text('大纲')), - ), + // const PopupMenuDivider(), + // const PopupMenuItem( + // value: MenuConstants.outline, + // child: ListTile(leading: Icon(Icons.outlined_flag_rounded), title: Text('大纲')), + // ), ]; } @@ -91,7 +91,7 @@ class AppMenu extends StatelessWidget { List> _buildFileMenuItems() { return [ - const PopupMenuItem(value: MenuConstants.openFolder, child: Text('打开文件夹...')), + // const PopupMenuItem(value: MenuConstants.openFolder, child: Text('打开文件夹...')), const PopupMenuItem(value: MenuConstants.save, child: Text('保存')), const PopupMenuItem(value: MenuConstants.saveAs, child: Text('另存为...')), const PopupMenuItem(value: MenuConstants.exit, child: Text('退出')), diff --git a/win_text_editor/lib/modules/call_function/controllers/call_function_controller.dart b/win_text_editor/lib/modules/call_function/controllers/call_function_controller.dart index 9d292b1..3f891b5 100644 --- a/win_text_editor/lib/modules/call_function/controllers/call_function_controller.dart +++ b/win_text_editor/lib/modules/call_function/controllers/call_function_controller.dart @@ -76,7 +76,7 @@ class CallFunctionController extends BaseContentController { } @override - Future onOpenFile(String filePath) async { + Future onOpenFile(String filePath, {dynamic appendArg}) async { Logger().info("Opening file: $filePath"); try { modle = await _service.parseXmlFile(filePath); diff --git a/win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart b/win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart index bcdef37..8924f86 100644 --- a/win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart +++ b/win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart @@ -245,7 +245,7 @@ class ContentSearchController extends BaseContentController { } @override - void onOpenFile(String filePath) { + void onOpenFile(String filePath, {dynamic appendArg}) { //searchDirectory = filePath; //notifyListeners(); } diff --git a/win_text_editor/lib/modules/data_compare/controllers/data_compare_controller.dart b/win_text_editor/lib/modules/data_compare/controllers/data_compare_controller.dart index f6766d8..01d1fa7 100644 --- a/win_text_editor/lib/modules/data_compare/controllers/data_compare_controller.dart +++ b/win_text_editor/lib/modules/data_compare/controllers/data_compare_controller.dart @@ -241,7 +241,7 @@ class DataCompareController extends BaseContentController { } @override - void onOpenFile(String filePath) { + void onOpenFile(String filePath, {dynamic appendArg}) { // TODO: implement onOpenFile } diff --git a/win_text_editor/lib/modules/data_extract/controllers/data_extract_controller.dart b/win_text_editor/lib/modules/data_extract/controllers/data_extract_controller.dart index 1f423b2..546afde 100644 --- a/win_text_editor/lib/modules/data_extract/controllers/data_extract_controller.dart +++ b/win_text_editor/lib/modules/data_extract/controllers/data_extract_controller.dart @@ -80,7 +80,7 @@ class DataExtractController extends BaseContentController { } @override - void onOpenFile(String filePath) { + void onOpenFile(String filePath, {dynamic appendArg}) { // TODO: implement onOpenFile } diff --git a/win_text_editor/lib/modules/data_format/controllers/data_format_controller.dart b/win_text_editor/lib/modules/data_format/controllers/data_format_controller.dart index d1a17b3..835f592 100644 --- a/win_text_editor/lib/modules/data_format/controllers/data_format_controller.dart +++ b/win_text_editor/lib/modules/data_format/controllers/data_format_controller.dart @@ -94,7 +94,7 @@ class DataFormatController extends BaseContentController { } @override - void onOpenFile(String filePath) {} + void onOpenFile(String filePath, {dynamic appendArg}) {} @override void onOpenFolder(String folderPath) { diff --git a/win_text_editor/lib/modules/demo/controllers/demo_controller.dart b/win_text_editor/lib/modules/demo/controllers/demo_controller.dart index c7a3623..309d05c 100644 --- a/win_text_editor/lib/modules/demo/controllers/demo_controller.dart +++ b/win_text_editor/lib/modules/demo/controllers/demo_controller.dart @@ -2,7 +2,7 @@ import 'package:win_text_editor/shared/base/base_content_controller.dart'; class DemoController extends BaseContentController { @override - void onOpenFile(String filePath) { + void onOpenFile(String filePath, {dynamic appendArg}) { // TODO: implement onOpenFile } diff --git a/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart b/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart index 61a41f6..ea29381 100644 --- a/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart +++ b/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart @@ -63,7 +63,7 @@ class MemoryTableController extends BaseContentController { } @override - Future onOpenFile(String filePath) async { + Future onOpenFile(String filePath, {dynamic appendArg}) async { Logger().info("Opening file: $filePath"); try { final tableData = await _service.parseStructureFile(filePath); diff --git a/win_text_editor/lib/modules/module_router.dart b/win_text_editor/lib/modules/module_router.dart index 1762b5e..f62a9bf 100644 --- a/win_text_editor/lib/modules/module_router.dart +++ b/win_text_editor/lib/modules/module_router.dart @@ -13,8 +13,6 @@ import 'package:win_text_editor/modules/demo/controllers/demo_controller.dart'; import 'package:win_text_editor/modules/demo/widgets/demo_view.dart'; import 'package:win_text_editor/modules/memory_table/controllers/memory_table_controller.dart'; import 'package:win_text_editor/modules/memory_table/widgets/memory_table_view.dart'; -import 'package:win_text_editor/modules/outline/controllers/outline_controller.dart'; -import 'package:win_text_editor/modules/outline/widgets/outline_view.dart'; import 'package:win_text_editor/modules/uft_component/controllers/uft_component_controller.dart'; import 'package:win_text_editor/modules/uft_component/widgets/uft_component_view.dart'; import 'package:win_text_editor/modules/xml_search/controllers/xml_search_controller.dart'; @@ -52,7 +50,6 @@ class ModuleRouter { RouterKey.memoryTable: (tab) => MemoryTableController(), RouterKey.uftComponent: (tab) => UftComponentController(), RouterKey.callFunction: (tab) => CallFunctionController(), - RouterKey.outline: (tab) => OutlineController(), RouterKey.demo: (tab) => DemoController(), }; @@ -67,7 +64,6 @@ class ModuleRouter { RouterKey.memoryTable: (tab, controller) => MemoryTableView(tabId: tab.id), RouterKey.uftComponent: (tab, controller) => UftComponentView(tabId: tab.id), RouterKey.callFunction: (tab, controller) => CallFunctionView(tabId: tab.id), - RouterKey.outline: (tab, controller) => OutlineView(tabId: tab.id), RouterKey.demo: (tab, controller) => DemoView(tabId: tab.id), }; diff --git a/win_text_editor/lib/modules/outline/controllers/outline_controller.dart b/win_text_editor/lib/modules/outline/controllers/outline_controller.dart deleted file mode 100644 index a31a98e..0000000 --- a/win_text_editor/lib/modules/outline/controllers/outline_controller.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:win_text_editor/shared/base/base_content_controller.dart'; - -class OutlineController extends BaseContentController { - @override - void onOpenFile(String filePath) { - // TODO: implement onOpenFile - } - - @override - void onOpenFolder(String folderPath) { - // TODO: implement onOpenFolder - } -} diff --git a/win_text_editor/lib/modules/outline/controllers/outline_provider.dart b/win_text_editor/lib/modules/outline/controllers/outline_provider.dart index 94ffb2b..304279b 100644 --- a/win_text_editor/lib/modules/outline/controllers/outline_provider.dart +++ b/win_text_editor/lib/modules/outline/controllers/outline_provider.dart @@ -7,6 +7,13 @@ class OutlineProvider with ChangeNotifier { List _outlineNode = []; bool _isLoading = true; String? _currentRootPath; // 跟踪当前根路径 + static OutlineNode rootNode = OutlineNode( + name: "所有", + title: "所有", + value: 'UFTTable', + frequency: 0, + isDirectory: true, + ); bool get isLoading => _isLoading; bool get hasRoot => _outlineNode.isNotEmpty && _outlineNode[0].isRoot; @@ -18,11 +25,17 @@ class OutlineProvider with ChangeNotifier { // 新增方法:手动设置根路径 Future setRootPath(String path) async { + if (path == _currentRootPath) { + return; + } _currentRootPath = path; await _loadRootDirectory(); } - List get outlineNode => _outlineNode; + List get outlineNode { + rootNode.children = _outlineNode; + return [rootNode]; + } void toggleExpand(OutlineNode node) { node.isExpanded = !node.isExpanded; diff --git a/win_text_editor/lib/modules/outline/models/outline_node.dart b/win_text_editor/lib/modules/outline/models/outline_node.dart index 589512d..b801607 100644 --- a/win_text_editor/lib/modules/outline/models/outline_node.dart +++ b/win_text_editor/lib/modules/outline/models/outline_node.dart @@ -6,14 +6,19 @@ class OutlineNode implements TreeNode { @override final String name; - String title; + String title = ""; + + List _children = []; + + OutlineNode? parent; + @override final bool isDirectory; final bool isRoot; @override final int depth; @override - List children; + List get children => _children; @override bool isExpanded; final int frequency; @@ -32,7 +37,11 @@ class OutlineNode implements TreeNode { this.wordClass, List? children, this.title = "", - }) : children = children ?? []; + }) : _children = children ?? [] { + for (var child in _children) { + child.parent = this; + } + } @override String get id => '$depth-$name'; @@ -47,33 +56,18 @@ class OutlineNode implements TreeNode { return Icons.insert_drive_file; } + set children(List nodes) { + _children = nodes; + for (var child in _children) { + child.parent = this; + } + } + // 获取构建好的图标组件 Widget get icon { return Icon(iconData, color: isDirectory ? Colors.amber[700] : Colors.blue); } - OutlineNode copyWith({ - String? name, - String? value, // value is not nullable, so we keep it as is - int? frequency, - bool? isDirectory, - bool? isExpanded, - bool? isRoot, - List? children, - int? depth, - }) { - return OutlineNode( - name: name ?? this.name, - value: value ?? this.value, // value is not nullable, so we keep it as is - frequency: frequency ?? this.frequency, - isDirectory: isDirectory ?? this.isDirectory, - isExpanded: isExpanded ?? this.isExpanded, - isRoot: isRoot ?? this.isRoot, - children: children ?? this.children, - depth: depth ?? this.depth, - ); - } - @override bool operator ==(Object other) { if (identical(this, other)) return true; diff --git a/win_text_editor/lib/modules/outline/services/outline_service.dart b/win_text_editor/lib/modules/outline/services/outline_service.dart index cb746a6..812f012 100644 --- a/win_text_editor/lib/modules/outline/services/outline_service.dart +++ b/win_text_editor/lib/modules/outline/services/outline_service.dart @@ -160,6 +160,8 @@ class OutlineService { await _loadUftObject(rootPath, dirNode.value, dirNode); break; case 'Component': + await _loadComponent(rootPath, dirNode.value, dirNode); + break; case 'Business': // 其他操作类型的处理 break; @@ -168,6 +170,58 @@ class OutlineService { } } + static Future _loadComponent( + String rootPath, + String? fieldName, + OutlineNode parentNode, + ) async { + if (fieldName == null || fieldName.isEmpty) return; + + final componentFile = File('$rootPath/metadata/component.xml'); + if (!await componentFile.exists()) { + Logger().error('component.xml文件不存在'); + return; + } + + try { + final content = await componentFile.readAsString(); + final document = XmlDocument.parse(content); + + // 查找所有items节点 + for (final item in document.findAllElements('items')) { + // 检查name属性是否匹配fieldName + if (item.getAttribute('name') == fieldName) { + // 获取父节点 + final parentElement = item.parent; + if (parentElement != null) { + // 获取父节点的name和chineseName属性 + final parentName = parentElement.getAttribute('name'); + final parentChineseName = parentElement.getAttribute('chineseName'); + + if (parentName != null && parentChineseName != null) { + // 创建并添加子节点 + parentNode.children.add( + OutlineNode( + name: parentName, + title: parentChineseName, + value: 'Component', + frequency: 0, + isDirectory: false, + depth: 4, + ), + ); + } + } + } + } + + Logger().info('为 $fieldName 找到 ${parentNode.children.length} 个匹配项'); + } catch (e) { + Logger().error('加载Component失败: $e'); + rethrow; + } + } + // 私有方法:加载UFT对象 static Future _loadUftObject( String rootPath, @@ -206,8 +260,8 @@ class OutlineService { final structureNode = document.findAllElements('structure:Structure').firstOrNull; final chineseName = structureNode?.getAttribute('chineseName') ?? '未命名'; - // 获取文件名(不带路径和扩展名) - final fileName = file.path.split('/').last.replaceFirst('.uftstructure', ''); + // 获取文件名(不带路径) + final fileName = file.path; // 创建并添加子节点 parentNode.children.add( @@ -217,7 +271,7 @@ class OutlineService { value: 'UFTTable', frequency: 0, isDirectory: false, // 这些是叶子节点 - depth: parentNode.depth + 1, + depth: 4, ), ); } @@ -274,7 +328,7 @@ class OutlineService { title: entry.value, frequency: 0, isDirectory: true, - depth: parentNode.depth + 1, + depth: 3, ), ), ); @@ -306,6 +360,7 @@ class OutlineService { frequency: entry.value, isDirectory: true, depth: 1, + isRoot: true, wordClass: _wordClassDict[entry.key], ), ) diff --git a/win_text_editor/lib/modules/outline/widgets/outline_explorer.dart b/win_text_editor/lib/modules/outline/widgets/outline_explorer.dart index 9a7f4c0..2cf4c57 100644 --- a/win_text_editor/lib/modules/outline/widgets/outline_explorer.dart +++ b/win_text_editor/lib/modules/outline/widgets/outline_explorer.dart @@ -2,13 +2,14 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:win_text_editor/framework/controllers/file_provider.dart'; import 'package:win_text_editor/framework/services/file_path_manager.dart'; import 'package:win_text_editor/modules/outline/controllers/outline_provider.dart'; import 'package:win_text_editor/modules/outline/models/outline_node.dart'; import 'package:win_text_editor/shared/components/tree_view.dart'; class OutlineExplorer extends StatefulWidget { - final Function(String)? onFileDoubleTap; + final Function(String, dynamic)? onFileDoubleTap; final Function(String)? onFolderDoubleTap; const OutlineExplorer({super.key, this.onFileDoubleTap, this.onFolderDoubleTap}); @@ -45,7 +46,6 @@ class _OutlineExplorerState extends State { return maxDepth; } - // 过滤节点方法 // 过滤节点方法 - 递归版本 List _filterNodes(List nodes) { if (_searchQuery.isEmpty) { @@ -78,7 +78,10 @@ class _OutlineExplorerState extends State { @override Widget build(BuildContext context) { final outlineProvider = Provider.of(context); - _loadLastOpenedFolder(outlineProvider); + final fileProvider = Provider.of(context); // 添加这行 + + // 当 fileProvider 的 rootPath 变化时,会自动触发 rebuild + _loadLastOpenedFolder(outlineProvider, fileProvider); return Column( children: [ @@ -148,7 +151,8 @@ class _OutlineExplorerState extends State { nodes: _filterNodes(outlineProvider.outlineNode), config: const TreeViewConfig(showIcons: true, lazyLoad: true), onNodeTap: (node) => _handleNodeTap(context, node as OutlineNode), - onNodeDoubleTap: (node) => _handleNodeDoubleTap(node as OutlineNode), + onNodeDoubleTap: + (node) => _handleNodeDoubleTap(node as OutlineNode, fileProvider), ), ), ), @@ -184,13 +188,42 @@ class _OutlineExplorerState extends State { } } - void _handleNodeDoubleTap(TreeNode node) {} + void _handleNodeDoubleTap(TreeNode node, FileProvider fileProvider) { + final outlineNode = node as OutlineNode; + if (outlineNode.depth < 3) { + outlineNode.isExpanded = !outlineNode.isExpanded; + return; + } + switch (outlineNode.value) { + case "UFTTable": + case "Business": + case "Atom": + if (widget.onFileDoubleTap != null) { + widget.onFileDoubleTap!(outlineNode.name, outlineNode.name); + } + break; + case "Component": + if (widget.onFileDoubleTap != null && fileProvider.rootPath != null) { + widget.onFileDoubleTap!( + '${fileProvider.rootPath}\\metadata\\component.xml', + outlineNode.name, + ); + } + break; + } + } - Future _loadLastOpenedFolder(OutlineProvider outlineProvider) async { - if (outlineProvider.rootPath != null && outlineProvider.rootPath!.isNotEmpty) { + Future _loadLastOpenedFolder( + OutlineProvider outlineProvider, + FileProvider? fileProvider, + ) async { + // 使用 fileProvider 的路径 + if (fileProvider?.rootPath != null && fileProvider!.rootPath!.isNotEmpty) { + await outlineProvider.setRootPath(fileProvider.rootPath!); return; } + // 最后尝试从存储中加载 final String? lastOpenedFolder = await FilePathManager.getLastOpenedFolder(); if (lastOpenedFolder != null) { await outlineProvider.setRootPath(lastOpenedFolder); diff --git a/win_text_editor/lib/modules/outline/widgets/outline_view.dart b/win_text_editor/lib/modules/outline/widgets/outline_view.dart deleted file mode 100644 index 9c3668f..0000000 --- a/win_text_editor/lib/modules/outline/widgets/outline_view.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:win_text_editor/framework/controllers/tab_items_controller.dart'; -import 'package:win_text_editor/modules/outline/controllers/outline_controller.dart'; -import 'package:win_text_editor/modules/outline/controllers/outline_provider.dart'; // 新增导入 -import 'package:win_text_editor/modules/outline/widgets/outline_explorer.dart'; - -class OutlineView extends StatefulWidget { - final String tabId; - const OutlineView({super.key, required this.tabId}); - - @override - State createState() => _OutlineViewState(); -} - -class _OutlineViewState extends State { - late final OutlineController _controller; - late final OutlineProvider _outlineProvider; // 新增OutlineProvider实例 - bool _isControllerFromTabManager = false; - - get tabManager => Provider.of(context, listen: false); - - @override - void initState() { - super.initState(); - - _outlineProvider = OutlineProvider(); // 初始化OutlineProvider - - final controllerFromManager = tabManager.getController(widget.tabId); - if (controllerFromManager != null) { - _controller = controllerFromManager; - _isControllerFromTabManager = true; - } else { - _controller = OutlineController(); - _isControllerFromTabManager = false; - tabManager.registerController(widget.tabId, _controller); - } - } - - @override - void dispose() { - if (!_isControllerFromTabManager) { - _controller.dispose(); - } - _outlineProvider.dispose(); // 确保销毁provider - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return ChangeNotifierProvider.value( - value: _outlineProvider, // 提供OutlineProvider - child: Row( - children: [ - const VerticalDivider(width: 1), - SizedBox( - width: 300, - child: OutlineExplorer( - onFileDoubleTap: (path) { - // 处理文件双击 - }, - onFolderDoubleTap: (path) { - // 处理文件夹双击 - }, - ), - ), - const VerticalDivider(width: 1), - const Expanded(child: Center(child: Text('大纲'))), - ], - ), - ); - } -} diff --git a/win_text_editor/lib/modules/template_parser/controllers/template_parser_controller.dart b/win_text_editor/lib/modules/template_parser/controllers/template_parser_controller.dart index 921498e..5275b5f 100644 --- a/win_text_editor/lib/modules/template_parser/controllers/template_parser_controller.dart +++ b/win_text_editor/lib/modules/template_parser/controllers/template_parser_controller.dart @@ -369,7 +369,7 @@ class TemplateParserController extends BaseContentController { //-----------框架回调-- @override - void onOpenFile(String filePath) { + void onOpenFile(String filePath, {dynamic appendArg}) { setFilePath(filePath); } diff --git a/win_text_editor/lib/modules/uft_component/controllers/uft_component_controller.dart b/win_text_editor/lib/modules/uft_component/controllers/uft_component_controller.dart index 094b5f2..d31f2a7 100644 --- a/win_text_editor/lib/modules/uft_component/controllers/uft_component_controller.dart +++ b/win_text_editor/lib/modules/uft_component/controllers/uft_component_controller.dart @@ -61,10 +61,13 @@ class UftComponentController extends BaseContentController { } @override - Future onOpenFile(String filePath) async { - Logger().info("Opening file: $filePath"); + Future onOpenFile(String filePath, {dynamic appendArg}) async { + Logger().info("UftComponentController Opening file: $filePath"); try { - final components = await UftComponentService.parseComponentFile(filePath); + final components = await UftComponentService.parseComponentFile( + filePath, + filterName: appendArg, + ); // Update data sources (componentsSource as ComponentSource).updateData(components); @@ -72,12 +75,16 @@ class UftComponentController extends BaseContentController { // Clear any previous error _errorMessage = null; + if (appendArg != null) { + updateComponentSelection(0, true); + } + // Notify UI to update notifyListeners(); } catch (e) { _errorMessage = e.toString(); notifyListeners(); - Logger().error("Error opening file: $e"); + Logger().error("Error UftComponentController opening file: $e"); } } diff --git a/win_text_editor/lib/modules/uft_component/services/uft_component_service.dart b/win_text_editor/lib/modules/uft_component/services/uft_component_service.dart index 962b778..64c901a 100644 --- a/win_text_editor/lib/modules/uft_component/services/uft_component_service.dart +++ b/win_text_editor/lib/modules/uft_component/services/uft_component_service.dart @@ -24,9 +24,12 @@ class UftComponentService { ).then((l) => l.firstWhereOrNull((c) => c.name == componentName)); } - static Future> parseComponentFile(String filePath) async { + static Future> parseComponentFile( + String filePath, { + String? filterName, + }) async { try { - if (_components.isNotEmpty) { + if (_components.isNotEmpty && filterName == null) { _components.firstWhereOrNull((c) => c.isSelected)?.isSelected = false; return _components; } @@ -40,12 +43,14 @@ class UftComponentService { throw const FormatException("没有找到标准组件文件:component.xml"); } + _components.clear(); + // 2. 查找 metadata 目录和 stdfield.stfield 文件 await StdFieldsCache.loadForFile(filePath); // 3. Read and parse structure file content final content = await file.readAsString(); - _logger.info('加载标准组件'); + _logger.info('加载标准组件,过滤词:$filterName'); final document = xml.XmlDocument.parse(content); final componentNodes = document.findAllElements('items'); @@ -62,6 +67,10 @@ class UftComponentService { final name = node.getAttribute('name') ?? ''; final chineseName = node.getAttribute('chineseName') ?? ''; + if (filterName != null && filterName.isNotEmpty && filterName != name) { + continue; // 如果有过滤条件且不匹配,则跳过 + } + final fields = []; List? indexes = []; int index = 1; diff --git a/win_text_editor/lib/modules/xml_search/controllers/xml_search_controller.dart b/win_text_editor/lib/modules/xml_search/controllers/xml_search_controller.dart index 822cca2..622e7d0 100644 --- a/win_text_editor/lib/modules/xml_search/controllers/xml_search_controller.dart +++ b/win_text_editor/lib/modules/xml_search/controllers/xml_search_controller.dart @@ -114,7 +114,7 @@ class XmlSearchController extends BaseContentController { } @override - void onOpenFile(String filePath) { + void onOpenFile(String filePath, {dynamic appendArg}) { searchDirectory = filePath; } diff --git a/win_text_editor/lib/shared/base/base_content_controller.dart b/win_text_editor/lib/shared/base/base_content_controller.dart index 3ae37c2..b6eda0a 100644 --- a/win_text_editor/lib/shared/base/base_content_controller.dart +++ b/win_text_editor/lib/shared/base/base_content_controller.dart @@ -3,5 +3,5 @@ import 'package:flutter/material.dart'; abstract class BaseContentController with ChangeNotifier { void onOpenFolder(String folderPath); - void onOpenFile(String filePath); + void onOpenFile(String filePath, {dynamic appendArg}); }