Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version

Windows Mobile Password Safe

, 12 Jan 2009
A password safe with a touch screen UI introducing Fluid Controls.
PasswordSafeExe.zip
PasswordSafeSource.zip
PasswordSafe
Fluditity
bin
Classes
vssver2.scc
Controls
enums
vssver2.scc
Events
vssver2.scc
Interfaces
vssver2.scc
vssver2.scc
Fluid.csproj.user
GdiPlus
mssccprj.scc
NativeMethods
vssver2.scc
vssver2.scc
Native
vssver2.scc
obj
Properties
vssver2.scc
vssver2.scc
PasswordSafe
bin
Release
Fluid.dll
passwords.pws
PasswordSafe.exe
Classes
vssver2.scc
Encryption
vssver2.scc
EventArgs
vssver2.scc
ListBoxes
vssver2.scc
PasswordSafe.csproj.user
Properties
vssver2.scc
Resources
lock.bmp
minus.png
props.bmp
save.bmp
saved.bmp
search.bmp
searchd.bmp
undo24.bmp
undo24_d.bmp
Untitled.png
vssver2.scc
security.ico
Templates
vssver2.scc
Themes
vssver2.scc
vssver2.scc
Xml
vssver2.scc
vssver2.scc
using System;

using System.Collections.Generic;
using System.Text;
using Fluid.Controls;
using System.Drawing;
using System.Windows.Forms;
using Fluid.Classes;
using PasswordSafe.Classes;

namespace PasswordSafe
{
    public class LoginPanel : FluidPanel
    {

        public LoginPanel(int x, int y, int w, int h)
            : base(x, y, w, h)
        {
        }

        private NumericPad numPad;
        private FluidTextBox passwordTextBox;
        private FluidTextBox newPasswordTextbox;
        private FluidTextBox confirmPasswordTextBox;
        private FluidLabel passwordLabel;
        private FluidLabel newPasswordLabel;
        private FluidLabel confirmPasswordLabel;

        protected override void InitControl()
        {
            base.InitControl();
            EnableDoubleBuffer = true;
            Bounds = new Rectangle(0, 0, 240, 300);
            BackColor = Color.FromArgb(32, 32, 32); // Color.SlateGray;
            //GradientFillOffset = 20;
            //GradientFill = true;
            numPad = new NumericPad(0, 100, Width, 200);

            MakeButtonsGlowing();

            numPad.EnableDoubleBuffer = false;
            numPad.Buttons[15].Enabled = false;
            numPad.Corners = Fluid.Drawing.RoundedCorners.None;
            numPad.Anchor = System.Windows.Forms.AnchorStyles.None;
            numPad.Buttons[11].Text = "Exit";
            numPad.Buttons[11].BackColor = Color.FromArgb(48, 0, 0);
            numPad.SpecialKeyClick += new EventHandler(numPad_SpecialKeyClick);
            numPad.ButtonClick += new EventHandler<NumericPanelEventArgs>(numPad_ButtonClick);
            FluidButton btn = numPad.Buttons[7];
            btn.Format.FormatFlags = 0;
            btn.LineAlignment = StringAlignment.Near;
            btn.Alignment = StringAlignment.Center;
            //numPad.Buttons[11].BackColor = Color.DarkRed;   //Color.FromArgb(48, 0, 0)
            //numPad.Buttons[15].BackColor = Color.DarkGreen;
            numPad.Enter += new EventHandler(numPad_Enter);
            numPad.Anchor = AnchorStyles.None;
            Controls.Add(numPad);

            passwordTextBox = AddTextLabel(PasswordText, 5, ref passwordLabel, true);
            passwordTextBox.TextChanged += new EventHandler(textbox_TextChanged);
            passwordTextBox.Top += 4;
            newPasswordTextbox = AddTextLabel("Enter your new Password", 50, ref newPasswordLabel, false);
            confirmPasswordTextBox = AddTextLabel("Confirm your new Password", 94, ref confirmPasswordLabel, false);

            OnModeChanged();


            numPad.TextChanged += new EventHandler(numPad_TextChanged);
            passwordTextBox.TextChanged += new EventHandler(textbox_TextChanged);
            newPasswordTextbox.TextChanged += new EventHandler(textbox_TextChanged);
            confirmPasswordTextBox.TextChanged += new EventHandler(textbox_TextChanged);
            passwordTextBox.GotFocus += new EventHandler(passwordTextBox_GotFocus);
            newPasswordTextbox.GotFocus += new EventHandler(passwordTextBox_GotFocus);
            confirmPasswordTextBox.GotFocus += new EventHandler(passwordTextBox_GotFocus);
            SelectedTextBox = passwordTextBox;
        }

        private void MakeButtonsGlowing()
        {
            FluidButton[] buttons = numPad.Buttons;
            foreach (FluidButton btn in buttons) btn.PressedBackColor = Color.DarkBlue;
            buttons[11].PressedBackColor = Color.Red;
            buttons[15].PressedBackColor = Color.Green;
        }

        /// <summary>
        /// Gets or sets the password.
        /// </summary>
        public string Password { get { return passwordTextBox.Text; } set { passwordTextBox.Text = value; } }

        /// <summary>
        /// Gets or sets the new password.
        /// </summary>
        internal string NewPassword { get { return newPasswordTextbox.Text; } set { newPasswordTextbox.Text = value; } }

        /// <summary>
        /// Gets or sets the confirmed password.
        /// </summary>
        internal string ConfirmedPassword { get { return confirmPasswordTextBox.Text; } set { confirmPasswordTextBox.Text = value; } }


        private FluidTextBox selectedTextBox;

        public FluidTextBox SelectedTextBox
        {
            get { return selectedTextBox; }
            set
            {
                selectedTextBox = value;
                numPad.Text = selectedTextBox.Text;
                passwordTextBox.BackColor = selectedTextBox == passwordTextBox ? Color.White : Color.Gray;
                newPasswordTextbox.BackColor = selectedTextBox == newPasswordTextbox ? Color.White : Color.Gray;
                confirmPasswordTextBox.BackColor = selectedTextBox == confirmPasswordTextBox ? Color.White : Color.Gray;
            }
        }

        void passwordTextBox_GotFocus(object sender, EventArgs e)
        {
            SelectedTextBox = (FluidTextBox)sender;
        }

        void numPad_ButtonClick(object sender, NumericPanelEventArgs e)
        {
            if (e.ButtonIndex == 7)
            {
                e.Handled = true;
                Mode = Mode == DisplayMode.ChangePassword ? DisplayMode.Login : DisplayMode.ChangePassword;
            }

        }

        void numPad_SpecialKeyClick(object sender, EventArgs e)
        {
            ExitApplication();
        }

        /// <summary>
        /// Exits the application with an animation:
        /// </summary>
        private void ExitApplication()
        {
            this.Parent.BackColor = Color.Black;
            this.Close(ShowTransition.FromBottom);
            PasswordForm.Instance.Close();
        }

        protected string PasswordText
        {
            get
            {
                return mode == DisplayMode.Login ? "Enter your Password" : "Enter your old Password";
            }
        }


        public enum DisplayMode
        {
            Login,
            ChangePassword
        }

        public string Text
        {
            get { return numPad.Text; }
            set { numPad.Text = value; }
        }

        private DisplayMode mode = DisplayMode.Login;

        public DisplayMode Mode
        {
            get { return mode; }
            set
            {
                if (mode != value)
                {
                    mode = value;
                    OnModeChanged();
                }
            }
        }

