using BrightIdeasSoftware; using ObjectListViewDemo; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ryCommon; using System.Collections; using System.Drawing.Drawing2D; using WeifenLuo.WinFormsUI.Docking; using 开发辅助工具.Tools.SmartEditor; using 开发辅助工具.Manager; using Newtonsoft.Json.Linq; using ryCommonDb; using 开发辅助工具.Manager.FTP; using RySmartEditor.Controls; using System.CodeDom; namespace SuperDesign.Tools.SmartEditor { public partial class FrmFileBrowser : DockContent { public FrmFileBrowser() { InitializeComponent(); SetupColumns(); SetupTree(); TreeListView.TreeRenderer renderer = this.treeListView.TreeColumnRenderer; renderer.LinePen = new Pen(Color.Firebrick, 0.5f) { DashStyle = DashStyle.Dot }; } private void Drag_ElevatedDragDrop(object sender, ElevatedDragDropArgs e) { if (e.Files.Count == 1) { if (System.IO.Directory.Exists(e.Files[0])) { Add(e.Files[0]); } } } private void SetupColumns() { // The column setup here is identical to the File Explorer example tab -- // nothing specific to the TreeListView. // The only difference is that we don't setup anything to do with grouping, // since TreeListViews can't show groups. SysImageListHelper helper = new SysImageListHelper(this.treeListView); this.olvColumnName.ImageGetter = delegate (object x) { return helper.GetImageIndex(((MyFileSystemInfo)x).FullName); }; // Get the size of the file system entity. // Folders and errors are represented as negative numbers this.olvColumnSize.AspectGetter = delegate (object x) { MyFileSystemInfo myFileSystemInfo = (MyFileSystemInfo)x; if (myFileSystemInfo.IsDirectory) return (long)-1; try { return myFileSystemInfo.Length; } catch (System.IO.FileNotFoundException) { // Mono 1.2.6 throws this for hidden files return (long)-2; } }; // Show the size of files as GB, MB and KBs. By returning the actual // size in the AspectGetter, and doing the conversion in the // AspectToStringConverter, sorting on this column will work off the // actual sizes, rather than the formatted string. this.olvColumnSize.AspectToStringConverter = delegate (object rowdata, object x) { long sizeInBytes = (long)x; if (sizeInBytes < 0) // folder or error return ""; return RyFiles.GetFileSizeStr(sizeInBytes); }; // Show the system description for this object this.olvColumnFileType.AspectGetter = delegate (object x) { return ShellUtilities.GetFileType(((MyFileSystemInfo)x).FullName); }; } private void SetupTree() { // TreeListView require two delegates: // 1. CanExpandGetter - Can a particular model be expanded? // 2. ChildrenGetter - Once the CanExpandGetter returns true, ChildrenGetter should return the list of children // CanExpandGetter is called very often! It must be very fast. this.treeListView.CanExpandGetter = delegate (object x) { return ((MyFileSystemInfo)x).IsDirectory; }; // We just want to get the children of the given directory. // This becomes a little complicated when we can't (for whatever reason). We need to report the error // to the user, but we can't just call MessageBox.Show() directly, since that would stall the UI thread // leaving the tree in a potentially undefined state (not good). We also don't want to keep trying to // get the contents of the given directory if the tree is refreshed. To get around the first problem, // we immediately return an empty list of children and use BeginInvoke to show the MessageBox at the // earliest opportunity. We get around the second problem by collapsing the branch again, so it's children // will not be fetched when the tree is refreshed. The user could still explicitly unroll it again -- // that's their problem :) this.treeListView.ChildrenGetter = delegate (object x) { try { return ((MyFileSystemInfo)x).GetFileSystemInfos(); } catch (UnauthorizedAccessException ex) { this.BeginInvoke((MethodInvoker)delegate () { this.treeListView.Collapse(x); MessageBox.Show(this, ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }); return new ArrayList(); } }; // Once those two delegates are in place, the TreeListView starts working // after setting the Roots property. var WorkArea = Itrycn_Db.GetSetting("WorkArea", ""); JArray jarr = WorkArea.Length == 0 ? new JArray() : JArray.Parse(WorkArea); for (int i = 0; i < jarr.Count; i++) { var item = jarr[i]; roots.Add(new MyFileSystemInfo(new DirectoryInfo(item["path"].ToString()), item["name"].ToString())); } this.treeListView.Roots = roots; } readonly List roots = new List(); private void TreeListView_ItemActivate(object sender, EventArgs e) { Object model = this.treeListView.SelectedObject; if (model != null) this.treeListView.ToggleExpansion(model); } private void TreeListView_MouseDoubleClick(object sender, MouseEventArgs e) { MyFileSystemInfo model = (MyFileSystemInfo)this.treeListView.SelectedObject; if (model != null) { if (model.IsDirectory) { return; } if (model.Length >= 1024*1024 * 20) { MessageBox.Show("不支持打开超过20M的文本。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } FrmMainEditor.MainEditor.OpenFile(model.FullName); } } public void Add(string path) { var dir_path = path; var WorkArea = Itrycn_Db.GetSetting("WorkArea", ""); JArray jarr = WorkArea.Length == 0 ? new JArray() : JArray.Parse(WorkArea); for (int i = jarr.Count - 1; i >= 0; i--) { var item = jarr[i]; if (item["path"].ToString().ToLower() == dir_path.ToLower()) { MessageBox.Show("当前文件夹已存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } JObject jo = new JObject { { "name", System.IO.Path.GetFileName(dir_path) }, { "path", dir_path } }; jarr.Add(jo); Itrycn_Db.SetSetting("WorkArea", jarr.ToString()); roots.Add(new MyFileSystemInfo(new DirectoryInfo(dir_path), System.IO.Path.GetFileName(dir_path))); this.treeListView.Roots = roots; } private void 添加工作区ToolStripMenuItem_Click(object sender, EventArgs e) { if(folderBrowserDialog1.ShowDialog()== DialogResult.OK) { var dir_path = folderBrowserDialog1.SelectedPath; Add(dir_path); } } private void 移除工作区ToolStripMenuItem_Click(object sender, EventArgs e) { MyFileSystemInfo model = (MyFileSystemInfo)this.treeListView.SelectedObject; if (model == null) { return; } if (treeListView.GetParent(model)==null) { switch (MessageBox.Show("是否要删除工作区?", "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)) { case DialogResult.No: return; } var WorkArea = Itrycn_Db.GetSetting("WorkArea", ""); JArray jarr = WorkArea.Length == 0 ? new JArray() : JArray.Parse(WorkArea); for (int i = jarr.Count-1; i>=0; i--) { var item = jarr[i]; if (item["path"].ToString().ToLower()== model.FullName.ToLower()) { jarr.Remove(item); } } roots.Remove(model); Itrycn_Db.SetSetting("WorkArea", jarr.ToString()); treeListView.RemoveObject(model); } } private void ContextMenuStrip1_Opening(object sender, CancelEventArgs e) { MyFileSystemInfo model = (MyFileSystemInfo)this.treeListView.SelectedObject; if (model == null) { 重命名ToolStripMenuItem.Enabled = false; 移除工作区ToolStripMenuItem.Enabled = false;return; } if (treeListView.GetParent(model) != null) { 重命名ToolStripMenuItem.Text="重命名文件名"; 移除工作区ToolStripMenuItem.Enabled = false; return; } 重命名ToolStripMenuItem.Text = "重命名工作区"; 移除工作区ToolStripMenuItem.Enabled = true; } private void 重命名ToolStripMenuItem_Click(object sender, EventArgs e) { MyFileSystemInfo model = (MyFileSystemInfo)this.treeListView.SelectedObject; if (model == null) { return; } if (treeListView.GetParent(model) == null) { FrmTitle frm = new FrmTitle(); frm.TxtTitle.Text = model.Name; frm.Text = "请输入重命名的名称"; if (frm.ShowDialog() == DialogResult.OK) { var WorkArea = Itrycn_Db.GetSetting("WorkArea", ""); JArray jarr = WorkArea.Length == 0 ? new JArray() : JArray.Parse(WorkArea); for (int i = jarr.Count - 1; i >= 0; i--) { var item = jarr[i]; if (item["path"].ToString().ToLower() == model.FullName.ToLower()) { item["name"] = frm.TxtTitle.Text; model.Name = frm.TxtTitle.Text; } } Itrycn_Db.SetSetting("WorkArea", jarr.ToString()); treeListView.UpdateObject(model); } frm.Dispose(); } else { FrmTitle frm = new FrmTitle(); frm.TxtTitle.Text = model.Name; frm.Text = "请输入重命名的名称"; frm.TxtTitle.Text = model.Name; if (frm.ShowDialog() == DialogResult.OK) { //int num = arrayList2.IndexOf(model); var new_fullname = System.IO.Path.GetDirectoryName(model.FullName) + "\\" + RyFiles.ConvertToValidFileName(frm.TxtTitle.Text); if (RyFiles.MoveFile(model.FullName, new_fullname) == 0) { //treeListView.RemoveObject(model); model.ReLoad(new_fullname); model.Name = model.Name; treeListView.RefreshObject(model); } else { MessageBox.Show("重命名失败", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } frm.Dispose(); } } private void FrmFileBrowser_Load(object sender, EventArgs e) { treeListView.IsSimpleDragSource = true; } private void FrmFileBrowser_FormClosing(object sender, FormClosingEventArgs e) { //drag.ElevatedDragDrop -= Drag_ElevatedDragDrop; } private void TreeListView_Dropped(object sender, OlvDropEventArgs e) { } private void TreeListView_DragDrop(object sender, DragEventArgs e) { string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false); if(s!=null && s.Length==1) { Add(s[0]); } } private void TreeListView_DragOver(object sender, DragEventArgs e) { } private void TreeListView_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.All; } else { e.Effect = DragDropEffects.None; } } public void GotoPath(string path) { if (path.Length == 0) { return; } var isexist = false; MyFileSystemInfo find_item = null; for (int i = 0; i < roots.Count; i++) { var root = roots[i]; if(path.IndexOfEx(root.FullName)==0) { treeListView.Expand(root); Find(root); if(isexist) { break; } void Find(MyFileSystemInfo _item) { if (_item.FullName.ToLower() == path.ToLower()) { isexist = true; find_item = _item; return; } var list = treeListView.GetChildren(_item); foreach (var _file in list) { var file = (MyFileSystemInfo)_file; if (file.IsDirectory) { if (path.IndexOfEx(file.FullName) == 0) { treeListView.Expand(file); if (path.Length == file.FullName.Length) { isexist = true; find_item = file; break; } else { Find(file); continue; } } else { continue; } } if (file.FullName.ToLower() == path.ToLower()) { isexist = true; find_item = file; break; } } } } } if (isexist) { treeListView.EnsureModelVisible(find_item); //var aa= treeListView.SelectedObject==find_item; treeListView.Expand(find_item); treeListView.SelectedObject = find_item; //treeListView.Expand(find_item); } } public void UpdateFileInfo(string path) { if (path.Length == 0) { return; } var isexist = false; MyFileSystemInfo find_item = null; for (int i = 0; i < roots.Count; i++) { var root = roots[i]; if (path.IndexOfEx(root.FullName) == 0) { Find(root); if (isexist) { break; } void Find(MyFileSystemInfo _item) { if (_item.FullName.ToLower() == path.ToLower()) { isexist = true; find_item = _item; return; } var list = treeListView.GetChildren(_item); foreach (var _file in list) { var file = (MyFileSystemInfo)_file; if (file.IsDirectory) { if (path.IndexOfEx(file.FullName) == 0) { treeListView.Expand(file); if (path.Length == file.FullName.Length) { isexist = true; find_item = file; break; } else { Find(file); continue; } } else { continue; } } if (file.FullName.ToLower() == path.ToLower()) { isexist = true; find_item = file; break; } } } } } if(find_item!=null) { find_item.ReLoad(); treeListView.UpdateObject(find_item); } //treeListView.get //for (int i = 0; i < list.Count; i++) { // var item = (MyFileSystemInfo)list[i]; // if(item.FullName.ToLower()==path.ToLower()) { // item.info.Refresh(); // treeListView.RefreshObject(item); // } //} } private void 重命名ToolStripMenuItem1_Click(object sender, EventArgs e) { FrmTitle frm = new FrmTitle(); frm.TxtTitle.Text = Text; frm.Text = "请输入重命名的工作区名称"; if (frm.ShowDialog() == DialogResult.OK) { Text = frm.TxtTitle.Text; } frm.Dispose(); } private void 上传文件到FTPToolStripMenuItem_Click(object sender, EventArgs e) { MyFileSystemInfo model = (MyFileSystemInfo)this.treeListView.SelectedObject; if (model != null) { if (System.IO.Directory.Exists(model.FullName)) { MessageBox.Show("暂不支持上传文件夹", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } string FilePath = model.FullName; SiteInfo SiteInfo = new SiteInfo(); UploadInfo uploadinfo = null; IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType); if (db.ConnDb(Itrycn_Db.User_SQLConn) == 1) { DataSet ds = db.ReadData("select * from Site"); if (ds.HaveData()) { for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { DataRow reader = ds.Tables[0].Rows[i]; if (FilePath.IndexOfEx(reader["localPath"].ToString()) < 0) { continue; } #region 读取信息 SiteInfo.Name = reader["name"].ToString(); SiteInfo.LocalPath = reader["localPath"].ToString(); SiteInfo.FtpDir = reader["ftpDir"].ToString(); SiteInfo.FtpId = reader["ftpId"].ToInt(); SiteInfo.Id = reader["Id"].ToInt(); break; #endregion } } ds.Dispose(); ds = db.ReadData("select * from Ftp where Id=" + SiteInfo.FtpId); if (ds.HaveData()) { DataRow row = ds.Tables[0].Rows[0]; var FtpInfo = new GameBackup3H3.DbOp.FTPInfo() { Id = row["id"].ToInt(), Name = row["name"].ToString(), IP = row["ip"].ToString(), Port = row["port"].ToInt(), RemoteDir = SiteInfo.FtpDir, UserName = row["username"].ToString(), Pwd = row["pwd"].ToString(), Encrypt = row["encrypt"].ToInt(0, 2, 0), AddTime = row["AddTime"].ToDateTime() }; uploadinfo = new UploadInfo() { FtpInfo = FtpInfo, RemotePath = SiteInfo.FtpDir.Trim('/') + "/" + FilePath.Replace(SiteInfo.LocalPath, "", true).Trim('\\').Replace("\\", "/"), LocalPath = FilePath }; } ds.Dispose(); } db.Free(); if (SiteInfo.FtpId > 0) { if (uploadinfo == null) { MessageBox.Show("没有找到对应站点信息", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } FrmUploadProg frm = new FrmUploadProg(); frm.UploadList.Add(uploadinfo); if (frm.ShowDialog() == DialogResult.OK) { //MessageBox.Show("上传成功。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("上传失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } frm.Dispose(); } else { MessageBox.Show("没有找到对应FTP信息", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } private void 复制文件名ToolStripMenuItem_Click(object sender, EventArgs e) { MyFileSystemInfo model = (MyFileSystemInfo)this.treeListView.SelectedObject; if (model == null) { return; } RyFiles.CopyToClip(model.Name); } } }