示例#1
0
		public override void Undo (Gtk.TextBuffer buffer)
		{
			// Tag images change the offset by one, but only when deleting.
			Gtk.TextIter start_iter = buffer.GetIterAtOffset (Offset);
			Gtk.TextIter end_iter = buffer.GetIterAtOffset (Offset + chop.Length + 1);
			buffer.Delete (ref start_iter, ref end_iter);
			buffer.MoveMark (buffer.InsertMark, buffer.GetIterAtOffset (Offset));
			buffer.MoveMark (buffer.SelectionBound, buffer.GetIterAtOffset (Offset));

			Tag.WidgetLocation = null;

			ApplySplitTags (buffer);
		}
示例#2
0
		public override void Redo (Gtk.TextBuffer buffer)
		{
			RemoveSplitTags (buffer);

			Gtk.TextIter cursor = buffer.GetIterAtOffset (Offset);

			Gtk.TextTag[] tags = {Tag};
			buffer.InsertWithTags (ref cursor, Id, tags);

			buffer.MoveMark (buffer.SelectionBound, buffer.GetIterAtOffset (Offset));
			buffer.MoveMark (buffer.InsertMark,
			                 buffer.GetIterAtOffset (Offset + chop.Length));

		}
 public void Redo(Gtk.TextBuffer buffer)
 {
     Debug.Assert (imagePosition != -1);
     var iter = buffer.GetIterAtOffset (imagePosition);
     addin.InsertImage (iter, imageInfo, false);
     buffer.MoveMark (buffer.InsertMark, iter);
     buffer.MoveMark (buffer.SelectionBound, iter);
     imagePosition = -1;
 }
 public void Undo(Gtk.TextBuffer buffer)
 {
     if (innerAction != null)
         innerAction.Undo (buffer);
     foreach (var pair in deletedImages) {
         var iter = buffer.GetIterAtOffset (pair.Key);
         addin.InsertImage (iter, pair.Value, false);
     }
 }
        public void Undo(Gtk.TextBuffer buffer)
        {
            imagePosition = imageInfo.Position;
            imageInfoList.Remove (imageInfo);
            imageInfo.DisplayWidth = imageInfo.Widget.ImageSize.Width;
            imageInfo.DisplayHeight = imageInfo.Widget.ImageSize.Height;

            TextIter imageBoxBegin = buffer.GetIterAtOffset (imagePosition);
            TextIter imageBoxEnd = imageBoxBegin;
            imageBoxEnd.ForwardChar ();
            buffer.Delete (ref imageBoxBegin, ref imageBoxEnd);
            buffer.MoveMark (buffer.InsertMark, imageBoxBegin);
            buffer.MoveMark (buffer.SelectionBound, imageBoxBegin);
        }
