@ -10,6 +10,7 @@ using ICSharpCode.NRefactory.TypeSystem;
@@ -10,6 +10,7 @@ using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Editor ;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion ;
using ICSharpCode.SharpDevelop.Gui ;
using ICSharpCode.SharpDevelop.Project ;
using ICSharpCode.XmlEditor ;
namespace ICSharpCode.XamlBinding
@ -50,170 +51,96 @@ namespace ICSharpCode.XamlBinding
@@ -50,170 +51,96 @@ namespace ICSharpCode.XamlBinding
return text . Length - i - 1 ;
}
// public override void Complete(CompletionContext context, ICompletionItem item)
// {
// using (context.Editor.Document.OpenUndoGroup()) {
// base.Complete(context, item);
//
// XamlCompletionContext xamlContext = CompletionDataHelper.ResolveCompletionContext(context.Editor, context.CompletionChar);
//
// if (xamlContext.Description == XamlContextDescription.None && (context.StartOffset <= 0 || context.Editor.Document.GetCharAt(context.StartOffset - 1) != '<')) {
// context.Editor.Document.Insert(context.StartOffset, "<");
// context.EndOffset++;
// }
//
// if (item is XamlCodeCompletionItem) {
// XamlCodeCompletionItem cItem = item as XamlCodeCompletionItem;
//
// if (cItem.Entity is IProperty || cItem.Entity is IEvent) {
// if (xamlContext.Description == XamlContextDescription.InTag) {
// context.Editor.Document.Insert(context.EndOffset, "=\"\"");
// context.CompletionCharHandled = context.CompletionChar == '=';
// context.Editor.Caret.Offset--;
// new XamlCodeCompletionBinding().CtrlSpace(context.Editor);
// } else if (xamlContext.Description == XamlContextDescription.InMarkupExtension && !string.IsNullOrEmpty(xamlContext.RawAttributeValue)) {
// string valuePart = xamlContext.RawAttributeValue.Substring(0, xamlContext.ValueStartOffset);
// AttributeValue value = MarkupExtensionParser.ParseValue(valuePart);
//
// if (value != null && !value.IsString) {
// var markup = Utils.GetMarkupExtensionAtPosition(value.ExtensionValue, context.Editor.Caret.Offset);
// if (markup.NamedArguments.Count > 0 || markup.PositionalArguments.Count > 0) {
// int oldOffset = context.Editor.Caret.Offset;
// context.Editor.Caret.Offset = context.StartOffset;
// string word = context.Editor.GetWordBeforeCaret().TrimEnd();
// int spaces = CountWhiteSpacesAtEnd(context.Editor.GetWordBeforeCaret());
// int typeNameStart = markup.ExtensionType.IndexOf(':') + 1;
//
// if (!(word == "." || word == "," || word == ":") && markup.ExtensionType.Substring(typeNameStart, markup.ExtensionType.Length - typeNameStart) != word) {
// context.Editor.Document.Replace(context.Editor.Caret.Offset - spaces, spaces, ", ");
// oldOffset += (2 - spaces);
// }
//
// context.Editor.Caret.Offset = oldOffset;
// }
// }
//
// if (cItem.Text.EndsWith("=", StringComparison.OrdinalIgnoreCase))
// new XamlCodeCompletionBinding().CtrlSpace(context.Editor);
// }
// }
// }
//
// if (item is NewEventCompletionItem) {
// NewEventCompletionItem eventItem = item as NewEventCompletionItem;
// int discriminator;
// if (CreateEventHandlerCode(context, eventItem, out discriminator)) {
// if (discriminator > 0)
// context.Editor.Document.Insert(context.EndOffset, discriminator.ToString());
// }
// }
//
// if (item is XmlnsCompletionItem) {
// context.Editor.Caret.Offset++;
// }
//
// if (item is XamlCompletionItem && xamlContext.Description == XamlContextDescription.InTag) {
// context.Editor.Document.Insert(context.EndOffset, "=\"\"");
// context.Editor.Caret.Offset--;
// new XamlCodeCompletionBinding().CtrlSpace(context.Editor);
// }
//
// switch (item.Text) {
// case "![CDATA[":
// context.Editor.Document.Insert(context.Editor.Caret.Offset, "]]>");
// context.Editor.Caret.Offset -= 3;
// break;
// case "?":
// context.Editor.Document.Insert(context.Editor.Caret.Offset, "?>");
// context.Editor.Caret.Offset -= 2;
// break;
// case "!--":
// context.Editor.Document.Insert(context.Editor.Caret.Offset, " -->");
// context.Editor.Caret.Offset -= 4;
// break;
// }
//
// if (item.Text.StartsWith("/", StringComparison.OrdinalIgnoreCase)) {
// context.Editor.Document.Insert(context.EndOffset, ">");
// context.CompletionCharHandled = context.CompletionChar == '>';
// context.Editor.Caret.Offset++;
// }
// }
// }
//
// static bool CreateEventHandlerCode(CompletionContext context, NewEventCompletionItem completionItem, out int discriminator)
// {
// ParseInformation p = ParserService.GetParseInformation(context.Editor.FileName);
// var unit = p.SyntaxTree;
// var loc = context.Editor.Document.OffsetToPosition(context.StartOffset);
// IClass c = unit.GetInnermostClass(loc.Line, loc.Column);
//
// discriminator = 1;
//
// if (c == null)
// return false;
// IMethod initializeComponent = c.Methods[0];
// CompoundClass compound = c.GetCompoundClass() as CompoundClass;
//
// IMethod invokeMethod = completionItem.EventType.ReturnType.GetMethods().FirstOrDefault(m => m.Name == "Invoke");
//
// string handlerName = completionItem.HandlerName;
//
// if (invokeMethod == null)
// throw new ArgumentException("delegateType is not a valid delegate!");
//
// if (compound != null) {
// foreach (IClass part in compound.Parts) {
// IMember lastMember = part.Methods.LastOrDefault();
//
// if (lastMember != null && lastMember.ToString() == initializeComponent.ToString())
// continue;
//
// if (completionItem.EventType.ReturnType == null)
// return false;
//
// while (part.Methods.Any(m => m.Name == handlerName &&
// m.Parameters.Count == invokeMethod.Parameters.Count &&
// m.Parameters.SequenceEqual(invokeMethod.Parameters, new ParameterComparer())
// )) {
// handlerName = completionItem.HandlerName + discriminator;
// discriminator++;
// }
//
// discriminator--;
//
// ParametrizedNode node = (ParametrizedNode)CodeGenerator.ConvertMember(invokeMethod, new ClassFinder(part, context.Editor.Caret.Line, context.Editor.Caret.Column));
//
// node.Name = handlerName;
//
// node.Modifier = Modifiers.None;
//
// IViewContent viewContent = FileService.OpenFile(part.SyntaxTree.FileName, XamlBindingOptions.SwitchToCodeViewAfterInsertion);
// IFileDocumentProvider document = viewContent as IFileDocumentProvider;
//
// if (viewContent != null && document != null) {
// DomRegion domRegion;
//
// if (lastMember != null) {
// unit.ProjectContent.Language.CodeGenerator.InsertCodeAfter(lastMember, new RefactoringDocumentAdapter(document.GetDocumentForFile(viewContent.PrimaryFile)), node);
// domRegion = lastMember.BodyRegion;
// }
// else {
// unit.ProjectContent.Language.CodeGenerator.InsertCodeAtEnd(part.Region, new RefactoringDocumentAdapter(document.GetDocumentForFile(viewContent.PrimaryFile)), node);
// domRegion = part.Region;
// }
//
// // move caret to generated code
// ITextEditorProvider provider = viewContent as ITextEditorProvider;
// if (provider != null) {
// provider.TextEditor.JumpTo(domRegion.EndLine + 2, domRegion.EndColumn - 1);
// }
// }
// return true;
// }
// }
//
// return false;
// }
public override void Complete ( CompletionContext context , ICompletionItem item )
{
using ( context . Editor . Document . OpenUndoGroup ( ) ) {
base . Complete ( context , item ) ;
XamlCompletionContext xamlContext = XamlContextResolver . ResolveCompletionContext ( context . Editor , context . CompletionChar ) ;
if ( xamlContext . Description = = XamlContextDescription . None & & ( context . StartOffset < = 0 | | context . Editor . Document . GetCharAt ( context . StartOffset - 1 ) ! = '<' ) ) {
context . Editor . Document . Insert ( context . StartOffset , "<" ) ;
context . EndOffset + + ;
}
if ( item is XamlCompletionItem ) {
XamlCompletionItem cItem = item as XamlCompletionItem ;
if ( cItem . Entity is IProperty | | cItem . Entity is IEvent ) {
if ( xamlContext . Description = = XamlContextDescription . InTag ) {
context . Editor . Document . Insert ( context . EndOffset , "=\"\"" ) ;
context . CompletionCharHandled = context . CompletionChar = = '=' ;
context . Editor . Caret . Offset - - ;
new XamlCodeCompletionBinding ( ) . CtrlSpace ( context . Editor ) ;
} else if ( xamlContext . Description = = XamlContextDescription . InMarkupExtension & & ! string . IsNullOrEmpty ( xamlContext . RawAttributeValue ) ) {
string valuePart = xamlContext . RawAttributeValue . Substring ( 0 , xamlContext . ValueStartOffset ) ;
AttributeValue value = MarkupExtensionParser . ParseValue ( valuePart ) ;
if ( value ! = null & & ! value . IsString ) {
var markup = Utils . GetMarkupExtensionAtPosition ( value . ExtensionValue , context . Editor . Caret . Offset ) ;
if ( markup . NamedArguments . Count > 0 | | markup . PositionalArguments . Count > 0 ) {
int oldOffset = context . Editor . Caret . Offset ;
context . Editor . Caret . Offset = context . StartOffset ;
string word = context . Editor . GetWordBeforeCaret ( ) . TrimEnd ( ) ;
int spaces = CountWhiteSpacesAtEnd ( context . Editor . GetWordBeforeCaret ( ) ) ;
int typeNameStart = markup . ExtensionType . IndexOf ( ':' ) + 1 ;
if ( ! ( word = = "." | | word = = "," | | word = = ":" ) & & markup . ExtensionType . Substring ( typeNameStart , markup . ExtensionType . Length - typeNameStart ) ! = word ) {
context . Editor . Document . Replace ( context . Editor . Caret . Offset - spaces , spaces , ", " ) ;
oldOffset + = ( 2 - spaces ) ;
}
context . Editor . Caret . Offset = oldOffset ;
}
}
if ( cItem . Text . EndsWith ( "=" , StringComparison . OrdinalIgnoreCase ) )
new XamlCodeCompletionBinding ( ) . CtrlSpace ( context . Editor ) ;
}
}
}
if ( item is NewEventCompletionItem ) {
CreateEventHandlerCode ( xamlContext , item as NewEventCompletionItem ) ;
}
if ( item is XmlnsCompletionItem ) {
context . Editor . Caret . Offset + + ;
}
switch ( item . Text ) {
case "![CDATA[" :
context . Editor . Document . Insert ( context . Editor . Caret . Offset , "]]>" ) ;
context . Editor . Caret . Offset - = 3 ;
break ;
case "?" :
context . Editor . Document . Insert ( context . Editor . Caret . Offset , "?>" ) ;
context . Editor . Caret . Offset - = 2 ;
break ;
case "!--" :
context . Editor . Document . Insert ( context . Editor . Caret . Offset , " -->" ) ;
context . Editor . Caret . Offset - = 4 ;
break ;
}
if ( item . Text . StartsWith ( "/" , StringComparison . OrdinalIgnoreCase ) ) {
context . Editor . Document . Insert ( context . EndOffset , ">" ) ;
context . CompletionCharHandled = context . CompletionChar = = '>' ;
context . Editor . Caret . Offset + + ;
}
}
}
static bool CreateEventHandlerCode ( XamlCompletionContext context , NewEventCompletionItem completionItem )
{
IProject project = SD . ProjectService . FindProjectContainingFile ( context . Editor . FileName ) ;
if ( project = = null ) return false ;
var unresolved = context . ParseInformation . UnresolvedFile . TypeDefinition ;
if ( unresolved = = null ) return false ;
var compilation = SD . ParserService . GetCompilationForFile ( context . Editor . FileName ) ;
var definition = unresolved . Resolve ( new SimpleTypeResolveContext ( compilation . MainAssembly ) ) . GetDefinition ( ) ;
project . CodeGenerator . InsertEventHandler ( definition , completionItem . HandlerName , completionItem . EventType , true ) ;
return true ;
}
}
}