Compare commits

..

No commits in common. '265925af996ff0bebf2161dcf6c0755f7b2aa8fa' and '92a27463c86bd52dca98ccd4bc979d731b7ca3a2' have entirely different histories.

  1. 4
      win_text_editor/.vscode/settings.json
  2. 101
      win_text_editor/assets/config/uft_macro_list.yaml
  3. 17
      win_text_editor/lib/framework/services/macro_template_service.dart
  4. 37
      win_text_editor/lib/modules/call_function/controllers/call_function_controller.dart
  5. 35
      win_text_editor/lib/modules/call_function/models/call_function.dart
  6. 18
      win_text_editor/lib/modules/call_function/services/call_function_service.dart
  7. 44
      win_text_editor/lib/modules/code_creater/controllers/code_creater_controller.dart
  8. 290
      win_text_editor/lib/modules/code_creater/services/code_create_service.dart
  9. 14
      win_text_editor/lib/modules/code_creater/widgets/code_creater_view.dart
  10. 52
      win_text_editor/lib/modules/code_creater/widgets/node_table.dart
  11. 5
      win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart
  12. 24
      win_text_editor/lib/modules/memory_table/models/memory_table.dart
  13. 10
      win_text_editor/lib/modules/memory_table/services/memory_table_service.dart
  14. 5
      win_text_editor/lib/modules/outline/models/outline_node.dart
  15. 8
      win_text_editor/lib/modules/outline/services/component_service.dart
  16. 22
      win_text_editor/lib/modules/outline/services/functions_service.dart
  17. 11
      win_text_editor/lib/modules/outline/services/uft_object_service.dart
  18. 9
      win_text_editor/lib/modules/outline/widgets/outline_explorer.dart
  19. 3
      win_text_editor/lib/modules/uft_component/services/uft_component_service.dart

4
win_text_editor/.vscode/settings.json vendored

@ -1,3 +1 @@ @@ -1,3 +1 @@
{
"cmake.sourceDirectory": "D:/aigc/manta/win_text_editor/linux"
}
{}

101
win_text_editor/assets/config/uft_macro_list.yaml