        public override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);
            switch (e.KeyChar)
            {
                case '\t':
                    e.Handled = SelectNextTextBox();
                    break;

                case '\r':
                    e.Handled = true;
                    PerformEnter();
                    break;
            }
        }

        public override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (!e.Handled)
            {
                switch (e.KeyCode)
                {
                    case Keys.Down:
                        e.Handled = PerformKeyDown();
                        break;

                    case Keys.Up:
                        e.Handled = PerformKeyUp();
                        break;
                }
            }
        }

        private bool PerformKeyUp()
        {
            if (mode == DisplayMode.Login) return false;
            if (selectedTextBox == confirmPasswordTextBox) SelectedTextBox = newPasswordTextbox;
            else if (selectedTextBox == newPasswordTextbox) SelectedTextBox = passwordTextBox;
            else return false;
            return true;
        }

        private bool PerformKeyDown()
        {
            if (mode == DisplayMode.Login) return false;
            if (selectedTextBox == passwordTextBox) SelectedTextBox = newPasswordTextbox;
            else if (selectedTextBox == newPasswordTextbox) SelectedTextBox = confirmPasswordTextBox;
            else return false;
            return true;
        }

        private bool SelectNextTextBox()
        {
            if (mode == DisplayMode.ChangePassword)
            {
                bool focused = selectedTextBox.Focused;
                if (selectedTextBox == passwordTextBox) SelectedTextBox = newPasswordTextbox;
                else if (selectedTextBox == newPasswordTextbox) SelectedTextBox = confirmPasswordTextBox;
                else SelectedTextBox = passwordTextBox;
                return true;
                //                selectedTextBox.Focus();
                //                selectedTextBox.SelectAll();
            }
            return false;
        }

        private void OnModeChanged()
        {
            FluidButton btn = numPad.Buttons[7];

            bool visible = mode == DisplayMode.ChangePassword;
            newPasswordLabel.Visible = visible;
            confirmPasswordLabel.Visible = visible;
            newPasswordTextbox.Visible = visible;
            confirmPasswordTextBox.Visible = visible;
            if (mode == DisplayMode.Login)
            {
                btn.TextOffset = new Point(0, 12);
                btn.LineAlignment = StringAlignment.Near;
                passwordTextBox.Focus();
                selectedTextBox = passwordTextBox;
                btn.Text = "Change\nPassword";
                btn.Font = new Font(FontFamily.GenericSansSerif, 7f, FontStyle.Regular);

            }
            else
            {
                btn.TextOffset = new Point(0, 0);
                btn.LineAlignment = StringAlignment.Center;
                btn.Text = "Login";
            }
            numPad.Buttons[15].Text = mode == DisplayMode.Login ? "Enter" : "Change";
            EnsureEnterEnabled();
        }

        FluidTextBox AddTextLabel(string title, int top, ref FluidLabel label, bool visible)
        {
            label = new FluidLabel(title, 10, top + 5, Width - 20, 16);
            label.Anchor = AnchorStyles.Left | AnchorStyles.Top;
            label.Font = new Font(FontFamily.GenericSansSerif, 8f, FontStyle.Regular);
            label.ForeColor = Color.White;
            label.ShadowColor = Color.Black;
            label.Visible = visible;
            Controls.Add(label);

            FluidTextBox textbox = new FluidTextBox("", 10, top + 19, Width - 20, 24);
            textbox.Anchor = AnchorStyles.Left | AnchorStyles.Top;
            textbox.PasswordChar = '*';
            textbox.Visible = visible;
            textbox.CanShowInputPanel = false;
            Controls.Add(textbox);
            return textbox;
        }

        /// <summary>
        /// Filter out the keys that are note allowed:
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void textbox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ("0123456789\r\x1b\b".IndexOf(e.KeyChar) < 0)
            {
                e.Handled = true;
            }
        }

        private HandledEventArgs changedPasswordEvent = new HandledEventArgs();

        void numPad_Enter(object sender, EventArgs e)
        {
            PerformEnter();
        }

        private void PerformEnter()
        {
            switch (mode)
            {
                case DisplayMode.Login:
                    OnEnter();
                    break;

                case DisplayMode.ChangePassword:
                    OnChangePassword();
                    break;
            }
        }

        protected virtual void OnEnter()
        {
            if (Enter != null)
            {
                changedPasswordEvent.handledEventArgs = false;
                if (OnPasswordVerify())
                {
                    Enter(this, EventArgs.Empty);
                }
                else
                {
                    ShowIncorrectPasswordDialog();
                }
            }
        }

        private void ShowIncorrectPasswordDialog()
        {
            Password = "";
            SelectedTextBox = passwordTextBox;
            MessageDialog.Show("Incorrect password. \nPlease retype your Password.", "", null);
        }

        void dlg_Result(object sender, DialogEventArgs e)
        {
            if (e.Result == DialogResult.Cancel)
            {
                ExitApplication();
            }
        }

        protected virtual void OnChangePassword()
        {
            if (ChangePassword != null)
            {
                if (!OnPasswordVerify())
                {
                    ShowIncorrectPasswordDialog();
                }
                else
                {
                    changedPasswordEvent.handledEventArgs = false;
                    ChangePassword(this, changedPasswordEvent);
                    if (!changedPasswordEvent.handledEventArgs)
                    {
                        MessageDialog.Show(
                            "Failure while encrypting the file: \nDecrypting with the password failed.\nPlease try another password.", null, "OK", Color.DarkRed);
                    }
                    else
                    {
                        Password = NewPassword;
                        NewPassword = ConfirmedPassword = "";
                        Mode = DisplayMode.Login;
                    }
                }
            }
        }

        public event EventHandler<HandledEventArgs> ChangePassword;
        public event EventHandler Enter;

        void textbox_TextChanged(object sender, EventArgs e)
        {
            EnsureEnterEnabled();
        }

        public void EnsureEnterEnabled()
        {
            numPad.Text = selectedTextBox.Text;

            if (mode == DisplayMode.Login)
            {
                numPad.Buttons[15].Enabled = true;
            }
            else
            {
                numPad.Buttons[15].Enabled = NewPassword == ConfirmedPassword;
            }
        }

        private PasswordEventArgs passwordVerfyEventArgs = new PasswordEventArgs();

        private bool OnPasswordVerify()
        {
            if (ConfirmPassword != null)
            {
                Host.Cursor = Cursors.WaitCursor;
                passwordVerfyEventArgs.handledEventArgs = false;
                passwordVerfyEventArgs.Password = Password;
                ConfirmPassword(this, passwordVerfyEventArgs);
                Host.Cursor = Cursors.Default;
                return passwordVerfyEventArgs.handledEventArgs;

            }
            else return false;
        }

        /// <summary>
        /// Occurs when the current password must be verified with the actual password.
        /// </summary>
        public event EventHandler<PasswordEventArgs> ConfirmPassword;

        void numPad_TextChanged(object sender, EventArgs e)
        {
            string text = numPad.Text;
            if (this.selectedTextBox.Text != text)
            {
                this.selectedTextBox.Text = text;
                selectedTextBox.Select(Password.Length, 0);
            }
        }


        protected override void OnSizeChanged(System.Drawing.Size oldSize, System.Drawing.Size newSize)
        {
            base.OnSizeChanged(oldSize, newSize);
            int w0 = Width;
            int h0 = Height;

            if (h0 > w0)
            {
                LayoutVertical(w0);
            }
            else
            {
                LayoutHorizontal(h0);
            }

        }

        private void LayoutHorizontal(int h0)
        {
            if (Controls.Count == 0) return;
            foreach (FluidControl c in Controls)
            {
                if (c.Anchor != AnchorStyles.None)
                {
                    c.Width = ScaleX(170);
                }
            }
            int l = passwordTextBox.Right + ScaleX(6);

            numPad.Bounds = new Rectangle(l, -2, Width - l + 1, h0 + 4);
        }

        private void LayoutVertical(int w0)
        {
            if (Controls.Count == 0) return;
            foreach (FluidControl c in Controls)
            {
                if (c.Anchor != AnchorStyles.None)
                {
                    c.Width = w0 - ScaleX(20);
                }
            }
            int top = this.confirmPasswordTextBox.Bottom + ScaleY(6);
            int hmax = numPad.ButtonHeight * 4;
            int l = -1;
            int h = Height - top - l;
            if (hmax < h)
            {
                h = hmax;
                top = Height - h - l;
            }
            else
            {
                top = Height - h - l;
            }
            numPad.Bounds = new Rectangle(l, top, Width - l - l, h + 1);
        }

    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Thomas Gerber
Software Developer (Senior)
Germany Germany
MCPD
Enterprise Application Developer 3.5
Windows Developer 3.5
.ASP.NET Developer 3.5
.NET 2.0 Windows Developer
.NET 2.0 Web Developer
.NET 2.0 Enterprise Application Developer
 

MCTS
.NET 3.5 Windows Forms Applications
.NET 3.5 ASP.NET Applications
.NET 3.5, ADO.NET Application Development
.NET 3.5 WCF
.NET 3.5 WPF
.NET 3.5 WF
Microsoft SQL Server 2008, Database Development
.NET 2.0 Windows Applications
.NET 2.0 Web Applications
.NET 2.0 Distributed Applications
SQL Server 2005
Sharepoint Services 3.0 Application Development
Windows Vista Client Configuration

| Advertise | Privacy | Mobile
Web04 | 2.8.140721.1 | Last Updated 12 Jan 2009
Article Copyright 2009 by Thomas Gerber
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid