Files
guify/Guify/src/views/Notepad.java
Alessandro Ferro 1cfba5fbb3 bugfix
Fixed a bug showing "UNSAVED" at the mere opening of a file
2023-08-04 17:30:39 +02:00

180 lines
5.5 KiB
Java

package views;
import java.awt.Color;
import javax.imageio.ImageIO;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import code.GuiAbstractions.Implementations.JGenericTextArea;
import controllers.NotepadController;
import views.interfaces.INotepadFrame;
import java.awt.Font;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import javax.swing.JScrollPane;
public class Notepad extends JFrame implements INotepadFrame {
private static final long serialVersionUID = 1L;
private NotepadController controller;
private boolean jtextAreaShouldListenForChanges = true;
private JTextArea textArea;
/**
* Create the application.
*/
public Notepad(Object controller) {
this.controller = (NotepadController) controller;
setTitle(this.controller.getFilePath());
setBounds(100, 100, 800, 600);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 38, 764, 512);
getContentPane().add(scrollPane);
textArea = new JTextArea();
scrollPane.setViewportView(textArea);
textArea.setTabSize(4);
textArea.setFont(new Font("Monospaced", Font.PLAIN, 14));
textArea.setCaretPosition(0);
textArea.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
// Called when text is inserted into the document
handleTextChange();
}
@Override
public void removeUpdate(DocumentEvent e) {
// Called when text is removed from the document
handleTextChange();
}
@Override
public void changedUpdate(DocumentEvent e) {
// Called when attributes of the document change
// NO OP
}
private void handleTextChange() {
if(!((NotepadController)controller).isUnsaved() && jtextAreaShouldListenForChanges) {
((NotepadController)controller).setUnsaved(true);
setTitle(((NotepadController)controller).getTitle());
}
}
});
JToolBar toolBar = new JToolBar();
toolBar.setFloatable(false);
toolBar.setBounds(10, 0, 614, 37);
toolBar.setBackground(new Color(240, 240, 240));
JButton saveBtn = new JButton();
saveBtn.setBorderPainted(false);
saveBtn.setBorder(new EmptyBorder(0, 0, 0, 0)); // Set empty border
saveBtn.setToolTipText("Save");
try {
saveBtn.setIcon(new ImageIcon(ImageIO.read(getClass().getClassLoader().getResource("save_icon.png")).getScaledInstance(25, 25, Image.SCALE_SMOOTH)));
saveBtn.setBackground(new Color(240, 240, 240));
saveBtn.setBorderPainted(false);
saveBtn.setEnabled(true);
}catch(IOException ex) {
saveBtn.setText("Save");
}
saveBtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
((NotepadController)controller).writeOnFile(textArea.getText());
((NotepadController)controller).setUnsaved(false);
setTitle(((NotepadController)controller).getTitle());
}
// Hover on
@Override
public void mouseEntered(MouseEvent e) {
if(saveBtn.isEnabled())
saveBtn.setBackground(new Color(220, 220, 220));
}
// Hover off
@Override
public void mouseExited(MouseEvent e) {
saveBtn.setBackground(new Color(240, 240, 240));
}
});
JButton searchBtn = new JButton();
searchBtn.setBorderPainted(false);
searchBtn.setBorder(new EmptyBorder(0, 0, 0, 0)); // Set empty border;
searchBtn.setToolTipText("Serch/Replace");
try {
searchBtn.setIcon(new ImageIcon(ImageIO.read(getClass().getClassLoader().getResource("search_icon.png")).getScaledInstance(25, 25, Image.SCALE_SMOOTH)));
searchBtn.setBackground(new Color(240, 240, 240));
searchBtn.setBorderPainted(false);
searchBtn.setEnabled(true);
}catch(IOException ex) {
searchBtn.setText("Serch/Replace");
}
searchBtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
((NotepadController)controller).showFindAndReplace(new JGenericTextArea(textArea));
}
// Hover on
@Override
public void mouseEntered(MouseEvent e) {
if(searchBtn.isEnabled())
searchBtn.setBackground(new Color(220, 220, 220));
}
// Hover off
@Override
public void mouseExited(MouseEvent e) {
searchBtn.setBackground(new Color(240, 240, 240));
}
});
toolBar.add(saveBtn);
toolBar.add(Box.createHorizontalStrut(15));
toolBar.add(searchBtn);
getContentPane().add(toolBar);
/**
* Close "Find and Replace" if this window
* gets closed
*/
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
((NotepadController)controller).disposeFindAndReplaceFrame();
}
});
}
/**
* Sets text in the JTextArea without triggering
* a text changed action
*/
public void displayContent(String content) {
jtextAreaShouldListenForChanges = false;
textArea.setText(content);
jtextAreaShouldListenForChanges = true;
}
}