Browse Source

Cache selector strings.

pull/472/head
Steven Kirk 11 years ago
parent
commit
7045268acc
  1. 8
      src/Perspex.Styling/Styling/ChildSelector.cs
  2. 8
      src/Perspex.Styling/Styling/DescendentSelector.cs
  3. 38
      src/Perspex.Styling/Styling/PropertyEqualsSelector.cs
  4. 8
      src/Perspex.Styling/Styling/TemplateSelector.cs
  5. 87
      src/Perspex.Styling/Styling/TypeNameAndClassSelector.cs

8
src/Perspex.Styling/Styling/ChildSelector.cs

@ -9,6 +9,7 @@ namespace Perspex.Styling
internal class ChildSelector : Selector
{
private readonly Selector _parent;
private string _selectorString;
public ChildSelector(Selector parent)
{
@ -28,7 +29,12 @@ namespace Perspex.Styling
public override string ToString()
{
return _parent.ToString() + " > ";
if (_selectorString == null)
{
_selectorString = _parent.ToString() + " > ";
}
return _selectorString;
}
protected override SelectorMatch Evaluate(IStyleable control, bool subscribe)

8
src/Perspex.Styling/Styling/DescendentSelector.cs

@ -10,6 +10,7 @@ namespace Perspex.Styling
internal class DescendentSelector : Selector
{
private readonly Selector _parent;
private string _selectorString;
public DescendentSelector(Selector parent)
{
@ -29,7 +30,12 @@ namespace Perspex.Styling
public override string ToString()
{
return _parent.ToString() + ' ';
if (_selectorString == null)
{
_selectorString = _parent.ToString() + ' ';
}
return _selectorString;
}
protected override SelectorMatch Evaluate(IStyleable control, bool subscribe)

38
src/Perspex.Styling/Styling/PropertyEqualsSelector.cs

@ -16,6 +16,7 @@ namespace Perspex.Styling
private readonly Selector _previous;
private readonly PerspexProperty _property;
private readonly object _value;
private string _selectorString;
public PropertyEqualsSelector(Selector previous, PerspexProperty property, object value)
{
@ -40,27 +41,32 @@ namespace Perspex.Styling
/// <inheritdoc/>
public override string ToString()
{
var builder = new StringBuilder();
if (_previous != null)
if (_selectorString == null)
{
builder.Append(_previous.ToString());
}
var builder = new StringBuilder();
builder.Append('[');
if (_previous != null)
{
builder.Append(_previous.ToString());
}
if (_property.IsAttached)
{
builder.Append(_property.OwnerType.Name);
builder.Append('.');
}
builder.Append('[');
builder.Append(_property.Name);
builder.Append('=');
builder.Append(_value);
builder.Append(']');
if (_property.IsAttached)
{
builder.Append(_property.OwnerType.Name);
builder.Append('.');
}
builder.Append(_property.Name);
builder.Append('=');
builder.Append(_value);
builder.Append(']');
_selectorString = builder.ToString();
}
return builder.ToString();
return _selectorString;
}
/// <inheritdoc/>

8
src/Perspex.Styling/Styling/TemplateSelector.cs

@ -8,6 +8,7 @@ namespace Perspex.Styling
internal class TemplateSelector : Selector
{
private readonly Selector _parent;
private string _selectorString;
public TemplateSelector(Selector parent)
{
@ -27,7 +28,12 @@ namespace Perspex.Styling
public override string ToString()
{
return _parent.ToString() + " /template/ ";
if (_selectorString == null)
{
_selectorString = _parent.ToString() + " /template/ ";
}
return _selectorString;
}
protected override SelectorMatch Evaluate(IStyleable control, bool subscribe)

87
src/Perspex.Styling/Styling/TypeNameAndClassSelector.cs

@ -20,6 +20,7 @@ namespace Perspex.Styling
private readonly Selector _previous;
private Type _targetType;
private Lazy<List<string>> _classes = new Lazy<List<string>>(() => new List<string>());
private string _selectorString;
public static TypeNameAndClassSelector OfType(Selector previous, Type targetType)
{
@ -81,47 +82,12 @@ namespace Perspex.Styling
/// <inheritdoc/>
public override string ToString()
{
var builder = new StringBuilder();
if (_previous != null)
if (_selectorString == null)
{
builder.Append(_previous.ToString());
_selectorString = BuildSelectorString();
}
if (TargetType != null)
{
if (IsConcreteType)
{
builder.Append(TargetType.Name);
}
else
{
builder.Append(":is(");
builder.Append(TargetType.Name);
builder.Append(")");
}
}
if (Name != null)
{
builder.Append('#');
builder.Append(Name);
}
if (_classes.IsValueCreated && _classes.Value.Count > 0)
{
foreach (var c in Classes)
{
if (!c.StartsWith(":"))
{
builder.Append('.');
}
builder.Append(c);
}
}
return builder.ToString();
return _selectorString;
}
/// <inheritdoc/>
@ -193,5 +159,50 @@ namespace Perspex.Styling
return remaining == 0;
}
private string BuildSelectorString()
{
var builder = new StringBuilder();
if (_previous != null)
{
builder.Append(_previous.ToString());
}
if (TargetType != null)
{
if (IsConcreteType)
{
builder.Append(TargetType.Name);
}
else
{
builder.Append(":is(");
builder.Append(TargetType.Name);
builder.Append(")");
}
}
if (Name != null)
{
builder.Append('#');
builder.Append(Name);
}
if (_classes.IsValueCreated && _classes.Value.Count > 0)
{
foreach (var c in Classes)
{
if (!c.StartsWith(":"))
{
builder.Append('.');
}
builder.Append(c);
}
}
return builder.ToString();
}
}
}

Loading…
Cancel
Save