/*
* ScreenFX - A plugin library for JavaFX 8 adding features for resizing
* and arranging stage windows on a multiple screen hardware configuration
*
* Copyright (C) 2014 Mario Voigt, Ulmenstr. 35, 09112 Chemnitz, Germany, vmario@hrz.tu-chemnitz.de
*
* This program 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 3 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see http://www.gnu.org/licenses/gpl-3.0.html
*/
package com.vmario.screenfx;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import javafx.stage.Stage;
/**
* @author vmario
*
*/
class ScreenFXPositioner {
private final Stage stage;
private final GraphicsDevice[] graphicsDevices;
private final int screenNr;
/**
* @param stage the stage to set on position
* @param graphicsDevices
* the list of graphic devices
* @param screenNr
* the id/number of screen
*/
public ScreenFXPositioner(Stage stage, GraphicsDevice[] graphicsDevices, int screenNr) {
this.stage = stage;
this.graphicsDevices = graphicsDevices;
this.screenNr = screenNr;
}
/**
*
* @param sfxPosition
* the position to set
* @param doubleClick
* boolean value if the user performed a single click (false) or
* double click (true)
* @throws Exception push exceptions
*/
public void setPosition(ScreenFXPosition sfxPosition, boolean doubleClick) throws Exception {
GraphicsConfiguration gc = graphicsDevices[screenNr].getDefaultConfiguration();
Rectangle bounds = gc.getBounds();
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
int posX, posY, dimX, dimY;
posX = bounds.x + screenInsets.left;
posY = bounds.y + screenInsets.top;
dimX = bounds.width - screenInsets.left - screenInsets.right;
dimY = bounds.height - screenInsets.top - screenInsets.bottom;
// overwrite values for full fit to screen
if (!ScreenFXConfig.getTaskbarIncludeSelectedProperties().get(screenNr)
& !ScreenFXConfig.taskbarIncludeIndeterminateProperties.get(screenNr)) {
posX = bounds.x;
posY = bounds.y;
dimX = bounds.width;
dimY = bounds.height;
}
// disable resize with double click if the stage is not resizable
if (!stage.isResizable()) {
doubleClick = false;
}
switch (sfxPosition) {
case LEFT_TOP:
if (doubleClick) {
stage.setWidth(dimX / 2);
stage.setHeight(dimY / 2);
stage.setX(posX);
stage.setY(posY);
} else {
stage.setX(posX);
stage.setY(posY);
}
break;
case MIDDLE_TOP:
if (doubleClick) {
stage.setWidth(dimX);
stage.setHeight(dimY / 2);
stage.setX(posX);
stage.setY(posY);
} else {
stage.setX(posX + (dimX / 2) - (stage.getWidth() / 2));
stage.setY(posY);
}
break;
case RIGHT_TOP:
if (doubleClick) {
stage.setWidth(dimX / 2);
stage.setHeight(dimY / 2);
stage.setX(posX + dimX - stage.getWidth());
stage.setY(posY);
} else {
stage.setX(posX + dimX - stage.getWidth());
stage.setY(posY);
}
break;
case LEFT_MIDDLE:
if (doubleClick) {
stage.setWidth(dimX / 2);
stage.setHeight(dimY);
stage.setX(posX);
stage.setY(posY);
} else {
stage.setX(posX);
stage.setY(posY + (dimY / 2) - (stage.getHeight() / 2));
}
break;
case MIDDLE_MIDDLE:
if (doubleClick) {
stage.setWidth(dimX);
stage.setHeight(dimY);
stage.setX(posX);
stage.setY(posY);
} else {
stage.setX(posX + (dimX / 2) - (stage.getWidth() / 2));
stage.setY(posY + (dimY / 2) - (stage.getHeight() / 2));
}
break;
case RIGHT_MIDDLE:
if (doubleClick) {
stage.setWidth(dimX / 2);
stage.setHeight(dimY);
stage.setX(posX + dimX - stage.getWidth());
stage.setY(posY);
} else {
stage.setX(posX + dimX - stage.getWidth());
stage.setY(posY + (dimY / 2) - (stage.getHeight() / 2));
}
break;
case LEFT_BOTTOM:
if (doubleClick) {
stage.setWidth(dimX / 2);
stage.setHeight(dimY / 2);
stage.setX(posX);
stage.setY(posY + dimY - stage.getHeight());
} else {
stage.setX(posX);
stage.setY(posY + dimY - stage.getHeight());
}
break;
case MIDDLE_BOTTOM:
if (doubleClick) {
stage.setWidth(dimX);
stage.setHeight(dimY / 2);
stage.setX(posX + (dimX / 2) - (stage.getWidth() / 2));
stage.setY(posY + dimY - stage.getHeight());
} else {
stage.setX(posX + (dimX / 2) - (stage.getWidth() / 2));
stage.setY(posY + dimY - stage.getHeight());
}
break;
case RIGHT_BOTTOM:
if (doubleClick) {
stage.setWidth(dimX / 2);
stage.setHeight(dimY / 2);
stage.setX(posX + dimX - stage.getWidth());
stage.setY(posY + dimY - stage.getHeight());
} else {
stage.setX(posX + dimX - stage.getWidth());
stage.setY(posY + dimY - stage.getHeight());
}
break;
case RESIZE_HEIGHT:
stage.setHeight(dimY);
stage.setX(posX);
stage.setY(posY);
break;
case RESIZE_WIDTH:
stage.setWidth(dimX);
stage.setX(posX);
stage.setY(posY);
break;
case FULLSCREEN:
/*
* set correct screen for applying fullscreenmode - the fullscreen
* mode will be applied with ActionEvent in ScreenFXGridAllocator!
*/
stage.setWidth(dimX);
stage.setHeight(dimY);
stage.setX(posX);
stage.setY(posY);
break;
default:
break;
}
;
}
/**
* @return the screen number
*/
public int getScreenNr() {
return screenNr;
}
Stage getStage() {
return stage;
}
}