diff --git a/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy b/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy index 1336bf9a..5b237621 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy @@ -131,10 +131,9 @@ class OptionsController { text = view.fontField.text model.font = text uiSettings.font = text - -// boolean showMonitor = view.monitorCheckbox.model.isSelected() -// model.showMonitor = showMonitor -// uiSettings.showMonitor = showMonitor + + uiSettings.autoFontSize = model.automaticFontSize + uiSettings.fontSize = Integer.parseInt(view.fontSizeField.text) boolean clearCancelledDownloads = view.clearCancelledDownloadsCheckbox.model.isSelected() model.clearCancelledDownloads = clearCancelledDownloads @@ -148,10 +147,6 @@ class OptionsController { model.excludeLocalResult = excludeLocalResult uiSettings.excludeLocalResult = excludeLocalResult -// boolean showSearchHashes = view.showSearchHashesCheckbox.model.isSelected() -// model.showSearchHashes = showSearchHashes -// uiSettings.showSearchHashes = showSearchHashes - File uiSettingsFile = new File(core.home, "gui.properties") uiSettingsFile.withOutputStream { uiSettings.write(it) @@ -176,4 +171,15 @@ class OptionsController { if (rv == JFileChooser.APPROVE_OPTION) model.downloadLocation = chooser.getSelectedFile().getAbsolutePath() } + + @ControllerAction + void automaticFontAction() { + model.automaticFontSize = true + model.customFontSize = 12 + } + + @ControllerAction + void customFontAction() { + model.automaticFontSize = false + } } \ No newline at end of file diff --git a/gui/griffon-app/lifecycle/Initialize.groovy b/gui/griffon-app/lifecycle/Initialize.groovy index 39d1ee12..e9704bad 100644 --- a/gui/griffon-app/lifecycle/Initialize.groovy +++ b/gui/griffon-app/lifecycle/Initialize.groovy @@ -10,14 +10,17 @@ import com.muwire.gui.UISettings import javax.annotation.Nonnull import javax.inject.Inject +import javax.swing.JLabel import javax.swing.JTable import javax.swing.LookAndFeel import javax.swing.UIManager +import javax.swing.plaf.FontUIResource import static griffon.util.GriffonApplicationUtils.isMacOSX import static groovy.swing.SwingBuilder.lookAndFeel import java.awt.Font +import java.awt.Toolkit import java.util.logging.Level @Log @@ -52,25 +55,43 @@ class Initialize extends AbstractLifecycleHandler { guiPropsFile.withInputStream { props.load(it) } uiSettings = new UISettings(props) + def lnf log.info("settting user-specified lnf $uiSettings.lnf") try { - lookAndFeel(uiSettings.lnf) + lnf = lookAndFeel(uiSettings.lnf) } catch (Throwable bad) { - log.log(Level.WARNING,"couldn't set desired look and feeel, switching to defaults", bad) - uiSettings.lnf = lookAndFeel("system","gtk","metal").getID() + log.log(Level.WARNING,"couldn't set desired look and feel, switching to defaults", bad) + lnf = lookAndFeel("system","gtk","metal") + uiSettings.lnf = lnf.getID() } - if (uiSettings.font != null) { - log.info("setting user-specified font $uiSettings.font") - Font font = new Font(uiSettings.font, Font.PLAIN, 12) - def defaults = UIManager.getDefaults() - defaults.put("Button.font", font) - defaults.put("RadioButton.font", font) - defaults.put("Label.font", font) - defaults.put("CheckBox.font", font) - defaults.put("Table.font", font) - defaults.put("TableHeader.font", font) - // TODO: add others + if (uiSettings.font != null || uiSettings.autoFontSize || uiSettings.fontSize > 0) { + + FontUIResource defaultFont = lnf.getDefaults().getFont("Label.font") + + String fontName + if (uiSettings.font != null) + fontName = uiSettings.font + else + fontName = defaultFont.getName() + + int fontSize = defaultFont.getSize() + if (uiSettings.autoFontSize) { + int resolution = Toolkit.getDefaultToolkit().getScreenResolution() + fontSize = resolution / 9; + } else { + fontSize = uiSettings.fontSize + } + + FontUIResource font = new FontUIResource(fontName, Font.PLAIN, fontSize) + + def keys = lnf.getDefaults().keys() + while(keys.hasMoreElements()) { + def key = keys.nextElement() + def value = lnf.getDefaults().get(key) + if (value instanceof FontUIResource) + lnf.getDefaults().put(key, font) + } } } else { Properties props = new Properties() diff --git a/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy b/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy index 2d5e09e4..66f32caa 100644 --- a/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy @@ -29,6 +29,8 @@ class OptionsModel { @Observable boolean showMonitor @Observable String lnf @Observable String font + @Observable boolean automaticFontSize + @Observable int customFontSize @Observable boolean clearCancelledDownloads @Observable boolean clearFinishedDownloads @Observable boolean excludeLocalResult @@ -67,6 +69,8 @@ class OptionsModel { showMonitor = uiSettings.showMonitor lnf = uiSettings.lnf font = uiSettings.font + automaticFontSize = uiSettings.autoFontSize + customFontSize = uiSettings.fontSize clearCancelledDownloads = uiSettings.clearCancelledDownloads clearFinishedDownloads = uiSettings.clearFinishedDownloads excludeLocalResult = uiSettings.excludeLocalResult diff --git a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy index 1ad3730e..8f2ee6c5 100644 --- a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy @@ -12,6 +12,7 @@ import javax.swing.SwingConstants import com.muwire.core.Core import java.awt.BorderLayout +import java.awt.GridBagConstraints import java.awt.event.WindowAdapter import java.awt.event.WindowEvent @@ -48,6 +49,7 @@ class OptionsView { def lnfField def monitorCheckbox def fontField + def fontSizeField def clearCancelledDownloadsCheckbox def clearFinishedDownloadsCheckbox def excludeLocalResultCheckbox @@ -121,19 +123,28 @@ class OptionsView { gridBagLayout() label(text : "Changing these settings requires a restart", constraints : gbc(gridx : 0, gridy : 0, gridwidth: 2)) label(text : "Look And Feel", constraints : gbc(gridx: 0, gridy:1)) - lnfField = textField(text : bind {model.lnf}, columns : 4, constraints : gbc(gridx : 1, gridy : 1)) + lnfField = textField(text : bind {model.lnf}, columns : 4, constraints : gbc(gridx : 1, gridy : 1, anchor : GridBagConstraints.LINE_START)) label(text : "Font", constraints : gbc(gridx: 0, gridy : 2)) - fontField = textField(text : bind {model.font}, columns : 4, constraints : gbc(gridx : 1, gridy:2)) -// label(text : "Show Monitor", constraints : gbc(gridx :0, gridy: 3)) -// monitorCheckbox = checkBox(selected : bind {model.showMonitor}, constraints : gbc(gridx : 1, gridy: 3)) - label(text : "Automatically Clear Cancelled Downloads", constraints: gbc(gridx: 0, gridy:4)) - clearCancelledDownloadsCheckbox = checkBox(selected : bind {model.clearCancelledDownloads}, constraints : gbc(gridx : 1, gridy:4)) - label(text : "Automatically Clear Finished Downloads", constraints: gbc(gridx: 0, gridy:5)) - clearFinishedDownloadsCheckbox = checkBox(selected : bind {model.clearFinishedDownloads}, constraints : gbc(gridx : 1, gridy:5)) - label(text : "Exclude Local Files From Results", constraints: gbc(gridx:0, gridy:6)) - excludeLocalResultCheckbox = checkBox(selected : bind {model.excludeLocalResult}, constraints : gbc(gridx: 1, gridy : 6)) -// label(text : "Show Hash Searches In Monitor", constraints: gbc(gridx:0, gridy:7)) -// showSearchHashesCheckbox = checkBox(selected : bind {model.showSearchHashes}, constraints : gbc(gridx: 1, gridy: 7)) + fontField = textField(text : bind {model.font}, columns : 4, constraints : gbc(gridx : 1, gridy:2, anchor : GridBagConstraints.LINE_START)) + + label(text : "Font Size", constraints : gbc(gridx: 0, gridy : 3)) + buttonGroup(id: "fontSizeGroup") + radioButton(text: "Automatic", selected : bind {model.automaticFontSize}, buttonGroup : fontSizeGroup, + constraints : gbc(gridx : 1, gridy: 3, anchor : GridBagConstraints.LINE_START), automaticFontAction) + radioButton(text: "Custom", selected : bind {!model.automaticFontSize}, buttonGroup : fontSizeGroup, + constraints : gbc(gridx : 1, gridy: 4, anchor : GridBagConstraints.LINE_START), customFontAction) + fontSizeField = textField(text : bind {model.customFontSize}, enabled : bind {!model.automaticFontSize}, constraints : gbc(gridx : 2, gridy : 4)) + + label(text : "Automatically Clear Cancelled Downloads", constraints: gbc(gridx: 0, gridy:5)) + clearCancelledDownloadsCheckbox = checkBox(selected : bind {model.clearCancelledDownloads}, + constraints : gbc(gridx : 1, gridy:5, anchor : GridBagConstraints.LINE_START)) + label(text : "Automatically Clear Finished Downloads", constraints: gbc(gridx: 0, gridy:6)) + clearFinishedDownloadsCheckbox = checkBox(selected : bind {model.clearFinishedDownloads}, + constraints : gbc(gridx : 1, gridy:6, anchor : GridBagConstraints.LINE_START)) + label(text : "Exclude Local Files From Results", constraints: gbc(gridx:0, gridy:7)) + excludeLocalResultCheckbox = checkBox(selected : bind {model.excludeLocalResult}, + constraints : gbc(gridx: 1, gridy : 7, anchor : GridBagConstraints.LINE_START)) + } bandwidth = builder.panel { gridBagLayout() diff --git a/gui/src/main/groovy/com/muwire/gui/UISettings.groovy b/gui/src/main/groovy/com/muwire/gui/UISettings.groovy index f4bc0fab..f80f9e1c 100644 --- a/gui/src/main/groovy/com/muwire/gui/UISettings.groovy +++ b/gui/src/main/groovy/com/muwire/gui/UISettings.groovy @@ -5,11 +5,13 @@ class UISettings { String lnf boolean showMonitor String font + boolean autoFontSize + int fontSize boolean clearCancelledDownloads boolean clearFinishedDownloads boolean excludeLocalResult boolean showSearchHashes - + UISettings(Properties props) { lnf = props.getProperty("lnf", "system") showMonitor = Boolean.parseBoolean(props.getProperty("showMonitor", "false")) @@ -18,6 +20,8 @@ class UISettings { clearFinishedDownloads = Boolean.parseBoolean(props.getProperty("clearFinishedDownloads","false")) excludeLocalResult = Boolean.parseBoolean(props.getProperty("excludeLocalResult","true")) showSearchHashes = Boolean.parseBoolean(props.getProperty("showSearchHashes","true")) + autoFontSize = Boolean.parseBoolean(props.getProperty("autoFontSize","false")) + fontSize = Integer.parseInt(props.getProperty("fontSize","12")) } void write(OutputStream out) throws IOException { @@ -28,6 +32,8 @@ class UISettings { props.setProperty("clearFinishedDownloads", String.valueOf(clearFinishedDownloads)) props.setProperty("excludeLocalResult", String.valueOf(excludeLocalResult)) props.setProperty("showSearchHashes", String.valueOf(showSearchHashes)) + props.setProperty("autoFontSize", String.valueOf(autoFontSize)) + props.setProperty("fontSize", String.valueOf(fontSize)) if (font != null) props.setProperty("font", font)