Merge pull request #1475 from SiboVG/issue-1470
[#1470] Move component config dialog to center if outside parent's monitor
This commit is contained in:
		
						commit
						d78e595532
					
				@ -1,18 +1,24 @@
 | 
			
		||||
package net.sf.openrocket.gui.configdialog;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import java.awt.GraphicsDevice;
 | 
			
		||||
import java.awt.GraphicsEnvironment;
 | 
			
		||||
import java.awt.Rectangle;
 | 
			
		||||
import java.awt.Window;
 | 
			
		||||
import java.awt.event.WindowAdapter;
 | 
			
		||||
import java.awt.event.WindowEvent;
 | 
			
		||||
import java.lang.reflect.Constructor;
 | 
			
		||||
import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JDialog;
 | 
			
		||||
 | 
			
		||||
import net.sf.openrocket.document.OpenRocketDocument;
 | 
			
		||||
import net.sf.openrocket.gui.main.BasicFrame;
 | 
			
		||||
import net.sf.openrocket.gui.util.GUIUtil;
 | 
			
		||||
import net.sf.openrocket.gui.util.SwingPreferences;
 | 
			
		||||
import net.sf.openrocket.gui.util.WindowLocationUtil;
 | 
			
		||||
import net.sf.openrocket.l10n.Translator;
 | 
			
		||||
import net.sf.openrocket.rocketcomponent.AxialStage;
 | 
			
		||||
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
 | 
			
		||||
@ -257,6 +263,9 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis
 | 
			
		||||
 | 
			
		||||
		dialog = new ComponentConfigDialog(parent, document, component);
 | 
			
		||||
		dialog.setVisible(true);
 | 
			
		||||
		if (parent instanceof BasicFrame && BasicFrame.getStartupFrame() == parent) {
 | 
			
		||||
			WindowLocationUtil.moveIfOutsideOfParentMonitor(dialog, parent);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		////Modify
 | 
			
		||||
		if (includeUndoModify) {
 | 
			
		||||
 | 
			
		||||
@ -118,6 +118,7 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
	 * it is time to exit the application.
 | 
			
		||||
	 */
 | 
			
		||||
	private static final ArrayList<BasicFrame> frames = new ArrayList<BasicFrame>();
 | 
			
		||||
	private static BasicFrame startupFrame = null;	// the frame that was created at startup
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@ -1231,6 +1232,19 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
		return menu;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return the frame that was created at the application's startup.
 | 
			
		||||
	 */
 | 
			
		||||
	public static BasicFrame getStartupFrame() {
 | 
			
		||||
		return startupFrame;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Set the frame that is created at the application's startup.
 | 
			
		||||
	 */
 | 
			
		||||
	public static void setStartupFrame(BasicFrame startupFrame) {
 | 
			
		||||
		BasicFrame.startupFrame = startupFrame;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Select the tab on the main pane.
 | 
			
		||||
@ -1273,7 +1287,7 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
 | 
			
		||||
		for (File file : files) {
 | 
			
		||||
			log.info("Opening file: " + file);
 | 
			
		||||
			if (open(file, parent)) {
 | 
			
		||||
			if (open(file, parent) != null) {
 | 
			
		||||
				MRUDesignFile opts = MRUDesignFile.getInstance();
 | 
			
		||||
				opts.addFile(file.getAbsolutePath());
 | 
			
		||||
			}
 | 
			
		||||
@ -1303,7 +1317,7 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
 | 
			
		||||
		for (File file : files) {
 | 
			
		||||
			log.info("Opening file: " + file);
 | 
			
		||||
			if (open(file, this)) {
 | 
			
		||||
			if (open(file, this) != null) {
 | 
			
		||||
				MRUDesignFile opts = MRUDesignFile.getInstance();
 | 
			
		||||
				opts.addFile(file.getAbsolutePath());
 | 
			
		||||
			}
 | 
			
		||||
@ -1373,9 +1387,9 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param file		the file to open.
 | 
			
		||||
	 * @param parent	the parent component for which a progress dialog is opened.
 | 
			
		||||
	 * @return			whether the file was successfully loaded and opened.
 | 
			
		||||
	 * @return			the BasicFrame that was created, or null if not created successfully.
 | 
			
		||||
	 */
 | 
			
		||||
	public static boolean open(File file, Window parent) {
 | 
			
		||||
	public static BasicFrame open(File file, Window parent) {
 | 
			
		||||
		OpenFileWorker worker = new OpenFileWorker(file);
 | 
			
		||||
		return open(worker, file.getName(), parent, false);
 | 
			
		||||
	}
 | 
			
		||||
@ -1388,15 +1402,15 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
	 * @param displayName	the file name to display in dialogs.
 | 
			
		||||
	 * @param parent
 | 
			
		||||
	 * @param openRocketConfigDialog if true, will open the configuration dialog of the rocket.  This is useful for examples.
 | 
			
		||||
	 * @return
 | 
			
		||||
	 * @return the BasicFrame that was created, or null if not created successfully.
 | 
			
		||||
	 */
 | 
			
		||||
	private static boolean open(OpenFileWorker worker, String displayName, Window parent, boolean openRocketConfigDialog) {
 | 
			
		||||
	private static BasicFrame open(OpenFileWorker worker, String displayName, Window parent, boolean openRocketConfigDialog) {
 | 
			
		||||
		////	Open the file in a Swing worker thread
 | 
			
		||||
		log.info("Starting OpenFileWorker");
 | 
			
		||||
		if (!SwingWorkerDialog.runWorker(parent, "Opening file", "Reading " + displayName + "...", worker)) {
 | 
			
		||||
			//	//	User cancelled the operation
 | 
			
		||||
			log.info("User cancelled the OpenFileWorker");
 | 
			
		||||
			return false;
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		////	Handle the document
 | 
			
		||||
@ -1415,7 +1429,7 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
				JOptionPane.showMessageDialog(parent,
 | 
			
		||||
						"File not found: " + displayName,
 | 
			
		||||
						"Error opening file", JOptionPane.ERROR_MESSAGE);
 | 
			
		||||
				return false;
 | 
			
		||||
				return null;
 | 
			
		||||
 | 
			
		||||
			} else if (cause instanceof RocketLoadException) {
 | 
			
		||||
 | 
			
		||||
@ -1424,7 +1438,7 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
						"Unable to open file '" + displayName + "': "
 | 
			
		||||
								+ cause.getMessage(),
 | 
			
		||||
								"Error opening file", JOptionPane.ERROR_MESSAGE);
 | 
			
		||||
				return false;
 | 
			
		||||
				return null;
 | 
			
		||||
 | 
			
		||||
			} else {
 | 
			
		||||
 | 
			
		||||
@ -1468,7 +1482,7 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
			ComponentConfigDialog.showDialog(frame, doc, doc.getRocket());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return true;
 | 
			
		||||
		return frame;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1774,24 +1788,27 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
	/**
 | 
			
		||||
	 * Opens a new design file or the last design file, if set in the preferences.
 | 
			
		||||
	 * Can be used for reopening the application or opening it the first time.
 | 
			
		||||
	 * @return the BasicFrame that was created
 | 
			
		||||
	 */
 | 
			
		||||
	public static void reopen() {
 | 
			
		||||
	public static BasicFrame reopen() {
 | 
			
		||||
		if (!Application.getPreferences().isAutoOpenLastDesignOnStartupEnabled()) {
 | 
			
		||||
			BasicFrame.newAction();
 | 
			
		||||
			return BasicFrame.newAction();
 | 
			
		||||
		} else {
 | 
			
		||||
			String lastFile = MRUDesignFile.getInstance().getLastEditedDesignFile();
 | 
			
		||||
			if (lastFile != null) {
 | 
			
		||||
				log.info("Opening last design file: " + lastFile);
 | 
			
		||||
				if (!BasicFrame.open(new File(lastFile), null)) {
 | 
			
		||||
				BasicFrame frame = BasicFrame.open(new File(lastFile), null);
 | 
			
		||||
				if (frame == null) {
 | 
			
		||||
					MRUDesignFile.getInstance().removeFile(lastFile);
 | 
			
		||||
					BasicFrame.newAction();
 | 
			
		||||
					return BasicFrame.newAction();
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					MRUDesignFile.getInstance().addFile(lastFile);
 | 
			
		||||
					return frame;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				BasicFrame.newAction();
 | 
			
		||||
				return BasicFrame.newAction();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -1799,8 +1816,9 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Open a new design window with a basic rocket+stage.
 | 
			
		||||
	 * @return the BasicFrame that was created
 | 
			
		||||
	 */
 | 
			
		||||
	public static void newAction() {
 | 
			
		||||
	public static BasicFrame newAction() {
 | 
			
		||||
		log.info("New action initiated");
 | 
			
		||||
 | 
			
		||||
		OpenRocketDocument doc = OpenRocketDocumentFactory.createNewRocket();
 | 
			
		||||
@ -1808,6 +1826,7 @@ public class BasicFrame extends JFrame {
 | 
			
		||||
		BasicFrame frame = new BasicFrame(doc);
 | 
			
		||||
		frame.replaceable = true;
 | 
			
		||||
		frame.setVisible(true);
 | 
			
		||||
		return frame;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -73,7 +73,7 @@ public final class MRUDesignFileAction extends JMenu {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void actionPerformed(ActionEvent e) {
 | 
			
		||||
                String command = e.getActionCommand();
 | 
			
		||||
                if (BasicFrame.open(new File(command), parent)) {
 | 
			
		||||
                if (BasicFrame.open(new File(command), parent) != null) {
 | 
			
		||||
                    MRUDesignFile.getInstance().addFile(command);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										74
									
								
								swing/src/net/sf/openrocket/gui/util/WindowLocationUtil.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								swing/src/net/sf/openrocket/gui/util/WindowLocationUtil.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,74 @@
 | 
			
		||||
package net.sf.openrocket.gui.util;
 | 
			
		||||
 | 
			
		||||
import java.awt.GraphicsDevice;
 | 
			
		||||
import java.awt.Window;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper class for setting the location of a Swing window. E.g. to check when the window is outside the screen and
 | 
			
		||||
 * recenter it if so.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Sibo Van Gool <sibo.vangool@hotmail.com>
 | 
			
		||||
 */
 | 
			
		||||
public abstract class WindowLocationUtil {
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets the location of the window, but don't go outside the screen.
 | 
			
		||||
     * @param window the window to move
 | 
			
		||||
     * @param x the target x position on the screen
 | 
			
		||||
     * @param y the target y position on the screen
 | 
			
		||||
     */
 | 
			
		||||
    public static void setLocationWithinScreen(Window window, int x, int y) {
 | 
			
		||||
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
 | 
			
		||||
        java.awt.Dimension windowSize = window.getSize();
 | 
			
		||||
        int screenWidth = screenSize.width;
 | 
			
		||||
        int screenHeight = screenSize.height;
 | 
			
		||||
        int windowWidth = windowSize.width;
 | 
			
		||||
        int windowHeight = windowSize.height;
 | 
			
		||||
        int xPos = x;
 | 
			
		||||
        int yPos = y;
 | 
			
		||||
        if (xPos + windowWidth > screenWidth) {
 | 
			
		||||
            xPos = screenWidth - windowWidth;
 | 
			
		||||
        }
 | 
			
		||||
        if (yPos + windowHeight > screenHeight) {
 | 
			
		||||
            yPos = screenHeight - windowHeight;
 | 
			
		||||
        }
 | 
			
		||||
        window.setLocation(xPos, yPos);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Moves the window to the center of the screen if its location is outside the boundary of the screen.
 | 
			
		||||
     * @param window window to move
 | 
			
		||||
     */
 | 
			
		||||
    public static void moveIfOutsideOfMonitor(Window window) {
 | 
			
		||||
        GraphicsDevice currentDevice = window.getGraphicsConfiguration().getDevice();
 | 
			
		||||
        if (currentDevice != null && window.isVisible() &&
 | 
			
		||||
                !currentDevice.getDefaultConfiguration().getBounds().contains(window.getLocationOnScreen())) {
 | 
			
		||||
            int width = currentDevice.getDefaultConfiguration().getBounds().width;
 | 
			
		||||
            int height = currentDevice.getDefaultConfiguration().getBounds().height;
 | 
			
		||||
            window.setLocation(
 | 
			
		||||
                    ((width / 2) - (window.getSize().width / 2)) + currentDevice.getDefaultConfiguration().getBounds().x,
 | 
			
		||||
                    ((height / 2) - (window.getSize().height / 2)) + currentDevice.getDefaultConfiguration().getBounds().y
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Moves the window to the center of the screen if it is on another monitor as the parent window, or if its location
 | 
			
		||||
     * is outside the boundary of the parent's monitor screen.
 | 
			
		||||
     * @param window window to move
 | 
			
		||||
     * @param parent parent window
 | 
			
		||||
     */
 | 
			
		||||
    public static void moveIfOutsideOfParentMonitor(Window window, Window parent) {
 | 
			
		||||
        GraphicsDevice parentDevice = parent.getGraphicsConfiguration().getDevice();
 | 
			
		||||
        GraphicsDevice currentDevice = window.getGraphicsConfiguration().getDevice();
 | 
			
		||||
        if (parentDevice != null && (currentDevice == null || currentDevice != parentDevice ||
 | 
			
		||||
                (window.isVisible() && !parentDevice.getDefaultConfiguration().getBounds().contains(
 | 
			
		||||
                        window.getLocationOnScreen())))) {
 | 
			
		||||
            int width = parentDevice.getDefaultConfiguration().getBounds().width;
 | 
			
		||||
            int height = parentDevice.getDefaultConfiguration().getBounds().height;
 | 
			
		||||
            window.setLocation(
 | 
			
		||||
                    ((width / 2) - (window.getSize().width / 2)) + parentDevice.getDefaultConfiguration().getBounds().x,
 | 
			
		||||
                    ((height / 2) - (window.getSize().height / 2)) + parentDevice.getDefaultConfiguration().getBounds().y
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -223,7 +223,8 @@ public class SwingStartup {
 | 
			
		||||
		// Starting action (load files or open new document)
 | 
			
		||||
		log.info("Opening main application window");
 | 
			
		||||
		if (!handleCommandLine(args)) {
 | 
			
		||||
			BasicFrame.reopen();
 | 
			
		||||
			BasicFrame startupFrame = BasicFrame.reopen();
 | 
			
		||||
			BasicFrame.setStartupFrame(startupFrame);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// Check whether update info has been fetched or whether it needs more time
 | 
			
		||||
@ -298,7 +299,7 @@ public class SwingStartup {
 | 
			
		||||
		// Check command-line for files
 | 
			
		||||
		boolean opened = false;
 | 
			
		||||
		for (String file : args) {
 | 
			
		||||
			if (BasicFrame.open(new File(file), null)) {
 | 
			
		||||
			if (BasicFrame.open(new File(file), null) != null) {
 | 
			
		||||
				opened = true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user