X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosuilib%2FAltosUIFrame.java;h=5b915e85aba3c5ec4c059a3e7fb8554c7187abd9;hp=409aea2e98dea105fe6c2abeec3c8cf673ac3def;hb=d5bdb1c5974788b9569897435808fd01b04b0c4d;hpb=65b512c890a3ccf487655b79305ab1cfcf49259c diff --git a/altosuilib/AltosUIFrame.java b/altosuilib/AltosUIFrame.java index 409aea2e..5b915e85 100644 --- a/altosuilib/AltosUIFrame.java +++ b/altosuilib/AltosUIFrame.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib; +package org.altusmetrum.altosuilib_3; import java.awt.*; import java.awt.event.*; @@ -28,7 +28,7 @@ class AltosUIFrameListener extends WindowAdapter { } } -public class AltosUIFrame extends JFrame implements AltosUIListener { +public class AltosUIFrame extends JFrame implements AltosUIListener, AltosPositionListener { public void ui_changed(String look_and_feel) { SwingUtilities.updateComponentTreeUI(this); @@ -45,7 +45,7 @@ public class AltosUIFrame extends JFrame implements AltosUIListener { }; static public String[] icon_names; - + static public void set_icon_names(String[] new_icon_names) { icon_names = new_icon_names; } public String[] icon_names() { @@ -57,7 +57,7 @@ public class AltosUIFrame extends JFrame implements AltosUIListener { public void set_icon() { ArrayList icons = new ArrayList(); String[] icon_names = icon_names(); - + for (int i = 0; i < icon_names.length; i++) { java.net.URL imgURL = AltosUIFrame.class.getResource(icon_names[i]); if (imgURL != null) @@ -65,18 +65,173 @@ public class AltosUIFrame extends JFrame implements AltosUIListener { } setIconImages(icons); } - - public AltosUIFrame() { + private boolean location_by_platform = true; + + public void setLocationByPlatform(boolean lbp) { + location_by_platform = lbp; + super.setLocationByPlatform(lbp); + } + + public void scan_device_selected(AltosDevice device) { + } + + public void setSize() { + /* Smash sizes around so that the window comes up in the right shape */ + Insets i = getInsets(); + Dimension ps = rootPane.getPreferredSize(); + ps.width += i.left + i.right; + ps.height += i.top + i.bottom; + setPreferredSize(ps); + setSize(ps); + } + + public void setPosition (int position) { + Insets i = getInsets(); + Dimension ps = getSize(); + + /* Stick the window in the desired location on the screen */ + setLocationByPlatform(false); + GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); + GraphicsConfiguration gc = gd.getDefaultConfiguration(); + Rectangle r = gc.getBounds(); + + /* compute X position */ + int x = 0; + int y = 0; + switch (position) { + case AltosUILib.position_top_left: + case AltosUILib.position_left: + case AltosUILib.position_bottom_left: + x = 0; + break; + case AltosUILib.position_top: + case AltosUILib.position_center: + case AltosUILib.position_bottom: + x = (r.width - ps.width) / 2; + break; + case AltosUILib.position_top_right: + case AltosUILib.position_right: + case AltosUILib.position_bottom_right: + x = r.width - ps.width + i.right; + break; + } + + /* compute Y position */ + switch (position) { + case AltosUILib.position_top_left: + case AltosUILib.position_top: + case AltosUILib.position_top_right: + y = 0; + break; + case AltosUILib.position_left: + case AltosUILib.position_center: + case AltosUILib.position_right: + y = (r.height - ps.height) / 2; + break; + case AltosUILib.position_bottom_left: + case AltosUILib.position_bottom: + case AltosUILib.position_bottom_right: + y = r.height - ps.height + i.bottom; + break; + } + setLocation(x, y); + } + + int position; + + public void position_changed(int position) { + this.position = position; + if (!location_by_platform) + setPosition(position); + } + + public void setVisible (boolean visible) { + if (visible) + setLocationByPlatform(location_by_platform); + super.setVisible(visible); + if (visible) { + setSize(); + if (!location_by_platform) + setPosition(position); + } + } + + static boolean global_settings_done; + + public String getName() { + return "Altus Metrum"; + } + + public void macosx_quit_handler() { + System.out.printf("Got quit handler\n"); + } + + public void macosx_about_handler() { + System.out.printf("Got about handler\n"); + } + + public void macosx_preferences_handler() { + System.out.printf("Got preferences handler\n"); + } + + public void macosx_file_handler(String path) { + System.out.printf("Got file handler with \"%s\"\n", path); + } + + /* Check that we are on Mac OS X. This is crucial to loading and using the OSXAdapter class. + */ + public static boolean MAC_OS_X = (System.getProperty("os.name").toLowerCase().startsWith("mac os x")); + + private static boolean registered_for_macosx_events; + + /* Generic registration with the Mac OS X application menu + * Checks the platform, then attempts to register with the Apple EAWT + * See OSXAdapter.java to see how this is done without directly referencing any Apple APIs + */ + public synchronized void register_for_macosx_events() { + if (registered_for_macosx_events) + return; + registered_for_macosx_events = true; + if (MAC_OS_X) { + try { + // Generate and register the OSXAdapter, passing it a hash of all the methods we wish to + // use as delegates for various com.apple.eawt.ApplicationListener methods + OSXAdapter.setQuitHandler(this, getClass().getDeclaredMethod("macosx_quit_handler", (Class[])null)); +// OSXAdapter.setAboutHandler(this, getClass().getDeclaredMethod("macosx_about_handler", (Class[])null)); + OSXAdapter.setPreferencesHandler(this, getClass().getDeclaredMethod("macosx_preferences_handler", (Class[])null)); + OSXAdapter.setFileHandler(this, getClass().getDeclaredMethod("macosx_file_handler", new Class[] { String.class })); + } catch (Exception e) { + System.err.println("Error while loading the OSXAdapter:"); + e.printStackTrace(); + } + } + } + void init() { AltosUIPreferences.register_ui_listener(this); + AltosUIPreferences.register_position_listener(this); + position = AltosUIPreferences.position(); addWindowListener(new AltosUIFrameListener()); + + /* Try to make menus live in the menu bar like regular Mac apps */ + if (!global_settings_done) { + try { + global_settings_done = true; + System.setProperty("com.apple.mrj.application.apple.menu.about.name", getName()); + System.setProperty("com.apple.macos.useScreenMenuBar", "true"); + System.setProperty("apple.laf.useScreenMenuBar", "true" ); // for older versions of Java + } catch (Exception e) { + } + } set_icon(); } + public AltosUIFrame() { + init(); + } + public AltosUIFrame(String name) { super(name); - AltosUIPreferences.register_ui_listener(this); - addWindowListener(new AltosUIFrameListener()); - set_icon(); + init(); } }