Example #1
0
    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());
    }
Example #2
0
        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);
        }
Example #3
0
        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));
        }
Example #4
0
        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));
        }
Example #5
0
 private static bool IsNameChar(char c)
 {
     return(XmlConvert.IsNCNameChar(c));
 }