From 79a11cf6cbe8eff3a34cdd271ff537f69ed8d34e Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 17 Oct 2023 15:19:08 +0300 Subject: [PATCH 1/6] Big code clean-up, added interfaces, and colored text --- Lab3/src/main/java/org/lumijiez/Main.java | 9 +-- .../main/java/org/lumijiez/base/Document.java | 33 +++++++++ .../java/org/lumijiez/enums/DiffType.java | 15 ++++ .../java/org/lumijiez/enums/FileType.java | 16 +++++ .../lumijiez/{util => enums}/StateType.java | 10 +-- .../main/java/org/lumijiez/gui/MainFrame.java | 33 ++++----- .../org/lumijiez/interfaces/IDocument.java | 10 +++ .../org/lumijiez/tracker/TrackerThread.java | 71 ++++++++----------- .../main/java/org/lumijiez/util/DiffType.java | 5 -- .../java/org/lumijiez/util/FileDiffer.java | 21 +++--- 10 files changed, 135 insertions(+), 88 deletions(-) create mode 100644 Lab3/src/main/java/org/lumijiez/base/Document.java create mode 100644 Lab3/src/main/java/org/lumijiez/enums/DiffType.java create mode 100644 Lab3/src/main/java/org/lumijiez/enums/FileType.java rename Lab3/src/main/java/org/lumijiez/{util => enums}/StateType.java (50%) create mode 100644 Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java delete mode 100644 Lab3/src/main/java/org/lumijiez/util/DiffType.java diff --git a/Lab3/src/main/java/org/lumijiez/Main.java b/Lab3/src/main/java/org/lumijiez/Main.java index aa6e1f9..b7c22c9 100644 --- a/Lab3/src/main/java/org/lumijiez/Main.java +++ b/Lab3/src/main/java/org/lumijiez/Main.java @@ -3,16 +3,9 @@ package org.lumijiez; import org.lumijiez.gui.MainFrame; import javax.swing.*; -import java.io.IOException; public class Main { public static void main(String[] args) { - SwingUtilities.invokeLater(() -> { - try { - new MainFrame().setVisible(true); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); + SwingUtilities.invokeLater(() -> new MainFrame().setVisible(true)); } } \ No newline at end of file diff --git a/Lab3/src/main/java/org/lumijiez/base/Document.java b/Lab3/src/main/java/org/lumijiez/base/Document.java new file mode 100644 index 0000000..8ea4612 --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/base/Document.java @@ -0,0 +1,33 @@ +package org.lumijiez.base; + +import org.lumijiez.enums.FileType; +import org.lumijiez.interfaces.IDocument; + +import java.util.Date; + +public class Document implements IDocument { + private String fullFilename = ""; + private FileType fileType; + private Date createdAt; + private Date modifiedAt; + + @Override + public String getFilename() { + return null; + } + + @Override + public String getExtension() { + return null; + } + + @Override + public Date getCreatedTime() { + return null; + } + + @Override + public Date getModificationTime() { + return null; + } +} diff --git a/Lab3/src/main/java/org/lumijiez/enums/DiffType.java b/Lab3/src/main/java/org/lumijiez/enums/DiffType.java new file mode 100644 index 0000000..55e060e --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/enums/DiffType.java @@ -0,0 +1,15 @@ +package org.lumijiez.enums; + +public enum DiffType { + CREATE(StateType.NEW), DELETE(StateType.DELETED), MODIFY(StateType.MODIFIED), NONE(StateType.NONE); + + private final StateType type; + + DiffType(StateType type) { + this.type = type; + } + + public StateType getState() { + return type; + } +} diff --git a/Lab3/src/main/java/org/lumijiez/enums/FileType.java b/Lab3/src/main/java/org/lumijiez/enums/FileType.java new file mode 100644 index 0000000..17077c4 --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/enums/FileType.java @@ -0,0 +1,16 @@ +package org.lumijiez.enums; + +import java.util.ArrayList; +import java.util.List; + +public enum FileType { + IMAGE, PLAINTEXT, FILE, CODE; + public List typeExtensions; + + static { + IMAGE.typeExtensions = new ArrayList<>(List.of("jpg", "png")); + PLAINTEXT.typeExtensions = new ArrayList<>(List.of("txt", "csv")); + FILE.typeExtensions = new ArrayList<>(List.of("doc", "pdf", "zip")); + CODE.typeExtensions = new ArrayList<>(List.of("java", "cpp", "py")); + } +} diff --git a/Lab3/src/main/java/org/lumijiez/util/StateType.java b/Lab3/src/main/java/org/lumijiez/enums/StateType.java similarity index 50% rename from Lab3/src/main/java/org/lumijiez/util/StateType.java rename to Lab3/src/main/java/org/lumijiez/enums/StateType.java index 66483ab..ee0a836 100644 --- a/Lab3/src/main/java/org/lumijiez/util/StateType.java +++ b/Lab3/src/main/java/org/lumijiez/enums/StateType.java @@ -1,14 +1,14 @@ -package org.lumijiez.util; +package org.lumijiez.enums; public enum StateType { NEW("Created"), MODIFIED("Modified"), DELETED("Deleted"), NONE("Nothing"); - private final String name; + private final String action; StateType(String name) { - this.name = name; + this.action = name; } - public String getName() { - return this.name; + public String getAction() { + return this.action; } } diff --git a/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java b/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java index 0d31c42..8064db8 100644 --- a/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java +++ b/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java @@ -4,16 +4,18 @@ import org.lumijiez.tracker.TrackerThread; import javax.swing.*; import java.awt.*; import java.io.File; -import java.io.IOException; import java.nio.file.Path; import java.util.*; public class MainFrame extends JFrame { + public static Path FOLDER_PATH; private final JScrollPane fileListScrollPane = new JScrollPane(); + private final JScrollPane fileInfoScrollPane = new JScrollPane(); private final JList fileList = new JList<>(); private final JLabel pathLabel = new JLabel(); private final JScrollPane mainScrollPane = new JScrollPane(); private final JTextPane mainTextPane = new JTextPane(); + private final JTextPane fileInfoTextPane = new JTextPane(); private final JLabel snapshotLabel = new JLabel(); private final JButton CommitButton = new JButton(); private final JButton StatusButton = new JButton(); @@ -25,7 +27,7 @@ public class MainFrame extends JFrame { private final Map fileContents = new HashMap<>(); private TrackerThread tracker; - public MainFrame() throws IOException { + public MainFrame() { initComponents(); } @@ -40,20 +42,22 @@ public class MainFrame extends JFrame { int returnVal = folderChooser.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { - tracker = new TrackerThread(mainTextPane, Path.of(folderChooser.getSelectedFile().getAbsolutePath()), fileContents, fileList); + FOLDER_PATH = Path.of(folderChooser.getSelectedFile().getAbsolutePath()); + tracker = new TrackerThread(mainTextPane, fileContents, fileList); tracker.start(); } fileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fileListScrollPane.setViewportView(fileList); - snapshotLabel.setFont(new java.awt.Font("Trebuchet MS", Font.PLAIN, 18)); // NOI18N + snapshotLabel.setFont(new java.awt.Font("Trebuchet MS", Font.PLAIN, 18)); snapshotLabel.setText("Last snapshot: " + new Date()); mainScrollPane.setViewportView(mainTextPane); + fileInfoScrollPane.setViewportView(fileInfoTextPane); - pathLabel.setFont(new java.awt.Font("Trebuchet MS", Font.PLAIN, 18)); // NOI18N - pathLabel.setText("Currently tracking: " + folderChooser.getSelectedFile().getAbsolutePath()); + pathLabel.setFont(new java.awt.Font("Trebuchet MS", Font.PLAIN, 18)); + pathLabel.setText("Currently tracking: " + FOLDER_PATH.toString()); CommitButton.setText("Commit"); CommitButton.addActionListener(this::CommitButtonActionPerformed); @@ -84,35 +88,32 @@ public class MainFrame extends JFrame { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) - .addComponent(pathLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(snapshotLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(pathLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(fileListScrollPane, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(mainScrollPane, GroupLayout.PREFERRED_SIZE, 599, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(CommitButton) - .addGap(0, 1, Short.MAX_VALUE)) - .addComponent(StatusButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addComponent(CommitButton, GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE) + .addComponent(fileInfoScrollPane)))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(snapshotLabel, GroupLayout.PREFERRED_SIZE, 28, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(pathLabel, GroupLayout.PREFERRED_SIZE, 28, GroupLayout.PREFERRED_SIZE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) - .addComponent(fileListScrollPane, GroupLayout.DEFAULT_SIZE, 573, Short.MAX_VALUE) - .addComponent(mainScrollPane)) + .addComponent(fileListScrollPane, GroupLayout.DEFAULT_SIZE, 573, Short.MAX_VALUE) + .addComponent(mainScrollPane) .addGroup(layout.createSequentialGroup() .addComponent(CommitButton) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) - .addComponent(StatusButton))) + .addComponent(fileInfoScrollPane))) .addContainerGap())); pack(); } diff --git a/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java b/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java new file mode 100644 index 0000000..998d968 --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java @@ -0,0 +1,10 @@ +package org.lumijiez.interfaces; + +import java.util.Date; + +public interface IDocument { + public String getFilename(); + public String getExtension(); + public Date getCreatedTime(); + public Date getModificationTime(); +} diff --git a/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java b/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java index b50045b..b890c7e 100644 --- a/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java +++ b/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java @@ -1,26 +1,24 @@ package org.lumijiez.tracker; -import org.lumijiez.util.DiffType; +import org.lumijiez.gui.MainFrame; +import org.lumijiez.enums.DiffType; import org.lumijiez.util.FileDiffer; -import org.lumijiez.util.StateType; +import org.lumijiez.enums.StateType; import javax.swing.*; import java.io.File; -import java.nio.file.*; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class TrackerThread extends Thread { private final JTextPane textPane; - private final Path path; private Map fileContents; - private final JList fileList; private final Map fileStates = new HashMap<>(); + private final JList fileList; - public TrackerThread(JTextPane textPane, Path path, Map files, JList fileList) { + public TrackerThread(JTextPane textPane, Map files, JList fileList) { this.textPane = textPane; - this.path = path; this.fileContents = files; this.fileList = fileList; init(); @@ -28,19 +26,14 @@ public class TrackerThread extends Thread { public void init() { System.out.println("Init called"); - fileContents = FileDiffer.crawlDirectory(path); - - ArrayList fileNames = new ArrayList<>(); - - for (File file : fileContents.keySet()) { - fileNames.add(file.getName()); - } + fileContents = FileDiffer.crawlDirectory(MainFrame.FOLDER_PATH); + ArrayList fList = new ArrayList<>(fileContents.keySet()); fileList.setModel(new AbstractListModel<>() { public int getSize() { - return fileNames.size(); + return fList.size(); } public String getElementAt(int i) { - return fileNames.get(i); + return fList.get(i).getName(); } }); } @@ -50,42 +43,37 @@ public class TrackerThread extends Thread { } public void checkDirectory() { - Map> result = FileDiffer.diff(fileContents, FileDiffer.crawlDirectory(path)); + Map> result = FileDiffer.diff(fileContents, FileDiffer.crawlDirectory(MainFrame.FOLDER_PATH)); StringBuilder toShow = new StringBuilder(); - boolean created = false, deleted = false, modified = false; - if (!result.get(DiffType.CREATE).isEmpty()) { - created = true; - for (File file : result.get(DiffType.CREATE)) { - fileStates.put(file, StateType.NEW); + boolean somethingNew = false; + + for (DiffType type : result.keySet()) { + for (File file : result.get(type)) { + somethingNew = true; + System.out.println("File changed " + file.getName() + " " + type.getState().getAction()); + fileStates.put(file, type.getState()); } - System.out.println("Created"); } - if (!result.get(DiffType.DELETE).isEmpty()) { - deleted = true; - for (File file : result.get(DiffType.DELETE)) { - fileStates.put(file, StateType.DELETED); - } - System.out.println("Deleted"); - } - - if (!result.get(DiffType.MODIFY).isEmpty()) { - modified = true; - for (File file : result.get(DiffType.MODIFY)) { - fileStates.put(file, StateType.MODIFIED); - } - System.out.println("Modified"); - } - - if (created || deleted || modified) { + if (somethingNew) { init(); for (File file : fileStates.keySet()) { if (fileStates.get(file) != StateType.NONE) { - toShow.append(file.getName()).append(" has been ").append(fileStates.get(file).getName()).append("
"); + if (fileStates.get(file) == StateType.NEW) { + toShow.append(""); + } + if (fileStates.get(file) == StateType.DELETED) { + toShow.append(""); + } + if (fileStates.get(file) == StateType.MODIFIED) { + toShow.append(""); + } + toShow.append(file.getName()).append(" has been ").append(fileStates.get(file).getAction()).append("
"); } } + // System.out.println(toShow.toString()); textPane.setText(toShow.toString()); } } @@ -94,7 +82,6 @@ public class TrackerThread extends Thread { public void run() { while(this.isAlive()) { checkDirectory(); - //Thread.sleep(200); } } } diff --git a/Lab3/src/main/java/org/lumijiez/util/DiffType.java b/Lab3/src/main/java/org/lumijiez/util/DiffType.java deleted file mode 100644 index 2be9dfd..0000000 --- a/Lab3/src/main/java/org/lumijiez/util/DiffType.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.lumijiez.util; - -public enum DiffType { - CREATE, DELETE, MODIFY, NONE -} diff --git a/Lab3/src/main/java/org/lumijiez/util/FileDiffer.java b/Lab3/src/main/java/org/lumijiez/util/FileDiffer.java index 5316fe5..4d6e515 100644 --- a/Lab3/src/main/java/org/lumijiez/util/FileDiffer.java +++ b/Lab3/src/main/java/org/lumijiez/util/FileDiffer.java @@ -1,5 +1,7 @@ package org.lumijiez.util; +import org.lumijiez.enums.DiffType; + import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -12,32 +14,27 @@ import java.util.stream.Stream; public class FileDiffer { public static Map> diff(Map oldFiles, Map newFiles) { - Map> result = new HashMap<>(); - - ArrayList newFileList = new ArrayList<>(); - ArrayList deletedFileList = new ArrayList<>(); - ArrayList modifiedFileList = new ArrayList<>(); + Map> result = Map.of( + DiffType.CREATE, new ArrayList<>(), + DiffType.DELETE, new ArrayList<>(), + DiffType.MODIFY, new ArrayList<>()); for (File file : oldFiles.keySet()) { if (newFiles.get(file) != null) { if (Arrays.compare(oldFiles.get(file), newFiles.get(file)) != 0) { - modifiedFileList.add(file); + result.get(DiffType.MODIFY).add(file); } } else { - deletedFileList.add(file); + result.get(DiffType.DELETE).add(file); } } for (File file : newFiles.keySet()) { if (oldFiles.get(file) == null) { - newFileList.add(file); + result.get(DiffType.CREATE).add(file); } } - result.put(DiffType.CREATE, newFileList); - result.put(DiffType.DELETE, deletedFileList); - result.put(DiffType.MODIFY, modifiedFileList); - return result; } From 3589237e33b699bb3c2098f60445f060fa4c1b1e Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 17 Oct 2023 15:48:37 +0300 Subject: [PATCH 2/6] Added Document subclasses --- .../java/org/lumijiez/base/ArbitraryFile.java | 9 ++++ .../main/java/org/lumijiez/base/CodeFile.java | 9 ++++ .../main/java/org/lumijiez/base/Document.java | 42 +++++++++++++++---- .../java/org/lumijiez/base/ImageFile.java | 9 ++++ .../main/java/org/lumijiez/base/TextFile.java | 9 ++++ .../java/org/lumijiez/enums/FileType.java | 16 ++++++- .../org/lumijiez/interfaces/IDocument.java | 4 +- 7 files changed, 88 insertions(+), 10 deletions(-) create mode 100644 Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java create mode 100644 Lab3/src/main/java/org/lumijiez/base/CodeFile.java create mode 100644 Lab3/src/main/java/org/lumijiez/base/ImageFile.java create mode 100644 Lab3/src/main/java/org/lumijiez/base/TextFile.java diff --git a/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java b/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java new file mode 100644 index 0000000..2c1cfc1 --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java @@ -0,0 +1,9 @@ +package org.lumijiez.base; + +import java.nio.file.Path; + +public class ArbitraryFile extends Document{ + public ArbitraryFile(Path path) { + super(path); + } +} diff --git a/Lab3/src/main/java/org/lumijiez/base/CodeFile.java b/Lab3/src/main/java/org/lumijiez/base/CodeFile.java new file mode 100644 index 0000000..8d6a7b1 --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/base/CodeFile.java @@ -0,0 +1,9 @@ +package org.lumijiez.base; + +import java.nio.file.Path; + +public class CodeFile extends Document{ + public CodeFile(Path path) { + super(path); + } +} diff --git a/Lab3/src/main/java/org/lumijiez/base/Document.java b/Lab3/src/main/java/org/lumijiez/base/Document.java index 8ea4612..395fb58 100644 --- a/Lab3/src/main/java/org/lumijiez/base/Document.java +++ b/Lab3/src/main/java/org/lumijiez/base/Document.java @@ -3,31 +3,57 @@ package org.lumijiez.base; import org.lumijiez.enums.FileType; import org.lumijiez.interfaces.IDocument; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.BasicFileAttributes; import java.util.Date; -public class Document implements IDocument { - private String fullFilename = ""; +public class Document extends File implements IDocument { + private String extension; private FileType fileType; - private Date createdAt; - private Date modifiedAt; - @Override - public String getFilename() { - return null; + public Document(Path path) { + super(path.toString()); + init(); + } + + private void init() { + int lastDotIndex = getName().lastIndexOf('.'); + extension = (lastDotIndex > 0) ? getName().substring(lastDotIndex + 1) : ""; + fileType = FileType.getFileType(extension); } @Override public String getExtension() { - return null; + return extension; } @Override public Date getCreatedTime() { + try { + BasicFileAttributes fileAttributes = Files.readAttributes(Path.of(this.getPath()), BasicFileAttributes.class); + return new Date(fileAttributes.creationTime().toMillis()); + } catch (IOException e) { + e.printStackTrace(); + } return null; } @Override public Date getModificationTime() { + try { + BasicFileAttributes fileAttributes = Files.readAttributes(Path.of(this.getPath()), BasicFileAttributes.class); + return new Date(fileAttributes.lastAccessTime().toMillis()); + } catch (IOException e) { + e.printStackTrace(); + } return null; } + + @Override + public FileType getFileType() { + return fileType; + } } diff --git a/Lab3/src/main/java/org/lumijiez/base/ImageFile.java b/Lab3/src/main/java/org/lumijiez/base/ImageFile.java new file mode 100644 index 0000000..e7f7055 --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/base/ImageFile.java @@ -0,0 +1,9 @@ +package org.lumijiez.base; + +import java.nio.file.Path; + +public class ImageFile extends Document{ + public ImageFile(Path path) { + super(path); + } +} diff --git a/Lab3/src/main/java/org/lumijiez/base/TextFile.java b/Lab3/src/main/java/org/lumijiez/base/TextFile.java new file mode 100644 index 0000000..e45a1ed --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/base/TextFile.java @@ -0,0 +1,9 @@ +package org.lumijiez.base; + +import java.nio.file.Path; + +public class TextFile extends Document { + public TextFile(Path path) { + super(path); + } +} diff --git a/Lab3/src/main/java/org/lumijiez/enums/FileType.java b/Lab3/src/main/java/org/lumijiez/enums/FileType.java index 17077c4..31b8be4 100644 --- a/Lab3/src/main/java/org/lumijiez/enums/FileType.java +++ b/Lab3/src/main/java/org/lumijiez/enums/FileType.java @@ -4,8 +4,22 @@ import java.util.ArrayList; import java.util.List; public enum FileType { - IMAGE, PLAINTEXT, FILE, CODE; + IMAGE("Image"), PLAINTEXT("Plaintext"), FILE("File"), CODE("Code"), NONE("None"); public List typeExtensions; + public final String typeName; + + FileType(String typeName) { + this.typeName = typeName; + } + + public static FileType getFileType(String extension) { + for (FileType fileType : values()) { + if (fileType.typeExtensions.contains(extension.toLowerCase())) { + return fileType; + } + } + return NONE; + } static { IMAGE.typeExtensions = new ArrayList<>(List.of("jpg", "png")); diff --git a/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java b/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java index 998d968..399a7ea 100644 --- a/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java +++ b/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java @@ -1,10 +1,12 @@ package org.lumijiez.interfaces; +import org.lumijiez.enums.FileType; + import java.util.Date; public interface IDocument { - public String getFilename(); public String getExtension(); public Date getCreatedTime(); public Date getModificationTime(); + public FileType getFileType(); } From 15887bd1b6d20b4a9840d84297988fdcf4a019c2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 17 Oct 2023 16:48:44 +0300 Subject: [PATCH 3/6] Fixed a lot of logic, replaced Files with Documents --- .../java/org/lumijiez/base/ArbitraryFile.java | 5 +++ .../main/java/org/lumijiez/base/CodeFile.java | 5 +++ .../main/java/org/lumijiez/base/Document.java | 16 +++++++ .../java/org/lumijiez/base/ImageFile.java | 19 +++++++- .../java/org/lumijiez/enums/FileType.java | 23 ++++++---- .../main/java/org/lumijiez/gui/MainFrame.java | 8 ++-- .../org/lumijiez/interfaces/IDocument.java | 10 +++-- .../org/lumijiez/tracker/TrackerThread.java | 43 ++++++++++++++----- .../java/org/lumijiez/util/FileDiffer.java | 19 ++++---- .../java/org/lumijiez/util/FileFactory.java | 17 ++++++++ 10 files changed, 128 insertions(+), 37 deletions(-) create mode 100644 Lab3/src/main/java/org/lumijiez/util/FileFactory.java diff --git a/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java b/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java index 2c1cfc1..30bd32e 100644 --- a/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java +++ b/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java @@ -6,4 +6,9 @@ public class ArbitraryFile extends Document{ public ArbitraryFile(Path path) { super(path); } + + @Override + public String getInfo() { + return "ARBITRARY"; + } } diff --git a/Lab3/src/main/java/org/lumijiez/base/CodeFile.java b/Lab3/src/main/java/org/lumijiez/base/CodeFile.java index 8d6a7b1..57e688c 100644 --- a/Lab3/src/main/java/org/lumijiez/base/CodeFile.java +++ b/Lab3/src/main/java/org/lumijiez/base/CodeFile.java @@ -6,4 +6,9 @@ public class CodeFile extends Document{ public CodeFile(Path path) { super(path); } + + @Override + public String getInfo() { + return "CODE"; + } } diff --git a/Lab3/src/main/java/org/lumijiez/base/Document.java b/Lab3/src/main/java/org/lumijiez/base/Document.java index 395fb58..737fba2 100644 --- a/Lab3/src/main/java/org/lumijiez/base/Document.java +++ b/Lab3/src/main/java/org/lumijiez/base/Document.java @@ -56,4 +56,20 @@ public class Document extends File implements IDocument { public FileType getFileType() { return fileType; } + + @Override + public long getFilesizeKB() { + try { + BasicFileAttributes fileAttributes = Files.readAttributes(Path.of(this.getPath()), BasicFileAttributes.class); + return fileAttributes.size() / 1024; + } catch (IOException e) { + e.printStackTrace(); + } + return 0; + } + + @Override + public String getInfo() { + return "Name: " + getName() + " Size: " + getFilesizeKB() + "Type: " + getFileType().getTypeName(); + } } diff --git a/Lab3/src/main/java/org/lumijiez/base/ImageFile.java b/Lab3/src/main/java/org/lumijiez/base/ImageFile.java index e7f7055..54ebce8 100644 --- a/Lab3/src/main/java/org/lumijiez/base/ImageFile.java +++ b/Lab3/src/main/java/org/lumijiez/base/ImageFile.java @@ -1,9 +1,26 @@ package org.lumijiez.base; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; import java.nio.file.Path; -public class ImageFile extends Document{ +public class ImageFile extends Document { public ImageFile(Path path) { super(path); } + @Override + public String getInfo() { + try { + BufferedImage image = ImageIO.read(this); + if (image != null) { + int width = image.getWidth(); + int height = image.getHeight(); + return "IMAGE " + width + "x" + height; + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } } diff --git a/Lab3/src/main/java/org/lumijiez/enums/FileType.java b/Lab3/src/main/java/org/lumijiez/enums/FileType.java index 31b8be4..9dc612b 100644 --- a/Lab3/src/main/java/org/lumijiez/enums/FileType.java +++ b/Lab3/src/main/java/org/lumijiez/enums/FileType.java @@ -4,12 +4,18 @@ import java.util.ArrayList; import java.util.List; public enum FileType { - IMAGE("Image"), PLAINTEXT("Plaintext"), FILE("File"), CODE("Code"), NONE("None"); - public List typeExtensions; - public final String typeName; + IMAGE("Image", new ArrayList<>(List.of("jpg", "png"))), + PLAINTEXT("Plaintext", new ArrayList<>(List.of("txt", "csv"))), + FILE("File", new ArrayList<>(List.of("doc", "pdf", "zip"))), + CODE("Code", new ArrayList<>(List.of("java", "cpp", "py"))), + NONE("None", new ArrayList<>()); - FileType(String typeName) { + private final List typeExtensions; + private final String typeName; + + FileType(String typeName, ArrayList list) { this.typeName = typeName; + this.typeExtensions = list; } public static FileType getFileType(String extension) { @@ -21,10 +27,9 @@ public enum FileType { return NONE; } - static { - IMAGE.typeExtensions = new ArrayList<>(List.of("jpg", "png")); - PLAINTEXT.typeExtensions = new ArrayList<>(List.of("txt", "csv")); - FILE.typeExtensions = new ArrayList<>(List.of("doc", "pdf", "zip")); - CODE.typeExtensions = new ArrayList<>(List.of("java", "cpp", "py")); + public String getTypeName() { + return typeName; } + + } diff --git a/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java b/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java index 8064db8..bde11c4 100644 --- a/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java +++ b/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java @@ -1,9 +1,9 @@ package org.lumijiez.gui; +import org.lumijiez.base.Document; import org.lumijiez.tracker.TrackerThread; import javax.swing.*; import java.awt.*; -import java.io.File; import java.nio.file.Path; import java.util.*; @@ -11,7 +11,7 @@ public class MainFrame extends JFrame { public static Path FOLDER_PATH; private final JScrollPane fileListScrollPane = new JScrollPane(); private final JScrollPane fileInfoScrollPane = new JScrollPane(); - private final JList fileList = new JList<>(); + private final JList fileList = new JList<>(); private final JLabel pathLabel = new JLabel(); private final JScrollPane mainScrollPane = new JScrollPane(); private final JTextPane mainTextPane = new JTextPane(); @@ -24,7 +24,7 @@ public class MainFrame extends JFrame { private final JMenuItem pickFolder = new JMenuItem(); private final JMenu settingsMenu = new JMenu(); private final JMenuItem settings = new JMenuItem(); - private final Map fileContents = new HashMap<>(); + private final Map fileContents = new HashMap<>(); private TrackerThread tracker; public MainFrame() { @@ -43,7 +43,7 @@ public class MainFrame extends JFrame { int returnVal = folderChooser.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { FOLDER_PATH = Path.of(folderChooser.getSelectedFile().getAbsolutePath()); - tracker = new TrackerThread(mainTextPane, fileContents, fileList); + tracker = new TrackerThread(mainTextPane, fileContents, fileList, fileInfoTextPane); tracker.start(); } diff --git a/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java b/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java index 399a7ea..e6232fd 100644 --- a/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java +++ b/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java @@ -5,8 +5,10 @@ import org.lumijiez.enums.FileType; import java.util.Date; public interface IDocument { - public String getExtension(); - public Date getCreatedTime(); - public Date getModificationTime(); - public FileType getFileType(); + String getExtension(); + Date getCreatedTime(); + Date getModificationTime(); + FileType getFileType(); + long getFilesizeKB(); + String getInfo(); } diff --git a/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java b/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java index b890c7e..fcf05b1 100644 --- a/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java +++ b/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java @@ -1,11 +1,14 @@ package org.lumijiez.tracker; +import org.lumijiez.base.Document; import org.lumijiez.gui.MainFrame; import org.lumijiez.enums.DiffType; import org.lumijiez.util.FileDiffer; import org.lumijiez.enums.StateType; +import org.lumijiez.util.FileFactory; import javax.swing.*; +import java.awt.*; import java.io.File; import java.util.ArrayList; import java.util.HashMap; @@ -13,37 +16,57 @@ import java.util.Map; public class TrackerThread extends Thread { private final JTextPane textPane; - private Map fileContents; + private Map fileContents; private final Map fileStates = new HashMap<>(); - private final JList fileList; + private final JList fileList; + private final JTextPane fileInfoTextPane; - public TrackerThread(JTextPane textPane, Map files, JList fileList) { + public TrackerThread(JTextPane textPane, Map files, JList fileList, JTextPane fileInfoTextPane) { this.textPane = textPane; this.fileContents = files; this.fileList = fileList; + this.fileInfoTextPane = fileInfoTextPane; init(); } public void init() { System.out.println("Init called"); fileContents = FileDiffer.crawlDirectory(MainFrame.FOLDER_PATH); - ArrayList fList = new ArrayList<>(fileContents.keySet()); - fileList.setModel(new AbstractListModel<>() { - public int getSize() { - return fList.size(); + DefaultListModel listModel = new DefaultListModel<>(); + + for (File file : fileContents.keySet()) { + Document doc = FileFactory.getDocument(file.toPath()); + listModel.addElement(doc); + } + + fileList.setModel(listModel); + fileList.setCellRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + if (value instanceof Document) { + value = ((Document) value).getName(); + } + return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } - public String getElementAt(int i) { - return fList.get(i).getName(); + }); + + fileList.addListSelectionListener(e -> { + if (!e.getValueIsAdjusting()) { + Document selectedDocument = fileList.getSelectedValue(); + if (selectedDocument != null) { + fileInfoTextPane.setText(selectedDocument.getInfo()); + } } }); } + public void reset() { fileStates.clear(); } public void checkDirectory() { - Map> result = FileDiffer.diff(fileContents, FileDiffer.crawlDirectory(MainFrame.FOLDER_PATH)); + Map> result = FileDiffer.diff(fileContents, FileDiffer.crawlDirectory(MainFrame.FOLDER_PATH)); StringBuilder toShow = new StringBuilder(); diff --git a/Lab3/src/main/java/org/lumijiez/util/FileDiffer.java b/Lab3/src/main/java/org/lumijiez/util/FileDiffer.java index 4d6e515..60e3844 100644 --- a/Lab3/src/main/java/org/lumijiez/util/FileDiffer.java +++ b/Lab3/src/main/java/org/lumijiez/util/FileDiffer.java @@ -1,8 +1,8 @@ package org.lumijiez.util; +import org.lumijiez.base.Document; import org.lumijiez.enums.DiffType; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -13,13 +13,13 @@ import java.util.Map; import java.util.stream.Stream; public class FileDiffer { - public static Map> diff(Map oldFiles, Map newFiles) { - Map> result = Map.of( + public static Map> diff(Map oldFiles, Map newFiles) { + Map> result = Map.of( DiffType.CREATE, new ArrayList<>(), DiffType.DELETE, new ArrayList<>(), DiffType.MODIFY, new ArrayList<>()); - for (File file : oldFiles.keySet()) { + for (Document file : oldFiles.keySet()) { if (newFiles.get(file) != null) { if (Arrays.compare(oldFiles.get(file), newFiles.get(file)) != 0) { result.get(DiffType.MODIFY).add(file); @@ -29,7 +29,7 @@ public class FileDiffer { } } - for (File file : newFiles.keySet()) { + for (Document file : newFiles.keySet()) { if (oldFiles.get(file) == null) { result.get(DiffType.CREATE).add(file); } @@ -38,13 +38,14 @@ public class FileDiffer { return result; } - public static Map crawlDirectory(Path path) { - Map newFileContents = new HashMap<>(); + public static Map crawlDirectory(Path path) { + Map newFileContents = new HashMap<>(); try (Stream paths = Files.walk(path)) { paths.forEach(p -> { - if (Files.isRegularFile(p)) { + Document doc = new Document(p); + if (Files.isRegularFile(doc.toPath())) { try { - newFileContents.put(p.toFile(), Files.readAllBytes(p)); + newFileContents.put(doc, Files.readAllBytes(doc.toPath())); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/Lab3/src/main/java/org/lumijiez/util/FileFactory.java b/Lab3/src/main/java/org/lumijiez/util/FileFactory.java new file mode 100644 index 0000000..c7d0294 --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/util/FileFactory.java @@ -0,0 +1,17 @@ +package org.lumijiez.util; + +import org.lumijiez.base.*; +import org.lumijiez.enums.FileType; + +import java.nio.file.Path; + +public class FileFactory { + public static Document getDocument(Path path) { + Document doc = new Document(path); + if (doc.getFileType() == FileType.PLAINTEXT) return new TextFile(path); + if (doc.getFileType() == FileType.IMAGE) return new ImageFile(path); + if (doc.getFileType() == FileType.FILE) return new ArbitraryFile(path); + if (doc.getFileType() == FileType.CODE) return new CodeFile(path); + return doc; + } +} From 0ab6addf636fb92f67a820f35d325c5b7d11870d Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 18 Oct 2023 00:02:06 +0300 Subject: [PATCH 4/6] Implemented information for all files, some parts WIP --- .../java/org/lumijiez/base/ArbitraryFile.java | 8 ++- .../main/java/org/lumijiez/base/CodeFile.java | 11 +++- .../main/java/org/lumijiez/base/Document.java | 25 ++++++-- .../java/org/lumijiez/base/ImageFile.java | 13 +++-- .../main/java/org/lumijiez/base/TextFile.java | 16 +++++ .../main/java/org/lumijiez/gui/MainFrame.java | 58 ++++++++----------- .../org/lumijiez/interfaces/IDocument.java | 6 +- .../org/lumijiez/tracker/TrackerThread.java | 6 +- .../java/org/lumijiez/util/FileFactory.java | 19 ++++-- .../main/java/org/lumijiez/util/Utils.java | 51 ++++++++++++++++ 10 files changed, 156 insertions(+), 57 deletions(-) create mode 100644 Lab3/src/main/java/org/lumijiez/util/Utils.java diff --git a/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java b/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java index 30bd32e..e784d03 100644 --- a/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java +++ b/Lab3/src/main/java/org/lumijiez/base/ArbitraryFile.java @@ -9,6 +9,12 @@ public class ArbitraryFile extends Document{ @Override public String getInfo() { - return "ARBITRARY"; + StringBuilder info = new StringBuilder(); + info.append("Type: ").append(getFileType().getTypeName()).append("
"); + info.append("Extension: ").append(getExtension().toUpperCase()).append("
"); + info.append("File size: ").append(getFilesizeKB()).append(" KB").append("
"); + info.append("Created at: ").append(getCreatedTime()).append("
"); + info.append("Modified at: ").append(getModificationTime()).append("
"); + return info.toString(); } } diff --git a/Lab3/src/main/java/org/lumijiez/base/CodeFile.java b/Lab3/src/main/java/org/lumijiez/base/CodeFile.java index 57e688c..9e5703f 100644 --- a/Lab3/src/main/java/org/lumijiez/base/CodeFile.java +++ b/Lab3/src/main/java/org/lumijiez/base/CodeFile.java @@ -1,5 +1,7 @@ package org.lumijiez.base; +import org.lumijiez.util.Utils; + import java.nio.file.Path; public class CodeFile extends Document{ @@ -9,6 +11,13 @@ public class CodeFile extends Document{ @Override public String getInfo() { - return "CODE"; + StringBuilder info = new StringBuilder(); + info.append("Type: ").append(getFileType().getTypeName()).append("
"); + info.append("Extension: ").append(getExtension().toUpperCase()).append("
"); + info.append("File size: ").append(getFilesizeKB()).append(" KB").append("
"); + info.append("Lines: ").append(Utils.countLines(this)).append("
"); + info.append("Created at: ").append(getCreatedTime()).append("
"); + info.append("Modified at: ").append(getModificationTime()).append("
"); + return info.toString(); } } diff --git a/Lab3/src/main/java/org/lumijiez/base/Document.java b/Lab3/src/main/java/org/lumijiez/base/Document.java index 737fba2..2de230a 100644 --- a/Lab3/src/main/java/org/lumijiez/base/Document.java +++ b/Lab3/src/main/java/org/lumijiez/base/Document.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; +import java.text.SimpleDateFormat; import java.util.Date; public class Document extends File implements IDocument { @@ -31,10 +32,18 @@ public class Document extends File implements IDocument { } @Override - public Date getCreatedTime() { + public String getCreatedTime() { try { BasicFileAttributes fileAttributes = Files.readAttributes(Path.of(this.getPath()), BasicFileAttributes.class); - return new Date(fileAttributes.creationTime().toMillis()); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yy"); + SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); + + Date date = new Date(fileAttributes.creationTime().toMillis()); + + String formattedDate = dateFormat.format(date); + String formattedTime = timeFormat.format(date); + + return formattedTime + " " + formattedDate; } catch (IOException e) { e.printStackTrace(); } @@ -42,10 +51,18 @@ public class Document extends File implements IDocument { } @Override - public Date getModificationTime() { + public String getModificationTime() { try { BasicFileAttributes fileAttributes = Files.readAttributes(Path.of(this.getPath()), BasicFileAttributes.class); - return new Date(fileAttributes.lastAccessTime().toMillis()); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yy"); + SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); + + Date date = new Date(fileAttributes.lastModifiedTime().toMillis()); + + String formattedDate = dateFormat.format(date); + String formattedTime = timeFormat.format(date); + + return formattedTime + " " + formattedDate; } catch (IOException e) { e.printStackTrace(); } diff --git a/Lab3/src/main/java/org/lumijiez/base/ImageFile.java b/Lab3/src/main/java/org/lumijiez/base/ImageFile.java index 54ebce8..b11887e 100644 --- a/Lab3/src/main/java/org/lumijiez/base/ImageFile.java +++ b/Lab3/src/main/java/org/lumijiez/base/ImageFile.java @@ -12,12 +12,15 @@ public class ImageFile extends Document { @Override public String getInfo() { try { + StringBuilder info = new StringBuilder(); + info.append("Type: ").append(getFileType().getTypeName()).append("
"); + info.append("Extension: ").append(getExtension().toUpperCase()).append("
"); BufferedImage image = ImageIO.read(this); - if (image != null) { - int width = image.getWidth(); - int height = image.getHeight(); - return "IMAGE " + width + "x" + height; - } + info.append("Dimensions: ").append(image.getWidth()).append("x").append(image.getHeight()).append("
"); + info.append("File size: ").append(getFilesizeKB()).append(" KB").append("
"); + info.append("Created at: ").append(getCreatedTime()).append("
"); + info.append("Modified at: ").append(getModificationTime()).append("
"); + return info.toString(); } catch (IOException e) { e.printStackTrace(); } diff --git a/Lab3/src/main/java/org/lumijiez/base/TextFile.java b/Lab3/src/main/java/org/lumijiez/base/TextFile.java index e45a1ed..2784817 100644 --- a/Lab3/src/main/java/org/lumijiez/base/TextFile.java +++ b/Lab3/src/main/java/org/lumijiez/base/TextFile.java @@ -1,9 +1,25 @@ package org.lumijiez.base; +import org.lumijiez.util.Utils; + import java.nio.file.Path; public class TextFile extends Document { public TextFile(Path path) { super(path); } + + @Override + public String getInfo() { + StringBuilder info = new StringBuilder(); + info.append("Type: ").append(getFileType().getTypeName()).append("
"); + info.append("Extension: ").append(getExtension().toUpperCase()).append("
"); + info.append("File size: ").append(getFilesizeKB()).append(" KB").append("
"); + info.append("Words: ").append(Utils.countWords(this)).append("
"); + info.append("Lines: ").append(Utils.countLines(this)).append("
"); + info.append("Characters: ").append(Utils.countChars(this)).append("
"); + info.append("Created at: ").append(getCreatedTime()).append("
"); + info.append("Modified at: ").append(getModificationTime()).append("
"); + return info.toString(); + } } diff --git a/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java b/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java index bde11c4..ec83d41 100644 --- a/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java +++ b/Lab3/src/main/java/org/lumijiez/gui/MainFrame.java @@ -11,7 +11,6 @@ public class MainFrame extends JFrame { public static Path FOLDER_PATH; private final JScrollPane fileListScrollPane = new JScrollPane(); private final JScrollPane fileInfoScrollPane = new JScrollPane(); - private final JList fileList = new JList<>(); private final JLabel pathLabel = new JLabel(); private final JScrollPane mainScrollPane = new JScrollPane(); private final JTextPane mainTextPane = new JTextPane(); @@ -19,11 +18,12 @@ public class MainFrame extends JFrame { private final JLabel snapshotLabel = new JLabel(); private final JButton CommitButton = new JButton(); private final JButton StatusButton = new JButton(); - private final JMenuBar MainMenubar = new JMenuBar(); + private final JMenuBar mainMenubar = new JMenuBar(); private final JMenu fileMenu = new JMenu(); private final JMenuItem pickFolder = new JMenuItem(); private final JMenu settingsMenu = new JMenu(); private final JMenuItem settings = new JMenuItem(); + private final JList fileList = new JList<>(); private final Map fileContents = new HashMap<>(); private TrackerThread tracker; @@ -33,53 +33,49 @@ public class MainFrame extends JFrame { private void initComponents() { + setResizable(false); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + mainTextPane.setContentType("text/html"); + fileInfoTextPane.setContentType("text/html"); + + mainTextPane.setEditable(false); + fileInfoTextPane.setEditable(false); JFileChooser folderChooser = new JFileChooser(); folderChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - - int returnVal = folderChooser.showOpenDialog(this); - if (returnVal == JFileChooser.APPROVE_OPTION) { + if (folderChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { FOLDER_PATH = Path.of(folderChooser.getSelectedFile().getAbsolutePath()); tracker = new TrackerThread(mainTextPane, fileContents, fileList, fileInfoTextPane); tracker.start(); } + snapshotLabel.setFont(new java.awt.Font("Trebuchet MS", Font.PLAIN, 18)); + pathLabel.setFont(new java.awt.Font("Trebuchet MS", Font.PLAIN, 18)); + fileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fileListScrollPane.setViewportView(fileList); - - snapshotLabel.setFont(new java.awt.Font("Trebuchet MS", Font.PLAIN, 18)); - snapshotLabel.setText("Last snapshot: " + new Date()); - mainScrollPane.setViewportView(mainTextPane); fileInfoScrollPane.setViewportView(fileInfoTextPane); - pathLabel.setFont(new java.awt.Font("Trebuchet MS", Font.PLAIN, 18)); - pathLabel.setText("Currently tracking: " + FOLDER_PATH.toString()); - - CommitButton.setText("Commit"); CommitButton.addActionListener(this::CommitButtonActionPerformed); - StatusButton.setText("Status"); - StatusButton.addActionListener(this::StatusButtonActionPerformed); - - fileMenu.setText("File"); - - pickFolder.setText("Pick another folder"); fileMenu.add(pickFolder); - - MainMenubar.add(fileMenu); - - settingsMenu.setText("Edit"); - - settings.setText("Settings"); settingsMenu.add(settings); + mainMenubar.add(fileMenu); + mainMenubar.add(settingsMenu); - MainMenubar.add(settingsMenu); + StatusButton.setText("Status"); + pathLabel.setText("Currently tracking: " + FOLDER_PATH.toString()); + CommitButton.setText("Commit"); + snapshotLabel.setText("Last snapshot: " + new Date()); + fileMenu.setText("File"); + pickFolder.setText("Pick another folder"); + settingsMenu.setText("Edit"); + settings.setText("Settings"); - setJMenuBar(MainMenubar); + setJMenuBar(mainMenubar); GroupLayout layout = new GroupLayout(getContentPane()); getContentPane().setLayout(layout); @@ -98,8 +94,7 @@ public class MainFrame extends JFrame { .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(CommitButton, GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE) .addComponent(fileInfoScrollPane)))) - .addContainerGap()) - ); + .addContainerGap())); layout.setVerticalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() @@ -123,7 +118,4 @@ public class MainFrame extends JFrame { mainTextPane.setText(""); snapshotLabel.setText("Last snapshot: " + new Date()); } - - private void StatusButtonActionPerformed(java.awt.event.ActionEvent evt) { - } } diff --git a/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java b/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java index e6232fd..05f2f54 100644 --- a/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java +++ b/Lab3/src/main/java/org/lumijiez/interfaces/IDocument.java @@ -2,12 +2,10 @@ package org.lumijiez.interfaces; import org.lumijiez.enums.FileType; -import java.util.Date; - public interface IDocument { String getExtension(); - Date getCreatedTime(); - Date getModificationTime(); + String getCreatedTime(); + String getModificationTime(); FileType getFileType(); long getFilesizeKB(); String getInfo(); diff --git a/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java b/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java index fcf05b1..70ded34 100644 --- a/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java +++ b/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java @@ -16,10 +16,10 @@ import java.util.Map; public class TrackerThread extends Thread { private final JTextPane textPane; + private final JTextPane fileInfoTextPane; + private final JList fileList; private Map fileContents; private final Map fileStates = new HashMap<>(); - private final JList fileList; - private final JTextPane fileInfoTextPane; public TrackerThread(JTextPane textPane, Map files, JList fileList, JTextPane fileInfoTextPane) { this.textPane = textPane; @@ -60,7 +60,6 @@ public class TrackerThread extends Thread { }); } - public void reset() { fileStates.clear(); } @@ -96,7 +95,6 @@ public class TrackerThread extends Thread { toShow.append(file.getName()).append(" has been ").append(fileStates.get(file).getAction()).append("

"); } } - // System.out.println(toShow.toString()); textPane.setText(toShow.toString()); } } diff --git a/Lab3/src/main/java/org/lumijiez/util/FileFactory.java b/Lab3/src/main/java/org/lumijiez/util/FileFactory.java index c7d0294..a0bcf29 100644 --- a/Lab3/src/main/java/org/lumijiez/util/FileFactory.java +++ b/Lab3/src/main/java/org/lumijiez/util/FileFactory.java @@ -1,17 +1,26 @@ package org.lumijiez.util; import org.lumijiez.base.*; -import org.lumijiez.enums.FileType; import java.nio.file.Path; public class FileFactory { public static Document getDocument(Path path) { Document doc = new Document(path); - if (doc.getFileType() == FileType.PLAINTEXT) return new TextFile(path); - if (doc.getFileType() == FileType.IMAGE) return new ImageFile(path); - if (doc.getFileType() == FileType.FILE) return new ArbitraryFile(path); - if (doc.getFileType() == FileType.CODE) return new CodeFile(path); + switch (doc.getFileType()) { + case PLAINTEXT -> { + return new TextFile(path); + } + case IMAGE -> { + return new ImageFile(path); + } + case FILE -> { + return new ArbitraryFile(path); + } + case CODE -> { + return new CodeFile(path); + } + } return doc; } } diff --git a/Lab3/src/main/java/org/lumijiez/util/Utils.java b/Lab3/src/main/java/org/lumijiez/util/Utils.java new file mode 100644 index 0000000..e51298a --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/util/Utils.java @@ -0,0 +1,51 @@ +package org.lumijiez.util; + +import org.lumijiez.base.Document; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +public class Utils { + public static int countWords(Document doc) { + try { + BufferedReader reader = new BufferedReader(new FileReader(doc)); + int wordCount = 0; + String line; + while ((line = reader.readLine()) != null) { + String[] words = line.split("\\s+"); + wordCount += words.length; + } + reader.close(); + return wordCount; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static int countLines(Document doc) { + try { + BufferedReader reader = new BufferedReader(new FileReader(doc)); + int lineCount = 0; + while (reader.readLine() != null) lineCount++; + reader.close(); + return lineCount; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static long countChars(Document doc) { + try { + BufferedReader reader = new BufferedReader(new FileReader(doc)); + long characterCount = 0; + while (reader.read() != -1) characterCount++; + reader.close(); + return characterCount; + } catch (IOException e) { + throw new RuntimeException(e); + } + + } + +} From 655813fc07cbcb8af700cbcad886be80915e1db5 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 18 Oct 2023 00:25:17 +0300 Subject: [PATCH 5/6] Notifications hehehehehehehehehehe --- .../org/lumijiez/tracker/TrackerThread.java | 18 +++++++++++---- .../lumijiez/util/NotificationHandler.java | 23 +++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 Lab3/src/main/java/org/lumijiez/util/NotificationHandler.java diff --git a/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java b/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java index 70ded34..c281f9a 100644 --- a/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java +++ b/Lab3/src/main/java/org/lumijiez/tracker/TrackerThread.java @@ -6,6 +6,7 @@ import org.lumijiez.enums.DiffType; import org.lumijiez.util.FileDiffer; import org.lumijiez.enums.StateType; import org.lumijiez.util.FileFactory; +import org.lumijiez.util.NotificationHandler; import javax.swing.*; import java.awt.*; @@ -52,10 +53,7 @@ public class TrackerThread extends Thread { fileList.addListSelectionListener(e -> { if (!e.getValueIsAdjusting()) { - Document selectedDocument = fileList.getSelectedValue(); - if (selectedDocument != null) { - fileInfoTextPane.setText(selectedDocument.getInfo()); - } + refreshFileInfo(); } }); } @@ -64,6 +62,16 @@ public class TrackerThread extends Thread { fileStates.clear(); } + public void refreshFileInfo() { + Document selectedDocument = fileList.getSelectedValue(); + if (selectedDocument != null) { + fileInfoTextPane.setText(selectedDocument.getInfo()); + } else { + fileInfoTextPane.setText(""); + } + } + + public void checkDirectory() { Map> result = FileDiffer.diff(fileContents, FileDiffer.crawlDirectory(MainFrame.FOLDER_PATH)); @@ -81,6 +89,7 @@ public class TrackerThread extends Thread { if (somethingNew) { init(); + refreshFileInfo(); for (File file : fileStates.keySet()) { if (fileStates.get(file) != StateType.NONE) { if (fileStates.get(file) == StateType.NEW) { @@ -93,6 +102,7 @@ public class TrackerThread extends Thread { toShow.append(""); } toShow.append(file.getName()).append(" has been ").append(fileStates.get(file).getAction()).append("
"); + NotificationHandler.showNotification(file.getName(), fileStates.get(file)); } } textPane.setText(toShow.toString()); diff --git a/Lab3/src/main/java/org/lumijiez/util/NotificationHandler.java b/Lab3/src/main/java/org/lumijiez/util/NotificationHandler.java new file mode 100644 index 0000000..f0806e1 --- /dev/null +++ b/Lab3/src/main/java/org/lumijiez/util/NotificationHandler.java @@ -0,0 +1,23 @@ +package org.lumijiez.util; + +import org.lumijiez.enums.StateType; + +import java.awt.*; +import java.awt.TrayIcon.MessageType; + +public class NotificationHandler { + public static void showNotification(String filename, StateType stateType) { + try { + SystemTray tray = SystemTray.getSystemTray(); + Image image = Toolkit.getDefaultToolkit().createImage("some-icon.png"); + + TrayIcon trayIcon = new TrayIcon(image, "Java AWT Tray Demo"); + trayIcon.setImageAutoSize(true); + trayIcon.setToolTip("File Tracker"); + tray.add(trayIcon); + trayIcon.displayMessage("File Tracker", filename + " has been " + stateType.getAction(), MessageType.INFO); + } catch (Exception e) { + e.printStackTrace(); + } + } +} From 8ee8648b2bdf1a4617e17bf2dfbd5f34c41248fd Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 18 Oct 2023 00:35:08 +0300 Subject: [PATCH 6/6] Class/method counter, kind of buggy, unpleased --- .../main/java/org/lumijiez/base/CodeFile.java | 2 + .../main/java/org/lumijiez/util/Utils.java | 43 ++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Lab3/src/main/java/org/lumijiez/base/CodeFile.java b/Lab3/src/main/java/org/lumijiez/base/CodeFile.java index 9e5703f..db20eec 100644 --- a/Lab3/src/main/java/org/lumijiez/base/CodeFile.java +++ b/Lab3/src/main/java/org/lumijiez/base/CodeFile.java @@ -16,6 +16,8 @@ public class CodeFile extends Document{ info.append("Extension: ").append(getExtension().toUpperCase()).append("
"); info.append("File size: ").append(getFilesizeKB()).append(" KB").append("
"); info.append("Lines: ").append(Utils.countLines(this)).append("
"); + info.append("Classes: ").append(Utils.countClasses(this)).append("
"); + info.append("Methods: ").append(Utils.countMethods(this)).append("
"); info.append("Created at: ").append(getCreatedTime()).append("
"); info.append("Modified at: ").append(getModificationTime()).append("
"); return info.toString(); diff --git a/Lab3/src/main/java/org/lumijiez/util/Utils.java b/Lab3/src/main/java/org/lumijiez/util/Utils.java index e51298a..2a6f6bc 100644 --- a/Lab3/src/main/java/org/lumijiez/util/Utils.java +++ b/Lab3/src/main/java/org/lumijiez/util/Utils.java @@ -45,7 +45,48 @@ public class Utils { } catch (IOException e) { throw new RuntimeException(e); } - } + public static int countClasses(Document doc) { + try { + int classCount = 0; + + BufferedReader reader = new BufferedReader(new FileReader(doc)); + String line; + + while ((line = reader.readLine()) != null) { + if (line.contains("class ")) { + classCount++; + } + } + reader.close(); + return classCount; + } catch (IOException e) { + e.printStackTrace(); + } + return 0; + } + + public static int countMethods(Document doc) { + try { + int methodCount = 0; + + BufferedReader reader = new BufferedReader(new FileReader(doc)); + String line; + + while ((line = reader.readLine()) != null) { + if (line.matches(".*\\b\\w+\\s+\\w+\\(.*\\)\\s*\\{.*")) { + methodCount++; + } else if (line.contains("def ")) { + methodCount++; + } + } + + reader.close(); + return methodCount; + } catch (IOException e) { + e.printStackTrace(); + } + return 0; + } }