diff options
-rw-r--r-- | mcs/class/PresentationFramework/ChangeLog | 7 | ||||
-rw-r--r-- | mcs/class/PresentationFramework/Mono.Windows.Serialization/ObjectWriter.cs | 136 | ||||
-rw-r--r-- | mcs/class/PresentationFramework/PresentationFramework.dll.sources | 1 | ||||
-rw-r--r-- | mcs/tools/xamlc/ChangeLog | 6 | ||||
-rw-r--r-- | mcs/tools/xamlc/README | 3 | ||||
-rw-r--r-- | mcs/tools/xamlc/demo/Makefile | 7 | ||||
-rw-r--r-- | mcs/tools/xamlc/demo/runtimetest.cs | 14 | ||||
-rw-r--r-- | mcs/tools/xamlc/demo/runtimetest.xaml | 12 |
8 files changed, 186 insertions, 0 deletions
diff --git a/mcs/class/PresentationFramework/ChangeLog b/mcs/class/PresentationFramework/ChangeLog index ebdb2d7bb4e..e10b953e243 100644 --- a/mcs/class/PresentationFramework/ChangeLog +++ b/mcs/class/PresentationFramework/ChangeLog @@ -1,5 +1,12 @@ 2005-07-08 Iain McCoy <iain@mccoy.id.au> + * Mono.Windows.Serialization/ObjectWriter.cs: code to build objects at + runtime from a xaml file. Current problems are with events and + delegates (current behaviour is untested and possibly useless) and + DependencyProperties (not implemented yet) + +2005-07-08 Iain McCoy <iain@mccoy.id.au> + * Mono.Windows.Serialization/XamlParser.cs, Mono.Windows.Serialization/XamlWriter.cs, Mono.Windows.Serialization/CodeWriter.cs: removed TypeConverter diff --git a/mcs/class/PresentationFramework/Mono.Windows.Serialization/ObjectWriter.cs b/mcs/class/PresentationFramework/Mono.Windows.Serialization/ObjectWriter.cs new file mode 100644 index 00000000000..e4a13f8a56f --- /dev/null +++ b/mcs/class/PresentationFramework/Mono.Windows.Serialization/ObjectWriter.cs @@ -0,0 +1,136 @@ +// +// CodeWriter.cs +// +// Author: +// Iain McCoy (iain@mccoy.id.au) +// +// (C) 2005 Iain McCoy +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Reflection; +using System.IO; +using System.Collections; +using System.CodeDom; +using System.CodeDom.Compiler; +using System.Windows.Serialization; + +namespace Mono.Windows.Serialization { + public class ObjectWriter : XamlWriter { + public object instance; + ArrayList objects = new ArrayList(); + + public void CreateTopLevel(Type parent, string className) + { + instance = Activator.CreateInstance(parent); + objects.Add(instance); + } + + public void CreateObject(Type type, string varName) + { + Object o = Activator.CreateInstance(type); + ((IAddChild)objects[objects.Count - 1]).AddChild(o); + objects.Add(o); + } + + public void CreateProperty(PropertyInfo property) + { + objects.Add(property); + } + + // top of stack is a reference to an object + // pushes a reference to the event + public void CreateEvent(EventInfo evt) + { + objects.Add(evt); + } + + public void CreateDependencyProperty(Type attachedTo, string propertyName, Type propertyType) + { + throw new NotImplementedException(); + } + + public void EndDependencyProperty() + { + throw new NotImplementedException(); + } + + public void CreateElementText(string text) + { + ((IAddChild)objects[objects.Count - 1]).AddText(text); + } + + // top of stack is reference to an event + public void CreateEventDelegate(string functionName, Type eventDelegateType) + { + EventInfo e = (EventInfo)objects[objects.Count-1]; + object o = objects[objects.Count-2]; + e.AddEventHandler(o, Delegate.CreateDelegate(o.GetType(), o, functionName)); + } + // top of stack is reference to a property + public void CreatePropertyDelegate(string functionName, Type propertyType) + { + PropertyInfo p = (PropertyInfo)objects[objects.Count-1]; + object o = objects[objects.Count-2]; + p.SetValue(o, Delegate.CreateDelegate(o.GetType(), o, functionName), null); + } + + public void CreatePropertyText(string text, Type propertyType) + { + if (propertyType != typeof(string)) + throw new NotImplementedException(); + PropertyInfo p = (PropertyInfo)objects[objects.Count-1]; + object o = objects[objects.Count-2]; + p.SetValue(o, text, null); + } + + // top of stack is reference to an attached property + public void CreateDependencyPropertyText(string text, Type propertyType) + { + throw new NotImplementedException(); + } + + public void EndObject() + { + objects.RemoveAt(objects.Count - 1); + } + + public void EndProperty() + { + objects.RemoveAt(objects.Count - 1); + } + + public void EndEvent() + { + objects.RemoveAt(objects.Count - 1); + } + + public void Finish() + { + } + + public void CreateCode(string code) + { + throw new NotImplementedException(); + } + } +} diff --git a/mcs/class/PresentationFramework/PresentationFramework.dll.sources b/mcs/class/PresentationFramework/PresentationFramework.dll.sources index 441e473e613..a39ed38938a 100644 --- a/mcs/class/PresentationFramework/PresentationFramework.dll.sources +++ b/mcs/class/PresentationFramework/PresentationFramework.dll.sources @@ -2,6 +2,7 @@ System.Windows.Serialization/IAddChild.cs System.Windows.Serialization/Mapper.cs System.Windows.Serialization/NamespaceMapEntry.cs Mono.Windows.Serialization/CodeWriter.cs +Mono.Windows.Serialization/ObjectWriter.cs Mono.Windows.Serialization/Exceptions.cs Mono.Windows.Serialization/XamlParser.cs Mono.Windows.Serialization/XamlWriter.cs diff --git a/mcs/tools/xamlc/ChangeLog b/mcs/tools/xamlc/ChangeLog index f757c0e7662..05f44e677dd 100644 --- a/mcs/tools/xamlc/ChangeLog +++ b/mcs/tools/xamlc/ChangeLog @@ -1,5 +1,11 @@ 2005-07-06 Iain McCoy <iain@mccoy.id.au> + * demo/runtimetest.xaml + demo/runtimetest.cs, + demo/Makefile: creation of objects at runtime from a xaml file + +2005-07-06 Iain McCoy <iain@mccoy.id.au> + * demo/test.xaml: add use of x:Name attribute 2005-07-06 Iain McCoy <iain@mccoy.id.au> diff --git a/mcs/tools/xamlc/README b/mcs/tools/xamlc/README index 46a40e0045b..33f0b33f419 100644 --- a/mcs/tools/xamlc/README +++ b/mcs/tools/xamlc/README @@ -41,3 +41,6 @@ Bye Bye Hopefully you can work out how that is produced from the test.xaml file. + +In the same directory, "make run2" should demonstrate the runtime creation of +objects from xaml files. diff --git a/mcs/tools/xamlc/demo/Makefile b/mcs/tools/xamlc/demo/Makefile index 1c925b6c497..2d0591ced3d 100644 --- a/mcs/tools/xamlc/demo/Makefile +++ b/mcs/tools/xamlc/demo/Makefile @@ -10,6 +10,10 @@ run: $(CSCOMPILE) -r:TestVocab.dll -o test.exe test.xaml.out.cs $(RUNTIME) --debug test.exe +run2: + make runtimetest.exe + $(RUNTIME) --debug runtimetest.exe + clean-local: rm -f TestVocab.dll test.xaml.out.cs @@ -18,3 +22,6 @@ all-local: TestVocab.dll TestVocab.dll: $(SOURCES) $(CSCOMPILE) -r:PresentationFramework.dll -r:WindowsBase.dll -out:TestVocab.dll -target:library $(SOURCES) + +runtimetest.exe: runtimetest.cs TestVocab.dll + $(CSCOMPILE) -r:PresentationFramework.dll -r:WindowsBase.dll -r:TestVocab.dll -out:runtimetest.exe runtimetest.cs diff --git a/mcs/tools/xamlc/demo/runtimetest.cs b/mcs/tools/xamlc/demo/runtimetest.cs new file mode 100644 index 00000000000..1aa0419b308 --- /dev/null +++ b/mcs/tools/xamlc/demo/runtimetest.cs @@ -0,0 +1,14 @@ +using Xaml.TestVocab.Console; +using System.Windows.Serialization; +using Mono.Windows.Serialization; + +class RuntimeTest { + public static void Main(string[] args) { + ObjectWriter ow = new ObjectWriter(); + XamlParser r = new XamlParser("runtimetest.xaml", ow); + r.Parse(); + + ConsoleApp c = (ConsoleApp)(ow.instance); + c.Run(); + } +} diff --git a/mcs/tools/xamlc/demo/runtimetest.xaml b/mcs/tools/xamlc/demo/runtimetest.xaml new file mode 100644 index 00000000000..b449c3068d6 --- /dev/null +++ b/mcs/tools/xamlc/demo/runtimetest.xaml @@ -0,0 +1,12 @@ +<?Mapping ClrNamespace="Xaml.TestVocab.Console" Assembly="TestVocab" XmlNamespace="console" ?> + +<ConsoleApp xmlns="console" + xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005" + x:Class="DemoConsoleApp"> + <ConsoleWriter>IT BEGINS!</ConsoleWriter> + <ConsoleWriter x:Name="_greeter" Text="Hello World" /> + <ConsoleWriter> + <ConsoleWriter.Text>Goodbye.</ConsoleWriter.Text> + </ConsoleWriter> + <ConsoleWriter>Bye</ConsoleWriter> +</ConsoleApp> |