mirror of
https://github.com/moparisthebest/davmail
synced 2025-02-28 09:21:49 -05:00
OSX: new hide from Dock setting available directly in UI (DavMail restart needed)
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1958 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
7d6ee0d27e
commit
6d02a25c0e
@ -109,13 +109,8 @@
|
|||||||
</jarfileset>
|
</jarfileset>
|
||||||
</jarbundler>
|
</jarbundler>
|
||||||
<!-- prepare hide from dock option -->
|
<!-- prepare hide from dock option -->
|
||||||
<copy file="dist/DavMail.app/Contents/Info.plist" tofile="dist/DavMail.app/Contents/Info-dock.plist"/>
|
<replaceregexp file="dist/DavMail.app/Contents/Info.plist" match="<key>CFBundleName</key>"
|
||||||
<copy file="dist/DavMail.app/Contents/Info.plist" tofile="dist/DavMail.app/Contents/Info-nodock.plist"/>
|
replace="<key>LSUIElement</key><string>0</string><key>CFBundleName</key>"/>
|
||||||
<replaceregexp file="dist/DavMail.app/Contents/Info-nodock.plist" match="<key>CFBundleName</key>"
|
|
||||||
replace="<key>LSUIElement</key><string>1</string><key>CFBundleName</key>"/>
|
|
||||||
<copy file="dist/DavMail.app/Contents/Info-nodock.plist" tofile="dist/DavMail.app/Contents/Info.plist" overwrite="true"/>
|
|
||||||
<!-- java 1.6 is mandatory for hide from dock -->
|
|
||||||
<replaceregexp file="dist/DavMail.app/Contents/Info-nodock.plist" match="1\.5" replace="1.6"/>
|
|
||||||
<zip file="dist/DavMail-MacOSX-${release}.app.zip">
|
<zip file="dist/DavMail-MacOSX-${release}.app.zip">
|
||||||
<zipfileset dir="dist">
|
<zipfileset dir="dist">
|
||||||
<include name="DavMail.app/**/*"/>
|
<include name="DavMail.app/**/*"/>
|
||||||
|
85
src/java/davmail/ui/OSXInfoPlist.java
Normal file
85
src/java/davmail/ui/OSXInfoPlist.java
Normal file
@ -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("<key>LSUIElement</key><string>1</string>") >= 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(
|
||||||
|
"<key>LSUIElement</key><string>" + (currentHideFromDock ? "1" : "0") + "</string>",
|
||||||
|
"<key>LSUIElement</key><string>" + (hideFromDock ? "1" : "0") + "</string>").getBytes("UTF-8"));
|
||||||
|
} finally {
|
||||||
|
fileOutputStream.close();
|
||||||
|
}
|
||||||
|
fileOutputStream.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.warn("Unable to update Info.plist", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -103,6 +103,8 @@ public class SettingsFrame extends JFrame {
|
|||||||
JComboBox enableEwsComboBox;
|
JComboBox enableEwsComboBox;
|
||||||
JCheckBox smtpSaveInSentCheckBox;
|
JCheckBox smtpSaveInSentCheckBox;
|
||||||
|
|
||||||
|
JCheckBox osxHideFromDockCheckBox;
|
||||||
|
|
||||||
protected void addSettingComponent(JPanel panel, String label, JComponent component) {
|
protected void addSettingComponent(JPanel panel, String label, JComponent component) {
|
||||||
addSettingComponent(panel, label, component, null);
|
addSettingComponent(panel, label, component, null);
|
||||||
}
|
}
|
||||||
@ -459,12 +461,24 @@ public class SettingsFrame extends JFrame {
|
|||||||
addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_DISABLE_UPDATE_CHECK"), disableUpdateCheck,
|
addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_DISABLE_UPDATE_CHECK"), disableUpdateCheck,
|
||||||
BundleMessage.format("UI_DISABLE_UPDATE_CHECK_HELP"));
|
BundleMessage.format("UI_DISABLE_UPDATE_CHECK_HELP"));
|
||||||
|
|
||||||
Dimension preferredSize = otherSettingsPanel.getPreferredSize();
|
|
||||||
preferredSize.width = Integer.MAX_VALUE;
|
|
||||||
updateMaximumSize(otherSettingsPanel);
|
updateMaximumSize(otherSettingsPanel);
|
||||||
return 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() {
|
protected JPanel getLoggingSettingsPanel() {
|
||||||
JPanel loggingLevelPanel = new JPanel();
|
JPanel loggingLevelPanel = new JPanel();
|
||||||
JPanel leftLoggingPanel = new JPanel(new GridLayout(2, 2));
|
JPanel leftLoggingPanel = new JPanel(new GridLayout(2, 2));
|
||||||
@ -592,6 +606,10 @@ public class SettingsFrame extends JFrame {
|
|||||||
wireLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient.wire"));
|
wireLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient.wire"));
|
||||||
logFilePathField.setText(Settings.getProperty("davmail.logFilePath"));
|
logFilePathField.setText(Settings.getProperty("davmail.logFilePath"));
|
||||||
logFileSizeField.setText(Settings.getProperty("davmail.logFileSize"));
|
logFileSizeField.setText(Settings.getProperty("davmail.logFileSize"));
|
||||||
|
|
||||||
|
if (osxHideFromDockCheckBox != null) {
|
||||||
|
osxHideFromDockCheckBox.setSelected(OSXInfoPlist.isHideFromDock());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isSslEnabled() {
|
protected boolean isSslEnabled() {
|
||||||
@ -674,6 +692,16 @@ public class SettingsFrame extends JFrame {
|
|||||||
|
|
||||||
tabbedPane.add(BundleMessage.format("UI_TAB_ADVANCED"), advancedPanel);
|
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);
|
add(BorderLayout.CENTER, tabbedPane);
|
||||||
|
|
||||||
JPanel buttonPanel = new JPanel();
|
JPanel buttonPanel = new JPanel();
|
||||||
@ -751,6 +779,11 @@ public class SettingsFrame extends JFrame {
|
|||||||
|
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
Settings.save();
|
Settings.save();
|
||||||
|
|
||||||
|
if (osxHideFromDockCheckBox != null) {
|
||||||
|
OSXInfoPlist.setOSXHideFromDock(osxHideFromDockCheckBox.isSelected());
|
||||||
|
}
|
||||||
|
|
||||||
// restart listeners with new config
|
// restart listeners with new config
|
||||||
DavGateway.restart();
|
DavGateway.restart();
|
||||||
}
|
}
|
||||||
|
@ -88,4 +88,14 @@ public final class IOUtil {
|
|||||||
targetImage.getGraphics().drawImage(scaledImage, 0, 0, null);
|
targetImage.getGraphics().drawImage(scaledImage, 0, 0, null);
|
||||||
return targetImage;
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -231,6 +231,10 @@ UI_SHOW_LOGS=Show logs...
|
|||||||
UI_SMTP_PORT=Local SMTP port:
|
UI_SMTP_PORT=Local SMTP port:
|
||||||
UI_SMTP_PORT_HELP=Local SMTP server port to configure in mail client
|
UI_SMTP_PORT_HELP=Local SMTP server port to configure in mail client
|
||||||
UI_TAB_ADVANCED=Advanced
|
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_ENCRYPTION=Encryption
|
||||||
UI_TAB_MAIN=Main
|
UI_TAB_MAIN=Main
|
||||||
UI_TAB_NETWORK=Network
|
UI_TAB_NETWORK=Network
|
||||||
|
@ -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=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_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_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_OTHER=Autres
|
||||||
UI_CALDAV_ALARM_SOUND=Son des alarmes Caldav :
|
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
|
UI_CALDAV_ALARM_SOUND_HELP=Convertir les alarmes Caldav en alarmes sonores supportées par iCal, par exemple Basso
|
||||||
|
Loading…
x
Reference in New Issue
Block a user