SmartNotes/SmartNotes/smartnotes/src/main/java/com/madeorsk/smartnotes/NotesExplorer.java

209 lines
5.5 KiB
Java

package com.madeorsk.smartnotes;
import java.util.Arrays;
import java.util.Map;
import com.madeorsk.smartnotes.notes.Note;
import com.madeorsk.smartnotes.notes.TextNote;
import com.madeorsk.smartnotes.paths.FolderPath;
import com.madeorsk.smartnotes.paths.NotePath;
import com.madeorsk.smartnotes.paths.Path;
import javafx.animation.FadeTransition;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Cursor;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.util.Duration;
public class NotesExplorer extends VBox
{
private SavesManager saves;
private Map<Integer, Note> notes;
private HBox titleBox;
private FolderPath currentFolder;
public NotesExplorer()
{
this.saves = new SavesManager();
this.notes = this.saves.loadIndex();
this.titleBox = new HBox();
{
this.titleBox.setPadding(new Insets(10, 0, 0, 0));
ImageView logoView = new ImageView(new Image("/com/madeorsk/smartnotes/res/Logo.png"));
this.titleBox.setAlignment(Pos.CENTER);
this.titleBox.getChildren().add(logoView);
}
this.updateList(this.genRoot());
}
private void updateList(FolderPath folder)
{
this.getChildren().clear();
this.getChildren().add(this.titleBox);
this.setSpacing(50);
this.currentFolder = folder;
VBox notesList = new VBox();
notesList.setPadding(new Insets(0, 20, 0, 20));
notesList.setSpacing(15);
this.getChildren().add(notesList);
if (folder.getParent() != null)
notesList.getChildren().add(new ExplorerItem(true, folder.getParent().setName("Previous folder"), this).setFolderIcon("/com/madeorsk/smartnotes/res/ReturnIcon.png"));
for (Path p : folder.getContent())
{
if (p.isFolder())
notesList.getChildren().add(new ExplorerItem(true, p, this));
else
{
this.notes.get(((NotePath) p).getNoteId()).load(this.saves, ((NotePath) p).getNoteId());
notesList.getChildren().add(new ExplorerItem(false, this.notes.get(((NotePath) p).getNoteId()), this));
}
}
final HBox addNoteBox = new HBox();
{
addNoteBox.setCursor(Cursor.HAND);
addNoteBox.setOpacity(0.4);
addNoteBox.setOnMouseEntered((MouseEvent e) -> {
FadeTransition transition = new FadeTransition(Duration.millis(200), addNoteBox);
transition.setFromValue(0.4);
transition.setToValue(1.0);
transition.play();
});
addNoteBox.setOnMouseExited((MouseEvent e) -> {
FadeTransition transition = new FadeTransition(Duration.millis(200), addNoteBox);
transition.setFromValue(1.0);
transition.setToValue(0.4);
transition.play();
});
addNoteBox.setOnMouseClicked((MouseEvent event) -> {
TextNote note = new TextNote();
SmartNotes.instance.setContent(note.getEditBox(NotesExplorer.this));
int id = NotesExplorer.this.getNextId();
NotesExplorer.this.notes.put(id, note);
NotesExplorer.this.saves.saveIndex(NotesExplorer.this.notes);
note.save(NotesExplorer.this.saves, id);
});
addNoteBox.setAlignment(Pos.CENTER_LEFT);
addNoteBox.getChildren().add(new ImageView(new Image("/com/madeorsk/smartnotes/res/AddIcon.png")));
addNoteBox.setSpacing(10);
Label newNoteLabel = new Label("New note...");
newNoteLabel.setId("noteItemName");
addNoteBox.getChildren().add(newNoteLabel);
}
notesList.getChildren().add(addNoteBox);
}
private FolderPath genRoot()
{
FolderPath root = new FolderPath("/", null);
for (int key : this.notes.keySet())
{
Note note = this.notes.get(key);
if (note.getPaths().isEmpty())
root.addPath(new NotePath(key));
else
{
for (String path : note.getPaths())
{
FolderPath putIn = root;
String[] foldersString = (path.substring(1).contains("#")) ? path.substring(1).split("#") : Arrays.asList(path.substring(1)).toArray(new String[1]);
for (String folderString : foldersString)
{
if (putIn.containsFolder(folderString))
putIn = putIn.getFolder(folderString);
else
{
FolderPath newFolder = new FolderPath(folderString, putIn);
putIn.addPath(newFolder);
putIn = newFolder;
}
}
putIn.addPath(new NotePath(key));
}
}
}
return root;
}
public void goToFolder(FolderPath path)
{
this.updateList(this.getUpdatedFolder(path));
}
public void updateCurrentFolder()
{
this.updateList(this.getUpdatedFolder(this.currentFolder));
}
private FolderPath getUpdatedFolder(FolderPath path)
{
if (path.getParent() == null)
return this.genRoot();
else
{
FolderPath updatedFolder = this.getUpdatedFolder(path.getParent()).getFolder(path.getName());
if (updatedFolder == null)
return this.getUpdatedFolder(path.getParent());
else
return updatedFolder;
}
}
public void replaceNote(Note oldNote, Note newNote)
{
for (int key : this.notes.keySet())
{
if (this.notes.get(key).equals(oldNote))
{
this.notes.get(key).delete(this.saves, key);
this.notes.put(key, newNote);
}
}
}
public void requestSave(final Note note)
{
for (int key : NotesExplorer.this.notes.keySet())
if (NotesExplorer.this.notes.get(key).equals(note))
note.save(NotesExplorer.this.saves, key);
}
public void requestLoad(Note note)
{
for (int key : this.notes.keySet())
if (this.notes.get(key).equals(note))
note.load(this.saves, key);
}
private int getNextId()
{
int i = 0;
for (int key : notes.keySet())
{
if (key != i)
return i;
i++;
}
return notes.keySet().size();
}
public void close()
{
this.saves.saveIndex(notes);
}
}