/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package screenmaster;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseDragEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Region;
import javafx.stage.FileChooser;
/**
*
* @author cybergnome
*/
public class MasterWindowController implements Initializable {
// TODO: add version info and "About" popup
@FXML private Region imgParent;
@FXML private ImageView imgView;
@FXML private ListView listView;
@FXML private ComboBox zoomOptionsBox;
private final ObservableList<ManagedImage> imageList = FXCollections.observableArrayList();
FileChooser fileChooser;
@FXML private void openFiles(){
List<File> chosenFiles = fileChooser.showOpenMultipleDialog(ScreenMaster.getInstance().getMainStage());
if(chosenFiles == null || chosenFiles.size() <= 0) return;
config().setProperty("lastImageDir", chosenFiles.get(chosenFiles.size()-1).getParent());
for(File f : chosenFiles){
addImage(f);
}
}
@Override
public void initialize(URL url, ResourceBundle rb) {
zoomOptionsBox.getItems().addAll((Object[])ZoomMode.values());
zoomOptionsBox.setValue(ZoomMode.values()[0]);
fileChooser = new FileChooser();
fileChooser.setTitle("Open Resource File");
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("image files",
"*.png","*.jpg","*.jpeg","*.gif","*.PNG","*.JPG","*.JPEG","*.GIF"));//,"svg","SVG")); // SVG support comming soon
// TODO: SVG support
fileChooser.setInitialDirectory(new File(config().getProperty("lastImageDir", ".")));
listView.setItems(imageList);
listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
// TODO: listView.setCellFactory(...);
ChangeListener resizeListener = new ChangeListener(){
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue) {
viewResize();
}
};
imgParent.heightProperty().addListener(resizeListener); // method overloading makes using a lambda here tricky
imgParent.widthProperty().addListener(resizeListener);
ScreenMaster sm = ScreenMaster.getInstance();
sm.getDisplayImageViewContainer().heightProperty().addListener(resizeListener);
sm.getDisplayImageViewContainer().widthProperty().addListener(resizeListener);
// TODO: Save/load image sets
loadLastSession();
}
@FXML private void deleteSelectedItems(javafx.event.Event e){
ArrayList targets = new ArrayList();
targets.addAll(listView.getSelectionModel().getSelectedItems());
for(Object o : targets){
imageList.remove(o);
}
}
@FXML private void listViewClick(MouseEvent e){
if(e.getSource() == listView && e.getClickCount() == 2){
ManagedImage target = (ManagedImage)listView.getSelectionModel().getSelectedItem();
setImage(target);
}
}
@FXML private void zoomModeChange(javafx.event.Event e){
ZoomMode zm = (ZoomMode)zoomOptionsBox.getValue();
changeZoomMode(zm);
}
private Point2D dragStart = null;
private Point2D currentCenter = new Point2D(0,0);
@FXML private void moveView(MouseEvent e){
if(dragStart != null){
double dx = e.getScreenX()-dragStart.getX();
double dy = e.getScreenY()-dragStart.getY();
currentCenter = currentCenter.add(-dx, -dy);
dragStart = dragStart.add(dx,dy);
centerViewOn(currentCenter);
}
}
@FXML private void moveStart(MouseEvent e){
dragStart = new Point2D(e.getScreenX(), e.getScreenY());
}
@FXML private void moveEnd(MouseEvent e){
dragStart = null;
}
@FXML private void recenter(Event e){
currentCenter = new Point2D(0,0);
centerViewOn(currentCenter);
}
@FXML private void viewResize(){
changeZoomMode((ZoomMode)zoomOptionsBox.getValue());
}
private Path lastSaveLocation = null;
@FXML private void save(Event e){
if(lastSaveLocation == null){
saveAs(e);
} else {
saveTo(lastSaveLocation);
}
}
@FXML private void saveAs(Event e){
// TODO: ask for save location
// saveTo(f);
// lastSaveLocation = f;
}
@FXML private void importImageSet(Event e){
// TODO: ask for save location
// load(f);
}
private Properties config(){
return ScreenMaster.getInstance().getConfig();
}
private void addImage(File f) {
String type = f.getName().substring(f.getName().lastIndexOf(".")).toLowerCase(Locale.US);
if(type.equals("svg") == true){
// TODO: SVG
} else {
try {
ManagedImage mi = new ManagedImage(f);
imageList.add(mi);
} catch (IOException ex) {
Logger.getLogger(MasterWindowController.class.getName()).log(Level.SEVERE, null, ex);
}
}
saveFileList();
}
private void saveFileList() {
StringBuilder sb = new StringBuilder();
for(ManagedImage m : imageList){
sb.append(m.getSrcFile().toPath()).append(File.pathSeparator);
}
config().setProperty("lastSession", sb.toString());
}
private void loadLastSession(){
if(config().containsKey("lastSession")){
String[] filePaths = config().getProperty("lastSession").split(File.pathSeparator);
for(String path : filePaths){
File f = new File(path);
if(f.exists()){
addImage(f);
}
}
}
}
private ManagedImage currentImage = null;
private void setImage(ManagedImage image) {
currentImage = image;
image.setImage(imgView, imgParent, (ZoomMode)zoomOptionsBox.getValue());
// set other window's image too
image.setImage(
ScreenMaster.getInstance().getDisplayImageView(),
ScreenMaster.getInstance().getDisplayImageViewContainer(),
(ZoomMode)zoomOptionsBox.getValue());
}
private void changeZoomMode(ZoomMode zm){
if(currentImage == null) return;
currentImage.setImage(imgView, imgParent, zm);
currentImage.setImage(
ScreenMaster.getInstance().getDisplayImageView(),
ScreenMaster.getInstance().getDisplayImageViewContainer(),
zm);
currentCenter = new Point2D(0,0);
centerViewOn(currentCenter);
}
private void centerViewOn(Point2D deltaCenter) {
if(currentImage == null) return;
currentImage.centerViewOn(deltaCenter.getX(), deltaCenter.getY(), imgView, imgParent,(ZoomMode)zoomOptionsBox.getValue());
currentImage.centerViewOn(deltaCenter.getX(), deltaCenter.getY(), ScreenMaster.getInstance().getDisplayImageView(), ScreenMaster.getInstance().getDisplayImageViewContainer(),(ZoomMode)zoomOptionsBox.getValue());
}
private void saveTo(Path lastSaveLocation) {
// TODO: implement
}
}