diff --git a/Quelea/src/main/java/org/quelea/windows/main/DisplayStage.java b/Quelea/src/main/java/org/quelea/windows/main/DisplayStage.java index 55bd8f2d6d..d0ab09da50 100644 --- a/Quelea/src/main/java/org/quelea/windows/main/DisplayStage.java +++ b/Quelea/src/main/java/org/quelea/windows/main/DisplayStage.java @@ -44,7 +44,7 @@ */ public class DisplayStage extends Stage { - private static final Logger LOGGER = LoggerUtils.getLogger(); + protected static final Logger LOGGER = LoggerUtils.getLogger(); private static final Cursor BLANK_CURSOR; private final DisplayCanvas canvas; private final TestImage testImage; @@ -109,30 +109,34 @@ public void changed(ObservableValue ov, Number t, Number t1) { addVLCListeners(); } } + + protected void windowChanged() { + // do nothing on purpose + } private void addVLCListeners() { widthProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, Number newValue) { - VLCWindow.INSTANCE.refreshPosition(); + windowChanged(); } }); heightProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, Number newValue) { - VLCWindow.INSTANCE.refreshPosition(); + windowChanged(); } }); xProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, Number newValue) { - VLCWindow.INSTANCE.refreshPosition(); + windowChanged(); } }); yProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Number oldValue, Number newValue) { - VLCWindow.INSTANCE.refreshPosition(); + windowChanged(); } }); } diff --git a/Quelea/src/main/java/org/quelea/windows/main/Main.java b/Quelea/src/main/java/org/quelea/windows/main/Main.java index 7e0c7dd6b9..b4448f8c26 100644 --- a/Quelea/src/main/java/org/quelea/windows/main/Main.java +++ b/Quelea/src/main/java/org/quelea/windows/main/Main.java @@ -64,8 +64,8 @@ public final class Main extends Application { private static Logger LOGGER; private MainWindow mainWindow; - private DisplayStage fullScreenWindow; - private DisplayStage stageWindow; + private ProjectorWindow projectorWindow; + private StageWindow stageWindow; private Dialog vlcWarningDialog; public static void main(String[] args) { @@ -104,6 +104,11 @@ public void start(Stage stage) { @Override public void run() { try { + + final ObservableList monitors = Screen.getScreens(); + LOGGER.log(Level.INFO, "Number of displays: {0}", monitors.size()); + final int monitorNumber = monitors.size(); + boolean vlcOk = false; try { vlcOk = new VLCDiscovery().getNativeDiscovery().discover(); @@ -114,32 +119,15 @@ public void run() { final boolean VLC_INIT; if (VLC_OK) { VLC_INIT = VLCWindow.INSTANCE.isInit(); + if (ProjectorWindow.needsHidding()) { + VLCWindow.INSTANCE.hide(); + } } else { VLC_INIT = false; - } + } new FontInstaller().setupBundledFonts(); new UserFileChecker(QueleaProperties.get().getQueleaUserHome()).checkUserFiles(); - final ObservableList monitors = Screen.getScreens(); - LOGGER.log(Level.INFO, "Number of displays: {0}", monitors.size()); - - final int projectorScreen = QueleaProperties.get().getProjectorScreen(); - final int stageScreen = QueleaProperties.get().getStageScreen(); - final int monitorNumber = monitors.size(); - - final boolean lyricsHidden; - if (!QueleaProperties.get().isProjectorModeCoords() && (projectorScreen >= monitorNumber || projectorScreen < 0)) { - lyricsHidden = true; - } else { - lyricsHidden = false; - } - final boolean stageHidden; - if (!QueleaProperties.get().isStageModeCoords() && (stageScreen >= monitorNumber || stageScreen < 0)) { - stageHidden = true; - } else { - stageHidden = false; - } - if (QueleaProperties.get().getUseMobLyrics()) { LOGGER.log(Level.INFO, "Starting lyric server on {0}", QueleaProperties.get().getMobLyricsPort()); try { @@ -185,51 +173,17 @@ public void run() { System.setProperty("http.proxyUser", QueleaProperties.get().getWebProxyUser()); System.setProperty("http.proxyPassword", QueleaProperties.get().getWebProxyPassword()); } - if (lyricsHidden) { - LOGGER.log(Level.INFO, "Hiding projector display on monitor 0 (base 0!)"); - Platform.runLater(() -> { - fullScreenWindow = new DisplayStage(Utils.getBoundsFromRect2D(monitors.get(0).getVisualBounds()), false); - fullScreenWindow.hide(); - }); - } else if (QueleaProperties.get().isProjectorModeCoords()) { - LOGGER.log(Level.INFO, "Starting projector display: ", QueleaProperties.get().getProjectorCoords()); - Platform.runLater(() -> { - fullScreenWindow = new DisplayStage(QueleaProperties.get().getProjectorCoords(), false); - }); - } else { - LOGGER.log(Level.INFO, "Starting projector display on monitor {0} (base 0!)", projectorScreen); - Platform.runLater(() -> { - fullScreenWindow = new DisplayStage(Utils.getBoundsFromRect2D(monitors.get(projectorScreen).getBounds()), false); - fullScreenWindow.setFullScreenAlwaysOnTop(true); - }); - } - + Platform.runLater(() -> { - QueleaApp.get().setProjectionWindow(fullScreenWindow); + projectorWindow = ProjectorWindow.create(); + QueleaApp.get().setProjectionWindow(projectorWindow); }); - - if (stageHidden) { - LOGGER.log(Level.INFO, "Hiding stage display on monitor 0 (base 0!)"); - Platform.runLater(() -> { - stageWindow = new DisplayStage(Utils.getBoundsFromRect2D(monitors.get(0).getVisualBounds()), true); - stageWindow.hide(); - }); - } else if (QueleaProperties.get().isStageModeCoords()) { - Platform.runLater(() -> { - LOGGER.log(Level.INFO, "Starting stage display: ", QueleaProperties.get().getStageCoords()); - stageWindow = new DisplayStage(QueleaProperties.get().getStageCoords(), true); - }); - } else { - Platform.runLater(() -> { - LOGGER.log(Level.INFO, "Starting stage display on monitor {0} (base 0!)", stageScreen); - stageWindow = new DisplayStage(Utils.getBoundsFromRect2D(monitors.get(stageScreen).getVisualBounds()), true); - }); - } - + Platform.runLater(() -> { + stageWindow = StageWindow.create(); QueleaApp.get().setStageWindow(stageWindow); }); - + backgroundExecutor.submit(() -> { LOGGER.log(Level.INFO, "Loading bibles"); BibleManager.get(); @@ -253,17 +207,17 @@ public void run() { LOGGER.log(Level.INFO, "Registering canvases"); Platform.runLater(() -> { - mainWindow.getMainPanel().getLivePanel().registerDisplayCanvas(fullScreenWindow.getCanvas()); - mainWindow.getMainPanel().getLivePanel().registerDisplayWindow(fullScreenWindow); - mainWindow.getNoticeDialog().registerCanvas(fullScreenWindow.getCanvas()); - if (lyricsHidden) { - fullScreenWindow.hide(); + mainWindow.getMainPanel().getLivePanel().registerDisplayCanvas(projectorWindow.getCanvas()); + mainWindow.getMainPanel().getLivePanel().registerDisplayWindow(projectorWindow); + mainWindow.getNoticeDialog().registerCanvas(projectorWindow.getCanvas()); + if (ProjectorWindow.needsHidding()) { + projectorWindow.hide(); } else { - fullScreenWindow.show(); + projectorWindow.show(); } mainWindow.getMainPanel().getLivePanel().registerDisplayCanvas(stageWindow.getCanvas()); mainWindow.getMainPanel().getLivePanel().registerDisplayWindow(stageWindow); - if (stageHidden) { + if (stageWindow.needsHidding()) { stageWindow.hide(); } else { stageWindow.show(); diff --git a/Quelea/src/main/java/org/quelea/windows/main/ProjectorWindow.java b/Quelea/src/main/java/org/quelea/windows/main/ProjectorWindow.java new file mode 100644 index 0000000000..545f157953 --- /dev/null +++ b/Quelea/src/main/java/org/quelea/windows/main/ProjectorWindow.java @@ -0,0 +1,89 @@ +/* + * This file is part of Quelea, free projection software for churches. + * + * + * 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 . + */ +package org.quelea.windows.main; + +import java.util.logging.Level; +import javafx.application.Platform; +import javafx.collections.ObservableList; +import javafx.geometry.Bounds; +import javafx.stage.Screen; +import org.quelea.services.utils.QueleaProperties; +import org.quelea.services.utils.Utils; +import org.quelea.windows.multimedia.VLCWindow; +import org.quelea.services.utils.LoggerUtils; +import java.util.logging.Logger; + +/** + * + * @author Fabian + */ +public class ProjectorWindow extends DisplayStage { + + public static ProjectorWindow create() { + final ObservableList monitors = Screen.getScreens(); + final int projectorScreen = QueleaProperties.get().getProjectorScreen(); + ProjectorWindow window = null; + if (needsHidding()) { + LOGGER.log(Level.INFO, "Hiding projector display on monitor 0 (base 0!)"); + window = new ProjectorWindow(Utils.getBoundsFromRect2D(monitors.get(0).getVisualBounds()), false); + window.hide(); + } else if (QueleaProperties.get().isProjectorModeCoords()) { + LOGGER.log(Level.INFO, "Starting projector display: ", QueleaProperties.get().getProjectorCoords()); + window = new ProjectorWindow(QueleaProperties.get().getProjectorCoords(), false); + } else { + LOGGER.log(Level.INFO, "Starting projector display on monitor {0} (base 0!)", projectorScreen); + window = new ProjectorWindow(Utils.getBoundsFromRect2D(monitors.get(projectorScreen).getBounds()), false); + window.setFullScreenAlwaysOnTop(true); + } + + return window; + } + + public ProjectorWindow(Bounds area, boolean stageView) { + super(area, stageView); + } + + public static boolean needsHidding() { + final ObservableList monitors = Screen.getScreens(); + final int projectorScreen = QueleaProperties.get().getProjectorScreen(); + final int monitorNumber = monitors.size(); + + final boolean windowNeedsHidding; + if (!QueleaProperties.get().isProjectorModeCoords() && (projectorScreen >= monitorNumber || projectorScreen < 0)) { + windowNeedsHidding = true; + } else { + windowNeedsHidding = false; + } + + return windowNeedsHidding; + } + + @Override + protected void windowChanged() { + + // this is here incase the projector monitor drops out + // which often happens at my church when another TV is plugged in or out + if (needsHidding()) { + hide(); + VLCWindow.INSTANCE.hide(); + } + else { + VLCWindow.INSTANCE.refreshPosition(); + } + } +} diff --git a/Quelea/src/main/java/org/quelea/windows/main/QueleaApp.java b/Quelea/src/main/java/org/quelea/windows/main/QueleaApp.java index 86b1df771a..eaad571134 100644 --- a/Quelea/src/main/java/org/quelea/windows/main/QueleaApp.java +++ b/Quelea/src/main/java/org/quelea/windows/main/QueleaApp.java @@ -35,8 +35,8 @@ public class QueleaApp { private static final QueleaApp INSTANCE = new QueleaApp(); private MainWindow mainWindow; - private DisplayStage projectionWindow; - private DisplayStage stageWindow; + private ProjectorWindow projectionWindow; + private StageWindow stageWindow; private MobileLyricsServer mls; private RemoteControlServer rcs; private AutoDetectServer ads; @@ -85,7 +85,7 @@ public void openSchedule(File file) { * Get the projection window. * @return the projection window. */ - public DisplayStage getProjectionWindow() { + public ProjectorWindow getProjectionWindow() { return projectionWindow; } @@ -93,7 +93,7 @@ public DisplayStage getProjectionWindow() { * Get the stage window. * @return the stage window. */ - public DisplayStage getStageWindow() { + public StageWindow getStageWindow() { return stageWindow; } @@ -150,7 +150,7 @@ public void setRemoteControlServer(RemoteControlServer rcs) { * Set the projection window. * @param projectionWindow the projection window. */ - public void setProjectionWindow(DisplayStage projectionWindow) { + public void setProjectionWindow(ProjectorWindow projectionWindow) { this.projectionWindow = projectionWindow; } @@ -158,7 +158,7 @@ public void setProjectionWindow(DisplayStage projectionWindow) { * Set the stage window. * @param lyricWindow the stage window. */ - public void setStageWindow(DisplayStage lyricWindow) { + public void setStageWindow(StageWindow lyricWindow) { this.stageWindow = lyricWindow; } diff --git a/Quelea/src/main/java/org/quelea/windows/main/StageWindow.java b/Quelea/src/main/java/org/quelea/windows/main/StageWindow.java new file mode 100644 index 0000000000..69dba4a812 --- /dev/null +++ b/Quelea/src/main/java/org/quelea/windows/main/StageWindow.java @@ -0,0 +1,80 @@ +/* + * This file is part of Quelea, free projection software for churches. + * + * + * 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 . + */ +package org.quelea.windows.main; + +import java.util.logging.Level; +import javafx.collections.ObservableList; +import javafx.geometry.Bounds; +import javafx.stage.Screen; +import org.quelea.services.utils.QueleaProperties; +import org.quelea.services.utils.Utils; + +/** + * + * @author Fabian + */ +public class StageWindow extends DisplayStage { + + public static StageWindow create() { + final ObservableList monitors = Screen.getScreens(); + final int projectorScreen = QueleaProperties.get().getProjectorScreen(); + StageWindow window = null; + if (needsHidding()) { + LOGGER.log(Level.INFO, "Hiding stage display on monitor 0 (base 0!)"); + window = new StageWindow(Utils.getBoundsFromRect2D(monitors.get(0).getVisualBounds()), true); + window.hide(); + } else if (QueleaProperties.get().isStageModeCoords()) { + LOGGER.log(Level.INFO, "Starting stage display: ", QueleaProperties.get().getStageCoords()); + window = new StageWindow(QueleaProperties.get().getStageCoords(), true); + } else { + final int stageScreen = QueleaProperties.get().getStageScreen(); + LOGGER.log(Level.INFO, "Starting stage display on monitor {0} (base 0!)", stageScreen); + window = new StageWindow(Utils.getBoundsFromRect2D(monitors.get(stageScreen).getVisualBounds()), true); + } + + return window; + } + public StageWindow(Bounds area, boolean stageView) { + super(area, stageView); + } + + public static boolean needsHidding() { + final ObservableList monitors = Screen.getScreens(); + + final int stageScreen = QueleaProperties.get().getStageScreen(); + final int monitorNumber = monitors.size(); + + final boolean windowNeedsHidding; + if (!QueleaProperties.get().isStageModeCoords() && (stageScreen >= monitorNumber || stageScreen < 0)) { + windowNeedsHidding = true; + } else { + windowNeedsHidding = false; + } + + return windowNeedsHidding; + } + + @Override + protected void windowChanged() { + + // this is here incase the stage monitor drops out + if (needsHidding()) { + hide(); + } + } +} diff --git a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java index 9f90eda772..78116364e8 100644 --- a/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java +++ b/Quelea/src/main/java/org/quelea/windows/options/OptionsDisplaySetupPanel.java @@ -27,7 +27,9 @@ import org.quelea.windows.main.DisplayStage; import org.quelea.windows.main.GraphicsDeviceListener; import org.quelea.windows.main.GraphicsDeviceWatcher; +import org.quelea.windows.main.ProjectorWindow; import org.quelea.windows.main.QueleaApp; +import org.quelea.windows.main.StageWindow; import org.quelea.windows.multimedia.VLCWindow; /** @@ -117,19 +119,19 @@ public final void readProperties() { */ private void updatePos() { // MainWindow mainWindow = Application.get().getMainWindow(); - DisplayStage appWindow = QueleaApp.get().getProjectionWindow(); - DisplayStage stageWindow = QueleaApp.get().getStageWindow(); + ProjectorWindow projectorWindow = QueleaApp.get().getProjectionWindow(); + StageWindow stageWindow = QueleaApp.get().getStageWindow(); if(projectorPanel.getOutputBounds() == null) { - if(appWindow != null) { - appWindow.setFullScreenAlwaysOnTopImmediate(false); - appWindow.hide(); + if(projectorWindow != null) { + projectorWindow.setFullScreenAlwaysOnTopImmediate(false); + projectorWindow.hide(); } } else { - if(appWindow == null) { - appWindow = new DisplayStage(projectorPanel.getOutputBounds(), false); + if(projectorWindow == null) { + projectorWindow = new ProjectorWindow(projectorPanel.getOutputBounds(), false); } - final DisplayStage fiLyricWindow = appWindow; //Fudge for AIC + final DisplayStage fiLyricWindow = projectorWindow; //Fudge for AIC Platform.runLater(new Runnable() { @Override public void run() { @@ -152,7 +154,7 @@ public void run() { } else { if(stageWindow == null) { - stageWindow = new DisplayStage(projectorPanel.getOutputBounds(), true); + stageWindow = new StageWindow(projectorPanel.getOutputBounds(), true); } final DisplayStage fiStageWindow = stageWindow; //Fudge for AIC Platform.runLater(new Runnable() {