UNPKG

2.51 kBPlain TextView Raw
1/********************************************************************************
2 * Copyright (C) 2022 Arm and others.
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v. 2.0 which is available at
6 * http://www.eclipse.org/legal/epl-2.0.
7 *
8 * This Source Code may also be made available under the following Secondary
9 * Licenses when the conditions for such availability set forth in the Eclipse
10 * Public License v. 2.0 are satisfied: GNU General Public License, version 2
11 * with the GNU Classpath Exception which is available at
12 * https://www.gnu.org/software/classpath/license.html.
13 *
14 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15 ********************************************************************************/
16
17import { inject, injectable } from 'inversify';
18import { MessageService, UNTITLED_SCHEME } from '../common';
19import { Navigatable, NavigatableWidget } from './navigatable-types';
20import { Saveable, SaveableSource, SaveOptions } from './saveable';
21import { Widget } from './widgets';
22
23@injectable()
24export class SaveResourceService {
25 @inject(MessageService) protected readonly messageService: MessageService;
26
27 /**
28 * Indicate if the document can be saved ('Save' command should be disable if not).
29 */
30 canSave(widget?: Widget): widget is Widget & (Saveable | SaveableSource) {
31 return Saveable.isDirty(widget) && (this.canSaveNotSaveAs(widget) || this.canSaveAs(widget));
32 }
33
34 canSaveNotSaveAs(widget?: Widget): widget is Widget & (Saveable | SaveableSource) {
35 // By default, we never allow a document to be saved if it is untitled.
36 return Boolean(widget && NavigatableWidget.getUri(widget)?.scheme !== UNTITLED_SCHEME);
37 }
38
39 /**
40 * Saves the document
41 *
42 * No op if the widget is not saveable.
43 */
44 async save(widget: Widget | undefined, options?: SaveOptions): Promise<void> {
45 if (this.canSaveNotSaveAs(widget)) {
46 await Saveable.save(widget, options);
47 } else if (this.canSaveAs(widget)) {
48 await this.saveAs(widget, options);
49 }
50 }
51
52 canSaveAs(saveable?: Widget): saveable is Widget & SaveableSource & Navigatable {
53 return false;
54 }
55
56 saveAs(sourceWidget: Widget & SaveableSource & Navigatable, options?: SaveOptions): Promise<void> {
57 return Promise.reject('Unsupported: The base SaveResourceService does not support saveAs action.');
58 }
59}