public override void Redo (TextBuffer buffer)
	{
		TextIter insertIter = buffer.GetIterAtOffset (index);
		buffer.InsertRange (ref insertIter, chop.Start, chop.End);
		buffer.MoveMark (buffer.SelectionBound, buffer.GetIterAtOffset (index));
		buffer.MoveMark (buffer.InsertMark, buffer.GetIterAtOffset (index + chop.Length));
	}
	public override void Undo (TextBuffer buffer)
	{
		#if DEBUG
		Console.WriteLine ("DEBUG: Chop Text: {0} Length: {1}", chop.Text, chop.Length);
		#endif
		
		TextIter startIter = buffer.GetIterAtOffset (index);
		TextIter endIter = buffer.GetIterAtOffset (index + chop.Length);
		buffer.Delete (ref startIter, ref endIter);
		buffer.MoveMark (buffer.InsertMark, buffer.GetIterAtOffset (index));
		buffer.MoveMark (buffer.SelectionBound, buffer.GetIterAtOffset (index));
	}
Beispiel #3
0
	public static int AddPaddingEmpty (TextBuffer buffer, int offset,  string suffix)
	{
		TextIter insertAt = buffer.GetIterAtOffset (offset);
		AddPaddingEmpty (buffer, ref insertAt, suffix);
		
		return insertAt.Offset;
	}
	public override void Redo (TextBuffer buffer)
	{
		TextIter startIter = buffer.GetIterAtOffset (start);
		TextIter endIter = buffer.GetIterAtOffset (end);
		
		buffer.Delete (ref startIter, ref endIter);
		
		buffer.MoveMark (buffer.InsertMark, buffer.GetIterAtOffset (start));
		buffer.MoveMark (buffer.SelectionBound, buffer.GetIterAtOffset (start));
	}
	public override void Undo (TextBuffer buffer)
	{
		TextIter startIter, endIter;
		
		#if DEBUG
		Console.WriteLine ("DEBUG: Whole Region {0}", whole_region);
		#endif
		
		startIter = buffer.GetIterAtOffset (start);
		buffer.InsertRange (ref startIter, chop.Start, chop.End);
		
		if (whole_region) {
			endIter = buffer.GetIterAtOffset (startIter.Offset + 56);
			buffer.Delete (ref startIter, ref endIter);
		}
		
		buffer.MoveMark (buffer.InsertMark, buffer.GetIterAtOffset (is_forward ? start : end));
		buffer.MoveMark (buffer.SelectionBound, buffer.GetIterAtOffset (is_forward ? end : start));
	}
        private void ApplyTextTags(Gtk.TextBuffer tb, string tagname)
        {
            int cN = tb.Text.Length - 1;

            Gtk.TextIter start = tb.GetIterAtOffset(0);
            Gtk.TextIter stop  = tb.GetIterAtOffset(cN);

            string[] delimiters    = new string[] { ":" };
            string[] tagname_parts = tagname.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
            string   key           = tagname_parts[0];
            string   value         = null;

            if (tagname_parts.Length > 1)
            {
                value = tagname_parts[1];
            }

            Gtk.TextTag tag_lookup = tb.TagTable.Lookup("DemoTextSelection");
            Gtk.TextTag tag_local  = null;
            // should be the same?!?!
            //tag_local = tag;		// class variable?? sometines null?
            tag_local = tag_lookup;


            Console.WriteLine("key [{0}] value[{1}] tagname [{2}]", key, value, tagname);
            switch (key)
            {
            case "font":
                tag_local.Font = value;
                break;

            case "fontsize":
                tag_local.Size = Convert.ToInt32(value);                         // events?!?!?
                break;

            case "fontweight":
                switch (value)
                {
                case "normal":
                    tag_local.Weight = Pango.Weight.Normal;
                    break;

                case "bold":
                    // tag_local.Weight = Pango.Weight.Bold; // no visible diff
                    tag_local.Weight = Pango.Weight.Ultrabold;
                    break;

                case "heavy":
                    tag_local.Weight = Pango.Weight.Heavy;
                    break;

                case "light":
                    tag_local.Weight = Pango.Weight.Light;
                    break;

                case "semibold":
                    tag_local.Weight = Pango.Weight.Semibold;
                    break;

                case "ultrabold":
                    tag_local.Weight = Pango.Weight.Ultrabold;
                    break;

                case "ultralight":
                    tag_local.Weight = Pango.Weight.Ultralight;
                    break;

                default:
                    tag_local.Weight = Pango.Weight.Normal;
                    break;
                }
                break;

            case "style":
                switch (value)
                {
                case "normal":
                    tag_local.Style = Pango.Style.Normal;
                    break;

                case "italic":
                    tag_local.Style = Pango.Style.Italic;
                    break;

                case "oblique":
                    tag_local.Style = Pango.Style.Oblique;
                    break;

                default:
                    tag_local.Style = Pango.Style.Normal;
                    break;
                }
                break;

            case "strikethrough":
                tag_local.Strikethrough = Convert.ToBoolean(value);
                break;

            case "doublestrikethrough":
                tag_local.Strikethrough = Convert.ToBoolean(value);
                break;

            case "superscript":
                if (Convert.ToBoolean(value))
                {
                    tag_local.Rise = 50;
                }
                else
                {
                    tag_local.Rise = 0;
                }
                break;

            case "subscript":
                if (Convert.ToBoolean(value))
                {
                    tag_local.Rise = -50;
                }
                else
                {
                    tag_local.Rise = 0;
                }
                break;

            case "smallcaps":
                if (Convert.ToBoolean(value))
                {
                    tag_local.Variant = Pango.Variant.SmallCaps;
                }
                else
                {
                    tag_local.Variant = Pango.Variant.Normal;
                }
                break;

            case "allcaps":
                // no all caps?
                // tamp replacement
                if (Convert.ToBoolean(value))
                {
                    tb.Text           = tb.Text.ToUpper();
                    tag_local.Variant = Pango.Variant.Normal;
                }
                else
                {
                    tb.Text           = this.demo_text;
                    tag_local.Variant = Pango.Variant.Normal;
                }
                break;

            case "hidden":
                if (Convert.ToBoolean(value))
                {
                    tag_local.Variant = Pango.Variant.Normal;
                }
                else
                {
                    tag_local.Rise = 0;
                }
                break;

            case "underlinestyle":
                switch (value)
                {
                case "none":
                    tag_local.Underline = Pango.Underline.None;
                    break;

                case "double":
                    tag_local.Underline = Pango.Underline.Double;
                    break;

                case "single":
                    tag_local.Underline = Pango.Underline.Single;
                    break;

                case "error":
                    tag_local.Underline = Pango.Underline.Error;
                    break;

                case "low":
                    tag_local.Underline = Pango.Underline.Low;
                    break;

                default:
                    tag_local.Underline = Pango.Underline.None;
                    break;
                }
                break;

            case "underlinecolor":
                // cannot change color of the underline!
                // tag_local.Underline
                // trying font until custom dialog is over
                string rgb = tagname_parts[2];                                          // obtained as "rgb:HHHH/HHHH/HHHH"

                //--------------------------------------------------------------------
                // Attempt 1
                tag_local.Foreground    = "";
                tag_local.ForegroundGdk = new Gdk.Color(60, 60, 60);
                //--------------------------------------------------------------------

                //--------------------------------------------------------------------
                // Attempt 2
                //textviewDemoText.ModifyFg(StateType.Normal, underline_color_selected);	// color not applied?!?!
                //textviewDemoText.ModifyBg(StateType.Normal, underline_color_selected);	// color not applied?!?!
                // return;		// to skip tb.ApplyTag later does not change color

                break;

            default:
                tag_local = tb.TagTable.Lookup(tagname);
                break;
            }

            tb.ApplyTag(tag_local, start, stop);

            return;
        }
