diff options
Diffstat (limited to 'qtsharp/src/bindings/static/QtSlot.cs')
-rw-r--r-- | qtsharp/src/bindings/static/QtSlot.cs | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/qtsharp/src/bindings/static/QtSlot.cs b/qtsharp/src/bindings/static/QtSlot.cs new file mode 100644 index 00000000..6bf14da8 --- /dev/null +++ b/qtsharp/src/bindings/static/QtSlot.cs @@ -0,0 +1,284 @@ +// QtSlot.cs - Represents C# slot connections +// +// Copyright (C) 2002 Nick Zigarovich (nick@chemlab.org) +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +namespace Qt { + using System; + using System.Reflection; + using System.Text; + + internal class QtSlot { + protected QObject receiver; + protected string slot; + private string name; + private string args; + protected MethodInfo slotInfo; + private IntPtr wrapperPtr; + private Delegate callback; + + public QObject Receiver { + get { return receiver; } + } + + public string Slot { + get { return slot; } + } + + public MethodInfo Info { + get { return slotInfo; } + } + + public string Identifier { + get { return receiver.RawObject.ToString()+slot; } + } + + public string Name { + get { return name; } + } + + public string Args { + get { return args; } + } + + public string NormalizedArgs { + get { return NormalizeSlotArgs(args); } + } + + public IntPtr WrapperPtr { + get { return wrapperPtr; } + set { wrapperPtr = value; } + } + + public Delegate Callback { + get { return callback; } + set { callback = value; } + } + + public bool IsCSharpSlot { + get { return slotInfo != null; } + } + + public QtSlot() {} + + public QtSlot(QObject receiver, string slot) + { + this.receiver = receiver; + this.slot = slot; + string[] slotsplit = slot.Split(new char[] {'('}); + + try { + name = slotsplit[0]; + args = "("+slotsplit[1]; + } + catch (IndexOutOfRangeException) { + throw new ArgumentException ("Invalid slot format: " + slot); + } + + slotInfo = LookupSlot(receiver, name, NormalizedArgs); + wrapperPtr = IntPtr.Zero; + callback = null; + } + + public void SlotBridge_QString (IntPtr value0) + { + QString csvalue0 = QtSupport.LookupObject (value0, typeof (QString)) as QString; + + Invoke (new object[] {csvalue0}); + } + + public void SlotBridge_QDockWindow (IntPtr value0) + { + QDockWindow csvalue0 = QtSupport.LookupObject (value0, typeof (QDockWindow)) as QDockWindow; + + Invoke (new object[] {csvalue0}); + } + + public void SlotBridge_QDropEvent (IntPtr value0) + { + QDropEvent csvalue0 = QtSupport.LookupObject (value0, typeof (QDropEvent)) as QDropEvent; + + Invoke (new object[] {csvalue0}); + } + + public void SlotBridge_QDropEventQListViewItem (IntPtr value0, IntPtr value1) + { + QDropEvent csvalue0 = QtSupport.LookupObject (value0, typeof (QDropEvent)) as QDropEvent; + QListViewItem csvalue1 = QtSupport.LookupObject (value1, typeof (QListViewItem)) as QListViewItem; + + Invoke (new object[] {csvalue0, csvalue1}); + } + + public void SlotBridge_QIconViewItem (IntPtr value0) + { + QIconViewItem csvalue0 = QtSupport.LookupObject (value0, typeof (QIconViewItem)) as QIconViewItem; + + Invoke (new object[] {csvalue0}); + } + + public void SlotBridge_QListBoxItem (IntPtr value0) + { + QListBoxItem csvalue0 = QtSupport.LookupObject (value0, typeof (QListBoxItem)) as QListBoxItem; + + Invoke (new object[] {csvalue0}); + } + + public void SlotBridge_QListViewItem (IntPtr value0) + { + QListViewItem csvalue0 = QtSupport.LookupObject (value0, typeof (QListViewItem)) as QListViewItem; + + Invoke (new object[] {csvalue0}); + } + + public void SlotBridge_QListViewItemQListViewItem (IntPtr value0, IntPtr value1) + { + QListViewItem csvalue0 = QtSupport.LookupObject (value0, typeof (QListViewItem)) as QListViewItem; + QListViewItem csvalue1 = QtSupport.LookupObject (value1, typeof (QListViewItem)) as QListViewItem; + + Invoke (new object[] {csvalue0, csvalue1}); + } + + public void SlotBridge_QListViewItemQListViewItemQListViewItem (IntPtr value0, IntPtr value1, IntPtr value2) + { + QListViewItem csvalue0 = QtSupport.LookupObject (value0, typeof (QListViewItem)) as QListViewItem; + QListViewItem csvalue1 = QtSupport.LookupObject (value1, typeof (QListViewItem)) as QListViewItem; + QListViewItem csvalue2 = QtSupport.LookupObject (value2, typeof (QListViewItem)) as QListViewItem; + + Invoke (new object[] {csvalue0, csvalue1, csvalue2}); + } + + public void SlotBridge_QNetworkOperation (IntPtr value0) + { + QNetworkOperation csvalue0 = QtSupport.LookupObject (value0, typeof (QNetworkOperation)) as QNetworkOperation; + + Invoke (new object[] {csvalue0}); + } + + public void SlotBridge_QObject (IntPtr value0) + { + QObject csvalue0 = QtSupport.LookupObject (value0, typeof (QObject)) as QObject; + + Invoke (new object[] {csvalue0}); + } + + public void SlotBridge_QToolBar (IntPtr value0) + { + QToolBar csvalue0 = QtSupport.LookupObject (value0, typeof (QToolBar)) as QToolBar; + + Invoke (new object[] {csvalue0}); + } + + public void SlotBridge_QWidget (IntPtr value0) + { + QWidget csvalue0 = QtSupport.LookupObject (value0, typeof (QWidget)) as QWidget; + + Invoke (new object[] {csvalue0}); + } + + public void SlotBridge_intQIconViewItem (int value0, IntPtr value1) + { + QIconViewItem csvalue1 = QtSupport.LookupObject (value1, typeof (QIconViewItem)) as QIconViewItem; + + Invoke (new object[] {value0, csvalue1}); + } + + public void SlotBridge_intQListBoxItem (int value0, IntPtr value1) + { + QListBoxItem csvalue1 = QtSupport.LookupObject (value1, typeof (QListBoxItem)) as QListBoxItem; + + Invoke (new object[] {value0, csvalue1}); + } + + public void Invoke(object[] args) + { + if (slotInfo != null) { + slotInfo.Invoke(receiver, args); + } + } + + private static MethodInfo LookupSlot(QObject receiver, string name, string args) + { + MethodInfo ret = null; + + foreach (MethodInfo info in receiver.GetType().GetMethods( + BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance )) + { + string infoargs = "(" + ShortArgs (info.ToString().Split(new char[] {'('})[1].Replace(" ", "")) + ")"; + string nargs = args.Replace ("string", "String"); // FIXME + + if (nargs.CompareTo(infoargs) == 0 && + name.CompareTo(info.Name) == 0) + { + ret = info; + break; + } + } + + return ret; + } + + private static string ShortArgs (string args) + { + StringBuilder builder = new StringBuilder (); + string [] s = args.TrimEnd (')').Split (','); + foreach (string st in s) { + string [] str = st.Trim (' ').Split ('.'); + string stri = str [str.Length -1]; + builder.Append (stri+", "); + } + return builder.ToString ().TrimEnd (',', ' '); + } + + private static string NormalizeSlotArgs(string methodargs) + { + string[] args = methodargs.Replace("(", "").Replace(")", "").Split(new char[] {','}); + StringBuilder sb = new StringBuilder(); + sb.Append("("); + int count = 0; + + // FIXME Handle unsigned, bool, and byte cases. Would lookups in a hashtable be faster? + foreach (string arg in args) { + if (count > 0) sb.Append(","); + + if (arg == "short") + sb.Append("Int16"); + else if (arg == "int") + sb.Append("Int32"); + else if (arg == "long") + sb.Append("Int64"); + else if (arg == "float") + sb.Append("Single"); + else if (arg == "double") + sb.Append("Double"); + else if (arg == "char") + sb.Append("Char"); + else + sb.Append(arg); + + count++; + } + + sb.Append(")"); + return sb.ToString(); + } + + // For ArrayList storage. + public override bool Equals(object obj) + { + return ((QtSlot)obj).Identifier == Identifier; + } + } +} |