Skip to content

Commit 6b2e0f2

Browse files
committed
Rorganize library list with dnd + drop library from browser
Signed-off-by: Seb Julliand <[email protected]> Reorganize library list with dnd + dnd library from browser
1 parent 379bb06 commit 6b2e0f2

File tree

2 files changed

+50
-21
lines changed

2 files changed

+50
-21
lines changed

src/ui/views/LibraryListView.ts

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import path from "path";
12
import vscode, { commands, l10n } from "vscode";
23
import IBMi from "../../api/IBMi";
34
import { instance } from "../../instantiate";
4-
import { ConnectionConfig, IBMiObject, LIBRARY_LIST_MIMETYPE, OBJECT_BROWSER_DRAG_MIMETYPE, WithLibrary } from "../../typings";
5+
import { ConnectionConfig, IBMiObject, LIBRARY_LIST_MIMETYPE, URI_LIST_MIMETYPE, URI_LIST_SEPARATOR, WithLibrary } from "../../typings";
56
import { VscodeTools } from "../Tools";
67

78
export function initializeLibraryListView(context: vscode.ExtensionContext) {
@@ -86,14 +87,14 @@ export function initializeLibraryListView(context: vscode.ExtensionContext) {
8687
}
8788
}),
8889

89-
vscode.commands.registerCommand(`code-for-ibmi.changeUserLibraryList`, async () => {
90+
vscode.commands.registerCommand(`code-for-ibmi.changeUserLibraryList`, async (libraries?: string[]) => {
9091
const connection = instance.getConnection();
9192
if (connection) {
9293
const content = connection.getContent();
9394
const config = connection.getConfig();
9495
const libraryList = config.libraryList;
9596

96-
const newLibraryListStr = await vscode.window.showInputBox({
97+
const newLibraryListStr = libraries?.join(",") || await vscode.window.showInputBox({
9798
prompt: l10n.t(`Changing library list (can use "*reset")`),
9899
value: libraryList.map(lib => connection.upperCaseName(lib)).join(`, `)
99100
});
@@ -270,29 +271,58 @@ export function initializeLibraryListView(context: vscode.ExtensionContext) {
270271

271272
class LibraryListDragAndDrop implements vscode.TreeDragAndDropController<LibraryListNode> {
272273
readonly dragMimeTypes = [];
273-
readonly dropMimeTypes = [OBJECT_BROWSER_DRAG_MIMETYPE];
274+
readonly dropMimeTypes = [URI_LIST_MIMETYPE];
274275

275-
handleDrag(source: readonly LibraryListNode[], dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Thenable<void> | void {
276+
handleDrag(source: readonly LibraryListNode[], dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken) {
276277
dataTransfer.set(LIBRARY_LIST_MIMETYPE, new vscode.DataTransferItem(source));
277278
}
278279

279-
handleDrop(target: LibraryListNode | undefined, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Thenable<void> | void {
280-
const libraryItem = dataTransfer.get(LIBRARY_LIST_MIMETYPE)?.value[0] as LibraryListNode;
281-
if (libraryItem && libraryItem !== target) {
282-
const currentLibrary = libraryItem.contextValue === 'currentLibrary';
280+
handleDrop(target: LibraryListNode | undefined, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken) {
281+
const libraries = this.getLibraries(dataTransfer)?.map(library => library.toUpperCase());
282+
const config = instance.getConnection()?.getConfig();
283+
if (config && libraries?.length) {
284+
if (target?.contextValue === 'currentLibrary') {
285+
//Dropped on current library: change current library
286+
vscode.commands.executeCommand(`code-for-ibmi.setCurrentLibrary`, { library: libraries[0] } as WithLibrary);
287+
}
288+
else {
289+
const libraryList = config.libraryList;
290+
291+
libraries.forEach(library => {
292+
const index = libraryList.findIndex(lib => lib === library);
293+
if (index > -1) {
294+
libraryList.splice(index, 1);
295+
}
296+
});
283297

284-
if (target) {
285-
if (target?.contextValue === 'currentLibrary') {
286-
//Dropped on current library: become current library
287-
vscode.commands.executeCommand(`code-for-ibmi.setCurrentLibrary`, libraryItem);
298+
if (target) {
299+
//Dropped on a library: push it down and move to its position
300+
const index = libraryList.findIndex(lib => lib === target.library);
301+
const moved = libraryList.splice(index, libraryList.length - index, ...libraries);
302+
libraryList.push(...moved);
288303
}
289304
else {
290-
//Dropped on a library: push it down and move to its position
305+
//Dropped at the bottom of the list, after the last item: move to the last position
306+
libraryList.push(...libraries);
291307
}
308+
vscode.commands.executeCommand(`code-for-ibmi.changeUserLibraryList`, libraryList);
292309
}
293-
else {
294-
//Dropped at the bottom after the last item: move to the last position
295-
}
310+
}
311+
}
312+
313+
getLibraries(dataTransfer: vscode.DataTransfer) {
314+
const libraryListData = dataTransfer.get(LIBRARY_LIST_MIMETYPE);
315+
const urisData = dataTransfer.get(URI_LIST_MIMETYPE);
316+
if (libraryListData) {
317+
return (libraryListData.value as LibraryListNode[]).map(node => node.library);
318+
}
319+
else if (urisData && urisData.value) {
320+
return String(urisData.value).split(URI_LIST_SEPARATOR)
321+
.map(uri => vscode.Uri.parse(uri))
322+
.filter(uri => uri.scheme === "object")
323+
.map(uri => path.parse(uri.path))
324+
.filter(path => path.ext?.toUpperCase() === ".LIB")
325+
.map(path => path.name);
296326
}
297327
}
298328
}

src/ui/views/ifsBrowser.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@ import { SortOptions } from "../../api/IBMiContent";
88
import { Search } from "../../api/Search";
99
import { Tools } from "../../api/Tools";
1010
import { instance } from "../../instantiate";
11-
import { FocusOptions, IFSFile, IFS_BROWSER_MIMETYPE, OBJECT_BROWSER_MIMETYPE, SearchHit, SearchResults, URI_LIST_MIMETYPE, WithPath } from "../../typings";
11+
import { FocusOptions, IFSFile, IFS_BROWSER_MIMETYPE, OBJECT_BROWSER_MIMETYPE, SearchHit, SearchResults, URI_LIST_MIMETYPE, URI_LIST_SEPARATOR, WithPath } from "../../typings";
1212
import { VscodeTools } from "../Tools";
1313
import { BrowserItem, BrowserItemParameters } from "../types";
1414

15-
const URI_LIST_SEPARATOR = "\r\n";
1615
const PROTECTED_DIRS = /^(\/|\/QOpenSys|\/QSYS\.LIB|\/QDLS|\/QOPT|\/QNTC|\/QFileSvr\.400|\/QIBM|\/QSR|\/QTCPTMM|\/bin|\/dev|\/home|\/tmp|\/usr|\/var)$/i;
1716
const ALWAYS_SHOW_FILES = /^(\.gitignore|\.vscode|\.deployignore)$/i;
1817
type DragNDropAction = "move" | "copy";
@@ -209,7 +208,7 @@ class IFSBrowserDragAndDrop implements vscode.TreeDragAndDropController<IFSItem>
209208
.join(URI_LIST_SEPARATOR)));
210209
}
211210

212-
async handleDrop(target: IFSItem | undefined, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken) {
211+
handleDrop(target: IFSItem | undefined, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken) {
213212
if (target) {
214213
const toDirectory = (target.file.type === "streamfile" ? target.parent : target) as IFSDirectoryItem;
215214
const ifsBrowserItems = dataTransfer.get(IFS_BROWSER_MIMETYPE);
@@ -220,7 +219,7 @@ class IFSBrowserDragAndDrop implements vscode.TreeDragAndDropController<IFSItem>
220219
const explorerItems = dataTransfer.get(URI_LIST_MIMETYPE);
221220
if (explorerItems?.value) {
222221
//URI_LIST_MIMETYPE Mime type is a string with `toString()`ed Uris separated by `\r\n`.
223-
const uris = (await explorerItems.asString()).split(URI_LIST_SEPARATOR).map(uri => vscode.Uri.parse(uri));
222+
const uris = String(explorerItems.value).split(URI_LIST_SEPARATOR).map(uri => vscode.Uri.parse(uri));
224223
if (uris.at(0)?.scheme === "member") {
225224
this.copyMembers(uris, toDirectory)
226225
}

0 commit comments

Comments
 (0)