예제 #1
0
        /// <summary>
        /// Each time the user enters a newline (presses enter),
        /// evaluate the previous line to see if a new task should
        /// be created or the previous one removed...
        /// </summary>
        bool ProcessNewline()
        {
            Gtk.TextIter iter      = Buffer.GetIterAtMark(Buffer.InsertMark);
            Gtk.TextIter prev_line = iter;
            if (prev_line.BackwardLine() == false)
            {
                return(false);
            }

            TaskTag task_tag = GetTaskTagFromLineIter(ref prev_line);

            if (task_tag == null)
            {
                return(false);                // nothing to do with tasks here!
            }
            Task task =
                TasksApplicationAddin.DefaultTaskManager.FindByUri(task_tag.Uri);

            if (task == null)
            {
                // This shouldn't happen, but just in case we have a left-over
                // TaskTag without a real task, go ahead and remove the TaskTag

                // FIXME: Remove TaskTag from the line

                return(false);
            }

            if (task.Summary == string.Empty)
            {
                // If the previous line's task summary is empty, delete the task
                Logger.Debug("Previous line's task summary is empty, deleting it...");
                TasksApplicationAddin.DefaultTaskManager.Delete(task);
            }
            else
            {
                // If the previous line's task summary is not empty, create a new
                // task on the current line.

                // I'm disabling the following code for now.  It automatically
                // starts up a new task on the newline.  But since this modifies
                // the buffer, it sometimes causes problems.
                // TODO: Make the auto-newline work
//    Buffer.InsertAtCursor (
//      string.Format ("{0}: ",
//        Catalog.GetString ("todo")));
            }

            return(true);            // The buffer was modified
        }
예제 #2
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);
            }
        }