Browse Source

XamlBinding:

- added icons
- removed "<" from CC entries, it is automatically added at insertion, if needed

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4401 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Siegfried Pammer 17 years ago
parent
commit
ac3f76900c
  1. 64
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompletionDataHelper.cs
  2. 18
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCodeCompletionBinding.cs
  3. 35
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItem.cs
  4. 61
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItemList.cs

64
src/AddIns/BackendBindings/XamlBinding/XamlBinding/CompletionDataHelper.cs

@ -26,13 +26,13 @@ namespace ICSharpCode.XamlBinding @@ -26,13 +26,13 @@ namespace ICSharpCode.XamlBinding
{
#region Pre-defined lists
static readonly List<ICompletionItem> standardElements = new List<ICompletionItem> {
new DefaultCompletionItem("!--"),
new DefaultCompletionItem("![CDATA["),
new DefaultCompletionItem("?")
new SpecialCompletionItem("!--"),
new SpecialCompletionItem("![CDATA["),
new SpecialCompletionItem("?")
};
static readonly List<ICompletionItem> standardAttributes = new List<ICompletionItem> {
new DefaultCompletionItem("xmlns:")
new SpecialCompletionItem("xmlns:")
};
static readonly List<string> xamlNamespaceAttributes = new List<string> {
@ -277,7 +277,7 @@ namespace ICSharpCode.XamlBinding @@ -277,7 +277,7 @@ namespace ICSharpCode.XamlBinding
return string.Empty;
}
public static IList<ICompletionItem> CreateElementList(XamlCompletionContext context, bool addOpeningBrace, bool classesOnly)
public static IList<ICompletionItem> CreateElementList(XamlCompletionContext context, bool classesOnly)
{
DebugTimer.Start();
@ -334,14 +334,14 @@ namespace ICSharpCode.XamlBinding @@ -334,14 +334,14 @@ namespace ICSharpCode.XamlBinding
continue;
}
result.Add(new XamlCodeCompletionItem(c, ns.Key, addOpeningBrace));
result.Add(new XamlCodeCompletionItem(c, ns.Key));
}
}
if (!(rt == null || isMember || classesOnly)) {
foreach (IProperty p in rt.GetProperties()) {
if (p.IsPublic && (p.CanSet || p.ReturnType.IsCollectionReturnType()))
result.Add(new XamlCodeCompletionItem(p, last.Prefix, last.Name, addOpeningBrace));
result.Add(new XamlCodeCompletionItem(p, last.Prefix, last.Name));
}
}
@ -352,20 +352,20 @@ namespace ICSharpCode.XamlBinding @@ -352,20 +352,20 @@ namespace ICSharpCode.XamlBinding
public static IList<ICompletionItem> CreateListOfMarkupExtensions(XamlCompletionContext context)
{
var list = CreateElementList(context, false, true);
var list = CreateElementList(context, true);
var neededItems = list
.Where(i => ((i as XamlCodeCompletionItem).Entity as IClass).DerivesFrom("System.Windows.Markup.MarkupExtension"))
.Select(
.Where(i => ((i as XamlCodeCompletionItem).Entity as IClass).DerivesFrom("System.Windows.Markup.MarkupExtension"));
neededItems
.ForEach(
selItem => {
var it = selItem as XamlCodeCompletionItem;
string text = it.Text;
if (it.Text.EndsWith("Extension", StringComparison.Ordinal))
text = text.Remove(it.Text.Length - "Extension".Length);
return new XamlCodeCompletionItem(it.Entity, text);
it.Text = text;
}
)
.Cast<ICompletionItem>();
);
return neededItems.ToList();
}
@ -380,8 +380,8 @@ namespace ICSharpCode.XamlBinding @@ -380,8 +380,8 @@ namespace ICSharpCode.XamlBinding
switch (context.Description) {
case XamlContextDescription.None:
if (context.Forced) {
list.Items.AddRange(standardElements.Select(item => new DefaultCompletionItem("<" + item.Text)).Cast<ICompletionItem>());
list.Items.AddRange(CreateElementList(context, true, false));
list.Items.AddRange(standardElements);
list.Items.AddRange(CreateElementList(context, false));
}
break;
case XamlContextDescription.AtTag:
@ -391,7 +391,7 @@ namespace ICSharpCode.XamlBinding @@ -391,7 +391,7 @@ namespace ICSharpCode.XamlBinding
list.Items.AddRange(CreateAttributeList(context, existing, false));
} else {
list.Items.AddRange(standardElements);
list.Items.AddRange(CreateElementList(context, false, false));
list.Items.AddRange(CreateElementList(context, false));
}
break;
case XamlContextDescription.InTag:
@ -467,7 +467,7 @@ namespace ICSharpCode.XamlBinding @@ -467,7 +467,7 @@ namespace ICSharpCode.XamlBinding
{
var ctors = trr.ResolvedType.GetMethods().Where(m => m.IsConstructor && m.Parameters.Count >= markup.PositionalArguments.Count);
if (ctors.Any(ctor => ctor.Parameters.Count >= markup.PositionalArguments.Count)) {
list.Items.AddRange(trr.ResolvedType.GetProperties().Where(p => p.CanSet && p.IsPublic).Select(p => new XamlCodeCompletionItem(p, p.Name + "=")).Cast<ICompletionItem>());
list.Items.AddRange(trr.ResolvedType.GetProperties().Where(p => p.CanSet && p.IsPublic).Select(p => new XamlCodeCompletionItem(p.Name + "=", p)).Cast<ICompletionItem>());
}
}
@ -485,7 +485,7 @@ namespace ICSharpCode.XamlBinding @@ -485,7 +485,7 @@ namespace ICSharpCode.XamlBinding
break;
case "System.Windows.Markup.TypeExtension":
if (context.AttributeValue.ExtensionValue.PositionalArguments.Count <= 1) {
list.Items.AddRange(CreateElementList(context, false, true));
list.Items.AddRange(CreateElementList(context, true));
AttributeValue selItem = Utils.GetInnermostMarkupExtensionInfo(context.AttributeValue.ExtensionValue)
.PositionalArguments.LastOrDefault();
string word = context.Editor.GetWordBeforeCaret().TrimEnd();
@ -538,26 +538,26 @@ namespace ICSharpCode.XamlBinding @@ -538,26 +538,26 @@ namespace ICSharpCode.XamlBinding
case ClassType.Class:
if (context.Description == XamlContextDescription.InMarkupExtension) {
foreach (IField f in c.Fields)
yield return new XamlCodeCompletionItem(f, textPrefix + f.Name);
yield return new XamlCodeCompletionItem(textPrefix + f.Name, f);
foreach (IProperty p in c.Properties.Where(pr => pr.IsPublic && pr.IsStatic && pr.CanGet))
yield return new XamlCodeCompletionItem(p, textPrefix + p.Name);
yield return new XamlCodeCompletionItem(textPrefix + p.Name, p);
}
break;
case ClassType.Enum:
foreach (IField f in c.Fields)
yield return new XamlCodeCompletionItem(f, textPrefix + f.Name);
yield return new XamlCodeCompletionItem(textPrefix + f.Name, f);
foreach (IProperty p in c.Properties.Where(pr => pr.IsPublic && pr.IsStatic && pr.CanGet))
yield return new XamlCodeCompletionItem(p, textPrefix + p.Name);
yield return new XamlCodeCompletionItem(textPrefix + p.Name, p);
break;
case ClassType.Struct:
switch (c.FullyQualifiedName) {
case "System.Boolean":
yield return new DefaultCompletionItem("True");
yield return new DefaultCompletionItem("False");
yield return new SpecialValueCompletionItem("True");
yield return new SpecialValueCompletionItem("False");
break;
case "System.Windows.GridLength":
yield return new DefaultCompletionItem("Auto");
yield return new DefaultCompletionItem("*");
yield return new SpecialValueCompletionItem("Auto");
yield return new SpecialValueCompletionItem("*");
break;
}
break;
@ -572,9 +572,9 @@ namespace ICSharpCode.XamlBinding @@ -572,9 +572,9 @@ namespace ICSharpCode.XamlBinding
cla.FullyQualifiedName == c.FullyQualifiedName + "es"));
foreach (var coll in classes) {
foreach (var item in coll.Properties)
yield return new DefaultCompletionItem(item.Name);
yield return new SpecialValueCompletionItem(item.Name);
foreach (var item in coll.Fields.Where(f => f.IsPublic && f.IsStatic && f.ReturnType.FullyQualifiedName == c.FullyQualifiedName))
yield return new DefaultCompletionItem(item.Name);
yield return new SpecialValueCompletionItem(item.Name);
}
}
@ -655,7 +655,7 @@ namespace ICSharpCode.XamlBinding @@ -655,7 +655,7 @@ namespace ICSharpCode.XamlBinding
var items = GetClassesFromContext(context);
foreach (var ns in items) {
list.Items.AddRange(ns.Value.Where(c => c.Fields.Any(f => f.IsStatic) || c.Properties.Any(p => p.IsStatic))
.Select(c => new XamlCodeCompletionItem(c, ns.Key, false))
.Select(c => new XamlCodeCompletionItem(c, ns.Key))
.Cast<ICompletionItem>());
}
if (selItem != null && selItem.IsString) {
@ -797,7 +797,7 @@ namespace ICSharpCode.XamlBinding @@ -797,7 +797,7 @@ namespace ICSharpCode.XamlBinding
string name = (!string.IsNullOrEmpty(ns.Key)) ? ns.Key + ":" : "";
string property = item.Name.Remove(item.Name.Length - "Property".Length);
name += c.Name + "." + item.Name.Remove(item.Name.Length - "Property".Length);
return new XamlCodeCompletionItem(new DefaultProperty(c, property) { ReturnType = GetAttachedPropertyType(item, c) }, name);
return new XamlCodeCompletionItem(name, new DefaultProperty(c, property) { ReturnType = GetAttachedPropertyType(item, c) });
}
)
.Where(item => !existingItems.Any(str => str == item.Text))
@ -848,10 +848,10 @@ namespace ICSharpCode.XamlBinding @@ -848,10 +848,10 @@ namespace ICSharpCode.XamlBinding
result.AddRange(attachedEvents
.Select(
item => new XamlCodeCompletionItem(
(string.IsNullOrEmpty(ns.Key) ? "" : ns.Key + ":") + c.Name + "." + item.Name.Remove(item.Name.Length - "Event".Length),
new DefaultEvent(c, GetEventNameFromField(item)) {
ReturnType = GetAttachedEventDelegateType(item, c)
},
(string.IsNullOrEmpty(ns.Key) ? "" : ns.Key + ":") + c.Name + "." + item.Name.Remove(item.Name.Length - "Event".Length)
}
)
)
.Where(item => !existingItems.Any(str => str == item.Text))

