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