示例#6
0
		public static void Deserialize (Gtk.TextBuffer buffer,
		                                Gtk.TextIter   start,
		                                XmlTextReader  xml)
		{
			int offset = start.Offset;
			Stack<TagStart> stack = new Stack<TagStart> ();
			TagStart tag_start;

			NoteTagTable note_table = buffer.TagTable as NoteTagTable;

			int curr_depth = -1;

			// A stack of boolean values which mark if a
			// list-item contains content other than another list
			Stack<bool> list_stack = new Stack<bool> ();

			while (xml.Read ()) {
				switch (xml.NodeType) {
				case XmlNodeType.Element:
					if (xml.Name == "note-content")
						break;

					tag_start = new TagStart ();
					tag_start.Start = offset;

					if (note_table != null &&
					                note_table.IsDynamicTagRegistered (xml.Name)) {
						tag_start.Tag =
						        note_table.CreateDynamicTag (xml.Name);
					} else if (xml.Name == "list") {
						curr_depth++;
						break;
					} else if (xml.Name == "list-item") {
						if (curr_depth >= 0) {
							if (xml.GetAttribute ("dir") == "rtl") {
								tag_start.Tag =
								        note_table.GetDepthTag (curr_depth, Pango.Direction.Rtl);
							} else {
								tag_start.Tag =
								        note_table.GetDepthTag (curr_depth, Pango.Direction.Ltr);
							}
							list_stack.Push (false);
						} else {
							Logger.Error("</list> tag mismatch");
						}
					} else {
						tag_start.Tag = buffer.TagTable.Lookup (xml.Name);
					}

					if (tag_start.Tag is NoteTag) {
						((NoteTag) tag_start.Tag).Read (xml, true);
					}

					stack.Push (tag_start);
					break;
				case XmlNodeType.Text:
				case XmlNodeType.Whitespace:
				case XmlNodeType.SignificantWhitespace:
					Gtk.TextIter insert_at = buffer.GetIterAtOffset (offset);
					buffer.Insert (ref insert_at, xml.Value);

					offset += xml.Value.Length;

					// If we are inside a <list-item> mark off
					// that we have encountered some content
					if (list_stack.Count > 0) {
						list_stack.Pop ();
						list_stack.Push (true);
					}

					break;
				case XmlNodeType.EndElement:
					if (xml.Name == "note-content")
						break;

					if (xml.Name == "list") {
						curr_depth--;
						break;
					}

					tag_start = stack.Pop ();
					if (tag_start.Tag == null)
						break;

					Gtk.TextIter apply_start, apply_end;
					apply_start = buffer.GetIterAtOffset (tag_start.Start);
					apply_end = buffer.GetIterAtOffset (offset);

					if (tag_start.Tag is NoteTag) {
						((NoteTag) tag_start.Tag).Read (xml, false);
					}

					// Insert a bullet if we have reached a closing
					// <list-item> tag, but only if the <list-item>
					// had content.
					DepthNoteTag depth_tag = tag_start.Tag as DepthNoteTag;

					if (depth_tag != null && list_stack.Pop ()) {
						((NoteBuffer) buffer).InsertBullet (ref apply_start,
						                                    depth_tag.Depth,
						                                    depth_tag.Direction);
						buffer.RemoveAllTags (apply_start, apply_start);
						offset += 2;
					} else if (depth_tag == null) {
						buffer.ApplyTag (tag_start.Tag, apply_start, apply_end);
					}

					break;
				default:
					Logger.Warn ("Unhandled element {0}. Value: '{1}'",
					            xml.NodeType,
					            xml.Value);
					break;
				}
			}
		}
        public static void Deserialize (Gtk.TextBuffer buffer, Gtk.TextIter start, string content)
        {
            StringReader reader = new StringReader(content);
            int intCharacter;
            char convertedCharacter;
            int offset = start.Offset;
            string sbuffer = String.Empty;
            Stack<TagStart> stack = new Stack<TagStart> ();
            TagStart tag_start;

            while (true) {
                intCharacter = reader.Read ();

                if (intCharacter == -1) break;

                convertedCharacter = Convert.ToChar (intCharacter);

                if (sbuffer != String.Empty || convertedCharacter == '<') {
                    sbuffer += convertedCharacter;
                    if (sbuffer == "<bold>") {
                        tag_start = new TagStart ();
                        tag_start.Start = offset;
                        tag_start.Tag = buffer.TagTable.Lookup ("bold");
                        stack.Push (tag_start);
                        sbuffer = String.Empty;
                    } else if (sbuffer == "<italic>") {
                        tag_start = new TagStart ();
                        tag_start.Start = offset;
                        tag_start.Tag = buffer.TagTable.Lookup ("italic");
                        stack.Push (tag_start);
                        sbuffer = String.Empty;
                    } else if (sbuffer == "</bold>" || sbuffer == "</italic>") {
                        if (stack.Count > 0) {
                            tag_start = stack.Pop ();
                            Gtk.TextIter apply_start, apply_end;
                            apply_start = buffer.GetIterAtOffset (tag_start.Start);
                            apply_end = buffer.GetIterAtOffset (offset);
                            buffer.ApplyTag (tag_start.Tag, apply_start, apply_end);
                            sbuffer = String.Empty;
                        }
                    } else if (sbuffer.Length > 9) {
                        Gtk.TextIter insert_at = buffer.GetIterAtOffset(offset);
                        buffer.Insert (ref insert_at, sbuffer);
                        offset += sbuffer.Length;
                        sbuffer = String.Empty;
                    }
                } else {
                    Gtk.TextIter insert_at = buffer.GetIterAtOffset(offset);
                    buffer.Insert (ref insert_at, convertedCharacter.ToString ());
                    offset += 1;
                }
            }
        }
