diff options
| author | jpbruyere <jp.bruyere@hotmail.com> | 2016-07-31 12:29:20 +0200 |
|---|---|---|
| committer | jpbruyere <jp.bruyere@hotmail.com> | 2016-07-31 12:29:20 +0200 |
| commit | 9a8f162ca773a0a4b8748e631d53935dfd9831dc (patch) | |
| tree | 70d93447dbfaaf7b04474ddb7542a34bf4faed10 /src | |
| parent | 5236bd6b11d26f08ed49462252bb815314e9e7dc (diff) | |
| parent | 58ca25a123f4cf8ac959d9ad372494b0c40a41bb (diff) | |
Merge branch 'StylingImprovments'
Diffstat (limited to 'src')
27 files changed, 579 insertions, 237 deletions
diff --git a/src/Colors.cs b/src/Colors.cs index 269d7ae6..e928f377 100644 --- a/src/Colors.cs +++ b/src/Colors.cs @@ -53,7 +53,7 @@ namespace Crow if (string.IsNullOrEmpty(s)) return White; - string[] c = s.Split(new char[] { ';' }); + string[] c = s.Split(new char[] { ',' }); if (c.Length == 1) { @@ -1012,7 +1012,7 @@ namespace Crow #region IXmlSerializable public void ReadXml(System.Xml.XmlReader reader) { - string[] c = reader["Color"].Split(new char[] { ';' }); + string[] c = reader["Color"].Split(new char[] { ',' }); R = double.Parse(c[0]); G = double.Parse(c[1]); B = double.Parse(c[2]); @@ -1061,7 +1061,7 @@ namespace Crow } } - return string.Format("{0};{1};{2};{3}", R, G, B, A); + return string.Format("{0},{1},{2},{3}", R, G, B, A); } public static object Parse(string s) diff --git a/src/CompilerServices/CompilerServices.cs b/src/CompilerServices/CompilerServices.cs index 1fff4e7d..4a85c442 100644 --- a/src/CompilerServices/CompilerServices.cs +++ b/src/CompilerServices/CompilerServices.cs @@ -56,6 +56,7 @@ namespace Crow if (!b.FindTarget ()) continue; + //group Bindings by target instanceq List<Binding> bindings = null; if (!resolved.TryGetValue (b.Target.Instance, out bindings)) { bindings = new List<Binding> (); diff --git a/src/Configuration.cs b/src/Configuration.cs index c3e20201..775b4c4e 100644 --- a/src/Configuration.cs +++ b/src/Configuration.cs @@ -41,21 +41,8 @@ namespace Crow Assembly a = Assembly.GetEntryAssembly (); string appName = a.GetName().Name; - OperatingSystem os = Environment.OSVersion; - switch (os.Platform) { - case PlatformID.Win32S: - case PlatformID.Win32Windows: - case PlatformID.Win32NT: - case PlatformID.WinCE: - break; - case PlatformID.Unix: - configPath = Path.Combine (configRoot, appName); - break; - case PlatformID.Xbox: - break; - case PlatformID.MacOSX: - break; - } + configPath = Path.Combine (configRoot, appName); + if (!Directory.Exists(configPath)) Directory.CreateDirectory (configPath); load (); diff --git a/src/ExtensionsMethods.cs b/src/ExtensionsMethods.cs index 10aaf20a..8985c929 100644 --- a/src/ExtensionsMethods.cs +++ b/src/ExtensionsMethods.cs @@ -65,6 +65,10 @@ namespace Crow var ret = Run.DynamicInvoke(data); return ret; } + public static bool IsWhiteSpaceOrNewLine (this char c) + { + return c == '\t' || c == '\r' || c == '\n' || char.IsWhiteSpace (c); + } } } diff --git a/src/GraphicObjects/Button.cs b/src/GraphicObjects/Button.cs index 3dd10606..92238e69 100644 --- a/src/GraphicObjects/Button.cs +++ b/src/GraphicObjects/Button.cs @@ -12,7 +12,6 @@ using System.ComponentModel; namespace Crow { - [DefaultStyle("#Crow.Styles.Button.style")] [DefaultTemplate("#Crow.Templates.Button.crow")] public class Button : TemplatedContainer { diff --git a/src/GraphicObjects/CheckBox.cs b/src/GraphicObjects/CheckBox.cs index 71e686f9..f8193e24 100644 --- a/src/GraphicObjects/CheckBox.cs +++ b/src/GraphicObjects/CheckBox.cs @@ -1,10 +1,30 @@ -using System; +// +// CheckBox.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. + +using System; using System.ComponentModel; using System.Xml.Serialization; namespace Crow { - [DefaultStyle("#Crow.Styles.CheckBox.style")] [DefaultTemplate("#Crow.Templates.CheckBox.goml")] public class CheckBox : TemplatedControl { diff --git a/src/GraphicObjects/ComboBox.cs b/src/GraphicObjects/ComboBox.cs index 8888696d..e45d20df 100644 --- a/src/GraphicObjects/ComboBox.cs +++ b/src/GraphicObjects/ComboBox.cs @@ -1,9 +1,29 @@ -using System; +// +// ComboBox.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. + +using System; using System.Xml.Serialization; namespace Crow { - [DefaultStyle("#Crow.Styles.ComboBox.style")] [DefaultTemplate("#Crow.Templates.ComboBox.goml")] public class ComboBox : ListBox { diff --git a/src/GraphicObjects/Expandable.cs b/src/GraphicObjects/Expandable.cs index af8b5640..d21936e8 100644 --- a/src/GraphicObjects/Expandable.cs +++ b/src/GraphicObjects/Expandable.cs @@ -1,10 +1,30 @@ -using System; +// +// Expandable.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. + +using System; using System.ComponentModel; using System.Xml.Serialization; namespace Crow { - [DefaultStyle("#Crow.Styles.Expandable.style")] [DefaultTemplate("#Crow.Templates.Expandable.goml")] public class Expandable : TemplatedContainer { diff --git a/src/GraphicObjects/GraphicObject.cs b/src/GraphicObjects/GraphicObject.cs index e72a2caf..c181c9ac 100644 --- a/src/GraphicObjects/GraphicObject.cs +++ b/src/GraphicObjects/GraphicObject.cs @@ -45,17 +45,14 @@ namespace Crow uid = currentUid; currentUid++; - if (Interface.XmlSerializerInit) + if (Interface.CurrentInterface.XmlLoading) return; - - loadDefaultValues (); } public GraphicObject (Rectangle _bounds) { - if (Interface.XmlSerializerInit) - return; - - loadDefaultValues (); + if (!Interface.CurrentInterface.XmlLoading) + loadDefaultValues (); + Left = _bounds.Left; Top = _bounds.Top; Width = _bounds.Width; @@ -82,8 +79,8 @@ namespace Crow protected bool _isVisible = true; VerticalAlignment _verticalAlignment = VerticalAlignment.Center; HorizontalAlignment _horizontalAlignment = HorizontalAlignment.Center; - Size _maximumSize = "0;0"; - Size _minimumSize = "0;0"; + Size _maximumSize = "0,0"; + Size _minimumSize = "0,0"; bool cacheEnabled = false; object dataSource; string style; @@ -419,7 +416,7 @@ namespace Crow NotifyValueChanged ("Visible", _isVisible); } } - [XmlAttributeAttribute()][DefaultValue("1;1")] + [XmlAttributeAttribute()][DefaultValue("1,1")] public virtual Size MinimumSize { get { return _minimumSize; } set { @@ -432,7 +429,7 @@ namespace Crow RegisterForLayouting (LayoutingType.Sizing); } } - [XmlAttributeAttribute()][DefaultValue("0;0")] + [XmlAttributeAttribute()][DefaultValue("0,0")] public virtual Size MaximumSize { get { return _maximumSize; } set { @@ -493,12 +490,50 @@ namespace Crow #endif Type thisType = this.GetType (); - if (Interface.DefaultValuesLoader.ContainsKey(thisType.FullName)) { - Interface.DefaultValuesLoader[thisType.FullName] (this); - applyStyle (); + + if (!string.IsNullOrEmpty (Style)) { + if (Interface.DefaultValuesLoader.ContainsKey (Style)) { + Interface.DefaultValuesLoader [Style] (this); + return; + } + } + if (Interface.DefaultValuesLoader.ContainsKey (thisType.FullName)) { + Interface.DefaultValuesLoader [thisType.FullName] (this); return; } + if (Interface.DefaultValuesLoader.ContainsKey (thisType.Name)) { + Interface.DefaultValuesLoader [thisType.Name] (this); + return; + } + + List<Dictionary<string, object>> styling = new List<Dictionary<string, object>>(); + + //Search for a style mathing : + //1: Full class name, with full namespace + //2: class name + //3: style may have been registered with their ressource ID minus .style extention + // those files being placed in a Styles folder + string styleKey = Style; + if (!string.IsNullOrEmpty (Style)) { + if (Interface.CurrentInterface.Styling.ContainsKey (Style)) { + styling.Add (Interface.CurrentInterface.Styling [Style]); + } + } + if (Interface.CurrentInterface.Styling.ContainsKey (thisType.FullName)) { + styling.Add (Interface.CurrentInterface.Styling [thisType.FullName]); + if (string.IsNullOrEmpty (styleKey)) + styleKey = thisType.FullName; + } + if (Interface.CurrentInterface.Styling.ContainsKey (thisType.Name)) { + styling.Add (Interface.CurrentInterface.Styling [thisType.Name]); + if (string.IsNullOrEmpty (styleKey)) + styleKey = thisType.Name; + } + if (string.IsNullOrEmpty (styleKey)) + styleKey = thisType.FullName; + + //Reflexion being very slow compared to dyn method or delegates, //I compile the initial values coded in the CustomAttribs of the class, //all other instance of this type would not longer use reflexion to init properly @@ -535,13 +570,20 @@ namespace Crow else name = xaa.AttributeName; } - if (name == "Style"){ - //retrieve default value from class attribute - DefaultStyle defStyle = thisType.GetCustomAttribute<DefaultStyle>(); - if (defStyle != null) - defaultValue = defStyle.Path; - }else{ - DefaultValueAttribute dv = (DefaultValueAttribute)pi.GetCustomAttribute (typeof(DefaultValueAttribute)); + + int styleIndex = -1; + if (styling.Count > 0){ + for (int i = 0; i < styling.Count; i++) { + if (styling[i].ContainsKey (name)){ + styleIndex = i; + break; + } + } + } + if (styleIndex >= 0){ + defaultValue = styling[styleIndex] [name]; + }else { + DefaultValueAttribute dv = (DefaultValueAttribute)pi.GetCustomAttribute (typeof (DefaultValueAttribute)); if (dv == null) continue; defaultValue = dv.Value; @@ -621,10 +663,12 @@ namespace Crow //surely a class or struct if (dvType != typeof(string)) throw new Exception ("Expecting String in default values for: " + pi.Name); - if (pi.PropertyType == typeof(string)) + if (pi.PropertyType == typeof (string)) il.Emit (OpCodes.Ldstr, Convert.ToString (defaultValue)); else { - MethodInfo miParse = pi.PropertyType.GetMethod ("Parse", BindingFlags.Static | BindingFlags.Public); + MethodInfo miParse = pi.PropertyType.GetMethod + ("Parse", BindingFlags.Static | BindingFlags.Public, + Type.DefaultBinder, new Type [] {typeof (string)},null); if (miParse == null) throw new Exception ("no Parse method found for: " + pi.PropertyType.FullName); @@ -640,9 +684,8 @@ namespace Crow il.Emit(OpCodes.Ret); #endregion - Interface.DefaultValuesLoader[thisType.FullName] = (Interface.loadDefaultInvoker)dm.CreateDelegate(typeof(Interface.loadDefaultInvoker)); - Interface.DefaultValuesLoader[thisType.FullName] (this); - applyStyle (); + Interface.DefaultValuesLoader[styleKey] = (Interface.loadDefaultInvoker)dm.CreateDelegate(typeof(Interface.loadDefaultInvoker)); + Interface.DefaultValuesLoader[styleKey] (this); } public virtual GraphicObject FindByName(string nameToFind){ @@ -682,7 +725,7 @@ namespace Crow protected Size contentSize; /// <summary> return size of content + margins </summary> protected virtual int measureRawSize (LayoutingType lt) { - return lt == LayoutingType.Width ? + return lt == LayoutingType.Width ? contentSize.Width + 2 * Margin: contentSize.Height + 2 * Margin; } /// <summary> By default in groups, LayoutingType.ArrangeChildren is reset </summary> @@ -808,7 +851,7 @@ namespace Crow } } else Slot.Y = Top; - + if (LastSlots.Y == Slot.Y) break; @@ -880,7 +923,7 @@ namespace Crow } } else Slot.Height = 0; - + if (LastSlots.Height == Slot.Height) break; @@ -888,7 +931,7 @@ namespace Crow OnLayoutChanges (layoutType); - LastSlots.Height = Slot.Height; + LastSlots.Height = Slot.Height; break; } @@ -1200,7 +1243,7 @@ namespace Crow MemberInfo mi = thisType.GetMember (name).FirstOrDefault(); if (mi == null) { - Debug.WriteLine ("GOML: Unknown attribute in " + thisType.ToString() + " : " + name); + Debug.WriteLine ("XML: Unknown attribute in " + thisType.ToString() + " : " + name); return; } if (mi.MemberType == MemberTypes.Event) { @@ -1223,7 +1266,7 @@ namespace Crow if (value.StartsWith("{",StringComparison.Ordinal)) { //binding if (!value.EndsWith("}", StringComparison.Ordinal)) - throw new Exception (string.Format("GOML:Malformed binding: {0}", value)); + throw new Exception (string.Format("XML:Malformed binding: {0}", value)); this.Bindings.Add (new Binding (new MemberReference(this, pi), value.Substring (1, value.Length - 2))); return; @@ -1246,51 +1289,23 @@ namespace Crow } } } - void applyStyle(){ - //The first place searched for a style is in the style propery of this instance - //this field may contains the path to a Style file for the object. - if (string.IsNullOrEmpty (style)) - return; - Stream s = Interface.GetStreamFromPath (style); - if (s == null) - throw new Exception ("Style Path not found: " + style); - - #if DEBUG_LOAD - Debug.WriteLine ("ApplyStyle for " + this.ToString ()); - #endif - using (StreamReader sr = new StreamReader (s)) { - while (!sr.EndOfStream) { - string tmp = sr.ReadLine (); - if (string.IsNullOrWhiteSpace (tmp)) - continue; - int i = tmp.IndexOf ('='); - if (i < 0) - continue; - string name = tmp.Substring (0, i).Trim(); - string value = tmp.Substring (i + 1).Trim (); - - affectMember (name, value); - } - } - } public virtual void ReadXml (System.Xml.XmlReader reader) { - if (!reader.HasAttributes) - return; + if (reader.HasAttributes) { - string stylePath = reader.GetAttribute ("Style"); + style = reader.GetAttribute ("Style"); - if (!string.IsNullOrEmpty (style)) { - Style = stylePath; - applyStyle (); - } - while (reader.MoveToNextAttribute ()) { - if (reader.Name == "Style") - continue; + loadDefaultValues (); - affectMember (reader.Name, reader.Value); - } - reader.MoveToElement(); + while (reader.MoveToNextAttribute ()) { + if (reader.Name == "Style") + continue; + + affectMember (reader.Name, reader.Value); + } + reader.MoveToElement (); + }else + loadDefaultValues (); } public virtual void WriteXml (System.Xml.XmlWriter writer) { diff --git a/src/GraphicObjects/GroupBox.cs b/src/GraphicObjects/GroupBox.cs index 86c659d0..886e7964 100644 --- a/src/GraphicObjects/GroupBox.cs +++ b/src/GraphicObjects/GroupBox.cs @@ -1,10 +1,30 @@ -using System; +// +// GroupBox.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. + +using System; using System.Xml.Serialization; using System.ComponentModel; namespace Crow { - [DefaultStyle("#Crow.Styles.GroupBox.style")] [DefaultTemplate("#Crow.Templates.GroupBox.goml")] public class GroupBox : TemplatedContainer { @@ -32,7 +52,7 @@ namespace Crow } #endregion - [XmlAttributeAttribute()][DefaultValue("Groupbox")] + [XmlAttributeAttribute][DefaultValue("Groupbox")] public string Caption { get { return caption; } set { diff --git a/src/GraphicObjects/Label.cs b/src/GraphicObjects/Label.cs index 6831a9cc..505bd69e 100644 --- a/src/GraphicObjects/Label.cs +++ b/src/GraphicObjects/Label.cs @@ -1,7 +1,27 @@ -using System; +// +// Label.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. + +using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Diagnostics; using Cairo; using System.Text.RegularExpressions; @@ -10,7 +30,6 @@ using System.ComponentModel; namespace Crow { - [DefaultStyle("#Crow.Styles.Label.style")] public class Label : GraphicObject { #region CTOR @@ -52,7 +71,7 @@ namespace Crow protected TextExtents te; #endregion - [XmlAttributeAttribute()][DefaultValue("SteelBlue")] + [XmlAttributeAttribute][DefaultValue("SteelBlue")] public virtual Color SelectionBackground { get { return selColor; } set { @@ -63,7 +82,7 @@ namespace Crow RegisterForGraphicUpdate (); } } - [XmlAttributeAttribute()][DefaultValue("White")] + [XmlAttributeAttribute][DefaultValue("White")] public virtual Color SelectionForeground { get { return selFontColor; } set { @@ -74,7 +93,7 @@ namespace Crow RegisterForGraphicUpdate (); } } - [XmlAttributeAttribute()][DefaultValue(Alignment.Left)] + [XmlAttributeAttribute][DefaultValue(Alignment.Left)] public Alignment TextAlignment { get { return _textAlignment; } @@ -87,7 +106,7 @@ namespace Crow NotifyValueChanged ("TextAlignment", _textAlignment); } } - [XmlAttributeAttribute()][DefaultValue(false)] + [XmlAttributeAttribute][DefaultValue(false)] public virtual bool HorizontalStretch { get { return horizontalStretch; } set { @@ -98,7 +117,7 @@ namespace Crow NotifyValueChanged ("HorizontalStretch", horizontalStretch); } } - [XmlAttributeAttribute()][DefaultValue(false)] + [XmlAttributeAttribute][DefaultValue(false)] public virtual bool VerticalStretch { get { return verticalStretch; } set { @@ -109,7 +128,7 @@ namespace Crow } } - [XmlAttributeAttribute()][DefaultValue("label")] + [XmlAttributeAttribute][DefaultValue("label")] public string Text { get { @@ -133,7 +152,7 @@ namespace Crow NotifyValueChanged ("Text", _text); } } - [XmlAttributeAttribute()][DefaultValue(false)] + [XmlAttributeAttribute][DefaultValue(false)] public bool Multiline { get { return _multiline; } @@ -146,7 +165,7 @@ namespace Crow RegisterForGraphicUpdate(); } } - [XmlAttributeAttribute()][DefaultValue(0)] + [XmlAttributeAttribute][DefaultValue(0)] public int CurrentColumn{ get { return _currentCol; } set { @@ -161,7 +180,7 @@ namespace Crow NotifyValueChanged ("CurrentColumn", _currentCol); } } - [XmlAttributeAttribute()][DefaultValue(0)] + [XmlAttributeAttribute][DefaultValue(0)] public int CurrentLine{ get { return _currentLine; } set { @@ -181,7 +200,7 @@ namespace Crow } } //TODO:using HasFocus for drawing selection cause SelBegin and Release binding not to work - [XmlAttributeAttribute()][DefaultValue("-1")] + [XmlAttributeAttribute][DefaultValue("-1")] public Point SelBegin { get { return _selBegin; @@ -194,7 +213,7 @@ namespace Crow NotifyValueChanged ("SelectedText", SelectedText); } } - [XmlAttributeAttribute()][DefaultValue("-1")] + [XmlAttributeAttribute][DefaultValue("-1")] public Point SelRelease { get { return _selRelease; diff --git a/src/GraphicObjects/MessageBox.cs b/src/GraphicObjects/MessageBox.cs index 2114262e..550f5b72 100644 --- a/src/GraphicObjects/MessageBox.cs +++ b/src/GraphicObjects/MessageBox.cs @@ -23,7 +23,6 @@ using System.ComponentModel; namespace Crow { - [DefaultStyle("#Crow.Styles.MessageBox.style")] [DefaultTemplate("#Crow.Templates.MessageBox.goml")] public class MessageBox : Window { diff --git a/src/GraphicObjects/Popper.cs b/src/GraphicObjects/Popper.cs index 5e5541fe..14e7ec7a 100644 --- a/src/GraphicObjects/Popper.cs +++ b/src/GraphicObjects/Popper.cs @@ -1,11 +1,31 @@ -using System; +// +// Popper.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. + +using System; using System.Xml.Serialization; using System.ComponentModel; using OpenTK.Input; namespace Crow { - [DefaultStyle("#Crow.Styles.Popper.style")] [DefaultTemplate("#Crow.Templates.Popper.goml")] public class Popper : TemplatedContainer { diff --git a/src/GraphicObjects/RadioButton.cs b/src/GraphicObjects/RadioButton.cs index a6248706..ffd5ba27 100644 --- a/src/GraphicObjects/RadioButton.cs +++ b/src/GraphicObjects/RadioButton.cs @@ -1,10 +1,30 @@ -using System; +// +// RadioButton.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. + +using System; using System.ComponentModel; using System.Xml.Serialization; namespace Crow { - [DefaultStyle("#Crow.Styles.RadioButton.style")] [DefaultTemplate("#Crow.Templates.RadioButton.goml")] public class RadioButton : TemplatedControl { diff --git a/src/GraphicObjects/Slider.cs b/src/GraphicObjects/Slider.cs index 3b2cebf4..bce74971 100644 --- a/src/GraphicObjects/Slider.cs +++ b/src/GraphicObjects/Slider.cs @@ -1,7 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +// +// Slider.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. + +using System; using Cairo; using System.Xml.Serialization; using System.ComponentModel; @@ -9,7 +27,6 @@ using System.Diagnostics; namespace Crow { - [DefaultStyle ("#Crow.Styles.Slider.style")] public class Slider : NumericControl { #region CTOR diff --git a/src/GraphicObjects/Spinner.cs b/src/GraphicObjects/Spinner.cs index 9447f205..1a8674d0 100644 --- a/src/GraphicObjects/Spinner.cs +++ b/src/GraphicObjects/Spinner.cs @@ -22,7 +22,6 @@ using System; namespace Crow { - [DefaultStyle("#Crow.Styles.Spinner.style")] [DefaultTemplate("#Crow.Templates.Spinner.goml")] public class Spinner : NumericControl { diff --git a/src/GraphicObjects/Splitter.cs b/src/GraphicObjects/Splitter.cs index 248863b5..f3321065 100644 --- a/src/GraphicObjects/Splitter.cs +++ b/src/GraphicObjects/Splitter.cs @@ -24,7 +24,6 @@ using System.ComponentModel; namespace Crow { - [DefaultStyle("#Crow.Styles.Splitter.style")] public class Splitter : GraphicObject { #region CTOR @@ -33,7 +32,7 @@ namespace Crow int thickness; - [XmlAttributeAttribute()][DefaultValue(1)] + [XmlAttributeAttribute][DefaultValue(1)] public virtual int Thickness { get { return thickness; } set { diff --git a/src/GraphicObjects/TabItem.cs b/src/GraphicObjects/TabItem.cs index 38d56c5d..2d2ba453 100644 --- a/src/GraphicObjects/TabItem.cs +++ b/src/GraphicObjects/TabItem.cs @@ -25,7 +25,6 @@ using System.Diagnostics; namespace Crow { - [DefaultStyle ("#Crow.Styles.TabItem.style")] [DefaultTemplate("#Crow.Templates.TabItem.crow")] public class TabItem : TemplatedContainer { @@ -67,7 +66,7 @@ namespace Crow internal GraphicObject TabTitle { get { return _tabTitle; }} #endregion - [XmlAttributeAttribute()][DefaultValue(0)] + [XmlAttributeAttribute][DefaultValue(0)] public virtual int TabOffset { get { return tabOffset; } set { @@ -80,7 +79,7 @@ namespace Crow RegisterForGraphicUpdate (); } } - [XmlAttributeAttribute()][DefaultValue("TabItem")] + [XmlAttributeAttribute][DefaultValue("TabItem")] public string Caption { get { return caption; } set { @@ -91,7 +90,7 @@ namespace Crow } } bool isSelected; - [XmlAttributeAttribute()][DefaultValue(false)] + [XmlAttributeAttribute][DefaultValue(false)] public virtual bool IsSelected { get { return isSelected; } set { diff --git a/src/GraphicObjects/TemplatedControl.cs b/src/GraphicObjects/TemplatedControl.cs index c8ec2d9e..12c2b81f 100644 --- a/src/GraphicObjects/TemplatedControl.cs +++ b/src/GraphicObjects/TemplatedControl.cs @@ -37,11 +37,7 @@ namespace Crow Path = path; } } - [AttributeUsage(AttributeTargets.Class)] - public class DefaultStyle : TemplateAttribute - { - public DefaultStyle(string path) : base(path){} - } + [AttributeUsage(AttributeTargets.Class)] public class DefaultTemplate : TemplateAttribute { diff --git a/src/GraphicObjects/TextBox.cs b/src/GraphicObjects/TextBox.cs index 7d61d5ab..fc02f0d6 100644 --- a/src/GraphicObjects/TextBox.cs +++ b/src/GraphicObjects/TextBox.cs @@ -1,17 +1,31 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +// +// TextBox.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. + +using System; using Cairo; using System.Diagnostics; using System.Xml.Serialization; -using System.Globalization; -using System.ComponentModel; -using System.Runtime.InteropServices; namespace Crow { - [DefaultStyle("#Crow.Styles.TextBox.style")] public class TextBox : Label { #region CTOR diff --git a/src/GraphicObjects/TextRun.cs b/src/GraphicObjects/TextRun.cs index 6af22025..35b46f18 100644 --- a/src/GraphicObjects/TextRun.cs +++ b/src/GraphicObjects/TextRun.cs @@ -10,32 +10,30 @@ using System.ComponentModel; namespace Crow { - [Serializable] - [DefaultStyle("#Crow.Styles.TextRun.style")] - public class TextRun : GraphicObject - { + public class TextRun : GraphicObject + { #region CTOR - public TextRun() - { + public TextRun () + { } - public TextRun(string _text) - : base() + public TextRun (string _text) + : base () { Text = _text; } #endregion - //TODO:change protected to private - + //TODO:change protected to private + #region private and protected fields protected string _text = "label"; - Alignment _textAlignment = Alignment.Left; + Alignment _textAlignment = Alignment.Left; bool horizontalStretch = false; bool verticalStretch = false; bool _multiline; bool wordWrap; - protected Rectangle rText; + protected Rectangle rText; protected float widthRatio = 1f; protected float heightRatio = 1f; protected FontExtents fe; @@ -43,69 +41,70 @@ namespace Crow #endregion - [XmlAttributeAttribute()][DefaultValue(Alignment.Left)] - public Alignment TextAlignment - { - get { return _textAlignment; } - set { _textAlignment = value; } - } - [XmlAttributeAttribute()][DefaultValue(false)] + [XmlAttributeAttribute ()] + [DefaultValue (Alignment.Left)] + public Alignment TextAlignment { + get { return _textAlignment; } + set { _textAlignment = value; } + } + [XmlAttributeAttribute ()] + [DefaultValue (false)] public virtual bool HorizontalStretch { get { return horizontalStretch; } set { if (horizontalStretch == value) return; - horizontalStretch = value; + horizontalStretch = value; RegisterForGraphicUpdate (); NotifyValueChanged ("HorizontalStretch", horizontalStretch); } } - [XmlAttributeAttribute()][DefaultValue(false)] + [XmlAttributeAttribute ()] + [DefaultValue (false)] public virtual bool VerticalStretch { get { return verticalStretch; } set { if (verticalStretch == value) return; - verticalStretch = value; + verticalStretch = value; NotifyValueChanged ("VerticalStretch", verticalStretch); } - } - [XmlAttributeAttribute()][DefaultValue("label")] - public string Text - { - get { - return lines == null ? - _text : lines.Aggregate((i, j) => i + Interface.LineBreak + j); + } + [XmlAttributeAttribute ()] + [DefaultValue ("label")] + public string Text { + get { + return lines == null ? + _text : lines.Aggregate ((i, j) => i + Interface.LineBreak + j); } - set - { - if (_text == value) - return; - - RegisterForGraphicUpdate(); + set { + if (_text == value) + return; + + RegisterForGraphicUpdate (); this.RegisterForLayouting (LayoutingType.Sizing); - _text = value; + _text = value; - if (string.IsNullOrEmpty(_text)) + if (string.IsNullOrEmpty (_text)) _text = ""; lines = getLines; - } - } - [XmlAttributeAttribute()][DefaultValue(false)] - public bool Multiline - { + } + } + [XmlAttributeAttribute ()] + [DefaultValue (false)] + public bool Multiline { get { return _multiline; } - set - { + set { _multiline = value; - RegisterForGraphicUpdate(); + RegisterForGraphicUpdate (); } } - [XmlAttributeAttribute()][DefaultValue(false)] + [XmlAttributeAttribute ()] + [DefaultValue (false)] public bool WordWrap { get { return wordWrap; @@ -114,22 +113,22 @@ namespace Crow if (wordWrap == value) return; wordWrap = value; - RegisterForGraphicUpdate(); + RegisterForGraphicUpdate (); } } List<string> lines; List<string> getLines { - get { + get { return _multiline ? - Regex.Split (_text, "\r\n|\r|\n").ToList() : - new List<string>(new string[] { _text }); + Regex.Split (_text, "\r\n|\r|\n").ToList () : + new List<string> (new string [] { _text }); } } #region GraphicObject overrides - protected override int measureRawSize(LayoutingType lt) - { + protected override int measureRawSize (LayoutingType lt) + { if (lines == null) lines = getLines; @@ -142,13 +141,13 @@ namespace Crow fe = gr.FontExtents; - te = new TextExtents(); + te = new TextExtents (); - if (lt == LayoutingType.Height){ + if (lt == LayoutingType.Height) { int lc = lines.Count; //ensure minimal height = text line height if (lc == 0) - lc = 1; + lc = 1; return (int)(fe.Height * lc) + Margin * 2; } @@ -173,8 +172,8 @@ namespace Crow gr.Antialias = Antialias.Subpixel; - rText = new Rectangle(new Size( - measureRawSize(LayoutingType.Width), measureRawSize(LayoutingType.Height))); + rText = new Rectangle (new Size ( + measureRawSize (LayoutingType.Width), measureRawSize (LayoutingType.Height))); rText.Width -= 2 * Margin; rText.Height -= 2 * Margin; @@ -185,16 +184,16 @@ namespace Crow //ignore text alignment if size to content = true //or if text size is larger than client bounds - if (Width < 0 || Height < 0 || rText.Width > cb.Width) - { + if (Width < 0 || Height < 0 || rText.Width > cb.Width) { rText.X = cb.X; rText.Y = cb.Y; - }else { + } else { if (horizontalStretch) { widthRatio = (float)cb.Width / rText.Width; if (!verticalStretch) heightRatio = widthRatio; - }if (verticalStretch) { + } + if (verticalStretch) { heightRatio = (float)cb.Height / rText.Height; if (!horizontalStretch) widthRatio = heightRatio; @@ -203,8 +202,7 @@ namespace Crow rText.Width = (int)(widthRatio * cb.Width); rText.Height = (int)(heightRatio * cb.Height); - switch (TextAlignment) - { + switch (TextAlignment) { case Alignment.TopLeft: //ok rText.X = cb.X; rText.Y = cb.Y; @@ -244,11 +242,11 @@ namespace Crow } } - gr.FontMatrix = new Matrix(widthRatio * Font.Size, 0, 0, heightRatio * Font.Size, 0, 0); + gr.FontMatrix = new Matrix (widthRatio * Font.Size, 0, 0, heightRatio * Font.Size, 0, 0); int curLineCount = 0; - for (int i = 0;i < lines.Count;i++) { + for (int i = 0; i < lines.Count; i++) { string l = lines [i].Replace ("\t", new String (' ', Interface.TabSize)); List<string> wl = new List<string> (); int lineLength = (int)gr.TextExtents (l).XAdvance; @@ -272,14 +270,14 @@ namespace Crow foreach (string ll in wl) { lineLength = (int)gr.TextExtents (ll).XAdvance; - + if (string.IsNullOrWhiteSpace (ll)) { curLineCount++; continue; } - Foreground.SetAsSource (gr); + Foreground.SetAsSource (gr); gr.MoveTo (rText.X, rText.Y + fe.Ascent + fe.Height * curLineCount); gr.ShowText (ll); @@ -287,8 +285,8 @@ namespace Crow curLineCount++; } - } + } } #endregion - } + } } diff --git a/src/GraphicObjects/Window.cs b/src/GraphicObjects/Window.cs index afb4f4f2..cbdbbb2c 100644 --- a/src/GraphicObjects/Window.cs +++ b/src/GraphicObjects/Window.cs @@ -1,11 +1,31 @@ -using System; +// +// Window.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. + +using System; using System.Xml.Serialization; using System.ComponentModel; using System.Diagnostics; namespace Crow { - [DefaultStyle("#Crow.Styles.Window.style")] [DefaultTemplate("#Crow.Templates.Window.goml")] public class Window : TemplatedContainer { diff --git a/src/Interface.cs b/src/Interface.cs index 30fa4b74..02b6efaf 100644 --- a/src/Interface.cs +++ b/src/Interface.cs @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Reflection; using System.Threading; using System.Xml; @@ -33,7 +34,7 @@ namespace Crow /// <summary> /// The Interface Class is the top container of the application. /// It provides the Dirty bitmap and zone of the interface to be drawn on screen - /// + /// /// The Interface contains : /// - rendering and layouting queues and logic. /// - helpers to load XML interfaces files @@ -52,14 +53,13 @@ namespace Crow FontRenderingOptions.SubpixelOrder = SubpixelOrder.Rgb; } public Interface(){ - LayoutingQueue = new Queue<LayoutingQueueItem>(); Interface.CurrentInterface = this; + LoadStyling (); } #endregion #region Static and constants - /// <summary> Used to prevent spurious loading of templates </summary> - internal static bool XmlSerializerInit = false; + internal bool XmlLoading = false; /// <summary> keep ressource path for debug msg </summary> internal static string CurrentGOMLPath = ""; //used in templatedControl @@ -87,11 +87,9 @@ namespace Crow public static FontOptions FontRenderingOptions; #endregion - /// <summary> - /// The layouting queue contains layouting commands - /// </summary> - public Queue<LayoutingQueueItem> LayoutingQueue; + public Queue<LayoutingQueueItem> LayoutingQueue = new Queue<LayoutingQueueItem> (); public Queue<GraphicObject> GraphicUpdateQueue = new Queue<GraphicObject>(); + public Dictionary<string, Dictionary<string, object>> Styling; public string Clipboard; public static void RegisterForGraphicUpdate(GraphicObject g) { @@ -202,6 +200,9 @@ namespace Crow } public static GraphicObject Load (string path, object hostClass = null) { + System.Globalization.CultureInfo savedCulture = Thread.CurrentThread.CurrentCulture; + Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + Interface.XmlLoaderCount ++; CurrentGOMLPath = path; GraphicObject tmp = null; @@ -209,9 +210,12 @@ namespace Crow tmp = Load(stream, GetTopContainerOfGOMLStream(stream), hostClass); } Interface.XmlLoaderCount --; + + Thread.CurrentThread.CurrentCulture = savedCulture; + return tmp; } - public static GraphicObject Load (Stream stream, Type type, object hostClass = null) + internal static GraphicObject Load (Stream stream, Type type, object hostClass = null) { #if DEBUG_LOAD Stopwatch loadingTime = new Stopwatch (); @@ -220,16 +224,16 @@ namespace Crow GraphicObject result; + CurrentInterface.XmlLoading = true; XmlSerializerNamespaces xn = new XmlSerializerNamespaces (); xn.Add ("", ""); - XmlSerializerInit = true; XmlSerializer xs = new XmlSerializer (type); - XmlSerializerInit = false; result = (GraphicObject)xs.Deserialize (stream); //result.DataSource = hostClass; + CurrentInterface.XmlLoading = false; #if DEBUG_LOAD FileStream fs = stream as FileStream; @@ -245,11 +249,6 @@ namespace Crow return result; } - public void InterfaceLoad(string path){ - GraphicObject tmp = Interface.Load (path, this); - AddWidget (tmp); - } - public GraphicObject LoadInterface (string path) { lock (UpdateMutex) { @@ -260,6 +259,29 @@ namespace Crow } } + public void LoadStyling() { + System.Globalization.CultureInfo savedCulture = Thread.CurrentThread.CurrentCulture; + Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + + Styling = new Dictionary<string, Dictionary<string, object>> (); + + //fetch styling info in this order, if member styling is alreadey referenced in previous + //assembly, it's ignored. + loadStylingFromAssembly (Assembly.GetEntryAssembly ()); + loadStylingFromAssembly (Assembly.GetExecutingAssembly ()); + + Thread.CurrentThread.CurrentCulture = savedCulture; + } + + void loadStylingFromAssembly (Assembly assembly) { + foreach (string s in assembly + .GetManifestResourceNames () + .Where (r => r.EndsWith (".style", StringComparison.OrdinalIgnoreCase))) { + + StyleReader sr = new StyleReader (assembly, s); + sr.Dispose (); + } + } #endregion #if MEASURE_TIME @@ -712,7 +734,7 @@ namespace Crow #endregion #region Keyboard - public bool ProcessKeyDown(int Key){ + public bool ProcessKeyDown(int Key){ if (_focusedWidget == null) return false; KeyboardKeyEventArgs e = new KeyboardKeyEventArgs((Crow.Key)Key, false, Keyboard); diff --git a/src/Point.cs b/src/Point.cs index 76beaa99..ba0103e3 100644 --- a/src/Point.cs +++ b/src/Point.cs @@ -130,7 +130,7 @@ namespace Crow public override string ToString() { - return string.Format("({0};{1})", X, Y); + return string.Format("({0},{1})", X, Y); } public override bool Equals(object obj) @@ -145,7 +145,7 @@ namespace Crow { if (string.IsNullOrEmpty (s)) return default(Point); - string[] d = s.Trim().Split(';'); + string[] d = s.Trim().Split(','); if (d.Length == 2) return new Point (int.Parse (d [0]), int.Parse (d [1])); else if (d.Length == 1) { diff --git a/src/Rectangle.cs b/src/Rectangle.cs index e9445224..9a4ef396 100644 --- a/src/Rectangle.cs +++ b/src/Rectangle.cs @@ -236,11 +236,11 @@ namespace Crow } public override string ToString() { - return string.Format("{0};{1};{2};{3}", X, Y, Width, Height); + return string.Format("{0},{1},{2},{3}", X, Y, Width, Height); } public static Rectangle Parse(string s) { - string[] d = s.Split(new char[] { ';' }); + string[] d = s.Split(new char[] { ',' }); return new Rectangle( int.Parse(d[0]), int.Parse(d[1]), diff --git a/src/Size.cs b/src/Size.cs index 21ddb539..5059d31a 100644 --- a/src/Size.cs +++ b/src/Size.cs @@ -153,7 +153,7 @@ namespace Crow } public static Size Parse(string s) { - string[] d = s.Split(new char[] { ';' }); + string[] d = s.Split(new char[] { ',' }); return d.Length == 1 ? new Size(int.Parse(d[0])) : new Size( int.Parse(d[0]), int.Parse(d[1])); diff --git a/src/StyleReader.cs b/src/StyleReader.cs new file mode 100644 index 00000000..0c4ce2bc --- /dev/null +++ b/src/StyleReader.cs @@ -0,0 +1,134 @@ +// +// StyleReader.cs +// +// Author: +// Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// Copyright (c) 2016 jp +// +// 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 3 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, see <http://www.gnu.org/licenses/>. +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; + +namespace Crow +{ + public class StyleReader : StreamReader + { + enum readerState { classNames, propertyName, expression } + readerState state = readerState.classNames; + + + public StyleReader (Assembly assembly, string resId) + : base(assembly.GetManifestResourceStream (resId)) + { + Interface iface = Interface.CurrentInterface; + string classNameFromResId = resId.Substring (0, resId.Length - 6); + string token = ""; + List<string> targetsClasses = new List<string> (); + string currentProperty = ""; + + int curlyBracketCount = 0; + + while (!EndOfStream) { + char c = (Char)Read (); + + switch (state) { + case readerState.classNames: + if (c.IsWhiteSpaceOrNewLine () || c == ',' || c == '{') { + if (!string.IsNullOrEmpty (token)) + targetsClasses.Add (token); + if (c == '{') + state = readerState.propertyName; + token = ""; + }else if (c=='='){ + //this file contains only properties, + //resource Id (minus .style extention) will determine the single target class + if (targetsClasses.Count > 1) + throw new Exception ("Unexpected token '='"); + else if (targetsClasses.Count == 1) { + if (!string.IsNullOrEmpty (token)) + throw new Exception ("Unexpected token '='"); + currentProperty = targetsClasses [0]; + targetsClasses [0] = classNameFromResId; + }else{ + if (string.IsNullOrEmpty (token)) + throw new Exception ("Unexpected token '='"); + targetsClasses.Add (classNameFromResId); + currentProperty = token; + token = ""; + } + state = readerState.expression; + }else + token += c; + break; + case readerState.propertyName: + if (c.IsWhiteSpaceOrNewLine () || c == '=') { + if (!string.IsNullOrEmpty (token)) + currentProperty = token; + if (c == '=') + state = readerState.expression; + + token = ""; + }else if (c == '}'){ + if (!string.IsNullOrEmpty (token)) + throw new Exception ("Unexpected token '" + c + "'"); + targetsClasses = new List<string> (); + currentProperty = ""; + state = readerState.classNames; + } else + token += c; + break; + case readerState.expression: + if (curlyBracketCount == 0) { + if (c == '{'){ + if (string.IsNullOrEmpty(token)) + throw new Exception ("Unexpected token '{'"); + curlyBracketCount++; + token = "{"; + }else if (c == '}') + throw new Exception ("Unexpected token '{'"); + else if (c == ';') { + if (!string.IsNullOrEmpty (token)) { + string expression = token.Trim (); + + foreach (string tc in targetsClasses) { + if (!iface.Styling.ContainsKey (tc)) + iface.Styling [tc] = new Dictionary<string, object> (); + else if (iface.Styling [tc].ContainsKey (currentProperty)) + continue; + iface.Styling [tc] [currentProperty] = expression; + } + token = ""; + } + state = readerState.propertyName; + } else + token += c; + } else { + if (c == '{') + curlyBracketCount++; + else if (c == '}') + curlyBracketCount--; + token += c; + } + break; + } + } + + if (curlyBracketCount > 0) + throw new Exception ("Unexpected end of file"); + } + } +} |