37 changed files with 1757 additions and 528 deletions
After Width: | Height: | Size: 924 B |
After Width: | Height: | Size: 706 B |
After Width: | Height: | Size: 791 B |
After Width: | Height: | Size: 801 B |
@ -0,0 +1,22 @@ |
|||||||
|
<UserControl x:Class="Debugger.AddIn.Pads.Controls.ConditionCell" |
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||||
|
xmlns:SDGui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop" |
||||||
|
xmlns:local="clr-namespace:Debugger.AddIn.Pads.Controls"> |
||||||
|
<UserControl.Resources> |
||||||
|
<DataTemplate x:Key="ConditionCellTemplate"> |
||||||
|
<Grid HorizontalAlignment="Stretch"> |
||||||
|
<local:ConditionCell |
||||||
|
CommandText="{Binding Path=Condition, UpdateSourceTrigger=LostFocus}" |
||||||
|
Tag="{Binding Path=Tag, Mode=TwoWay}"/> |
||||||
|
</Grid> |
||||||
|
</DataTemplate> |
||||||
|
</UserControl.Resources> |
||||||
|
<Grid> |
||||||
|
<Grid.ColumnDefinitions> |
||||||
|
<ColumnDefinition Width="Auto" MinWidth="200"/> |
||||||
|
</Grid.ColumnDefinitions> |
||||||
|
<ContentPresenter |
||||||
|
Name="ConsolePanel" /> |
||||||
|
</Grid> |
||||||
|
</UserControl> |
@ -0,0 +1,190 @@ |
|||||||
|
|
||||||
|
using System; |
||||||
|
using System.IO; |
||||||
|
using System.Windows; |
||||||
|
using System.Windows.Controls; |
||||||
|
using System.Windows.Input; |
||||||
|
|
||||||
|
using ICSharpCode.AvalonEdit; |
||||||
|
using ICSharpCode.Core; |
||||||
|
using ICSharpCode.Core.Presentation; |
||||||
|
using ICSharpCode.NRefactory; |
||||||
|
using ICSharpCode.SharpDevelop; |
||||||
|
using ICSharpCode.SharpDevelop.Bookmarks.Pad.Controls; |
||||||
|
using ICSharpCode.SharpDevelop.Debugging; |
||||||
|
using ICSharpCode.SharpDevelop.Dom; |
||||||
|
using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver; |
||||||
|
using ICSharpCode.SharpDevelop.Editor; |
||||||
|
using ICSharpCode.SharpDevelop.Editor.CodeCompletion; |
||||||
|
using ICSharpCode.SharpDevelop.Gui; |
||||||
|
using ICSharpCode.SharpDevelop.Project; |
||||||
|
|
||||||
|
namespace Debugger.AddIn.Pads.Controls |
||||||
|
{ |
||||||
|
public partial class ConditionCell : UserControl |
||||||
|
{ |
||||||
|
private string language; |
||||||
|
|
||||||
|
protected ConsoleControl console; |
||||||
|
|
||||||
|
public static readonly DependencyProperty CommandTextProperty = |
||||||
|
DependencyProperty.Register("CommandText", typeof(string), typeof(ConditionCell), |
||||||
|
new UIPropertyMetadata(null, new PropertyChangedCallback(OnCommandTextChanged))); |
||||||
|
|
||||||
|
private NRefactoryResolver resolver; |
||||||
|
|
||||||
|
public ConditionCell() |
||||||
|
{ |
||||||
|
InitializeComponent(); |
||||||
|
|
||||||
|
console = new ConsoleControl(); |
||||||
|
console.TextAreaTextEntered += new TextCompositionEventHandler(consoleControl_TextAreaTextEntered); |
||||||
|
console.TextAreaPreviewKeyDown += new KeyEventHandler(console_TextAreaPreviewKeyDown); |
||||||
|
console.LostFocus += new RoutedEventHandler(console_LostFocus); |
||||||
|
console.HideScrollBar(); |
||||||
|
ConsolePanel.Content = console; |
||||||
|
|
||||||
|
// get language
|
||||||
|
if (ProjectService.CurrentProject == null) |
||||||
|
language = "C#"; |
||||||
|
else |
||||||
|
language = ProjectService.CurrentProject.Language; |
||||||
|
resolver = new NRefactoryResolver(LanguageProperties.GetLanguage(language)); |
||||||
|
|
||||||
|
// FIXME set language
|
||||||
|
if (language == "VB" || language == "VBNet") { |
||||||
|
console.SetHighlighting("VBNET"); |
||||||
|
} |
||||||
|
else { |
||||||
|
console.SetHighlighting("C#"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets/sets the command text displayed at the command prompt.
|
||||||
|
/// </summary>
|
||||||
|
public string CommandText { |
||||||
|
get { return console.CommandText.Trim(); } |
||||||
|
set { console.CommandText = value; } |
||||||
|
} |
||||||
|
|
||||||
|
private BreakpointBookmark Breakpoint { |
||||||
|
get { |
||||||
|
var model = Model; |
||||||
|
return model.Mark as BreakpointBookmark; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private ListViewPadItemModel Model { |
||||||
|
get { return Tag as ListViewPadItemModel; } |
||||||
|
} |
||||||
|
|
||||||
|
private ITextEditor TextEditor { |
||||||
|
get { |
||||||
|
return console.TextEditor; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void console_TextAreaPreviewKeyDown(object sender, KeyEventArgs e) |
||||||
|
{ |
||||||
|
if (e.Key == Key.Return || e.Key == Key.Escape) { |
||||||
|
|
||||||
|
if (e.Key == Key.Escape) |
||||||
|
CommandText = string.Empty; |
||||||
|
else { |
||||||
|
if(!CheckSyntax()) |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
UpdateBreakpoint(); |
||||||
|
|
||||||
|
e.Handled = true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void console_LostFocus(object sender, RoutedEventArgs e) |
||||||
|
{ |
||||||
|
if (string.IsNullOrEmpty(CommandText) || !this.CheckSyntax()) |
||||||
|
return; |
||||||
|
|
||||||
|
UpdateBreakpoint(); |
||||||
|
} |
||||||
|
|
||||||
|
private void UpdateBreakpoint() |
||||||
|
{ |
||||||
|
Breakpoint.Condition = CommandText; |
||||||
|
Model.Condition = CommandText; |
||||||
|
Breakpoint.ScriptLanguage = language; |
||||||
|
Model.Language = language; |
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(console.CommandText)) { |
||||||
|
Breakpoint.Action = BreakpointAction.Condition; |
||||||
|
Model.Image = PresentationResourceService.GetImage("Bookmarks.BreakpointConditional").Source; |
||||||
|
} |
||||||
|
else { |
||||||
|
Breakpoint.Action = BreakpointAction.Break; |
||||||
|
Model.Image = PresentationResourceService.GetImage("Bookmarks.Breakpoint").Source; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private bool CheckSyntax() |
||||||
|
{ |
||||||
|
string command = CommandText; |
||||||
|
|
||||||
|
// FIXME workaround the NRefactory issue that needs a ; at the end
|
||||||
|
if (language == "C#") { |
||||||
|
if(!command.EndsWith(";")) |
||||||
|
command += ";"; |
||||||
|
// FIXME only one string should be available; highlighting expects C#, supproted language, CSharp
|
||||||
|
language = "CSharp"; |
||||||
|
} |
||||||
|
|
||||||
|
SupportedLanguage supportedLanguage = (SupportedLanguage)Enum.Parse(typeof(SupportedLanguage), language.ToString(), true); |
||||||
|
using (var parser = ParserFactory.CreateParser(supportedLanguage, new StringReader(TextEditor.Document.Text))) { |
||||||
|
parser.ParseExpression(); |
||||||
|
if (parser.Errors.Count > 0) { |
||||||
|
MessageService.ShowError(parser.Errors.ErrorOutput); |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
private void consoleControl_TextAreaTextEntered(object sender, TextCompositionEventArgs e) |
||||||
|
{ |
||||||
|
foreach (char ch in e.Text) { |
||||||
|
if (ch == '.') { |
||||||
|
ShowDotCompletion(console.CommandText); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void ShowDotCompletion(string currentText) |
||||||
|
{ |
||||||
|
var seg = Breakpoint; |
||||||
|
|
||||||
|
var expressionFinder = ParserService.GetExpressionFinder(seg.FileName.ToString()); |
||||||
|
var info = ParserService.GetParseInformation(seg.FileName.ToString()); |
||||||
|
|
||||||
|
string text = ParserService.GetParseableFileContent(seg.FileName.ToString()).Text; |
||||||
|
|
||||||
|
int currentOffset = TextEditor.Caret.Offset - console.CommandOffset - 1; |
||||||
|
|
||||||
|
var expr = expressionFinder.FindExpression(currentText, currentOffset); |
||||||
|
|
||||||
|
expr.Region = new DomRegion(seg.LineNumber, seg.ColumnNumber, seg.LineNumber, seg.ColumnNumber); |
||||||
|
|
||||||
|
var rr = resolver.Resolve(expr, info, text); |
||||||
|
|
||||||
|
if (rr != null) { |
||||||
|
TextEditor.ShowCompletionWindow(new DotCodeCompletionItemProvider().GenerateCompletionListForResolveResult(rr, expr.Context)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static void OnCommandTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { |
||||||
|
var cell = d as ConditionCell; |
||||||
|
cell.CommandText = e.NewValue.ToString(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Globalization; |
||||||
|
using System.Windows; |
||||||
|
using System.Windows.Controls; |
||||||
|
using System.Windows.Data; |
||||||
|
using System.Windows.Media; |
||||||
|
|
||||||
|
namespace Debugger.AddIn.Pads.Controls |
||||||
|
{ |
||||||
|
public class TreeListViewConverter : IValueConverter |
||||||
|
{ |
||||||
|
private const double INDENTATION_SIZE = 10; |
||||||
|
|
||||||
|
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) |
||||||
|
{ |
||||||
|
if (value == null) return null; |
||||||
|
if (targetType == typeof(double) && typeof(DependencyObject).IsAssignableFrom(value.GetType())) |
||||||
|
{ |
||||||
|
DependencyObject element = value as DependencyObject; |
||||||
|
int level = -1; |
||||||
|
for (; element != null; element = VisualTreeHelper.GetParent(element)) { |
||||||
|
if (typeof(TreeViewItem).IsAssignableFrom(element.GetType())) { |
||||||
|
level++; |
||||||
|
} |
||||||
|
} |
||||||
|
return INDENTATION_SIZE * level; |
||||||
|
} |
||||||
|
|
||||||
|
throw new NotSupportedException(); |
||||||
|
} |
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) |
||||||
|
{ |
||||||
|
throw new NotSupportedException("This method is not supported."); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class BoolToVisibilityConverter : IMultiValueConverter |
||||||
|
{ |
||||||
|
public object Convert(object[] values, Type targetType, |
||||||
|
object parameter, CultureInfo culture) |
||||||
|
{ |
||||||
|
bool val = bool.Parse(parameter.ToString()); |
||||||
|
return val == (bool.Parse(values[0].ToString()) && bool.Parse(values[1].ToString())) ? Visibility.Visible : Visibility.Collapsed; |
||||||
|
} |
||||||
|
|
||||||
|
public object[] ConvertBack(object value, Type[] targetTypes, |
||||||
|
object parameter, CultureInfo culture) |
||||||
|
{ |
||||||
|
throw new NotImplementedException(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,74 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Globalization; |
||||||
|
using System.Windows; |
||||||
|
using System.Windows.Controls; |
||||||
|
using System.Windows.Controls.Primitives; |
||||||
|
using System.Windows.Data; |
||||||
|
|
||||||
|
using Debugger.AddIn.TreeModel; |
||||||
|
|
||||||
|
namespace Debugger.AddIn.Pads.Controls |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// Represents a control that displays hierarchical data in a tree structure
|
||||||
|
/// that has items that can expand and collapse.
|
||||||
|
/// </summary>
|
||||||
|
public class TreeListView : TreeView |
||||||
|
{ |
||||||
|
static TreeListView() |
||||||
|
{ |
||||||
|
//Override the default style and the default control template
|
||||||
|
DefaultStyleKeyProperty.OverrideMetadata(typeof(TreeListView), new FrameworkPropertyMetadata(typeof(TreeListView))); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize a new instance of TreeListView.
|
||||||
|
/// </summary>
|
||||||
|
public TreeListView() |
||||||
|
{ |
||||||
|
Columns = new GridViewColumnCollection(); |
||||||
|
} |
||||||
|
|
||||||
|
#region Properties
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the collection of System.Windows.Controls.GridViewColumn
|
||||||
|
/// objects that is defined for this TreeListView.
|
||||||
|
/// </summary>
|
||||||
|
public GridViewColumnCollection Columns |
||||||
|
{ |
||||||
|
get { return (GridViewColumnCollection)GetValue(ColumnsProperty); } |
||||||
|
set { SetValue(ColumnsProperty, value); } |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether columns in a TreeListView can be
|
||||||
|
/// reordered by a drag-and-drop operation. This is a dependency property.
|
||||||
|
/// </summary>
|
||||||
|
public bool AllowsColumnReorder |
||||||
|
{ |
||||||
|
get { return (bool)GetValue(AllowsColumnReorderProperty); } |
||||||
|
set { SetValue(AllowsColumnReorderProperty, value); } |
||||||
|
} |
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Static Dependency Properties
|
||||||
|
// Using a DependencyProperty as the backing store for AllowsColumnReorder. This enables animation, styling, binding, etc...
|
||||||
|
public static readonly DependencyProperty AllowsColumnReorderProperty = |
||||||
|
DependencyProperty.Register("AllowsColumnReorder", typeof(bool), typeof(TreeListView), new UIPropertyMetadata(null)); |
||||||
|
|
||||||
|
// Using a DependencyProperty as the backing store for Columns. This enables animation, styling, binding, etc...
|
||||||
|
public static readonly DependencyProperty ColumnsProperty = |
||||||
|
DependencyProperty.Register("Columns", typeof(GridViewColumnCollection), |
||||||
|
typeof(TreeListView), |
||||||
|
new UIPropertyMetadata(null)); |
||||||
|
#endregion
|
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a control that can switch states in order to expand a node of a TreeListView.
|
||||||
|
/// </summary>
|
||||||
|
public class TreeListViewExpander : ToggleButton { } |
||||||
|
} |
@ -0,0 +1,330 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<UserControl |
||||||
|
x:Class="Debugger.AddIn.Pads.Controls.WatchList" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:localControls="clr-namespace:Debugger.AddIn.Pads.Controls" xmlns:core="http://icsharpcode.net/sharpdevelop/core" |
||||||
|
DataContext="{Binding RelativeSource={RelativeSource Self}}" |
||||||
|
Background="White"> |
||||||
|
<UserControl.Resources> |
||||||
|
<localControls:BoolToVisibilityConverter |
||||||
|
x:Key="boolToVisibility" /> |
||||||
|
<localControls:TreeListViewConverter |
||||||
|
x:Key="TreeListViewConverter" /> |
||||||
|
<Style |
||||||
|
x:Key="BorderStyle" |
||||||
|
TargetType="Border"> |
||||||
|
<Setter |
||||||
|
Property="BorderBrush" |
||||||
|
Value="LightGray" /> |
||||||
|
<Setter |
||||||
|
Property="BorderThickness" |
||||||
|
Value="1,0,1,1"></Setter> |
||||||
|
<Setter |
||||||
|
Property="VerticalAlignment" |
||||||
|
Value="Center" /> |
||||||
|
<Setter |
||||||
|
Property="HorizontalAlignment" |
||||||
|
Value="Stretch" /> |
||||||
|
</Style> |
||||||
|
<Style |
||||||
|
TargetType="{x:Type TextBox}" |
||||||
|
x:Key="TextBoxStyle"> |
||||||
|
<Setter Property="BorderThickness" Value="0"/> |
||||||
|
<Setter Property="BorderBrush" Value="Transparent"/> |
||||||
|
<Setter Property="Background" Value="White"/> |
||||||
|
<Setter |
||||||
|
Property="VerticalAlignment" |
||||||
|
Value="Center" /> |
||||||
|
<Setter |
||||||
|
Property="Visibility"> |
||||||
|
<Setter.Value> |
||||||
|
<MultiBinding |
||||||
|
Converter="{StaticResource boolToVisibility}" |
||||||
|
ConverterParameter="True"> |
||||||
|
<Binding |
||||||
|
Path="CanSetText" /> |
||||||
|
<Binding |
||||||
|
Path="IsSelected" |
||||||
|
RelativeSource="{RelativeSource AncestorType=TreeViewItem}" /> |
||||||
|
</MultiBinding> |
||||||
|
</Setter.Value> |
||||||
|
</Setter> |
||||||
|
</Style> |
||||||
|
<Style |
||||||
|
TargetType="{x:Type TextBlock}" |
||||||
|
x:Key="TextBlockStyle"> |
||||||
|
<Setter |
||||||
|
Property="VerticalAlignment" |
||||||
|
Value="Center" /> |
||||||
|
<Setter |
||||||
|
Property="Visibility"> |
||||||
|
<Setter.Value> |
||||||
|
<MultiBinding |
||||||
|
Converter="{StaticResource boolToVisibility}" |
||||||
|
ConverterParameter="False"> |
||||||
|
<Binding |
||||||
|
Path="CanSetText" /> |
||||||
|
<Binding |
||||||
|
Path="IsSelected" |
||||||
|
RelativeSource="{RelativeSource AncestorType=TreeViewItem}" /> |
||||||
|
</MultiBinding> |
||||||
|
</Setter.Value> |
||||||
|
</Setter> |
||||||
|
</Style> |
||||||
|
<Style |
||||||
|
x:Key="ExpandToggleStyle" |
||||||
|
TargetType="{x:Type ToggleButton}"> |
||||||
|
<Setter |
||||||
|
Property="Focusable" |
||||||
|
Value="False" /> |
||||||
|
<Setter |
||||||
|
Property="Template"> |
||||||
|
<Setter.Value> |
||||||
|
<ControlTemplate |
||||||
|
TargetType="ToggleButton"> |
||||||
|
<Grid |
||||||
|
Width="21" |
||||||
|
Height="16"> |
||||||
|
<Path |
||||||
|
x:Name="ExpandPath" |
||||||
|
HorizontalAlignment="Left" |
||||||
|
VerticalAlignment="Center" |
||||||
|
Margin="5,0,1,1" |
||||||
|
Stroke="Black" |
||||||
|
Fill="Transparent" |
||||||
|
Data="M 4 0 L 8 4 L 4 8 Z" /> |
||||||
|
</Grid> |
||||||
|
<ControlTemplate.Triggers> |
||||||
|
<Trigger |
||||||
|
Property="IsChecked" |
||||||
|
Value="True"> |
||||||
|
<Setter |
||||||
|
Property="Data" |
||||||
|
TargetName="ExpandPath" |
||||||
|
Value="M 0 4 L 8 4 L 4 8 Z" /> |
||||||
|
<Setter |
||||||
|
TargetName="ExpandPath" |
||||||
|
Property="Fill" |
||||||
|
Value="Black" /> |
||||||
|
</Trigger> |
||||||
|
</ControlTemplate.Triggers> |
||||||
|
</ControlTemplate> |
||||||
|
</Setter.Value> |
||||||
|
</Setter> |
||||||
|
</Style> |
||||||
|
<!-- TreeViewItem--> |
||||||
|
<ControlTemplate |
||||||
|
TargetType="TreeViewItem" |
||||||
|
x:Key="TreeListViewItem"> |
||||||
|
<StackPanel> |
||||||
|
<Border |
||||||
|
Style="{StaticResource BorderStyle}" |
||||||
|
x:Name="Border"> |
||||||
|
<GridViewRowPresenter |
||||||
|
Content="{TemplateBinding Header}" |
||||||
|
Columns="{Binding Columns,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=localControls:TreeListView}}" /> |
||||||
|
</Border> |
||||||
|
<ItemsPresenter |
||||||
|
x:Name="ItemsPresenter" |
||||||
|
Visibility="Collapsed" /> |
||||||
|
</StackPanel> |
||||||
|
<ControlTemplate.Triggers> |
||||||
|
<Trigger |
||||||
|
Property="IsExpanded" |
||||||
|
Value="True"> |
||||||
|
<Setter |
||||||
|
TargetName="ItemsPresenter" |
||||||
|
Property="Visibility" |
||||||
|
Value="Visible" /> |
||||||
|
</Trigger> |
||||||
|
<Trigger |
||||||
|
Property="IsSelected" |
||||||
|
Value="true"> |
||||||
|
<Setter |
||||||
|
TargetName="Border" |
||||||
|
Property="Background" |
||||||
|
Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" /> |
||||||
|
<Setter |
||||||
|
Property="Foreground" |
||||||
|
Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" /> |
||||||
|
</Trigger> |
||||||
|
<MultiTrigger> |
||||||
|
<MultiTrigger.Conditions> |
||||||
|
<Condition |
||||||
|
Property="IsSelected" |
||||||
|
Value="true" /> |
||||||
|
<Condition |
||||||
|
Property="IsSelectionActive" |
||||||
|
Value="false" /> |
||||||
|
</MultiTrigger.Conditions> |
||||||
|
<Setter |
||||||
|
TargetName="Border" |
||||||
|
Property="Background" |
||||||
|
Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" /> |
||||||
|
<Setter |
||||||
|
Property="Foreground" |
||||||
|
Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" /> |
||||||
|
</MultiTrigger> |
||||||
|
<Trigger |
||||||
|
Property="IsEnabled" |
||||||
|
Value="false"> |
||||||
|
<Setter |
||||||
|
Property="Foreground" |
||||||
|
Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> |
||||||
|
</Trigger> |
||||||
|
</ControlTemplate.Triggers> |
||||||
|
</ControlTemplate> |
||||||
|
<!--TreeListViewExpander--> |
||||||
|
<ControlTemplate |
||||||
|
TargetType="{x:Type localControls:TreeListViewExpander}" |
||||||
|
x:Key="TreeListViewExpander"> |
||||||
|
<StackPanel |
||||||
|
Orientation="Horizontal" |
||||||
|
x:Name="ContainerElement"> |
||||||
|
<FrameworkElement |
||||||
|
Width="{Binding RelativeSource={x:Static RelativeSource.Self},Converter={StaticResource TreeListViewConverter}}" /> |
||||||
|
<ToggleButton |
||||||
|
Style="{StaticResource ExpandToggleStyle}" |
||||||
|
IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=TreeViewItem}}" /> |
||||||
|
</StackPanel> |
||||||
|
</ControlTemplate> |
||||||
|
<!--TreeListView--> |
||||||
|
<Style |
||||||
|
TargetType="{x:Type localControls:TreeListView}"> |
||||||
|
<Setter |
||||||
|
Property="Template"> |
||||||
|
<Setter.Value> |
||||||
|
<ControlTemplate |
||||||
|
TargetType="{x:Type localControls:TreeListView}"> |
||||||
|
<ControlTemplate.Resources> |
||||||
|
<Style |
||||||
|
TargetType="TreeViewItem"> |
||||||
|
<Setter |
||||||
|
Property="Template" |
||||||
|
Value="{StaticResource TreeListViewItem}" /> |
||||||
|
</Style> |
||||||
|
<Style |
||||||
|
TargetType="localControls:TreeListViewExpander"> |
||||||
|
<Setter |
||||||
|
Property="Template" |
||||||
|
Value="{StaticResource TreeListViewExpander}" /> |
||||||
|
</Style> |
||||||
|
</ControlTemplate.Resources> |
||||||
|
<Border |
||||||
|
Background="{TemplateBinding Background}" |
||||||
|
BorderBrush="{TemplateBinding BorderBrush}" |
||||||
|
BorderThickness="{TemplateBinding BorderThickness}"> |
||||||
|
<ScrollViewer |
||||||
|
HorizontalScrollBarVisibility="Auto" |
||||||
|
VerticalScrollBarVisibility="Disabled"> |
||||||
|
<Grid> |
||||||
|
<Grid.RowDefinitions> |
||||||
|
<RowDefinition |
||||||
|
Height="Auto" /> |
||||||
|
<RowDefinition |
||||||
|
Height="*" /> |
||||||
|
</Grid.RowDefinitions> |
||||||
|
<GridViewHeaderRowPresenter |
||||||
|
Columns="{TemplateBinding Columns}" |
||||||
|
AllowsColumnReorder="{TemplateBinding AllowsColumnReorder}" /> |
||||||
|
<ScrollViewer |
||||||
|
HorizontalScrollBarVisibility="Disabled" |
||||||
|
VerticalScrollBarVisibility="Auto" |
||||||
|
Grid.Row="1"> |
||||||
|
<ItemsPresenter /> |
||||||
|
</ScrollViewer> |
||||||
|
</Grid> |
||||||
|
</ScrollViewer> |
||||||
|
</Border> |
||||||
|
</ControlTemplate> |
||||||
|
</Setter.Value> |
||||||
|
</Setter> |
||||||
|
</Style> |
||||||
|
<!-- Name column --> |
||||||
|
<DataTemplate |
||||||
|
x:Key="CellTemplate_Name"> |
||||||
|
<StackPanel |
||||||
|
Orientation="Horizontal"> |
||||||
|
<localControls:TreeListViewExpander |
||||||
|
x:Name="Expander" /> |
||||||
|
<Image |
||||||
|
MaxHeight="16" |
||||||
|
MaxWidth="16" |
||||||
|
Margin="3,0,0,0" |
||||||
|
Source="{Binding Path=ImageSource}" |
||||||
|
VerticalAlignment="Center" /> |
||||||
|
<TextBlock |
||||||
|
Margin="3,0,0,0" |
||||||
|
MinWidth="400" |
||||||
|
HorizontalAlignment="Stretch" |
||||||
|
VerticalAlignment="Center" |
||||||
|
Text="{Binding Path=Name}" /> |
||||||
|
</StackPanel> |
||||||
|
<DataTemplate.Triggers> |
||||||
|
<DataTrigger |
||||||
|
Binding="{Binding Path=HasChildNodes}" |
||||||
|
Value="False"> |
||||||
|
<Setter |
||||||
|
TargetName="Expander" |
||||||
|
Property="Visibility" |
||||||
|
Value="Hidden" /> |
||||||
|
</DataTrigger> |
||||||
|
</DataTemplate.Triggers> |
||||||
|
</DataTemplate> |
||||||
|
<!-- Value column --> |
||||||
|
<DataTemplate |
||||||
|
x:Key="CellTemplate_Value"> |
||||||
|
<StackPanel |
||||||
|
Orientation="Horizontal"> |
||||||
|
<TextBlock |
||||||
|
VerticalAlignment="Center" |
||||||
|
MinWidth="200" |
||||||
|
Text="{Binding Path=Text}" |
||||||
|
Style="{StaticResource TextBlockStyle}" /> |
||||||
|
<TextBox |
||||||
|
Text="{Binding Path=Text, Mode=OneWay}" |
||||||
|
Style="{StaticResource TextBoxStyle}" KeyUp="TextBox_KeyUp" /> |
||||||
|
</StackPanel> |
||||||
|
</DataTemplate> |
||||||
|
<!-- Type column --> |
||||||
|
<DataTemplate |
||||||
|
x:Key="CellTemplate_Type"> |
||||||
|
<TextBlock |
||||||
|
VerticalAlignment="Center" |
||||||
|
MinWidth="200" |
||||||
|
Text="{Binding Path=Type}" /> |
||||||
|
</DataTemplate> |
||||||
|
</UserControl.Resources> |
||||||
|
<DockPanel> |
||||||
|
<localControls:TreeListView |
||||||
|
HorizontalAlignment="Stretch" |
||||||
|
VerticalAlignment="Stretch" |
||||||
|
ItemsSource="{Binding Path=WatchItems}" |
||||||
|
x:Name="MyList"> |
||||||
|
<localControls:TreeListView.ItemTemplate> |
||||||
|
<HierarchicalDataTemplate |
||||||
|
ItemsSource="{Binding ChildNodes}"/> |
||||||
|
</localControls:TreeListView.ItemTemplate> |
||||||
|
<localControls:TreeListView.Resources> |
||||||
|
<Style x:Key="ColumnHeaderStyle" TargetType="{x:Type GridViewColumnHeader}"> |
||||||
|
<Setter Property="HorizontalContentAlignment" Value="Left"></Setter> |
||||||
|
</Style> |
||||||
|
</localControls:TreeListView.Resources> |
||||||
|
<localControls:TreeListView.Columns> |
||||||
|
<GridViewColumn |
||||||
|
Width="400" |
||||||
|
HeaderContainerStyle="{StaticResource ColumnHeaderStyle}" |
||||||
|
Header="{core:Localize Global.Name}" |
||||||
|
CellTemplate="{StaticResource CellTemplate_Name}"></GridViewColumn> |
||||||
|
<GridViewColumn |
||||||
|
Width="200" |
||||||
|
HeaderContainerStyle="{StaticResource ColumnHeaderStyle}" |
||||||
|
Header="{core:Localize Dialog.HighlightingEditor.Properties.Value}" |
||||||
|
CellTemplate="{StaticResource CellTemplate_Value}" /> |
||||||
|
<GridViewColumn |
||||||
|
Width="200" |
||||||
|
HeaderContainerStyle="{StaticResource ColumnHeaderStyle}" |
||||||
|
Header="{core:Localize ResourceEditor.ResourceEdit.TypeColumn}" |
||||||
|
CellTemplate="{StaticResource CellTemplate_Type}" /> |
||||||
|
</localControls:TreeListView.Columns> |
||||||
|
</localControls:TreeListView> |
||||||
|
</DockPanel> |
||||||
|
</UserControl> |
@ -0,0 +1,56 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.ObjectModel; |
||||||
|
using System.Collections.Specialized; |
||||||
|
using System.ComponentModel; |
||||||
|
using System.Windows; |
||||||
|
using System.Windows.Controls; |
||||||
|
using System.Windows.Input; |
||||||
|
using System.Windows.Media; |
||||||
|
|
||||||
|
using Debugger.AddIn.TreeModel; |
||||||
|
|
||||||
|
namespace Debugger.AddIn.Pads.Controls |
||||||
|
{ |
||||||
|
public partial class WatchList : UserControl |
||||||
|
{ |
||||||
|
private ObservableCollection<TreeNode> items = new ObservableCollection<TreeNode>(); |
||||||
|
|
||||||
|
public WatchList() |
||||||
|
{ |
||||||
|
InitializeComponent(); |
||||||
|
} |
||||||
|
|
||||||
|
void TextBox_KeyUp(object sender, KeyEventArgs e) |
||||||
|
{ |
||||||
|
if (e.Key != Key.Enter && e.Key != Key.Escape) |
||||||
|
{ |
||||||
|
e.Handled = true; |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (e.Key == Key.Enter) { |
||||||
|
if(SelectedNode is ExpressionNode) { |
||||||
|
var node = (ExpressionNode)SelectedNode; |
||||||
|
node.SetText(((TextBox)sender).Text); |
||||||
|
} |
||||||
|
} |
||||||
|
if (e.Key == Key.Enter || e.Key == Key.Escape) { |
||||||
|
for (int i = 0; i < MyList.Items.Count; i++) { |
||||||
|
TreeViewItem child = (TreeViewItem)MyList.ItemContainerGenerator.ContainerFromIndex(i); |
||||||
|
child.IsSelected = false; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public ObservableCollection<TreeNode> WatchItems { get { return items; } } |
||||||
|
|
||||||
|
public TreeNode SelectedNode { |
||||||
|
get { |
||||||
|
return this.MyList.SelectedItem as TreeNode; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<UserControl |
||||||
|
x:Class="ICSharpCode.SharpDevelop.Bookmarks.Pad.Controls.ListViewPad" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:ICSharpCode.SharpDevelop.Bookmarks.Pad.Controls" xmlns:core="http://icsharpcode.net/sharpdevelop/core" |
||||||
|
DataContext="{Binding RelativeSource={RelativeSource Self}}"> |
||||||
|
<Grid> |
||||||
|
<Grid.Resources> |
||||||
|
<DataTemplate |
||||||
|
x:Key="CheckBoxTemplate"> |
||||||
|
<CheckBox |
||||||
|
IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" /> |
||||||
|
</DataTemplate> |
||||||
|
<DataTemplate |
||||||
|
x:Key="ImageTemplate"> |
||||||
|
<Image |
||||||
|
Source="{Binding Path=Image, UpdateSourceTrigger=PropertyChanged}" /> |
||||||
|
</DataTemplate> |
||||||
|
</Grid.Resources> |
||||||
|
<ListView |
||||||
|
Name="MyListView" |
||||||
|
ItemsSource="{Binding ItemCollection}"> |
||||||
|
<ListView.View> |
||||||
|
<GridView> |
||||||
|
<GridViewColumn |
||||||
|
Header="" |
||||||
|
Width="Auto" |
||||||
|
CellTemplate="{StaticResource CheckBoxTemplate}" /> |
||||||
|
<GridViewColumn |
||||||
|
Header="" |
||||||
|
Width="Auto" |
||||||
|
CellTemplate="{StaticResource ImageTemplate}" /> |
||||||
|
<GridViewColumn |
||||||
|
Header="{core:Localize MainWindow.Windows.BookmarkPad.LocationText}" |
||||||
|
Width="Auto" |
||||||
|
DisplayMemberBinding="{Binding Path=Location}" /> |
||||||
|
<GridViewColumn |
||||||
|
Header="{core:Localize MainWindow.Windows.BookmarkPad.LanguageHeader}" |
||||||
|
Width="Auto" |
||||||
|
DisplayMemberBinding="{Binding Path=Language, UpdateSourceTrigger=PropertyChanged}" /> |
||||||
|
</GridView> |
||||||
|
</ListView.View> |
||||||
|
</ListView> |
||||||
|
</Grid> |
||||||
|
</UserControl> |
@ -0,0 +1,240 @@ |
|||||||
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||||
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Collections.ObjectModel; |
||||||
|
using System.ComponentModel; |
||||||
|
using System.IO; |
||||||
|
using System.Windows; |
||||||
|
using System.Windows.Controls; |
||||||
|
using System.Windows.Input; |
||||||
|
using System.Windows.Media; |
||||||
|
|
||||||
|
using ICSharpCode.Core; |
||||||
|
using ICSharpCode.SharpDevelop.Debugging; |
||||||
|
|
||||||
|
namespace ICSharpCode.SharpDevelop.Bookmarks.Pad.Controls |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// ListViewPad inside WPF pads.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class ListViewPad : UserControl |
||||||
|
{ |
||||||
|
ObservableCollection<ListViewPadItemModel> itemCollection = new ObservableCollection<ListViewPadItemModel>(); |
||||||
|
|
||||||
|
public ObservableCollection<ListViewPadItemModel> ItemCollection { |
||||||
|
get { return itemCollection; } |
||||||
|
} |
||||||
|
|
||||||
|
public event EventHandler ItemActivated; |
||||||
|
|
||||||
|
public ListViewPad() |
||||||
|
{ |
||||||
|
InitializeComponent(); |
||||||
|
|
||||||
|
this.MyListView.PreviewMouseDoubleClick += new MouseButtonEventHandler(ListViewPad_PreviewMouseDoubleClick); |
||||||
|
this.MyListView.KeyDown += new KeyEventHandler(ListViewPad_KeyDown); |
||||||
|
} |
||||||
|
|
||||||
|
public ListViewPadItemModel CurrentItem { |
||||||
|
get { |
||||||
|
return MyListView.SelectedItem as ListViewPadItemModel; |
||||||
|
} |
||||||
|
set { |
||||||
|
if (value == null) return; |
||||||
|
|
||||||
|
this.MyListView.SelectedItem = value; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public ListViewPadItemModel NextItem { |
||||||
|
get { |
||||||
|
bool found = false; |
||||||
|
foreach (var line in ItemCollection) { |
||||||
|
if (found) |
||||||
|
return line; |
||||||
|
if (line == MyListView.SelectedItem as ListViewPadItemModel) |
||||||
|
found = true; |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public ListViewPadItemModel PrevItem { |
||||||
|
get { |
||||||
|
bool found = false; |
||||||
|
ListViewPadItemModel prev = null; |
||||||
|
foreach (var line in ItemCollection) { |
||||||
|
if (found) |
||||||
|
return prev; |
||||||
|
if (line == MyListView.SelectedItem as ListViewPadItemModel) { |
||||||
|
found = true; |
||||||
|
} |
||||||
|
else { |
||||||
|
prev = line; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return prev; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void Add(ListViewPadItemModel item) |
||||||
|
{ |
||||||
|
if (item == null) return; |
||||||
|
ItemCollection.Add(item); |
||||||
|
} |
||||||
|
|
||||||
|
public void Remove(ListViewPadItemModel item) |
||||||
|
{ |
||||||
|
SDBookmark bookmark1 = item.Mark as SDBookmark; |
||||||
|
|
||||||
|
if (bookmark1 is CurrentLineBookmark) |
||||||
|
return; |
||||||
|
|
||||||
|
foreach (var line in itemCollection) { |
||||||
|
SDBookmark bookmark2 = line.Mark as SDBookmark; |
||||||
|
|
||||||
|
if (bookmark1.FileName == bookmark2.FileName && |
||||||
|
bookmark1.LineNumber == bookmark2.LineNumber) { |
||||||
|
ItemCollection.Remove(line); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void AddColumn(string header, DataTemplate cellTemplate) |
||||||
|
{ |
||||||
|
GridViewColumn column = new GridViewColumn(); |
||||||
|
column.Header = header; |
||||||
|
column.CellTemplate = cellTemplate; |
||||||
|
((GridView)this.MyListView.View).Columns.Add(column); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indexes from end to start.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="columnIndex"></param>
|
||||||
|
public void HideColumns(params int[] columnIndexes) |
||||||
|
{ |
||||||
|
foreach(int i in columnIndexes) |
||||||
|
((GridView)MyListView.View).Columns.RemoveAt(i); |
||||||
|
} |
||||||
|
|
||||||
|
private void ListViewPad_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) |
||||||
|
{ |
||||||
|
var handler = ItemActivated; |
||||||
|
|
||||||
|
if (handler != null) |
||||||
|
ItemActivated(this, EventArgs.Empty); |
||||||
|
} |
||||||
|
|
||||||
|
private void ListViewPad_KeyDown(object sender, KeyEventArgs e) |
||||||
|
{ |
||||||
|
if (e.Key == Key.Escape) { |
||||||
|
this.MyListView.UnselectAll(); |
||||||
|
e.Handled = true; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public sealed class ListViewPadItemModel : INotifyPropertyChanged |
||||||
|
{ |
||||||
|
bool isChecked; |
||||||
|
object tag; |
||||||
|
string language; |
||||||
|
string condition; |
||||||
|
ImageSource imageSource; |
||||||
|
|
||||||
|
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; |
||||||
|
|
||||||
|
public ListViewPadItemModel(SDBookmark mark) |
||||||
|
{ |
||||||
|
if (mark is BreakpointBookmark) { |
||||||
|
isChecked = ((BreakpointBookmark)mark).IsEnabled; |
||||||
|
condition = ((BreakpointBookmark)mark).Condition; |
||||||
|
language = ((BreakpointBookmark)mark).ScriptLanguage; |
||||||
|
} |
||||||
|
|
||||||
|
imageSource = mark.Image.ImageSource; |
||||||
|
|
||||||
|
Location = GetLocation(mark); |
||||||
|
Mark = mark; |
||||||
|
tag = this; |
||||||
|
} |
||||||
|
|
||||||
|
public bool IsChecked { |
||||||
|
get { |
||||||
|
return isChecked; |
||||||
|
} |
||||||
|
set { |
||||||
|
if (value != isChecked) |
||||||
|
{ |
||||||
|
isChecked = value; |
||||||
|
NotifyPropertyChanged("IsChecked"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public SDBookmark Mark { |
||||||
|
get; set; |
||||||
|
} |
||||||
|
|
||||||
|
public ImageSource Image { |
||||||
|
get { return imageSource; } |
||||||
|
set { |
||||||
|
imageSource = value; |
||||||
|
NotifyPropertyChanged("Image"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public string Location { |
||||||
|
get; private set; |
||||||
|
} |
||||||
|
|
||||||
|
public string Language { |
||||||
|
get { return language; } |
||||||
|
set { |
||||||
|
language = value; |
||||||
|
NotifyPropertyChanged("Language"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public string Condition { |
||||||
|
get { return condition; } |
||||||
|
set { |
||||||
|
condition = value; |
||||||
|
NotifyPropertyChanged("Condition"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public object Tag { |
||||||
|
get { return tag;} |
||||||
|
set { |
||||||
|
tag = value; |
||||||
|
NotifyPropertyChanged("Tag"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private string GetLocation(SDBookmark bookmark) |
||||||
|
{ |
||||||
|
return string.Format(StringParser.Parse("${res:MainWindow.Windows.BookmarkPad.LineText}"), |
||||||
|
Path.GetFileName(bookmark.FileName), bookmark.LineNumber); |
||||||
|
} |
||||||
|
|
||||||
|
private void NotifyPropertyChanged(string property) |
||||||
|
{ |
||||||
|
if (property == "IsChecked") |
||||||
|
{ |
||||||
|
if (Mark is BreakpointBookmark) |
||||||
|
(Mark as BreakpointBookmark).IsEnabled = isChecked; |
||||||
|
} |
||||||
|
|
||||||
|
if (PropertyChanged != null) |
||||||
|
{ |
||||||
|
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(property)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Binary file not shown.
Loading…
Reference in new issue