All Downloads are FREE. Search and download functionalities are using the official Maven repository.

y.swing-shortcut-manager_2.9.1.1.0.0.source-code.Shortcut.scala Maven / Gradle / Ivy

The newest version!
/*
This file is part of swing-keyboard-manager
, a shortcut manager
for Java Swing used in Penn TotalRecall


swing-keyboard-manager 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, version 3 only.

swing-keyboard-manager 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 swing-keyboard-manager.  If not, see
.
*/

package edu.upenn.psych.memory.shortcutmanager

import java.awt.event.KeyEvent

import javax.swing.KeyStroke

case class Shortcut(stroke: KeyStroke) {

  import Shortcut.isMac

  val PCCtrl = "Ctrl"
  val PCAlt = "Alt"
  val PCShift = "Shift"
  val PCMeta = "Meta"

  val MacCtrl = "^"
  val MacOption = "⌥"
  val MacShift = "⇧"
  val MacCommand = "⌘"

  val sysSep = if (isMac) "" else "+"

  import KeyEvent._
  val MacMap: Map[String, (String, String)] = Map (
    "control" -> (PCCtrl, MacCtrl),
    "alt" -> (PCAlt, MacOption),
    "shift" -> (PCShift, MacShift),
    "meta" -> (PCMeta, MacCommand),
    "BACK_SPACE" -> ("BackSpace", "⌫"),
    "DELETE" -> ("Del", "⌦"),
    "ENTER" -> ("Enter", "↩"),
    "ESCAPE" -> ("Esc", "⎋"),
    "HOME" -> ("Home", "\u2196"),
    "END" -> ("End", "\u2198"),
    "PAGE_UP" -> ("PgUp", "PgUp"), //u8670
    "PAGE_DOWN" -> ("PgDn", "PgDn"), //u8671
    "LEFT" -> ("Left", "←"),
    "RIGHT" -> ("Right", "→"),
    "UP" -> ("Up", "↑"),
    "DOWN" -> ("Down", "↓"),
    "TAB" -> ("Tab", "Tab") //u8677
  )

  lazy val macOrder = List(MacCtrl, MacOption, MacShift, MacCommand)
  lazy val pcOrder = List(PCShift, PCCtrl, PCAlt)

  def sortKeys(a: String, b: String) = {
    val order = if (isMac) macOrder else pcOrder
    (order indexOf a, order indexOf b) match {
      case (-1, -1) => true //arbitrary choice
      case (_, -1) => true
      case (-1, _) => false
      case (i, j) => i < j
    }
  }

  lazy val internalForm: String =
    Option(UnsafeKeyUtils.getInternalFormOrNull(stroke)) match {
      case Some(str) => str
      case None => {
        sys.error (
          "sorry, I refuse to create a Shortcut whose KeyStroke has no " +
          "valid internalForm field according to UnsafeKeyUtils.java"
        )
      }
    }

  override lazy val toString = {
    val parts = Shortcut.separateInternalForm(internalForm)
    import Key._
    val newParts: List[String] = parts.map { s: String =>
      MacMap.get(s) match {
        case None => s
        case Some(Pair(pc, mac)) => if (isMac) mac else pc
      }
    }.sortWith(sortKeys)
     .filterNot{ Set("typed", "pressed", "released") contains _ }
     .map{ _.toLowerCase.capitalize }

    val repr = newParts mkString sysSep
    repr
  }
}

object Shortcut {
  
  val isMac = util.Properties.isMac
  private val InternalFormDelimiter = " "

  def separateInternalForm(internalForm: String): List[String] =
    internalForm.split(InternalFormDelimiter).toList

  def fromInternalForm(internalForm: String): Option[Shortcut] =
    Option(KeyStroke getKeyStroke internalForm) match {
      case Some(stroke) => {
        Some(Shortcut(stroke))
      }
      case None => {
        Console.err println (
          "KeyStroke.getKeyStroke could not parse allegedly internal form: " +
          internalForm
        )
        None
      }
    }

  def fromExternalForm(
    maskKeyExternalForms: List[String],
    nonMaskKeyExternalForms: List[String]): Option[Shortcut] = {
      val maskKeyInternalForms = maskKeyExternalForms map {
        Key external2InternalForm _
      }
      val nonMaskKeyInternalForms = nonMaskKeyExternalForms map {
        Key external2InternalForm _
      }
      val internalShortcutForm = (
        maskKeyInternalForms.mkString(InternalFormDelimiter) +
        InternalFormDelimiter +
        nonMaskKeyInternalForms.mkString(InternalFormDelimiter)
      )
      Shortcut fromInternalForm internalShortcutForm
  }
}

object Key {

  import Shortcut.isMac

  private val ExternalMenu = "menu"
  private val ExternalCommand = "command"

  val InternalAlt = "alt"
  val InternalCtrl = "ctrl"
  val InternalEscape = "ESCAPE"
  val InternalMeta = "meta"
  val InternalShift = "shift"

  def external2InternalForm(str: String): String = {
    str match {
      case ExternalMenu => if (isMac) InternalMeta else InternalCtrl
      case ExternalCommand => InternalMeta
      case _ => str
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy