@ -10,6 +10,7 @@ using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Editor ;
using ICSharpCode.SharpDevelop.Editor ;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion ;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion ;
using ICSharpCode.SharpDevelop.Gui ;
using ICSharpCode.SharpDevelop.Gui ;
using ICSharpCode.SharpDevelop.Project ;
using ICSharpCode.XmlEditor ;
using ICSharpCode.XmlEditor ;
namespace ICSharpCode.XamlBinding
namespace ICSharpCode.XamlBinding
@ -50,170 +51,96 @@ namespace ICSharpCode.XamlBinding
return text . Length - i - 1 ;
return text . Length - i - 1 ;
}
}
// public override void Complete(CompletionContext context, ICompletionItem item)
public override void Complete ( CompletionContext context , ICompletionItem item )
// {
{
// using (context.Editor.Document.OpenUndoGroup()) {
using ( context . Editor . Document . OpenUndoGroup ( ) ) {
// base.Complete(context, item);
base . Complete ( context , item ) ;
//
// XamlCompletionContext xamlContext = CompletionDataHelper.ResolveCompletionContext(context.Editor, context.CompletionChar);
XamlCompletionContext xamlContext = XamlContextResolver . ResolveCompletionContext ( context . Editor , context . CompletionChar ) ;
//
// if (xamlContext.Description == XamlContextDescription.None && (context.StartOffset <= 0 || context.Editor.Document.GetCharAt(context.StartOffset - 1) != '<')) {
if ( xamlContext . Description = = XamlContextDescription . None & & ( context . StartOffset < = 0 | | context . Editor . Document . GetCharAt ( context . StartOffset - 1 ) ! = '<' ) ) {
// context.Editor.Document.Insert(context.StartOffset, "<");
context . Editor . Document . Insert ( context . StartOffset , "<" ) ;
// context.EndOffset++;
context . EndOffset + + ;
// }
}
//
// if (item is XamlCodeCompletionItem) {
if ( item is XamlCompletionItem ) {
// XamlCodeCompletionItem cItem = item as XamlCodeCompletionItem;
XamlCompletionItem cItem = item as XamlCompletionItem ;
//
// if (cItem.Entity is IProperty || cItem.Entity is IEvent) {
if ( cItem . Entity is IProperty | | cItem . Entity is IEvent ) {
// if (xamlContext.Description == XamlContextDescription.InTag) {
if ( xamlContext . Description = = XamlContextDescription . InTag ) {
// context.Editor.Document.Insert(context.EndOffset, "=\"\"");
context . Editor . Document . Insert ( context . EndOffset , "=\"\"" ) ;
// context.CompletionCharHandled = context.CompletionChar == '=';
context . CompletionCharHandled = context . CompletionChar = = '=' ;
// context.Editor.Caret.Offset--;
context . Editor . Caret . Offset - - ;
// new XamlCodeCompletionBinding().CtrlSpace(context.Editor);
new XamlCodeCompletionBinding ( ) . CtrlSpace ( context . Editor ) ;
// } else if (xamlContext.Description == XamlContextDescription.InMarkupExtension && !string.IsNullOrEmpty(xamlContext.RawAttributeValue)) {
} else if ( xamlContext . Description = = XamlContextDescription . InMarkupExtension & & ! string . IsNullOrEmpty ( xamlContext . RawAttributeValue ) ) {
// string valuePart = xamlContext.RawAttributeValue.Substring(0, xamlContext.ValueStartOffset);
string valuePart = xamlContext . RawAttributeValue . Substring ( 0 , xamlContext . ValueStartOffset ) ;
// AttributeValue value = MarkupExtensionParser.ParseValue(valuePart);
AttributeValue value = MarkupExtensionParser . ParseValue ( valuePart ) ;
//
// if (value != null && !value.IsString) {
if ( value ! = null & & ! value . IsString ) {
// var markup = Utils.GetMarkupExtensionAtPosition(value.ExtensionValue, context.Editor.Caret.Offset);
var markup = Utils . GetMarkupExtensionAtPosition ( value . ExtensionValue , context . Editor . Caret . Offset ) ;
// if (markup.NamedArguments.Count > 0 || markup.PositionalArguments.Count > 0) {
if ( markup . NamedArguments . Count > 0 | | markup . PositionalArguments . Count > 0 ) {
// int oldOffset = context.Editor.Caret.Offset;
int oldOffset = context . Editor . Caret . Offset ;
// context.Editor.Caret.Offset = context.StartOffset;
context . Editor . Caret . Offset = context . StartOffset ;
// string word = context.Editor.GetWordBeforeCaret().TrimEnd();
string word = context . Editor . GetWordBeforeCaret ( ) . TrimEnd ( ) ;
// int spaces = CountWhiteSpacesAtEnd(context.Editor.GetWordBeforeCaret());
int spaces = CountWhiteSpacesAtEnd ( context . Editor . GetWordBeforeCaret ( ) ) ;
// int typeNameStart = markup.ExtensionType.IndexOf(':') + 1;
int typeNameStart = markup . ExtensionType . IndexOf ( ':' ) + 1 ;
//
// if (!(word == "." || word == "," || word == ":") && markup.ExtensionType.Substring(typeNameStart, markup.ExtensionType.Length - typeNameStart) != word) {
if ( ! ( word = = "." | | word = = "," | | word = = ":" ) & & markup . ExtensionType . Substring ( typeNameStart , markup . ExtensionType . Length - typeNameStart ) ! = word ) {
// context.Editor.Document.Replace(context.Editor.Caret.Offset - spaces, spaces, ", ");
context . Editor . Document . Replace ( context . Editor . Caret . Offset - spaces , spaces , ", " ) ;
// oldOffset += (2 - spaces);
oldOffset + = ( 2 - spaces ) ;
// }
}
//
// context.Editor.Caret.Offset = oldOffset;
context . Editor . Caret . Offset = oldOffset ;
// }
}
// }
}
//
// if (cItem.Text.EndsWith("=", StringComparison.OrdinalIgnoreCase))
if ( cItem . Text . EndsWith ( "=" , StringComparison . OrdinalIgnoreCase ) )
// new XamlCodeCompletionBinding().CtrlSpace(context.Editor);
new XamlCodeCompletionBinding ( ) . CtrlSpace ( context . Editor ) ;
// }
}
// }
}
// }
}
//
// if (item is NewEventCompletionItem) {
if ( item is NewEventCompletionItem ) {
// NewEventCompletionItem eventItem = item as NewEventCompletionItem;
CreateEventHandlerCode ( xamlContext , item as NewEventCompletionItem ) ;
// int discriminator;
}
// if (CreateEventHandlerCode(context, eventItem, out discriminator)) {
// if (discriminator > 0)
if ( item is XmlnsCompletionItem ) {
// context.Editor.Document.Insert(context.EndOffset, discriminator.ToString());
context . Editor . Caret . Offset + + ;
// }
}
// }
//
switch ( item . Text ) {
// if (item is XmlnsCompletionItem) {
case "![CDATA[" :
// context.Editor.Caret.Offset++;
context . Editor . Document . Insert ( context . Editor . Caret . Offset , "]]>" ) ;
// }
context . Editor . Caret . Offset - = 3 ;
//
break ;
// if (item is XamlCompletionItem && xamlContext.Description == XamlContextDescription.InTag) {
case "?" :
// context.Editor.Document.Insert(context.EndOffset, "=\"\"");
context . Editor . Document . Insert ( context . Editor . Caret . Offset , "?>" ) ;
// context.Editor.Caret.Offset--;
context . Editor . Caret . Offset - = 2 ;
// new XamlCodeCompletionBinding().CtrlSpace(context.Editor);
break ;
// }
case "!--" :
//
context . Editor . Document . Insert ( context . Editor . Caret . Offset , " -->" ) ;
// switch (item.Text) {
context . Editor . Caret . Offset - = 4 ;
// case "![CDATA[":
break ;
// context.Editor.Document.Insert(context.Editor.Caret.Offset, "]]>");
}
// context.Editor.Caret.Offset -= 3;
// break;
if ( item . Text . StartsWith ( "/" , StringComparison . OrdinalIgnoreCase ) ) {
// case "?":
context . Editor . Document . Insert ( context . EndOffset , ">" ) ;
// context.Editor.Document.Insert(context.Editor.Caret.Offset, "?>");
context . CompletionCharHandled = context . CompletionChar = = '>' ;
// context.Editor.Caret.Offset -= 2;
context . Editor . Caret . Offset + + ;
// break;
}
// case "!--":
}
// context.Editor.Document.Insert(context.Editor.Caret.Offset, " -->");
}
// context.Editor.Caret.Offset -= 4;
// break;
static bool CreateEventHandlerCode ( XamlCompletionContext context , NewEventCompletionItem completionItem )
// }
{
//
IProject project = SD . ProjectService . FindProjectContainingFile ( context . Editor . FileName ) ;
// if (item.Text.StartsWith("/", StringComparison.OrdinalIgnoreCase)) {
if ( project = = null ) return false ;
// context.Editor.Document.Insert(context.EndOffset, ">");
var unresolved = context . ParseInformation . UnresolvedFile . TypeDefinition ;
// context.CompletionCharHandled = context.CompletionChar == '>';
if ( unresolved = = null ) return false ;
// context.Editor.Caret.Offset++;
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 ;
//
}
// 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;
// }
}
}
}
}