Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1983 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
9 changed files with 955 additions and 0 deletions
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
using System.Reflection; |
||||
using System.Runtime.CompilerServices; |
||||
using System.Runtime.InteropServices; |
||||
|
||||
// Information about this assembly is defined by the following
|
||||
// attributes.
|
||||
//
|
||||
// change them to the information which is associated with the assembly
|
||||
// you compile.
|
||||
|
||||
[assembly: AssemblyTitle("CSharpEditor")] |
||||
[assembly: AssemblyDescription("A small C# editor demonstrating code-completion" + |
||||
" using ICSharpCode.SharpDevelop.Dom and " + |
||||
"ICSharpCode.TextEditor")] |
||||
[assembly: AssemblyConfiguration("")] |
||||
[assembly: AssemblyCompany("ICSharpCode")] |
||||
[assembly: AssemblyProduct("CSharpEditor")] |
||||
[assembly: AssemblyCopyright("2006, Daniel Grunwald")] |
||||
[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 values by your own or you can build default build and revision
|
||||
// numbers with the '*' character (the default):
|
||||
|
||||
[assembly: AssemblyVersion("1.0.*")] |
@ -0,0 +1,67 @@
@@ -0,0 +1,67 @@
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
<PropertyGroup> |
||||
<OutputType>WinExe</OutputType> |
||||
<RootNamespace>CSharpEditor</RootNamespace> |
||||
<AssemblyName>CSharpCodeCompletion</AssemblyName> |
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
||||
<ProjectGuid>{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}</ProjectGuid> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> |
||||
<OutputPath>bin\Debug\</OutputPath> |
||||
<Optimize>False</Optimize> |
||||
<DefineConstants>DEBUG;TRACE</DefineConstants> |
||||
<DebugSymbols>True</DebugSymbols> |
||||
<DebugType>Full</DebugType> |
||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> |
||||
<OutputPath>bin\Release\</OutputPath> |
||||
<Optimize>True</Optimize> |
||||
<DefineConstants>TRACE</DefineConstants> |
||||
<DebugSymbols>False</DebugSymbols> |
||||
<DebugType>None</DebugType> |
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow> |
||||
</PropertyGroup> |
||||
<ItemGroup> |
||||
<Reference Include="System" /> |
||||
<Reference Include="System.Data" /> |
||||
<Reference Include="System.Drawing" /> |
||||
<Reference Include="System.Windows.Forms" /> |
||||
<Reference Include="System.Xml" /> |
||||
<Reference Include="ICSharpCode.NRefactory"> |
||||
<HintPath>..\..\bin\ICSharpCode.NRefactory.dll</HintPath> |
||||
<SpecificVersion>False</SpecificVersion> |
||||
</Reference> |
||||
<Reference Include="ICSharpCode.SharpDevelop.Dom"> |
||||
<HintPath>..\..\bin\ICSharpCode.SharpDevelop.Dom.dll</HintPath> |
||||
<SpecificVersion>False</SpecificVersion> |
||||
</Reference> |
||||
<Reference Include="ICSharpCode.TextEditor"> |
||||
<HintPath>..\..\bin\ICSharpCode.TextEditor.dll</HintPath> |
||||
<SpecificVersion>False</SpecificVersion> |
||||
</Reference> |
||||
<Reference Include="log4net"> |
||||
<HintPath>..\..\bin\log4net.dll</HintPath> |
||||
<SpecificVersion>False</SpecificVersion> |
||||
</Reference> |
||||
<Reference Include="Mono.Cecil"> |
||||
<HintPath>..\..\bin\Mono.Cecil.dll</HintPath> |
||||
<SpecificVersion>False</SpecificVersion> |
||||
</Reference> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<Compile Include="MainForm.cs" /> |
||||
<Compile Include="MainForm.Designer.cs"> |
||||
<DependentUpon>MainForm.cs</DependentUpon> |
||||
</Compile> |
||||
<Compile Include="AssemblyInfo.cs" /> |
||||
<EmbeddedResource Include="MainForm.resx"> |
||||
<DependentUpon>MainForm.cs</DependentUpon> |
||||
</EmbeddedResource> |
||||
<Compile Include="CodeCompletionProvider.cs" /> |
||||
<Compile Include="CodeCompletionKeyHandler.cs" /> |
||||
<Compile Include="HostCallbackImplementation.cs" /> |
||||
</ItemGroup> |
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" /> |
||||
</Project> |
@ -0,0 +1,17 @@
@@ -0,0 +1,17 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00 |
||||
# SharpDevelop 2.1.0.1947 |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpCodeCompletion", "CSharpCodeCompletion.csproj", "{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}" |
||||
EndProject |
||||
Global |
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
Debug|Any CPU = Debug|Any CPU |
||||
Release|Any CPU = Release|Any CPU |
||||
EndGlobalSection |
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
{489CFE09-FDF7-4C89-BAB5-BD09CADD61AD}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
EndGlobalSection |
||||
EndGlobal |
@ -0,0 +1,103 @@
@@ -0,0 +1,103 @@
|
||||
// CSharp Editor Example with Code Completion
|
||||
// Copyright (c) 2006, Daniel Grunwald
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// - Redistributions of source code must retain the above copyright notice, this list
|
||||
// of conditions and the following disclaimer.
|
||||
//
|
||||
// - Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other materials
|
||||
// provided with the distribution.
|
||||
//
|
||||
// - Neither the name of the ICSharpCode nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without specific prior written
|
||||
// permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS
|
||||
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Drawing; |
||||
using System.Windows.Forms; |
||||
using System.IO; |
||||
using System.Threading; |
||||
|
||||
using ICSharpCode.TextEditor; |
||||
using ICSharpCode.TextEditor.Gui; |
||||
using ICSharpCode.TextEditor.Gui.CompletionWindow; |
||||
|
||||
namespace CSharpEditor |
||||
{ |
||||
class CodeCompletionKeyHandler |
||||
{ |
||||
MainForm mainForm; |
||||
TextEditorControl editor; |
||||
CodeCompletionWindow codeCompletionWindow; |
||||
|
||||
private CodeCompletionKeyHandler(MainForm mainForm, TextEditorControl editor) |
||||
{ |
||||
this.mainForm = mainForm; |
||||
this.editor = editor; |
||||
} |
||||
|
||||
public static CodeCompletionKeyHandler Attach(MainForm mainForm, TextEditorControl editor) |
||||
{ |
||||
CodeCompletionKeyHandler h = new CodeCompletionKeyHandler(mainForm, editor); |
||||
|
||||
editor.ActiveTextAreaControl.TextArea.KeyEventHandler += h.TextAreaKeyEventHandler; |
||||
|
||||
// When the editor is disposed, close the code completion window
|
||||
editor.Disposed += h.CloseCodeCompletionWindow; |
||||
|
||||
return h; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Return true to handle the keypress, return false to let the text area handle the keypress
|
||||
/// </summary>
|
||||
bool TextAreaKeyEventHandler(char key) |
||||
{ |
||||
if (codeCompletionWindow != null) { |
||||
// If completion window is open and wants to handle the key, don't let the text area
|
||||
// handle it
|
||||
if (codeCompletionWindow.ProcessKeyEvent(key)) |
||||
return true; |
||||
} |
||||
if (key == '.') { |
||||
ICompletionDataProvider completionDataProvider = new CodeCompletionProvider(mainForm); |
||||
|
||||
codeCompletionWindow = CodeCompletionWindow.ShowCompletionWindow( |
||||
mainForm, // The parent window for the completion window
|
||||
editor, // The text editor to show the window for
|
||||
MainForm.DummyFileName, // Filename - will be passed back to the provider
|
||||
completionDataProvider, // Provider to get the list of possible completions
|
||||
key // Key pressed - will be passed to the provider
|
||||
); |
||||
if (codeCompletionWindow != null) { |
||||
// ShowCompletionWindow can return null when the provider returns an empty list
|
||||
codeCompletionWindow.Closed += new EventHandler(CloseCodeCompletionWindow); |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
void CloseCodeCompletionWindow(object sender, EventArgs e) |
||||
{ |
||||
if (codeCompletionWindow != null) { |
||||
codeCompletionWindow.Closed -= new EventHandler(CloseCodeCompletionWindow); |
||||
codeCompletionWindow.Dispose(); |
||||
codeCompletionWindow = null; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,200 @@
@@ -0,0 +1,200 @@
|
||||
// CSharp Editor Example with Code Completion
|
||||
// Copyright (c) 2006, Daniel Grunwald
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// - Redistributions of source code must retain the above copyright notice, this list
|
||||
// of conditions and the following disclaimer.
|
||||
//
|
||||
// - Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other materials
|
||||
// provided with the distribution.
|
||||
//
|
||||
// - Neither the name of the ICSharpCode nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without specific prior written
|
||||
// permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS
|
||||
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
using System; |
||||
using System.Collections; |
||||
using System.Collections.Generic; |
||||
using System.Text; |
||||
using System.Windows.Forms; |
||||
using ICSharpCode.TextEditor; |
||||
using ICSharpCode.TextEditor.Gui.CompletionWindow; |
||||
|
||||
using Dom = ICSharpCode.SharpDevelop.Dom; |
||||
using NRefactoryResolver = ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryResolver; |
||||
|
||||
namespace CSharpEditor |
||||
{ |
||||
class CodeCompletionProvider : ICompletionDataProvider |
||||
{ |
||||
MainForm mainForm; |
||||
|
||||
public CodeCompletionProvider(MainForm mainForm) |
||||
{ |
||||
this.mainForm = mainForm; |
||||
} |
||||
|
||||
public ImageList ImageList { |
||||
get { |
||||
return mainForm.imageList1; |
||||
} |
||||
} |
||||
|
||||
public string PreSelection { |
||||
get { |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
public int DefaultIndex { |
||||
get { |
||||
return -1; |
||||
} |
||||
} |
||||
|
||||
public CompletionDataProviderKeyResult ProcessKey(char key) |
||||
{ |
||||
if (char.IsLetterOrDigit(key) || key == '_') { |
||||
return CompletionDataProviderKeyResult.NormalKey; |
||||
} else { |
||||
// key triggers insertion of selected items
|
||||
return CompletionDataProviderKeyResult.InsertionKey; |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Called when entry should be inserted. Forward to the insertion action of the completion data.
|
||||
/// </summary>
|
||||
public bool InsertAction(ICompletionData data, TextArea textArea, int insertionOffset, char key) |
||||
{ |
||||
textArea.Caret.Position = textArea.Document.OffsetToPosition(insertionOffset); |
||||
return data.InsertAction(textArea, key); |
||||
} |
||||
|
||||
public ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped) |
||||
{ |
||||
// We can return code-completion items like this:
|
||||
|
||||
//return new ICompletionData[] {
|
||||
// new DefaultCompletionData("Text", "Description", 1)
|
||||
//};
|
||||
|
||||
NRefactoryResolver resolver = new NRefactoryResolver(mainForm.myProjectContent); |
||||
Dom.ResolveResult rr = resolver.Resolve(FindExpression(textArea), |
||||
textArea.Caret.Line, |
||||
textArea.Caret.Column, |
||||
fileName, |
||||
textArea.MotherTextEditorControl.Text); |
||||
List<ICompletionData> resultList = new List<ICompletionData>(); |
||||
if (rr != null) { |
||||
ArrayList completionData = rr.GetCompletionData(mainForm.myProjectContent); |
||||
if (completionData != null) { |
||||
AddCompletionData(resultList, completionData); |
||||
} |
||||
} |
||||
return resultList.ToArray(); |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Find the expression the cursor is at.
|
||||
/// Also determines the context (using statement, "new"-expression etc.) the
|
||||
/// cursor is at.
|
||||
/// </summary>
|
||||
Dom.ExpressionResult FindExpression(TextArea textArea) |
||||
{ |
||||
Dom.CSharp.CSharpExpressionFinder finder; |
||||
finder = new Dom.CSharp.CSharpExpressionFinder(MainForm.DummyFileName); |
||||
return finder.FindExpression(textArea.Document.TextContent, textArea.Caret.Offset); |
||||
} |
||||
|
||||
void AddCompletionData(List<ICompletionData> resultList, ArrayList completionData) |
||||
{ |
||||
// Add the completion data as returned by SharpDevelop.Dom to the
|
||||
// list for the text editor
|
||||
foreach (object obj in completionData) { |
||||
if (obj is string) { |
||||
// namespace names are returned as string
|
||||
resultList.Add(new DefaultCompletionData((string)obj, "namespace " + obj, 5)); |
||||
} else if (obj is Dom.IClass) { |
||||
Dom.IClass c = (Dom.IClass)obj; |
||||
if (c.ClassType == Dom.ClassType.Enum) { |
||||
resultList.Add(new DefaultCompletionData(c.Name, |
||||
GetDescription(c), |
||||
4)); |
||||
} else { // missing: struct, delegate etc.
|
||||
resultList.Add(new DefaultCompletionData(c.Name, |
||||
GetDescription(c), |
||||
0)); |
||||
} |
||||
} else if (obj is Dom.IMember) { |
||||
Dom.IMember m = (Dom.IMember)obj; |
||||
if (m is Dom.IMethod && ((m as Dom.IMethod).IsConstructor)) { |
||||
// Skip constructors
|
||||
continue; |
||||
} |
||||
// TODO: Group results by name and add "(x Overloads)" to the
|
||||
// description if there are multiple results with the same name.
|
||||
resultList.Add(new DefaultCompletionData(m.Name, |
||||
GetDescription(m), |
||||
GetMemberImageIndex(m))); |
||||
} else { |
||||
// Current ICSharpCode.SharpDevelop.Dom should never return anything else
|
||||
throw new NotSupportedException(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Converts a member to text.
|
||||
/// Returns the declaration of the member as C# code, e.g.
|
||||
/// "public void MemberName(string parameter)"
|
||||
/// </summary>
|
||||
string GetDescription(Dom.IDecoration entity) |
||||
{ |
||||
return GetCSharpText(entity) + Environment.NewLine + entity.Documentation; |
||||
} |
||||
|
||||
string GetCSharpText(Dom.IDecoration entity) |
||||
{ |
||||
if (entity is Dom.IMethod) |
||||
return Dom.CSharp.CSharpAmbience.Instance.Convert(entity as Dom.IMethod); |
||||
if (entity is Dom.IProperty) |
||||
return Dom.CSharp.CSharpAmbience.Instance.Convert(entity as Dom.IProperty); |
||||
if (entity is Dom.IEvent) |
||||
return Dom.CSharp.CSharpAmbience.Instance.Convert(entity as Dom.IEvent); |
||||
if (entity is Dom.IField) |
||||
return Dom.CSharp.CSharpAmbience.Instance.Convert(entity as Dom.IField); |
||||
if (entity is Dom.IClass) |
||||
return Dom.CSharp.CSharpAmbience.Instance.Convert(entity as Dom.IClass); |
||||
// unknown entity:
|
||||
return entity.ToString(); |
||||
} |
||||
|
||||
int GetMemberImageIndex(Dom.IMember member) |
||||
{ |
||||
// Missing: different icons for private/public member
|
||||
if (member is Dom.IMethod) |
||||
return 1; |
||||
if (member is Dom.IProperty) |
||||
return 2; |
||||
if (member is Dom.IField) |
||||
return 3; |
||||
if (member is Dom.IEvent) |
||||
return 6; |
||||
return 3; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,76 @@
@@ -0,0 +1,76 @@
|
||||
// CSharp Editor Example with Code Completion
|
||||
// Copyright (c) 2006, Daniel Grunwald
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// - Redistributions of source code must retain the above copyright notice, this list
|
||||
// of conditions and the following disclaimer.
|
||||
//
|
||||
// - Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other materials
|
||||
// provided with the distribution.
|
||||
//
|
||||
// - Neither the name of the ICSharpCode nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without specific prior written
|
||||
// permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS
|
||||
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
using System; |
||||
using System.Windows.Forms; |
||||
using ICSharpCode.SharpDevelop.Dom; |
||||
|
||||
namespace CSharpEditor |
||||
{ |
||||
/// <summary>
|
||||
/// ICSharpCode.SharpDevelop.Dom was created by extracting code from ICSharpCode.SharpDevelop.dll.
|
||||
/// There are a few static method calls that refer to GUI code or the code for keeping the parse
|
||||
/// information. These calls have to be implemented by the application hosting
|
||||
/// ICSharpCode.SharpDevelop.Dom by settings static fields with a delegate to their method
|
||||
/// implementation.
|
||||
/// </summary>
|
||||
static class HostCallbackImplementation |
||||
{ |
||||
public static void Register(MainForm mainForm) |
||||
{ |
||||
// Must be implemented. Gets the parse information for the specified file.
|
||||
HostCallback.GetParseInformation = delegate(string fileName) { |
||||
if (fileName != MainForm.DummyFileName) |
||||
throw new Exception("Unknown file"); |
||||
if (mainForm.lastCompilationUnit == null) |
||||
return null; |
||||
ParseInformation pi = new ParseInformation(); |
||||
pi.ValidCompilationUnit = mainForm.lastCompilationUnit; |
||||
return pi; |
||||
}; |
||||
|
||||
// Must be implemented. Gets the project content of the active project.
|
||||
HostCallback.GetCurrentProjectContent = delegate { |
||||
return mainForm.myProjectContent; |
||||
}; |
||||
|
||||
// The default implementation just logs to Log4Net. We want to display a MessageBox.
|
||||
// Note that we use += here - in this case, we want to keep the default Log4Net implementation.
|
||||
HostCallback.ShowError += delegate(string message, Exception ex) { |
||||
MessageBox.Show(message + Environment.NewLine + ex.ToString()); |
||||
}; |
||||
HostCallback.ShowMessage += delegate(string message) { |
||||
MessageBox.Show(message); |
||||
}; |
||||
HostCallback.ShowAssemblyLoadError += delegate(string fileName, string include, string message) { |
||||
MessageBox.Show("Error loading code-completion information for " |
||||
+ include + " from " + fileName |
||||
+ ":\r\n" + message + "\r\n"); |
||||
}; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,107 @@
@@ -0,0 +1,107 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
namespace CSharpEditor |
||||
{ |
||||
partial class MainForm : System.Windows.Forms.Form |
||||
{ |
||||
/// <summary>
|
||||
/// Designer variable used to keep track of non-visual components.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null; |
||||
|
||||
/// <summary>
|
||||
/// Disposes resources used by the form.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) |
||||
{ |
||||
if (disposing) { |
||||
if (components != null) { |
||||
components.Dispose(); |
||||
} |
||||
} |
||||
base.Dispose(disposing); |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// This method is required for Windows Forms designer support.
|
||||
/// Do not change the method contents inside the source code editor. The Forms designer might
|
||||
/// not be able to load this method if it was changed manually.
|
||||
/// </summary>
|
||||
private void InitializeComponent() |
||||
{ |
||||
this.components = new System.ComponentModel.Container(); |
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); |
||||
this.textEditorControl1 = new ICSharpCode.TextEditor.TextEditorControl(); |
||||
this.statusStrip1 = new System.Windows.Forms.StatusStrip(); |
||||
this.parserThreadLabel = new System.Windows.Forms.ToolStripStatusLabel(); |
||||
this.imageList1 = new System.Windows.Forms.ImageList(this.components); |
||||
this.statusStrip1.SuspendLayout(); |
||||
this.SuspendLayout(); |
||||
//
|
||||
// textEditorControl1
|
||||
//
|
||||
this.textEditorControl1.Dock = System.Windows.Forms.DockStyle.Fill; |
||||
this.textEditorControl1.IsIconBarVisible = false; |
||||
this.textEditorControl1.Location = new System.Drawing.Point(0, 0); |
||||
this.textEditorControl1.Name = "textEditorControl1"; |
||||
this.textEditorControl1.ShowEOLMarkers = true; |
||||
this.textEditorControl1.ShowInvalidLines = false; |
||||
this.textEditorControl1.ShowSpaces = true; |
||||
this.textEditorControl1.ShowTabs = true; |
||||
this.textEditorControl1.ShowVRuler = true; |
||||
this.textEditorControl1.Size = new System.Drawing.Size(556, 248); |
||||
this.textEditorControl1.TabIndex = 0; |
||||
//
|
||||
// statusStrip1
|
||||
//
|
||||
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { |
||||
this.parserThreadLabel}); |
||||
this.statusStrip1.Location = new System.Drawing.Point(0, 248); |
||||
this.statusStrip1.Name = "statusStrip1"; |
||||
this.statusStrip1.Size = new System.Drawing.Size(556, 22); |
||||
this.statusStrip1.TabIndex = 1; |
||||
this.statusStrip1.Text = "statusStrip1"; |
||||
//
|
||||
// parserThreadLabel
|
||||
//
|
||||
this.parserThreadLabel.Name = "parserThreadLabel"; |
||||
this.parserThreadLabel.Size = new System.Drawing.Size(109, 17); |
||||
this.parserThreadLabel.Text = "toolStripStatusLabel1"; |
||||
//
|
||||
// imageList1
|
||||
//
|
||||
this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); |
||||
this.imageList1.TransparentColor = System.Drawing.Color.Transparent; |
||||
this.imageList1.Images.SetKeyName(0, "Icons.16x16.Class.png"); |
||||
this.imageList1.Images.SetKeyName(1, "Icons.16x16.Method.png"); |
||||
this.imageList1.Images.SetKeyName(2, "Icons.16x16.Property.png"); |
||||
this.imageList1.Images.SetKeyName(3, "Icons.16x16.Field.png"); |
||||
this.imageList1.Images.SetKeyName(4, "Icons.16x16.Enum.png"); |
||||
this.imageList1.Images.SetKeyName(5, "Icons.16x16.NameSpace.png"); |
||||
this.imageList1.Images.SetKeyName(6, "Icons.16x16.Event.png"); |
||||
//
|
||||
// MainForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); |
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; |
||||
this.ClientSize = new System.Drawing.Size(556, 270); |
||||
this.Controls.Add(this.textEditorControl1); |
||||
this.Controls.Add(this.statusStrip1); |
||||
this.Name = "MainForm"; |
||||
this.Text = "CSharpEditor"; |
||||
this.statusStrip1.ResumeLayout(false); |
||||
this.statusStrip1.PerformLayout(); |
||||
this.ResumeLayout(false); |
||||
this.PerformLayout(); |
||||
} |
||||
internal System.Windows.Forms.ImageList imageList1; |
||||
private System.Windows.Forms.ToolStripStatusLabel parserThreadLabel; |
||||
private System.Windows.Forms.StatusStrip statusStrip1; |
||||
private ICSharpCode.TextEditor.TextEditorControl textEditorControl1; |
||||
} |
||||
} |
@ -0,0 +1,161 @@
@@ -0,0 +1,161 @@
|
||||
// CSharp Editor Example with Code Completion
|
||||
// Copyright (c) 2006, Daniel Grunwald
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// - Redistributions of source code must retain the above copyright notice, this list
|
||||
// of conditions and the following disclaimer.
|
||||
//
|
||||
// - Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
// of conditions and the following disclaimer in the documentation and/or other materials
|
||||
// provided with the distribution.
|
||||
//
|
||||
// - Neither the name of the ICSharpCode nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without specific prior written
|
||||
// permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS
|
||||
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Drawing; |
||||
using System.Windows.Forms; |
||||
using System.IO; |
||||
using System.Threading; |
||||
|
||||
using NRefactory = ICSharpCode.NRefactory; |
||||
using Dom = ICSharpCode.SharpDevelop.Dom; |
||||
|
||||
namespace CSharpEditor |
||||
{ |
||||
partial class MainForm |
||||
{ |
||||
[STAThread] |
||||
public static void Main(string[] args) |
||||
{ |
||||
Application.EnableVisualStyles(); |
||||
Application.SetCompatibleTextRenderingDefault(false); |
||||
Application.Run(new MainForm()); |
||||
} |
||||
|
||||
internal Dom.ProjectContentRegistry pcRegistry; |
||||
internal Dom.DefaultProjectContent myProjectContent; |
||||
internal Dom.ICompilationUnit lastCompilationUnit; |
||||
Thread parserThread; |
||||
|
||||
/// <summary>
|
||||
/// Many SharpDevelop.Dom methods take a file name, which is really just a unique identifier
|
||||
/// for a file - Dom methods don't try to access code files on disk, so the file does not have
|
||||
/// to exist.
|
||||
/// SharpDevelop itself uses internal names of the kind "[randomId]/Class1.cs" to support
|
||||
/// code-completion in unsaved files.
|
||||
/// </summary>
|
||||
public const string DummyFileName = "edited.cs"; |
||||
|
||||
public MainForm() |
||||
{ |
||||
//
|
||||
// The InitializeComponent() call is required for Windows Forms designer support.
|
||||
//
|
||||
InitializeComponent(); |
||||
|
||||
textEditorControl1.Text = @"using System;
|
||||
using System.Collections.Generic; |
||||
class MainClass |
||||
{ |
||||
static void Main(string[] args) |
||||
{ |
||||
|
||||
} |
||||
} |
||||
";
|
||||
textEditorControl1.SetHighlighting("C#"); |
||||
textEditorControl1.ShowEOLMarkers = false; |
||||
CodeCompletionKeyHandler.Attach(this, textEditorControl1); |
||||
HostCallbackImplementation.Register(this); |
||||
|
||||
pcRegistry = new Dom.ProjectContentRegistry(); // Default .NET 2.0 registry
|
||||
|
||||
// Persistence caches referenced project contents for faster loading.
|
||||
// It also activates loading XML documentation files and caching them
|
||||
// for faster loading and lower memory usage.
|
||||
pcRegistry.ActivatePersistence(Path.Combine(Path.GetTempPath(), |
||||
"CSharpCodeCompletion")); |
||||
|
||||
myProjectContent = new Dom.DefaultProjectContent(); |
||||
myProjectContent.Language = Dom.LanguageProperties.CSharp; |
||||
} |
||||
|
||||
protected override void OnLoad(EventArgs e) |
||||
{ |
||||
base.OnLoad(e); |
||||
|
||||
parserThread = new Thread(ParserThread); |
||||
parserThread.IsBackground = true; |
||||
parserThread.Start(); |
||||
} |
||||
|
||||
void ParserThread() |
||||
{ |
||||
BeginInvoke(new MethodInvoker(delegate { parserThreadLabel.Text = "Loading mscorlib..."; })); |
||||
myProjectContent.AddReferencedContent(pcRegistry.Mscorlib); |
||||
|
||||
// do one initial parser step to enable code-completion while other
|
||||
// references are loading
|
||||
ParseStep(); |
||||
|
||||
string[] referencedAssemblies = { |
||||
"System", "System.Data", "System.Drawing", "System.Xml", "System.Windows.Forms" |
||||
}; |
||||
foreach (string assemblyName in referencedAssemblies) { |
||||
{ // block for anonymous method
|
||||
string assemblyNameCopy = assemblyName; |
||||
BeginInvoke(new MethodInvoker(delegate { parserThreadLabel.Text = "Loading " + assemblyNameCopy + "..."; })); |
||||
} |
||||
myProjectContent.AddReferencedContent(pcRegistry.GetProjectContentForReference(assemblyName, assemblyName)); |
||||
} |
||||
BeginInvoke(new MethodInvoker(delegate { parserThreadLabel.Text = "Ready"; })); |
||||
|
||||
// Parse the current file every 2 seconds
|
||||
while (!IsDisposed) { |
||||
ParseStep(); |
||||
|
||||
Thread.Sleep(2000); |
||||
} |
||||
} |
||||
|
||||
void ParseStep() |
||||
{ |
||||
string code = null; |
||||
Invoke(new MethodInvoker(delegate { |
||||
code = textEditorControl1.Text; |
||||
})); |
||||
TextReader textReader = new StringReader(code); |
||||
Dom.ICompilationUnit newCompilationUnit; |
||||
using (NRefactory.IParser p = NRefactory.ParserFactory.CreateParser(NRefactory.SupportedLanguage.CSharp, textReader)) { |
||||
p.Parse(); |
||||
newCompilationUnit = ConvertCompilationUnit(p.CompilationUnit); |
||||
} |
||||
// Remove information from lastCompilationUnit and add information from newCompilationUnit.
|
||||
myProjectContent.UpdateCompilationUnit(lastCompilationUnit, newCompilationUnit, DummyFileName); |
||||
lastCompilationUnit = newCompilationUnit; |
||||
} |
||||
|
||||
Dom.ICompilationUnit ConvertCompilationUnit(NRefactory.Ast.CompilationUnit cu) |
||||
{ |
||||
Dom.NRefactoryResolver.NRefactoryASTConvertVisitor converter; |
||||
converter = new Dom.NRefactoryResolver.NRefactoryASTConvertVisitor(myProjectContent); |
||||
cu.AcceptVisitor(converter, null); |
||||
return converter.Cu; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,191 @@
@@ -0,0 +1,191 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<root> |
||||
<!-- |
||||
Microsoft ResX Schema |
||||
|
||||
Version 2.0 |
||||
|
||||
The primary goals of this format is to allow a simple XML format |
||||
that is mostly human readable. The generation and parsing of the |
||||
various data types are done through the TypeConverter classes |
||||
associated with the data types. |
||||
|
||||
Example: |
||||
|
||||
... ado.net/XML headers & schema ... |
||||
<resheader name="resmimetype">text/microsoft-resx</resheader> |
||||
<resheader name="version">2.0</resheader> |
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> |
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> |
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> |
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> |
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> |
||||
<value>[base64 mime encoded serialized .NET Framework object]</value> |
||||
</data> |
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> |
||||
<comment>This is a comment</comment> |
||||
</data> |
||||
|
||||
There are any number of "resheader" rows that contain simple |
||||
name/value pairs. |
||||
|
||||
Each data row contains a name, and value. The row also contains a |
||||
type or mimetype. Type corresponds to a .NET class that support |
||||
text/value conversion through the TypeConverter architecture. |
||||
Classes that don't support this are serialized and stored with the |
||||
mimetype set. |
||||
|
||||
The mimetype is used for serialized objects, and tells the |
||||
ResXResourceReader how to depersist the object. This is currently not |
||||
extensible. For a given mimetype the value must be set accordingly: |
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format |
||||
that the ResXResourceWriter will generate, however the reader can |
||||
read any of the formats listed below. |
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64 |
||||
value : The object must be serialized with |
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter |
||||
: and then encoded with base64 encoding. |
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64 |
||||
value : The object must be serialized with |
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter |
||||
: and then encoded with base64 encoding. |
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64 |
||||
value : The object must be serialized into a byte array |
||||
: using a System.ComponentModel.TypeConverter |
||||
: and then encoded with base64 encoding. |
||||
--> |
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> |
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> |
||||
<xsd:element name="root" msdata:IsDataSet="true"> |
||||
<xsd:complexType> |
||||
<xsd:choice maxOccurs="unbounded"> |
||||
<xsd:element name="metadata"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" use="required" type="xsd:string" /> |
||||
<xsd:attribute name="type" type="xsd:string" /> |
||||
<xsd:attribute name="mimetype" type="xsd:string" /> |
||||
<xsd:attribute ref="xml:space" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="assembly"> |
||||
<xsd:complexType> |
||||
<xsd:attribute name="alias" type="xsd:string" /> |
||||
<xsd:attribute name="name" type="xsd:string" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="data"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> |
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> |
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> |
||||
<xsd:attribute ref="xml:space" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
<xsd:element name="resheader"> |
||||
<xsd:complexType> |
||||
<xsd:sequence> |
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
||||
</xsd:sequence> |
||||
<xsd:attribute name="name" type="xsd:string" use="required" /> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
</xsd:choice> |
||||
</xsd:complexType> |
||||
</xsd:element> |
||||
</xsd:schema> |
||||
<resheader name="resmimetype"> |
||||
<value>text/microsoft-resx</value> |
||||
</resheader> |
||||
<resheader name="version"> |
||||
<value>2.0</value> |
||||
</resheader> |
||||
<resheader name="reader"> |
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
||||
</resheader> |
||||
<resheader name="writer"> |
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
||||
</resheader> |
||||
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> |
||||
<value>17, 17</value> |
||||
</metadata> |
||||
<metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> |
||||
<value>128, 17</value> |
||||
</metadata> |
||||
<data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64"> |
||||
<value> |
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w |
||||
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 |
||||
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABk |
||||
DQAAAk1TRnQBSQFMAgEBBwEAAQkBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo |
||||
AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA |
||||
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 |
||||
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA |
||||
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm |
||||
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM |
||||
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA |
||||
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz |
||||
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ |
||||
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM |
||||
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA |
||||
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA |
||||
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ |
||||
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ |
||||
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA |
||||
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm |
||||
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ |
||||
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz |
||||
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA |
||||
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM |
||||
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM |
||||
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM |
||||
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA |
||||
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM |
||||
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ |
||||
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz |
||||
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm |
||||
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw |
||||
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/9UAAg4DAAEQAQ4JAAEb |
||||
AXMBXxoACV8JAAEPAQ4FAAEQAQ4IAAHvAXUBKwFfGAABGgNuBEoBCAFfCQABEAEOBQABEAEOCQABmQEW |
||||
AUsBXxcAAVgFegJZAUoBXwkAARABDgUAARABDgkAAZkBegEWASkBXxYAAVgCmgGRAq4BeQFZAUoBXwkA |
||||
AQ8BDgUAAREBDgoAAXQBegEWASkBXxUAAVgBoAKaBHoBSgdfAgABEAEOBwABDwEOBwABcwFLAUoBSwF6 |
||||
ARYBIgFfFAABWAKgAZECrgJ6AUoBbgRKAQgBXwMAAQ4GAAEPAQ4JAAJ6AZkClAEWASIUAAFYAcMCoAKa |
||||
AnoBSgJ6A1kBSgFfAwACDgUAARABDgkAAVkB9gF6ARYBSwFfFQABwwRYA1IBeQGRAq4BeQFZAUoBXwMA |
||||
Ag4FAAEQAQ4JAAFZAaABegGUARYBSwFfGgABWAGgApoEegFKAV8DAAEQAQ4FAAEQAQ8KAAFZAfYBegGU |
||||
ARYBSgFfGQABWAKgAZECrgJ6AUoBXwQAAREBDgMAARABDwsAAVkBoAF6AXkBlAEWARQBXxgAAVgBwwKg |
||||
ApoCegFKAV8XAAGZA3kCdAGZGAABwwRYA1IBGj0AAQYBXz0AAgYBawFfEgAMXx0AAQYBgQG4AQYBawFf |
||||
EAABrgtmAV8cAAFfAYEC/gG4AQYBaxAAAZEB/wL0AfIB8QPdAQkBuwFmAV8bAAPtAYEC/gG4AQYQAAGu |
||||
Af8B9wHtAf8C9wLtARkBuwFmAV8bAAGSAV8CAAEGAf4BaxEAAZEG/wH0AhkBuwFmAV8NAAFrAV8MAAH3 |
||||
AV8CAAFiAQYNAAEMAV8DAAGRAf8C7QH/AvcB7QGRARkBBwFmAV8FAAGgARoBmQHvAfcCAAJrAQ0BXwYA |
||||
ASkBXwMAAfcBXwEAA2IBXwMAAaABGgGZAe8B9wMAAWEBDAFnAV8CAAHtCP8B9AEHAWYBXwsAAWsBBgFr |
||||
AQYBDQFfBAABAwIpAV8CAAGSAV8BYgGDAYQCYgFfCQADYQEFAWEBXwEAAfcB/wG8ARkB/wEJAbwB7wFK |
||||
Af8BvAFmAV8CAAFfAqACmQHvAfcBAAEGAoEBawEGAWsBSAFfAgABUQEDATcBAwEpAV8BAAHtAV8BBQH9 |
||||
AX8BhAFiAQUCoAKZAe8B9wIAAWEDBQFhAQUBYQFfAfcB/wHzAUsB8wH/AbwBSgFYAQ8BvAGLA18BZgYA |
||||
AgYBgQEGAYEBawEGAWsBDQFfAlEB+wI3AQMCbQHrAe0B9wGCAf0BfwGEAWIHAAEFAYMBBQKDAQUDYQHV |
||||
Ad0BHAF6AUoB7QFKAXkBSgFZAg8BIgHsAWYBrgGgAQABmQHvAbQBAAIGAYECuAGBAWsBBgFrAQ0BUQP7 |
||||
AjcBAwEpAV8DAAGIAf0BggEAAaABAAGZAe8BtAEAAWEBBQGDA6UBgwEFAWEBAAG0AdwBCQEcAXoBSgF6 |
||||
AUoBegFKAVgBUgExAUQBZgGuBwABBgS4AYEDBgEAAVED+wI3AQMFAAGICQABYQSlAYMBYQIAAbQB1QG0 |
||||
AQkBHAF6AUoBmgFKAnoCWQEyAa4BzwgAAZABuQK4AYEBBgFrAwABUQP7AQMRAAFhA6UBBQcAAfQBHAF6 |
||||
AUoBoAN6AlkBjAHPCQABkAG5AbgBgQEGBQABUQH7AVETAAEMAaUBgwkAAfQBHAF6AqACegF5AewB7wG1 |
||||
CgABBgG4AQYHAAFRFQABYQsAAfQDHAPsAbwB9wHvCwABBgQAAUIBTQE+BwABPgMAASgDAAFAAwABIAMA |
||||
AQEBAAEBBgABARYAA/8BAAb/AgAG/wIABv8CAAL/AfMBnwHxAf8CAAGAAT8B5wHPAfAB/wMAAT8B5wHP |
||||
AfgBfwMAAT8B5wHPAfgBPwMAAT8B5wHPAfwBHwQAAc8B5wHwAQ8EAAHnAc8B+AEPBAAB5wHPAfgBHwQA |
||||
AecBzwH4AQ8CAAH8AQAB5wHPAfwBBwIAAfwBAAHzAZ8B/AEDAgAB/AEAAv8B/gEDAgAB/AEBBP8CAAH/ |
||||
AfMH/wHhAv8BgAEHA/8BwAL/AQABBwP/AYAC/wEAAQcD/wEAAv8BAAEHA/8BMQL/AQABBwH/Ac8B/wEz |
||||
Af8B5wEAAQcBwQGHAecBIQHBAcMBAAEHAf8BAwHDAQAB/wGBAQABBgECAQEBgQEAAQMDAAH8AwAB/gMA |
||||
AUQCAAFxAUQBAQIAAf4BAAGAAfsB/gEDAgAB/wEBAcEC/wEHAfABAAH/AYMB4wL/AY8B+AEAAf8BxwH3 |
||||
Av8B3wH8AQAB/wHvCw== |
||||
</value> |
||||
</data> |
||||
</root> |
Loading…
Reference in new issue