package org.plantuml.idea.action; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileChooser.FileChooserFactory; import com.intellij.openapi.fileChooser.FileSaverDescriptor; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.plantuml.idea.plantuml.PlantUml; import org.plantuml.idea.rendering.PlantUmlRenderer; import org.plantuml.idea.util.UIUtils; import javax.swing.*; import java.io.File; import java.io.IOException; /** * @author Eugene Steinberg */ public abstract class AbstractSaveDiagramAction extends DumbAwareAction { public static final String[] extensions; public static VirtualFile homeDir = null; private static VirtualFile lastDir = null; public static final String FILENAME = "diagram"; Logger logger = Logger.getInstance(SaveDiagramToFileAction.class); static { PlantUml.ImageFormat[] values = PlantUml.ImageFormat.values(); extensions = new String[values.length]; for (int i = 0; i < values.length; i++) { extensions[i] = values[i].toString().toLowerCase(); } homeDir = LocalFileSystem.getInstance().findFileByPath(System.getProperty("user.home")); } public AbstractSaveDiagramAction() { } public AbstractSaveDiagramAction(@Nullable String text, @Nullable String description, @Nullable Icon icon) { super(text, description, icon); } @Override public void actionPerformed(@NotNull AnActionEvent e) { FileSaverDescriptor fsd = new FileSaverDescriptor("Save diagram", "Please choose where to save diagram", extensions); VirtualFile baseDir = lastDir; if (baseDir == null) { if (e.getProject() == null) { baseDir = homeDir; } else { baseDir = e.getProject().getBaseDir(); } } String defaultFileName = getDefaultFileName(e.getProject()); final VirtualFileWrapper wrapper = FileChooserFactory.getInstance().createSaveFileDialog( fsd, e.getProject()).save(baseDir, defaultFileName); if (wrapper != null) { try { VirtualFile virtualFile = wrapper.getVirtualFile(true); if (virtualFile != null) { lastDir = virtualFile.getParent(); logger.info("lastDir set to " + lastDir); } File file = wrapper.getFile(); String[] tokens = file.getAbsolutePath().split("\\.(?=[^\\.]+$)"); String base = tokens[0]; String extension = tokens.length < 2 ? "" : tokens[1]; PlantUml.ImageFormat imageFormat; try { imageFormat = PlantUml.ImageFormat.valueOf(extension.toUpperCase()); } catch (Exception ex) { throw new IOException("Extension '" + extension + "' is not supported"); } String selectedSource = getSource(e.getProject()); String fileNameTemplate = base + "-%03d." + extension; PlantUmlRenderer.renderAndSave(selectedSource, UIUtils.getSelectedDir(FileEditorManager.getInstance(e.getProject()), FileDocumentManager.getInstance()), imageFormat, file.getAbsolutePath(), fileNameTemplate, UIUtils.getPlantUmlToolWindow(e.getProject()).getZoom(), getPageNumber(e)); } catch (IOException e1) { String title = "Error writing diagram"; String message = title + " to file:" + wrapper.getFile() + " : " + e1.toString(); logger.warn(message); Messages.showErrorDialog(message, title); } } } protected int getPageNumber(AnActionEvent e) { return -1; } protected abstract String getSource(Project project); private String getDefaultFileName(Project myProject) { VirtualFile selectedFile = UIUtils.getSelectedFile(FileEditorManager.getInstance(myProject), FileDocumentManager.getInstance()); return selectedFile == null ? FILENAME : selectedFile.getNameWithoutExtension(); } }