'use strict'; import * as vscode from 'vscode'; let commentId = 1; class NoteComment implements vscode.Comment { id: number; label: string | undefined; constructor( public body: string | vscode.MarkdownString, public mode: vscode.CommentMode, public author: vscode.CommentAuthorInformation, public parent?: vscode.CommentThread ) { this.id = ++commentId; } } export function activate(context: vscode.ExtensionContext) { // A `CommentController` is able to provide comments for documents. const commentController = vscode.comments.createCommentController('comment-sample', 'Comment API Sample'); context.subscriptions.push(commentController); vscode.commands.executeCommand('setContext', 'inDraft', false); // commenting range provider commentController.commentingRangeProvider = { provideCommentingRanges: (document: vscode.TextDocument, token: vscode.CancellationToken) => { let lineCount = document.lineCount; return [new vscode.Range(0, 0, lineCount - 1, 0)]; } }; context.subscriptions.push(vscode.commands.registerCommand('mywiki.createNote', (reply: vscode.CommentReply) => { replyNote(reply); })); context.subscriptions.push(vscode.commands.registerCommand('mywiki.replyNote', (reply: vscode.CommentReply) => { replyNote(reply); })); context.subscriptions.push(vscode.commands.registerCommand('mywiki.startDraft', (reply: vscode.CommentReply) => { let thread = reply.thread; thread.contextValue = 'draft'; let newComment = new NoteComment(reply.text, vscode.CommentMode.Preview, { name: 'vscode' }, thread); newComment.label = 'pending'; thread.comments = [...thread.comments, newComment]; })); context.subscriptions.push(vscode.commands.registerCommand('mywiki.finishDraft', (reply: vscode.CommentReply) => { vscode.commands.executeCommand('setContext', 'inDraft', false); let thread = reply.thread; thread.collapsibleState = undefined; let newComment = new NoteComment(reply.text, vscode.CommentMode.Preview, { name: 'vscode' }, thread); thread.comments = [...thread.comments, newComment].map(comment => { comment.label = undefined; return comment; }); })); context.subscriptions.push(vscode.commands.registerCommand('mywiki.deleteNoteComment', (comment: NoteComment) => { let thread = comment.parent; thread.comments = thread.comments.filter((cmt: NoteComment) => cmt.id !== comment.id); if (thread.comments.length === 0) { thread.dispose(); } })); context.subscriptions.push(vscode.commands.registerCommand('mywiki.deleteNote', (thread: vscode.CommentThread) => { thread.dispose(); })); context.subscriptions.push(vscode.commands.registerCommand('mywiki.cancelsaveNote', (comment: NoteComment) => { comment.parent.comments = comment.parent.comments.map((cmt: NoteComment) => { if (cmt.id === comment.id) { cmt.mode = vscode.CommentMode.Preview; } return cmt; }); })); context.subscriptions.push(vscode.commands.registerCommand('mywiki.saveNote', (comment: NoteComment) => { comment.parent.comments = comment.parent.comments.map((cmt: NoteComment) => { if (cmt.id === comment.id) { cmt.mode = vscode.CommentMode.Preview; } return cmt; }); })); context.subscriptions.push(vscode.commands.registerCommand('mywiki.editNote', (comment: NoteComment) => { comment.parent.comments = comment.parent.comments.map((cmt: NoteComment) => { if (cmt.id === comment.id) { cmt.mode = vscode.CommentMode.Editing; } return cmt; }); })); function replyNote(reply: vscode.CommentReply) { let thread = reply.thread; let newComment = new NoteComment(reply.text, vscode.CommentMode.Preview, { name: 'vscode' }, thread); thread.comments = [...thread.comments, newComment]; } }