package org.asciidoc.intellij.actions.asciidoc; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.UndoConfirmationPolicy; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import org.asciidoc.intellij.ui.CreateTableDialog; import org.jetbrains.annotations.NotNull; public class CreateTableAction extends AsciiDocAction { @Override public void actionPerformed(@NotNull AnActionEvent event) { final Project project = event.getProject(); if (project == null) { return; } Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); if (editor == null) { return; } final CreateTableDialog createTableDialog = new CreateTableDialog(); createTableDialog.show(); if (createTableDialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) { final Document document = editor.getDocument(); final int offset = editor.getCaretModel().getOffset(); CommandProcessor.getInstance().executeCommand(project, new Runnable() { @Override public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { document.insertString(offset, generateTable( createTableDialog.getColumnCount(), createTableDialog.getRowCount(), createTableDialog.getTitle())); } }); } }, null, null, UndoConfirmationPolicy.DO_NOT_REQUEST_CONFIRMATION); } } private String generateTable(int cols, int rows, String title) { assert cols > 0; assert rows > 0; StringBuilder table = new StringBuilder("\n"); if (!title.isEmpty()) { table.append(".").append(title).append("\n"); } table.append("|===\n"); // Create header columns for (int c = 0;c < cols;c++) { table.append("|Header "); table.append(c + 1); if (c < cols - 1) { table.append(" "); } } table.append("\n\n"); // Create table cells for (int r = 0;r < rows;r++) { for (int c = 0;c < cols;c++) { // Build row table.append("|Column "); table.append(c + 1); table.append(", row "); table.append(r + 1); table.append("\n"); } if (r < rows - 1) { table.append("\n"); } } table.append("|===\n"); return table.toString(); } }