aboutsummaryrefslogtreecommitdiffstatsci
path: root/src
diff options
context:
space:
mode:
authorjpbruyere <jp.bruyere@hotmail.com>2016-07-31 12:29:20 +0200
committerjpbruyere <jp.bruyere@hotmail.com>2016-07-31 12:29:20 +0200
commit9a8f162ca773a0a4b8748e631d53935dfd9831dc (patch)
tree70d93447dbfaaf7b04474ddb7542a34bf4faed10 /src
parent5236bd6b11d26f08ed49462252bb815314e9e7dc (diff)
parent58ca25a123f4cf8ac959d9ad372494b0c40a41bb (diff)
Merge branch 'StylingImprovments'
Diffstat (limited to 'src')
-rw-r--r--src/Colors.cs6
-rw-r--r--src/CompilerServices/CompilerServices.cs1
-rw-r--r--src/Configuration.cs17
-rw-r--r--src/ExtensionsMethods.cs4
-rw-r--r--src/GraphicObjects/Button.cs1
-rw-r--r--src/GraphicObjects/CheckBox.cs24
-rw-r--r--src/GraphicObjects/ComboBox.cs24
-rw-r--r--src/GraphicObjects/Expandable.cs24
-rw-r--r--src/GraphicObjects/GraphicObject.cs159
-rw-r--r--src/GraphicObjects/GroupBox.cs26
-rw-r--r--src/GraphicObjects/Label.cs47
-rw-r--r--src/GraphicObjects/MessageBox.cs1
-rw-r--r--src/GraphicObjects/Popper.cs24
-rw-r--r--src/GraphicObjects/RadioButton.cs24
-rw-r--r--src/GraphicObjects/Slider.cs27
-rw-r--r--src/GraphicObjects/Spinner.cs1
-rw-r--r--src/GraphicObjects/Splitter.cs3
-rw-r--r--src/GraphicObjects/TabItem.cs7
-rw-r--r--src/GraphicObjects/TemplatedControl.cs6
-rw-r--r--src/GraphicObjects/TextBox.cs30
-rw-r--r--src/GraphicObjects/TextRun.cs136
-rw-r--r--src/GraphicObjects/Window.cs24
-rw-r--r--src/Interface.cs56
-rw-r--r--src/Point.cs4
-rw-r--r--src/Rectangle.cs4
-rw-r--r--src/Size.cs2
-rw-r--r--src/StyleReader.cs134
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");
+ }
+ }
+}