aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Resources/GradientOffsetSlider.xaml
blob: 4108e1cb6ba3ba13b586c91da9ffe35855ddd968 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:Tango.MachineStudio.Common.Resources"
                    xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes">


    <Style x:Key="SliderRepeatButton" TargetType="RepeatButton">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="IsTabStop" Value="false" />
        <Setter Property="Focusable" Value="false" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="RepeatButton">
                    <Border  BorderThickness="1" BorderBrush="#8A8A8A" Background="#8A8A8A" Height="3"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="SliderRepeatButton1" TargetType="RepeatButton">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="RepeatButton">
                    <Border SnapsToDevicePixels="True" Background="#7F7F7F"  BorderThickness="1" BorderBrush="#777777" Height="3"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="SliderThumb" TargetType="Thumb">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="Background" Value="Transparent"></Setter>
        <Setter Property="Margin" Value="-11 -20 0 0"></Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Thumb">
                    <Canvas>
                    <materialDesign:PackIcon Kind="MapMarker" Foreground="DimGray" Width="24" Background="Transparent" Height="24" IsHitTestVisible="True" Margin="0 0 0 0" />
                    </Canvas>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <ControlTemplate x:Key="Slider"  TargetType="Slider">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Track Grid.Row="1" x:Name="PART_Track"   >
                <Track.DecreaseRepeatButton>
                    <RepeatButton Style="{StaticResource SliderRepeatButton1}"  Command="Slider.DecreaseLarge" />
                </Track.DecreaseRepeatButton>
                <Track.Thumb>
                    <Thumb Style="{StaticResource SliderThumb}"  />
                </Track.Thumb>
                <Track.IncreaseRepeatButton>
                    <RepeatButton Style="{StaticResource SliderRepeatButton}" Command="Slider.IncreaseLarge" />
                </Track.IncreaseRepeatButton>
            </Track>
        </Grid>
    </ControlTemplate>

    <Style x:Key="GradientOffsetSlider" TargetType="Slider">
        <Setter Property="Focusable" Value="False"/>
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Style.Triggers>
            <Trigger Property="Orientation" Value="Horizontal">
                <Setter Property="MinHeight" Value="21" />
                <Setter Property="MinWidth" Value="104" />
                <Setter Property="Template" Value="{StaticResource Slider}" />
            </Trigger>
        </Style.Triggers>
    </Style>

