package com.sothr.imagetools.ui.component import java.awt.Desktop import java.io.{File, FileInputStream} import javafx.event.{EventType, EventHandler} import javafx.geometry.{Orientation, Insets, Pos} import javafx.scene.control.{Separator, Tooltip, Label} import javafx.scene.image.{ImageView} import javafx.scene.input.{PickResult, ContextMenuEvent, MouseEvent} import javafx.scene.layout.VBox import com.sothr.imagetools.ui.util.FileUtil import grizzled.slf4j.Logging import resource._ /** * ImageTile class that is a special VBox * * Created by drew on 8/22/14. */ class ImageTile(thumbnailWidth: Integer, image: com.sothr.imagetools.engine.image.Image, imageTilePane: ImageTilePane) extends VBox with Logging { val thisTile = this val imageData = image val preferedTileWidth = (thumbnailWidth + 8).toDouble val preferedTileHeight = (thumbnailWidth + 32).toDouble //set tile size this.setPrefSize(preferedTileWidth, preferedTileHeight) this.setMinSize(preferedTileWidth, preferedTileHeight) this.setMaxSize(preferedTileWidth, preferedTileHeight) //set padding on the tiles //this.setPadding(new Insets(10.0d,0.0d,10.0d,0.0d)) this.setAlignment(Pos.CENTER) this.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler[MouseEvent] { override def handle(event: MouseEvent): Unit = { if (event.isShiftDown) { //multiple selection imageTilePane.addImageSelected(thisTile) //remove individual images with control } else if (event.isControlDown) { imageTilePane.removeImageSelected(thisTile) } else { if (event.isPrimaryButtonDown) { imageTilePane.imageSelected(thisTile) //double click if (event.getClickCount == 2) { // Look into http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-java // for proper multi-platform opening support FileUtil.openInEditor(new File(image.getImagePath)) } else { } } else if (event.isSecondaryButtonDown) { //right click context menu debug("Requesting Context Menu") imageTilePane.addImageSelected(thisTile) val contextMenuEvent = new ContextMenuEvent( thisTile, thisTile, ContextMenuEvent.CONTEXT_MENU_REQUESTED, event.getX, event.getY, event.getScreenX, event.getScreenY, false, new PickResult(thisTile, event.getSceneX, event.getSceneY)) imageTilePane.handleContextMenu(contextMenuEvent) } } } }) //Separator val separator = new Separator() separator.setOrientation(Orientation.HORIZONTAL) separator.setMaxHeight(5.0d) separator.setVisible(false) this.getChildren.add(separator) // Image val genImageView = new ImageView() debug(s"Getting thumbnail from: ${image.getThumbnailPath}") managed(new FileInputStream(image.getThumbnailPath)) acquireAndGet { thumbSource => val thumbnail = new javafx.scene.image.Image(thumbSource) genImageView.setImage(thumbnail) if (thumbnail.getHeight > thumbnail.getWidth) { genImageView.setFitHeight(128.0) } else { genImageView.setFitWidth(128.0) } } genImageView.setPreserveRatio(true) this.getChildren.add(genImageView) //Label val imageLabel = new Label() imageLabel.setText(s"${image.getHeight}x${image.getWidth}") imageLabel.setWrapText(true) imageLabel.setMaxHeight(32d) imageLabel.setMaxWidth(preferedTileWidth-2) imageLabel.setAlignment(Pos.BOTTOM_CENTER) //Tooltip val tooltip = new Tooltip() tooltip.setText(s"${image.getName}") imageLabel.setTooltip(tooltip) this.getChildren.add(imageLabel) //this.setOnContextMenuRequested(new EventHandler[ContextMenuEvent] { // override def handle(event: ContextMenuEvent): Unit = { // imageTilePane.handleContextMenu(event) // } //}) def getImageData: com.sothr.imagetools.engine.image.Image = { imageData } }