Beispiel #7
0
	public static int AddText (TextBuffer buffer, int offset, string data, TextTag tag)
	{
		TextIter insertAt = buffer.GetIterAtOffset (offset);
		AddText (buffer, ref insertAt, data, tag);
		
		return insertAt.Offset;
	}
        // Execute first SQL statement at cursor
        public string GetSqlStatementAtCursor(TextBuffer sqlTextBuffer, out TextIter iter)
        {
            TextIter start_iter, end_iter, insert_iter;
            TextIter match_start1, match_end1, match_start2, match_end2;
            TextIter begin_iter, finish_iter;
            string text = String.Empty;
            int char_count = 0;
            TextMark insert_mark;

            insert_mark = sqlTextBuffer.InsertMark;
            insert_iter = sqlTextBuffer.GetIterAtMark (insert_mark);
            start_iter = sqlTextBuffer.GetIterAtOffset (0);

            char_count = sqlTextBuffer.CharCount;
            end_iter = sqlTextBuffer.GetIterAtOffset (char_count);
            iter = end_iter;

            match_start1 = sqlTextBuffer.GetIterAtOffset (0);
            match_end1 = sqlTextBuffer.GetIterAtOffset (char_count);
            match_start2 = sqlTextBuffer.GetIterAtOffset (0);
            match_end2 = sqlTextBuffer.GetIterAtOffset (char_count);

            begin_iter = sqlTextBuffer.GetIterAtOffset (0);
            finish_iter = sqlTextBuffer.GetIterAtOffset (char_count);

            if (start_iter.IsEnd == false)
            {
                if (insert_iter.BackwardSearch (";", TextSearchFlags.TextOnly,
                        out match_start1, out match_end1, start_iter) == true) {
                    begin_iter = match_start1;
                    begin_iter.ForwardChars (1);
                }

                if (insert_iter.ForwardSearch (";",	TextSearchFlags.TextOnly,
                        out match_start2, out match_end2, end_iter) == true) {
                    finish_iter = match_end2;
                    finish_iter.BackwardChars (1);
                }
                iter = finish_iter;
                text = sqlTextBuffer.GetText (begin_iter, finish_iter, false);

                // FIXME: for this to work.  GetSqlStatement has to rewritten to be line-based
                if (text.Length > 0) {
                    // search does not work if what you are searching for is
                    // at the end of the buffer,
                    // this compensates for this
                    int j = text.Length;
                    int cont = 1;
                    for(int i = text.Length - 1; cont == 1 && i >= 0; i--) {
                        char ch = text[i];
                        switch(ch) {
                        case ' ':
                        case ';':
                            j--;
                            break;
                        default:
                            cont = 0;
                            break;
                        }
                    }

                    if (j != text.Length) {
                        string t = text.Substring(0, j);
                        text = t;
                    }
                }
            }

            return text;
        }
	private static int DeserializeAttributes (TextBuffer buffer, int offset, XmlTextReader xmlReader, string tagSuffix)
	{
		string elementName, tagName;
		elementName = tagName = xmlReader.Name;
		DocumentTagTable tagTable = (DocumentTagTable) buffer.TagTable;
		TextIter insertAt, applyStart, applyEnd;
		insertAt = buffer.GetIterAtOffset (offset);
		TextTag tagAttributes;
		
		// Lookup Attributes tag in table, if it is not present we create one.
		tagName += ":Attributes" + tagSuffix;
		tagAttributes = tagTable.Lookup (tagName);
		if (tagAttributes == null)
			tagAttributes = tagTable.CreateDynamicTag (tagName);
		
		switch (elementName) {
		case "Type":
			DeserializeAttributesType (buffer, ref insertAt, xmlReader, tagSuffix);
			break;
		case "TypeSignature":
			DeserializeAttributesTypeSignature (buffer, ref insertAt, xmlReader, tagSuffix);
			break;
		case "Member":
			DeserializeAttributesMember (buffer, ref insertAt, xmlReader, tagSuffix);
			break;
		case "MemberSignature":
			DeserializeAttributesMemberSignature (buffer, ref insertAt, xmlReader, tagSuffix);
			break;
		default:
			DeserializeAttributesNone (buffer, ref insertAt, xmlReader, tagSuffix);
			break;
		}
		
		applyStart = buffer.GetIterAtOffset (offset);
		applyEnd = buffer.GetIterAtOffset (insertAt.Offset);
		buffer.ApplyTag (tagAttributes, applyStart, applyEnd);
		
		#if DEBUG
		Console.WriteLine ("Attributes: {0} Start: {1} End: {2}", tagName, offset, insertAt.Offset);
		#endif
		
		return insertAt.Offset;
	}
	private static int FormatEnd (TextBuffer buffer, int offset, string suffix, string elementName)
	{
		TextIter insertAt = buffer.GetIterAtOffset (offset);
		switch (elementName) {
		case "para":
		case "Docs":
		case "Base":
		case "BaseTypeName":
		case "Attribute":
		case "AttributeName":
		case "Members":
		case "Member":
		case "Type":
		case "link":
			break;
		case "see":
		case "since":
		case "paramref":
		case "Parameters":
		case "MemberSignature":
			break;
		case "summary":
		case "ThreadSafetyStatement":
		case "ThreadingSafetyStatement":
			DocumentUtils.AddString (buffer, ref insertAt, "\n\n",  suffix);
			break;
		default:
			DocumentUtils.AddString (buffer, ref insertAt, "\n", suffix);
			break;
		}
		
		return insertAt.Offset;
	}
	private static int FormatStart (TextBuffer buffer, int offset, string suffix, string elementName)
	{
		TextIter insertAt = buffer.GetIterAtOffset (offset);
		switch (elementName) {
		case "AssemblyName":
			DocumentUtils.AddString (buffer, ref insertAt, "Assembly Name: ", suffix);
			break;
		case "AssemblyPublicKey":
			DocumentUtils.AddString (buffer, ref insertAt, "Assembly PublicKey: ", suffix);
			break;
		case "AssemblyVersion":
			DocumentUtils.AddString (buffer, ref insertAt, "Assembly Version: ", suffix);
			break;
		case "MemberOfLibrary":
			DocumentUtils.AddString (buffer, ref insertAt, "From Library: ", suffix);
			break;
		case "ThreadSafetyStatement":
			DocumentUtils.AddString (buffer, ref insertAt, "Threading Safety: ", suffix);
			break;
		case "ThreadingSafetyStatement":
			DocumentUtils.AddString (buffer, ref insertAt, "Threading Safety: ", suffix);
			break;
		case "summary":
			DocumentUtils.AddString (buffer, ref insertAt, "Summary:\n", suffix);
			break;
		case "remarks":
			DocumentUtils.AddString (buffer, ref insertAt, "Remarks:\n", suffix);
			break;
		case "Members":
			DocumentUtils.AddString (buffer, ref insertAt, "Members:\n\n", suffix);
			break;
		case "MemberType":
			DocumentUtils.AddString (buffer, ref insertAt, "Member Type: ", suffix);
			break;
		case "ReturnType":
			DocumentUtils.AddString (buffer, ref insertAt, "Member Return Type: ", suffix);
			break;
		case "since":
			DocumentUtils.AddString (buffer, ref insertAt, "Since version: ", suffix);
			break;
		default:
			break;
		}
		
		return insertAt.Offset;
	}
	private static int InsertEndElement (TextBuffer buffer, int offset, Stack stack, ref int depth)
	{
		TextIter insertAt, applyStart, applyEnd;
		TagStart tagStart = (TagStart) stack.Pop ();
		string suffix =  '#' + depth.ToString ();
		
		#if DEBUG
		Console.WriteLine ("Element: {0}, End: {1}", tagStart.Tag.Name, offset);
		#endif
		
		if (((DocumentTag) tagStart.Tag).IsEditable) {
			if (tagStart.Start + 1 == offset)
				offset = DocumentUtils.AddStub (buffer, offset, "To be added test", suffix);
			
			insertAt = buffer.GetIterAtOffset (offset);
			buffer.Insert (ref insertAt, "]");
			offset += 1;
		} else if (tagStart.Start == offset)
			offset = DocumentUtils.AddPaddingEmpty (buffer, offset, suffix);
		
		applyStart = buffer.GetIterAtOffset (tagStart.Start);
		applyEnd = buffer.GetIterAtOffset (offset);
		buffer.ApplyTag (tagStart.Tag, applyStart, applyEnd);
		offset = FormatEnd (buffer, offset, suffix, tagStart.Name);
		depth--;
		
		#if DEBUG
		Console.WriteLine ("Applied: {0}, Start: {1}, End: {2}", tagStart.Tag.Name, tagStart.Start, offset);
		#endif
		
		// Padding between tag regions
		suffix = "#" + depth;
		offset = DocumentUtils.AddPadding (buffer, offset, suffix);
		
		return offset;
	}
	private static int InsertText (TextBuffer buffer, int offset, string data, Stack stack)
	{
		TagStart tagStart = (TagStart) stack.Peek ();
		TextIter insertAt = buffer.GetIterAtOffset (offset);
		TextTag textTag = DocumentUtils.GetAssociatedTextTag (buffer, tagStart.Tag);
		DocumentUtils.AddText (buffer, ref insertAt, data, textTag);
//		buffer.InsertWithTags (ref insertAt, data, textTag);
		
		#if DEBUG
		Console.WriteLine ("Text: {0} Value: {1} Start: {2}", textTag.Name, data, offset);
		#endif
		
		return insertAt.Offset;
	}
	private static int InsertStartElement (TextBuffer buffer, int offset, XmlTextReader xmlReader, Stack stack, ref int depth, ref int count)
	{
		string elementName = xmlReader.Name;
		string suffix = String.Empty;
		DocumentTagTable tagTable = (DocumentTagTable) buffer.TagTable;
		bool emptyElement = xmlReader.IsEmptyElement;
		bool isDynamic = DocumentTagTable.IsDynamic (elementName);
		TextIter insertAt, applyStart, applyEnd;
		depth++;
		
		// We define a suffix so each dynamic tag has an unique name.
		// Suffix has format: #{depth level}
		if (isDynamic)
			suffix = "#" + depth;
		
		// We add any needed string to give format to the document.
		offset = FormatStart (buffer, offset, suffix, elementName);
		
		TagStart tagStart = new TagStart ();
		tagStart.Start = offset;
		tagStart.Name = elementName;
		
		// We first lookup the tag name, if the element is dynamic, we can
		// have three scenarios.
		// 1) The tag is not in the table: So we create it in the spot.
		// 2) Tag is in table but it priority is wrong: We created a new
		// dynamic tag with an extra suffix. Format #{depth level}.{count}
		// 3) Tag is in table with right priority: We reuse it and we don't
		// create a new dymamic tag.
		tagStart.Tag = tagTable.Lookup (elementName + suffix);
		if (isDynamic && tagStart.Tag == null)
			tagStart.Tag = tagTable.CreateDynamicTag (elementName + suffix);
		else if (isDynamic && tagStart.Tag != null &&  tagStart.Tag.Priority < ((TagStart) stack.Peek ()).Tag.Priority) {
			suffix += "." + count;
			tagStart.Tag = tagTable.CreateDynamicTag (elementName + suffix);
			count++;
		}
		
		#if DEBUG
		try {
			Console.WriteLine ("Element: {0} Start: {1}", tagStart.Tag.Name, tagStart.Start);
		} catch (NullReferenceException) {
			Console.WriteLine ("Error: Missing {0} element", xmlReader.Name);
			Environment.Exit (1);
		}
		#endif
		
		// If element has attributes we have to get them and deserialize them.
		if (xmlReader.HasAttributes)
			offset = DeserializeAttributes (buffer, offset, xmlReader, suffix);
		
		// Special case when an elment is empty.
		// Case A: If element is editable a string stub is inserted to allow edition.
		// Case B: If element is not editable then a padding is inserted to handle
		// TextTag behaviour in which zero length ranges are lost.
		if (emptyElement) {
			if (((DocumentTag) tagStart.Tag).IsEditable) {
				insertAt = buffer.GetIterAtOffset (offset);
				buffer.Insert (ref insertAt, "[");
				offset += 1;
				
				offset = DocumentUtils.AddStub (buffer, offset, "Click to Add Documentation", suffix);
				
				insertAt = buffer.GetIterAtOffset (offset);
				buffer.Insert (ref insertAt, "]");
				offset += 1;
			} else
				offset = DocumentUtils.AddPaddingEmpty (buffer, offset, suffix);
			
			applyStart = buffer.GetIterAtOffset (tagStart.Start);
			applyEnd = buffer.GetIterAtOffset (offset);
			buffer.ApplyTag (tagStart.Tag, applyStart, applyEnd);
			offset = FormatEnd (buffer, offset, suffix, elementName);
			
			// Padding between tag regions
			offset = DocumentUtils.AddPadding (buffer, offset, suffix);
			depth--;
			
			#if DEBUG
			Console.WriteLine ("Empty Element: {0}, Start: {1}, End: {2}", tagStart.Tag.Name, tagStart.Start, offset);
			#endif
		} else {
			stack.Push (tagStart);
			
			if (((DocumentTag) tagStart.Tag).IsEditable) {
				insertAt = buffer.GetIterAtOffset (offset);
				buffer.Insert (ref insertAt, "[");
				offset += 1;
			}
		}
		
		return offset;
	}