</ResourceDictionary>
/// Holds information about the start of a fold in an xml string. /// </summary> sealed class XmlFoldStart : NewFolding { internal int StartLine; } /// <summary> /// Determines folds for an xml string in the editor. /// </summary> public class XmlFoldingStrategy : AbstractFoldingStrategy { /// <summary> /// Flag indicating whether attributes should be displayed on folded /// elements. /// </summary> public bool ShowAttributesWhenFolded { get; set; } /// <summary> /// Create <see cref="NewFolding"/>s for the specified document. /// </summary> public override IEnumerable<NewFolding> CreateNewFoldings(TextDocument document, out int firstErrorOffset) { try { XmlTextReader reader = new XmlTextReader(document.CreateReader()); reader.XmlResolver = null; // don't resolve DTDs return CreateNewFoldings(document, reader, out firstErrorOffset); } catch (XmlException) { firstErrorOffset = 0; return Enumerable.Empty<NewFolding>(); } } /// <summary> /// Create <see cref="NewFolding"/>s for the specified document. /// </summary> public IEnumerable<NewFolding> CreateNewFoldings(TextDocument document, XmlReader reader, out int firstErrorOffset) { Stack<XmlFoldStart> stack = new Stack<XmlFoldStart>(); List<NewFolding> foldMarkers = new List<NewFolding>(); try { while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: if (!reader.IsEmptyElement) { XmlFoldStart newFoldStart = CreateElementFoldStart(document, reader); stack.Push(newFoldStart); } break; case XmlNodeType.EndElement: XmlFoldStart foldStart = stack.Pop(); CreateElementFold(document, foldMarkers, reader, foldStart); break; case XmlNodeType.Comment: CreateCommentFold(document, foldMarkers, reader); break; } } firstErrorOffset = -1; } catch (XmlException ex) { // ignore errors at invalid positions (prevent ArgumentOutOfRangeException) if (ex.LineNumber >= 1 && ex.LineNumber <= document.LineCount) firstErrorOffset = document.GetOffset(ex.LineNumber, ex.LinePosition); else firstErrorOffset = 0; } foldMarkers.Sort((a,b) => a.StartOffset.CompareTo(b.StartOffset)); return foldMarkers; } static int GetOffset(TextDocument document, XmlReader reader) { IXmlLineInfo info = reader as IXmlLineInfo; if (info != null && info.HasLineInfo()) { return document.GetOffset(info.LineNumber, info.LinePosition); } else { throw new ArgumentException("XmlReader does not have positioning information."); } } /// <summary> /// Creates a comment fold if the comment spans more than one line. /// </summary> /// <remarks>The text displayed when the comment is folded is the first /// line of the comment.</remarks> static void CreateCommentFold(TextDocument document, List<NewFolding> foldMarkers, XmlReader reader) { string comment = reader.Value; if (comment != null) { int firstNewLine = comment.IndexOf('\n'); if (firstNewLine >= 0) { // Take off 4 chars to get the actual comment start (takes // into account the <!-- chars. int startOffset = GetOffset(document, reader) - 4; int endOffset = startOffset + comment.Length + 7; string foldText = String.Concat("<!--", comment.Substring(0, firstNewLine).TrimEnd('\r') , "-->"); foldMarkers.Add(new NewFolding(startOffset, endOffset) { Name = foldText } ); } } } /// <summary> /// Creates an XmlFoldStart for the start tag of an element. /// </summary> XmlFoldStart CreateElementFoldStart(TextDocument document, XmlReader reader) { // Take off 1 from the offset returned // from the xml since it points to the start // of the element name and not the beginning // tag. //XmlFoldStart newFoldStart = new XmlFoldStart(reader.Prefix, reader.LocalName, reader.LineNumber - 1, reader.LinePosition - 2); XmlFoldStart newFoldStart = new XmlFoldStart(); IXmlLineInfo lineInfo = (IXmlLineInfo)reader; newFoldStart.StartLine = lineInfo.LineNumber; newFoldStart.StartOffset = document.GetOffset(newFoldStart.StartLine, lineInfo.LinePosition - 1); if (this.ShowAttributesWhenFolded && reader.HasAttributes) { newFoldStart.Name = String.Concat("<", reader.Name, " ", GetAttributeFoldText(reader), ">"); } else { newFoldStart.Name = String.Concat("<", reader.Name, ">"); } return newFoldStart; } /// <summary> /// Create an element fold if the start and end tag are on /// different lines. /// </summary> static void CreateElementFold(TextDocument document, List<NewFolding> foldMarkers, XmlReader reader, XmlFoldStart foldStart) { IXmlLineInfo lineInfo = (IXmlLineInfo)reader; int endLine = lineInfo.LineNumber; if (endLine > foldStart.StartLine) { int endCol = lineInfo.LinePosition + reader.Name.Length + 1; foldStart.EndOffset = document.GetOffset(endLine, endCol); foldMarkers.Add(foldStart); } } /// <summary> /// Gets the element's attributes as a string on one line that will /// be displayed when the element is folded. /// </summary> /// <remarks> /// Currently this puts all attributes from an element on the same /// line of the start tag. It does not cater for elements where attributes /// are not on the same line as the start tag. /// </remarks> static string GetAttributeFoldText(XmlReader reader) { StringBuilder text = new StringBuilder(); for (int i = 0; i < reader.AttributeCount; ++i) { reader.MoveToAttribute(i); text.Append(reader.Name); text.Append("="); text.Append(reader.QuoteChar.ToString()); text.Append(XmlEncodeAttributeValue(reader.Value, reader.QuoteChar)); text.Append(reader.QuoteChar.ToString()); // Append a space if this is not the // last attribute. if (i < reader.AttributeCount - 1) { text.Append(" "); } } return text.ToString(); } /// <summary> /// Xml encode the attribute string since the string returned from /// the XmlTextReader is the plain unencoded string and .NET /// does not provide us with an xml encode method. /// </summary> static string XmlEncodeAttributeValue(string attributeValue, char quoteChar) { StringBuilder encodedValue = new StringBuilder(attributeValue); encodedValue.Replace("&", "&amp;"); encodedValue.Replace("<", "&lt;"); encodedValue.Replace(">", "&gt;"); if (quoteChar == '"') { encodedValue.Replace("\"", "&quot;"); } else { encodedValue.Replace("'", "&apos;"); } return encodedValue.ToString(); } } }