diff --git a/Src/A69WD/.vs/A69WD.csproj.dtbcache.json b/Src/A69WD/.vs/A69WD.csproj.dtbcache.json
index e9b8bfe..5d191b6 100644
--- a/Src/A69WD/.vs/A69WD.csproj.dtbcache.json
+++ b/Src/A69WD/.vs/A69WD.csproj.dtbcache.json
@@ -1 +1 @@
-{"RootPath":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\A69WD","ProjectFileName":"A69WD.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"App.cs"},{"SourceFile":"Data\\cNota.cs"},{"SourceFile":"Data\\cRac.cs"},{"SourceFile":"Data\\DBTools.cs"},{"SourceFile":"Net\\eLinkState.cs"},{"SourceFile":"Net\\cLink_A69.cs"},{"SourceFile":"Service\\Service_Crawler.cs"},{"SourceFile":"Site\\cSite_A69.cs"},{"SourceFile":"UI\\frmDownloader.cs"},{"SourceFile":"UI\\frmDownloader.Designer.cs"},{"SourceFile":"General\\Cfg.cs"},{"SourceFile":"General\\cTools.cs"},{"SourceFile":"General\\Logger.cs"},{"SourceFile":"Net\\iLink.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"Site\\iSiteType.cs"},{"SourceFile":"Properties\\Resources.Designer.cs"},{"SourceFile":"Properties\\Settings.Designer.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.8.AssemblyAttributes.cs"}],"References":[{"Reference":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\_Lib\\HtmlAgilityPack.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\_Lib\\System.Data.SQLite.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Deployment.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Drawing.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Windows.Forms.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\A69WD\\bin\\Debug\\A69WD.exe","OutputItemRelativePath":"A69WD.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
\ No newline at end of file
+{"RootPath":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\A69WD","ProjectFileName":"A69WD.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"App.cs"},{"SourceFile":"Data\\cNota.cs"},{"SourceFile":"Data\\cRac.cs"},{"SourceFile":"Data\\DBTools.cs"},{"SourceFile":"Data\\Helper.cs"},{"SourceFile":"Net\\eLinkState.cs"},{"SourceFile":"Net\\cLink_A69.cs"},{"SourceFile":"Service\\Service_Crawler.cs"},{"SourceFile":"Service\\Service_Importer.cs"},{"SourceFile":"Site\\cSite_A69.cs"},{"SourceFile":"UI\\frmDownloader.cs"},{"SourceFile":"UI\\frmDownloader.Designer.cs"},{"SourceFile":"General\\Cfg.cs"},{"SourceFile":"General\\cTools.cs"},{"SourceFile":"General\\Logger.cs"},{"SourceFile":"Net\\iLink.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"Site\\iSiteType.cs"},{"SourceFile":"Properties\\Resources.Designer.cs"},{"SourceFile":"Properties\\Settings.Designer.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.8.AssemblyAttributes.cs"}],"References":[{"Reference":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\_Lib\\HtmlAgilityPack.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\_Lib\\System.Data.SQLite.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Deployment.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Drawing.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Windows.Forms.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\A69WD\\bin\\Debug\\A69WD.exe","OutputItemRelativePath":"A69WD.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
\ No newline at end of file
diff --git a/Src/A69WD/A69WD.csproj b/Src/A69WD/A69WD.csproj
index 4fa7741..f07d334 100644
--- a/Src/A69WD/A69WD.csproj
+++ b/Src/A69WD/A69WD.csproj
@@ -63,6 +63,7 @@
+
@@ -80,6 +81,12 @@
+
+ Form
+
+
+ frmReader.cs
+
frmDownloader.cs
@@ -93,6 +100,9 @@
Resources.resx
True
+
+ frmReader.cs
+
SettingsSingleFileGenerator
Settings.Designer.cs
diff --git a/Src/A69WD/App.cs b/Src/A69WD/App.cs
index cd10c71..e7c00c5 100644
--- a/Src/A69WD/App.cs
+++ b/Src/A69WD/App.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Windows.Forms;
+using A69WD.UI;
@@ -34,7 +35,8 @@ namespace A69WD {
// Start application:
Logger.Information(" - - - START Application - - - ");
if (DB.DB_ok) {
- Application.Run(new frmDownloader());
+ //Application.Run(new frmDownloader());
+ Application.Run(new frmReader());
Logger.Information(" - - - STOP Application - - - ");
diff --git a/Src/A69WD/Data/DBTools.cs b/Src/A69WD/Data/DBTools.cs
index 1b3e1a4..e73bf57 100644
--- a/Src/A69WD/Data/DBTools.cs
+++ b/Src/A69WD/Data/DBTools.cs
@@ -1725,8 +1725,18 @@ namespace A69WD {
+
+
+
+
+
+
+
+
// Metodi ricavati ottimizzando i miei tramite gemini
+
+
///
/// Ricava il racconto con l'ID indicato leggendolo dal DB
///
@@ -1934,6 +1944,77 @@ namespace A69WD {
+ #region Reader function: GetReport, GetRandomIDrac
+
+
+ private long GetNumRacs(string TagFilter = "") {
+ string query = "SELECT count (IDrac) FROM Racconti";
+ if (TagFilter != "") { query = "SELECT count (Racconti.IDrac) AS NUM FROM Racconti, Links_Rac_Vot, Voti WHERE Racconti.IDrac=Links_Rac_Vot.IDrac AND Links_Rac_Vot.IDvot=Voti.IDvot AND Voti.Voto='" + TagFilter + "'"; }
+ return Helper.ExecuteScalar(cn,query,objLock);
+ }
+
+ private long GetNumOri() { return Helper.CountSimpleRecord(cn, "Links_Rac_Ori", "IDori", objLock); }
+
+ private long GetNumAuts() { return Helper.CountSimpleRecord(cn, "Links_Rac_Aut", "IDaut", objLock); }
+
+ private long GetNumTags() { return Helper.CountSimpleRecord(cn, "Links_Rac_Tag", "IDtag", objLock); }
+
+ private long GetNumVot() { return Helper.CountSimpleRecord(cn, "Links_Rac_Vot", "IDvot", objLock); }
+
+
+ ///
+ /// ritorna il riepilogo del DB:
+ ///
+ /// Stringa con il riepilogo del DB
+ public string Report {
+ get {
+ string report = "A69WD:\r\n\r\n";
+ report += string.Format("L'archivio contiene {0} racconti:\r\n", GetNumRacs().ToString("000"));
+ report += string.Format("> {0} non letti\r\n", GetNumRacs("Non Letto").ToString("000"));
+ report += string.Format("> {0} sorgenti\r\n", GetNumOri().ToString("00"));
+ report += string.Format("> {0} autori\r\n", GetNumAuts().ToString("000"));
+ report += string.Format("> {0} tags\r\n", GetNumTags().ToString("000"));
+ report += string.Format("> {0} voti\r\n", GetNumVot().ToString("000"));
+ return report;
+ }
+ }
+
+
+ ///
+ /// Metodo per trovare un identificativo di un racconto scelto casualmente fra quelli che soddisfano il filtro indicato.
+ ///
+ /// Eventuale query per filtrare i racconti selezionabili
+ /// Identificativo del racconto scelto casualmente
+ public long GetRandomIDrac(string queryFilter = "") {
+ //long ID = -3;
+ //SQLiteDataReader rdr = null;
+ //lock (objLock) {
+ //try {
+ //// Preparo i comandi SQL da usare:
+ //string query = "SELECT Links_Rac_Vot.IDrac AS IDrac FROM Links_Rac_Vot, Voti WHERE Voti.Voto='Non Letto' AND Links_Rac_Vot.IDVot=Voti.IDvot ORDER BY RANDOM() LIMIT 1";
+ //if (!string.IsNullOrEmpty(queryFilter)) query = string.Format("SELECT Links_Rac_Vot.IDrac AS IDrac FROM Links_Rac_Vot, Voti WHERE Links_Rac_Vot.IDVot=Voti.IDvot AND {0} ORDER BY RANDOM() LIMIT 1", queryFilter);
+ //SQLiteCommand cmd = new SQLiteCommand(query, cn);
+ //rdr = cmd.ExecuteReader();
+ //while (rdr.Read()) { ID = (long)rdr["IDrac"]; }
+ //rdr.Close();
+ //rdr = null;
+ //} catch (Exception ex) {
+ //Logger.Error(string.Format("Error Code: {0} - Errore in {1}.{2}: {3}", "ER00070", System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.FullName, System.Reflection.MethodInfo.GetCurrentMethod().Name, ex.Message));
+ //ID = -2;
+ //}
+ //}
+ //return ID;
+ string query = "SELECT Links_Rac_Vot.IDrac AS IDrac FROM Links_Rac_Vot, Voti WHERE Voti.Voto='Non Letto' AND Links_Rac_Vot.IDVot=Voti.IDvot ORDER BY RANDOM() LIMIT 1";
+ if (!string.IsNullOrEmpty(queryFilter)) query = string.Format("SELECT Links_Rac_Vot.IDrac AS IDrac FROM Links_Rac_Vot, Voti WHERE Links_Rac_Vot.IDVot=Voti.IDvot AND {0} ORDER BY RANDOM() LIMIT 1", queryFilter);
+ return Helper.ExecuteScalar(cn, query, objLock);
+ }
+
+ public int UpdateVoto(long IDrac, string NewVoto) {
+ Logger.Warning("Funzione 'UpdateVoto(IDrac, NewVoto) ancora da fare.");
+ return -1;
+ }
+
+ #endregion
} //class DBTools
diff --git a/Src/A69WD/Data/Helper.cs b/Src/A69WD/Data/Helper.cs
index 78c9ff1..c213c24 100644
--- a/Src/A69WD/Data/Helper.cs
+++ b/Src/A69WD/Data/Helper.cs
@@ -70,6 +70,61 @@ namespace A69WD.Data {
+
+ ///
+ /// Esegue una query che ritorna un scalare
+ ///
+ /// Query da eseguire sul DB
+ /// Scalare ritornato dalla query
+ public static long ExecuteScalar(SQLiteConnection conn, string query, object objLock) {
+ lock (objLock) {
+ try {
+ // Eseguo il comando
+ System.Data.SQLite.SQLiteCommand cm = new SQLiteCommand(query, conn);
+ long res = (long)cm.ExecuteScalar(System.Data.CommandBehavior.SingleResult);
+ return res;
+ } catch (Exception ex) {
+ if (ex.Message == "Object reference not set to an instance of an object.") {
+ // nessun record trovato che soddisfi la query
+ return 0;
+ } else {
+ Logger.Error(string.Format("Error Code: {0} - Errore in {1}.{2}: {3}", "ER00100", System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.FullName, System.Reflection.MethodInfo.GetCurrentMethod().Name, ex.Message));
+ return -1;
+ }
+ }
+ }
+ } // ExecuteScalar
+
+
+ ///
+ /// Conteggia il numero di record nella colonna indicata contenuti nella tabella indicata.
+ ///
+ /// Connessione al DB
+ /// Nome della tabella in cui fare la query
+ /// Nome del campo da contare
+ /// Oggetto per il lock fra i thread
+ /// Il numero di record trovati, oppure un codice negativo in caso di errore.
+ public static long CountSimpleRecord(SQLiteConnection conn, string tableName, string columName, object objLock) {
+ // Ricreo la query:
+ string query = $"SELECT count(Distinct {tableName}.{columName}) AS NUM FROM {tableName}";
+ lock (objLock) {
+ try {
+ // Eseguo il comando
+ System.Data.SQLite.SQLiteCommand cm = new SQLiteCommand(query, conn);
+ long res = (long)cm.ExecuteScalar(System.Data.CommandBehavior.SingleResult);
+ return res;
+ } catch (Exception ex) {
+ if (ex.Message == "Object reference not set to an instance of an object.") {
+ // nessun record trovato che soddisfi la query
+ return 0;
+ } else {
+ Logger.Error(string.Format("Error Code: {0} - Errore in {1}.{2}: {3}", "ER00100", System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.FullName, System.Reflection.MethodInfo.GetCurrentMethod().Name, ex.Message));
+ return -1;
+ }
+ }
+ }
+ }//CountSimpleRecord
+
}//class Helper
public enum SaveResult {
diff --git a/Src/A69WD/General/Navigator.cs b/Src/A69WD/General/Navigator.cs
new file mode 100644
index 0000000..186057c
--- /dev/null
+++ b/Src/A69WD/General/Navigator.cs
@@ -0,0 +1,180 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace A69WD {
+
+ public class Navigator {
+
+
+ #region Fields: buffer, indice, DB
+
+ ///
+ /// Array interno che mi memorizza gli ID degli ultimi racconti visualizzati
+ ///
+ private long[] buffer = null;
+
+ ///
+ /// Indice del racconto attualmente visualizzato
+ ///
+ private long indice = 0;
+
+ ///
+ /// Interfaccia con il database
+ ///
+ private DBTools DB = null;
+
+ #endregion
+
+
+ #region Costrutore
+
+ ///
+ /// Costruttore
+ ///
+ /// Dimensione del buffer, cioè numero di racconti di cui tener memoria
+ public Navigator(int size) {
+ buffer = new long[size];
+ for (int i = 0; i < size; i++) { buffer[i] = -1; }
+ DB = App.DB;
+ }
+
+ #endregion
+
+
+ #region Metodi di navigazione:
+
+ ///
+ /// Ritorna l'ID del racconto attualmente visualizzato
+ /// 0 indica la pagina home con il riepilogo del ATDB
+ ///
+ public long ActualID { get { return buffer[indice]; } }
+
+ ///
+ /// Ritorna il riepilogo dell'archivio
+ ///
+ public string Home { get { return DB.Report; } }
+
+ ///
+ /// Ritorna il testo del racconto successivo a quello visualizzato attualmente, nel buffer di navigazione
+ ///
+ public string Forward {
+ get {
+ // Aggiorno indice attuale:
+ long tmp = indice + 1;
+ if (tmp >= buffer.Length) tmp = 0;
+ if (buffer[tmp] != -1) indice = tmp;
+
+ // Ritorno il testo del racconto:
+ return DB.GetRacById(buffer[indice]).ToString();
+ }
+ }
+
+ ///
+ /// Ritorna il testo del racconto precedente a quello visualizzato attualmente, nel buffer di navigazione
+ ///
+ public string Backward {
+ get {
+ // Aggiorno indice attuale:
+ long tmp = indice - 1;
+ if (tmp < 0) tmp = buffer.Length - 1;
+ if (buffer[tmp] != -1) indice = tmp;
+
+ // Ritorno il testo del racconto:
+ return DB.GetRacById(buffer[indice]).ToString();
+ }
+ }
+
+ ///
+ /// Ritorna il testo del racconto con ID successivo a quello visualizzato attualmente
+ ///
+ public string Next {
+ get {
+ // Aggiorno indice attuale:
+ long newID = buffer[indice];
+ if (newID > 0) {
+ newID++;
+ return SwitchTo(newID);
+ } else {
+ return Refresh;
+ }
+ }
+ }
+
+ ///
+ /// Ritorna il testo del racconto con ID precedente a quello visualizzato attualmente
+ ///
+ public string Previous {
+ get {
+ // Aggiorno indice attuale:
+ long newID = buffer[indice];
+ if (newID > 1) {
+ newID--;
+ return SwitchTo(newID);
+ } else {
+ return Refresh;
+ }
+ }
+ }
+
+ ///
+ /// Ricarica il testo del racconto attuale
+ ///
+ public string Refresh {
+ get {
+ if (buffer[indice] > 0) {
+ return DB.GetRacById(buffer[indice]).ToString();
+ } else { return Home; }
+ }
+ }
+
+ ///
+ /// Ritorna il testo di un racconto scelto casualmente nel DB
+ ///
+ public string RandomRac {
+ get {
+ // Aggiorno indice attuale:
+ indice++;
+ if (indice >= buffer.Length) indice = 0;
+ buffer[indice] = DB.GetRandomIDrac();
+
+ // Ritorno il testo del racconto:
+ return DB.GetRacById(buffer[indice]).ToString();
+ }
+ }
+
+ ///
+ /// Ritorna l'ID del nuovo racconto prendendo quello indicato
+ ///
+ /// ID del racconto da visualizzare
+ ///
+ public string SwitchTo(long NewIdRac) {
+ // Aggiorno indice attuale:
+ indice++;
+ if (indice >= buffer.Length) indice = 0;
+ buffer[indice] = NewIdRac;
+
+ // Ritorno il testo del racconto:
+ return DB.GetRacById(buffer[indice]).ToString();
+ }
+
+ ///
+ /// Ricarica il testo del racconto attuale
+ ///
+ public string UpdateVoto(string newVoto) {
+ long id = buffer[indice];
+ if (id > 0) {
+ DB.UpdateVoto(id, newVoto);
+ return DB.GetRacById(id).ToString();
+ } else { return Home; }
+ }
+
+
+ #endregion
+
+
+
+ }//class Navigator
+}//namespace A69WD
diff --git a/Src/A69WD/UI/frmReader.Designer.cs b/Src/A69WD/UI/frmReader.Designer.cs
new file mode 100644
index 0000000..7727cfd
--- /dev/null
+++ b/Src/A69WD/UI/frmReader.Designer.cs
@@ -0,0 +1,116 @@
+namespace A69WD.UI {
+ partial class frmReader {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ this.rtb = new System.Windows.Forms.RichTextBox();
+ this.sb = new System.Windows.Forms.StatusStrip();
+ this.sbMessage = new System.Windows.Forms.ToolStripStatusLabel();
+ this.sbProgressBar = new System.Windows.Forms.ToolStripProgressBar();
+ this.sbStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
+ this.sb.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // rtb
+ //
+ this.rtb.BackColor = System.Drawing.Color.White;
+ this.rtb.BorderStyle = System.Windows.Forms.BorderStyle.None;
+ this.rtb.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.rtb.Font = new System.Drawing.Font("Verdana", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.rtb.Location = new System.Drawing.Point(0, 0);
+ this.rtb.Name = "rtb";
+ this.rtb.Size = new System.Drawing.Size(700, 420);
+ this.rtb.TabIndex = 3;
+ this.rtb.Text = "";
+ this.rtb.KeyDown += new System.Windows.Forms.KeyEventHandler(this.KeyDownAnalisi);
+ //
+ // sb
+ //
+ this.sb.AutoSize = false;
+ this.sb.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.sbMessage,
+ this.sbProgressBar,
+ this.sbStatusLabel});
+ this.sb.Location = new System.Drawing.Point(0, 420);
+ this.sb.Name = "sb";
+ this.sb.Size = new System.Drawing.Size(700, 24);
+ this.sb.TabIndex = 2;
+ this.sb.Text = "statusStrip1";
+ //
+ // sbMessage
+ //
+ this.sbMessage.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top)
+ | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right)
+ | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom)));
+ this.sbMessage.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner;
+ this.sbMessage.Name = "sbMessage";
+ this.sbMessage.Size = new System.Drawing.Size(472, 19);
+ this.sbMessage.Spring = true;
+ this.sbMessage.Text = "Messaggi";
+ this.sbMessage.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.sbMessage.ToolTipText = "Messaggio";
+ //
+ // sbProgressBar
+ //
+ this.sbProgressBar.Name = "sbProgressBar";
+ this.sbProgressBar.Size = new System.Drawing.Size(60, 18);
+ this.sbProgressBar.ToolTipText = "Percentuale di lavoro";
+ //
+ // sbStatusLabel
+ //
+ this.sbStatusLabel.AutoSize = false;
+ this.sbStatusLabel.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top)
+ | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right)
+ | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom)));
+ this.sbStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner;
+ this.sbStatusLabel.Name = "sbStatusLabel";
+ this.sbStatusLabel.Size = new System.Drawing.Size(120, 19);
+ this.sbStatusLabel.ToolTipText = "Stato di eventuali operazioni in background";
+ //
+ // frmReader
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(700, 444);
+ this.ControlBox = false;
+ this.Controls.Add(this.rtb);
+ this.Controls.Add(this.sb);
+ this.Name = "frmReader";
+ this.Text = "PlugIn_App_Reader.UI Reader (DB vrs1.3, App" +
+ " vrsX.X.X.X)";
+ this.sb.ResumeLayout(false);
+ this.sb.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.RichTextBox rtb;
+ private System.Windows.Forms.StatusStrip sb;
+ private System.Windows.Forms.ToolStripStatusLabel sbMessage;
+ private System.Windows.Forms.ToolStripProgressBar sbProgressBar;
+ private System.Windows.Forms.ToolStripStatusLabel sbStatusLabel;
+
+ }
+}
\ No newline at end of file
diff --git a/Src/A69WD/UI/frmReader.cs b/Src/A69WD/UI/frmReader.cs
new file mode 100644
index 0000000..b354307
--- /dev/null
+++ b/Src/A69WD/UI/frmReader.cs
@@ -0,0 +1,631 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using A69WD.Data;
+
+namespace A69WD.UI {
+ public partial class frmReader : Form {
+
+
+ public frmReader() {
+ InitializeComponent();
+
+ // Imposto caption:
+ this.Text = String.Format("A69WD - Reader Vrs {0}", cTools.AssemblyVersion);
+
+ // Imposto field interni:
+ nav = new Navigator(25);
+
+ // Visualizzo la pagina iniziale di riepilogo dell'archivio
+ rtb.Text = nav.Home;
+
+ // Aggiorno la status bar
+ sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ }
+
+ ///
+ /// Gestione della navigazione fra i racconti
+ ///
+ private Navigator nav = null;
+
+
+ private void KeyDownAnalisi(object sender, KeyEventArgs e) {
+
+ #region Keys.F1 --> Show Help
+ //if (e.KeyCode == Keys.F1) {
+ // sbMessage.Text = "Show Help";
+ // MessageBox.Show(this, Help(), "Help", MessageBoxButtons.OK);
+ // return;
+ //}
+ #endregion
+
+ #region Keys.ESC --> Hide Reader
+ if (e.KeyCode == Keys.Escape) {
+ this.Hide();
+ return;
+ }
+ #endregion
+
+ #region Keys.F2 --> Show Rac by ID
+ //if (e.KeyCode == Keys.F2) {
+ // // Form per richiedere l'ID di un racconto specifico da visualizzare:
+ // frmRqId frmi = new frmRqId();
+ // frmi.Left = Left + (Width - frmi.Width) / 2;
+ // frmi.Top = Top + (Height - frmi.Height) / 2;
+ // // Visualizzo il racconto richiesto:
+ // if (frmi.ShowDialog() == DialogResult.OK) {
+ // rtb.Text = nav.SwitchTo(frmi.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // frmi.Close();
+ // return;
+ //}
+ #endregion
+
+ #region Keys.F3 --> Show Rac random
+ if (e.KeyCode == Keys.F3) {
+ // Show New Random Rac
+ rtb.Text = nav.RandomRac;
+ sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ return;
+ }
+ #endregion
+
+ #region Keys.F4 --> Genera un racconto nuovo
+ if (e.KeyCode == Keys.F4) {
+ // Genera un racconto nuovo
+ StringBuilder sb = new StringBuilder();
+ sb.AppendLine("- ID Rac: 0");
+ sb.AppendLine("- Title: Titolo del nuovo racconto");
+ sb.AppendLine("- SubTit: ");
+ sb.AppendLine("- Autors: Mrk");
+ sb.AppendLine("- Voto: Non Letto");
+ sb.AppendLine("- Tags: Uncategorized");
+ sb.AppendLine("- Notes: SrcFile -|- Generated Internally");
+ sb.AppendLine(string.Format("- Creato: {0}", DateTime.Now.ToString("yyyy/MM/dd")));
+ sb.AppendLine(string.Format("- Update: {0}", DateTime.Now.ToString("yyyy/MM/dd")));
+ sb.AppendLine("- Origin: Mrk");
+ sb.AppendLine("- Trama: Trama del nuovo racconto");
+ rtb.Text = sb.ToString();
+ System.Windows.Forms.Clipboard.SetText(sb.ToString());
+ sbMessage.Text = string.Format("Generato un racconto nuovo, salvarlo con F8");
+ return;
+ }
+ #endregion
+
+ #region Keys.F5 --> Refresh Rac
+ if (e.KeyCode == Keys.F5) {
+ rtb.Text = nav.Refresh;
+ sbMessage.Text = string.Format("Racconto {0} Refresh", nav.ActualID.ToString("00000"));
+ return;
+ }
+ #endregion
+
+ #region Keys.F8 --> Edit Rac
+ if (e.KeyCode == Keys.F8) {
+ // Edit Rac
+ // Rileggo il testo che visualizzo (e che ho eventualmente editato) per recuperare i testi in esso e li salvo
+ // Se ID=0 o non specificato, aggiungo il testo come nuovo, altrimenti faccio l'update del racconto.
+ cRac[] racs = null;
+ int res = cRac.Read(rtb.Text, out racs);
+ if (res > 0) {
+ rtb.Text = string.Format("Trovati {0} racconti:\r\n", racs.Length);
+ res = 0;
+ foreach (cRac rac in racs) {
+ // Aggiorno il racconto in memoria
+ res += App.DB.UpdateRac(rac);
+ }
+ if (res == racs.Length) {
+ rtb.Text = nav.SwitchTo(racs[0].IDrac);
+ sbMessage.Text = string.Format("Importato/Aggiornato correttamente {0} racconti", res.ToString("00000"));
+ } else {
+ rtb.Text = App.DB.GetRacById(nav.ActualID).ToString();
+ sbMessage.Text = string.Format("Errore in lettura di {0}", nav.ActualID.ToString("00000"));
+ }
+ } else {
+ rtb.Text = "Lettura del racconto non riuscita";
+ }
+ return;
+ }
+ #endregion
+
+ #region Keys.F10 --> Bookmarks
+ if (e.KeyCode == Keys.F10) {
+ // ToDo: Keys.F10 --> Bookmarks
+ sbMessage.Text = "Keys.F10 --> Comando in sviluppo, non tutte le funzioni sono completate";
+ return;
+ }
+ #endregion
+
+ #region Keys.F12 --> Votazione
+ //if (e.KeyCode == Keys.F12 && (!e.Control) && (!e.Alt) && (!e.Shift)) {
+ // // Vote Rac
+ // long id = nav.ActualID;
+ // if (id < 0) return;
+ // frmVoto frmv = new frmVoto(App.DB.GetRacById(id));
+ // frmv.Left = Left + (Width - frmv.Width) / 2;
+ // frmv.Top = Top + (Height - frmv.Height) / 2;
+ // if (frmv.ShowDialog() == DialogResult.OK) {
+ // rtb.Text = nav.UpdateVoto(frmv.Voto);
+ // sbMessage.Text = string.Format("Racconto {0} Voted", nav.ActualID.ToString("00000"));
+ // } else {
+ // rtb.Text = nav.Refresh;
+ // sbMessage.Text = string.Format("Racconto {0} Refresh", nav.ActualID.ToString("00000"));
+ // }
+ // frmv.Close();
+ // return;
+ //}
+ #endregion
+
+ #region Keys.Alt+keys.H --> Home
+ if (e.Alt && (e.KeyCode == Keys.H)) {
+ rtb.Text = nav.Home;
+ sbMessage.Text = string.Format("Home {0}", nav.ActualID.ToString("00000"));
+ }
+ #endregion
+
+ #region Keys.Alt+Keys.Left --> Navigazione backward fra i racconti già visualizzati
+ if (e.Alt && (e.KeyCode == Keys.Left)) {
+ // Show Rac Backward
+ rtb.Text = nav.Backward;
+ sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ return;
+ }
+ #endregion
+
+ #region Keys.Alt+keys.Right --> Navigazione forward fra i racconti già visualizzati
+ if (e.Alt && (e.KeyCode == Keys.Right)) {
+ // Show Rac Forward
+ rtb.Text = nav.Forward;
+ sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ return;
+ }
+ #endregion
+
+ #region Keys.Alt+keys.Down --> Navigazione verso il racconto con ID precedente (ID Meno 1) a quello visualizzato
+ if (e.Alt && (e.KeyCode == Keys.Down)) {
+ // Show Rac Meno 1
+ rtb.Text = nav.Previous;
+ sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ return;
+ }
+ #endregion
+
+ #region Keys.Alt+keys.Up --> Navigazione verso il racconto con ID successivo (ID Più 1) a quello visualizzato
+ if (e.Alt && (e.KeyCode == Keys.Up)) {
+ // Show Rac Più 1
+ rtb.Text = nav.Next;
+ sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ return;
+ }
+ #endregion
+
+ #region Keys.Alt+keys.+ --> Incrementa la dimensione del font
+ if (e.Alt && (e.KeyCode == Keys.Add)) {
+ // Increse text size
+ Font f = new System.Drawing.Font(rtb.Font.FontFamily, rtb.Font.Size + 1.0F);
+ rtb.Font = f;
+ sbMessage.Text = string.Format("Racconto {0} Size Increase", nav.ActualID.ToString("00000"));
+ return;
+ }
+ #endregion
+
+ #region Keys.Alt+keys.- --> Decrementa la dimensione del font
+ if (e.Alt && (e.KeyCode == Keys.Subtract)) {
+ // Decrease text size
+ Font f = new System.Drawing.Font(rtb.Font.FontFamily, rtb.Font.Size - 1.0F);
+ rtb.Font = f;
+ sbMessage.Text = string.Format("Racconto {0} Size Decrease", nav.ActualID.ToString("00000"));
+ return;
+ }
+ #endregion
+
+ #region Keys.Alt+keys.* --> Imposta il font alla dimensione di default
+ if (e.Alt && (e.KeyCode == Keys.Multiply)) {
+ // Reset text size
+ Font f = new System.Drawing.Font(rtb.Font.FontFamily, (float)10.0);
+ rtb.Font = f;
+ sbMessage.Text = string.Format("Racconto {0} Size Default", nav.ActualID.ToString("00000"));
+ return;
+ }
+ #endregion
+
+ #region Keys.Alt+keys.F --> Editazione filtri:
+ //if (e.Alt && (e.KeyCode == Keys.F)) {
+ // // preparo l'interfaccia per la gestione filtri:
+ // frmFilters frmF = new frmFilters(DB);
+ // frmF.Left = Left + (Width - frmF.Width) / 2;
+ // frmF.Top = Top + (Height - frmF.Height) / 2;
+ // // Visualizzo l'interfaccia:
+ // if (frmF.ShowDialog() == DialogResult.OK) { sbMessage.Text = string.Format("FVoti: {0} - FTags: {1}", DB.FVoti, DB.FTags); }
+ // frmF.Close();
+ // return;
+ //}
+ #endregion
+
+ #region Keys.Alt+keys.A --> Navigazione fra i racconti dello stesso autore
+ //if (e.Alt && (e.KeyCode == Keys.A)) {
+ // // Show All Rac of this Autor
+ // frmList frml = new frmList();
+ // frml.Height = this.Height - 64;
+ // frml.Width = this.Width - 64;
+ // frml.Left = Left + (Width - frml.Width) / 2;
+ // frml.Top = Top + (Height - frml.Height) / 2;
+ // frml.Title = "Racconti dell'autore:";
+ // int res = DB.GetListByRacAutor(nav.ActualID, frml.LV);
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // // Se racconto selezionato è uno solo, lo visualizzo, altrimenti mostro nuovo elenco
+ // if (frml.Num > 1) {
+ // // più racconti dallo stesso titolo:
+ // res = DB.GetListByTitle(frml.Descr, frml.LV);
+ // frml.Title = "Racconti con il titolo: " + frml.Descr;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // } else {
+ // // 1 solo racconto
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // }
+ // frml.Close();
+ // return;
+ //}
+ #endregion
+
+ #region Keys.Alt+keys.T --> Navigazione fra i racconti via tag:
+ //if (e.Alt && (e.KeyCode == Keys.T)) {
+ // // Show All Tag
+ // frmList frml = new frmList();
+ // frml.Height = this.Height - 64;
+ // frml.Width = this.Width - 64;
+ // frml.Left = Left + (Width - frml.Width) / 2;
+ // frml.Top = Top + (Height - frml.Height) / 2;
+ // frml.Title = "Elenco Tags:";
+ // int res = DB.GetListTags(nav.ActualID, frml.LV);
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // // Show all rac del tag selezionato
+ // res = DB.GetListByTags(frml.ID, frml.LV);
+ // frml.Title = "Racconti del tag: " + frml.Descr;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // // Se racconto selezionato è uno solo, lo visualizzo, altrimenti mostro nuovo elenco
+ // if (frml.Num > 1) {
+ // // più racconti dallo stesso titolo:
+ // res = DB.GetListByTitle(frml.Descr, frml.LV);
+ // frml.Title = "Racconti con il titolo: " + frml.Descr;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // } else {
+ // // 1 solo racconto
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // }
+ // }
+ // frml.Close();
+ // return;
+ //}
+ #endregion
+
+ #region Keys.Alt+keys.V --> Navigazione fra i racconti via Voto:
+ //if (e.Alt && (e.KeyCode == Keys.V)) {
+ // // Show All Voto
+ // frmList frml = new frmList();
+ // frml.Height = this.Height - 64;
+ // frml.Width = this.Width - 64;
+ // frml.Left = Left + (Width - frml.Width) / 2;
+ // frml.Top = Top + (Height - frml.Height) / 2;
+ // frml.Title = "Elenco Voti Assegnati:";
+ // int res = DB.GetListVoti(nav.ActualID, frml.LV);
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // // Show all rac del tag selezionato
+ // frml.Title = "Racconti del voto: " + frml.Descr;
+ // res = DB.GetListByVoto(frml.ID, frml.LV);
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // }
+ // frml.Close();
+ // return;
+ //}
+ #endregion
+
+ #region Keys.Alt+keys.D --> Navigazione fra i racconti via Data:
+ //if (e.Alt && (!e.Shift) && (e.KeyCode == Keys.D)) {
+ // // Show All Year
+ // frmList frml = new frmList();
+ // frml.Height = this.Height - 64;
+ // frml.Width = this.Width - 64;
+ // frml.Left = Left + (Width - frml.Width) / 2;
+ // frml.Top = Top + (Height - frml.Height) / 2;
+ // frml.Title = "Elenco per anno di creazione:";
+ // int res = DB.GetListByCreationDate(frml.LV);
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // if (frml.Num == 1) {
+ // // Per l'anno vi è 1 solo racconto, e quindi lo mostro direttamente:
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // } else {
+ // // Show all Month dell'anno selezionato
+ // string strYear = frml.Descr;
+ // res = DB.GetListByYear(strYear, frml.LV);
+ // frml.Title = "Elenco mesi dell'anno " + strYear;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // if (frml.Num == 1) {
+ // // Per l'anno e mese selezionato, vi è 1 solo racconto, e quindi lo mostro direttamente:
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // } else {
+ // // Show all Days del mese, dell'anno, selezionato
+ // string strMonth = frml.Descr;
+ // res = DB.GetListByMonth(strYear, strMonth, frml.LV);
+ // frml.Title = "Elenco giorni del mese " + strMonth + "/" + strYear;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // if (frml.Num == 1) {
+ // // solo un racconto nel mese indicato, lo visualizzo subito
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // } else {
+ // string strDay = frml.Descr;
+ // res = DB.GetListByDay(strYear, strMonth, strDay, frml.LV);
+ // frml.Title = "Elenco racconti del giorno " + strDay + "/" + strMonth + "/" + strYear;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // // Se racconto selezionato è uno solo, lo visualizzo, altrimenti mostro nuovo elenco
+ // if (frml.Num > 1) {
+ // // più racconti dallo stesso titolo:
+ // res = DB.GetListByTitle(frml.Descr, frml.LV);
+ // frml.Title = "Racconti con il titolo: " + frml.Descr;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // } else {
+ // // 1 solo racconto
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // }
+ // }
+ // }
+ // }
+ // }
+ // }
+ // }
+ // frml.Close();
+ // return;
+ //}
+ #endregion
+
+ #region Keys.Alt+keys.L --> Navigazione degli ultimi 25 racconti updated e non letti:
+ //if (e.Alt && (e.KeyCode == Keys.L)) {
+ // #region
+ // // Show last 25 racconti updated:
+ // frmList frml = new frmList();
+ // frml.Height = this.Height - 64;
+ // frml.Width = this.Width - 64;
+ // frml.Left = Left + (Width - frml.Width) / 2;
+ // frml.Top = Top + (Height - frml.Height) / 2;
+ // frml.Title = "Ultimi 25 racconti modificati:";
+ // int res = DB.GetListByUpdate(50, frml.LV);
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // // Vi è un solo racocnto e lo visualizzo:
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // frml.Close();
+ // //this.Select();
+ // return;
+ // #endregion
+ //}
+ #endregion
+
+ #region Keys.Alt+keys.I --> Navigazione fra i racconti via iniziale titolo:
+ //if (e.Alt && (!e.Shift) && (e.KeyCode == Keys.I)) {
+ // // Show All Iniziali
+ // frmList frml = new frmList();
+ // frml.Height = this.Height - 64;
+ // frml.Width = this.Width - 64;
+ // frml.Left = Left + (Width - frml.Width) / 2;
+ // frml.Top = Top + (Height - frml.Height) / 2;
+ // frml.Title = "Elenco iniziali dei titoli:";
+ // int res = DB.GetListByIniziali(frml.LV);
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // if (frml.Num == 1) {
+ // // Per l'iniziale vi è 1 solo racconto, e quindi lo mostro direttamente:
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // } else {
+ // // Show all titoli con l'iniziale selezionata
+ // string iniziale = frml.Descr;
+ // res = DB.GetListByIniziale(iniziale, frml.LV);
+ // frml.Title = "Elenco titoli con l'iniziale " + iniziale;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // // Se racconto selezionato è uno solo, lo visualizzo, altrimenti mostro nuovo elenco
+ // if (frml.Num > 1) {
+ // // più racconti dallo stesso titolo:
+ // res = DB.GetListByTitle(frml.Descr, frml.LV);
+ // frml.Title = "Racconti con il titolo: " + frml.Descr;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // } else {
+ // // 1 solo racconto
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // }
+ // }
+ // }
+ // frml.Close();
+ // return;
+ //}
+ #endregion
+
+ #region Shift+keys.Alt+keys.D --> Visualizza tutti i racconti non letti con la data attuale:
+ //if (e.Alt && e.Shift && (e.KeyCode == Keys.D)) {
+ // // ricavo la data del racconto visualizzato:
+ // cRac rac = App.DB.GetRacById(nav.ActualID);
+ // string strYear = rac.Creato.Year.ToString("0000");
+ // string strMonth = rac.Creato.Month.ToString("00");
+ // string strDay = rac.Creato.Day.ToString("00");
+ // // Show tutti i racconti non letti della data indicata:
+ // frmList frml = new frmList();
+ // frml.Height = this.Height - 64;
+ // frml.Width = this.Width - 64;
+ // frml.Left = Left + (Width - frml.Width) / 2;
+ // frml.Top = Top + (Height - frml.Height) / 2;
+ // int res = DB.GetListByDay(strYear, strMonth, strDay, frml.LV);
+ // frml.Title = "Elenco racconti del giorno " + strDay + "/" + strMonth + "/" + strYear;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // // Se racconto selezionato è uno solo, lo visualizzo, altrimenti mostro nuovo elenco
+ // if (frml.Num > 1) {
+ // // più racconti dallo stesso titolo:
+ // res = DB.GetListByTitle(frml.Descr, frml.LV);
+ // frml.Title = "Racconti con il titolo: " + frml.Descr;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // } else {
+ // // 1 solo racconto
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // }
+ // frml.Close();
+ // return;
+ //}
+ #endregion
+
+ #region Shift+Keys.Alt+keys.I --> Navigazione fra i racconti con la stessa iniziale del titolo:
+ //if (e.Alt && e.Shift && (e.KeyCode == Keys.I)) {
+ // // ricavo L'iniziale del titolo del racocnto visualizzato:
+ // cRac rac = App.DB.GetRacById(nav.ActualID);
+ // string iniziale = rac.Title.Substring(0, 1);
+ // // Show All Iniziali
+ // frmList frml = new frmList();
+ // frml.Height = this.Height - 64;
+ // frml.Width = this.Width - 64;
+ // frml.Left = Left + (Width - frml.Width) / 2;
+ // frml.Top = Top + (Height - frml.Height) / 2;
+ // int res = DB.GetListByIniziale(iniziale, frml.LV);
+ // frml.Title = "Elenco titoli con l'iniziale " + iniziale;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // // Se racconto selezionato è uno solo, lo visualizzo, altrimenti mostro nuovo elenco
+ // if (frml.Num > 1) {
+ // // più racconti dallo stesso titolo:
+ // res = DB.GetListByTitle(frml.Descr, frml.LV);
+ // frml.Title = "Racconti con il titolo: " + frml.Descr;
+ // if ((res > 0) && (frml.ShowDialog() == DialogResult.OK)) {
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // } else {
+ // // 1 solo racconto
+ // rtb.Text = nav.SwitchTo(frml.ID);
+ // sbMessage.Text = string.Format("Racconto {0}", nav.ActualID.ToString("00000"));
+ // }
+ // }
+ // frml.Close();
+ // return;
+ //}
+ #endregion
+
+ #region Shift+keys.Alt+F12 --> Ricrea l'intero DB eliminando i racconti segnati da eliminare
+ if (e.KeyCode == Keys.F12 && (!e.Control) && e.Alt && e.Shift) {
+ // ToDo: Shift+Alt+F12 --> Ricrea l'intero DB eliminando i racconti segnati da eliminare
+ sbMessage.Text = "Shift+Alt+F12 --> Comando in sviluppo, non tutte le funzioni sono completate";
+ return;
+ }
+ #endregion
+
+ #region Keys.Alt+Keys.Q --> Esegue una query personalizzata:
+ if (e.Alt && (e.KeyCode == Keys.Z)) {
+ // ToDo: Keys.Alt+Keys.Q --> Esegue una query personalizzata
+ sbMessage.Text = "Keys.Alt+Keys.Q --> Comando in sviluppo, non tutte le funzioni sono completate";
+ return;
+ }
+ #endregion
+
+ #region Keys.Alt+keys.Z --> Analisi Racconti Duplicati:
+ if (e.Alt && (e.KeyCode == Keys.Z)) {
+ // ToDo: Keys.Alt+keys.Z --> Analisi Racconti Duplicati:
+ sbMessage.Text = "Shift+Alt+F12 --> Comando in sviluppo, non tutte le funzioni sono completate";
+ return;
+ }
+ #endregion
+
+ #region Keys.Alt+keys.S --> Crea uno snapshot di n racconti formattati e li converte in ebook
+ //if (e.Alt && (e.KeyCode == Keys.S)) {
+ // // // ToDo: Keys.Alt+keys.S --> Crea uno snapshot di n racconti formattati e li converte in ebook
+ // // sbMessage.Text = "Keys.Alt+keys.S --> Comando in sviluppo, non tutte le funzioni sono completate";
+ // // return;
+ // cmdCreaEbook();
+ //}
+ #endregion
+
+ #region Keys.Alt+keys.U --> Unione di due racconti
+ //if (e.Alt && (e.KeyCode == Keys.U)) {
+ // // ToDo: Keys.Alt+keys.U --> Unione di due racconti
+ // // - chiede l'ID dei due racconti da unire
+ // frmIDs frmid = new frmIDs();
+ // frmid.Left = Left + (Width - frmid.Width) / 2;
+ // frmid.Top = Top + (Height - frmid.Height) / 2;
+ // if (frmid.ShowDialog() != DialogResult.OK) {
+ // sbMessage.Text = "Anullato inserimento degli ID dei racconti da unire";
+ // return;
+ // }
+ // if ((frmid.IDleft <= 0) || (frmid.IDright <= 0)) {
+ // sbMessage.Text = "ID dei racconti da unire non validi";
+ // return;
+ // }
+ // // - ricavo i due racconti da unire:
+ // cRac left = DB.GetRacById(frmid.IDleft);
+ // cRac right = DB.GetRacById(frmid.IDright);
+ // frmid.Close();
+ // // - visualizza il form di unione
+ // frmUnion frm = new frmUnion(left, right, DB);
+ // if (frm.ShowDialog() == DialogResult.OK) {
+ // // - Left: il racconto unione:
+ // left = frm.Unione;
+ // // - Right: lo indico come duplicato:
+ // right.Title = "Doppione";
+ // right.SubTitle = left.strIDrac;
+ // right.Voto = "Da Cancellare";
+ // right.Tags.Clear();
+ // right.Tags.Add("Doppione");
+ // right.Notes.Clear();
+ // right.Notes.Add(new cNota("SrcFile", "Doppione"));
+ // right.Trama = "Racconto duplicato del " + left.strIDrac;
+ // // - Aggiorno il DB
+ // if ((right.IsValid) && (left.IsValid)) {
+ // App.DB.UpdateRac(right);
+ // App.DB.UpdateRac(left);
+ // }
+ // }
+ // frm.Close();
+ // return;
+ //}
+ #endregion
+
+ #region
+
+ #endregion
+ }
+
+
+
+
+ }
+}
diff --git a/Src/A69WD/UI/frmReader.resx b/Src/A69WD/UI/frmReader.resx
new file mode 100644
index 0000000..81d325e
--- /dev/null
+++ b/Src/A69WD/UI/frmReader.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file