/* * Copyright 2003-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.ide.save; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.util.WaitForProgressToShow; import jetbrains.mps.ide.ThreadUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.module.SRepository; /** * Keep knowledge about required lock level for a repository save in a single place. * At the moment, there are uses both of write action and command to perform save, and I'm in doubt which one is correct. * @author Artem Tikhomirov */ public class SaveRepositoryCommand implements Runnable { private final SRepository myRepository; public SaveRepositoryCommand(@NotNull SRepository repository) { myRepository = repository; } @Override public void run() { myRepository.saveAll(); } // FIXME need to decide about the contract, whether it respects make session and whether it waits for save to complete (perhaps, optionally?) public void execute() { if (ThreadUtils.isInEDT()) { // runSavingTask(); myRepository.getModelAccess().runWriteAction(this); } else { myRepository.getModelAccess().runWriteInEDT(this); // ApplicationManager.getApplication().invokeLater(this::runSavingTask, ModalityState.defaultModalityState()); } } public void runSavingTask() { // ProgressManager.getInstance().run(new Task.Modal(null, "Saving Project", false) { // @Override // public void run(@NotNull ProgressIndicator indicator) { // indicator.setIndeterminate(true); // WaitForProgressToShow.runOrInvokeAndWaitAboveProgress(() -> { execute(); // indicator.getModalityState() }); // } // }); } }