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; + } +}