示例#1
0
        /// <summary>
        /// Remove the task tag on the line specified by the TextIter.  This
        /// will not remove the "todo:" text (i.e., it will not modify the
        /// actual characters of the TextBuffer.
        /// <param name="iter">The TextIter specifying the line where the
        /// TaskTag should be removed.</param>
        /// <returns>True if a TaskTag was removed, otherwise False.</returns>
        /// </summary>
        bool RemoveTaskTagFromLine(Gtk.TextIter iter)
        {
            Gtk.TextIter start    = iter;
            Gtk.TextIter end      = iter;
            TaskTag      task_tag = GetTaskTagFromLineIter(ref start);

            if (task_tag == null)
            {
                return(false);
            }

            while (start.StartsLine() == false)
            {
                start.BackwardChar();
            }

            while (end.EndsLine() == false)
            {
                end.ForwardChar();
            }
//   end.ForwardToLineEnd ();
            last_removed_tag = null;
            Buffer.RemoveTag(task_tag, start, end);
            return(true);
        }
示例#2
0
        /// <summary>
        /// Remove the task from the line specified by the TextIter.  This
        /// will remove the TextTag and also the "todo:" portion of the line
        /// so it will no longer be a task.  The task summary text will be
        /// left on the line.
        /// <param name="iter">The TextIter specifying the line where the
        /// task should be removed.</param>
        /// <returns>True if a task was removed, otherwise False.</returns>
        /// </summary>
        bool RemoveTaskFromLine(ref Gtk.TextIter iter)
        {
            if (RemoveTaskTagFromLine(iter) == false)
            {
                return(false);
            }

            while (iter.StartsLine() == false)
            {
                iter.BackwardChar();
            }

            Gtk.TextIter line_end = iter;
            while (line_end.EndsLine() == false)
            {
                line_end.ForwardChar();
            }
//   line_end.ForwardToLineEnd ();

            string text = iter.GetText(line_end);

            Buffer.Delete(ref iter, ref line_end);

            text = GetTaskSummaryFromLine(text);
            if (text.Length > 0)
            {
                Buffer.Insert(ref iter, text);
            }
            return(true);
        }
示例#3
0
        /// <summary>
        /// If the renamed task is included inside this note, this
        /// handler will update the task summary in the note buffer.
        /// </summary>
        private void OnTaskRenamed(Task task, string old_title)
        {
            if (task.OriginNoteUri == null || task.OriginNoteUri != Note.Uri)
            {
                return;
            }

            // Search through the note looking for the TaskTag so that it can
            // be renamed

            if (!ContainsText(old_title))
            {
                return;
            }

            // Iterate through the lines looking for tasks
            Gtk.TextIter iter = Buffer.StartIter;
            iter.ForwardLine();              // Move past the note's title

            do
            {
                TaskTag task_tag = (TaskTag)
                                   Buffer.GetDynamicTag("task", iter);
                if (task_tag != null)
                {
                    if (task_tag.Uri != task.Uri)
                    {
                        continue;
                    }

                    Gtk.TextIter line_start = iter;
                    while (line_start.StartsLine() == false)
                    {
                        line_start.BackwardChar();
                    }
                    Gtk.TextIter line_end = iter;
                    while (line_end.EndsLine() == false)
                    {
                        line_end.ForwardChar();
                    }
//     line_end.ForwardToLineEnd ();

                    Buffer.Delete(ref line_start, ref line_end);
                    last_removed_tag = task_tag;
                    Buffer.Insert(ref line_start,
                                  string.Format("{0}: {1}",
                                                Catalog.GetString("todo"),
                                                task.Summary));
                    task_tag.fillByData(task.Data);
                    break;
                }
            } while (iter.ForwardLine());
        }
示例#4
0
        TaskTag GetTaskTagFromLineIter(ref Gtk.TextIter line_iter)
        {
            TaskTag task_tag = null;

            while (line_iter.StartsLine() == false)
            {
                line_iter.BackwardChar();
            }

            task_tag = (TaskTag)Buffer.GetDynamicTag("task", line_iter);

            return(task_tag);
        }
示例#5
0
        void OnInsertText(object sender, Gtk.InsertTextArgs args)
        {
            Gtk.TextIter start = args.Pos;
//Logger.Debug ("TaskNoteAddin.OnInsertText:\n" +
//    "\tLength: {0}\n" +
//    "\tText: {1}\n" +
//    "\tLine: {2}",
//    args.Length,
//    args.Text,
//    args.Pos.Line);

            if (args.Length == 1 && args.Text == "\n")
            {
                Gtk.TextIter curr_line = args.Pos;
                TaskTag      task_tag  = GetTaskTagFromLineIter(ref curr_line);

                Gtk.TextIter prev_line = args.Pos;
                prev_line.BackwardLine();
                /*TaskTag*/
                task_tag = GetTaskTagFromLineIter(ref prev_line);
                if (task_tag != null)
                {
                    // If the user just entered a newline and the previous
                    // line was a task, do some special processing...but
                    // we have to do it on idle since there are other
                    // Buffer.InsertText handlers that we'll screw up if
                    // we modify anything here.
                    args.RetVal = ProcessNewline();
                }
                else
                {
                    // Check to see if the previous line is a todo: line
                    while (prev_line.StartsLine() == false)
                    {
                        prev_line.BackwardChar();
                    }

                    Gtk.TextIter prev_line_end = prev_line;
                    while (prev_line_end.EndsLine() == false)
                    {
                        prev_line_end.ForwardChar();
                    }

                    string prev_line_text = prev_line.GetText(prev_line_end);

                    Match match = regex.Match(prev_line_text);
                    if (match.Success && last_removed_tag != null)
                    {
                        TaskManager task_mgr = TasksApplicationAddin.DefaultTaskManager;
                        Task        task;

                        task = task_mgr.FindByUri(last_removed_tag.Uri);
                        if (task != null)
                        {
                            // Update the task's summary and make sure that
                            // the previous line is appropriately tagged.
                            string summary = GetTaskSummaryFromLine(prev_line_text);
                            task.Summary = summary;
                            Buffer.ApplyTag(last_removed_tag, prev_line, prev_line_end);
                        }
                        else
                        {
                            Logger.Debug("Shouldn't ever hit this code (hopefully)");
                        }
                    }

                    last_removed_tag = null;
                }
            }
            else
            {
                ApplyTaskTagToBlock(ref start, args.Pos);
            }
        }