public string BuildNameFromLabel(string label) { StringBuilder sb = new StringBuilder(); foreach (var nameChar in label.ToCharArray()) { if (nameChar == ' ' || XmlConvert.IsNCNameChar(nameChar)) { sb.Append(nameChar); } } return(sb.ToString()); }
private static string FormatTableOrColumnName(string column) { var columnArray = column.ToArray().Select(col => XmlConvert.IsNCNameChar(col) ? col : '_'); var formattedColumn = String.Join(string.Empty, columnArray); if (!IsValidNCName(formattedColumn)) { formattedColumn = "_" + formattedColumn; } Debug.Assert(IsValidNCName(formattedColumn)); return(formattedColumn); }
public override bool KeyPress(KeyDescriptor descriptor) { var buffer = Editor; var keyChar = descriptor.KeyChar; var key = descriptor.SpecialKey; var modifier = descriptor.ModifierKeys; if (CompletionWindowManager.IsVisible) { // do some things to minimize keystrokes with code completion if (keyChar == '=') { // we're in an attribute completion, so automatically add the quote and show completions (if available) var ret = base.KeyPress(descriptor); if (!ret) { base.KeyPress(KeyDescriptor.FromGtk((Gdk.Key) 0, '"', Gdk.ModifierType.None)); buffer.InsertText(buffer.CaretOffset, "\""); buffer.CaretOffset--; } return(ret); } if (key == SpecialKey.Return && modifier == ModifierKeys.None && isParameterValueCompletion) { // finish completion base.KeyPress(descriptor); // if double quote already exists, skip it! if (buffer.GetCharAt(buffer.CaretOffset) == '"') { buffer.CaretOffset++; return(false); } // no double quote yet, so add it return(base.KeyPress(KeyDescriptor.FromGtk((Gdk.Key) 0, '"', Gdk.ModifierType.None))); } if (keyChar == '"' || keyChar == '\'') { // finish completion with double quote base.KeyPress(KeyDescriptor.FromGtk(Gdk.Key.Return, '\0', Gdk.ModifierType.None)); // if double quote already exists, skip it! if (buffer.GetCharAt(buffer.CaretOffset) == keyChar) { buffer.CaretOffset++; return(false); } return(base.KeyPress(descriptor)); } } if (keyChar == '>') { // finish completion first if (CompletionWindowManager.IsVisible) { base.KeyPress(KeyDescriptor.FromGtk(Gdk.Key.Return, '\0', Gdk.ModifierType.None)); } // add self-closing tag if there is no content for the control if (!HasContentAtCurrentElement()) { base.KeyPress(KeyDescriptor.FromGtk((Gdk.Key) 0, '/', Gdk.ModifierType.None)); //buffer.InsertText(buffer.CursorPosition++, "/"); return(base.KeyPress(descriptor)); } } if (keyChar == '"' || keyChar == '\'') { // if double quote already exists, skip it! if (buffer.GetCharAt(buffer.CaretOffset) == keyChar) { buffer.CaretOffset++; return(false); } } if (keyChar == '.' || ((key == SpecialKey.Return || key == SpecialKey.Tab) && CompletionWindowManager.IsVisible)) { // provide completions for <Control.Property> elements var isNewCompletion = keyChar == '.' && !CompletionWindowManager.IsVisible; var completionContext = CurrentCompletionContext; var result = base.KeyPress(descriptor); if (isNewCompletion) { completionContext = CurrentCompletionContext; } var offset = completionContext.TriggerOffset - 1; // using reflection here as these have been made internal as of XS 6.0. Why? who knows. Alternative? reflection of course. var completionWidget = GetType().GetProperty("CompletionWidget", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(this); var getCharMethod = completionWidget?.GetType()?.GetMethod("GetChar", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); if (getCharMethod != null) { Func <int, char> getChar = (arg) => { return((char)getCharMethod.Invoke(completionWidget, new object[] { arg })); }; var ch = getChar(offset); while (ch != '\0' && (XmlConvert.IsNCNameChar(ch) || ch == ':') && offset > 0) { offset--; ch = getChar(offset); } if (ch != '\0' && ch != '<') { return(result); } } offset++; var end = isNewCompletion ? completionContext.TriggerOffset - 1 : buffer.CaretOffset; var name = Editor.GetTextAt(offset, end - offset); if (!isNewCompletion && !name.EndsWith(".", StringComparison.Ordinal)) { return(result); } try { XmlConvert.VerifyName(name); } catch (XmlException) { // not a valid xml name, so just return return(result); } var xobject = Tracker.Engine.Nodes.Peek(1) as IAttributedXObject; if (xobject == null) { string prefix = null; var nsidx = name.IndexOf(':'); if (nsidx > 0) { prefix = name.Substring(0, nsidx); name = name.Substring(nsidx + 1); } name = name.TrimEnd('.'); xobject = new XElement(Tracker.Engine.Location, new XName(prefix, name)); } var attributeDictionary = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); if (xobject.Attributes != null) { foreach (XAttribute current in xobject.Attributes) { attributeDictionary[current.Name.FullName] = current.Value ?? string.Empty; } } var task = GetAttributeCompletions(xobject, attributeDictionary, CancellationToken.None, XmlCompletionData.DataType.XmlElement, true); task.ContinueWith(t => { // need to show completion within the main task scheduler, otherwise it doesn't show var completions = t.Result; if (completions != null) { ShowCompletion(completions, 0, '.'); } }, Runtime.MainTaskScheduler); return(false); } return(base.KeyPress(descriptor)); }
public override bool KeyPress(Gdk.Key key, char keyChar, Gdk.ModifierType modifier) { var buffer = EditableBuffer; if (CompletionWindowManager.IsVisible) { // do some things to minimize keystrokes with code completion if (keyChar == '=') { // we're in an attribute completion, so automatically add the quote and show completions (if available) var ret = base.KeyPress(key, keyChar, modifier); if (!ret) { base.KeyPress((Gdk.Key) 0, '"', Gdk.ModifierType.None); buffer.InsertText(buffer.CursorPosition, "\""); buffer.CursorPosition--; } return(ret); } if (key == Gdk.Key.Return && modifier == Gdk.ModifierType.None && isParameterValueCompletion) { // finish completion base.KeyPress(key, keyChar, modifier); // if double quote already exists, skip it! if (buffer.GetCharAt(buffer.CursorPosition) == '"') { buffer.CursorPosition++; return(false); } // no double quote yet, so add it return(base.KeyPress((Gdk.Key) 0, '"', Gdk.ModifierType.None)); } if (keyChar == '"' || keyChar == '\'') { // finish completion with double quote base.KeyPress(Gdk.Key.Return, '\0', Gdk.ModifierType.None); // if double quote already exists, skip it! if (buffer.GetCharAt(buffer.CursorPosition) == keyChar) { buffer.CursorPosition++; return(false); } return(base.KeyPress(key, keyChar, modifier)); } } if (keyChar == '>') { // finish completion first if (CompletionWindowManager.IsVisible) { base.KeyPress(Gdk.Key.Return, '\0', Gdk.ModifierType.None); } // add self-closing tag if there is no content for the control if (!HasContentAtCurrentElement()) { base.KeyPress((Gdk.Key) 0, '/', Gdk.ModifierType.None); //buffer.InsertText(buffer.CursorPosition++, "/"); return(base.KeyPress(key, keyChar, modifier)); } } if (keyChar == '"' || keyChar == '\'') { // if double quote already exists, skip it! if (buffer.GetCharAt(buffer.CursorPosition) == keyChar) { buffer.CursorPosition++; return(false); } } if (keyChar == '.') { var result = base.KeyPress(key, keyChar, modifier); // provide completions for <Control.Property> elements var completionContext = CompletionWidget.CurrentCodeCompletionContext; var offset = completionContext.TriggerOffset - 1; var ch = CompletionWidget.GetChar(offset); while (ch != '\0' && (XmlConvert.IsNCNameChar(ch) || ch == ':') && offset > 0) { offset--; ch = CompletionWidget.GetChar(offset); } if (ch != '\0' && ch != '<') { return(result); } offset++; var len = completionContext.TriggerOffset - offset; var name = Editor.GetTextAt(offset, len); try { XmlConvert.VerifyName(name); } catch (XmlException) { // not a valid xml name return(result); } var xobject = Tracker.Engine.Nodes.Peek(1) as IAttributedXObject; if (xobject == null) { string prefix = null; var nsidx = name.IndexOf(':'); if (nsidx > 0) { prefix = name.Substring(0, nsidx); name = name.Substring(nsidx + 1); } name = name.TrimEnd('.'); xobject = new XElement(Tracker.Engine.Location, new XName(prefix, name)); } var attributeDictionary = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); if (xobject.Attributes != null) { foreach (XAttribute current in xobject.Attributes) { attributeDictionary[current.Name.FullName] = current.Value ?? string.Empty; } } var completions = GetAttributeCompletions(xobject, attributeDictionary, XmlCompletionData.DataType.XmlElement, true); if (completions != null) { ShowCompletion(completions); return(false); } } return(base.KeyPress(key, keyChar, modifier)); }
private static bool IsNameChar(char c) { return(XmlConvert.IsNCNameChar(c)); }