/*
* :tabSize=8:indentSize=8:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* OperatingSystem.java - OS detection
* :tabSize=8:indentSize=8:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 2002, 2003 Slava Pestov
*
* 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Toolkit;
import javax.swing.UIManager;
import java.io.File;
import java.util.Enumeration;
import java.util.Vector;
import org.gjt.sp.util.Log;
/**
* Operating system detection routines.
* @author Slava Pestov
* @version $Id: OperatingSystem.java,v 1.16 2003/12/25 00:09:42 spestov Exp $
* @since jEdit 4.0pre4
*/
public class OperatingSystem
{
//{{{ getScreenBounds() method
/**
* Returns the bounds of the default screen.
*/
public static final Rectangle getScreenBounds()
{
int screenX = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
int screenY = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
int x, y, w, h;
if (isMacOS())
{
x = 0;
y = 22;
w = screenX;
h = screenY - y - 4;//shadow size
}
else if (isWindows())
{
x = -4;
y = -4;
w = screenX - 2*x;
h = screenY - 2*y;
}
else
{
x = 0;
y = 0;
w = screenX;
h = screenY;
}
return new Rectangle(x,y,w,h);
} //}}}
//{{{ getScreenBounds() method
/**
* Returns the bounds of the (virtual) screen that the window should be in
* @param window The bounds of the window to get the screen for
*/
public static final Rectangle getScreenBounds(Rectangle window)
{
GraphicsDevice[] gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
Vector intersects = new Vector();
// Get available screens
// O(n^3), this is nasty, but since we aren't dealling with
// many items it should be fine
for (int i=0; i < gd.length; i++)
{
GraphicsConfiguration gc = gd[i]
.getDefaultConfiguration();
// Don't add duplicates
if (window.intersects(gc.getBounds()))
{
for (Enumeration e = intersects.elements(); e.hasMoreElements();)
{
GraphicsConfiguration gcc = (GraphicsConfiguration)e.nextElement();
if (gcc.getBounds().equals(gc.getBounds()))
break;
}
intersects.add(gc);
}
}
GraphicsConfiguration choice = null;
if (intersects.size() > 0)
{
// Pick screen with largest intersection
for (Enumeration e = intersects.elements(); e.hasMoreElements();)
{
GraphicsConfiguration gcc = (GraphicsConfiguration)e.nextElement();
if (choice == null)
choice = gcc;
else
{
Rectangle int1 = choice.getBounds().intersection(window);
Rectangle int2 = gcc.getBounds().intersection(window);
int area1 = int1.width * int1.height;
int area2 = int2.width * int2.height;
if (area2 > area1)
choice = gcc;
}
}
}
else
choice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
// Make adjustments for some OS's
int screenX = (int)choice.getBounds().x;
int screenY = (int)choice.getBounds().y;
int screenW = (int)choice.getBounds().width;
int screenH = (int)choice.getBounds().height;
int x, y, w, h;
if (isMacOS())
{
x = screenX;
y = screenY + 22;
w = screenW;
h = screenH - y - 4;//shadow size
}
else if (isWindows())
{
x = screenX - 4;
y = screenY - 4;
w = screenW - 2*x;
h = screenH - 2*y;
}
else
{
x = screenX;
y = screenY;
w = screenW;
h = screenH;
}
// Yay, we're finally there
return new Rectangle(x,y,w,h);
} //}}}
//{{{ isDOSDerived() method
/**
* Returns if we're running Windows 95/98/ME/NT/2000/XP, or OS/2.
*/
public static final boolean isDOSDerived()
{
return isWindows() || isOS2();
} //}}}
//{{{ isWindows() method
/**
* Returns if we're running Windows 95/98/ME/NT/2000/XP.
*/
public static final boolean isWindows()
{
return os == WINDOWS_9x || os == WINDOWS_NT;
} //}}}
//{{{ isWindows9x() method
/**
* Returns if we're running Windows 95/98/ME.
*/
public static final boolean isWindows9x()
{
return os == WINDOWS_9x;
} //}}}
//{{{ isWindowsNT() method
/**
* Returns if we're running Windows NT/2000/XP.
*/
public static final boolean isWindowsNT()
{
return os == WINDOWS_NT;
} //}}}
//{{{ isOS2() method
/**
* Returns if we're running OS/2.
*/
public static final boolean isOS2()
{
return os == OS2;
} //}}}
//{{{ isUnix() method
/**
* Returns if we're running Unix (this includes MacOS X).
*/
public static final boolean isUnix()
{
return os == UNIX || os == MAC_OS_X;
} //}}}
//{{{ isMacOS() method
/**
* Returns if we're running MacOS X.
*/
public static final boolean isMacOS()
{
return os == MAC_OS_X;
} //}}}
//{{{ isX11() method
/**
* Returns if this OS is likely to be using X11 as the graphics
* system.
* @since jEdit 4.2pre3
*/
public static boolean isX11()
{
return os == UNIX;
} //}}}
//{{{ isVMS() method
/**
* Returns if we're running VMS.
*/
public static final boolean isVMS()
{
return os == VMS;
} //}}}
//{{{ isMacOSLF() method
/**
* Returns if we're running MacOS X and using the native look and feel.
*/
public static final boolean isMacOSLF()
{
return (isMacOS() && UIManager.getLookAndFeel().isNativeLookAndFeel());
} //}}}
//{{{ hasScreenMenuBar
/**
* Returns whether the screen menu bar on Mac OS X is in use.
* @since jEdit 4.2pre1
*/
public static final boolean hasScreenMenuBar()
{
if(!isMacOS())
return false;
else if(hasScreenMenuBar == -1)
{
String result = System.getProperty("apple.laf.useScreenMenuBar");
if (result == null)
result = System.getProperty("com.apple.macos.useScreenMenuBar");
hasScreenMenuBar = ("true".equals(result)) ? 1 : 0;
}
return (hasScreenMenuBar == 1);
} //}}}
//{{{ isJava14() method
/**
* Returns if Java 2 version 1.4, or Java 2 version 1.5 is in use.
*/
public static final boolean hasJava14()
{
return java14;
} //}}}
//{{{ isJava15() method
/**
* Returns if Java 2 version 1.5 is in use.
*/
public static final boolean hasJava15()
{
return java15;
} //}}}
//{{{ Private members
private static final int UNIX = 0x31337;
private static final int WINDOWS_9x = 0x640;
private static final int WINDOWS_NT = 0x666;
private static final int OS2 = 0xDEAD;
private static final int MAC_OS_X = 0xABC;
private static final int VMS = 0xDEAD2;
private static final int UNKNOWN = 0xBAD;
private static int os;
private static boolean java14;
private static boolean java15;
private static int hasScreenMenuBar = -1;
//{{{ Class initializer
static
{
if(System.getProperty("mrj.version") != null)
{
os = MAC_OS_X;
}
else
{
String osName = System.getProperty("os.name");
if(osName.indexOf("Windows 9") != -1
|| osName.indexOf("Windows M") != -1)
{
os = WINDOWS_9x;
}
else if(osName.indexOf("Windows") != -1)
{
os = WINDOWS_NT;
}
else if(osName.indexOf("OS/2") != -1)
{
os = OS2;
}
else if(osName.indexOf("VMS") != -1)
{
os = VMS;
}
else if(File.separatorChar == '/')
{
os = UNIX;
}
else
{
os = UNKNOWN;
Log.log(Log.WARNING,OperatingSystem.class,
"Unknown operating system: " + osName);
}
}
// for debugging, make jEdit think its using a different
// version of Java than it really is.
String javaVersion = System.getProperty("jedit.force.java.version");
if(javaVersion == null || javaVersion.equals(""))
javaVersion = System.getProperty("java.version");
java14 = (javaVersion.compareTo("1.4") >= 0);
java15 = (javaVersion.compareTo("1.5") >= 0);
} //}}}
//}}}
}