1
2
3
4
5
6
7
8
9
10
11 package com.jsql.view.swing.action;
12
13 import com.jsql.util.LogLevelUtil;
14 import com.jsql.view.swing.dialog.ReplaceFileChooser;
15 import com.jsql.view.swing.table.PanelTable;
16 import com.jsql.view.swing.util.MediatorHelper;
17 import org.apache.logging.log4j.LogManager;
18 import org.apache.logging.log4j.Logger;
19
20 import javax.swing.*;
21 import javax.swing.text.JTextComponent;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.InputEvent;
24 import java.awt.event.KeyEvent;
25 import java.io.BufferedWriter;
26 import java.io.FileWriter;
27 import java.io.IOException;
28 import java.nio.charset.StandardCharsets;
29 import java.nio.file.InvalidPathException;
30
31
32
33
34 public class ActionSaveTab extends AbstractAction {
35
36 private static final Logger LOGGER = LogManager.getRootLogger();
37
38 private ReplaceFileChooser replaceFileChooser;
39
40 public ActionSaveTab() {
41
42
43
44
45 try {
46 this.replaceFileChooser = new ReplaceFileChooser(
47 MediatorHelper.model().getMediatorUtils().preferencesUtil().getPathFile()
48 );
49 } catch (IllegalArgumentException | NoSuchMethodError | InternalError | NullPointerException e) {
50 LOGGER.log(LogLevelUtil.CONSOLE_ERROR, "Internal error in JFileChooser, verify your system and see stacktrace in tab Java: {}", e.getMessage());
51 LOGGER.log(LogLevelUtil.CONSOLE_JAVA, e, e);
52 }
53 this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
54 this.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_S);
55 this.putValue(Action.NAME, "Save Tab As...");
56 }
57
58 @Override
59 public void actionPerformed(ActionEvent e) {
60 this.replaceFileChooser.setDialogTitle("Save Tab As");
61 var componentResult = MediatorHelper.tabResults().getSelectedComponent();
62 switch (componentResult) {
63 case PanelTable panelTable -> this.saveToFile(panelTable.getTableValues());
64 case JScrollPane jScrollPane
65 when jScrollPane.getViewport().getView() instanceof JTextComponent textarea -> this.saveToFile(textarea);
66 default -> LOGGER.log(LogLevelUtil.CONSOLE_ERROR, "Nothing to save");
67 }
68 }
69
70 private void saveToFile(JComponent jComponent) {
71 if (jComponent == null) {
72 return;
73 }
74
75 this.replaceFileChooser.updateUI();
76 try {
77 int stateSave = this.replaceFileChooser.showSaveDialog(MediatorHelper.frame());
78 if (stateSave == JFileChooser.APPROVE_OPTION) {
79 var folderSelectedFile = this.replaceFileChooser.getCurrentDirectory().toString();
80 MediatorHelper.model().getMediatorUtils().preferencesUtil().set(folderSelectedFile);
81 if (jComponent instanceof JTextComponent jTextComponent) {
82 this.saveTextToFile(jTextComponent);
83 } else if (jComponent instanceof JTable jTable) {
84 this.saveTableToFile(jTable);
85 }
86 }
87 } catch (InvalidPathException e) {
88 LOGGER.log(LogLevelUtil.CONSOLE_JAVA, e, e);
89 }
90 }
91
92 private void saveTableToFile(JTable tableResults) {
93 var fileSelected = this.replaceFileChooser.getSelectedFile();
94
95 try (var fileWriter = new FileWriter(fileSelected, StandardCharsets.UTF_8)) {
96 var tableModel = tableResults.getModel();
97 for (var i = 2 ; i < tableModel.getColumnCount() ; i++) {
98 fileWriter.write(tableModel.getColumnName(i) + "\t");
99 }
100 fileWriter.write("\n");
101
102 for (var i = 0 ; i < tableModel.getRowCount() ; i++) {
103 for (var j = 2 ; j < tableModel.getColumnCount() ; j++) {
104
105 if (tableModel.getValueAt(i, j) == null) {
106 fileWriter.write("\t");
107 } else {
108 var line = tableModel.getValueAt(i, j).toString();
109 line = line
110 .replace("\n", "\\n")
111 .replace("\t", "\\t");
112 line = line + "\t";
113 fileWriter.write(line);
114 }
115 }
116 fileWriter.write("\n");
117 }
118 } catch (IOException e) {
119 LOGGER.log(
120 LogLevelUtil.CONSOLE_ERROR,
121 String.format("Error writing to %s", fileSelected.getName()),
122 e.getMessage()
123 );
124 }
125 }
126
127 private void saveTextToFile(JTextComponent textarea) {
128 var fileSelected = this.replaceFileChooser.getSelectedFile();
129 try (
130 var fileWriter = new FileWriter(fileSelected, StandardCharsets.UTF_8);
131 var fileOut = new BufferedWriter(fileWriter)
132 ) {
133 textarea.write(fileOut);
134 } catch (IOException e) {
135 LOGGER.log(
136 LogLevelUtil.CONSOLE_ERROR,
137 String.format("Error writing to %s", fileSelected.getName()),
138 e
139 );
140 }
141 }
142 }