RaUI/Source/Itrycn_Project2/MdiForm/FrmMainEditor.cs
zilinsoft b4e236fd55 ### 2025-01-06 星期一更新
------
#### OnLineUpgradeConfig    V1.0.2501.0601
- *.[修复]修复用户管理列表无法默认勾选已选择用户的BUG。
#### RaUI    V4.0.2501.0601
- *.[新增]RyFiles类新增SetFileDate、SetFileCreationTime、SetFileLastWriteTime方法。
- *.[新增]RyFiles.CopyBigFile方法现在会同步来源文件的创建和修改时间。
- *.[新增]ryQuickSQL类新增GetPostData函数,将数据快速转成Post数据。
- *.[改进]执行MySQL下的ExecuteNonQuery时,如果遇到连接关闭错误,允许重连并重新执行。
- *.[改进]IDbInterface在执行新的SQL语句前,自动清空最后错误。
- *.[修复]修复LayeredForm窗体以正常窗体打开的时候,文本框无法编辑的BUG。
- *.[修复]修复ApkOp获取apk权限时可能带乱码的BUG。
- *.[修复]修复WeifenLuo.WinFormsUI.Docking的ResourceManager.GetString路径不对导致报错的BUG。
2025-01-06 11:14:35 +08:00

459 lines
19 KiB
C#

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ryCommon;
using System;
using System.Drawing;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace Itrycn_Project2
{
public partial class FrmMainEditor : Form
{
public static FrmMainEditor MainEditor { get; private set; }
public FrmMainEditor()
{
InitializeComponent();
EnableVSRenderer(VisualStudioToolStripExtender.VsVersion.Vs2015, vS2015BlueTheme1);
//DragManager = RyFiles.AddDropDrag(Handle);
//DragManager.ElevatedDragDrop += FrmMainEditor_ElevatedDragDrop;
MainEditor = this;
this.AllowDrop = true;
this.DragEnter += FrmMainEditor_DragEnter;
this.DragDrop += FrmMainEditor_DragDrop;
}
public DockPanel DockPanel
{
get
{
return this.dockPanel;
}
}
private void FrmMainEditor_DragDrop(object sender, DragEventArgs e)
{
string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
if (s.Length == 1 && System.IO.Directory.Exists(s[0]))
{
//
}
for (int i = 0; i < s.Length; i++)
{
if (!System.IO.File.Exists(s[i])) { continue; }
//OpenFile(s[i], s.Length == 1);
}
}
private void FrmMainEditor_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.All;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private void EnableVSRenderer(VisualStudioToolStripExtender.VsVersion version, ThemeBase theme)
{
vsToolStripExtender1.SetStyle(menuStrip1, version, theme);
vsToolStripExtender1.SetStyle(toolStrip1, version, theme);
vsToolStripExtender1.SetStyle(statusStrip1, version, theme);
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog
{
Filter = "常用格式|*.php;*.cs;*.txt;*.pas;*.js;*.html;*.htm;*.css;*.ini;*.json;*.xml;*.java;*.vbs;*.asp;*.aspx|所有文件|*.*"
};
if (dialog.ShowDialog() == DialogResult.OK)
{
//OpenFile(dialog.FileName,true);
}
}
private Form GetActiveForm()
{
if (dockPanel.DocumentStyle == DocumentStyle.SystemMdi)
return ActiveMdiChild;
else if (dockPanel.ActiveDocument != null)
return (Form)dockPanel.ActiveDocument;
return null;
}
/// <summary>
/// 更新列表中的文件信息
/// </summary>
/// <param name="path"></param>
public void UpdateFileState(string path) {
foreach (IDockContent document in dockPanel.Contents) {
// IMPORANT: dispose all panes.
if (document is FrmFileBrowser_New frm2) {
frm2.UpdateFileInfo(path);
}
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void TsOpen_Click(object sender, EventArgs e)
{
ToolStripMenuItem.PerformClick();
}
private bool msg_show = false;
private Form last_active_doc= null;
private bool ProcUse = false;
private void DockPanel_ActiveContentChanged(object sender, EventArgs e)
{
if (ProcUse) { return; }
var form = GetActiveForm();
if (dockPanel.ActiveContent is FrmFileBrowser_New frm_file)
{
if(frm_file.InitPath.Length>0)
{
frm_file.GotoPath(frm_file.InitPath,frm_file.Init_Selected_Path);
frm_file.InitPath = "";
frm_file.Init_Selected_Path = "";
}
}
if (form != last_active_doc)
{
last_active_doc = form;
}
}
private void FrmMainEditor_FormClosing(object sender, FormClosingEventArgs e)
{
SaveState();
ProcUse = true;
QuickMsg.RyMemoryShare.DelMemory("SmartEditor");
//DragManager.ElevatedDragDrop -= FrmMainEditor_ElevatedDragDrop;
//DragManager.Remove();
}
private void ShowUI(bool changelocation=true)
{
this.WindowState = FormWindowState.Normal;
if (changelocation)
{
this.Top = (Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2;
this.Left = (Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2;
}
bool topmost = this.TopMost;
this.TopMost = true;
RyForm.BringToTop(Handle);
this.TopMost = topmost;
}
private const int WM_COPYDATA = 0x004A;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 17189:
#region
switch (m.WParam.ToInt32())
{
case 100://
if ((int)m.LParam.ToInt32() == 100)
{
ShowUI();
}
break;
}
#endregion
break;
case WM_COPYDATA:
switch (m.WParam.ToInt32())
{
case 1666:
#region
//string str = ryConfig.MsgManager.GetMsg(m);
//if(System.IO.File.Exists(str))
//{
// ShowUI(false);
// OpenFile(str);
//}
#endregion
break;
default:
break;
}
break;
}
base.WndProc(ref m);
}
private int GetSortOrderInt(System.Windows.Forms.SortOrder sortOrder)
{
if(sortOrder== System.Windows.Forms.SortOrder.None) { return 0; }
else if (sortOrder == System.Windows.Forms.SortOrder.Ascending) { return 1; }
else if (sortOrder == System.Windows.Forms.SortOrder.Descending) { return -1; }
return 0;
}
private System.Windows.Forms.SortOrder GetSortOrder(int sortOrder)
{
if (sortOrder ==0) { return System.Windows.Forms.SortOrder.None; }
else if (sortOrder == 1) { return System.Windows.Forms.SortOrder.Ascending; }
else if (sortOrder == -1) { return System.Windows.Forms.SortOrder.Descending; }
return System.Windows.Forms.SortOrder.None;
}
/// <summary>
/// 保存软件状态
/// </summary>
private void SaveState()
{
last_save = DateTime.Now;
JObject jo = new JObject();
var opens = Application.OpenForms;
JArray jarr_workarea = new JArray();
JArray jarr_editor = new JArray();
JArray jarr_ftp = new JArray();
for (int i = 0; i < opens.Count; i++)
{
if (opens[i] is FrmFileBrowser_New frm_file) {
var selected_item = (MyFileSystemInfo)frm_file.olvFiles.SelectedObject;
var jo_item = new JObject
{
{ "mode", "file" },
{ "text", frm_file.Text },
{ "folder", frm_file.CurFolderPath },
{ "selected_path", selected_item == null ? "" : selected_item.FullName },
{ "visible", frm_file.Visible },
{ "SplitterDistance", frm_file.splitContainer1.SplitterDistance },
};
if (frm_file.olvFiles.PrimarySortColumn != null)
{
jo_item.Add("PrimarySortColumn", frm_file.olvFiles.PrimarySortColumn.AspectName);
jo_item.Add("PrimarySortOrder", GetSortOrderInt(frm_file.olvFiles.PrimarySortOrder));
}
if (frm_file.olvFiles.SecondarySortColumn != null)
{
jo_item.Add("SecondarySortColumn", frm_file.olvFiles.SecondarySortColumn.AspectName);
jo_item.Add("SecondarySortOrder", GetSortOrderInt(frm_file.olvFiles.SecondarySortOrder));
}
for (int c = 0; c < frm_file.olvFiles.AllColumns.Count; c++) {
var column = frm_file.olvFiles.AllColumns[c];
jo_item.Add(column.AspectName + "_width", column.Width);
jo_item.Add(column.AspectName + "_visible", column.IsVisible ? 1 : 0);
}
jarr_workarea.Add(jo_item);
}
}
jo.Add("workarea",jarr_workarea);
jo.Add("editor_area", jarr_editor);
jo.Add("ftp_area", jarr_ftp);
jo.Add("DockRightPortion", this.dockPanel.DockRightPortion);
jo.Add("DockLeftPortion", this.dockPanel.DockLeftPortion);
if (this.WindowState == FormWindowState.Normal)
{
jo.Add("width", this.Width);
jo.Add("height", this.Height);
jo.Add("top", this.Top);
jo.Add("left", this.Left);
}
else
{
jo.Add("width", this.RestoreBounds.Width);
jo.Add("height", this.RestoreBounds.Height);
jo.Add("top", this.RestoreBounds.Top);
jo.Add("left", this.RestoreBounds.Left);
}
jo.Add("topmost", this.TopMost);
Itrycn_Db.SetSetting("EditorState",jo.ToString());
}
string EditorState = "";
/// <summary>
/// 加载软件状态
/// </summary>
private int LoadState(bool OnlySetUISize=false)
{
try
{
if (EditorState.Length == 0)
{
EditorState = Itrycn_Db.GetSetting("EditorState", "");
}
if (EditorState.Length == 0) { return 0; }
JObject jo = EditorState.Length == 0 ? new JObject() : JObject.Parse(EditorState);
if (OnlySetUISize)
{
var width = jo["width"].ToInt();
var height = jo["height"].ToInt();
var top = jo["top"].ToInt();
var left = jo["left"].ToInt();
if (width <= 100) { width = 800; }
if (height < 100) { height = 500; }
var screen = Screen.FromPoint(MousePosition);
if (top < screen.WorkingArea.Top || top > screen.WorkingArea.Bottom)
{
top = screen.WorkingArea.Top + (screen.WorkingArea.Height - height) / 2;
}
if (left < screen.WorkingArea.Left || left > screen.WorkingArea.Right)
{
left = screen.WorkingArea.Left + (screen.WorkingArea.Width - width) / 2;
}
this.Location = new Point(left, top);
this.Size = new Size(width, height);
this.TopMost = jo["topmost"].ToBool();
}
if (!OnlySetUISize)
{
ToolStripMenuItem.Checked = this.TopMost;
menuStrip1.Refresh();
toolStrip1.Refresh();
statusStrip1.Refresh();
//dockPanel.SuspendLayout();
this.SuspendLayout();
dockPanel.DockLeftPortion = jo["DockLeftPortion"].ToDouble(250);
dockPanel.DockRightPortion = jo["DockRightPortion"].ToDouble(300);
ProcUse = true;
if (jo["workarea"] != null)
{
JArray jarr_workarea = JArray.Parse(jo["workarea"].ToString());
Form def_form = null;
for (int i = 0; i < jarr_workarea.Count; i++)
{
var item = jarr_workarea[i];
var mode = item.GetJsonValue("mode", "");
if (mode == "file")
{
FrmFileBrowser_New frm = new FrmFileBrowser_New
{
Text = item["text"].ToString()
};
var PrimarySortColumn = item.GetJsonValue("PrimarySortColumn","");
var SecondarySortColumn = item.GetJsonValue("SecondarySortColumn", "");
for (int c = 0; c < frm.olvFiles.AllColumns.Count; c++)
{
var column = frm.olvFiles.AllColumns[c];
column.Width = item[column.AspectName + "_width"].ToInt(column.Width);
column.IsVisible = item[column.AspectName + "_visible"].ToInt(1) == 1;
if (column.AspectName == PrimarySortColumn)
{
frm.olvFiles.PrimarySortColumn = column;
frm.olvFiles.PrimarySortOrder = GetSortOrder(item["PrimarySortOrder"].ToInt());
}
else if (column.AspectName == SecondarySortColumn)
{
frm.olvFiles.SecondarySortColumn = column;
frm.olvFiles.SecondarySortOrder = GetSortOrder(item["SecondarySortOrder"].ToInt());
}
}
frm.olvFiles.RebuildColumns();
frm.Show(dockPanel, DockState.DockLeft);
frm.splitContainer1.SplitterDistance = item.GetJsonValue("SplitterDistance", "280").ToInt(22, 4000, 280);
frm.InitPath = item.GetJsonValue("folder", "");
frm.Init_Selected_Path = item.GetJsonValue("selected_path", "");
frm.CurFolderPath = item.GetJsonValue("folder", "");
//frm.GotoPath(item.GetValue("folder", ""), item.GetValue("selected_path", ""));
if (item["visible"].ToBool()) { def_form = frm; }
}
}
if (def_form != null)
{
var file_frm = (DockContent)def_form;
file_frm.Show(dockPanel, DockState.DockLeft);
if (file_frm is FrmFileBrowser_New frm1)
{
frm1.GotoPath(frm1.InitPath, frm1.Init_Selected_Path);
frm1.InitPath = "";
frm1.Init_Selected_Path = "";
}
}
}
ProcUse = false;
//dockPanel.ResumeLayout(true);
this.ResumeLayout(true);
}
return 1;
}
catch (Exception ex)
{
dockPanel.ResumeLayout(true);
this.ResumeLayout(true);
MessageBox.Show(ex.Message, "状态加载失败", MessageBoxButtons.OK, MessageBoxIcon.Information);
return 0;
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
ToolStripMenuItem.Checked = !ToolStripMenuItem.Checked;
this.TopMost = ToolStripMenuItem.Checked;
}
private DateTime last_save = DateTime.Now.AddSeconds(-50);
private void FrmMainEditor_Deactivate(object sender, EventArgs e)
{
if (last_save <= DateTime.Now.AddMinutes(-1))
{
SaveState();
}
}
private void ToolStripMenuItem_Click(object sender, EventArgs e) {
var index = 0;
var opens = Application.OpenForms;
for (int i = 0; i < opens.Count; i++) {
if (opens[i] is FrmFileBrowser_New) {
index++;
}
}
FrmFileBrowser_New frm = new FrmFileBrowser_New {
Text = "文件浏览" + (index == 0 ? "" : index.ToString())
};
frm.Show(dockPanel, DockState.DockLeft);
}
public string ConvertJsonString(string str)
{
//格式化json字符串
try
{
JsonSerializer serializer = new JsonSerializer();
TextReader tr = new StringReader(str);
JsonTextReader jtr = new JsonTextReader(tr);
object obj = serializer.Deserialize(jtr);
if (obj != null)
{
StringWriter textWriter = new StringWriter();
JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
{
Formatting = Formatting.Indented,
Indentation = 4,
IndentChar = ' '
};
serializer.Serialize(jsonWriter, obj);
return textWriter.ToString();
}
else
{
return str;
}
}
catch { return str; }
}
private string ReplaceRegex(string input,string from,string to)
{
Regex regex = new Regex(from);
return regex.Replace(input, to);
}
private void FrmMainEditor_Shown(object sender, EventArgs e)
{
PnlLoad.Dock = DockStyle.Fill;
PnlLoad.Parent = this;
PnlLoad.Visible = true;
PnlLoad.BringToFront();
label1.BringToFront();
Application.DoEvents();
Text = "文本智能编辑器V" + RySoft.VersionStr;
QuickMsg.RyMemoryShare.WriteToMemory(this.Handle.ToInt64(), "SmartEditor");
if (LoadState() == 0)
{
}
PnlLoad.Visible = false;
}
private void FrmMainEditor_Load(object sender, EventArgs e)
{
LoadState(true);
}
}
}