2010-01-03 22:57:13 +00:00
#region Disclaimer / License
2011-05-09 19:52:28 +00:00
// Copyright (C) 2011, Kenneth Skovhede
2010-01-03 22:57:13 +00:00
// http://www.hexad.dk, opensource@hexad.dk
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
#endregion
using System ;
2009-12-13 14:32:19 +00:00
using System.Collections.Generic ;
using System.ComponentModel ;
using System.Data ;
using System.Drawing ;
using System.Linq ;
using System.Text ;
using System.Windows.Forms ;
using System.Xml.Linq ;
namespace LocalizationTool
{
public partial class UpdateGUI : Form
{
private string m_reportfile ;
private int m_totalcount ;
private Dictionary < string , XElement > m_updates = new Dictionary < string , XElement >();
public UpdateGUI ( string reportfile )
{
InitializeComponent ();
m_reportfile = reportfile ;
}
private void UpdateGUI_Load ( object sender , EventArgs e )
{
panel3 . Dock = DockStyle . Fill ;
string culturename = System . IO . Path . GetExtension ( System . IO . Path . GetFileNameWithoutExtension ( m_reportfile )). Substring ( 1 );
this . Text = "Localizing culture " + culturename ;
var files = XDocument . Load ( m_reportfile ). Element ( "root" ). Elements ( "file" ). Where ( n =>
( n . Element ( "missing" ) != null && n . Element ( "missing" ). Elements (). Count () > 0 )
||
( n . Element ( "not-updated" ) != null && n . Element ( "not-updated" ). Elements (). Count () > 0 )
);
2010-11-21 11:08:15 +00:00
string rootfolder = Duplicati . Library . Utility . Utility . AppendDirSeparator ( System . IO . Path . Combine ( Application . StartupPath , culturename ));
2009-12-13 14:32:19 +00:00
treeView1 . BeginUpdate ();
treeView1 . Nodes . Clear ();
foreach ( XElement x in files )
{
TreeNodeCollection cl = treeView1 . Nodes ;
string relpath = x . Attribute ( "filename" ). Value . Substring ( rootfolder . Length );
foreach ( string s in relpath . Split ( System . IO . Path . DirectorySeparatorChar ))
{
bool found = false ;
foreach ( TreeNode n in cl )
if ( n . Text == s )
{
cl = n . Nodes ;
found = true ;
break ;
}
if (! found )
{
TreeNode nn = new TreeNode ( s );
nn . ForeColor = Color . DarkBlue ;
cl . Add ( nn );
cl = nn . Nodes ;
}
}
foreach ( XElement el in x . Element ( "missing" ). Elements ( "item" ). Union ( x . Element ( "not-updated" ). Elements ( "item" )))
{
2009-12-20 10:40:10 +00:00
//These show up occasionally, but mut not be translated
if (
el . Attribute ( "name" ). Value . EndsWith ( ".Name" )
||
el . Attribute ( "name" ). Value . EndsWith ( ".MappingName" )
)
continue ;
2009-12-13 14:32:19 +00:00
string val = el . Value ;
if ( val . Length > 100 )
val = val . Substring ( 0 , 97 ) + "..." ;
TreeNode tn = new TreeNode ( el . Attribute ( "name" ). Value + ": " + val );
tn . ForeColor = Color . DarkRed ;
tn . Tag = el ;
cl . Add ( tn );
m_totalcount ++;
}
}
treeView1 . EndUpdate ();
treeView1 . ExpandAll ();
if ( treeView1 . Nodes . Count > 0 )
{
TreeNode top = treeView1 . Nodes [ 0 ];
while ( top . Nodes . Count > 0 )
top = top . Nodes [ 0 ];
treeView1 . SelectedNode = top ;
}
label4 . Text = m_totalcount . ToString ();
label6 . Text = System . IO . Path . Combine ( Application . StartupPath , culturename );
this . WindowState = FormWindowState . Maximized ;
}
private void treeView1_AfterSelect ( object sender , TreeViewEventArgs e )
{
if ( treeView1 . SelectedNode == null || treeView1 . SelectedNode . Tag as XElement == null )
panel3 . Visible = false ;
else
{
panel3 . Visible = true ;
XElement el = treeView1 . SelectedNode . Tag as XElement ;
panel3 . Tag = null ;
textBox1 . Text = el . Attribute ( "name" ). Value ;
2009-12-20 10:40:10 +00:00
textBox2 . Text = el . Value . Replace ( Environment . NewLine , "\n" ). Replace ( "\n" , Environment . NewLine );
2009-12-13 14:32:19 +00:00
try
{
textBox2 . Focus ();
textBox2 . SelectAll ();
}
catch { }
panel3 . Tag = el ;
}
}
private void textBox2_TextChanged ( object sender , EventArgs e )
{
if ( panel3 . Tag as XElement == null )
return ;
XElement el = panel3 . Tag as XElement ;
el . Value = textBox2 . Text ;
string dictkey = el . Parent . Parent . Attribute ( "filename" ). Value + "@" + el . Attribute ( "name" ). Value ;
m_updates [ dictkey ] = el ;
label4 . Text = ( m_totalcount - m_updates . Count ). ToString ();
if ( treeView1 . SelectedNode != null && treeView1 . SelectedNode . Tag == el )
treeView1 . SelectedNode . ForeColor = Color . DarkGreen ;
}
private void button3_Click ( object sender , EventArgs e )
{
if ( m_updates . Count > 0 )
if ( MessageBox . Show ( this , "Close and loose all changes?" , Application . ProductName , MessageBoxButtons . YesNoCancel , MessageBoxIcon . Warning , MessageBoxDefaultButton . Button3 ) != DialogResult . Yes )
return ;
this . DialogResult = DialogResult . Cancel ;
this . Close ();
}
private void button1_Click ( object sender , EventArgs e )
{
TreeNode t = treeView1 . SelectedNode ;
if ( t == null )
return ;
List < TreeNode > visited = new List < TreeNode >();
while ( t != null )
{
if ( t . Nodes . Count > 0 && ! visited . Contains ( t ))
t = t . Nodes [ 0 ];
else if ( t . NextNode != null )
t = t . NextNode ;
else
{
if ( t . Parent != null && ! visited . Contains ( t . Parent ))
visited . Add ( t . Parent );
t = t . Parent ;
}
if ( t != null && t . ForeColor == Color . DarkRed )
{
treeView1 . SelectedNode = t ;
return ;
}
}
MessageBox . Show ( this , "No more items" , Application . ProductName , MessageBoxButtons . OK , MessageBoxIcon . Information );
}
private void button2_Click ( object sender , EventArgs e )
{
foreach ( XElement el in m_updates . Values )
{
XDocument file = XDocument . Load ( el . Parent . Parent . Attribute ( "filename" ). Value );
2009-12-13 17:13:00 +00:00
var insertEl = file . Element ( "root" ). Elements ( "data" ). Where ( c => c . Attribute ( "name" ). Value == el . Attribute ( "name" ). Value ). FirstOrDefault ();
if ( insertEl != null )
insertEl . Element ( "value" ). Value = el . Value ;
else
file . Element ( "root" ). Elements (). Last (). AddAfterSelf (
new XElement ( "data" ,
new XAttribute ( "name" , el . Attribute ( "name" ). Value ),
new XAttribute ( XNamespace . Xml + "space" , "preserve" ),
new XElement ( "value" , el . Value )
)
);
2009-12-13 14:32:19 +00:00
file . Save ( el . Parent . Parent . Attribute ( "filename" ). Value );
}
m_updates . Clear ();
this . DialogResult = DialogResult . OK ;
this . Close ();
}
private void UpdateGUI_FormClosing ( object sender , FormClosingEventArgs e )
{
if ( e . CloseReason == CloseReason . UserClosing || e . CloseReason == CloseReason . FormOwnerClosing )
if ( m_updates . Count > 0 )
if ( MessageBox . Show ( this , "Close and loose all changes?" , Application . ProductName , MessageBoxButtons . YesNoCancel , MessageBoxIcon . Warning , MessageBoxDefaultButton . Button3 ) != DialogResult . Yes )
{
e . Cancel = true ;
return ;
}
}
}
}