Inserito Reader

Esempio base di lettore, con solo funzionalità di lettura random o sequenziale (frecce su/giu).
Testato e la lettura è corretta.

ToDo:
- [X] Inserire un lettore per visualizzare i racconti nel DB
- [ ] Inserire funzionalità avanzate di lettura (navigazione, filtri, ecc...)
- [0/2] Integrare lo scraping dei racconti dal web
   - [ ] Integrare lo scraping visualizzandolo sulla progress bar e label nella status bar.
   - [ ] Importare i racconti via via che sono downloadati
This commit is contained in:
CSiCoAlm committed 2025-12-29 11:48:05 +01:00
1 parent b43dcbbb88
commit 1fd91b4af2
9 files changed
+1200 -2

No files matched your search

+1 -1
View File
@@ -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":[]}
{"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":[]}
+10
View File
@@ -63,6 +63,7 @@
<Compile Include="Data\cRac.cs" />
<Compile Include="Data\DBTools.cs" />
<Compile Include="Data\Helper.cs" />
<Compile Include="General\Navigator.cs" />
<Compile Include="Net\eLinkState.cs" />
<Compile Include="Net\cLink_A69.cs" />
<Compile Include="Service\Service_Crawler.cs" />
@@ -80,6 +81,12 @@
<Compile Include="Net\iLink.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Site\iSiteType.cs" />
<Compile Include="UI\frmReader.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UI\frmReader.Designer.cs">
<DependentUpon>frmReader.cs</DependentUpon>
</Compile>
<EmbeddedResource Include="UI\frmDownloader.resx">
<DependentUpon>frmDownloader.cs</DependentUpon>
</EmbeddedResource>
@@ -93,6 +100,9 @@
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<EmbeddedResource Include="UI\frmReader.resx">
<DependentUpon>frmReader.cs</DependentUpon>
</EmbeddedResource>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
+3 -1
View File
@@ -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 - - - ");
+81
View File
@@ -1725,8 +1725,18 @@ namespace A69WD {
// Metodi ricavati ottimizzando i miei tramite gemini
/// <summary>
/// Ricava il racconto con l'ID indicato leggendolo dal DB
/// </summary>
@@ -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); }
/// <summary>
/// ritorna il riepilogo del DB:
/// </summary>
/// <returns>Stringa con il riepilogo del DB</returns>
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;
}
}
/// <summary>
/// Metodo per trovare un identificativo di un racconto scelto casualmente fra quelli che soddisfano il filtro indicato.
/// </summary>
/// <param name="queryFilter">Eventuale query per filtrare i racconti selezionabili</param>
/// <returns>Identificativo del racconto scelto casualmente</returns>
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
+55
View File
@@ -70,6 +70,61 @@ namespace A69WD.Data {
/// <summary>
/// Esegue una query che ritorna un scalare
/// </summary>
/// <param name="query">Query da eseguire sul DB</param>
/// <returns>Scalare ritornato dalla query</returns>
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
/// <summary>
/// Conteggia il numero di record nella colonna indicata contenuti nella tabella indicata.
/// </summary>
/// <param name="conn">Connessione al DB</param>
/// <param name="tableName">Nome della tabella in cui fare la query</param>
/// <param name="columName">Nome del campo da contare</param>
/// <param name="objLock">Oggetto per il lock fra i thread</param>
/// <returns>Il numero di record trovati, oppure un codice negativo in caso di errore.</returns>
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 {
+180
View File
@@ -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
/// <summary>
/// Array interno che mi memorizza gli ID degli ultimi racconti visualizzati
/// </summary>
private long[] buffer = null;
/// <summary>
/// Indice del racconto attualmente visualizzato
/// </summary>
private long indice = 0;
/// <summary>
/// Interfaccia con il database
/// </summary>
private DBTools DB = null;
#endregion
#region Costrutore
/// <summary>
/// Costruttore
/// </summary>
/// <param name="size">Dimensione del buffer, cioè numero di racconti di cui tener memoria</param>
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:
/// <summary>
/// Ritorna l'ID del racconto attualmente visualizzato
/// 0 indica la pagina home con il riepilogo del ATDB
/// </summary>
public long ActualID { get { return buffer[indice]; } }
/// <summary>
/// Ritorna il riepilogo dell'archivio
/// </summary>
public string Home { get { return DB.Report; } }
/// <summary>
/// Ritorna il testo del racconto successivo a quello visualizzato attualmente, nel buffer di navigazione
/// </summary>
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();
}
}
/// <summary>
/// Ritorna il testo del racconto precedente a quello visualizzato attualmente, nel buffer di navigazione
/// </summary>
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();
}
}
/// <summary>
/// Ritorna il testo del racconto con ID successivo a quello visualizzato attualmente
/// </summary>
public string Next {
get {
// Aggiorno indice attuale:
long newID = buffer[indice];
if (newID > 0) {
newID++;
return SwitchTo(newID);
} else {
return Refresh;
}
}
}
/// <summary>
/// Ritorna il testo del racconto con ID precedente a quello visualizzato attualmente
/// </summary>
public string Previous {
get {
// Aggiorno indice attuale:
long newID = buffer[indice];
if (newID > 1) {
newID--;
return SwitchTo(newID);
} else {
return Refresh;
}
}
}
/// <summary>
/// Ricarica il testo del racconto attuale
/// </summary>
public string Refresh {
get {
if (buffer[indice] > 0) {
return DB.GetRacById(buffer[indice]).ToString();
} else { return Home; }
}
}
/// <summary>
/// Ritorna il testo di un racconto scelto casualmente nel DB
/// </summary>
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();
}
}
/// <summary>
/// Ritorna l'ID del nuovo racconto prendendo quello indicato
/// </summary>
/// <param name="NewIdRac">ID del racconto da visualizzare</param>
/// <returns></returns>
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();
}
/// <summary>
/// Ricarica il testo del racconto attuale
/// </summary>
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
+116
View File
@@ -0,0 +1,116 @@
namespace A69WD.UI {
partial class frmReader {
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}
+631
View File
@@ -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"));
}
/// <summary>
/// Gestione della navigazione fra i racconti
/// </summary>
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
}
}
}
+123
View File
@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="sb.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>