CASA/CASA/gui/FindAndReplace.cs

413 lines
14 KiB
C#

using System;
using System.Text;
using Gtk;
using Glade;
namespace Novell.CASA.GUI
{
class FindAndReplace
{
#region Glade Widgets
[Glade.Widget]
Gtk.TreeView tvResults;
[Glade.Widget]
Gtk.Dialog dialogFindAndReplace,
dialogLogin;
[Glade.Widget]
Gtk.Button bttnFind,
bttnReplaceAll,
bttnApply,
bttnCancel,
bttnRevert,
bttnOk,
bttnHelp;
[Glade.Widget]
Gtk.Entry entryFind,
entryNewValue,
entryMasterPassword3,
entryMasterPassword4;
[Glade.Widget]
Gtk.CheckButton cbShowValues;
[Glade.Widget]
Gtk.Label label86,
label88,
labelRememberFor,
labelSeconds;
[Glade.Widget]
Gtk.SpinButton spinbuttonRememberFor;
#endregion
private TreeModel m_tmCASA;
private TreeStore m_tsCASA;
private TreeStore tsResults;
private Store m_store;
private int m_iRememberSeconds = 5;
public FindAndReplace(Store store, TreeModel tmCASA, TreeStore tsCASA)
{
m_store = store;
m_tmCASA = tmCASA;
m_tsCASA = tsCASA;
}
public void ShowDialog()
{
Glade.XML gxmlTemp = new Glade.XML(Common.GladeFile, "dialogFindAndReplace", null);
gxmlTemp.Autoconnect(this);
dialogFindAndReplace.SetPosition(WindowPosition.CenterOnParent);
tvResults.AppendColumn("SecretID", new Gtk.CellRendererText(), "text", 0);
tvResults.AppendColumn("Key", new Gtk.CellRendererText(), "text", 1);
tvResults.AppendColumn("Value", new Gtk.CellRendererText(), "text", 2);
tvResults.Selection.Mode = SelectionMode.Multiple;
// 0:secretID, 1:Key, 2:Value****, 3:ValueClear, 4:dirtyBit
tsResults = new TreeStore(typeof(string), typeof(string), typeof(string), typeof(string), typeof(bool));
tvResults.Model = tsResults;
// hook up event handles
bttnApply.Clicked += new EventHandler(bttnApply_Clicked);
bttnCancel.Clicked += new EventHandler(bttnCancel_Clicked);
bttnRevert.Clicked += new EventHandler(bttnRevert_Clicked);
bttnFind.Clicked += new EventHandler(bttnFind_Clicked);
bttnOk.Clicked += new EventHandler(bttnOk_Clicked);
bttnReplaceAll.Clicked += new EventHandler(bttnReplaceAll_Clicked);
bttnHelp.Clicked += new EventHandler(bttnHelp_Clicked);
cbShowValues.Toggled += new EventHandler(cbShowValues_Toggled);
}
void bttnHelp_Clicked(object sender, EventArgs e)
{
Common.ShowHelpUrl("FindReplace.htm");
}
public void okbuttonLogin_clicked(object abj, EventArgs args)
{
TreeViewColumn tvCol;
if (0 == miCASA.SetMasterPassword(0, entryMasterPassword3.Text))
{
tvResults.RemoveColumn(tvResults.GetColumn(2));
tvCol = new TreeViewColumn("Value", new CellRendererText(), "text", 3);
tvResults.InsertColumn(tvCol, 2);
// get seconds to remember
//m_sRememberFor = spinbuttonRememberFor.Text;
//if (m_sRememberFor != null)
//{
// DateTime dtNow = DateTime.Now;
// m_iRememberSeconds = int.Parse(m_sRememberFor);
// CommonGUI.SetRememberMPUntil(dtNow.AddSeconds(m_iRememberSeconds));
//}
// save off remember time if user changed it
//string sSaveTimed = m_config.GetConfigSetting(CommonGUI.REMEMBER_SETTING, "5");
//if (!sSaveTimed.Equals(m_sRememberFor))
// {
// m_config.SetConfigSetting(CommonGUI.REMEMBER_SETTING, m_sRememberFor);
// m_config.WriteConfig();
//}
dialogLogin.Destroy();
//if (m_iRememberSeconds > 0)
// StartRememberTimer();
}
else
{
// warn user
CommonGUI.DisplayMessage(MessageType.Warning, "Master Password incorrect");
}
}
public void on_entryMasterPassword3_activate(object obj, EventArgs args)
{
if ("" != entryMasterPassword3.Text)
okbuttonLogin_clicked(obj, args);
}
public void on_entryMasterPassword4_activate(object obj, EventArgs args)
{
okbuttonLogin_clicked(obj, args);
}
public void on_helpbuttonAuthentication_clicked(object obj, EventArgs args)
{
Common.ShowHelpUrl("CASAMasterPasswordAuthentication.htm");
}
void cbShowValues_Toggled(object sender, EventArgs e)
{
TreeViewColumn tvCol;
if ((true == cbShowValues.Active)
&& (CommonGUI.GetRememberMPUntil().CompareTo(DateTime.Now) > 0))
{
// set and start the timer if needed
TimeSpan ts = CommonGUI.GetRememberMPUntil().Subtract(DateTime.Now);
m_iRememberSeconds = ts.Seconds;
//StartRememberTimer();
// display the values
tvResults.RemoveColumn(tvResults.GetColumn(2));
tvCol = new TreeViewColumn("Value", new CellRendererText(), "text", 3);
tvResults.InsertColumn(tvCol, 2);
}
else if (true == cbShowValues.Active)
{
// prompt user for MasterPassword
if (CommonGUI.UseMasterPassword())
{
Glade.XML gxmlTemp = new Glade.XML(Common.GladeFile, "dialogLogin", null);
gxmlTemp.Autoconnect(this);
dialogLogin.TransientFor = dialogFindAndReplace;
label86.Text = "Enter your Master Password to view values";
entryMasterPassword3.Text = "";
entryMasterPassword3.HasFocus = true;
label88.Hide();
entryMasterPassword4.Hide();
labelRememberFor.Visible = false;
labelSeconds.Visible = false;
spinbuttonRememberFor.Visible = false;
//spinbuttonRememberFor.Text = m_config.GetConfigSetting(CommonGUI.REMEMBER_SETTING, m_sRememberFor);
//dialogLogin.Show();
}
else
{
// display the values
tvResults.RemoveColumn(tvResults.GetColumn(2));
tvCol = new TreeViewColumn("Value", new CellRendererText(), "text", 3);
tvResults.InsertColumn(tvCol, 2);
}
}
else
{
tvResults.RemoveColumn(tvResults.GetColumn(2));
tvCol = new TreeViewColumn("Value", new CellRendererText(), "text", 2);
tvResults.InsertColumn(tvCol, 2);
}
}
public void closebuttonLogin_clicked(object abj, EventArgs args)
{
cbShowValues.Active = false;
dialogLogin.Destroy();
}
public void OnDialogLoginDeleted(object obj, DeleteEventArgs args)
{
cbShowValues.Active = false;
dialogLogin.Destroy();
args.RetVal = true;
}
void bttnOk_Clicked(object sender, EventArgs e)
{
if (bttnApply.Sensitive)
{
bttnApply_Clicked(sender, e);
}
CloseDialog();
}
void bttnFind_Clicked(object sender, EventArgs e)
{
if (entryFind.Text != null && entryFind.Text.Length > 0)
{
DoFind();
}
else
{
CommonGUI.DisplayMessage(MessageType.Error, "You must enter a value to find");
}
}
void bttnRevert_Clicked(object sender, EventArgs e)
{
// show cancel
bttnCancel.Visible = true;
// hide revert
bttnRevert.Visible = false;
bttnApply.Sensitive = bttnOk.Sensitive = false;
// reload
DoFind();
}
void bttnCancel_Clicked(object sender, EventArgs e)
{
CloseDialog();
}
void bttnApply_Clicked(object sender, EventArgs e)
{
TreeIter iter;
// iterate thru store, update all values with dirtybit=true
if (tsResults.GetIterFirst(out iter))
{
do
{
bool bDirty = (bool)tsResults.GetValue(iter, 4);
if (bDirty)
{
String sID = (string)tsResults.GetValue(iter, 0);
String sKey = (string)tsResults.GetValue(iter, 1);
String sValue = (string)tsResults.GetValue(iter, 3);
if (StoreDataInterface.ModifyCASASecretKey(sID, sKey, sValue))
{
Console.WriteLine("Updating {0} : {1} : {2}", sID, sKey, sValue);
}
// Update CASAManager view
m_store.AggregateStore();
}
} while (tsResults.IterNext(ref iter));
}
// hide revert
bttnRevert.Visible = false;
bttnCancel.Visible = true;
bttnApply.Sensitive = false;
bttnOk.Sensitive = false;
}
private void CloseDialog()
{
if (dialogFindAndReplace != null)
{
dialogFindAndReplace.Destroy();
}
}
private void DoFind()
{
string selected = null;
string[] keys = null,
values = null;
// clear current vies
tsResults.Clear();
// iterate thru CASA TreeStore, finding matches
TreeIter iter;
if (m_tsCASA.GetIterFirst(out iter))
{
do
{
selected = (string)m_tmCASA.GetValue(iter, 0);
keys = (string[])m_tmCASA.GetValue(iter, 1);
values = (string[])m_tmCASA.GetValue(iter, 2);
// add matches to the results
for (int i = 0; i < keys.Length; i++)
{
if ((entryFind.Text.Equals("*")) ||
(values[i].IndexOf(entryFind.Text) > -1))
{
tsResults.AppendValues(selected, keys[i], "*******", values[i], false);
}
}
} while (m_tsCASA.IterNext(ref iter));
//tvResults.Selection.SelectAll();
}
}
void bttnReplaceAll_Clicked(object sender, EventArgs e)
{
TreeModel model;
TreeIter iter;
TreePath[] treePaths = tvResults.Selection.GetSelectedRows(out model);
if (entryNewValue.Text == null || entryNewValue.Text.Length == 0)
{
CommonGUI.DisplayMessage(MessageType.Warning, "Enter a new value");
return;
}
if (treePaths.Length == 0)
{
CommonGUI.DisplayMessage(MessageType.Warning, "You must select at least one row");
return;
}
if (entryNewValue.Text != null && entryNewValue.Text.Length > 0)
{
// iterate thru those to change
for (int i = 0; i < treePaths.Length; i++)
{
if (tsResults.GetIter(out iter, treePaths[i]))
{
string sCurrentValue = (string)tsResults.GetValue(iter, 3);
// change if newValue is different
if (!sCurrentValue.Equals(entryNewValue.Text))
{
tsResults.SetValue(iter, 2, entryNewValue.Text);
tsResults.SetValue(iter, 3, entryNewValue.Text);
// set the dirty bit
tsResults.SetValue(iter, 4, true);
}
}
}
bttnApply.Sensitive = bttnOk.Sensitive = true;
bttnRevert.Visible = true;
bttnCancel.Visible = false;
}
}
/*
private bool bTimerActive = false;
public void StartRememberTimer()
{
if (!bTimerActive)
{
GLib.Timeout.Add((uint)(m_iRememberSeconds * 1000), new GLib.TimeoutHandler(update_gui));
bTimerActive = true;
}
}
* */
}
}