Make HighlightingManager thread-safe. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4972 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
@ -0,0 +1,8 @@
				@@ -0,0 +1,8 @@
					 | 
				
			||||
<Application x:Class="AvalonEdit.Sample.App" | 
				
			||||
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | 
				
			||||
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | 
				
			||||
	StartupUri="Window1.xaml"> | 
				
			||||
	<Application.Resources> | 
				
			||||
		  | 
				
			||||
	</Application.Resources> | 
				
			||||
</Application> | 
				
			||||
@ -0,0 +1,19 @@
				@@ -0,0 +1,19 @@
					 | 
				
			||||
using System; | 
				
			||||
using System.Windows; | 
				
			||||
using System.Data; | 
				
			||||
using System.Xml; | 
				
			||||
using System.Configuration; | 
				
			||||
 | 
				
			||||
namespace AvalonEdit.Sample | 
				
			||||
{ | 
				
			||||
	/// <summary>
 | 
				
			||||
	/// Interaction logic for App.xaml
 | 
				
			||||
	/// </summary>
 | 
				
			||||
	public partial class App : Application | 
				
			||||
	{ | 
				
			||||
		public App() | 
				
			||||
		{ | 
				
			||||
			InitializeComponent(); | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,100 @@
				@@ -0,0 +1,100 @@
					 | 
				
			||||
<?xml version="1.0" encoding="utf-8"?> | 
				
			||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build"> | 
				
			||||
  <PropertyGroup> | 
				
			||||
    <ProjectGuid>{13A5B497-BA12-45AE-9033-22620C3153FB}</ProjectGuid> | 
				
			||||
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | 
				
			||||
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform> | 
				
			||||
    <OutputType>WinExe</OutputType> | 
				
			||||
    <RootNamespace>AvalonEdit.Sample</RootNamespace> | 
				
			||||
    <AssemblyName>AvalonEdit.Sample</AssemblyName> | 
				
			||||
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> | 
				
			||||
    <AppDesignerFolder>Properties</AppDesignerFolder> | 
				
			||||
  </PropertyGroup> | 
				
			||||
  <PropertyGroup Condition=" '$(Platform)' == 'x86' "> | 
				
			||||
    <PlatformTarget>x86</PlatformTarget> | 
				
			||||
  </PropertyGroup> | 
				
			||||
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> | 
				
			||||
    <OutputPath>bin\Debug\</OutputPath> | 
				
			||||
    <DebugSymbols>True</DebugSymbols> | 
				
			||||
    <DebugType>Full</DebugType> | 
				
			||||
    <Optimize>False</Optimize> | 
				
			||||
    <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow> | 
				
			||||
    <DefineConstants>DEBUG;TRACE</DefineConstants> | 
				
			||||
  </PropertyGroup> | 
				
			||||
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' "> | 
				
			||||
    <OutputPath>bin\Release\</OutputPath> | 
				
			||||
    <DebugSymbols>False</DebugSymbols> | 
				
			||||
    <DebugType>None</DebugType> | 
				
			||||
    <Optimize>True</Optimize> | 
				
			||||
    <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow> | 
				
			||||
    <DefineConstants>TRACE</DefineConstants> | 
				
			||||
  </PropertyGroup> | 
				
			||||
  <ItemGroup> | 
				
			||||
    <Reference Include="PresentationCore"> | 
				
			||||
      <RequiredTargetFramework>3.0</RequiredTargetFramework> | 
				
			||||
    </Reference> | 
				
			||||
    <Reference Include="PresentationFramework"> | 
				
			||||
      <RequiredTargetFramework>3.0</RequiredTargetFramework> | 
				
			||||
    </Reference> | 
				
			||||
    <Reference Include="System" /> | 
				
			||||
    <Reference Include="System.Core"> | 
				
			||||
      <RequiredTargetFramework>3.5</RequiredTargetFramework> | 
				
			||||
    </Reference> | 
				
			||||
    <Reference Include="System.Data" /> | 
				
			||||
    <Reference Include="System.Data.DataSetExtensions"> | 
				
			||||
      <RequiredTargetFramework>3.5</RequiredTargetFramework> | 
				
			||||
    </Reference> | 
				
			||||
    <Reference Include="System.Drawing" /> | 
				
			||||
    <Reference Include="System.Windows.Forms" /> | 
				
			||||
    <Reference Include="System.Xml" /> | 
				
			||||
    <Reference Include="System.Xml.Linq"> | 
				
			||||
      <RequiredTargetFramework>3.5</RequiredTargetFramework> | 
				
			||||
    </Reference> | 
				
			||||
    <Reference Include="WindowsBase"> | 
				
			||||
      <RequiredTargetFramework>3.0</RequiredTargetFramework> | 
				
			||||
    </Reference> | 
				
			||||
    <Reference Include="WindowsFormsIntegration"> | 
				
			||||
      <RequiredTargetFramework>3.0</RequiredTargetFramework> | 
				
			||||
    </Reference> | 
				
			||||
  </ItemGroup> | 
				
			||||
  <ItemGroup> | 
				
			||||
    <ApplicationDefinition Include="App.xaml" /> | 
				
			||||
  </ItemGroup> | 
				
			||||
  <ItemGroup> | 
				
			||||
    <Compile Include="App.xaml.cs"> | 
				
			||||
      <SubType>Code</SubType> | 
				
			||||
      <DependentUpon>App.xaml</DependentUpon> | 
				
			||||
    </Compile> | 
				
			||||
    <Compile Include="Properties\AssemblyInfo.cs" /> | 
				
			||||
    <Compile Include="Properties\WPFAssemblyInfo.cs" /> | 
				
			||||
    <Compile Include="Window1.xaml.cs"> | 
				
			||||
      <SubType>Code</SubType> | 
				
			||||
      <DependentUpon>Window1.xaml</DependentUpon> | 
				
			||||
    </Compile> | 
				
			||||
  </ItemGroup> | 
				
			||||
  <ItemGroup> | 
				
			||||
    <Page Include="Window1.xaml" /> | 
				
			||||
  </ItemGroup> | 
				
			||||
  <ItemGroup> | 
				
			||||
    <Resource Include="Images\Copy.png" /> | 
				
			||||
    <Resource Include="Images\Cut.png" /> | 
				
			||||
    <Resource Include="Images\Delete.png" /> | 
				
			||||
    <Resource Include="Images\Open.png" /> | 
				
			||||
    <Resource Include="Images\Paste.png" /> | 
				
			||||
    <Resource Include="Images\Redo.png" /> | 
				
			||||
    <Resource Include="Images\Save.png" /> | 
				
			||||
    <Resource Include="Images\Undo.png" /> | 
				
			||||
    <Resource Include="Images\WordWrap.png" /> | 
				
			||||
  </ItemGroup> | 
				
			||||
  <ItemGroup> | 
				
			||||
    <Folder Include="Images" /> | 
				
			||||
    <Folder Include="Images" /> | 
				
			||||
  </ItemGroup> | 
				
			||||
  <ItemGroup> | 
				
			||||
    <ProjectReference Include="..\..\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj"> | 
				
			||||
      <Project>{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}</Project> | 
				
			||||
      <Name>ICSharpCode.AvalonEdit</Name> | 
				
			||||
    </ProjectReference> | 
				
			||||
  </ItemGroup> | 
				
			||||
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" /> | 
				
			||||
</Project> | 
				
			||||
| 
		 After Width: | Height: | Size: 676 B  | 
| 
		 After Width: | Height: | Size: 672 B  | 
| 
		 After Width: | Height: | Size: 575 B  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 646 B  | 
| 
		 After Width: | Height: | Size: 724 B  | 
| 
		 After Width: | Height: | Size: 501 B  | 
| 
		 After Width: | Height: | Size: 788 B  | 
| 
		 After Width: | Height: | Size: 1.1 KiB  | 
@ -0,0 +1,31 @@
				@@ -0,0 +1,31 @@
					 | 
				
			||||
#region Using directives
 | 
				
			||||
 | 
				
			||||
using System; | 
				
			||||
using System.Reflection; | 
				
			||||
using System.Runtime.InteropServices; | 
				
			||||
 | 
				
			||||
#endregion
 | 
				
			||||
 | 
				
			||||
// General Information about an assembly is controlled through the following 
 | 
				
			||||
// set of attributes. Change these attribute values to modify the information
 | 
				
			||||
// associated with an assembly.
 | 
				
			||||
[assembly: AssemblyTitle("AvalonEdit.Sample")] | 
				
			||||
[assembly: AssemblyDescription("")] | 
				
			||||
[assembly: AssemblyConfiguration("")] | 
				
			||||
[assembly: AssemblyCompany("")] | 
				
			||||
[assembly: AssemblyProduct("AvalonEdit.Sample")] | 
				
			||||
[assembly: AssemblyCopyright("Copyright 2009")] | 
				
			||||
[assembly: AssemblyTrademark("")] | 
				
			||||
[assembly: AssemblyCulture("")] | 
				
			||||
 | 
				
			||||
// This sets the default COM visibility of types in the assembly to invisible.
 | 
				
			||||
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
 | 
				
			||||
[assembly: ComVisible(false)] | 
				
			||||
 | 
				
			||||
// The assembly version has following format :
 | 
				
			||||
//
 | 
				
			||||
// Major.Minor.Build.Revision
 | 
				
			||||
//
 | 
				
			||||
// You can specify all the values or you can use the default the Revision and 
 | 
				
			||||
// Build Numbers by using the '*' as shown below:
 | 
				
			||||
[assembly: AssemblyVersion("1.0.*")] | 
				
			||||
@ -0,0 +1,27 @@
				@@ -0,0 +1,27 @@
					 | 
				
			||||
#region Using directives
 | 
				
			||||
 | 
				
			||||
using System.Resources; | 
				
			||||
using System.Windows; | 
				
			||||
 | 
				
			||||
#endregion
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//In order to begin building localizable applications, set 
 | 
				
			||||
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
 | 
				
			||||
//inside a <PropertyGroup>.  For example, if you are using US english
 | 
				
			||||
//in your source files, set the <UICulture> to en-US.  Then uncomment
 | 
				
			||||
//the NeutralResourceLanguage attribute below.  Update the "en-US" in
 | 
				
			||||
//the line below to match the UICulture setting in the project file.
 | 
				
			||||
 | 
				
			||||
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[assembly: ThemeInfo( | 
				
			||||
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
 | 
				
			||||
    //(used if a resource is not found in the page, 
 | 
				
			||||
    // or application resource dictionaries)
 | 
				
			||||
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
 | 
				
			||||
    //(used if a resource is not found in the page, 
 | 
				
			||||
    // app, or any theme specific resource dictionaries)
 | 
				
			||||
)] | 
				
			||||
@ -0,0 +1,69 @@
				@@ -0,0 +1,69 @@
					 | 
				
			||||
<Window x:Class="AvalonEdit.Sample.Window1" | 
				
			||||
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | 
				
			||||
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | 
				
			||||
	xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit" | 
				
			||||
    xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" | 
				
			||||
	Title="AvalonEdit.Sample" Height="500" Width="700" | 
				
			||||
	> | 
				
			||||
	<DockPanel> | 
				
			||||
		<ToolBar DockPanel.Dock="Top"> | 
				
			||||
			<ToolBar.Resources> | 
				
			||||
				<Style TargetType="{x:Type Image}"> | 
				
			||||
					<Style.Triggers> | 
				
			||||
						<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ButtonBase}, AncestorLevel=1}, Path=IsEnabled}" Value="False"> | 
				
			||||
							<Setter Property="Opacity" Value="0.30" /> | 
				
			||||
						</DataTrigger> | 
				
			||||
					</Style.Triggers> | 
				
			||||
				</Style> | 
				
			||||
			</ToolBar.Resources> | 
				
			||||
			<Button Click="openFileClick"><Image Source="Images/Open.png" Height="16"/></Button> | 
				
			||||
			<Button Click="saveFileClick"><Image Source="Images/Save.png" Height="16"/></Button> | 
				
			||||
			<Separator/> | 
				
			||||
			<Button Command="Cut"><Image Source="Images/Cut.png" Height="16"/></Button> | 
				
			||||
			<Button Command="Copy"><Image Source="Images/Copy.png" Height="16"/></Button> | 
				
			||||
			<Button Command="Paste"><Image Source="Images/Paste.png" Height="16"/></Button> | 
				
			||||
			<Button Command="Delete"><Image Source="Images/Delete.png" Height="16"/></Button> | 
				
			||||
		    <Separator/> | 
				
			||||
			<Button Command="Undo"><Image Source="Images/Undo.png" Height="16"/></Button> | 
				
			||||
			<Button Command="Redo"><Image Source="Images/Redo.png" Height="16"/></Button> | 
				
			||||
			<Separator/> | 
				
			||||
			<CheckBox IsChecked="{Binding ElementName=textEditor,Path=WordWrap}"> | 
				
			||||
				<Image Source="Images/WordWrap.png" Height="16"/> | 
				
			||||
			</CheckBox> | 
				
			||||
			<CheckBox IsChecked="{Binding ElementName=textEditor,Path=ShowLineNumbers}"> | 
				
			||||
				<TextBlock Width="16" TextAlignment="Center">#</TextBlock> | 
				
			||||
			</CheckBox> | 
				
			||||
			<CheckBox IsChecked="{Binding ElementName=textEditor,Path=Options.ShowEndOfLine}"> | 
				
			||||
				<TextBlock Width="16" TextAlignment="Center">¶</TextBlock> | 
				
			||||
			</CheckBox> | 
				
			||||
			<ComboBox Name="highlightingComboBox" | 
				
			||||
				SelectedItem="{Binding SyntaxHighlighting, ElementName=textEditor}" | 
				
			||||
				ItemsSource="{Binding Source={x:Static avalonEdit:HighlightingManager.Instance}, Path=Highlightings}"/> | 
				
			||||
		</ToolBar> | 
				
			||||
		<Grid> | 
				
			||||
			<Grid.ColumnDefinitions> | 
				
			||||
				<ColumnDefinition Width="1*"/> | 
				
			||||
				<ColumnDefinition Width="100"/> | 
				
			||||
			</Grid.ColumnDefinitions> | 
				
			||||
			<avalonEdit:TextEditor | 
				
			||||
				Name="textEditor" | 
				
			||||
				FontFamily="Consolas" | 
				
			||||
				FontSize="10pt" | 
				
			||||
			> | 
				
			||||
				Initial Text | 
				
			||||
			</avalonEdit:TextEditor> | 
				
			||||
			<GridSplitter Grid.Column="1" Width="4" HorizontalAlignment="Left"/> | 
				
			||||
			<DockPanel Grid.Column="1" Margin="4 0 0 0"> | 
				
			||||
				<ComboBox Name="propertyGridComboBox" DockPanel.Dock="Top" | 
				
			||||
				          SelectedIndex="0" SelectionChanged="propertyGridComboBoxSelectionChanged"> | 
				
			||||
					<ComboBoxItem>TextEditor</ComboBoxItem> | 
				
			||||
					<ComboBoxItem>Options</ComboBoxItem> | 
				
			||||
					<ComboBoxItem>TextArea</ComboBoxItem> | 
				
			||||
				</ComboBox> | 
				
			||||
				<WindowsFormsHost DockPanel.Dock="Right" Name="propertyGridHost"> | 
				
			||||
					<forms:PropertyGrid x:Name="propertyGrid"/> | 
				
			||||
				</WindowsFormsHost> | 
				
			||||
			</DockPanel> | 
				
			||||
		</Grid> | 
				
			||||
	</DockPanel> | 
				
			||||
