You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebindings/qtsharp/src/bindings/static/QtSlot.cs

285 lines
7.8 KiB

// 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 TQObject receiver;
protected string slot;
private string name;
private string args;
protected MethodInfo slotInfo;
private IntPtr wrapperPtr;
private Delegate callback;
public TQObject 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(TQObject 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)
{
TQString csvalue0 = QtSupport.LookupObject (value0, typeof (TQString)) as TQString;
Invoke (new object[] {csvalue0});
}
public void SlotBridge_QDockWindow (IntPtr value0)
{
TQDockWindow csvalue0 = QtSupport.LookupObject (value0, typeof (TQDockWindow)) as TQDockWindow;
Invoke (new object[] {csvalue0});
}
public void SlotBridge_QDropEvent (IntPtr value0)
{
TQDropEvent csvalue0 = QtSupport.LookupObject (value0, typeof (TQDropEvent)) as TQDropEvent;
Invoke (new object[] {csvalue0});
}
public void SlotBridge_QDropEventQListViewItem (IntPtr value0, IntPtr value1)
{
TQDropEvent csvalue0 = QtSupport.LookupObject (value0, typeof (TQDropEvent)) as TQDropEvent;
TQListViewItem csvalue1 = QtSupport.LookupObject (value1, typeof (TQListViewItem)) as TQListViewItem;
Invoke (new object[] {csvalue0, csvalue1});
}
public void SlotBridge_QIconViewItem (IntPtr value0)
{
TQIconViewItem csvalue0 = QtSupport.LookupObject (value0, typeof (TQIconViewItem)) as TQIconViewItem;
Invoke (new object[] {csvalue0});
}
public void SlotBridge_QListBoxItem (IntPtr value0)
{
TQListBoxItem csvalue0 = QtSupport.LookupObject (value0, typeof (TQListBoxItem)) as TQListBoxItem;
Invoke (new object[] {csvalue0});
}
public void SlotBridge_QListViewItem (IntPtr value0)
{
TQListViewItem csvalue0 = QtSupport.LookupObject (value0, typeof (TQListViewItem)) as TQListViewItem;
Invoke (new object[] {csvalue0});
}
public void SlotBridge_QListViewItemQListViewItem (IntPtr value0, IntPtr value1)
{
TQListViewItem csvalue0 = QtSupport.LookupObject (value0, typeof (TQListViewItem)) as TQListViewItem;
TQListViewItem csvalue1 = QtSupport.LookupObject (value1, typeof (TQListViewItem)) as TQListViewItem;
Invoke (new object[] {csvalue0, csvalue1});
}
public void SlotBridge_QListViewItemQListViewItemQListViewItem (IntPtr value0, IntPtr value1, IntPtr value2)
{
TQListViewItem csvalue0 = QtSupport.LookupObject (value0, typeof (TQListViewItem)) as TQListViewItem;
TQListViewItem csvalue1 = QtSupport.LookupObject (value1, typeof (TQListViewItem)) as TQListViewItem;
TQListViewItem csvalue2 = QtSupport.LookupObject (value2, typeof (TQListViewItem)) as TQListViewItem;
Invoke (new object[] {csvalue0, csvalue1, csvalue2});
}
public void SlotBridge_QNetworkOperation (IntPtr value0)
{
TQNetworkOperation csvalue0 = QtSupport.LookupObject (value0, typeof (TQNetworkOperation)) as TQNetworkOperation;
Invoke (new object[] {csvalue0});
}
public void SlotBridge_QObject (IntPtr value0)
{
TQObject csvalue0 = QtSupport.LookupObject (value0, typeof (TQObject)) as TQObject;
Invoke (new object[] {csvalue0});
}
public void SlotBridge_QToolBar (IntPtr value0)
{
TQToolBar csvalue0 = QtSupport.LookupObject (value0, typeof (TQToolBar)) as TQToolBar;
Invoke (new object[] {csvalue0});
}
public void SlotBridge_QWidget (IntPtr value0)
{
TQWidget csvalue0 = QtSupport.LookupObject (value0, typeof (TQWidget)) as TQWidget;
Invoke (new object[] {csvalue0});
}
public void SlotBridge_intQIconViewItem (int value0, IntPtr value1)
{
TQIconViewItem csvalue1 = QtSupport.LookupObject (value1, typeof (TQIconViewItem)) as TQIconViewItem;
Invoke (new object[] {value0, csvalue1});
}
public void SlotBridge_intQListBoxItem (int value0, IntPtr value1)
{
TQListBoxItem csvalue1 = QtSupport.LookupObject (value1, typeof (TQListBoxItem)) as TQListBoxItem;
Invoke (new object[] {value0, csvalue1});
}
public void Invoke(object[] args)
{
if (slotInfo != null) {
slotInfo.Invoke(receiver, args);
}
}
private static MethodInfo LookupSlot(TQObject 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;
}
}
}