From ddd0f4d271bacebad0331f083042f491d7902912 Mon Sep 17 00:00:00 2001 From: hejl Date: Thu, 29 May 2025 17:36:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A1=86=E6=9E=B6OK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/tab_items_controller.dart | 21 ++- win_text_editor/lib/menus/app_menu.dart | 4 + win_text_editor/lib/menus/menu_actions.dart | 5 + win_text_editor/lib/menus/menu_constants.dart | 1 + .../controllers/index_data_source.dart | 2 +- .../controllers/memory_table_controller.dart | 3 +- .../memory_table}/models/memory_table.dart | 15 +- .../services/memory_table_service.dart | 2 +- .../lib/modules/module_router.dart | 5 + .../controllers/uft_component_controller.dart | 113 +++++++++++++++ .../uft_component/models/uft_component.dart | 40 ++++++ .../services/uft_component_service.dart | 19 +++ .../widgets/uft_component_left_side.dart | 70 +++++++++ .../widgets/uft_component_right_side.dart | 136 ++++++++++++++++++ .../widgets/uft_component_view.dart | 76 ++++++++++ .../lib/shared/base/base_data_source.dart | 2 +- .../lib/shared/models/std_filed.dart | 15 ++ .../uft_std_fields/field_data_service.dart | 71 +++++++++ .../uft_std_fields/field_data_source.dart | 2 +- .../uft_std_fields/fields_data_grid.dart | 2 +- 20 files changed, 577 insertions(+), 27 deletions(-) rename win_text_editor/lib/{shared => modules/memory_table}/models/memory_table.dart (90%) create mode 100644 win_text_editor/lib/modules/uft_component/controllers/uft_component_controller.dart create mode 100644 win_text_editor/lib/modules/uft_component/models/uft_component.dart create mode 100644 win_text_editor/lib/modules/uft_component/services/uft_component_service.dart create mode 100644 win_text_editor/lib/modules/uft_component/widgets/uft_component_left_side.dart create mode 100644 win_text_editor/lib/modules/uft_component/widgets/uft_component_right_side.dart create mode 100644 win_text_editor/lib/modules/uft_component/widgets/uft_component_view.dart create mode 100644 win_text_editor/lib/shared/uft_std_fields/field_data_service.dart 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 0ad1e7a..a740d3d 100644 --- a/win_text_editor/lib/framework/controllers/tab_items_controller.dart +++ b/win_text_editor/lib/framework/controllers/tab_items_controller.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_js/quickjs/ffi.dart'; import 'package:win_text_editor/framework/models/tab_model.dart'; @@ -111,13 +113,18 @@ class TabItemsController with ChangeNotifier { void handleFileDoubleTap(String filePath) { if (activeContentController == null) { - final fileExtension = _getFileExtension(filePath); - switch (fileExtension) { - case 'uftstructure': - openOrActivateTab("内存表", RouterKey.memoryTable, Icons.drive_file_move); - break; - default: - Logger().error("没有活动的内容控制器", source: 'TabItemsController'); + final fileName = filePath.split(Platform.pathSeparator).last; + if (fileName == "component.xml") { + openOrActivateTab("标准组件", RouterKey.uftComponent, Icons.extension); + } else { + final fileExtension = _getFileExtension(fileName); + switch (fileExtension) { + case 'uftstructure': + openOrActivateTab("内存表", RouterKey.memoryTable, Icons.list); + break; + default: + Logger().error("没有活动的内容控制器", source: 'TabItemsController'); + } } } activeContentController?.onOpenFile(filePath); diff --git a/win_text_editor/lib/menus/app_menu.dart b/win_text_editor/lib/menus/app_menu.dart index 38f64af..cc5b37d 100644 --- a/win_text_editor/lib/menus/app_menu.dart +++ b/win_text_editor/lib/menus/app_menu.dart @@ -56,6 +56,10 @@ class AppMenu extends StatelessWidget { value: MenuConstants.memoryTable, child: ListTile(leading: Icon(Icons.list), title: Text('内存表')), ), + const PopupMenuItem( + value: MenuConstants.uftComponent, + child: ListTile(leading: Icon(Icons.extension), title: Text('标准组件')), + ), ]; } diff --git a/win_text_editor/lib/menus/menu_actions.dart b/win_text_editor/lib/menus/menu_actions.dart index 17129fc..ae1e2f8 100644 --- a/win_text_editor/lib/menus/menu_actions.dart +++ b/win_text_editor/lib/menus/menu_actions.dart @@ -16,6 +16,7 @@ class MenuActions { MenuConstants.dataFormat: _dataFormat, MenuConstants.dataCompare: _dataCompare, MenuConstants.memoryTable: _memoryTable, + MenuConstants.uftComponent: _uftComponent, MenuConstants.demo: _demo, MenuConstants.exit: _exitApplication, }; @@ -51,6 +52,10 @@ class MenuActions { await _openOrActivateTab(context, "内存表", RouterKey.memoryTable, Icons.drive_file_move); } + static Future _uftComponent(BuildContext context) async { + await _openOrActivateTab(context, "标准组件", RouterKey.uftComponent, Icons.extension); + } + static Future _dataFormat(BuildContext context) async { await _openOrActivateTab(context, "数据格式化", RouterKey.dataFormat, Icons.date_range); } diff --git a/win_text_editor/lib/menus/menu_constants.dart b/win_text_editor/lib/menus/menu_constants.dart index 47625c9..b5ebca0 100644 --- a/win_text_editor/lib/menus/menu_constants.dart +++ b/win_text_editor/lib/menus/menu_constants.dart @@ -24,6 +24,7 @@ class MenuConstants { //Uft菜单 static const String memoryTable = 'memory_table'; + static const String uftComponent = 'uft_component'; static const String uftTools = 'uft_tools'; // 编辑菜单项 diff --git a/win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart b/win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart index 03c1194..9af8926 100644 --- a/win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart +++ b/win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:win_text_editor/shared/base/base_data_source.dart'; -import 'package:win_text_editor/shared/models/memory_table.dart'; +import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; // 索引数据源 class IndexesDataSource extends SelectableDataSource { 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 ffae63a..61a41f6 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 @@ -1,9 +1,10 @@ import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:win_text_editor/framework/controllers/logger.dart'; import 'package:win_text_editor/framework/services/macro_template_service.dart'; +import 'package:win_text_editor/shared/models/std_filed.dart'; import 'package:win_text_editor/shared/uft_std_fields/field_data_source.dart'; import 'package:win_text_editor/modules/memory_table/controllers/index_data_source.dart'; -import 'package:win_text_editor/shared/models/memory_table.dart'; +import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; import 'package:win_text_editor/modules/memory_table/services/memory_table_service.dart'; import 'package:win_text_editor/shared/base/base_content_controller.dart'; diff --git a/win_text_editor/lib/shared/models/memory_table.dart b/win_text_editor/lib/modules/memory_table/models/memory_table.dart similarity index 90% rename from win_text_editor/lib/shared/models/memory_table.dart rename to win_text_editor/lib/modules/memory_table/models/memory_table.dart index 7ed706c..babc117 100644 --- a/win_text_editor/lib/shared/models/memory_table.dart +++ b/win_text_editor/lib/modules/memory_table/models/memory_table.dart @@ -1,17 +1,4 @@ -abstract class SelectableItem { - bool isSelected = false; -} - -class Field implements SelectableItem { - Field(this.id, this.name, this.chineseName, this.type, [this.isSelected = false]); - - final String id; - final String name; - final String chineseName; - final String type; - @override - bool isSelected; -} +import 'package:win_text_editor/shared/models/std_filed.dart'; class Index implements SelectableItem { Index(this.indexName, this.isPrimary, this.indexFields, this.rule, [this.isSelected = false]); diff --git a/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart b/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart index 458275e..9e91ee0 100644 --- a/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart +++ b/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart @@ -1,7 +1,7 @@ // memory_table_service.dart import 'dart:io'; -import 'package:win_text_editor/shared/models/memory_table.dart'; +import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; import 'package:win_text_editor/shared/data/std_fields_cache.dart'; import 'package:win_text_editor/shared/models/std_filed.dart'; import 'package:xml/xml.dart' as xml; diff --git a/win_text_editor/lib/modules/module_router.dart b/win_text_editor/lib/modules/module_router.dart index 07a40dd..9fd4e7d 100644 --- a/win_text_editor/lib/modules/module_router.dart +++ b/win_text_editor/lib/modules/module_router.dart @@ -9,6 +9,8 @@ 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/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/shared/base/base_content_controller.dart'; import 'package:win_text_editor/modules/content_search/controllers/content_search_controller.dart'; import 'package:win_text_editor/modules/template_parser/controllers/template_parser_controller.dart'; @@ -22,6 +24,7 @@ class RouterKey { static const String textEditor = 'text_editor'; static const String dataCompare = 'data_compare'; static const String memoryTable = 'memory_table'; + static const String uftComponent = 'uft_component'; static const String demo = 'demo'; } @@ -33,6 +36,7 @@ class ModuleRouter { RouterKey.dataFormat: (tab) => DataFormatController(), RouterKey.dataCompare: (tab) => DataCompareController(), RouterKey.memoryTable: (tab) => MemoryTableController(), + RouterKey.uftComponent: (tab) => UftComponentController(), RouterKey.demo: (tab) => DemoController(), }; @@ -43,6 +47,7 @@ class ModuleRouter { RouterKey.dataFormat: (tab, controller) => DataFormatView(tabId: tab.id), RouterKey.dataCompare: (tab, controller) => DataCompareView(tabId: tab.id), RouterKey.memoryTable: (tab, controller) => MemoryTableView(tabId: tab.id), + RouterKey.uftComponent: (tab, controller) => UftComponentView(tabId: tab.id), RouterKey.demo: (tab, controller) => DemoView(tabId: tab.id), }; 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 new file mode 100644 index 0000000..7338ec3 --- /dev/null +++ b/win_text_editor/lib/modules/uft_component/controllers/uft_component_controller.dart @@ -0,0 +1,113 @@ +import 'package:syncfusion_flutter_datagrid/datagrid.dart'; +import 'package:win_text_editor/framework/controllers/logger.dart'; +import 'package:win_text_editor/framework/services/macro_template_service.dart'; +import 'package:win_text_editor/shared/models/std_filed.dart'; +import 'package:win_text_editor/shared/uft_std_fields/field_data_source.dart'; +import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; +import 'package:win_text_editor/modules/memory_table/services/memory_table_service.dart'; +import 'package:win_text_editor/shared/base/base_content_controller.dart'; + +class UftComponentController extends BaseContentController { + String? _errorMessage; + String tableName = ""; + String objectId = ""; + String chineseName = ""; + + late DataGridSource fieldsSource; + final MemoryTableService _service; + final MacroTemplateService templateService = MacroTemplateService(); + + // 新增:维护MemoryTable对象 + late MemoryTable _memoryTable; + + UftComponentController() : _service = MemoryTableService(Logger()) { + // 初始化空数据 + final initialFields = [Field('1', '', '', '', false), Field('2', '', '', '', false)]; + + final initialIndexes = [Index('', false, '', '', false)]; + + fieldsSource = FieldsDataSource( + initialFields, + onSelectionChanged: (index, isSelected) { + updateFieldSelection(index, isSelected); + }, + ); + + // 初始化MemoryTable + _memoryTable = MemoryTable(tableName: '', columns: initialFields, indexes: initialIndexes); + } + + String? get errorMessage => _errorMessage; + + // 新增:获取当前MemoryTable + MemoryTable get memoryTable => _memoryTable; + + void initTemplateService() { + if (!templateService.inited) { + templateService.init(); + } + } + + String? genCodeString(List macroList) { + initTemplateService(); + return templateService.renderTemplate(macroList, _memoryTable.toMap()); + } + + @override + Future onOpenFile(String filePath) async { + Logger().info("Opening file: $filePath"); + try { + final tableData = await _service.parseStructureFile(filePath); + + // Update controller state + tableName = tableData.tableName; + chineseName = tableData.chineseName; + objectId = tableData.objectId; + + // Update data sources + (fieldsSource as FieldsDataSource).updateData(tableData.fields); + + // 更新MemoryTable对象 + _memoryTable = MemoryTable( + tableName: tableName, + columns: tableData.fields, + indexes: tableData.indexes, + ); + + // Clear any previous error + _errorMessage = null; + + // Notify UI to update + notifyListeners(); + } catch (e) { + _errorMessage = e.toString(); + notifyListeners(); + Logger().error("Error opening file: $e"); + } + } + + // 新增:更新字段选择状态 + void updateFieldSelection(int index, bool isSelected) { + final fields = (fieldsSource as FieldsDataSource).data; + if (index >= 0 && index < fields.length) { + fields[index].isSelected = isSelected; + fieldsSource.notifyListeners(); + + // 同步更新MemoryTable + _memoryTable.columns[index].isSelected = isSelected; + notifyListeners(); + } + } + + // 新增:更新索引选择状态 + + @override + void onOpenFolder(String folderPath) { + // 不支持打开文件夹 + } + + @override + void dispose() { + super.dispose(); + } +} diff --git a/win_text_editor/lib/modules/uft_component/models/uft_component.dart b/win_text_editor/lib/modules/uft_component/models/uft_component.dart new file mode 100644 index 0000000..2e80f97 --- /dev/null +++ b/win_text_editor/lib/modules/uft_component/models/uft_component.dart @@ -0,0 +1,40 @@ +import 'package:win_text_editor/shared/models/std_filed.dart'; + +class UftComponent { + final String componentName; + final List columns; + + UftComponent({required this.componentName, required this.columns}); + + List get selectFields => columns.where((field) => field.isSelected).toList(); + + Map toMap() { + return { + 'componentName': componentName, + 'fields': + columns + .map( + (field) => { + 'id': field.id, + 'name': field.name, + 'chineseName': field.chineseName, + 'type': field.type, + 'isLast': columns.indexOf(field) == columns.length - 1, + }, + ) + .toList(), + 'selectedFields': + selectFields + .map( + (field) => { + 'id': field.id, + 'name': field.name, + 'chineseName': field.chineseName, + 'type': field.type, + 'isLast': selectFields.indexOf(field) == selectFields.length - 1, + }, + ) + .toList(), + }; + } +} 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 new file mode 100644 index 0000000..220891b --- /dev/null +++ b/win_text_editor/lib/modules/uft_component/services/uft_component_service.dart @@ -0,0 +1,19 @@ +// memory_table_service.dart + +import 'package:win_text_editor/shared/models/std_filed.dart'; + +import 'package:win_text_editor/framework/controllers/logger.dart'; + +class UftComponentService { + final Logger _logger; + + UftComponentService(this._logger); +} + +class ComponentData { + final String name; + final String chineseName; + final List fields; + + ComponentData({required this.name, required this.chineseName, required this.fields}); +} diff --git a/win_text_editor/lib/modules/uft_component/widgets/uft_component_left_side.dart b/win_text_editor/lib/modules/uft_component/widgets/uft_component_left_side.dart new file mode 100644 index 0000000..584b127 --- /dev/null +++ b/win_text_editor/lib/modules/uft_component/widgets/uft_component_left_side.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'package:win_text_editor/modules/uft_component/controllers/uft_component_controller.dart'; +import 'package:win_text_editor/shared/uft_std_fields/field_data_source.dart'; +import 'package:win_text_editor/shared/uft_std_fields/fields_data_grid.dart'; + +class UftComponentLeftSide extends StatelessWidget { + final UftComponentController controller; + const UftComponentLeftSide({super.key, required this.controller}); + + Widget _buildTextFieldRow(String label, String value) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text('$label:'), + SizedBox( + width: 200, + child: TextField( + controller: TextEditingController(text: value), + readOnly: true, + decoration: const InputDecoration(isDense: true, contentPadding: EdgeInsets.all(8)), + ), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: double.infinity, + child: Card( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Wrap( + spacing: 16, + runSpacing: 8, + children: [ + _buildTextFieldRow('名称', controller.tableName), + _buildTextFieldRow('中文名', controller.chineseName), + _buildTextFieldRow('对象编号', controller.objectId), + ], + ), + ), + ), + ), + const SizedBox(height: 8), + const Padding( + padding: EdgeInsets.all(8.0), + child: Text('字段列表', style: TextStyle(fontWeight: FontWeight.bold)), + ), + Expanded( + flex: 6, + child: FieldsDataGrid( + fieldsSource: controller.fieldsSource as FieldsDataSource, + onSelectionChanged: (index, isSelected) { + controller.updateFieldSelection(index, isSelected); + }, + ), + ), + const Padding( + padding: EdgeInsets.all(8.0), + child: Text('索引列表', style: TextStyle(fontWeight: FontWeight.bold)), + ), + ], + ); + } +} diff --git a/win_text_editor/lib/modules/uft_component/widgets/uft_component_right_side.dart b/win_text_editor/lib/modules/uft_component/widgets/uft_component_right_side.dart new file mode 100644 index 0000000..e649679 --- /dev/null +++ b/win_text_editor/lib/modules/uft_component/widgets/uft_component_right_side.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:win_text_editor/modules/uft_component/controllers/uft_component_controller.dart'; + +class UftComponentRightSide extends StatefulWidget { + final UftComponentController controller; + final TextEditingController codeController; + + const UftComponentRightSide({super.key, required this.controller, required this.codeController}); + + @override + State createState() => _UftComponentRightSideState(); +} + +class _UftComponentRightSideState extends State { + final List _selectedOperations = []; + + @override + void initState() { + super.initState(); + widget.controller.initTemplateService(); + widget.controller.addListener(_updateDisplay); + } + + @override + void dispose() { + widget.controller.removeListener(_updateDisplay); + super.dispose(); + } + + void _updateDisplay() { + widget.codeController.text = widget.controller.genCodeString(_selectedOperations)!; + } + + void _toggleOperation(String operation, bool? value) { + setState(() { + if (value == true) { + _selectedOperations.add(operation); + } else { + _selectedOperations.remove(operation); + } + _updateDisplay(); + }); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildCheckboxSection(), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text('生成代码:', style: TextStyle(fontWeight: FontWeight.bold)), + IconButton( + icon: const Icon(Icons.content_copy, size: 20), + tooltip: '复制代码', + onPressed: () { + if (widget.codeController.text.isNotEmpty) { + Clipboard.setData(ClipboardData(text: widget.codeController.text)); + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('已复制到剪贴板'))); + } + }, + ), + ], + ), + ), + Flexible(child: _buildCodeEditor()), + ], + ); + } + + Widget _buildCheckboxSection() { + final operations = ['获取记录', '获取记录数', '插入记录', '修改记录', '删除记录', '遍历记录']; + + return SizedBox( + width: double.infinity, + child: Card( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + spacing: 16, + runSpacing: 8, + children: operations.map((op) => _buildCheckbox(op)).toList(), + ), + ], + ), + ), + ), + ); + } + + Widget _buildCheckbox(String label) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Checkbox( + value: _selectedOperations.contains(label), + onChanged: (bool? value) => _toggleOperation(label, value), + ), + Text(label), + ], + ); + } + + Widget _buildCodeEditor() { + return Card( + child: Padding( + padding: const EdgeInsets.all(8), + child: Container( + decoration: BoxDecoration( + border: Border.all(color: Colors.grey), + borderRadius: BorderRadius.circular(4), + ), + child: TextField( + controller: widget.codeController, + maxLines: null, + expands: true, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.all(8), + ), + style: const TextStyle(fontFamily: 'monospace', color: Colors.blueAccent), + ), + ), + ), + ); + } +} diff --git a/win_text_editor/lib/modules/uft_component/widgets/uft_component_view.dart b/win_text_editor/lib/modules/uft_component/widgets/uft_component_view.dart new file mode 100644 index 0000000..5446961 --- /dev/null +++ b/win_text_editor/lib/modules/uft_component/widgets/uft_component_view.dart @@ -0,0 +1,76 @@ +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/uft_component/controllers/uft_component_controller.dart'; + +import 'uft_component_left_side.dart'; +import 'uft_component_right_side.dart'; + +class UftComponentView extends StatefulWidget { + final String tabId; + const UftComponentView({super.key, required this.tabId}); + + @override + State createState() => _UftComponentViewState(); +} + +class _UftComponentViewState extends State { + late final UftComponentController _controller; + final TextEditingController _codeController = TextEditingController(); + bool _isControllerFromTabManager = false; + + get tabManager => Provider.of(context, listen: false); + + @override + void initState() { + super.initState(); + + final controllerFromManager = tabManager.getController(widget.tabId); + if (controllerFromManager != null) { + _controller = controllerFromManager; + _isControllerFromTabManager = true; + } else { + _controller = UftComponentController(); + _isControllerFromTabManager = false; + tabManager.registerController(widget.tabId, _controller); + } + } + + @override + void dispose() { + if (!_isControllerFromTabManager) { + _controller.dispose(); + } + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider.value( + value: _controller, + child: Consumer( + builder: (context, controller, child) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 左侧部分 (50%) + Expanded(flex: 5, child: UftComponentLeftSide(controller: controller)), + const SizedBox(width: 8), + // 右侧部分 (50%) + Expanded( + flex: 5, + child: UftComponentRightSide( + codeController: _codeController, + controller: controller, + ), + ), + ], + ), + ); + }, + ), + ); + } +} diff --git a/win_text_editor/lib/shared/base/base_data_source.dart b/win_text_editor/lib/shared/base/base_data_source.dart index d338542..85f4b35 100644 --- a/win_text_editor/lib/shared/base/base_data_source.dart +++ b/win_text_editor/lib/shared/base/base_data_source.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart'; -import 'package:win_text_editor/shared/models/memory_table.dart'; +import 'package:win_text_editor/shared/models/std_filed.dart'; abstract class SelectableDataSource extends DataGridSource { SelectableDataSource(this.items, {this.onSelectionChanged}) { diff --git a/win_text_editor/lib/shared/models/std_filed.dart b/win_text_editor/lib/shared/models/std_filed.dart index 70511d8..3084f1e 100644 --- a/win_text_editor/lib/shared/models/std_filed.dart +++ b/win_text_editor/lib/shared/models/std_filed.dart @@ -13,3 +13,18 @@ class StdField { StdField({required this.name, required this.chineseName, required this.dateType}); } + +abstract class SelectableItem { + bool isSelected = false; +} + +class Field implements SelectableItem { + Field(this.id, this.name, this.chineseName, this.type, [this.isSelected = false]); + + final String id; + final String name; + final String chineseName; + final String type; + @override + bool isSelected; +} diff --git a/win_text_editor/lib/shared/uft_std_fields/field_data_service.dart b/win_text_editor/lib/shared/uft_std_fields/field_data_service.dart new file mode 100644 index 0000000..6398dc3 --- /dev/null +++ b/win_text_editor/lib/shared/uft_std_fields/field_data_service.dart @@ -0,0 +1,71 @@ +import 'dart:io'; + +import 'package:win_text_editor/framework/controllers/logger.dart'; +import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; +import 'package:win_text_editor/shared/data/std_fields_cache.dart'; +import 'package:win_text_editor/shared/models/std_filed.dart'; +import 'package:xml/xml.dart' as xml; + +class FieldDataService { + final Logger _logger; + + FieldDataService(this._logger); + + Future findMetadataFile(String filePath) async { + Directory currentDir = File(filePath).parent; + const targetDirName = 'metadata'; + const targetFileName = 'stdfield.stdfield'; + + // 向上查找 metadata 目录 + while (true) { + final metadataDir = Directory('${currentDir.path}/$targetDirName'); + if (await metadataDir.exists()) { + final stdFieldFile = File('${metadataDir.path}/$targetFileName'); + if (await stdFieldFile.exists()) { + return stdFieldFile; + } else { + _logger.error("没找到标准字段文件 $targetFileName"); + return null; + } + } + + // 到达根目录时停止 + if (currentDir.path == currentDir.parent.path) { + _logger.error("没有找到元数据目录 $targetDirName"); + return null; + } + + currentDir = currentDir.parent; + } + } + + // 处理标准字段文件并缓存 + Future processStdFieldFile(File stdFieldFile) async { + try { + final content = await stdFieldFile.readAsString(); + final document = xml.XmlDocument.parse(content); + final items = document.findAllElements('items'); + + for (final item in items) { + final name = item.getAttribute('name') ?? ''; + final chineseName = item.getAttribute('chineseName') ?? ''; + final dataType = item.getAttribute('dataType') ?? ''; + + if (name.isNotEmpty) { + final stdField = StdField(name: name, chineseName: chineseName, dateType: dataType); + await StdFieldsCache.setData(name, stdField); + } + } + } catch (e) { + _logger.error("处理标准字段文件时出错: $e"); + } + } + + List getDefaultFields() { + return [Field('1', '', '', ''), Field('2', '', '', ''), Field('3', '', '', '')]; + } + + List getDefaultIndexes() { + return [Index('', false, '', ''), Index('', false, '', '')]; + } +} diff --git a/win_text_editor/lib/shared/uft_std_fields/field_data_source.dart b/win_text_editor/lib/shared/uft_std_fields/field_data_source.dart index 05d5b93..7580dd0 100644 --- a/win_text_editor/lib/shared/uft_std_fields/field_data_source.dart +++ b/win_text_editor/lib/shared/uft_std_fields/field_data_source.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:win_text_editor/shared/base/base_data_source.dart'; -import 'package:win_text_editor/shared/models/memory_table.dart'; +import 'package:win_text_editor/shared/models/std_filed.dart'; class FieldsDataSource extends SelectableDataSource { FieldsDataSource( diff --git a/win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart b/win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart index ca9ea82..e63d650 100644 --- a/win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart +++ b/win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:win_text_editor/shared/base/base_data_source.dart'; -import 'package:win_text_editor/shared/models/memory_table.dart'; +import 'package:win_text_editor/shared/models/std_filed.dart'; import 'package:win_text_editor/shared/uft_std_fields/field_data_source.dart'; class FieldsDataGrid extends StatelessWidget {