/* * Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com] * 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.text.command; import de.ks.activity.initialization.ActivityInitialization; import de.ks.i18n.Localized; import de.ks.javafx.FxCss; import de.ks.text.AsciiDocEditor; import de.ks.text.image.ImageData; import de.ks.text.image.ImageProvider; import de.ks.text.image.SelectImageController; import javafx.collections.FXCollections; import javafx.collections.ObservableSet; import javafx.collections.SetChangeListener; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextArea; import javafx.scene.layout.StackPane; import javafx.stage.Modality; import javafx.stage.Stage; import javax.enterprise.inject.Instance; import javax.inject.Inject; import java.util.Comparator; import java.util.TreeSet; public class InsertImage implements AsciiDocEditorCommand { @Inject ActivityInitialization initialization; @Inject Instance<ImageProvider> imageProviders; @Inject @FxCss Instance<String> cssSheets; protected final ObservableSet<ImageData> images = FXCollections.observableSet(new TreeSet<ImageData>(Comparator.comparing(id -> id.getName()))); protected SelectImageController selectImageController; protected Stage dialog; protected Button button; @Override public void initialize(AsciiDocEditor editor, Button button) { this.button = button; collectImages(); selectImageController = initialization.loadAdditionalController(SelectImageController.class).getController(); images.addListener(this::imagesModified); selectImageController.selectedImagePathProperty().addListener((p, o, n) -> { if (n != null) { if (dialog != null) { dialog.hide(); } insert(editor.getEditor(), n); } }); } public void collectImages() { imageProviders.forEach(p -> images.addAll(p.getImages())); } @Override public String getInsertText() { return null; } @Override public void execute(TextArea editor) { collectImages(); if (dialog == null) { dialog = new Stage(); dialog.initModality(Modality.APPLICATION_MODAL); dialog.initOwner(button.getScene().getWindow()); dialog.setTitle(Localized.get("select.image")); } StackPane container = new StackPane(); container.setPadding(new Insets(5)); container.getChildren().add(selectImageController.getImagePane()); Scene scene = new Scene(container); dialog.setOnHiding(e -> { scene.setRoot(new StackPane()); }); dialog.setScene(scene); cssSheets.forEach((sheet) -> { scene.getStylesheets().add(sheet); }); dialog.show(); } public void insert(TextArea editor, String imagePath) { String insertText = "\nimage::file:///" + imagePath + "[]\n"; int insertPosition = editor.getCaretPosition(); editor.insertText(insertPosition, insertText); editor.positionCaret(insertPosition + insertText.length() - 2); editor.requestFocus(); } public void imagesModified(SetChangeListener.Change<? extends ImageData> change) { if (change.wasAdded()) { ImageData elementAdded = change.getElementAdded(); selectImageController.addImage(elementAdded.getName(), elementAdded.getPath()); } if (change.wasRemoved()) { ImageData elementRemoved = change.getElementRemoved(); selectImageController.removeImage(elementRemoved.getName()); } } public SelectImageController getSelectImageController() { return selectImageController; } }