18
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCodeCompletionBinding.cs

@ -101,7 +101,7 @@ namespace ICSharpCode.XamlBinding @@ -101,7 +101,7 @@ namespace ICSharpCode.XamlBinding
while (searchOffset < editor.Document.TextLength - 1) {
searchOffset++;
if (!char.IsWhiteSpace(editor.Document.GetCharAt(searchOffset)))
break;
break;
}
if (searchOffset >= editor.Document.TextLength || editor.Document.GetCharAt(searchOffset) != '"') {
@ -144,7 +144,7 @@ namespace ICSharpCode.XamlBinding @@ -144,7 +144,7 @@ namespace ICSharpCode.XamlBinding
editor.ShowCompletionWindow(list);
return true;
} else {
// DO NOT USE CompletionDataHelper.CreateListForContext here!!! results in endless recursion!!!!
// DO NOT USE CompletionDataHelper.CreateListForContext here!!! results in endless recursion!!!!
if (!string.IsNullOrEmpty(context.AttributeName)) {
if (!DoMarkupExtensionCompletion(context)) {
XamlResolver resolver = new XamlResolver();
@ -194,7 +194,7 @@ namespace ICSharpCode.XamlBinding @@ -194,7 +194,7 @@ namespace ICSharpCode.XamlBinding
case "Value":
var loc2 = context.Editor.Document.OffsetToPosition(XmlParser.GetActiveElementStartIndex(context.Editor.Document.Text, context.Editor.Caret.Offset));
AttributeValue propType = MarkupExtensionParser.ParseValue(
Utils.GetAttributeValue(context.Editor.Document.Text, loc2.Line,
Utils.GetAttributeValue(context.Editor.Document.Text, loc2.Line,
loc2.Column, "Property"));
if (!propType.IsString)
break;
@ -212,16 +212,22 @@ namespace ICSharpCode.XamlBinding @@ -212,16 +212,22 @@ namespace ICSharpCode.XamlBinding
completionList.Items.AddRange(
typeName.GetProperties()
.Where(p => p.IsPublic && p.CanSet)
.Select(prop => new DefaultCompletionItem(prop.Name))
.Select(prop => new XamlCodeCompletionItem(prop))
.Cast<ICompletionItem>()
);
break;
case "Event":
completionList.Items.AddRange(
typeName.GetEvents()
.Where(e => e.IsPublic)
.Select(evt => new XamlCodeCompletionItem(evt))
.Cast<ICompletionItem>()
);
break;
case "Handler":
var loc3 = context.Editor.Document.OffsetToPosition(XmlParser.GetActiveElementStartIndex(context.Editor.Document.Text, context.Editor.Caret.Offset));
AttributeValue evtType = MarkupExtensionParser.ParseValue(
Utils.GetAttributeValue(context.Editor.Document.Text, loc3.Line,
Utils.GetAttributeValue(context.Editor.Document.Text, loc3.Line,
loc3.Column, "Event"));
if (!evtType.IsString)
break;
@ -233,7 +239,7 @@ namespace ICSharpCode.XamlBinding @@ -233,7 +239,7 @@ namespace ICSharpCode.XamlBinding
IMethod invoker = evtMember.ResolvedMember as IMethod;
break;
}
}

35
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItem.cs

@ -18,16 +18,13 @@ namespace ICSharpCode.XamlBinding @@ -18,16 +18,13 @@ namespace ICSharpCode.XamlBinding
{
class XamlCodeCompletionItem : CodeCompletionItem
{
public XamlCodeCompletionItem(IEntity entity, string prefix, bool addOpeningBrace)
public XamlCodeCompletionItem(IEntity entity, string prefix)
: base(entity)
{
if (string.IsNullOrEmpty(prefix))
this.Text = entity.Name;
else
this.Text = prefix + ":" + entity.Name;
if (addOpeningBrace)
this.Text = "<" + this.Text;
}
public XamlCodeCompletionItem(IEntity entity)
@ -36,22 +33,19 @@ namespace ICSharpCode.XamlBinding @@ -36,22 +33,19 @@ namespace ICSharpCode.XamlBinding
this.Text = entity.Name;
}
public XamlCodeCompletionItem(IEntity entity, string text)
public XamlCodeCompletionItem(string text, IEntity entity)
: base(entity)
{
this.Text = text;
}
public XamlCodeCompletionItem(IEntity entity, string prefix, string className, bool addOpeningBrace)
public XamlCodeCompletionItem(IEntity entity, string prefix, string className)
: base(entity)
{
if (string.IsNullOrEmpty(prefix))
this.Text = className + "." + entity.Name;
else
this.Text = prefix + ":" + className + "." + entity.Name;
if (addOpeningBrace)
this.Text = "<" + this.Text;
}
public override string ToString()
@ -70,6 +64,7 @@ namespace ICSharpCode.XamlBinding @@ -70,6 +64,7 @@ namespace ICSharpCode.XamlBinding
this.prefix = prefix;
this.@namespace = @namespace;
this.name = name;
this.Image = ClassBrowserIconService.Namespace;
}
public XamlCompletionItem(string @namespace, string name)
@ -78,6 +73,7 @@ namespace ICSharpCode.XamlBinding @@ -78,6 +73,7 @@ namespace ICSharpCode.XamlBinding
this.prefix = "";
this.@namespace = @namespace;
this.name = name;
this.Image = ClassBrowserIconService.Namespace;
}
public string Prefix {
@ -93,6 +89,24 @@ namespace ICSharpCode.XamlBinding @@ -93,6 +89,24 @@ namespace ICSharpCode.XamlBinding
}
}
class SpecialCompletionItem : DefaultCompletionItem
{
public SpecialCompletionItem(string name)
: base(name)
{
this.Image = ClassBrowserIconService.Namespace;
}
}
class SpecialValueCompletionItem : DefaultCompletionItem
{
public SpecialValueCompletionItem(string name)
: base(name)
{
this.Image = ClassBrowserIconService.Const;
}
}
class XmlnsCompletionItem : DefaultCompletionItem
{
string @namespace, assembly;
@ -107,6 +121,7 @@ namespace ICSharpCode.XamlBinding @@ -107,6 +121,7 @@ namespace ICSharpCode.XamlBinding
{
this.@namespace = @namespace;
this.assembly = assembly;
this.Image = ClassBrowserIconService.Namespace;
}
public XmlnsCompletionItem(string @namespace, bool isUrl)
@ -115,6 +130,7 @@ namespace ICSharpCode.XamlBinding @@ -115,6 +130,7 @@ namespace ICSharpCode.XamlBinding
this.@namespace = @namespace;
this.isUrl = isUrl;
this.assembly = string.Empty;
this.Image = ClassBrowserIconService.Namespace;
}
public string Namespace {
@ -162,6 +178,7 @@ namespace ICSharpCode.XamlBinding @@ -162,6 +178,7 @@ namespace ICSharpCode.XamlBinding
this.eventType = eventType;
this.targetName = targetName;
this.HandlerName = ParseNamePattern(this.TargetName, this.EventType.Name);
this.Image = ClassBrowserIconService.Event;
}
public override void Complete(CompletionContext context)

61
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItemList.cs

@ -52,43 +52,44 @@ namespace ICSharpCode.XamlBinding @@ -52,43 +52,44 @@ namespace ICSharpCode.XamlBinding
{
base.Complete(context, item);
XamlCompletionContext xamlContext = CompletionDataHelper.ResolveCompletionContext(context.Editor, context.CompletionChar);
if (xamlContext.Description == XamlContextDescription.None)
context.Editor.Document.Insert(context.StartOffset, "<");
if (item is XamlCodeCompletionItem) {
XamlCodeCompletionItem cItem = item as XamlCodeCompletionItem;
if (cItem.Entity is IProperty || cItem.Entity is IEvent) {
if (context.Editor.Document.GetCharAt(context.StartOffset - 1) != '.' &&
context.Editor.Document.GetCharAt(context.StartOffset - 1) != '<') {
if (!item.Text.EndsWith("=", StringComparison.OrdinalIgnoreCase)) {
context.Editor.Document.Insert(context.EndOffset, "=\"\"");
context.Editor.Caret.Offset--;
} else {
XamlCompletionContext xamlContext = CompletionDataHelper.ResolveCompletionContext(context.Editor, context.CompletionChar);
if (!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.EndsWith(",") && 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 (xamlContext.Description == XamlContextDescription.InTag) {
context.Editor.Document.Insert(context.EndOffset, "=\"\"");
context.Editor.Caret.Offset--;
} else if (xamlContext.Description == XamlContextDescription.InMarkupExtension) {
if (!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.EndsWith(",") && 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;
}
}
}
XamlCodeCompletionBinding.Instance.CtrlSpace(context.Editor);
}
XamlCodeCompletionBinding.Instance.CtrlSpace(context.Editor);
}
}
@ -116,6 +117,10 @@ namespace ICSharpCode.XamlBinding @@ -116,6 +117,10 @@ namespace ICSharpCode.XamlBinding
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;
}
}

Loading…
Cancel
Save