From ffbd99545ca0462161c24e0ed86978544f2c28f6 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 31 Aug 2020 15:08:08 -0700 Subject: [PATCH] altosuilib: Make dialogs mostly scrollable When screens are too small, some dialogs aren't usable. Fix that by wrapping them all with a scrollable pane. Signed-off-by: Keith Packard --- altosui/AltosConfigFCUI.java | 3 +- altosui/AltosConfigPyroUI.java | 2 +- altosui/AltosConfigTDUI.java | 2 +- altosui/AltosFlightUI.java | 2 +- altosui/AltosIdleMonitorUI.java | 2 +- altosui/AltosIgniteUI.java | 4 +-- altosui/AltosLaunchUI.java | 4 +-- altosui/install-macosx | 42 +++++++++++++++++++++++----- altosuilib/AltosBTManage.java | 2 +- altosuilib/AltosConfigFreqUI.java | 4 +-- altosuilib/AltosEepromMonitorUI.java | 2 +- altosuilib/AltosFlashUI.java | 4 +-- altosuilib/AltosRomconfigUI.java | 2 +- altosuilib/AltosScanUI.java | 2 +- altosuilib/AltosUIAccelCal.java | 2 +- altosuilib/AltosUIConfigure.java | 2 +- altosuilib/AltosUIDialog.java | 24 ++++++++++++++++ altosuilib/AltosUIFrame.java | 24 ++++++++++++++++ altosuilib/AltosUIMapPreload.java | 2 +- altosuilib/AltosUIPreferences.java | 7 ++++- altosuilib/AltosUSBDevice.java | 4 +-- micropeak/MicroDownload.java | 2 +- telegps/TeleGPSConfigUI.java | 2 +- 23 files changed, 114 insertions(+), 32 deletions(-) diff --git a/altosui/AltosConfigFCUI.java b/altosui/AltosConfigFCUI.java index 5ccb1077..278d3fea 100644 --- a/altosui/AltosConfigFCUI.java +++ b/altosui/AltosConfigFCUI.java @@ -357,7 +357,8 @@ public class AltosConfigFCUI Insets il = new Insets(4,4,4,4); Insets ir = new Insets(4,4,4,4); - pane = getContentPane(); + pane = getScrollablePane(); + pane.setLayout(new GridBagLayout()); /* Product */ diff --git a/altosui/AltosConfigPyroUI.java b/altosui/AltosConfigPyroUI.java index 309bb8ee..2b01cee8 100644 --- a/altosui/AltosConfigPyroUI.java +++ b/altosui/AltosConfigPyroUI.java @@ -386,7 +386,7 @@ public class AltosConfigPyroUI GridBagConstraints c; - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); int nrow = 0; diff --git a/altosui/AltosConfigTDUI.java b/altosui/AltosConfigTDUI.java index 0fdf4449..b2e8e803 100644 --- a/altosui/AltosConfigTDUI.java +++ b/altosui/AltosConfigTDUI.java @@ -82,7 +82,7 @@ public class AltosConfigTDUI Insets il = new Insets(4,4,4,4); Insets ir = new Insets(4,4,4,4); - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); /* Product */ diff --git a/altosui/AltosFlightUI.java b/altosui/AltosFlightUI.java index 608042a5..a2d0c364 100644 --- a/altosui/AltosFlightUI.java +++ b/altosui/AltosFlightUI.java @@ -186,7 +186,7 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay { voice = in_voice; reader = in_reader; - bag = getContentPane(); + bag = getScrollablePane(); bag.setLayout(new GridBagLayout()); setTitle(String.format("AltOS %s", reader.name)); diff --git a/altosui/AltosIdleMonitorUI.java b/altosui/AltosIdleMonitorUI.java index 26bc06e4..50994bb2 100644 --- a/altosui/AltosIdleMonitorUI.java +++ b/altosui/AltosIdleMonitorUI.java @@ -226,7 +226,7 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl /* We let the user set the freq/callsign, so don't bother with the cancel dialog */ link.set_cancel_enable(false); - bag = getContentPane(); + bag = getScrollablePane(); bag.setLayout(new GridBagLayout()); setTitle(String.format("AltOS %s", device.toShortString())); diff --git a/altosui/AltosIgniteUI.java b/altosui/AltosIgniteUI.java index 0d848ab8..8256722a 100644 --- a/altosui/AltosIgniteUI.java +++ b/altosui/AltosIgniteUI.java @@ -65,7 +65,7 @@ public class AltosIgniteUI } Igniter(AltosIgniteUI ui, String label, String name, int y) { - Container pane = getContentPane(); + Container pane = getScrollablePane(); GridBagConstraints c = new GridBagConstraints(); Insets i = new Insets(4,4,4,4); @@ -388,7 +388,7 @@ public class AltosIgniteUI private void make_ui() { group = new ButtonGroup(); - Container pane = getContentPane(); + Container pane = getScrollablePane(); GridBagConstraints c = new GridBagConstraints(); Insets i = new Insets(4,4,4,4); diff --git a/altosui/AltosLaunchUI.java b/altosui/AltosLaunchUI.java index 875b786e..6615063b 100644 --- a/altosui/AltosLaunchUI.java +++ b/altosui/AltosLaunchUI.java @@ -393,7 +393,7 @@ public class AltosLaunchUI if (!open()) return; - Container pane = getContentPane(); + Container pane = getScrollablePane(); GridBagConstraints c = new GridBagConstraints(); Insets i = new Insets(4,4,4,4); @@ -510,4 +510,4 @@ public class AltosLaunchUI setVisible(true); } -} \ No newline at end of file +} diff --git a/altosui/install-macosx b/altosui/install-macosx index aebfd527..aced4ab9 100755 --- a/altosui/install-macosx +++ b/altosui/install-macosx @@ -1,9 +1,37 @@ -#!/bin/sh +#!/bin/bash + +case `id -u` in + 0) + ;; + *) + # Check for java + if [ ! -d /Library/Java/JavaVirtualMachines/ -o `ls /Library/Java/JavaVirtualMachine` == '' ]; then + open https://adoptopenjdk.net/ + osascript -e 'display dialog "Install Java from https://adoptopenjdk.net then click OK" buttons {"Continue"}' + fi + sudo "$0" "$@" + ;; +esac + dir=`dirname "$0"` cd "$dir" -mkdir -p ~/Applications/AltOS -find ~/Applications/AltOS -type d -print0 | xargs -0 chmod +w -cp -f -a * ~/Applications/AltOS -cd ~/Applications/AltOS -chmod +w * -xattr -c * +APP=`echo *.app` +LIBRARY=/Library/AltusMetrum +APPLICATIONS=/Applications/ +for file in *; do + case "$i" in + *.app) + mkdir -p "$(APPLICATIONS)" + if [ -d "$(APPLICATIONS)/$(APP)/." ]; then + rm -rf "$(APPLICATIONS)/$(APP)" + fi + cp -a "$i" "$(APPLICATIONS)/$(APP)" + chmod +w "$(APPLICATIONS)/$(APP)"/* + xattr -c "$(APPLICATIONS)/$(APP)"/* + ;; + *) + mkdir -p "$(LIBRARY)" + cp -a "$i" "$(LIBRARY)" + ;; + esac +done diff --git a/altosuilib/AltosBTManage.java b/altosuilib/AltosBTManage.java index 1726190d..37e820b6 100644 --- a/altosuilib/AltosBTManage.java +++ b/altosuilib/AltosBTManage.java @@ -219,7 +219,7 @@ public class AltosBTManage extends AltosUIDialog implements ActionListener, Iter found_devices = new LinkedBlockingQueue(); - Container pane = getContentPane(); + Container pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); diff --git a/altosuilib/AltosConfigFreqUI.java b/altosuilib/AltosConfigFreqUI.java index d24480b3..49fe6b40 100644 --- a/altosuilib/AltosConfigFreqUI.java +++ b/altosuilib/AltosConfigFreqUI.java @@ -67,7 +67,7 @@ class AltosEditFreqUI extends AltosUIDialog implements ActionListener { got_ok = false; frame = in_frame; - Container pane = getContentPane(); + Container pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); @@ -302,7 +302,7 @@ public class AltosConfigFreqUI extends AltosUIDialog implements ActionListener { frequencies = new FrequencyList(in_frequencies); - Container pane = getContentPane(); + Container pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); diff --git a/altosuilib/AltosEepromMonitorUI.java b/altosuilib/AltosEepromMonitorUI.java index 7da9786c..90ce58ac 100644 --- a/altosuilib/AltosEepromMonitorUI.java +++ b/altosuilib/AltosEepromMonitorUI.java @@ -56,7 +56,7 @@ public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMo Insets il = new Insets(4,4,4,4); Insets ir = new Insets(4,4,4,4); - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); c = new GridBagConstraints(); diff --git a/altosuilib/AltosFlashUI.java b/altosuilib/AltosFlashUI.java index fd84f921..33fdb688 100644 --- a/altosuilib/AltosFlashUI.java +++ b/altosuilib/AltosFlashUI.java @@ -131,7 +131,7 @@ public class AltosFlashUI Insets il = new Insets(4,4,4,4); Insets ir = new Insets(4,4,4,4); - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); c = new GridBagConstraints(); @@ -637,7 +637,7 @@ public class AltosFlashUI super(in_owner, "Open Flash Target Device", true); owner = in_owner; - Container pane = getContentPane(); + Container pane = getScrollablePane(); GridBagConstraints c = new GridBagConstraints(); Insets i = new Insets(4,4,4,4); diff --git a/altosuilib/AltosRomconfigUI.java b/altosuilib/AltosRomconfigUI.java index f2c038a9..44d3a9f8 100644 --- a/altosuilib/AltosRomconfigUI.java +++ b/altosuilib/AltosRomconfigUI.java @@ -51,7 +51,7 @@ public class AltosRomconfigUI Insets il = new Insets(4,4,4,4); Insets ir = new Insets(4,4,4,4); - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); int y = 0; diff --git a/altosuilib/AltosScanUI.java b/altosuilib/AltosScanUI.java index a09142e5..4ec858fa 100644 --- a/altosuilib/AltosScanUI.java +++ b/altosuilib/AltosScanUI.java @@ -470,7 +470,7 @@ public class AltosScanUI if (!open()) return; - Container pane = getContentPane(); + Container pane = getScrollablePane(); GridBagConstraints c = new GridBagConstraints(); Insets i = new Insets(4,4,4,4); diff --git a/altosuilib/AltosUIAccelCal.java b/altosuilib/AltosUIAccelCal.java index 7ca8ea82..94d80193 100644 --- a/altosuilib/AltosUIAccelCal.java +++ b/altosuilib/AltosUIAccelCal.java @@ -164,7 +164,7 @@ public class AltosUIAccelCal this.link = link; this.config_values = config_values; - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); diff --git a/altosuilib/AltosUIConfigure.java b/altosuilib/AltosUIConfigure.java index 8ee89dd4..09e7daaa 100644 --- a/altosuilib/AltosUIConfigure.java +++ b/altosuilib/AltosUIConfigure.java @@ -260,7 +260,7 @@ public class AltosUIConfigure super(in_owner, name, false); owner = in_owner; - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); row = 0; diff --git a/altosuilib/AltosUIDialog.java b/altosuilib/AltosUIDialog.java index 34bd50d8..be883a14 100644 --- a/altosuilib/AltosUIDialog.java +++ b/altosuilib/AltosUIDialog.java @@ -30,6 +30,30 @@ class AltosUIDialogListener extends WindowAdapter { public class AltosUIDialog extends JDialog implements AltosUIListener { + private Container scrollPane; + + public Container getScrollablePane() { + if (scrollPane == null) { + Container content = super.getContentPane(); + /* Create a container to hold the dialog contents */ + scrollPane = new Container(); + + /* Make an opaque box to use the right color */ + Box box = new Box(BoxLayout.X_AXIS); + box.add(scrollPane); + box.setOpaque(true); + + /* Create a scrollpane to hold the box */ + JScrollPane scroll = new JScrollPane(); + JViewport view = scroll.getViewport(); + view.add(box); + + /* Add the scroll pane to the top level */ + content.add(scroll); + } + return (Container) scrollPane; + } + public void ui_changed(String look_and_feel) { SwingUtilities.updateComponentTreeUI(this); this.pack(); diff --git a/altosuilib/AltosUIFrame.java b/altosuilib/AltosUIFrame.java index 71e16e1d..f701ce7a 100644 --- a/altosuilib/AltosUIFrame.java +++ b/altosuilib/AltosUIFrame.java @@ -41,6 +41,30 @@ public class AltosUIFrame extends JFrame implements AltosUIListener, AltosPositi this.pack(); } + private Container scrollPane; + + public Container getScrollablePane() { + if (scrollPane == null) { + Container content = super.getContentPane(); + /* Create a container to hold the dialog contents */ + scrollPane = new Container(); + + /* Make an opaque box to use the right color */ + Box box = new Box(BoxLayout.X_AXIS); + box.add(scrollPane); + box.setOpaque(true); + + /* Create a scrollpane to hold the box */ + JScrollPane scroll = new JScrollPane(); + JViewport view = scroll.getViewport(); + view.add(box); + + /* Add the scroll pane to the top level */ + content.add(scroll); + } + return (Container) scrollPane; + } + static String[] altos_icon_names = { "/altusmetrum-altosui-16.png", "/altusmetrum-altosui-32.png", diff --git a/altosuilib/AltosUIMapPreload.java b/altosuilib/AltosUIMapPreload.java index 31c8ed1b..9ba27355 100644 --- a/altosuilib/AltosUIMapPreload.java +++ b/altosuilib/AltosUIMapPreload.java @@ -336,7 +336,7 @@ public class AltosUIMapPreload extends AltosUIFrame implements ActionListener, I public AltosUIMapPreload(AltosUIFrame in_owner) { owner = in_owner; - Container pane = getContentPane(); + Container pane = getScrollablePane(); GridBagConstraints c = new GridBagConstraints(); Insets i = new Insets(4,4,4,4); diff --git a/altosuilib/AltosUIPreferences.java b/altosuilib/AltosUIPreferences.java index 7e3178d8..c40903ce 100644 --- a/altosuilib/AltosUIPreferences.java +++ b/altosuilib/AltosUIPreferences.java @@ -129,18 +129,23 @@ public class AltosUIPreferences extends AltosPreferences { backend.putInt(fontSizePreference, font_size); flush_preferences(); AltosUILib.set_fonts(font_size); - for (AltosFontListener l : font_listeners) + for (AltosFontListener l : font_listeners) { + System.out.printf("notifying %s of font size change\n", l); l.font_size_changed(font_size); + } + System.out.printf("all fonts changed\n"); } } public static void register_font_listener(AltosFontListener l) { + System.out.printf("register font listener\n"); synchronized (backend) { font_listeners.add(l); } } public static void unregister_font_listener(AltosFontListener l) { + System.out.printf("unregister font listener\n"); synchronized (backend) { font_listeners.remove(l); } diff --git a/altosuilib/AltosUSBDevice.java b/altosuilib/AltosUSBDevice.java index 50ec4c03..585bd774 100644 --- a/altosuilib/AltosUSBDevice.java +++ b/altosuilib/AltosUSBDevice.java @@ -26,7 +26,7 @@ public class AltosUSBDevice extends altos_device implements AltosDevice { public String toString() { String name = getName(); - if (name == null) + if (name == null || "".equals(name)) name = "Altus Metrum"; return String.format("%-20.20s %4d %s", name, getSerial(), getPath()); @@ -34,7 +34,7 @@ public class AltosUSBDevice extends altos_device implements AltosDevice { public String toShortString() { String name = getName(); - if (name == null) + if (name == null || "".equals(name)) name = "Altus Metrum"; return String.format("%s %d %s", name, getSerial(), getPath()); diff --git a/micropeak/MicroDownload.java b/micropeak/MicroDownload.java index 33c5587b..7e3d1e59 100644 --- a/micropeak/MicroDownload.java +++ b/micropeak/MicroDownload.java @@ -224,7 +224,7 @@ public class MicroDownload extends AltosUIDialog implements Runnable, ActionList this.owner = owner; this.device = device; - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); c = new GridBagConstraints(); diff --git a/telegps/TeleGPSConfigUI.java b/telegps/TeleGPSConfigUI.java index 7c5d186e..465916ec 100644 --- a/telegps/TeleGPSConfigUI.java +++ b/telegps/TeleGPSConfigUI.java @@ -211,7 +211,7 @@ public class TeleGPSConfigUI Insets il = new Insets(4,4,4,4); Insets ir = new Insets(4,4,4,4); - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); /* Product */ -- 2.30.2