2011-01-30 23:06:43 +00:00
using System ;
using System.Drawing ;
using System.Collections.Generic ;
using System.Windows.Forms ;
2011-07-09 21:55:14 +00:00
using System.Runtime.InteropServices ;
2012-09-10 17:49:33 +00:00
using System.Text ;
2011-01-30 23:06:43 +00:00
namespace BizHawk.MultiClient
{
2011-06-19 02:17:27 +00:00
public class InputWidget : TextBox
{
2011-07-09 17:50:52 +00:00
//TODO: when binding, make sure that the new key combo is not in one of the other bindings
2011-07-09 16:12:56 +00:00
int MaxBind = 4 ; //Max number of bindings allowed
2011-07-09 17:50:52 +00:00
int pos = 0 ; //Which mapping the widget will listen for
2011-07-09 16:12:56 +00:00
private Timer timer = new Timer ( ) ;
public bool AutoTab = true ;
string [ ] Bindings = new string [ 4 ] ;
string wasPressed = "" ;
2011-07-09 23:03:42 +00:00
ToolTip tooltip1 = new ToolTip ( ) ;
public string ButtonName ;
2012-09-10 17:49:33 +00:00
Color _highlight_color = Color . LightCyan ;
Color _no_highlight_color = SystemColors . Window ;
private void Highlight ( )
{
BackColor = _highlight_color ;
}
private void UnHighlight ( )
{
BackColor = _no_highlight_color ;
}
private List < KeyValuePair < string , string > > ConflictLookup = new List < KeyValuePair < string , string > > ( ) ;
2011-07-09 23:03:42 +00:00
2011-07-09 21:55:14 +00:00
[DllImport("user32")]
private static extern bool HideCaret ( IntPtr hWnd ) ;
2011-07-09 16:12:56 +00:00
public InputWidget ( )
2011-06-19 02:17:27 +00:00
{
this . ContextMenu = new ContextMenu ( ) ;
2011-07-09 16:12:56 +00:00
this . timer . Tick + = new System . EventHandler ( this . Timer_Tick ) ;
InitializeBindings ( ) ;
2011-07-09 23:03:42 +00:00
tooltip1 . AutoPopDelay = 2000 ;
2011-06-19 02:17:27 +00:00
}
2011-01-30 23:06:43 +00:00
2012-09-10 17:49:33 +00:00
public InputWidget ( List < KeyValuePair < string , string > > conflictList )
2011-07-09 16:12:56 +00:00
{
this . ContextMenu = new ContextMenu ( ) ;
this . timer . Tick + = new System . EventHandler ( this . Timer_Tick ) ;
InitializeBindings ( ) ;
2011-07-09 23:03:42 +00:00
tooltip1 . AutoPopDelay = 2000 ;
2012-09-10 17:49:33 +00:00
ConflictLookup = conflictList ;
2011-07-09 23:03:42 +00:00
}
2012-09-10 17:49:33 +00:00
public InputWidget ( int maxBindings )
2011-07-09 23:03:42 +00:00
{
2012-09-10 17:49:33 +00:00
this . ContextMenu = new ContextMenu ( ) ;
this . timer . Tick + = new System . EventHandler ( this . Timer_Tick ) ;
MaxBind = maxBindings ;
Bindings = new string [ MaxBind ] ;
InitializeBindings ( ) ;
tooltip1 . AutoPopDelay = 2000 ;
2011-07-09 23:03:42 +00:00
}
2012-09-10 17:49:33 +00:00
public void SetConflictList ( List < KeyValuePair < string , string > > conflictLookup )
2011-07-09 23:03:42 +00:00
{
2012-09-10 17:49:33 +00:00
ConflictLookup = conflictLookup ;
2011-07-09 23:03:42 +00:00
}
protected override void OnMouseClick ( MouseEventArgs e )
{
HideCaret ( this . Handle ) ;
base . OnMouseClick ( e ) ;
2011-07-09 16:12:56 +00:00
}
2011-01-30 23:06:43 +00:00
2011-07-09 16:12:56 +00:00
private void InitializeBindings ( )
{
for ( int x = 0 ; x < MaxBind ; x + + )
{
Bindings [ x ] = "" ;
}
}
2011-07-07 16:48:29 +00:00
2011-07-09 16:12:56 +00:00
protected override void OnEnter ( EventArgs e )
{
2011-07-09 17:50:52 +00:00
pos = 0 ;
2011-07-09 16:12:56 +00:00
timer . Start ( ) ;
2011-07-09 22:09:39 +00:00
//Input.Update();
//zero: ??? what is this all about ???
2012-11-09 20:03:59 +00:00
wasPressed = Input . Instance . GetNextBindEvent ( ) ;
2011-07-09 16:12:56 +00:00
}
protected override void OnLeave ( EventArgs e )
{
timer . Stop ( ) ;
UpdateLabel ( ) ;
base . OnLeave ( e ) ;
}
2011-07-07 16:48:29 +00:00
2011-07-09 16:12:56 +00:00
private void Timer_Tick ( object sender , EventArgs e )
{
ReadKeys ( ) ;
}
2011-07-07 16:48:29 +00:00
2012-09-17 22:43:42 +00:00
public void EraseMappings ( )
{
ClearBindings ( ) ;
HideConflicts ( ) ;
Text = "" ;
}
2011-07-09 16:12:56 +00:00
private void ReadKeys ( )
2011-06-19 02:17:27 +00:00
{
2011-07-09 22:09:39 +00:00
Input . Instance . Update ( ) ;
2012-11-09 20:03:59 +00:00
string TempBindingStr = Input . Instance . GetNextBindEvent ( ) ;
2012-10-01 01:55:08 +00:00
if ( wasPressed ! = "" & & TempBindingStr = = wasPressed )
{
return ;
}
else if ( TempBindingStr ! = null )
2011-06-19 02:17:27 +00:00
{
2011-07-09 16:12:56 +00:00
if ( TempBindingStr = = "Escape" )
{
ClearBindings ( ) ;
2012-09-17 02:20:01 +00:00
HideConflicts ( ) ;
2011-07-09 16:12:56 +00:00
Increment ( ) ;
return ;
}
if ( TempBindingStr = = "Alt+F4" )
return ;
2011-07-09 18:24:53 +00:00
if ( ! IsDuplicate ( TempBindingStr ) )
{
Bindings [ pos ] = TempBindingStr ;
}
2011-07-09 21:55:14 +00:00
wasPressed = TempBindingStr ;
2012-09-10 17:49:33 +00:00
DoConflictCheck ( ) ;
2011-07-09 21:55:14 +00:00
UpdateLabel ( ) ;
Increment ( ) ;
2011-07-09 18:24:53 +00:00
}
}
2012-09-10 17:49:33 +00:00
private string Conflicts = "" ;
private void DoConflictCheck ( )
{
StringBuilder conflicts = new StringBuilder ( ) ; ;
foreach ( KeyValuePair < string , string > conflict in ConflictLookup )
{
foreach ( string binding in Bindings )
{
if ( conflict . Key = = binding )
{
conflicts . Append ( binding ) ;
conflicts . Append ( " conflicts with Hotkey - " ) ; //Ideally we don't hardcode Hotkey, we may want to check mappings on specific controllers or unforeseen things
conflicts . Append ( conflict . Value ) ;
conflicts . Append ( '\n' ) ;
}
}
}
Conflicts = conflicts . ToString ( ) ;
if ( String . IsNullOrWhiteSpace ( Conflicts ) )
{
HideConflicts ( ) ;
}
else
{
ShowConflicts ( ) ;
}
}
private void ShowConflicts ( )
{
_no_highlight_color = Color . LightCoral ;
_highlight_color = Color . Violet ;
tooltip1 . SetToolTip ( this , Conflicts ) ;
}
private void HideConflicts ( )
{
_highlight_color = Color . LightCyan ;
_no_highlight_color = SystemColors . Window ;
tooltip1 . SetToolTip ( this , "" ) ;
}
//Checks if the key is already mapped to this widget
private bool IsDuplicate ( string binding )
2011-07-09 18:24:53 +00:00
{
for ( int x = 0 ; x < MaxBind ; x + + )
{
if ( Bindings [ x ] = = binding )
return true ;
2011-06-19 02:17:27 +00:00
}
2011-07-09 18:24:53 +00:00
return false ;
2011-07-09 16:12:56 +00:00
}
protected override void OnKeyUp ( KeyEventArgs e )
{
if ( e . KeyCode = = Keys . F4 & & e . Modifiers = = Keys . Alt )
2011-06-19 02:17:27 +00:00
{
2011-07-09 16:12:56 +00:00
base . OnKeyUp ( e ) ;
2011-06-19 02:17:27 +00:00
}
2011-07-09 16:12:56 +00:00
wasPressed = "" ;
2011-06-19 02:17:27 +00:00
}
2011-01-30 23:06:43 +00:00
2011-06-19 02:17:27 +00:00
protected override void OnKeyDown ( KeyEventArgs e )
{
2011-07-09 16:12:56 +00:00
if ( e . KeyCode = = Keys . F4 & & e . Modifiers = = Keys . Alt )
2011-06-19 02:17:27 +00:00
{
2011-07-09 16:12:56 +00:00
base . OnKeyDown ( e ) ;
2012-01-08 23:01:14 +00:00
return ;
2011-06-19 02:17:27 +00:00
}
2011-07-09 16:12:56 +00:00
e . Handled = true ;
}
2011-07-05 01:48:48 +00:00
2011-07-09 16:12:56 +00:00
// Advances to the next widget or the next binding depending on the autotab setting
2011-07-09 22:22:45 +00:00
public void Increment ( )
2011-07-09 16:12:56 +00:00
{
2011-07-04 23:02:37 +00:00
if ( AutoTab )
this . Parent . SelectNextControl ( this , true , true , true , true ) ;
2011-07-09 17:50:52 +00:00
else
{
if ( pos = = MaxBind - 1 )
2011-07-09 22:22:45 +00:00
pos = 0 ;
2011-07-09 17:50:52 +00:00
else
2011-07-09 22:22:45 +00:00
pos + + ;
2011-07-23 19:43:08 +00:00
UpdateLabel ( ) ;
2011-07-09 22:22:45 +00:00
}
}
public void Decrement ( )
{
if ( AutoTab )
this . Parent . SelectNextControl ( this , false , true , true , true ) ;
else
{
if ( pos = = 0 )
pos = MaxBind - 1 ;
else
pos - - ;
2011-07-09 17:50:52 +00:00
}
2011-06-19 02:17:27 +00:00
}
2011-01-30 23:06:43 +00:00
2011-07-09 16:12:56 +00:00
public void ClearBindings ( )
2011-06-19 03:35:57 +00:00
{
2012-09-17 02:20:01 +00:00
for ( int i = 0 ; i < MaxBind ; i + + )
{
Bindings [ i ] = "" ;
}
2011-07-09 16:12:56 +00:00
}
public void UpdateLabel ( )
{
Text = "" ;
for ( int x = 0 ; x < MaxBind ; x + + )
2011-06-19 03:35:57 +00:00
{
2011-07-09 16:12:56 +00:00
if ( Bindings [ x ] . Length > 0 )
2011-06-19 03:35:57 +00:00
{
2011-07-09 16:12:56 +00:00
Text + = Bindings [ x ] ;
if ( x < MaxBind - 1 & & Bindings [ x + 1 ] . Length > 0 )
Text + = ", " ;
2011-06-19 03:35:57 +00:00
}
}
2011-07-09 16:12:56 +00:00
}
public void SetBindings ( string bindingsString )
{
Text = "" ;
ClearBindings ( ) ;
string str = bindingsString . Trim ( ) ;
int x ;
for ( int i = 0 ; i < MaxBind ; i + + )
2011-06-19 03:35:57 +00:00
{
2011-07-09 16:12:56 +00:00
str = str . Trim ( ) ;
x = str . IndexOf ( ',' ) ;
if ( x < 0 )
2011-06-19 03:35:57 +00:00
{
2011-07-09 16:12:56 +00:00
Bindings [ i ] = str ;
str = "" ;
2011-06-19 03:35:57 +00:00
}
else
{
2011-07-09 16:12:56 +00:00
Bindings [ i ] = str . Substring ( 0 , x ) ;
str = str . Substring ( x + 1 , str . Length - x - 1 ) ;
2011-06-19 03:35:57 +00:00
}
}
2011-07-09 16:12:56 +00:00
UpdateLabel ( ) ;
2011-06-19 03:35:57 +00:00
}
2011-06-19 02:17:27 +00:00
protected override void OnKeyPress ( KeyPressEventArgs e )
{
e . Handled = true ;
}
2011-01-30 23:06:43 +00:00
2011-07-09 22:07:13 +00:00
protected override void WndProc ( ref Message m )
{
switch ( m . Msg )
{
case 0x0201 : //WM_LBUTTONDOWN
{
this . Focus ( ) ;
return ;
}
//case 0x0202://WM_LBUTTONUP
//{
// return;
//}
case 0x0203 : //WM_LBUTTONDBLCLK
{
return ;
}
case 0x0204 : //WM_RBUTTONDOWN
{
return ;
}
case 0x0205 : //WM_RBUTTONUP
{
return ;
}
case 0x0206 : //WM_RBUTTONDBLCLK
{
return ;
}
}
base . WndProc ( ref m ) ;
2011-07-09 22:22:45 +00:00
}
protected override void OnMouseWheel ( MouseEventArgs e )
{
if ( e . Delta > 0 )
Decrement ( ) ;
else
Increment ( ) ;
base . OnMouseWheel ( e ) ;
}
2011-07-09 22:07:13 +00:00
2011-06-19 02:17:27 +00:00
protected override void OnGotFocus ( EventArgs e )
{
2011-07-09 21:55:14 +00:00
//base.OnGotFocus(e);
HideCaret ( this . Handle ) ;
2012-09-10 17:49:33 +00:00
Highlight ( ) ;
2011-06-19 02:17:27 +00:00
}
2011-01-30 23:06:43 +00:00
2011-06-19 02:17:27 +00:00
protected override void OnLostFocus ( EventArgs e )
{
2012-09-10 17:49:33 +00:00
UnHighlight ( ) ;
2011-06-19 02:17:27 +00:00
base . OnLostFocus ( e ) ;
}
2011-02-23 21:30:11 +00:00
2011-06-19 02:17:27 +00:00
protected override bool ProcessCmdKey ( ref Message msg , Keys keyData )
{
2012-01-08 23:01:14 +00:00
if ( keyData . ToString ( ) = = "F4" | | keyData . ToString ( ) . Contains ( "Alt" ) )
return false ;
else
return true ;
2011-06-19 02:17:27 +00:00
}
}
2011-01-30 23:06:43 +00:00
}