/// <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 }
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); } }