diff options
| author | jpbruyere <jp.bruyere@hotmail.com> | 2016-07-30 10:00:02 +0200 |
|---|---|---|
| committer | jpbruyere <jp.bruyere@hotmail.com> | 2016-07-30 10:00:02 +0200 |
| commit | dca4d91d401ba718eccb83d6be42a12f55919838 (patch) | |
| tree | 7822513d2718fdaf7f1971fab03138e9f93904a4 | |
| parent | e4e8fa3e55edf6205387cab650ab156055d83143 (diff) | |
remove style attributes, add ';' to style files line ending, new style parser
41 files changed, 450 insertions, 130 deletions
diff --git a/Crow.csproj b/Crow.csproj index 68f67ca6..0467b314 100644 --- a/Crow.csproj +++ b/Crow.csproj @@ -321,6 +321,7 @@ <Compile Include="src\CompilerServices\Bindings.cs"> <LogicalName></LogicalName> </Compile> + <Compile Include="src\StyleReader.cs" /> </ItemGroup> <ItemGroup> <Reference Include="System" /> diff --git a/Styles/Button.style b/Styles/Button.style index 2038c524..55920f27 100644 --- a/Styles/Button.style +++ b/Styles/Button.style @@ -1,2 +1,2 @@ -Focusable = true -Fit = true +Focusable = true; +Fit = true; diff --git a/Styles/CheckBox.style b/Styles/CheckBox.style index 13d2224a..934248ab 100644 --- a/Styles/CheckBox.style +++ b/Styles/CheckBox.style @@ -1,2 +1,2 @@ -Focusable = true -Height=Fit +Focusable = true; +Height=Fit; diff --git a/Styles/ComboBox.style b/Styles/ComboBox.style index 9fa3b267..8b54a40a 100644 --- a/Styles/ComboBox.style +++ b/Styles/ComboBox.style @@ -1,2 +1,2 @@ -Focusable = true -Height = Fit +Focusable = true; +Height = Fit; diff --git a/Styles/Expandable.style b/Styles/Expandable.style index 9fa3b267..8b54a40a 100644 --- a/Styles/Expandable.style +++ b/Styles/Expandable.style @@ -1,2 +1,2 @@ -Focusable = true -Height = Fit +Focusable = true; +Height = Fit; diff --git a/Styles/Label.style b/Styles/Label.style index d5b41383..8a165c2a 100644 --- a/Styles/Label.style +++ b/Styles/Label.style @@ -1 +1 @@ -Fit = true +Fit = true; diff --git a/Styles/MessageBox.style b/Styles/MessageBox.style index ed5cb20f..1f562c11 100644 --- a/Styles/MessageBox.style +++ b/Styles/MessageBox.style @@ -1,5 +1,5 @@ -Width=200 -Height=Fit -Title=MessageBox -Focusable=true -MinimumSize=150;80 +Width=200; +Height=Fit; +Title=MessageBox; +Focusable=true; +MinimumSize=150;80; diff --git a/Styles/Popper.style b/Styles/Popper.style index 9fa3b267..8b54a40a 100644 --- a/Styles/Popper.style +++ b/Styles/Popper.style @@ -1,2 +1,2 @@ -Focusable = true -Height = Fit +Focusable = true; +Height = Fit; diff --git a/Styles/RadioButton.style b/Styles/RadioButton.style index 9fa3b267..8b54a40a 100644 --- a/Styles/RadioButton.style +++ b/Styles/RadioButton.style @@ -1,2 +1,2 @@ -Focusable = true -Height = Fit +Focusable = true; +Height = Fit; diff --git a/Styles/Slider.style b/Styles/Slider.style index e767555c..7e4f6068 100644 --- a/Styles/Slider.style +++ b/Styles/Slider.style @@ -1,4 +1,4 @@ -Background = vgradient|0:Black|0,1:Gray|0,9:Gray|1:LightGray -Foreground = Gray -Focusable = true -Fit = true +Background = vgradient|0:Black|0,1:Gray|0,9:Gray|1:LightGray; +Foreground = Gray; +Focusable = true; +Fit = true; diff --git a/Styles/Spinner.style b/Styles/Spinner.style index 9fa3b267..8b54a40a 100644 --- a/Styles/Spinner.style +++ b/Styles/Spinner.style @@ -1,2 +1,2 @@ -Focusable = true -Height = Fit +Focusable = true; +Height = Fit; diff --git a/Styles/Splitter.style b/Styles/Splitter.style index 536e13dd..b02cd714 100644 --- a/Styles/Splitter.style +++ b/Styles/Splitter.style @@ -1,2 +1,2 @@ -Focusable = true -Background = DimGray +Focusable = true; +Background = DimGray; diff --git a/Styles/TabItem.style b/Styles/TabItem.style index 9562848d..dc3820e0 100644 --- a/Styles/TabItem.style +++ b/Styles/TabItem.style @@ -1,2 +1,2 @@ -Focusable = true -CacheEnabled = false +Focusable = true; +CacheEnabled = false; diff --git a/Styles/TextBox.style b/Styles/TextBox.style index 2ad617a5..764cfcdd 100644 --- a/Styles/TextBox.style +++ b/Styles/TextBox.style @@ -1,5 +1,5 @@ -Fit = true -Focusable = true -Background = White -Foreground = Black +Fit = true; +Focusable = true; +Background = White; +Foreground = Black; diff --git a/Styles/TextRun.style b/Styles/TextRun.style index c2eb97fe..1f000247 100644 --- a/Styles/TextRun.style +++ b/Styles/TextRun.style @@ -1,2 +1,2 @@ -Fit = true -Margin = 2 +Fit = true; +Margin = 2; diff --git a/Styles/Window.style b/Styles/Window.style index f0032e46..22ee20e2 100644 --- a/Styles/Window.style +++ b/Styles/Window.style @@ -1,3 +1,3 @@ -Focusable=true -MinimumSize=50;50 -Fit=true +Focusable=true; +MinimumSize=50;50; +Fit=true; diff --git a/Tests/BasicTests.cs b/Tests/BasicTests.cs index e194bc80..0cc2c555 100644 --- a/Tests/BasicTests.cs +++ b/Tests/BasicTests.cs @@ -80,6 +80,7 @@ namespace Tests testFiles = new string [] { @"Interfaces/Divers/welcome.crow" }; + testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Divers", "*.crow")).ToArray (); testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/GraphicObject", "*.crow")).ToArray (); //testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/basicTests", "*.crow")).ToArray (); testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Container", "*.crow")).ToArray (); @@ -87,7 +88,6 @@ namespace Tests testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Stack", "*.crow")).ToArray (); testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Splitter", "*.crow")).ToArray (); testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Expandable", "*.crow")).ToArray (); - testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Divers", "*.crow")).ToArray (); this.Title = testFiles [idx] + ". Press key to switch example."; CrowInterface.LoadInterface(testFiles[idx]).DataSource = this; diff --git a/Tests/Interfaces/Divers/2.crow b/Tests/Interfaces/Divers/2.crow index 959cadb1..5b4d9c75 100755 --- a/Tests/Interfaces/Divers/2.crow +++ b/Tests/Interfaces/Divers/2.crow @@ -1,5 +1,6 @@ <?xml version="1.0"?> <VerticalStack Fit="true"> + <TextBox Font="droid, 20" Text="test text box" Width="Stretched"/> <HorizontalStack Margin="5" Fit="true" MouseEnter="{Background=White}" MouseLeave="{Background=Transparent}"> <Label Text="centered" Width="80" Height="30" Background="DarkBlue" TextAlignment="Center"/> <Label Text="top left" Width="80" Height="30" Background="DarkBlue" TextAlignment="TopLeft"/> diff --git a/Tests/ui/LabelButton.style b/Tests/ui/LabelButton.style index d376121f..617cfb8e 100644 --- a/Tests/ui/LabelButton.style +++ b/Tests/ui/LabelButton.style @@ -1,8 +1,8 @@ -MouseEnter = {Background = Gray;Foreground = White} -Fit = true -MouseLeave = {Background=Transparent;Foreground=Gray} -MouseDown = {Background=Red;Foreground=White} -MouseUp = {Background=Gray;Foreground=White} -Foreground=Gray -Margin=5 -CornerRadius=5 +MouseEnter = {Background = Gray;Foreground = White;} +Fit = true; +MouseLeave = {Background=Transparent;Foreground=Gray;} +MouseDown = {Background=Red;Foreground=White;} +MouseUp = {Background=Gray;Foreground=White;} +Foreground=Gray; +Margin=5; +CornerRadius=5; diff --git a/Tests/ui/MenuItem.style b/Tests/ui/MenuItem.style index 8011ebcc..bce8e730 100644 --- a/Tests/ui/MenuItem.style +++ b/Tests/ui/MenuItem.style @@ -1,11 +1,11 @@ -Height = Fit -Width = Stretched -MinimumSize=60;10 -Margin=2 -CornerRadius=0 -TextAlignment=Left -Foreground=Gray -MouseEnter = {Background=SeaGreen;Foreground=White} -MouseLeave = {Background=Transparent;Foreground=Gray} -MouseDown = {Background=White;Foreground=DimGray} -MouseUp = {Background=SeaGreen;Foreground=White} +Height = Fit; +Width = Stretched; +MinimumSize=60;10; +Margin=2; +CornerRadius=0; +TextAlignment=Left; +Foreground=Gray; +MouseEnter = {Background=SeaGreen;Foreground=White;} +MouseLeave = {Background=Transparent;Foreground=Gray;} +MouseDown = {Background=White;Foreground=DimGray;} +MouseUp = {Background=SeaGreen;Foreground=White;} 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 2838f6cd..433599c1 100644 --- a/src/GraphicObjects/GraphicObject.cs +++ b/src/GraphicObjects/GraphicObject.cs @@ -493,12 +493,16 @@ namespace Crow #endif Type thisType = this.GetType (); - if (Interface.DefaultValuesLoader.ContainsKey(thisType.FullName)) { - Interface.DefaultValuesLoader[thisType.FullName] (this); - applyStyle (); + if (Interface.DefaultValuesLoader.ContainsKey (thisType.FullName)) { + Interface.DefaultValuesLoader [thisType.FullName] (this); return; } + Dictionary<string, string> styling = null; + + if (Interface.CurrentInterface.Styling.ContainsKey (thisType.Name)) + styling = Interface.CurrentInterface.Styling[thisType.Name]; + //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,16 +539,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)); - if (dv == null) - continue; - defaultValue = dv.Value; + if (styling.ContainsKey (name)) { + + } else { + 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)); + if (dv == null) + continue; + defaultValue = dv.Value; + } } #endregion 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 22a60aa0..e1bf02a7 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 103f2fcf..c644767c 100644 --- a/src/GraphicObjects/TextRun.cs +++ b/src/GraphicObjects/TextRun.cs @@ -10,8 +10,6 @@ using System.ComponentModel; namespace Crow { - [Serializable] - [DefaultStyle("#Crow.Styles.TextRun.style")] public class TextRun : GraphicObject { #region CTOR 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 b8426e6f..d8f66443 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; @@ -54,6 +55,7 @@ namespace Crow public Interface(){ LayoutingQueue = new Queue<LayoutingQueueItem>(); Interface.CurrentInterface = this; + LoadStyling (); } #endregion @@ -259,7 +261,48 @@ namespace Crow return tmp; } } + public Dictionary<string, Dictionary<string, string>> Styling; + public void LoadStyling() { + Styling = new Dictionary<string, Dictionary<string, string>> (); + + //fetch styling info in this order, if member styling is alreadey referenced in previous + //assembly, it's ignored + loadStylingFromAssembly (Assembly.GetEntryAssembly ()); + loadStylingFromAssembly (Assembly.GetExecutingAssembly ()); + } + + void loadStylingFromAssembly (Assembly assembly) { + foreach (string s in assembly + .GetManifestResourceNames () + .Where (r => r.EndsWith (".style", StringComparison.OrdinalIgnoreCase))) { + + StyleReader sr = new StyleReader (assembly, s); + + } + } + + //public static bool TryGetStyle (Type crowType, out Stream stream) { + // string styleId = crowType.Name + ".style"; + + // if (tryGetStyle (Assembly.GetEntryAssembly (), styleId, out stream)) + // return true; + // if (tryGetStyle (Assembly.GetExecutingAssembly (), styleId, out stream)) + // return true; + // return false; + //} + + //static bool tryGetStyle (Assembly assembly, string styleId, out Stream stream) { + // try { + // stream = assembly.GetManifestResourceStream ( + // assembly.GetManifestResourceNames ().FirstOrDefault (r => r.EndsWith + // (styleId, StringComparison.OrdinalIgnoreCase))); + // } catch { + // stream = null; + // return false; + // } + // return true; + //} #endregion #if MEASURE_TIME diff --git a/src/StyleReader.cs b/src/StyleReader.cs index d99a1377..c1cc28bf 100644 --- a/src/StyleReader.cs +++ b/src/StyleReader.cs @@ -19,12 +19,96 @@ // 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 + public class StyleReader : StreamReader { - public StyleReader () + 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 = ""; + + 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 (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, string> (); + else if (iface.Styling [tc].ContainsKey (currentProperty)) + continue; + iface.Styling [tc] [currentProperty] = expression; + } + token = ""; + } + state = readerState.propertyName; + } else + token += c; + break; + } + } } } } |