diff options
| -rw-r--r-- | altosui/AltosConfigureUI.java | 31 | ||||
| -rw-r--r-- | altosui/AltosUI.java | 13 | ||||
| -rw-r--r-- | altosuilib/AltosPositionListener.java | 22 | ||||
| -rw-r--r-- | altosuilib/AltosUIConfigure.java | 15 | ||||
| -rw-r--r-- | altosuilib/AltosUIFrame.java | 89 | ||||
| -rw-r--r-- | altosuilib/AltosUILib.java | 14 | ||||
| -rw-r--r-- | altosuilib/AltosUIPreferences.java | 38 | ||||
| -rw-r--r-- | altosuilib/Makefile.am | 1 | 
8 files changed, 200 insertions, 23 deletions
| diff --git a/altosui/AltosConfigureUI.java b/altosui/AltosConfigureUI.java index 392d7199..fad23f59 100644 --- a/altosui/AltosConfigureUI.java +++ b/altosui/AltosConfigureUI.java @@ -31,6 +31,7 @@ public class AltosConfigureUI  	AltosVoice	voice;  	public JTextField	callsign_value; +	public JComboBox	position_value;  	/* DocumentListener interface methods */  	public void insertUpdate(DocumentEvent e) { @@ -111,6 +112,36 @@ public class AltosConfigureUI  		row++;  	} +	final static String[] position_names = { +		"Top left", +		"Top", +		"Top right", +		"Left", +		"Center", +		"Right", +		"Bottom left", +		"Bottom", +		"Bottom right", +	}; +		 +	public void add_position() { +		pane.add(new JLabel ("Menu position"), constraints(0, 1)); +		 +		position_value = new JComboBox (position_names); +		position_value.setMaximumRowCount(position_names.length); +		int position = AltosUIPreferences.position(); +		position_value.setSelectedIndex(position); +		position_value.addActionListener(new ActionListener() { +				public void actionPerformed(ActionEvent e) { +					int	position = position_value.getSelectedIndex(); +					AltosUIPreferences.set_position(position); +				} +			}); +		pane.add(position_value, constraints(1, 2, GridBagConstraints.BOTH)); +		position_value.setToolTipText("Position of main AltosUI window"); +		row++; +	} +  	public AltosConfigureUI(JFrame owner, AltosVoice voice) {  		super(owner); diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java index d630ceec..0efe27a0 100644 --- a/altosui/AltosUI.java +++ b/altosui/AltosUI.java @@ -224,14 +224,6 @@ public class AltosUI extends AltosUIFrame {  		doLayout();  		validate(); -		setVisible(true); - -		Insets i = getInsets(); -		Dimension ps = rootPane.getPreferredSize(); -		ps.width += i.left + i.right; -		ps.height += i.top + i.bottom; -		setPreferredSize(ps); -		setSize(ps);  		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);  		addWindowListener(new WindowAdapter() {  			@Override @@ -239,6 +231,11 @@ public class AltosUI extends AltosUIFrame {  				System.exit(0);  			}  		}); + +		setLocationByPlatform(false); +		 +		/* Insets aren't set before the window is visible */ +		setVisible(true);  	}  	private void ConnectToDevice() { diff --git a/altosuilib/AltosPositionListener.java b/altosuilib/AltosPositionListener.java new file mode 100644 index 00000000..4f90446c --- /dev/null +++ b/altosuilib/AltosPositionListener.java @@ -0,0 +1,22 @@ +/* + * Copyright © 2013 Keith Packard <keithp@keithp.com> + * + * 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; version 2 of the License. + * + * 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, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altosuilib; + +public interface AltosPositionListener { +	public void position_changed(int position); +} diff --git a/altosuilib/AltosUIConfigure.java b/altosuilib/AltosUIConfigure.java index 6c9a841e..90b413d6 100644 --- a/altosuilib/AltosUIConfigure.java +++ b/altosuilib/AltosUIConfigure.java @@ -202,9 +202,10 @@ public class AltosUIConfigure  		row++;  	} -	public void add_serial_debug() { -		GridBagConstraints c = new GridBagConstraints(); +	public void add_position () { +	} +	public void add_serial_debug() {  		/* Serial debug setting */  		pane.add(new JLabel("Serial Debug"), constraints(0, 1)); @@ -217,12 +218,8 @@ public class AltosUIConfigure  				}  			});  		serial_debug.setToolTipText("Enable/Disable USB I/O getting sent to the console"); -		c.gridx = 1; -		c.gridy = row++; -		c.gridwidth = 3; -		c.fill = GridBagConstraints.NONE; -		c.anchor = GridBagConstraints.WEST; -		pane.add(serial_debug, c); +		pane.add(serial_debug, constraints(1,2)); +		row++;  	}  	public void add_bluetooth() { @@ -253,8 +250,10 @@ public class AltosUIConfigure  		add_log_dir();  		add_callsign();  		add_units(); +		add_serial_debug();  		add_font_size();  		add_look_and_feel(); +		add_position();  		add_bluetooth();  		add_frequencies(); diff --git a/altosuilib/AltosUIFrame.java b/altosuilib/AltosUIFrame.java index 8a1ba205..b93b2d21 100644 --- a/altosuilib/AltosUIFrame.java +++ b/altosuilib/AltosUIFrame.java @@ -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); @@ -73,22 +73,101 @@ public class AltosUIFrame extends JFrame implements AltosUIListener {  		super.setLocationByPlatform(lbp);  	} +	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); +		}  	} -	public AltosUIFrame() { +	void init() {  		AltosUIPreferences.register_ui_listener(this); +		AltosUIPreferences.register_position_listener(this); +		position = AltosUIPreferences.position();  		addWindowListener(new AltosUIFrameListener());  		set_icon();  	} +	public AltosUIFrame() { +		init(); +	} +  	public AltosUIFrame(String name) {  		super(name); -		AltosUIPreferences.register_ui_listener(this); -		addWindowListener(new AltosUIFrameListener()); -		set_icon(); +		init();  	}  } diff --git a/altosuilib/AltosUILib.java b/altosuilib/AltosUILib.java index 5d5f9aaa..d0bdc5b6 100644 --- a/altosuilib/AltosUILib.java +++ b/altosuilib/AltosUILib.java @@ -36,7 +36,17 @@ public class AltosUILib extends AltosLib {  	final public static int font_size_medium = 2;  	final public static int font_size_large = 3; -	static void set_fonts(int size) { +	final public static int position_top_left = 0; +	final public static int position_top = 1; +	final public static int position_top_right = 2; +	final public static int position_left = 3; +	final public static int position_center = 4; +	final public static int position_right = 5; +	final public static int position_bottom_left = 6; +	final public static int position_bottom = 7; +	final public static int position_bottom_right = 8; + +	public static void set_fonts(int size) {  		int	brief_size;  		int	table_size;  		int	status_size; @@ -66,7 +76,7 @@ public class AltosUILib extends AltosLib {  		table_value_font = new Font("Monospaced", Font.PLAIN, table_size);  	} -	static final int text_width = 20; +	static public final int text_width = 20;  	static public boolean initialized = false;  	static public boolean loaded_library = false; diff --git a/altosuilib/AltosUIPreferences.java b/altosuilib/AltosUIPreferences.java index 485cb582..50211fce 100644 --- a/altosuilib/AltosUIPreferences.java +++ b/altosuilib/AltosUIPreferences.java @@ -31,6 +31,9 @@ public class AltosUIPreferences extends AltosPreferences {  	/* Look&Feel preference name */  	final static String lookAndFeelPreference = "LOOK-AND-FEEL"; +	/* Window position preference name */ +	final static String positionPreference = "POSITION"; +  	/* UI Component to pop dialogs up */  	static Component component; @@ -45,6 +48,10 @@ public class AltosUIPreferences extends AltosPreferences {  	/* Serial debug */  	public static boolean serial_debug; +	static LinkedList<AltosPositionListener> position_listeners; + +	public static int position = AltosUILib.position_top_left; +  	public static void init() {  		AltosPreferences.init(new AltosUIPreferencesBackend()); @@ -56,7 +63,11 @@ public class AltosUIPreferences extends AltosPreferences {  		ui_listeners = new LinkedList<AltosUIListener>();  		serial_debug = backend.getBoolean(serialDebugPreference, false); +  		AltosLink.set_debug(serial_debug); + +		position = backend.getInt(positionPreference, AltosUILib.position_top_left); +		position_listeners = new LinkedList<AltosPositionListener>();  	}  	static { init(); } @@ -177,4 +188,31 @@ public class AltosUIPreferences extends AltosPreferences {  		}  	} +	public static void register_position_listener(AltosPositionListener l) { +		synchronized(backend) { +			position_listeners.add(l); +		} +	} + +	public static void unregister_position_listener(AltosPositionListener l) { +		synchronized (backend) { +			position_listeners.remove(l); +		} +	} + +	public static void set_position(int new_position) { +		synchronized (backend) { +			position = new_position; +			backend.putInt(positionPreference, position); +			flush_preferences(); +			for (AltosPositionListener l : position_listeners) +				l.position_changed(position); +		} +	} + +	public static int position() { +		synchronized (backend) { +			return position; +		} +	}  } diff --git a/altosuilib/Makefile.am b/altosuilib/Makefile.am index da5fb848..5fb82793 100644 --- a/altosuilib/Makefile.am +++ b/altosuilib/Makefile.am @@ -14,6 +14,7 @@ altosuilib_JAVA = \  	AltosDeviceDialog.java \  	AltosUSBDevice.java \  	AltosFontListener.java \ +	AltosPositionListener.java \  	AltosUIDialog.java \  	AltosUIFrame.java \  	AltosUILib.java \ | 
