diff --git a/hw3/src/PhotoAlbumApp.java b/hw3/src/PhotoAlbumApp.java index dccdb7f..4390dad 100644 --- a/hw3/src/PhotoAlbumApp.java +++ b/hw3/src/PhotoAlbumApp.java @@ -1,11 +1,12 @@ import controller.PhotoAlbumController; import model.PhotoAlbumModel; +import strategy.SortByDate; import view.PhotoAlbumView; public class PhotoAlbumApp { public static void main(String[] args) { // Create MVC components - PhotoAlbumModel model = new PhotoAlbumModel(); + PhotoAlbumModel model = new PhotoAlbumModel(new SortByDate()); PhotoAlbumView view = new PhotoAlbumView(); PhotoAlbumController controller = new PhotoAlbumController(model, view); diff --git a/hw3/src/controller/PhotoAlbumController.java b/hw3/src/controller/PhotoAlbumController.java index 7841125..62480f5 100644 --- a/hw3/src/controller/PhotoAlbumController.java +++ b/hw3/src/controller/PhotoAlbumController.java @@ -1,7 +1,5 @@ package controller; -import iterator.AlbumIterator; -import iterator.PhotoIterator; import model.Photo; import model.PhotoAlbumModel; import strategy.SortByDate; @@ -56,26 +54,14 @@ public class PhotoAlbumController { } public void handleNext() { - List photos = model.getPhotos(); - if (photos.isEmpty()) return; - - Photo current = model.getCurrentPhoto(); - int index = photos.indexOf(current); - - if (index < photos.size() - 1) { - model.setCurrentPhoto(photos.get(index + 1)); + if (model.hasNext()) { + model.next(); } } public void handlePrevious() { - List photos = model.getPhotos(); - if (photos.isEmpty()) return; - - Photo current = model.getCurrentPhoto(); - int index = photos.indexOf(current); - - if (index > 0) { - model.setCurrentPhoto(photos.get(index - 1)); + if (model.hasPrevious()) { + model.previous(); } } @@ -94,9 +80,10 @@ public class PhotoAlbumController { } public void handlePhotoSelection(int index) { + // Reset iterator and loop to the selected index List photos = model.getPhotos(); - if (index >= 0 && index < photos.size()) { - model.setCurrentPhoto(photos.get(index)); + for (int i = 0; i < index; i++) { + model.next(); } } } diff --git a/hw3/src/model/PhotoAlbumModel.java b/hw3/src/model/PhotoAlbumModel.java index c2fc6ea..4b106bf 100644 --- a/hw3/src/model/PhotoAlbumModel.java +++ b/hw3/src/model/PhotoAlbumModel.java @@ -2,36 +2,40 @@ package model; import strategy.SortingStrategy; import iterator.AlbumIterator; +import iterator.PhotoIterator; import java.util.*; public class PhotoAlbumModel { private List photos; private SortingStrategy sortingStrategy; private final List listeners; - private Photo currentPhoto; + private AlbumIterator iterator; public interface ModelChangeListener { void onModelChanged(); } - public PhotoAlbumModel() { + public PhotoAlbumModel(SortingStrategy sortingStrategy) { photos = new ArrayList<>(); listeners = new ArrayList<>(); + iterator = new PhotoIterator(photos); + this.sortingStrategy = sortingStrategy; } public void addPhoto(Photo photo) { photos.add(photo); - if (photos.size() == 1) { - currentPhoto = photo; - } sortPhotos(); + iterator = new PhotoIterator(photos); notifyListeners(); } public void deletePhoto(String name) { + Photo currentPhoto = iterator.current(); photos.removeIf(photo -> photo.name().equals(name)); - if (currentPhoto != null && currentPhoto.name().equals(name)) { - currentPhoto = photos.isEmpty() ? null : photos.getFirst(); + if (photos.isEmpty()) { + iterator = new PhotoIterator(photos); + } else if (currentPhoto != null && currentPhoto.name().equals(name)) { + iterator = new PhotoIterator(photos); } notifyListeners(); } @@ -39,13 +43,12 @@ public class PhotoAlbumModel { public void setSortingStrategy(SortingStrategy strategy) { this.sortingStrategy = strategy; sortPhotos(); + iterator = new PhotoIterator(photos); notifyListeners(); } private void sortPhotos() { - if (sortingStrategy != null) { - photos = sortingStrategy.sort(photos); - } + photos = sortingStrategy.sort(photos); } public void addListener(ModelChangeListener listener) { @@ -63,13 +66,38 @@ public class PhotoAlbumModel { } public Photo getCurrentPhoto() { - return currentPhoto; + try { + return iterator.current(); + } catch (NoSuchElementException e) { + return null; + } } - public void setCurrentPhoto(Photo photo) { - if (photos.contains(photo)) { - currentPhoto = photo; + public boolean hasNext() { + return iterator.hasNext(); + } + + public boolean hasPrevious() { + return iterator.hasPrevious(); + } + + public Photo next() { + try { + Photo next = iterator.next(); notifyListeners(); + return next; + } catch (NoSuchElementException e) { + return null; + } + } + + public Photo previous() { + try { + Photo prev = iterator.previous(); + notifyListeners(); + return prev; + } catch (NoSuchElementException e) { + return null; } } }