</Window> | 
				
			||||
@ -0,0 +1,78 @@
				@@ -0,0 +1,78 @@
					 | 
				
			||||
// <file>
 | 
				
			||||
//     <copyright see="prj:///doc/copyright.txt"/>
 | 
				
			||||
//     <license see="prj:///doc/license.txt"/>
 | 
				
			||||
//     <owner name="Daniel Grunwald"/>
 | 
				
			||||
//     <version>$Revision$</version>
 | 
				
			||||
// </file>
 | 
				
			||||
 | 
				
			||||
using System; | 
				
			||||
using System.Collections.Generic; | 
				
			||||
using System.IO; | 
				
			||||
using System.Text; | 
				
			||||
using System.Windows; | 
				
			||||
using System.Windows.Controls; | 
				
			||||
using System.Windows.Data; | 
				
			||||
using System.Windows.Documents; | 
				
			||||
using System.Windows.Input; | 
				
			||||
using System.Windows.Media; | 
				
			||||
 | 
				
			||||
using ICSharpCode.AvalonEdit.Highlighting; | 
				
			||||
using Microsoft.Win32; | 
				
			||||
 | 
				
			||||
namespace AvalonEdit.Sample | 
				
			||||
{ | 
				
			||||
	/// <summary>
 | 
				
			||||
	/// Interaction logic for Window1.xaml
 | 
				
			||||
	/// </summary>
 | 
				
			||||
	public partial class Window1 : Window | 
				
			||||
	{ | 
				
			||||
		public Window1() | 
				
			||||
		{ | 
				
			||||
			InitializeComponent(); | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		string currentFileName; | 
				
			||||
		 | 
				
			||||
		void openFileClick(object sender, RoutedEventArgs e) | 
				
			||||
		{ | 
				
			||||
			OpenFileDialog dlg = new OpenFileDialog(); | 
				
			||||
			dlg.CheckFileExists = true; | 
				
			||||
			if (dlg.ShowDialog() ?? false) { | 
				
			||||
				currentFileName = dlg.FileName; | 
				
			||||
				textEditor.Load(currentFileName); | 
				
			||||
				textEditor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinitionByExtension(Path.GetExtension(currentFileName)); | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		void saveFileClick(object sender, EventArgs e) | 
				
			||||
		{ | 
				
			||||
			if (currentFileName == null) { | 
				
			||||
				SaveFileDialog dlg = new SaveFileDialog(); | 
				
			||||
				dlg.DefaultExt = ".txt"; | 
				
			||||
				if (dlg.ShowDialog() ?? false) { | 
				
			||||
					currentFileName = dlg.FileName; | 
				
			||||
				} else { | 
				
			||||
					return; | 
				
			||||
				} | 
				
			||||
			} | 
				
			||||
			textEditor.Save(currentFileName); | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		void propertyGridComboBoxSelectionChanged(object sender, RoutedEventArgs e) | 
				
			||||
		{ | 
				
			||||
			if (propertyGrid == null) | 
				
			||||
				return; | 
				
			||||
			switch (propertyGridComboBox.SelectedIndex) { | 
				
			||||
				case 0: | 
				
			||||
					propertyGrid.SelectedObject = textEditor; | 
				
			||||
					break; | 
				
			||||
				case 1: | 
				
			||||
					propertyGrid.SelectedObject = textEditor.Options; | 
				
			||||
					break; | 
				
			||||
				case 2: | 
				
			||||
					propertyGrid.SelectedObject = textEditor.TextArea; | 
				
			||||
					break; | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,59 @@
				@@ -0,0 +1,59 @@
					 | 
				
			||||
// <file>
 | 
				
			||||
//     <copyright see="prj:///doc/copyright.txt"/>
 | 
				
			||||
//     <license see="prj:///doc/license.txt"/>
 | 
				
			||||
//     <owner name="Daniel Grunwald"/>
 | 
				
			||||
//     <version>$Revision$</version>
 | 
				
			||||
// </file>
 | 
				
			||||
 | 
				
			||||
using System; | 
				
			||||
using System.Collections.Generic; | 
				
			||||
 | 
				
			||||
namespace ICSharpCode.AvalonEdit.Utils | 
				
			||||
{ | 
				
			||||
	/// <summary>
 | 
				
			||||
	/// This class is used to prevent stack overflows by representing a 'busy' flag
 | 
				
			||||
	/// that prevents reentrance when another call is running.
 | 
				
			||||
	/// However, using a simple 'bool busy' is not thread-safe, so we use a
 | 
				
			||||
	/// thread-static BusyManager.
 | 
				
			||||
	/// </summary>
 | 
				
			||||
	static class BusyManager | 
				
			||||
	{ | 
				
			||||
		public struct BusyLock : IDisposable | 
				
			||||
		{ | 
				
			||||
			public static readonly BusyLock Failed = new BusyLock(null); | 
				
			||||
			 | 
				
			||||
			readonly List<object> objectList; | 
				
			||||
			 | 
				
			||||
			public BusyLock(List<object> objectList) | 
				
			||||
			{ | 
				
			||||
				this.objectList = objectList; | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			public bool Success { | 
				
			||||
				get { return objectList != null; } | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			public void Dispose() | 
				
			||||
			{ | 
				
			||||
				if (objectList != null) { | 
				
			||||
					objectList.RemoveAt(objectList.Count - 1); | 
				
			||||
				} | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		[ThreadStatic] static List<object> _activeObjects; | 
				
			||||
		 | 
				
			||||
		public static BusyLock Enter(object obj) | 
				
			||||
		{ | 
				
			||||
			List<object> activeObjects = _activeObjects; | 
				
			||||
			if (activeObjects == null) | 
				
			||||
				activeObjects = _activeObjects = new List<object>(); | 
				
			||||
			for (int i = 0; i < activeObjects.Count; i++) { | 
				
			||||
				if (activeObjects[i] == obj) | 
				
			||||
					return BusyLock.Failed; | 
				
			||||
			} | 
				
			||||
			activeObjects.Add(obj); | 
				
			||||
			return new BusyLock(activeObjects); | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||