using Microsoft.AspNetCore.Components;
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
namespace BlazorAceEditor
{
public partial class AceEditor : IAsyncDisposable
{
[Inject] private AceEditorJsInterop JsInterop { get; set; }
///
/// 附加属性
///
[Parameter(CaptureUnmatchedValues = true)]
public Dictionary Attributes { get; set; }
[Parameter] public EventCallback OnChanged { get; set; }
[Parameter] public EventCallback OnLoad { get; set; }
public string ElementId { get; } = $"BlazorAceEditor_{Guid.NewGuid():N}";
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (firstRender)
{
AceEditorJsCallbackManager.AddEventHandler(ElementId, "onChange", new Func(() => OnChanged.InvokeAsync(this)));
AceEditorJsCallbackManager.AddEventHandler(ElementId, "onLoad", new Func(() => OnLoad.InvokeAsync(this)));
await CreateEditor();
}
}
public async ValueTask DisposeAsync()
{
AceEditorJsCallbackManager.DisposeObject(ElementId);
await DestroyEditor();
}
//glues base
private Task InvokeVoid([CallerMemberName] string methodName = null) => JsInterop.InvokeVoid(ElementId, methodName);
private Task InvokeVoidP1(object arg0, [CallerMemberName] string methodName = null) => JsInterop.InvokeVoidP1(ElementId, arg0, methodName);
private ValueTask Invoke([CallerMemberName] string methodName = null) => JsInterop.Invoke(ElementId, methodName);
//glues
private Task CreateEditor() => InvokeVoid();
private Task DestroyEditor() => InvokeVoid();
public Task SetTheme(string themeName) => InvokeVoidP1(themeName);
public Task SetLang(string langName) => InvokeVoidP1(langName);
public Task SetInfinityMaxLines() => InvokeVoid();
public Task SetMaxLines(int maxLines) => InvokeVoidP1(maxLines);
public Task SetMinLines(int minLines) => InvokeVoidP1(minLines);
public ValueTask GetValue() => Invoke();
public Task SetValue(string value) => InvokeVoidP1(value);
public Task SetFontSize(int value) => InvokeVoidP1(value);
public Task ClearSelection() => InvokeVoid();
}
}