Beispiel #15
0
	public static int AddString (TextBuffer buffer, int offset, string data, string suffix)
	{
		TextIter insertAt = buffer.GetIterAtOffset (offset);
		AddString (buffer, ref insertAt, data, suffix);
		
		return insertAt.Offset;
	}
		static void CopyBufferToClipboard (TextBuffer buf)
		{
			//get current cursor state
			TextIter s, e;
			TextIter cursorIter = TextIter.Zero;
			var hadSel = buf.GetSelectionBounds (out s, out e);
			if (!hadSel) {
				cursorIter = buf.GetIterAtOffset (buf.CursorPosition);
			}

			//copy text to clipboard, let the buffer handle the details
			buf.SelectRange (buf.StartIter, buf.EndIter);
			Clipboard clipboard = Clipboard.Get (Mono.TextEditor.ClipboardActions.CopyOperation.CLIPBOARD_ATOM);
			buf.CopyClipboard (clipboard);

			//restore cursor state
			if (hadSel) {
				buf.SelectRange (s, e);
			} else {
				buf.PlaceCursor (cursorIter);
			}
		}
        // get next SQL statement.  Requires GetSqlStatementAtCursor having been called first
        public string GetNextSqlStatement(TextBuffer sqlTextBuffer, ref TextIter iter)
        {
            TextIter start_iter, end_iter;
            TextIter match_start2, match_end2;
            TextIter finish_iter;
            string text = String.Empty;
            int char_count = 0;

            char_count = sqlTextBuffer.CharCount;
            end_iter = sqlTextBuffer.GetIterAtOffset (char_count);
            if (iter.IsEnd == false) {
                iter.ForwardChars (1);
                if (sqlTextBuffer.GetText (iter, end_iter, false).Equals (";"))
                    iter.ForwardChars (1);
            }

            if (iter.IsEnd == true)
                return "";

            start_iter = iter;
            match_start2 = iter;
            match_end2 = sqlTextBuffer.GetIterAtOffset (char_count);
            finish_iter = sqlTextBuffer.GetIterAtOffset (char_count);

            if (start_iter.IsEnd == false) {
                if (iter.ForwardSearch (";", TextSearchFlags.TextOnly,
                        out match_start2, out match_end2, end_iter) == true) 	{
                    finish_iter = match_end2;
                    finish_iter.BackwardChars (1);
                }

                text = sqlTextBuffer.GetText (iter, finish_iter, false);
                iter = finish_iter;

                if(text.Length > 0) {
                    // search does not work if what you are searching for is
                    // at the end of the buffer,
                    // this compensates for this
                    int j = text.Length;
                    int cont = 1;
                    for(int i = text.Length - 1; cont == 1 && i >= 0; i--) {
                        char ch = text[i];
                        switch(ch) {
                        case ' ':
                        case ';':
                            j--;
                            break;
                        default:
                            cont = 0;
                            break;
                        }
                    }

                    if(j != text.Length) {
                        string t = text.Substring(0, j);
                        text = t;
                    }
                }
            }

            return text;
        }