mirror of
https://github.com/microsoft/vscode-extension-samples.git
synced 2026-06-13 07:10:26 +08:00
111 lines
3.6 KiB
TypeScript
111 lines
3.6 KiB
TypeScript
'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];
|
|
}
|
|
}
|