示例#8
0
		public void Undo (Gtk.TextBuffer buffer)
		{
			Gtk.TextIter iter = buffer.GetIterAtOffset (offset);
			iter.ForwardLine ();
			iter = buffer.GetIterAtLine (iter.Line);

			((NoteBuffer) buffer).RemoveBullet (ref iter);

			iter.ForwardToLineEnd ();

			buffer.MoveMark (buffer.InsertMark, iter);
			buffer.MoveMark (buffer.SelectionBound, iter);
		}
示例#9
0
		public void Redo (Gtk.TextBuffer buffer)
		{
			Gtk.TextIter iter = buffer.GetIterAtOffset (offset);

			buffer.Insert (ref iter, "\n");

			((NoteBuffer) buffer).InsertBullet (ref iter, depth, direction);

			buffer.MoveMark (buffer.InsertMark, iter);
			buffer.MoveMark (buffer.SelectionBound, iter);
		}
示例#10
0
		public override void Redo (Gtk.TextBuffer buffer)
		{
			RemoveSplitTags (buffer);

			Gtk.TextIter start_iter = buffer.GetIterAtOffset (start);
			Gtk.TextIter end_iter = buffer.GetIterAtOffset (end);
			buffer.Delete (ref start_iter, ref end_iter);
			buffer.MoveMark (buffer.InsertMark, buffer.GetIterAtOffset (start));
			buffer.MoveMark (buffer.SelectionBound, buffer.GetIterAtOffset (start));
		}
示例#11
0
		public void Redo (Gtk.TextBuffer buffer)
		{
			Gtk.TextIter start_iter, end_iter;
			start_iter = buffer.GetIterAtOffset (start);
			end_iter = buffer.GetIterAtOffset (end);

			buffer.MoveMark (buffer.SelectionBound, start_iter);
			buffer.RemoveTag (tag, start_iter, end_iter);
			buffer.MoveMark (buffer.InsertMark, end_iter);
		}
示例#12
0
		public override void Undo (Gtk.TextBuffer buffer)
		{
			int tag_images = GetSplitOffset ();

			Gtk.TextIter start_iter = buffer.GetIterAtOffset (start - tag_images);
			buffer.InsertRange (ref start_iter, chop.Start, chop.End);

			buffer.MoveMark (buffer.InsertMark,
			                 buffer.GetIterAtOffset (is_forward ? start - tag_images
			                                         : end - tag_images));
			buffer.MoveMark (buffer.SelectionBound,
			                 buffer.GetIterAtOffset (is_forward ? end - tag_images
			                                         : start - tag_images));

			ApplySplitTags (buffer);
		}
示例#13
0
		public override void Redo (Gtk.TextBuffer buffer)
		{
			RemoveSplitTags (buffer);

			Gtk.TextIter idx_iter = buffer.GetIterAtOffset (index);
			buffer.InsertRange (ref idx_iter, chop.Start, chop.End);

			buffer.MoveMark (buffer.SelectionBound, buffer.GetIterAtOffset (index));
			buffer.MoveMark (buffer.InsertMark,
			                 buffer.GetIterAtOffset (index + chop.Length));
		}
示例#14
0
		public override void Undo (Gtk.TextBuffer buffer)
		{
			int tag_images = GetSplitOffset ();

			Gtk.TextIter start_iter = buffer.GetIterAtOffset (index - tag_images);
			Gtk.TextIter end_iter = buffer.GetIterAtOffset (index - tag_images + chop.Length);
			buffer.Delete (ref start_iter, ref end_iter);
			buffer.MoveMark (buffer.InsertMark, buffer.GetIterAtOffset (index - tag_images));
			buffer.MoveMark (buffer.SelectionBound, buffer.GetIterAtOffset (index - tag_images));

			ApplySplitTags (buffer);
		}
示例#15
0
		protected void RemoveSplitTags (Gtk.TextBuffer buffer)
		{
			foreach (TagData tag in splitTags) {
				Gtk.TextIter start = buffer.GetIterAtOffset (tag.start);
				Gtk.TextIter end = buffer.GetIterAtOffset (tag.end);
				buffer.RemoveTag(tag.tag, start, end);
			}
		}
示例#16
0
		protected void ApplySplitTags (Gtk.TextBuffer buffer)
		{
			foreach (TagData tag in splitTags) {
				int offset = GetSplitOffset ();

				Gtk.TextIter start = buffer.GetIterAtOffset (tag.start - offset);
				Gtk.TextIter end = buffer.GetIterAtOffset (tag.end - offset);
				buffer.ApplyTag(tag.tag, start, end);
			}
		}