leomovskii

Application.java

Dec 29th, 2021 (edited)
1,110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.39 KB | None | 0 0
  1. package com;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Dimension;
  5. import java.awt.Font;
  6. import java.awt.Insets;
  7. import java.awt.event.InputEvent;
  8. import java.awt.event.KeyAdapter;
  9. import java.awt.event.KeyEvent;
  10. import java.awt.event.WindowAdapter;
  11. import java.awt.event.WindowEvent;
  12. import java.io.BufferedReader;
  13. import java.io.File;
  14. import java.io.FileInputStream;
  15. import java.io.FileWriter;
  16. import java.io.IOException;
  17. import java.io.InputStreamReader;
  18. import java.text.SimpleDateFormat;
  19. import java.util.ArrayList;
  20. import java.util.Arrays;
  21. import java.util.Collections;
  22.  
  23. import javax.swing.JCheckBoxMenuItem;
  24. import javax.swing.JFileChooser;
  25. import javax.swing.JFrame;
  26. import javax.swing.JLabel;
  27. import javax.swing.JMenu;
  28. import javax.swing.JMenuBar;
  29. import javax.swing.JMenuItem;
  30. import javax.swing.JOptionPane;
  31. import javax.swing.JScrollPane;
  32. import javax.swing.JTextArea;
  33. import javax.swing.KeyStroke;
  34. import javax.swing.SwingConstants;
  35. import javax.swing.SwingUtilities;
  36. import javax.swing.event.CaretEvent;
  37. import javax.swing.event.CaretListener;
  38. import javax.swing.event.DocumentEvent;
  39. import javax.swing.event.DocumentListener;
  40. import javax.swing.undo.UndoManager;
  41.  
  42. public class Application extends JFrame {
  43.  
  44.     enum CaseType {
  45.         Upper, Lower, Inverted, Random
  46.     }
  47.  
  48.     JMenuBar menuBar;
  49.     JTextArea textArea;
  50.     JLabel statusBar;
  51.  
  52.     SimpleDateFormat formatter = new SimpleDateFormat("hh:mm DD.MM.YYYY");
  53.  
  54.     UndoManager undoManager;
  55.  
  56.     JFileChooser fileDialog;
  57.     File file;
  58.  
  59.     String fileName;
  60.     boolean isSaved = true, isNewFile = true;
  61.  
  62.     Application() {
  63.         setSize(600, 400);
  64.         setMinimumSize(new Dimension(200, 200));
  65.         setLocationRelativeTo(null);
  66.         setVisible(true);
  67.         setLayout(new BorderLayout());
  68.  
  69.         fileName = "Безымянный";
  70.         file = new File(fileName);
  71.         setTitle(fileName + " - Блокнот");
  72.  
  73.         fileDialog = new JFileChooser();
  74.         fileDialog.setCurrentDirectory(fileDialog.getFileSystemView().getDefaultDirectory());
  75.  
  76.         addWindowListener(new WindowAdapter() {
  77.             public void windowClosing(WindowEvent e) {
  78.                 exit();
  79.             }
  80.         });
  81.  
  82.         undoManager = new UndoManager();
  83.  
  84.         menuBar = new JMenuBar();
  85.         add(menuBar, BorderLayout.NORTH);
  86.  
  87.         addFileMenu();
  88.         addEditMenu();
  89.         addOperationsMenu();
  90.         addFormatMenu();
  91.  
  92.         addTextArea();
  93.         addStatusBar();
  94.     }
  95.  
  96.     private void addFileMenu() {
  97.         JMenu menuFile = new JMenu("Файл");
  98.         menuBar.add(menuFile);
  99.  
  100.         JMenuItem itemCreate = new JMenuItem("Создать");
  101.         itemCreate.addActionListener(e -> onCreate());
  102.         itemCreate.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
  103.         menuFile.add(itemCreate);
  104.  
  105.         JMenuItem itemOpen = new JMenuItem("Открыть");
  106.         itemOpen.addActionListener(e -> onOpen());
  107.         itemOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
  108.         menuFile.add(itemOpen);
  109.  
  110.         JMenuItem itemSave = new JMenuItem("Сохранить");
  111.         itemSave.addActionListener(e -> onSave());
  112.         itemSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
  113.         menuFile.add(itemSave);
  114.  
  115.         JMenuItem itemSaveAs = new JMenuItem("Сохранить как...");
  116.         itemSaveAs.addActionListener(e -> onSaveAs());
  117.         menuFile.add(itemSaveAs);
  118.  
  119.         menuFile.addSeparator();
  120.  
  121.         JMenuItem itemExit = new JMenuItem("Выход");
  122.         itemExit.addActionListener(e -> exit());
  123.         menuFile.add(itemExit);
  124.     }
  125.  
  126.     private void addEditMenu() {
  127.         JMenu menuEdit = new JMenu("Правка");
  128.         menuBar.add(menuEdit);
  129.  
  130.         JMenuItem itemUndo = new JMenuItem("Отменить");
  131.         itemUndo.addActionListener(e -> {
  132.             if (undoManager.canUndo())
  133.                 undoManager.undo();
  134.         });
  135.         itemUndo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
  136.         menuEdit.add(itemUndo);
  137.  
  138.         JMenuItem itemRedo = new JMenuItem("Вернуть");
  139.         itemRedo.addActionListener(e -> {
  140.             if (undoManager.canRedo())
  141.                 undoManager.redo();
  142.         });
  143.         itemRedo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK));
  144.         menuEdit.add(itemRedo);
  145.  
  146.         menuEdit.addSeparator();
  147.  
  148.         JMenuItem itemCut = new JMenuItem("Вырезать");
  149.         itemCut.addActionListener(e -> textArea.cut());
  150.         itemCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
  151.         menuEdit.add(itemCut);
  152.  
  153.         JMenuItem itemCopy = new JMenuItem("Копировать");
  154.         itemCopy.addActionListener(e -> textArea.copy());
  155.         itemCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
  156.         menuEdit.add(itemCopy);
  157.  
  158.         JMenuItem itemPaste = new JMenuItem("Вставить");
  159.         itemPaste.addActionListener(e -> textArea.paste());
  160.         itemPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
  161.         menuEdit.add(itemPaste);
  162.  
  163.         JMenuItem itemDelete = new JMenuItem("Удалить");
  164.         itemDelete.addActionListener(e -> textArea.replaceSelection(""));
  165.         itemDelete.setAccelerator(KeyStroke.getKeyStroke("DELETE"));
  166.         menuEdit.add(itemDelete);
  167.  
  168.         menuEdit.addSeparator();
  169.  
  170.         JMenuItem itemGoTo = new JMenuItem("Перейти...");
  171.         itemGoTo.addActionListener(e -> new GoToDialog(this, textArea));
  172.         itemGoTo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));
  173.         menuEdit.add(itemGoTo);
  174.  
  175.         menuEdit.addSeparator();
  176.  
  177.         JMenuItem itemSelectAll = new JMenuItem("Выделить всё");
  178.         itemSelectAll.addActionListener(e -> textArea.selectAll());
  179.         itemSelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
  180.         menuEdit.add(itemSelectAll);
  181.  
  182.         JMenuItem itemTimeStamp = new JMenuItem("Время и дата");
  183.         itemTimeStamp.addActionListener(
  184.                 e -> textArea.insert(formatter.format(new java.util.Date()), textArea.getSelectionStart()));
  185.         menuEdit.add(itemTimeStamp);
  186.     }
  187.  
  188.     private void addFormatMenu() {
  189.         JMenu menuFormat = new JMenu("Формат");
  190.         menuBar.add(menuFormat);
  191.  
  192.         JCheckBoxMenuItem itemWordWrap = new JCheckBoxMenuItem("Перенос по словам");
  193.         itemWordWrap.addActionListener(e -> textArea.setLineWrap(itemWordWrap.isSelected()));
  194.         menuFormat.add(itemWordWrap);
  195.  
  196.         JMenuItem itemFont = new JMenuItem("Шрифт...");
  197.         itemFont.addActionListener(e -> new FontDialog(this, textArea));
  198.         menuFormat.add(itemFont);
  199.     }
  200.  
  201.     private void addOperationsMenu() {
  202.         JMenu menuOperations = new JMenu("Операции");
  203.         menuBar.add(menuOperations);
  204.  
  205.         JMenuItem itemToLowerCase = new JMenuItem("Регистр: прописные");
  206.         itemToLowerCase.addActionListener(e -> setCase(CaseType.Lower));
  207.         menuOperations.add(itemToLowerCase);
  208.  
  209.         JMenuItem itemToUpperCase = new JMenuItem("Регистр: СТРОЧНЫЕ");
  210.         itemToUpperCase.addActionListener(e -> setCase(CaseType.Upper));
  211.         menuOperations.add(itemToUpperCase);
  212.  
  213.         JMenuItem itemReverseCase = new JMenuItem("Регистр: иНВЕРТИРОВАТЬ");
  214.         itemReverseCase.addActionListener(e -> setCase(CaseType.Inverted));
  215.         menuOperations.add(itemReverseCase);
  216.  
  217.         JMenuItem itemRandomCase = new JMenuItem("Регистр: сЛуЧАйнЫй");
  218.         itemRandomCase.addActionListener(e -> setCase(CaseType.Random));
  219.         menuOperations.add(itemRandomCase);
  220.  
  221.         menuOperations.addSeparator();
  222.  
  223.         JMenuItem itemSortAscending = new JMenuItem("Сортировка строк: по возрастанию");
  224.         itemSortAscending.addActionListener(e -> sortLines(true));
  225.         menuOperations.add(itemSortAscending);
  226.  
  227.         JMenuItem itemSortDescending = new JMenuItem("Сортировка строк: по убыванию");
  228.         itemSortDescending.addActionListener(e -> sortLines(false));
  229.         menuOperations.add(itemSortDescending);
  230.  
  231.         menuOperations.addSeparator();
  232.  
  233.         JMenuItem itemRemoveEmptyLines = new JMenuItem("Удалить пустые строки");
  234.         itemRemoveEmptyLines
  235.                 .addActionListener(e -> textArea.setText(textArea.getText().replaceAll("(?m)^[ \t]*\r?\n", "")));
  236.         menuOperations.add(itemRemoveEmptyLines);
  237.  
  238.     }
  239.  
  240.     private void addTextArea() {
  241.         textArea = new JTextArea();
  242.         textArea.getDocument().addUndoableEditListener(e -> undoManager.addEdit(e.getEdit()));
  243.         textArea.setFont(new Font("Serif", Font.PLAIN, 12));
  244.         textArea.setTabSize(1);
  245.         textArea.setMargin(new Insets(3, 3, 3, 3));
  246.         add(new JScrollPane(textArea), BorderLayout.CENTER);
  247.  
  248.         textArea.getDocument().addDocumentListener(new DocumentListener() {
  249.             public void changedUpdate(DocumentEvent e) {
  250.                 isSaved = false;
  251.             }
  252.  
  253.             public void removeUpdate(DocumentEvent e) {
  254.                 isSaved = false;
  255.             }
  256.  
  257.             public void insertUpdate(DocumentEvent e) {
  258.                 isSaved = false;
  259.             }
  260.         });
  261.  
  262.         textArea.addCaretListener(new CaretListener() {
  263.             @Override
  264.             public void caretUpdate(CaretEvent e) {
  265.                 if (textArea.getText().length() == 0)
  266.                     UpdateStatusBar(0, 0);
  267.                 else
  268.                     try {
  269.                         int pos = textArea.getCaretPosition();
  270.                         int lin = textArea.getLineOfOffset(pos);
  271.                         int col = pos - textArea.getLineStartOffset(lin);
  272.                         UpdateStatusBar(lin, col);
  273.                     } catch (Exception ex) {
  274.                     }
  275.             }
  276.         });
  277.  
  278.         textArea.addKeyListener(new KeyAdapter() {
  279.             public void keyPressed(KeyEvent e) {
  280.                 if (e.getKeyCode() == KeyEvent.VK_D && e.isControlDown()) {
  281.                     String text = textArea.getSelectedText();
  282.                     if (text.equals(null)) {
  283. // textArea.insert(formatter.format(new java.util.Date()), textArea.getSelectionStart())
  284.  
  285.                         // копировать строку где курсор на следующую
  286.                     } else {
  287.                         textArea.insert(formatter.format(new java.util.Date()), textArea.getSelectionStart());
  288.                     }
  289.                     System.out.println();
  290.                 }
  291.             }
  292.         });
  293.     }
  294.  
  295.     private void addStatusBar() {
  296.         statusBar = new JLabel();
  297.         statusBar.setHorizontalAlignment(SwingConstants.RIGHT);
  298.         add(statusBar, BorderLayout.SOUTH);
  299.         UpdateStatusBar(0, 0);
  300.     }
  301.  
  302.     private void UpdateStatusBar(int row, int col) {
  303.         statusBar.setText(String.format("||     Стр %d, стлб %d  ", row + 1, col + 1));
  304.     }
  305.  
  306.     private void onCreate() {
  307.         if (!confirmSave())
  308.             return;
  309.         textArea.setText("");
  310.         fileName = new String("Безымянный");
  311.         file = new File(fileName);
  312.         isSaved = true;
  313.         isNewFile = true;
  314.         setTitle(fileName + " - Блокнот");
  315.     }
  316.  
  317.     private boolean confirmSave() {
  318.         if (!isSaved) {
  319.             int x = JOptionPane.showConfirmDialog(this, "Сохранить изменения в файле \"" + fileName + "\"?", "Блокнот",
  320.                     JOptionPane.YES_NO_CANCEL_OPTION);
  321.  
  322.             if (x == JOptionPane.YES_OPTION && !onSaveAs())
  323.                 return false;
  324.  
  325.             if (x == JOptionPane.CANCEL_OPTION || x == JOptionPane.CLOSED_OPTION)
  326.                 return false;
  327.         }
  328.         return true;
  329.     }
  330.  
  331.     private boolean saveFile(File f) {
  332.         try (FileWriter writer = new FileWriter(f)) {
  333.             writer.write(textArea.getText());
  334.  
  335.             isSaved = true;
  336.             fileName = new String(f.getName());
  337.             if (!f.canWrite()) {
  338.                 fileName += " (только чтение)";
  339.                 isNewFile = true;
  340.             }
  341.             file = f;
  342.             setTitle(fileName + " - Блокнот");
  343.             isNewFile = false;
  344.  
  345.             return true;
  346.         } catch (IOException e) {
  347.             return false;
  348.         }
  349.     }
  350.  
  351.     private boolean onSave() {
  352.         return isNewFile ? onSaveAs() : saveFile(file);
  353.     }
  354.  
  355.     private boolean onSaveAs() {
  356.         File f = null;
  357.         fileDialog.setDialogTitle("Сохранить как...");
  358.         fileDialog.setApproveButtonText("Сохранить");
  359.         fileDialog.setApproveButtonMnemonic(KeyEvent.VK_S);
  360.  
  361.         do {
  362.             if (fileDialog.showSaveDialog(this) != JFileChooser.APPROVE_OPTION)
  363.                 return false;
  364.             f = fileDialog.getSelectedFile();
  365.             if (!f.exists())
  366.                 break;
  367.             if (JOptionPane.showConfirmDialog(this, "Файл \"" + f.getPath() + "\" существует. Заменить?",
  368.                     "Сохранить как", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
  369.                 break;
  370.         } while (true);
  371.  
  372.         return saveFile(f);
  373.     }
  374.  
  375.     private boolean openFile(File f) {
  376.         try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f)))) {
  377.             String line;
  378.  
  379.             while ((line = reader.readLine()) != null)
  380.                 textArea.append(line);
  381.  
  382.             isSaved = true;
  383.             fileName = new String(f.getName());
  384.             if (!f.canWrite()) {
  385.                 fileName += " (только чтение)";
  386.                 isNewFile = true;
  387.             }
  388.             file = f;
  389.             setTitle(fileName + " - Блокнот");
  390.             isNewFile = false;
  391.  
  392.             textArea.setCaretPosition(0);
  393.  
  394.             return true;
  395.         } catch (IOException e) {
  396.             return false;
  397.         }
  398.     }
  399.  
  400.     private void onOpen() {
  401.         if (!confirmSave())
  402.             return;
  403.  
  404.         fileDialog.setDialogTitle("Открыть");
  405.         fileDialog.setApproveButtonText("Открыть");
  406.         fileDialog.setApproveButtonMnemonic(KeyEvent.VK_O);
  407.  
  408.         File f = null;
  409.         do {
  410.             if (fileDialog.showOpenDialog(this) != JFileChooser.APPROVE_OPTION)
  411.                 return;
  412.             f = fileDialog.getSelectedFile();
  413.             if (f.exists())
  414.                 break;
  415.             JOptionPane.showMessageDialog(this,
  416.                     "Файл \"" + f.getName() + "\" не найден. Проверьте правильность имени файла.", "Открыть",
  417.                     JOptionPane.INFORMATION_MESSAGE);
  418.  
  419.         } while (true);
  420.  
  421.         textArea.setText("");
  422.  
  423.         if (!openFile(f)) {
  424.             fileName = "Безымянный";
  425.             isSaved = true;
  426.             setTitle(fileName + " - Блокнот");
  427.         }
  428.         if (!f.canWrite())
  429.             isNewFile = true;
  430.     }
  431.  
  432.     private void exit() {
  433.         if (confirmSave())
  434.             System.exit(0);
  435.     }
  436.  
  437.     private void setCase(CaseType caseType) {
  438.         String selectedString = textArea.getSelectedText();
  439.  
  440.         if (selectedString == null)
  441.             return;
  442.  
  443.         if (caseType == CaseType.Upper) {
  444.             textArea.replaceSelection(selectedString.toUpperCase());
  445.  
  446.         } else if (caseType == CaseType.Lower) {
  447.             textArea.replaceSelection(selectedString.toLowerCase());
  448.  
  449.         } else {
  450.             StringBuilder sb = new StringBuilder();
  451.  
  452.             for (String s : selectedString.split(""))
  453.                 if (caseType == CaseType.Inverted)
  454.                     sb.append(s.equals(s.toUpperCase()) ? s.toLowerCase() : s.toUpperCase());
  455.                 else
  456.                     sb.append(Math.random() * 99 < 50 ? s.toLowerCase() : s.toUpperCase());
  457.  
  458.             textArea.replaceSelection(sb.toString());
  459.         }
  460.     }
  461.  
  462.     private void sortLines(boolean isAlphabetically) {
  463.         ArrayList<String> list = new ArrayList<>();
  464.         list.addAll(Arrays.asList(textArea.getText().split("\n")));
  465.  
  466.         Collections.sort(list);
  467.         if (!isAlphabetically)
  468.             Collections.reverse(list);
  469.  
  470.         textArea.setText("");
  471.         for (int i = 0; i < list.size(); i++) {
  472.             textArea.append(list.get(i));
  473.             if (i < list.size() - 1)
  474.                 textArea.append("\n");
  475.         }
  476.     }
  477.  
  478.     public static void main(String[] args) {
  479.         SwingUtilities.invokeLater(() -> new Application());
  480.     }
  481. }
Add Comment
Please, Sign In to add comment