/*
This file is part of RouteConverter.
RouteConverter is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
RouteConverter is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with RouteConverter; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Copyright (C) 2007 Christian Pesch. All Rights Reserved.
*/
package slash.navigation.converter.gui.undo;
import slash.navigation.converter.gui.helpers.RouteServiceOperator;
import slash.navigation.converter.gui.models.AddRouteCallback;
import slash.navigation.converter.gui.models.CatalogModel;
import slash.navigation.converter.gui.models.CatalogModelImpl;
import slash.navigation.gui.undo.UndoManager;
import slash.navigation.routes.Catalog;
import slash.navigation.routes.impl.CategoryTreeModel;
import slash.navigation.routes.impl.CategoryTreeNode;
import slash.navigation.routes.impl.RouteModel;
import slash.navigation.routes.impl.RoutesTableModel;
import javax.swing.tree.TreeModel;
import java.io.File;
import java.util.List;
import static slash.navigation.converter.gui.helpers.RouteModelHelper.*;
/**
* Acts as a {@link TreeModel} for the categories and routes of a {@link Catalog}.
*
* @author Christian Pesch
*/
public class UndoCatalogModel implements CatalogModel {
private final CatalogModelImpl delegate;
private final UndoManager undoManager;
public UndoCatalogModel(UndoManager undoManager, CategoryTreeNode root, RouteServiceOperator operator) {
this.delegate = new CatalogModelImpl(root, operator);
this.undoManager = undoManager;
}
public CategoryTreeModel getCategoryTreeModel() {
return delegate.getCategoryTreeModel();
}
public RoutesTableModel getRoutesTableModel() {
return delegate.getRoutesTableModel();
}
public void setCurrentCategory(CategoryTreeNode category) {
delegate.setCurrentCategory(category);
}
public void addCategories(List<CategoryTreeNode> parents, List<String> names, Runnable invokeLaterRunnable) {
addCategories(parents, names, invokeLaterRunnable, true);
}
void addCategories(List<CategoryTreeNode> categories, List<String> names, Runnable invokeLaterRunnable, boolean trackUndo) {
delegate.addCategories(categories, names, invokeLaterRunnable);
if (trackUndo)
undoManager.addEdit(new AddCategories(this, categories, names));
}
public void renameCategory(CategoryTreeNode category, String name) {
renameCategory(category, name, true);
}
void renameCategory(CategoryTreeNode category, String newName, boolean trackUndo) {
String oldName = category.getName();
delegate.renameCategory(category, newName);
if (trackUndo)
undoManager.addEdit(new RenameCategory(this, category, oldName, newName));
}
public void moveCategories(List<CategoryTreeNode> categories, CategoryTreeNode parent, Runnable invokeLaterRunnable) {
moveCategories(categories, asParents(parent, categories.size()), invokeLaterRunnable);
}
public void moveCategories(List<CategoryTreeNode> categories, List<CategoryTreeNode> parents, Runnable invokeLaterRunnable) {
moveCategories(categories, parents, invokeLaterRunnable, true);
}
void moveCategories(List<CategoryTreeNode> categories, List<CategoryTreeNode> parents, Runnable invokeLaterRunnable, boolean trackUndo) {
List<CategoryTreeNode> oldParents = asParents(categories);
delegate.moveCategories(categories, parents, invokeLaterRunnable);
if (trackUndo)
undoManager.addEdit(new MoveCategories(this, categories, oldParents, parents));
}
public void deleteCategories(List<CategoryTreeNode> categories, Runnable invokeLaterRunnable) {
deleteCategories(asParents(categories), asNames(categories), invokeLaterRunnable);
}
public void deleteCategories(List<CategoryTreeNode> parents, List<String> names, Runnable invokeLaterRunnable) {
deleteCategories(parents, names, invokeLaterRunnable, true);
}
void deleteCategories(List<CategoryTreeNode> categories, List<String> names, Runnable invokeLaterRunnable, boolean trackUndo) {
delegate.deleteCategories(categories, names, invokeLaterRunnable);
if (trackUndo)
undoManager.addEdit(new DeleteCategories(this, categories, names));
}
public void addRoute(CategoryTreeNode category, String description, File file, String url, AddRouteCallback callback) {
addRoute(category, description, file, url, callback, true);
}
void addRoute(CategoryTreeNode category, String description, File file, String url, AddRouteCallback callback, boolean trackUndo) {
delegate.addRoute(category, description, file, url, callback);
if (trackUndo)
undoManager.addEdit(new AddRoute(this, category, description, file, url, callback));
}
public void renameRoute(RouteModel route, String name, Runnable invokeLaterRunnable) {
renameRoute(route, name, invokeLaterRunnable, true);
}
void renameRoute(RouteModel route, String newName, Runnable invokeLaterRunnable, boolean trackUndo) {
String oldName = route.getName();
delegate.renameRoute(route, newName, invokeLaterRunnable);
if (trackUndo)
undoManager.addEdit(new RenameRoute(this, route, oldName, newName));
}
public void moveRoutes(List<RouteModel> routes, CategoryTreeNode parent, Runnable invokeLaterRunnable) {
moveRoutes(routes, asParents(parent, routes.size()), invokeLaterRunnable);
}
public void moveRoutes(List<RouteModel> routes, List<CategoryTreeNode> parents, Runnable invokeLaterRunnable) {
moveRoutes(routes, parents, invokeLaterRunnable, true);
}
void moveRoutes(List<RouteModel> routes, List<CategoryTreeNode> parents, Runnable invokeLaterRunnable, boolean trackUndo) {
List<CategoryTreeNode> oldParents = asParentsFromRoutes(routes);
delegate.moveRoutes(routes, parents, invokeLaterRunnable);
if (trackUndo)
undoManager.addEdit(new MoveRoutes(this, routes, oldParents, parents));
}
public void deleteRoutes(List<RouteModel> routes) {
deleteRoutes(routes, true);
}
void deleteRoutes(List<RouteModel> routes, boolean trackUndo) {
delegate.deleteRoutes(routes);
if (trackUndo)
undoManager.addEdit(new DeleteRoutes(this, routes));
}
}