/**
* Copyright [2014] [Christian Loehnert]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.ks.idnadrev.category.view;
import de.ks.BaseController;
import de.ks.activity.ActivityHint;
import de.ks.application.fxml.DefaultLoader;
import de.ks.idnadrev.category.CategoryBrowser;
import de.ks.idnadrev.category.CategoryItemController;
import de.ks.idnadrev.category.create.CreateCategoryActivity;
import de.ks.idnadrev.entity.Category;
import de.ks.idnadrev.entity.information.ChartInfo;
import de.ks.idnadrev.entity.information.Information;
import de.ks.idnadrev.entity.information.TextInfo;
import de.ks.idnadrev.entity.information.UmlDiagramInfo;
import de.ks.persistence.PersistentWork;
import de.ks.reflection.PropertyPath;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.fxml.FXML;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.StackPane;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaUpdate;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class ViewCategoryController extends BaseController<List<Category>> {
private static final Logger log = LoggerFactory.getLogger(ViewCategoryController.class);
private static final String KEY_CATEGORY = PropertyPath.property(Information.class, t -> t.getCategory());
@FXML
protected CategoryBrowser categoryBrowserController;
@FXML
protected ScrollPane scrollPane;
@FXML
protected StackPane selectedItemContainer;
@FXML
protected Button create;
@FXML
protected Button edit;
@FXML
protected Button delete;
private CompletableFuture<DefaultLoader<Node, CategoryItemController>> categoryItemFuture;
@Override
public void initialize(URL location, ResourceBundle resources) {
categoryItemFuture = activityInitialization.loadAdditionalControllerWithFuture(CategoryItemController.class);
categoryBrowserController.getCategoryPane().prefWidthProperty().bind(scrollPane.widthProperty().subtract(50));
categoryBrowserController.getCategoryPane().prefHeightProperty().bind(scrollPane.heightProperty().subtract(50));
categoryBrowserController.selectedCategoryProperty().addListener((p, o, n) -> {
selectedItemContainer.getChildren().clear();
if (n == null) {
} else {
CategoryItemController itemController = getItemController();
itemController.setCategory(n);
selectedItemContainer.getChildren().add(itemController.getPane());
StackPane.setAlignment(itemController.getPane(), Pos.CENTER_LEFT);
}
});
BooleanBinding noSelection = categoryBrowserController.selectedCategoryProperty().isNull();
ReadOnlyBooleanProperty invalidProperty = validationRegistry.invalidProperty();
edit.disableProperty().bind(noSelection.or(invalidProperty));
delete.disableProperty().bind(noSelection.or(invalidProperty));
create.disableProperty().bind(invalidProperty);
}
protected CategoryItemController getItemController() {
DefaultLoader<Node, CategoryItemController> loader = null;
try {
loader = categoryItemFuture.get();
return loader.getController();
} catch (InterruptedException e) {
log.error("Could not load category item controller", e);
throw new RuntimeException(e);
} catch (ExecutionException e) {
log.error("Could not load category item controller", e);
throw new RuntimeException(e);
}
}
@FXML
protected void onCreate() {
ActivityHint hint = new ActivityHint(CreateCategoryActivity.class, controller.getCurrentActivityId());
controller.startOrResume(hint);
}
@FXML
protected void onEdit() {
Category item = categoryBrowserController.getSelectedCategory();
ActivityHint hint = new ActivityHint(CreateCategoryActivity.class, controller.getCurrentActivityId());
hint.setDataSourceHint(() -> item);
controller.startOrResume(hint);
}
@FXML
protected void onDelete() {
Category item = categoryBrowserController.getSelectedCategory();
store.executeCustomRunnable(() -> {
PersistentWork.run(em -> {
Category reload = PersistentWork.reload(item);
CriteriaBuilder builder = em.getCriteriaBuilder();
deleteReferences(em, reload, builder, TextInfo.class);
deleteReferences(em, reload, builder, UmlDiagramInfo.class);
deleteReferences(em, reload, builder, ChartInfo.class);
em.flush();
em.remove(reload);
});
});
store.reload();
store.executeCustomRunnable(() -> controller.getJavaFXExecutor().submit(() -> categoryBrowserController.onResume()));
}
protected <T extends Information<T>> void deleteReferences(EntityManager em, Category reload, CriteriaBuilder builder, Class<T> clazz) {
CriteriaUpdate<T> update = builder.createCriteriaUpdate(clazz);
Root<T> root = update.from(clazz);
Path<Category> contextPath = root.get(KEY_CATEGORY);
update.set(contextPath, builder.nullLiteral(Category.class));
update.where(builder.equal(contextPath, reload));
em.createQuery(update).executeUpdate();
}
@Override
protected void onRefresh(List<Category> model) {
super.onRefresh(model);
categoryBrowserController.reload();
categoryBrowserController.setSelectedCategory(null);
}
}