content: /*
   * Created on Aug 30, 2007
   *
   * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
   * the License. You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
   * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
   * specific language governing permissions and limitations under the License.
   *
   * Copyright @2007-2013 the original author or authors.
   */
  package org.fest.swing.util;
  
  import static java.lang.String.valueOf;
  import static org.fest.assertions.Assertions.assertThat;
  import static org.fest.swing.util.Modifiers.keysFor;
  import static org.fest.util.Strings.concat;
  
  import java.awt.Event;
  import java.awt.HeadlessException;
  import java.awt.Toolkit;
  import java.awt.event.KeyEvent;
  
  import javax.annotation.Nonnull;
  
  import org.fest.util.VisibleForTesting;
  
  /**
   * Platform-specific functionality.
   *
   * @author Alex Ruiz
   */
  public final class Platform {
    private static OSIdentifier osIdentifier;
    private static Toolkit toolkit;
  
    static {
      reload();
    }
  
    @VisibleForTesting
    static void reload() {
      initialize(new OSIdentifier(), ToolkitProvider.instance().defaultToolkit());
    }
  
    @VisibleForTesting
    static void initialize(@Nonnull OSIdentifier osIdentifier, @Nonnull Toolkit toolkit) {
      Platform.osIdentifier = osIdentifier;
      Platform.toolkit = toolkit;
    }
  
    /**
     * Return the modifier key for the appropriate accelerator key for menu shortcuts:
     * {@link KeyEvent#VK_CONTROL} (default) or {@link KeyEvent#VK_META} (MacOS.)
     * @return the modifier key for the appropriate accelerator key for menu shortcuts.
     * @throws AssertionError if unable to find the appropriate key.
     * @throws HeadlessException if {@code GraphicsEnvironment.isHeadless()}.
     */
    public static int controlOrCommandKey() {
      int menuShortcutKeyMask = controlOrCommandMask();
      int[] keys = keysFor(menuShortcutKeyMask);
      assertThat(keys).as(concat("Key code for mask ", valueOf(menuShortcutKeyMask))).isNotNull().hasSize(1);
      return keys[0];
    }
  
    /**
     * Return the modifier mask for the appropriate accelerator key for menu shortcuts:
     * {@link Event#CTRL_MASK} (default) or {@link Event#META_MASK} (MacOS.)
     * @return the modifier mask for the appropriate accelerator key for menu shortcuts.
     * @throws HeadlessException if {@code GraphicsEnvironment.isHeadless()}.
     */
    public static int controlOrCommandMask() {
      return toolkit.getMenuShortcutKeyMask();
    }
  
    /**
     * Indicates whether it is possible to resize windows that are not an instance of {@link java.awt.Frame}
     * or {@link java.awt.Dialog}. Most X11 window managers will allow this, but stock Macintosh and Windows
     * do not.
     * @return {@code true} if it is possible to resize windows other than {@code Frame}s or
     * {@code Dialog}s, {@code false} otherwise.
     */
    public static boolean canResizeWindows() {
      return !isWindows() && !isMacintosh();
    }
  
    /**
     * Indicates whether it is possible to move windows that are not an instance of {@link java.awt.Frame} or
     * {@link java.awt.Dialog}. Most X11 window managers will allow this, but stock Macintosh and Windows do
     * not.
     * @return {@code true} if it is possible to move windows other than {@code Frame}s or {@code Dialog}s,
     * {@code false} otherwise.
     */
    public static boolean canMoveWindows() {
      return !isWindows() && !isMacintosh();
    }
  
    /**
     * Indicates whether the operating system is Windows.
     * @return {@code true} if the operation system is Windows, {@code false} otherwise.
     */
    public static boolean isWindows() {
      return osIdentifier.isWindows();
    }
  
    /**
     * Indicates whether the operating system is Windows 9x (95, 98 or ME.)
     * @return {@code true} if the operating system is Windows 9x (95, 98 or ME,) {@code false} otherwise.
     */
    public static boolean isWindows9x() {
      return osIdentifier.isWindows9x();
    }
  
    /**
     * Indicates whether the operating system is Windows XP.
     * @return {@code true} if the operating system is Windows XP, {@code false} otherwise.
     */
    public static boolean isWindowsXP() {
      return osIdentifier.isWindowsXP();
    }
  
    /**
     * Indicates whether the operating system is a Macintosh OS.
     * @return {@code true} is the operating system is a Macintosh OS, {@code false} otherwise.
     */
    public static boolean isMacintosh() {
      return osIdentifier.isMacintosh();
    }
  
    /**
     * Indicates whether the operating system is Mac OS X.
     * @return {@code true} if the operating system is Mac OS X, {@code false} otherwise.
     */
    public static boolean isOSX() {
      return osIdentifier.isOSX();
    }
  
    /**
     * Indicates whether the operating system is using the X11 Windowing system.
     * @return {@code true} if the operating system is using the X11 Windowing system, {@code false} otherwise.
     */
    public static boolean isX11() {
      return osIdentifier.isX11();
    }
  
    /**
     * Indicates whether the operating system is Solaris.
     * @return {@code true} if the operating system is Solaris, {@code false} otherwise.
     */
    public static boolean isSolaris() {
      return osIdentifier.isSolaris();
    }
  
    /**
     * Indicates whether the operating system is HP-UX.
     * @return {@code true} if the operating system is HP-UX, {@code false} otherwise.
     */
    public static boolean isHPUX() {
      return osIdentifier.isHPUX();
    }
  
    /**
     * Indicates whether the operating system is Linux.
     * @return {@code true} if the operating system is Linux, {@code false} otherwise.
     */
    public static boolean isLinux() {
      return osIdentifier.isLinux();
    }
  
    /**
     * @return the current operating system family.
     * @since 1.2
     */
    public static @Nonnull OSFamily osFamily() {
      return osIdentifier.osFamily();
    }
  
    private Platform() {}
  }
  