2021-05-07 22:05:11 -04:00

120 lines
3.6 KiB
C#

//
// MyClass.cs
//
// Author:
// Michael Becker <alcexhim@gmail.com>
//
// Copyright (c) 2020 Mike Becker's Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
using MBS.Framework;
using MBS.Framework.UserInterface;
using UniversalEditor.Accessors;
using UniversalEditor.Plugins.AutoSave.Dialogs;
using UniversalEditor.UserInterface;
namespace UniversalEditor.Plugins.AutoSave
{
public class AutoSavePlugin : UserInterfacePlugin
{
private Timer tmr = new Timer();
private AutoSaveDataFormat asdf = new AutoSaveDataFormat();
private string GetAutosavePath()
{
return String.Format("/tmp/autosave/{0}", Application.Instance.ShortName);
}
private void tmr_Tick(object sender, EventArgs e)
{
Console.WriteLine("autosave: looking for dirty documents...");
UIApplication ha = (Application.Instance as UIApplication);
string path = System.IO.Path.Combine(new string[] { GetAutosavePath(), DateTime.Now.ToString("yyyyMMdd") });
Console.WriteLine("autosave: saving dirty documents in /tmp/autosave/universal-editor/...");
for (int i = 0; i < (ha.CurrentWindow as IHostApplicationWindow).Editors.Count; i++)
{
Editor ed = (ha.CurrentWindow as IHostApplicationWindow).Editors[i];
if (ed.Changed || !ed.Document.IsSaved)
{
string filename = System.IO.Path.Combine(new string[] { path, String.Format("{0}{1}.tmp", DateTime.Now.ToString("HHmmss"), i.ToString().PadLeft(2, '0')) });
string dir = System.IO.Path.GetDirectoryName(filename);
if (!System.IO.Directory.Exists(dir))
System.IO.Directory.CreateDirectory(dir);
if (!fas.ContainsKey(ed))
{
fas[ed] = new FileAccessor(filename, true, true);
}
AutoSaveObjectModel autosave = new AutoSaveObjectModel();
autosave.ObjectModel = ed.ObjectModel;
if (ed.Document.IsSaved)
{
autosave.OriginalFileName = ed.Document.Accessor.GetFileName();
}
else
{
autosave.OriginalFileName = null;
}
Document.Save(autosave, asdf, fas[ed]);
i++;
}
}
Console.WriteLine("autosave: going back to sleep");
}
private System.Collections.Generic.Dictionary<Editor, FileAccessor> fas = new System.Collections.Generic.Dictionary<Editor, FileAccessor>();
protected override void InitializeInternal()
{
base.InitializeInternal();
// check to see if we have any dirty documents
Console.WriteLine("autosave: checking for existing dirty documents...");
string path = GetAutosavePath();
if (!System.IO.Directory.Exists(path))
{
return;
}
string[] autosaves = System.IO.Directory.GetFiles(path, "*.tmp", System.IO.SearchOption.AllDirectories);
if (autosaves.Length > 0)
{
AutoSaveDialog dlg = new AutoSaveDialog();
dlg.FileNames.AddRange(autosaves);
if (dlg.ShowDialog() == DialogResult.OK)
{
}
}
tmr.Duration = 10000; // 5 /*minutes*/ * 60 /*seconds in a minute*/ * 1000 /*milliseconds in a second*/;
tmr.Tick += tmr_Tick;
tmr.Enabled = true;
}
}
}