@ -18,15 +18,6 @@ templates: @@ -18,15 +18,6 @@ templates:
}else{
}
获取记录_ALL:
body: |
[获取记录][{{tableName}}({{keyName}})][
{{#keyFields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/keyFields}}
][]
获取记录数:
@ -45,7 +36,7 @@ templates: @@ -45,7 +36,7 @@ templates:
[获取记录][{{tableName}}({{keyName}})][
{{#keyFields}}
{{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}} {{^isLast}}, {{/isLast}}
{{name}} = @{{name}} {{^isLast}}, {{/isLast}}
{{/keyFields}}
]
@ -57,7 +48,7 @@ templates: @@ -57,7 +48,7 @@ templates:
<F>[修改索引字段][{{tableName}}][
{{#keyFields}}
{{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}}{{^isLast}}, {{/isLast}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/keyFields}}
]
}
@ -113,23 +104,6 @@ templates: @@ -113,23 +104,6 @@ templates:
//balabala
}
[遍历记录结束]
遍历记录_ALL:
body: |
[遍历记录开始][{{tableName}}({{selectIndexOrKey.name}})][
{{#selectIndexOrKey.fields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/selectIndexOrKey.fields}}
][
{{#selectedFields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/selectedFields}}
]
遍历记录结束_ALL:
body: |
[遍历记录结束]
插入组件:
body: |
@ -162,17 +136,6 @@ templates: @@ -162,17 +136,6 @@ templates:
{{/selectedFields}}
]
获取组件_ALL:
body: |
{{#hasIndex}}[组件排序][{{name}}(index.name)]{{/hasIndex}}
[获取组件][{{name}}{{#hasIndex}}({{index.name}}){{/hasIndex}}][{{^hasIndex}}[@num][{{/hasIndex}}
{{#hasIndex}}
{{#index.fields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/index.fields}}
][
{{/hasIndex}}]
遍历组件:
body: |
{{#hasIndex}}[组件排序][{{name}}({{index.name}})]{{/hasIndex}}
@ -190,7 +153,7 @@ templates: @@ -190,7 +153,7 @@ templates:
{
}
[遍历组件结束]
"[遍历组件结束]"
组件大小:
body: "[组件大小][{{name}}][@num]"
@ -203,7 +166,7 @@ templates: @@ -203,7 +166,7 @@ templates:
{{/fields}}
]
遍历组件_ALL:
遍历组件所有:
body: |
{{#hasIndex}}[组件排序][{{name}}({{index.name}})]{{/hasIndex}}
[遍历组件开始][{{name}}{{#hasIndex}}({{index.name}}){{/hasIndex}}][
@ -212,16 +175,19 @@ templates: @@ -212,16 +175,19 @@ templates:
{{name}} = @{{name}} {{^isLast}}, {{/isLast}}
{{/index.fields}}
{{/hasIndex}}
][
{{#fields}}
{{name}} = @{{name}}{{^isLast}}, {{/isLast}}
{{/fields}}
]
{
遍历组件结束_ALL:
body: |
[遍历组件结束]
}
"[遍历组件结束]"
普通调用_ALL:
普通调用:
body: |
[{{chineseName}}][
<Z>[{{chineseName}}][
{{#input}}
{{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}}{{^isLast}},{{/isLast}}
{{/input}}
@ -230,19 +196,6 @@ templates: @@ -230,19 +196,6 @@ templates:
{{name}} = @{{name}}{{^isLast}},{{/isLast}}
{{/output}}
]
普通调用:
body: |
<Z>[{{chineseName}}][
{{#selectedInput}}
{{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}}{{^isLast}},{{/isLast}}
{{/selectedInput}}
][
{{#selectedOutput}}
{{name}} = @{{name}}{{^isLast}},{{/isLast}}
{{/selectedOutput}}
]
[处理失败]
{
[错误信息获取]
@ -253,33 +206,9 @@ templates: @@ -253,33 +206,9 @@ templates:
else
{
//balabala
}
}
事务调用:
body: |
[事务处理开始]
<Z>[{{chineseName}}][
{{#selectedInput}}
{{name}} = @{{#partnerName}}{{partnerName}}.{{/partnerName}}{{name}}{{^isLast}},{{/isLast}}
{{/selectedInput}}
][
{{#selectedOutput}}
{{name}} = @{{name}}{{^isLast}},{{/isLast}}
{{/selectedOutput}}
]
[处理失败]
{
[错误信息获取]
//TODO:处理异常
[事务回滚]
[继续执行]
}
else
{
[事务处理结束]
}
事务调用_ALL:
body: |
[事务处理开始]
<Z>[{{chineseName}}][
@ -301,7 +230,7 @@ templates: @@ -301,7 +230,7 @@ templates:
else
{
[事务处理结束]
}
}
因子服务:
body: |

17
win_text_editor/lib/framework/services/macro_template_service.dart

@ -1,5 +1,4 @@ @@ -1,5 +1,4 @@
import 'package:flutter/services.dart' show rootBundle;
import 'package:win_text_editor/framework/controllers/logger.dart';
import 'package:yaml/yaml.dart';
import 'package:mustache_template/mustache_template.dart' as mustache;
@ -42,21 +41,11 @@ class MacroTemplateService { @@ -42,21 +41,11 @@ class MacroTemplateService {
: null;
}
String renderTemplate(
List<String> templateList,
Map<String, dynamic> context, {
bool selectAll = false,
}) {
String renderTemplate(List<String> templateList, Map<String, dynamic> context) {
StringBuffer buffer = StringBuffer();
for (var templateName in templateList) {
Map<String, dynamic>? template = getTemplate('$templateName${selectAll ? '_ALL' : ''}');
if (template == null) {
Logger().warning("没有找到模板$templateName${selectAll ? '_ALL' : ''}");
template = getTemplate(templateName);
if (template == null) {
throw Exception('Template $templateName not found');
}
}
final template = getTemplate(templateName);
if (template == null) throw Exception('Template $templateName not found');
buffer.writeln(_render(template['body'], context));

37
win_text_editor/lib/modules/call_function/controllers/call_function_controller.dart

@ -20,9 +20,10 @@ class CallFunctionController extends BaseContentController { @@ -20,9 +20,10 @@ class CallFunctionController extends BaseContentController {
late DataGridSource inputSource;
late DataGridSource outputSource;
final CallFunctionService _service;
final MacroTemplateService templateService = MacroTemplateService();
CallFunctionController() {
CallFunctionController() : _service = CallFunctionService(Logger()) {
inputSource = FieldsDataSource(
[],
onSelectionChanged: (index, isSelected) {
@ -55,24 +56,24 @@ class CallFunctionController extends BaseContentController { @@ -55,24 +56,24 @@ class CallFunctionController extends BaseContentController {
}
//
// for (final input in modle.inputParameters) {
// if (input.isSelected && input.type == CallFunction.componentType) {
// final component = modle.componentList?.firstWhereOrNull((c) => c.name == input.name);
// if (component != null) {
// sb.write(templateService.renderTemplate(['插入组件'], component.toMap()));
// }
// }
// }
for (final input in modle.inputParameters) {
if (input.isSelected && input.type == CallFunction.componentType) {
final component = modle.componentList?.firstWhereOrNull((c) => c.name == input.name);
if (component != null) {
sb.write(templateService.renderTemplate(['插入组件'], component.toMap()));
}
}
}
sb.write(templateService.renderTemplate(macroList, modle.toMap()));
//
// for (final output in modle.outputParameters) {
// if (output.isSelected && output.type == CallFunction.componentType) {
// final component = modle.componentList?.firstWhereOrNull((c) => c.name == output.name);
// if (component != null) {
// sb.write(templateService.renderTemplate(['遍历组件所有'], component.toMap()));
// }
// }
// }
for (final output in modle.outputParameters) {
if (output.isSelected && output.type == CallFunction.componentType) {
final component = modle.componentList?.firstWhereOrNull((c) => c.name == output.name);
if (component != null) {
sb.write(templateService.renderTemplate(['遍历组件所有'], component.toMap()));
}
}
}
return sb.toString();
}
@ -80,7 +81,7 @@ class CallFunctionController extends BaseContentController { @@ -80,7 +81,7 @@ class CallFunctionController extends BaseContentController {
Future<void> onOpenFile(String filePath, {dynamic appendArg}) async {
Logger().info("Opening file: $filePath");
try {
modle = await CallFunctionService.parseXmlFile(filePath);
modle = await _service.parseXmlFile(filePath);
// datagrid显示的数据源
(inputSource as FieldsDataSource).updateData(modle.inputParameters);

35
win_text_editor/lib/modules/call_function/models/call_function.dart

@ -10,7 +10,6 @@ class CallFunction { @@ -10,7 +10,6 @@ class CallFunction {
final List<Field> inputParameters;
final List<Field> outputParameters;
List<UftComponent>? componentList;
List<UftComponent>? outComponentList;
String? factorParam;
final List<CodePartner> codePartners = [];
@ -21,7 +20,6 @@ class CallFunction { @@ -21,7 +20,6 @@ class CallFunction {
required this.inputParameters,
required this.outputParameters,
this.componentList,
this.outComponentList,
this.factorParam,
});
@ -31,25 +29,6 @@ class CallFunction { @@ -31,25 +29,6 @@ class CallFunction {
'chineseName': chineseName,
'factorParam': factorParam ?? '',
'input':
inputParameters
.map(
(field) => {
'id': field.id,
'name': field.name,
'chineseName': field.chineseName,
'type': field.type,
'isLast': inputParameters.indexOf(field) == inputParameters.length - 1,
'partnerName':
codePartners
.firstWhere(
(partner) => partner.fields.any((f) => f == field.name),
orElse: () => CodePartner(name: null, fields: []),
)
.name,
},
)
.toList(),
'selectedInput':
inputParameters
.where((field) => field.isSelected)
.map(
@ -69,21 +48,9 @@ class CallFunction { @@ -69,21 +48,9 @@ class CallFunction {
},
)
.toList(),
'selectedOutput':
outputParameters
.where((field) => field.isSelected)
.map(
(field) => {
'id': field.id,
'name': field.name,
'chineseName': field.chineseName,
'type': field.type,
'isLast': outputParameters.indexOf(field) == outputParameters.length - 1,
},
)
.toList(),
'output':
outputParameters
.where((field) => field.isSelected)
.map(
(field) => {
'id': field.id,

18
win_text_editor/lib/modules/call_function/services/call_function_service.dart

@ -11,6 +11,10 @@ import 'package:xml/xml.dart' as xml; @@ -11,6 +11,10 @@ import 'package:xml/xml.dart' as xml;
import 'package:win_text_editor/framework/controllers/logger.dart';
class CallFunctionService {
final Logger _logger;
CallFunctionService(this._logger);
static const Map<String, String> _functionRootTypeMap = {
'uftfunction': 'business:Function',
'uftservice': 'business:Service',
@ -20,13 +24,12 @@ class CallFunctionService { @@ -20,13 +24,12 @@ class CallFunctionService {
'uftfactorservice': 'business:FactorService',
};
static Future<CallFunction> parseXmlFile(String filePath) async {
Future<CallFunction> parseXmlFile(String filePath) async {
try {
// 1. Check file extension
final extendFileName = filePath.toLowerCase().split('.').last;
final String? rootNodeType = _functionRootTypeMap[extendFileName];
if (rootNodeType == null) {
Logger().error('文件扩展名不正确:$filePath');
throw const FormatException("文件扩展名不正确!");
}
@ -50,8 +53,6 @@ class CallFunctionService { @@ -50,8 +53,6 @@ class CallFunctionService {
List<UftComponent> componentList = [];
List<UftComponent> outComponentList = [];
// 5. Process inputParameters (fields)
final inputParameters = document.findAllElements(
extendFileName == "uftfactorservice" ? 'internalParams' : 'inputParameters',
@ -67,7 +68,7 @@ class CallFunctionService { @@ -67,7 +68,7 @@ class CallFunctionService {
// 6. Process outputParameters
final outputParameters = document.findAllElements('outputParameters');
final outputFields = await parserFields(filePath, outputParameters, outComponentList);
final outputFields = await parserFields(filePath, outputParameters, componentList);
return CallFunction(
functionType: extendFileName,
@ -76,19 +77,18 @@ class CallFunctionService { @@ -76,19 +77,18 @@ class CallFunctionService {
inputParameters: inputFields,
outputParameters: outputFields,
componentList: componentList,
outComponentList: outComponentList,
factorParam: factorParam,
);
} on xml.XmlParserException catch (e) {
Logger().error("XML解析错误: ${e.message}");
_logger.error("XML解析错误: ${e.message}");
rethrow;
} catch (e) {
Logger().error("处理文件时发生错误: $e");
_logger.error("处理文件时发生错误: $e");
rethrow;
}
}
static Future<List<Field>> parserFields(
Future<List<Field>> parserFields(
String filePath,
Iterable<xml.XmlElement> parameters,
List<UftComponent> componentList,

44
win_text_editor/lib/modules/code_creater/controllers/code_creater_controller.dart

@ -1,6 +1,5 @@ @@ -1,6 +1,5 @@
import 'package:win_text_editor/framework/common/constants.dart';
import 'package:win_text_editor/framework/controllers/logger.dart';
import 'package:win_text_editor/modules/code_creater/services/code_create_service.dart';
import 'package:win_text_editor/modules/outline/models/outline_node.dart';
import 'package:win_text_editor/shared/base/base_content_controller.dart';
@ -23,6 +22,7 @@ class CodeCreaterController extends BaseContentController { @@ -23,6 +22,7 @@ class CodeCreaterController extends BaseContentController {
_members.where((node) => !(unMatchMap[node.value]?.contains(value) ?? false)).toList();
_members = filtered; //
_selectedOperation = value;
notifyListeners(); //
}
void updateMembers(List<OutlineNode> newMembers) {
@ -43,49 +43,9 @@ class CodeCreaterController extends BaseContentController { @@ -43,49 +43,9 @@ class CodeCreaterController extends BaseContentController {
return;
}
if (members.contains(node)) {
Logger().error('不支持重复节点: ${node.title}');
return;
}
//
node.selectedAction = CodeCreateService.getNodeActions(node.name)[0];
members.add(node);
notifyListeners();
}
Future<String> genCodeString() {
return CodeCreateService.genCodeString(members, selectedOperation);
}
void handleActionTypeChange(int index, String newAction) {
final memberName = members[index].name;
if (newAction == "遍历记录") {
members.add(
OutlineNode(
name: '${members[index].name}_END',
title: members[index].title,
value: '${members[index].value}_END',
selectedAction: "遍历记录结束",
),
);
} else if (newAction == "遍历组件") {
members.add(
OutlineNode(
name: '${members[index].name}_END',
title: members[index].title,
value: '${members[index].value}_END',
selectedAction: "遍历组件结束",
),
);
} else {
members.removeWhere((member) => member.name == '${memberName}_END');
}
// members[index].selectedAction = newAction;
notifyListeners();
}
genCodeString(List<String> list) {}
}

290
win_text_editor/lib/modules/code_creater/services/code_create_service.dart

@ -1,290 +0,0 @@ @@ -1,290 +0,0 @@
import 'package:flutter/material.dart';
import 'package:win_text_editor/framework/common/constants.dart';
import 'package:win_text_editor/framework/services/macro_template_service.dart';
import 'package:win_text_editor/modules/call_function/models/call_function.dart';
import 'package:win_text_editor/modules/call_function/services/call_function_service.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/modules/outline/models/code_partner.dart';
import 'package:win_text_editor/modules/outline/models/outline_node.dart';
import 'package:win_text_editor/modules/uft_component/models/uft_component.dart';
import 'package:win_text_editor/modules/uft_component/services/uft_component_service.dart';
class CodeCreateService {
static List<String> getNodeActions(String type) {
switch (type) {
case Constants.atomFunction:
case Constants.atomService:
case Constants.business:
return ['普通调用', '事务调用'];
case Constants.uftTable:
return ['获取记录', '遍历记录', '插入记录', '修改记录', '删除记录'];
case Constants.component:
return ['获取组件', '遍历组件', '插入组件', '修改组件', '尾部插入组件'];
case "${Constants.component}_END":
return ['遍历组件结束'];
case "${Constants.uftTable}_END":
return ['遍历记录结束'];
default:
return ['']; //
}
}
static final MacroTemplateService templateService = MacroTemplateService();
static void initTemplateService() {
if (!templateService.inited) {
templateService.init();
}
}
static Future<String> genCodeString(List<OutlineNode> members, String selectedOperation) async {
initTemplateService();
//members,value
StringBuffer codeBuffer = StringBuffer("//生成$selectedOperation代码\n\n");
List<String> inputFields = []; //
List<String> outputFields = []; //
List<String> macroCodeList = []; //
List<CodePartner> beforePartner = []; //
Map<String, List<String>> iterateOutputFields = {}; //-使
Map<String, List<CodePartner>> iteratePartnerMap = {}; //
List<String> iterateStack = []; //
//
Future<void> parseRelationShips(List<OutlineNode> nodes, String selectedOperation) async {
for (int i = 0; i < members.length; i++) {
final member = members[i];
final action =
member.selectedAction!.isEmpty
? getNodeActions(member.value)[0]
: member.selectedAction;
//
if (action!.startsWith("遍历") && action.endsWith("结束")) {
//
final memberName = iterateStack.removeLast();
debugPrint('删除遍历块:$memberName');
iterateOutputFields.remove(memberName);
iteratePartnerMap.remove(memberName);
final macroCode = templateService.renderTemplate([action], {}, selectAll: true);
macroCodeList.add(macroCode);
continue;
}
switch (member.value) {
case Constants.atomFunction:
case Constants.atomService:
case Constants.business:
CallFunction model = await CallFunctionService.parseXmlFile(member.path!);
model.codePartners.clear(); //
//
inputFields.addAll(
model.inputParameters
.where(
(field) =>
!outputFields.contains(field.name) &&
!inputFields.contains(field.name) &&
!iterateOutputFields.values.expand((list) => list).contains(field.name),
)
.map((field) => field.name),
);
//
model.codePartners.addAll(beforePartner.toSet());
//
model.codePartners.addAll(
iteratePartnerMap.values.expand((partners) => partners).toList(),
);
//
if (iterateStack.isNotEmpty) {
//
iterateOutputFields
.putIfAbsent(iterateStack.last, () => [])
.addAll(model.outputParameters.map((field) => field.name).toSet());
//:
for (UftComponent component in model.outComponentList!) {
List<String> fieldNames = [];
for (var field in component.fields) {
fieldNames.add(field.name);
}
iterateOutputFields
.putIfAbsent(iterateStack.last, () => [])
.addAll(component.fields.map((field) => field.name).toSet());
iteratePartnerMap
.putIfAbsent(component.name, () => [])
.add(CodePartner(name: component.name, fields: fieldNames));
}
} else {
//
outputFields.addAll(
model.outputParameters
.where((field) => !outputFields.contains(field.name))
.map((field) => field.name),
);
//
for (UftComponent component in model.outComponentList!) {
List<String> fieldNames = component.fields.map((col) => col.name).toList();
outputFields.addAll(fieldNames.toSet());
beforePartner.add(CodePartner(name: member.name, fields: fieldNames));
}
}
final macroCode = templateService.renderTemplate(
[action],
model.toMap(),
selectAll: true,
);
macroCodeList.add(macroCode);
break;
case Constants.uftTable:
TableData tableData = await MemoryTableService.parseStructureFile(member.path!);
final memoryTable = MemoryTable(
tableName: tableData.tableName,
columns: tableData.fields,
indexes: tableData.indexes,
);
memoryTable.codePartners.clear();
//
memoryTable.codePartners.addAll(beforePartner.toSet());
//
memoryTable.codePartners.addAll(
iteratePartnerMap.values.expand((partners) => partners).toList(),
);
List<String> fieldNames = memoryTable.columns.map((col) => col.name).toList();
switch (action) {
case '获取记录':
for (var fieldName in memoryTable.keyFields) {
if (!outputFields.contains(fieldName) &&
!inputFields.contains(fieldName) &&
!iterateOutputFields.values.expand((list) => list).contains(fieldName)) {
inputFields.add(fieldName);
}
}
if (iterateStack.isNotEmpty) {
//
iterateOutputFields.putIfAbsent(iterateStack.last, () => []).addAll(fieldNames);
iteratePartnerMap
.putIfAbsent(member.name, () => [])
.add(CodePartner(name: member.name, fields: fieldNames));
} else {
//
outputFields.addAll(fieldNames);
beforePartner.add(CodePartner(name: member.name, fields: fieldNames));
}
break;
case '遍历记录':
List<String> fieldNames = memoryTable.columns.map((col) => col.name).toList();
iterateStack.add(memoryTable.tableName); //
//
iterateOutputFields.putIfAbsent(iterateStack.last, () => []).addAll(fieldNames);
iteratePartnerMap
.putIfAbsent(member.name, () => [])
.add(CodePartner(name: member.name, fields: fieldNames));
break;
case '插入记录':
case '修改记录':
case '删除记录':
for (var fieldName in memoryTable.keyFields) {
if (!outputFields.contains(fieldName) &&
!inputFields.contains(fieldName) &&
!iterateOutputFields.values.expand((list) => list).contains(fieldName)) {
inputFields.add(fieldName);
}
}
break;
}
final macroCode = templateService.renderTemplate(
[action!],
memoryTable.toMap(),
selectAll: true,
);
macroCodeList.add(macroCode);
break;
case Constants.component:
final component = await UftComponentService.getUftComponent(member.path!, member.name);
component!.codePartners.clear();
component.codePartners.addAll(beforePartner);
component.codePartners.addAll(
iteratePartnerMap.values.expand((partners) => partners).toList(),
);
switch (action) {
case "获取组件":
case "遍历组件":
List<String> fieldNames = component.fields.map((col) => col.name).toList();
//
if (iterateStack.isNotEmpty) {
//
iterateOutputFields.putIfAbsent(iterateStack.last, () => []).addAll(fieldNames);
iteratePartnerMap
.putIfAbsent(member.name, () => [])
.add(CodePartner(name: member.name, fields: fieldNames));
} else {
//
outputFields.addAll(fieldNames);
beforePartner.add(CodePartner(name: member.name, fields: fieldNames));
}
iterateStack.add(component.name); //
break;
default:
for (var field in component.fields) {
if (!outputFields.contains(field.name) &&
!inputFields.contains(field.name) &&
!iterateOutputFields.values.expand((list) => list).contains(field.name)) {
inputFields.add(field.name);
}
}
break;
}
final macroCode = templateService.renderTemplate(
[action],
component.toMap(),
selectAll: true,
);
macroCodeList.add(macroCode);
break;
default:
macroCodeList.add('//未知类型: ${member.name}');
}
}
}
await parseRelationShips(members, selectedOperation);
codeBuffer.writeln("//可能需要传入的参数");
for (var field in inputFields) {
codeBuffer.writeln('@$field = ,');
}
codeBuffer.writeln('');
for (final mc in macroCodeList) {
codeBuffer.write(mc);
}
return codeBuffer.toString();
}
}

14
win_text_editor/lib/modules/code_creater/widgets/code_creater_view.dart

@ -39,7 +39,6 @@ class _CodeCreaterViewState extends State<CodeCreaterView> { @@ -39,7 +39,6 @@ class _CodeCreaterViewState extends State<CodeCreaterView> {
}
_controller.addListener(_handleControllerUpdate);
_controller.addListener(_updateDisplay);
}
void _handleControllerUpdate() {
@ -49,7 +48,6 @@ class _CodeCreaterViewState extends State<CodeCreaterView> { @@ -49,7 +48,6 @@ class _CodeCreaterViewState extends State<CodeCreaterView> {
@override
void dispose() {
_controller.removeListener(_handleControllerUpdate);
_controller.removeListener(_updateDisplay);
if (!_isControllerFromTabManager) {
_controller.dispose();
}
@ -73,8 +71,6 @@ class _CodeCreaterViewState extends State<CodeCreaterView> { @@ -73,8 +71,6 @@ class _CodeCreaterViewState extends State<CodeCreaterView> {
onDeleteMember: _deleteMember,
onMoveToTop: _moveToTop,
onMoveToBottom: _moveToBottom,
onActionTypeChanged:
(index, newAction) => _controller.handleActionTypeChange(index, newAction),
),
),
),
@ -121,7 +117,6 @@ class _CodeCreaterViewState extends State<CodeCreaterView> { @@ -121,7 +117,6 @@ class _CodeCreaterViewState extends State<CodeCreaterView> {
setState(() {
_controller.members.insert(to, member); //
_updateDisplay();
});
}
@ -135,12 +130,7 @@ class _CodeCreaterViewState extends State<CodeCreaterView> { @@ -135,12 +130,7 @@ class _CodeCreaterViewState extends State<CodeCreaterView> {
void _deleteMember(int index) {
setState(() {
final memberName = _controller.members[index].name;
//
_controller.members.removeWhere((member) => member.name == '${memberName}_END');
_controller.members.removeAt(index);
_updateDisplay();
});
}
@ -154,7 +144,7 @@ class _CodeCreaterViewState extends State<CodeCreaterView> { @@ -154,7 +144,7 @@ class _CodeCreaterViewState extends State<CodeCreaterView> {
});
}
Future<void> _updateDisplay() async {
_codeController.text = await _controller.genCodeString();
void _updateDisplay() {
_codeController.text = _controller.genCodeString([_controller.selectedOperation!]) ?? '';
}
}

52
win_text_editor/lib/modules/code_creater/widgets/node_table.dart

@ -3,7 +3,6 @@ import 'dart:ui'; @@ -3,7 +3,6 @@ import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:pluto_grid/pluto_grid.dart';
import 'package:win_text_editor/framework/common/constants.dart';
import 'package:win_text_editor/modules/code_creater/services/code_create_service.dart';
import 'package:win_text_editor/modules/outline/models/outline_node.dart';
import 'package:win_text_editor/shared/components/my_pluto_column.dart';
import 'package:win_text_editor/shared/components/my_pluto_configuration.dart';
@ -15,7 +14,6 @@ class NodeTable extends StatefulWidget { @@ -15,7 +14,6 @@ class NodeTable extends StatefulWidget {
final Function(int) onDeleteMember;
final Function(int) onMoveToTop;
final Function(int) onMoveToBottom;
final Function(int, String)? onActionTypeChanged; //
const NodeTable({
super.key,
@ -24,7 +22,6 @@ class NodeTable extends StatefulWidget { @@ -24,7 +22,6 @@ class NodeTable extends StatefulWidget {
required this.onDeleteMember,
required this.onMoveToTop,
required this.onMoveToBottom,
this.onActionTypeChanged, //
});
@override
@ -82,9 +79,6 @@ class NodeTableState extends State<NodeTable> { @@ -82,9 +79,6 @@ class NodeTableState extends State<NodeTable> {
_stateManager?.setSelectingMode(PlutoGridSelectingMode.row);
_stateManager?.addListener(_handleRowSelection);
},
onChanged: (PlutoGridOnChangedEvent event) {
_handleCellChanged(event);
},
onRowDoubleTap: (event) {
_selectedRowIndex = event.rowIdx;
},
@ -172,23 +166,6 @@ class NodeTableState extends State<NodeTable> { @@ -172,23 +166,6 @@ class NodeTableState extends State<NodeTable> {
});
}
void _handleCellChanged(PlutoGridOnChangedEvent event) {
if (event.column?.field == 'type' && event.rowIdx != null) {
final rowIndex = event.rowIdx!;
if (rowIndex >= 0 && rowIndex < widget.members.length) {
final newValue = event.value?.toString() ?? '';
setState(() {
widget.members[rowIndex].selectedAction = newValue;
});
// controller
if (widget.onActionTypeChanged != null) {
widget.onActionTypeChanged!(rowIndex, newValue);
}
}
}
}
final Map<Key, _NodeTypeData> _nodeTypeData = {};
List<PlutoColumn> _buildColumns() {
@ -202,7 +179,7 @@ class NodeTableState extends State<NodeTable> { @@ -202,7 +179,7 @@ class NodeTableState extends State<NodeTable> {
MyPlutoColumn(
title: '成员',
field: 'content',
width: 200,
width: 300,
enableRowChecked: false, //
),
MyPlutoDropdownColumn(
@ -224,13 +201,7 @@ class NodeTableState extends State<NodeTable> { @@ -224,13 +201,7 @@ class NodeTableState extends State<NodeTable> {
.map((index, member) {
final rowKey = ValueKey('${member.hashCode}_$index');
final options = _getOptions(member.value);
// Use selectedAction if it exists, otherwise use the first option
final initialValue =
member.selectedAction?.isNotEmpty == true
? member.selectedAction!
: options.isNotEmpty
? options.first
: '';
final initialValue = options.isNotEmpty ? options.first : '';
_nodeTypeData[rowKey] = _NodeTypeData(member.value, initialValue);
@ -250,6 +221,21 @@ class NodeTableState extends State<NodeTable> { @@ -250,6 +221,21 @@ class NodeTableState extends State<NodeTable> {
.toList();
}
List<String> _getOptions(String type) {
switch (type) {
case Constants.atomFunction:
case Constants.atomService:
case Constants.business:
return ['普通调用', '事务调用'];
case Constants.uftTable:
return ['获取记录', '遍历记录', '插入记录', '修改记录', '删除记录'];
case Constants.component:
return ['获取组件', '遍历组件', '插入组件', '修改组件', '尾部插入组件'];
default:
return ['']; //
}
}
void refreshTable() {
if (_stateManager != null) {
_stateManager!.refRows.clear();
@ -264,8 +250,4 @@ class NodeTableState extends State<NodeTable> { @@ -264,8 +250,4 @@ class NodeTableState extends State<NodeTable> {
_scrollController.dispose();
super.dispose();
}
List<String> _getOptions(String s) {
return CodeCreateService.getNodeActions(s);
}
}

5
win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart

@ -18,12 +18,13 @@ class MemoryTableController extends BaseContentController { @@ -18,12 +18,13 @@ class MemoryTableController extends BaseContentController {
late DataGridSource fieldsSource;
late DataGridSource indexesSource;
final MemoryTableService _service;
final MacroTemplateService templateService = MacroTemplateService();
// MemoryTable对象
late MemoryTable _memoryTable;
MemoryTableController() {
MemoryTableController() : _service = MemoryTableService(Logger()) {
//
final initialFields = [Field('1', '', '', '', false), Field('2', '', '', '', false)];
@ -67,7 +68,7 @@ class MemoryTableController extends BaseContentController { @@ -67,7 +68,7 @@ class MemoryTableController extends BaseContentController {
Future<void> onOpenFile(String filePath, {dynamic appendArg}) async {
Logger().info("Opening file: $filePath");
try {
final tableData = await MemoryTableService.parseStructureFile(filePath);
final tableData = await _service.parseStructureFile(filePath);
// Update controller state
tableName = tableData.tableName;

24
win_text_editor/lib/modules/memory_table/models/memory_table.dart

@ -114,34 +114,14 @@ class MemoryTable { @@ -114,34 +114,14 @@ class MemoryTable {
'isPrimary': index.isPrimary,
'fields':
index.fields.asMap().entries.map((entry) {
return {
'name': entry.value,
'partnerName':
codePartners
.firstWhere(
(partner) => partner.fields.any((f) => f == entry.value),
orElse: () => CodePartner(name: null, fields: []),
)
.name,
'isLast': entry.key == keyFields.length - 1,
};
return {'name': entry.value, 'isLast': entry.key == keyFields.length - 1};
}).toList(),
'rule': index.rule,
},
'keyName': keyName,
'keyFields':
keyFields.asMap().entries.map((entry) {
return {
'name': entry.value,
'partnerName':
codePartners
.firstWhere(
(partner) => partner.fields.any((f) => f == entry.value),
orElse: () => CodePartner(name: null, fields: []),
)
.name,
'isLast': entry.key == keyFields.length - 1,
};
return {'name': entry.value, 'isLast': entry.key == keyFields.length - 1};
}).toList(),
};
}

10
win_text_editor/lib/modules/memory_table/services/memory_table_service.dart

@ -9,7 +9,11 @@ import 'package:path/path.dart' as path; @@ -9,7 +9,11 @@ import 'package:path/path.dart' as path;
import 'package:win_text_editor/framework/controllers/logger.dart';
class MemoryTableService {
static Future<TableData> parseStructureFile(String filePath) async {
final Logger _logger;
MemoryTableService(this._logger);
Future<TableData> parseStructureFile(String filePath) async {
try {
// 1. Check file extension
if (!filePath.toLowerCase().endsWith('.uftstructure')) {
@ -91,10 +95,10 @@ class MemoryTableService { @@ -91,10 +95,10 @@ class MemoryTableService {
indexes: indexList.isNotEmpty ? indexList : [],
);
} on xml.XmlParserException catch (e) {
Logger().error("XML解析错误: ${e.message}");
_logger.error("XML解析错误: ${e.message}");
rethrow;
} catch (e) {
Logger().error("处理文件时发生错误: $e");
_logger.error("处理文件时发生错误: $e");
rethrow;
}
}

5
win_text_editor/lib/modules/outline/models/outline_node.dart

@ -27,9 +27,6 @@ class OutlineNode implements TreeNode { @@ -27,9 +27,6 @@ class OutlineNode implements TreeNode {
final String value;
String? wordClass;
String? selectedAction;
String? path;
OutlineNode({
required this.name,
required this.value,
@ -42,8 +39,6 @@ class OutlineNode implements TreeNode { @@ -42,8 +39,6 @@ class OutlineNode implements TreeNode {
this.wordClass,
List<OutlineNode>? children,
this.title = "",
this.selectedAction = "",
this.path = "",
}) : _children = children ?? [] {
id = DateTime.now().microsecondsSinceEpoch.toRadixString(36) + title.hashCode.toRadixString(36);
}

8
win_text_editor/lib/modules/outline/services/component_service.dart

@ -1,5 +1,6 @@ @@ -1,5 +1,6 @@
import 'dart:io';
import 'package:flutter/widgets.dart';
import 'package:win_text_editor/framework/common/constants.dart';
import 'package:win_text_editor/framework/controllers/logger.dart';
import 'package:win_text_editor/modules/outline/models/outline_node.dart';
@ -8,13 +9,10 @@ import 'package:xml/xml.dart'; @@ -8,13 +9,10 @@ import 'package:xml/xml.dart';
class ComponentService {
//
static Map<String, List<String>> componentFieldMap = {};
static String filePath = "";
//
static Future<void> initComponentFieldMap(String rootPath) async {
filePath = '$rootPath\\metadata\\component.xml';
final componentFile = File(filePath);
final componentFile = File('$rootPath/metadata/component.xml');
if (!await componentFile.exists()) {
Logger().error('component.xml文件不存在');
return;
@ -70,7 +68,6 @@ class ComponentService { @@ -70,7 +68,6 @@ class ComponentService {
value: Constants.component,
isDirectory: false,
depth: 4,
path: filePath,
),
),
);
@ -87,7 +84,6 @@ class ComponentService { @@ -87,7 +84,6 @@ class ComponentService {
value: Constants.component,
isDirectory: false,
depth: 4,
path: filePath,
),
);
}

22
win_text_editor/lib/modules/outline/services/functions_service.dart

@ -1,6 +1,5 @@ @@ -1,6 +1,5 @@
import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:win_text_editor/framework/common/constants.dart';
import 'package:win_text_editor/framework/controllers/logger.dart';
import 'package:win_text_editor/modules/outline/models/outline_node.dart';
@ -90,12 +89,11 @@ class FunctionsService { @@ -90,12 +89,11 @@ class FunctionsService {
if (value.contains(fieldName)) {
parentNode.children.add(
OutlineNode(
name: path.basenameWithoutExtension(value[0]), //
name: value[0], //
title: key,
value: Constants.atomService,
isDirectory: false, //
depth: 4,
path: value[0],
),
);
}
@ -109,12 +107,11 @@ class FunctionsService { @@ -109,12 +107,11 @@ class FunctionsService {
if (value.contains(fieldName)) {
parentNode.children.add(
OutlineNode(
name: path.basenameWithoutExtension(value[0]), //
name: value[0], //
title: key,
value: Constants.atomFunction,
isDirectory: false, //
depth: 4,
path: value[0],
),
);
}
@ -126,16 +123,14 @@ class FunctionsService { @@ -126,16 +123,14 @@ class FunctionsService {
if (fieldName == null || fieldName.isEmpty) return;
uftbusinessMap.forEach((key, value) {
final functionName = path.basenameWithoutExtension(value[0]);
if (value.contains(fieldName)) {
parentNode.children.add(
OutlineNode(
name: functionName,
name: value[0], //
title: key,
value: Constants.business,
isDirectory: false, //
depth: 4,
path: value[0], //
),
);
}
@ -145,16 +140,14 @@ class FunctionsService { @@ -145,16 +140,14 @@ class FunctionsService {
static List<OutlineNode> searchBusiness(String searchQuery) {
final List<OutlineNode> nodes = [];
uftbusinessMap.forEach((key, value) {
final functionName = path.basenameWithoutExtension(value[0]);
if (key.contains(searchQuery)) {
nodes.add(
OutlineNode(
name: functionName,
name: value[0], //
title: key,
value: Constants.business,
isDirectory: false, //
depth: 4,
path: value[0], //
),
);
}
@ -166,16 +159,14 @@ class FunctionsService { @@ -166,16 +159,14 @@ class FunctionsService {
static List<OutlineNode> searchAtomServices(String searchQuery) {
final List<OutlineNode> nodes = [];
uftatomserviceMap.forEach((key, value) {
final functionName = path.basenameWithoutExtension(value[0]);
if (key.contains(searchQuery)) {
nodes.add(
OutlineNode(
name: functionName,
name: value[0], //
title: key,
value: Constants.atomService,
isDirectory: false, //
depth: 4,
path: value[0], //
),
);
}
@ -190,12 +181,11 @@ class FunctionsService { @@ -190,12 +181,11 @@ class FunctionsService {
if (key.contains(searchQuery)) {
nodes.add(
OutlineNode(
name: path.basenameWithoutExtension(value[0]),
name: value[0], //
title: key,
value: Constants.atomFunction,
isDirectory: false, //
depth: 4,
path: value[0], //
),
);
}

11
win_text_editor/lib/modules/outline/services/uft_object_service.dart

@ -66,15 +66,13 @@ class UftObjectService { @@ -66,15 +66,13 @@ class UftObjectService {
uftObjectMap.forEach((key, value) {
if (value.contains(fieldName)) {
final tableName = path.basenameWithoutExtension(value[0]);
parentNode.children.add(
OutlineNode(
name: tableName,
name: value[0],
title: key,
value: Constants.uftTable,
isDirectory: false, //
depth: 4,
path: value[0],
),
);
}
@ -85,16 +83,15 @@ class UftObjectService { @@ -85,16 +83,15 @@ class UftObjectService {
final List<OutlineNode> searchNodes = [];
uftObjectMap.forEach((key, value) {
final tableName = path.basenameWithoutExtension(value[0]);
if (key.contains(searchQuery) || tableName.contains(searchQuery)) {
if (key.contains(searchQuery) ||
path.basenameWithoutExtension(value[0]).contains(searchQuery)) {
searchNodes.add(
OutlineNode(
name: tableName,
name: value[0],
title: key,
value: Constants.uftTable,
isDirectory: false,
depth: 4,
path: value[0],
),
);
}

9
win_text_editor/lib/modules/outline/widgets/outline_explorer.dart

@ -178,12 +178,15 @@ class _OutlineExplorerState extends State<OutlineExplorer> { @@ -178,12 +178,15 @@ class _OutlineExplorerState extends State<OutlineExplorer> {
case Constants.atomFunction:
case Constants.atomService:
if (widget.onFileDoubleTap != null) {
widget.onFileDoubleTap!(outlineNode.path!, null);
widget.onFileDoubleTap!(outlineNode.name, null);
}
break;
case Constants.component:
if (widget.onFileDoubleTap != null) {
widget.onFileDoubleTap!(outlineNode.path!, outlineNode.name);
if (widget.onFileDoubleTap != null && fileProvider.rootPath != null) {
widget.onFileDoubleTap!(
'${fileProvider.rootPath}\\metadata\\component.xml',
outlineNode.name,
);
}
break;
}

3
win_text_editor/lib/modules/uft_component/services/uft_component_service.dart

@ -17,8 +17,7 @@ class UftComponentService { @@ -17,8 +17,7 @@ class UftComponentService {
static Future<UftComponent?> getUftComponent(String filePath, String componentName) async {
if (_components.isNotEmpty) {
final com = _components.firstWhereOrNull((c) => c.name == componentName);
if (com != null) return com;
return _components.firstWhereOrNull((c) => c.name == componentName);
}
return parseComponentFile(
filePath,

Loading…
Cancel
Save