diff --git a/build.xml b/build.xml index cc61b030..f0444f08 100644 --- a/build.xml +++ b/build.xml @@ -109,13 +109,8 @@ - - - - - - + diff --git a/src/java/davmail/ui/OSXInfoPlist.java b/src/java/davmail/ui/OSXInfoPlist.java new file mode 100644 index 00000000..932e28a8 --- /dev/null +++ b/src/java/davmail/ui/OSXInfoPlist.java @@ -0,0 +1,85 @@ +/* + * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway + * Copyright (C) 2012 Mickael Guessant + * + * 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; either version 2 + * of the License, or (at your option) any later version. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package davmail.ui; + +import davmail.util.IOUtil; +import org.apache.log4j.Logger; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * Handle OSX Info.plist file access + */ +public class OSXInfoPlist { + protected static final Logger LOGGER = Logger.getLogger(OSXInfoPlist.class); + protected static final String INFO_PLIST_PATH = "Contents/Info.plist"; + + protected static boolean isOSX() { + return System.getProperty("os.name").toLowerCase().startsWith("mac os x"); + } + + protected static String getInfoPlistContent() throws IOException { + FileInputStream fileInputStream = new FileInputStream(INFO_PLIST_PATH); + return new String(IOUtil.readFully(fileInputStream)); + } + + /** + * Test current LSUIElement (hide from dock) value + * + * @return true if application is hidden from dock + */ + public static boolean isHideFromDock() { + boolean result = false; + try { + result = isOSX() && getInfoPlistContent().indexOf("LSUIElement1") >= 0; + } catch (IOException e) { + LOGGER.warn("Unable to update Info.plist", e); + } + return result; + } + + /** + * Update LSUIElement (hide from dock) value + * + * @param hideFromDock new hide from dock value + */ + public static void setOSXHideFromDock(boolean hideFromDock) { + try { + if (isOSX()) { + boolean currentHideFromDock = isHideFromDock(); + if (currentHideFromDock != hideFromDock) { + String content = getInfoPlistContent(); + FileOutputStream fileOutputStream = new FileOutputStream(INFO_PLIST_PATH); + try { + fileOutputStream.write(content.replaceFirst( + "LSUIElement" + (currentHideFromDock ? "1" : "0") + "", + "LSUIElement" + (hideFromDock ? "1" : "0") + "").getBytes("UTF-8")); + } finally { + fileOutputStream.close(); + } + fileOutputStream.close(); + } + } + } catch (IOException e) { + LOGGER.warn("Unable to update Info.plist", e); + } + } +} diff --git a/src/java/davmail/ui/SettingsFrame.java b/src/java/davmail/ui/SettingsFrame.java index 0a9c358b..3ee4e635 100644 --- a/src/java/davmail/ui/SettingsFrame.java +++ b/src/java/davmail/ui/SettingsFrame.java @@ -103,6 +103,8 @@ public class SettingsFrame extends JFrame { JComboBox enableEwsComboBox; JCheckBox smtpSaveInSentCheckBox; + JCheckBox osxHideFromDockCheckBox; + protected void addSettingComponent(JPanel panel, String label, JComponent component) { addSettingComponent(panel, label, component, null); } @@ -459,12 +461,24 @@ public class SettingsFrame extends JFrame { addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_DISABLE_UPDATE_CHECK"), disableUpdateCheck, BundleMessage.format("UI_DISABLE_UPDATE_CHECK_HELP")); - Dimension preferredSize = otherSettingsPanel.getPreferredSize(); - preferredSize.width = Integer.MAX_VALUE; updateMaximumSize(otherSettingsPanel); return otherSettingsPanel; } + protected JPanel getOSXPanel() { + JPanel osxSettingsPanel = new JPanel(new GridLayout(1, 2)); + osxSettingsPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_OSX"))); + + osxHideFromDockCheckBox = new JCheckBox(); + osxHideFromDockCheckBox.setSelected(OSXInfoPlist.isHideFromDock()); + + addSettingComponent(osxSettingsPanel, BundleMessage.format("UI_OSX_HIDE_FROM_DOCK"), osxHideFromDockCheckBox, + BundleMessage.format("UI_OSX_HIDE_FROM_DOCK_HELP")); + + updateMaximumSize(osxSettingsPanel); + return osxSettingsPanel; + } + protected JPanel getLoggingSettingsPanel() { JPanel loggingLevelPanel = new JPanel(); JPanel leftLoggingPanel = new JPanel(new GridLayout(2, 2)); @@ -592,6 +606,10 @@ public class SettingsFrame extends JFrame { wireLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient.wire")); logFilePathField.setText(Settings.getProperty("davmail.logFilePath")); logFileSizeField.setText(Settings.getProperty("davmail.logFileSize")); + + if (osxHideFromDockCheckBox != null) { + osxHideFromDockCheckBox.setSelected(OSXInfoPlist.isHideFromDock()); + } } protected boolean isSslEnabled() { @@ -674,6 +692,16 @@ public class SettingsFrame extends JFrame { tabbedPane.add(BundleMessage.format("UI_TAB_ADVANCED"), advancedPanel); + if (OSXInfoPlist.isOSX()) { + JPanel osxPanel = new JPanel(); + osxPanel.setLayout(new BoxLayout(osxPanel, BoxLayout.Y_AXIS)); + osxPanel.add(getOSXPanel()); + // empty panel + osxPanel.add(new JPanel()); + + tabbedPane.add(BundleMessage.format("UI_TAB_OSX"), osxPanel); + } + add(BorderLayout.CENTER, tabbedPane); JPanel buttonPanel = new JPanel(); @@ -751,6 +779,11 @@ public class SettingsFrame extends JFrame { setVisible(false); Settings.save(); + + if (osxHideFromDockCheckBox != null) { + OSXInfoPlist.setOSXHideFromDock(osxHideFromDockCheckBox.isSelected()); + } + // restart listeners with new config DavGateway.restart(); } diff --git a/src/java/davmail/util/IOUtil.java b/src/java/davmail/util/IOUtil.java index 11531b75..5a9f0602 100644 --- a/src/java/davmail/util/IOUtil.java +++ b/src/java/davmail/util/IOUtil.java @@ -88,4 +88,14 @@ public final class IOUtil { targetImage.getGraphics().drawImage(scaledImage, 0, 0, null); return targetImage; } + + public static byte[] readFully(InputStream inputStream) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] bytes = new byte[8192]; + int length; + while ((length = inputStream.read(bytes)) > 0) { + baos.write(bytes, 0, length); + } + return baos.toByteArray(); + } } diff --git a/src/java/davmailmessages.properties b/src/java/davmailmessages.properties index 04c8a3e8..9dacdfe5 100644 --- a/src/java/davmailmessages.properties +++ b/src/java/davmailmessages.properties @@ -231,6 +231,10 @@ UI_SHOW_LOGS=Show logs... UI_SMTP_PORT=Local SMTP port: UI_SMTP_PORT_HELP=Local SMTP server port to configure in mail client UI_TAB_ADVANCED=Advanced +UI_TAB_OSX=OSX +UI_OSX=OSX +UI_OSX_HIDE_FROM_DOCK=Hide from Dock +UI_OSX_HIDE_FROM_DOCK_HELP=Hide application from Dock (restart needed) UI_TAB_ENCRYPTION=Encryption UI_TAB_MAIN=Main UI_TAB_NETWORK=Network diff --git a/src/java/davmailmessages_fr.properties b/src/java/davmailmessages_fr.properties index b72aaab2..e9c10b3b 100644 --- a/src/java/davmailmessages_fr.properties +++ b/src/java/davmailmessages_fr.properties @@ -245,6 +245,10 @@ UI_CLIENT_KEY_STORE_HELP=Chemin du fichier contenant le certificat client SSL UI_CLIENT_KEY_STORE_PASSWORD=Mot de passe certificat client : UI_CLIENT_KEY_STORE_PASSWORD_HELP=Mot de passe du certificat client, laisser vide pour fournir le mot de passe mode interactif UI_TAB_LOGGING=Traces +UI_TAB_OSX=OSX +UI_OSX=OSX +UI_OSX_HIDE_FROM_DOCK=Supprimer du Dock +UI_OSX_HIDE_FROM_DOCK_HELP=Supprimer l''application du Dock (redémarrage nécessaire) UI_OTHER=Autres UI_CALDAV_ALARM_SOUND=Son des alarmes Caldav : UI_CALDAV_ALARM_SOUND_HELP=Convertir les alarmes Caldav en alarmes sonores supportées par iCal, par exemple Basso