Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Marker bar for C# application?

Tags:

c#

Is there a marker bar component for a C# application what i could use in my application? As marker bar i mean something like ReSharper adds to Visual Studio:enter image description here

Another example for something similar (the bar on the left): enter image description here

EDIT: I found non-free component for java http://www.sideofsoftware.com/marker_bar/doc/sos/marker/JMarkerBar.html what does exactly what i want to do. It doesnt suite for me but maybe it helps someone.

like image 398
hs2d Avatar asked May 21 '11 18:05

hs2d


2 Answers

In WPF the bar is a bit like a ListBox with just a different way of displaying a 1 pixel high line for each line of text. The state of the line would influence the color of the line and selecting a line would raise the SelectionChanged event to which the textbox could respond.

Let me know if you want me to show a prototype.

EDIT

Here goes. You can click/select a line in the bar and the textbox will scroll to that line.

Still to add:

  1. what to do when the number of lines is to large for the bar?

  2. A different way to show the line that is current in the bar?

  3. Keep the selected line in the bar in sync with the caret in the text box.

  4. ...

These can be solved but depend largely on what you want. This should get you started.

XAML:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication2"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Window.Resources>
        <local:StatusToBrushConverter x:Key="statusToBrushConverter" />
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="30" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding}"
                 SelectionChanged="ListBox_SelectionChanged">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="HorizontalContentAlignment"
                            Value="Stretch" />
                    <Setter Property="Opacity"
                            Value="0.5" />
                    <Setter Property="MaxHeight"
                            Value="1" />
                    <Setter Property="MinHeight"
                            Value="1" />
                    <Style.Triggers>
                        <Trigger Property="IsSelected"
                                 Value="True">
                            <Trigger.Setters>
                                <Setter Property="Opacity"
                                        Value="1.0" />
                            </Trigger.Setters>
                        </Trigger>
                    </Style.Triggers>
                </Style>

            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Rectangle StrokeThickness="0"
                               Stroke="Green"
                               Fill="{Binding Status, Converter={StaticResource statusToBrushConverter}}"
                               Height="1"
                               HorizontalAlignment="Stretch" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <TextBox AcceptsReturn="True"
                 Grid.Column="1"
                 x:Name="codeBox" />
    </Grid>
</Window>

C#:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;

namespace WpfApplication2
{
    public partial class MainWindow : Window
    {
        private CodeLines lines;

        public MainWindow()
        {
            InitializeComponent();

            lines = new CodeLines();

            Random random = new Random();
            for (int i = 0; i < 200; i++)
            {
                lines.Add(new CodeLine { Status = (VersionStatus)random.Next(0, 5), Line = "Line " + i });
            }

            this.DataContext = lines;

            codeBox.Text = String.Join("\n",  from line in lines
                                            select line.Line);
        }

        private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var selectedLine = ((ListBox)sender).SelectedIndex;
            codeBox.ScrollToLine(selectedLine);
        }
    }

    public enum VersionStatus
    {
        Original,
        Added,
        Modified,
        Deleted
    }

    public class CodeLine : INotifyPropertyChanged
    {

        private VersionStatus status;

        public VersionStatus Status
        {
            get { return status; }
            set
            {
                if (status != value)
                {
                    status = value;
                    OnPropertyChanged("Status");
                }
            }
        }

        private string line;

        public string Line
        {
            get { return line; }
            set
            {
                if (line != value)
                {
                    line = value;
                    OnPropertyChanged("Line");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            var p = PropertyChanged;
            if (p != null)
            {
                p(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    public class CodeLines : ObservableCollection<CodeLine>
    {
    }


    class StatusToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var status = (VersionStatus)value;
            switch (status)
            {
                case VersionStatus.Original:
                    return Brushes.Green;
                case VersionStatus.Added:
                    return Brushes.Blue;
                case VersionStatus.Modified:
                    return Brushes.Yellow;
                case VersionStatus.Deleted:
                    return Brushes.Red;
                default:
                    return DependencyProperty.UnsetValue;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
like image 58
Emond Avatar answered Nov 15 '22 00:11

Emond


You could use the Graphics class on a panel to paint it yourself.

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx

(I wouldn't use a bar graph as Teoman Soygul suggested, that's abusing components for something they aren't supposed to do. Same with the listbox idea by Erno. List boxes are made for showing lines of text, not marker bars.)

like image 34
sorcix Avatar answered Nov 15 '22 02:11

sorcix