Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

Catching keyboard meessages/input to a GTK(sharp) textview widget

Hi
I am trying to create a custom widget based on gtk textview (the gtk# bindings for C#). The purpose is to enable writing my local language Urdu in textview instead of English. I am unable to find how can I hack the keyboard input before it appears on screen (so I change the key values like a to ? and b to ? etc). I am a beginner so plz suggest me it this regards. Obviously I want to do it in c# (mono has Gdk.Keyboard, Gdk.Keymap and some other such classes, but I am unable to figure out a way to get the pressed key's value and change it before it is passed to textview buffer). At last here is the example my friend done in system.windows.forms textbox.
[code]using System;
using System.Drawing;
using System.Drawing.Design;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design;


namespace UrduCtrl
{
enum KeyboardStates
{
kbNormal=0,
kbShift=1,
kbCtrl=2,
kbAltGr=3
}

public class UrduTextPropertyEditor: UITypeEditor
{
// public override object EditValue(
// System.ComponentModel.ITypeDescriptorContext context,
// System.IServiceProvider provider, object value)
// {
// IWindowsFormsEditorService frmsvr = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
// if(frmsvr == null)
// return null;
//
// UrduTextPropertyEditorDlg dlg= new UrduTextPropertyEditorDlg();
// dlg.EditedText = (string) value;
//
// //dlg.ShowDialog();
// frmsvr.ShowDialog(dlg);
//
// return (string) dlg.EditedText;
// }

// public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
// {
// if (context!=null && provider!=null)
// {
// IWindowsFormsEditorService edSrv= (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
// if (edSrv!=null)
// {
// UrduTextPropertyEditorDlg dialog= new UrduTextPropertyEditorDlg();
// if (value is String)
// dialog.EditedText= (string)value;
// if (edSrv.ShowDialog(dialog)==System.Windows.Forms.DialogResult.OK)
// value= dialog.EditedText;
// dialog.Dispose();
// dialog= null;
// }
// }
// return value;
// }

public override System.Drawing.Design.UITypeEditorEditStyle
GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
// We will use a window for property editing.
return UITypeEditorEditStyle.Modal;
}

public override bool GetPaintValueSupported(
System.ComponentModel.ITypeDescriptorContext context)
{
// No special thumbnail will be shown for the grid.
return false;
}
}

///
/// Summary description for Class1.
///
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
public class UrduTextBox: System.Windows.Forms.TextBox
{
private int WM_CHAR = 0x102;
private int WM_KEYDOWN = 0x100;
private int WM_KEYUP = 0x101;
private bool m_bIsUrdu;
private KeyboardStates kbState;
private Hashtable UrduPhonetic;
private char charSingleQuote= Convert.ToChar(39);

public UrduTextBox()
{

this.Font = new System.Drawing.Font("Urdu Naskh Asiatype", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(178)));
this.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
//this.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
this.m_bIsUrdu= true;
kbState= KeyboardStates.kbNormal;


UrduPhonetic= new Hashtable();
UrduPhonetic['a']=new Key(0x0627, 0x0622, 0x0623);
UrduPhonetic['b']=new Key(0x0628, 0x0628);
UrduPhonetic['c']=new Key(0x0686, 0x062B);
UrduPhonetic['d']=new Key(0x062F, 0x0688);
UrduPhonetic['e']=new Key(0x0639, 0x0651);
UrduPhonetic['f']=new Key(0x0641, 0x64D);
UrduPhonetic['g']=new Key(0x06AF, 0x063A);
UrduPhonetic['h']=new Key(0x06BE, 0x062D);
UrduPhonetic['i']=new Key(0x06CC, 0x0670);
UrduPhonetic['j']=new Key(0x062C, 0x0636);
UrduPhonetic['k']=new Key(0x06A9, 0x062E);
UrduPhonetic['l']=new Key(0x0644, 0x0628);
UrduPhonetic['m']=new Key(0x0645, 0x64B);
UrduPhonetic['n']=new Key(0x0646, 0x06BA);
UrduPhonetic['o']=new Key(0x06C1, 0x06C3);
UrduPhonetic['p']=new Key(0x067E, 0x064F);
UrduPhonetic['q']=new Key(0x0642);
UrduPhonetic['r']=new Key(0x0631, 0x0691);
UrduPhonetic['s']=new Key(0x0633 , 0x0635);
UrduPhonetic['t']=new Key(0x062A , 0x0679);
UrduPhonetic['u']=new Key(0x0626 , 0x0621);
UrduPhonetic['v']=new Key(0x0637, 0x0638);
UrduPhonetic['w']=new Key(0x0648, 0x0624);
UrduPhonetic['x']=new Key(0x0634, 0x0698);
UrduPhonetic['y']=new Key(0x06D2, 0x06D2);
UrduPhonetic['z']=new Key(0x0632, 0x0630);
UrduPhonetic['0']=new Key(0x0030, Convert.ToInt16(')'));
UrduPhonetic['1']=new Key(0x0031, Convert.ToInt16('!'));
UrduPhonetic['2']=new Key(0x0032, Convert.ToInt16('@'));
UrduPhonetic['3']=new Key(0x0033, Convert.ToInt16('#'));
UrduPhonetic['4']=new Key(0x0034, Convert.ToInt16('$'));
UrduPhonetic['5']=new Key(0x0035, Convert.ToInt16('%'));
UrduPhonetic['6']=new Key(0x0036, Convert.ToInt16('^'));
UrduPhonetic['7']=new Key(0x0037, Convert.ToInt16('&'));
UrduPhonetic['8']=new Key(0x0038, Convert.ToInt16('*'));
UrduPhonetic['9']=new Key(0x0039, Convert.ToInt16('('));
UrduPhonetic['=']=new Key(0x03D, 0x02B);
UrduPhonetic['-']=new Key(0x002D, 0x0640);
UrduPhonetic[',']=new Key(0x060C, 0x064E);
UrduPhonetic['.']=new Key(0x06D4, 0x0650);
UrduPhonetic['/']=new Key(0x002F, 0x061F);
UrduPhonetic['\']=new Key(0x0674);
UrduPhonetic[';']=new Key(0x061B, 58);
UrduPhonetic['[']=new Key(0x64C);
UrduPhonetic[']']=new Key(0x0652);
UrduPhonetic[charSingleQuote]=new Key(0x2018, 0x201C);
UrduPhonetic['~']=new Key(0x2019, 0x201D);
UrduPhonetic[' ']=new Key(32, 0x200C);
UrduPhonetic['<']=new Key(0x064E);


}

protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CHAR)
{
if(kbState== KeyboardStates.kbCtrl)
{
if(m.WParam == (IntPtr) 32)
{
this.m_bIsUrdu= !(this.m_bIsUrdu);
m.WParam= (IntPtr) 0;
base.WndProc(ref m);
return;
}
}

if(m_bIsUrdu)
{
//MessageBox.Show("Test");
char strChar= (char) m.WParam;
strChar= Char.ToLower(strChar);

if (kbState== KeyboardStates.kbShift)
{
if (UrduPhonetic.ContainsKey(strChar))
{
m.WParam= (IntPtr) ((UrduCtrl.Key) UrduPhonetic[strChar]).shift;
}
}
else if (kbState== KeyboardStates.kbAltGr)
{
if (UrduPhonetic.ContainsKey(strChar))
{
m.WParam= (IntPtr) ((UrduCtrl.Key) UrduPhonetic[strChar]).altgr;
}
}
else if (kbState== KeyboardStates.kbNormal)
{
if (UrduPhonetic.ContainsKey(strChar))
{
m.WParam= (IntPtr) ((UrduCtrl.Key) UrduPhonetic[strChar]).normal;
}
}
}
}
else if (m.Msg == WM_KEYDOWN)
{
if((Control.ModifierKeys & Keys.Shift) == Keys.Shift )
{
this.kbState= KeyboardStates.kbShift;
}
else if(((Control.ModifierKeys & Keys.Control) == Keys.Control) && (((Control.ModifierKeys & Keys.Alt) == Keys.Alt)))
{
this.kbState= KeyboardStates.kbAltGr;
char strChar= (char) m.WParam;
strChar= Char.ToLower(strChar);
}
else if((Control.ModifierKeys & Keys.Control) == Keys.Control )
{
this.kbState= KeyboardStates.kbCtrl;
}
}
else if (m.Msg == WM_KEYUP)
{
if(kbState == KeyboardStates.kbAltGr)
{
if(!(((Control.ModifierKeys & Keys.Control) == Keys.Control) && (((Control.ModifierKeys & Keys.Alt) == Keys.Alt))))
{
this.kbState= KeyboardStates.kbNormal;
}
}
else if(kbState == KeyboardStates.kbCtrl)
{
if((Control.ModifierKeys & Keys.Control) != Keys.Control )
{
this.kbState= KeyboardStates.kbNormal;
}
}
else if(kbState == KeyboardStates.kbShift)
{
if((Control.ModifierKeys & Keys.Shift) != Keys.Shift)
{
this.kbState= KeyboardStates.kbNormal;
}
}
}
base.WndProc(ref m);
}


[Category("Appearance"),
Description("Text property for Urdu edit control."),
Editor(typeof(UrduTextPropertyEditor), typeof(UITypeEditor))]
public override string Text
{
get
{
return(base.Text);
}
set
{
base.Text = value;
this.Invalidate();
}
}
}
}[/code]
Regards
Sign In or Register to comment.