Unverified Commit 385bb208 authored by Igor Demin's avatar Igor Demin Committed by GitHub

Delegate focus methods from SkiaLayer to backedLayer (#543)

* Delegate focus methods from SkiaLayer to backedLayer

Similar to the other methods

(see the comment "We need to delegate all event listeners..." why we do that)

* Add a comment
parent 117b733a
package org.jetbrains.skiko package org.jetbrains.skiko
import org.jetbrains.skia.* import org.jetbrains.skia.*
import org.jetbrains.skia.Canvas
import org.jetbrains.skiko.redrawer.Redrawer import org.jetbrains.skiko.redrawer.Redrawer
import java.awt.*
import java.awt.Color import java.awt.Color
import java.awt.Component
import java.awt.Graphics
import java.awt.event.* import java.awt.event.*
import java.awt.im.InputMethodRequests import java.awt.im.InputMethodRequests
import java.awt.Window
import java.util.concurrent.CancellationException import java.util.concurrent.CancellationException
import javax.accessibility.Accessible import javax.accessibility.Accessible
import javax.swing.JComponent import javax.swing.JComponent
...@@ -83,6 +82,22 @@ actual open class SkiaLayer internal constructor( ...@@ -83,6 +82,22 @@ actual open class SkiaLayer internal constructor(
override fun getInputMethodRequests(): InputMethodRequests? { override fun getInputMethodRequests(): InputMethodRequests? {
return this@SkiaLayer.inputMethodRequests return this@SkiaLayer.inputMethodRequests
} }
// check isRequestFocusEnabled manually, because it isn't implemented for Canvas.
// But it should be implemented, how it is implemented for JComponent.
// See Component.setRequestFocusEnabled description.
override fun requestFocus(cause: FocusEvent.Cause?) {
if (canReceiveFocus(cause)) {
super.requestFocus(cause)
}
}
override fun requestFocusInWindow(cause: FocusEvent.Cause?): Boolean {
return canReceiveFocus(cause) && super.requestFocusInWindow(cause)
}
private fun canReceiveFocus(cause: FocusEvent.Cause?) = cause != FocusEvent.Cause.MOUSE_EVENT ||
isRequestFocusEnabled
} }
@Suppress("LeakingThis") @Suppress("LeakingThis")
add(backedLayer) add(backedLayer)
...@@ -366,6 +381,30 @@ actual open class SkiaLayer internal constructor( ...@@ -366,6 +381,30 @@ actual open class SkiaLayer internal constructor(
backedLayer.doProcessInputMethodEvent(e) backedLayer.doProcessInputMethodEvent(e)
} }
override fun addFocusListener(l: FocusListener?) {
backedLayer.addFocusListener(l)
}
override fun removeFocusListener(l: FocusListener?) {
backedLayer.removeFocusListener(l)
}
override fun setFocusable(focusable: Boolean) {
backedLayer.isFocusable = focusable
}
override fun isFocusable(): Boolean {
return backedLayer.isFocusable
}
override fun hasFocus(): Boolean {
return backedLayer.hasFocus()
}
override fun isFocusOwner(): Boolean {
return backedLayer.isFocusOwner
}
override fun requestFocus() { override fun requestFocus() {
backedLayer.requestFocus() backedLayer.requestFocus()
} }
...@@ -374,6 +413,22 @@ actual open class SkiaLayer internal constructor( ...@@ -374,6 +413,22 @@ actual open class SkiaLayer internal constructor(
backedLayer.requestFocus(cause) backedLayer.requestFocus(cause)
} }
override fun requestFocusInWindow(): Boolean {
return backedLayer.requestFocusInWindow()
}
override fun requestFocusInWindow(cause: FocusEvent.Cause?): Boolean {
return backedLayer.requestFocusInWindow(cause)
}
override fun setFocusTraversalKeysEnabled(focusTraversalKeysEnabled: Boolean) {
backedLayer.focusTraversalKeysEnabled = focusTraversalKeysEnabled
}
override fun getFocusTraversalKeysEnabled(): Boolean {
return backedLayer.focusTraversalKeysEnabled
}
override fun addInputMethodListener(l: InputMethodListener) { override fun addInputMethodListener(l: InputMethodListener) {
super.addInputMethodListener(l) super.addInputMethodListener(l)
backedLayer.addInputMethodListener(l) backedLayer.addInputMethodListener(l)
...@@ -416,10 +471,6 @@ actual open class SkiaLayer internal constructor( ...@@ -416,10 +471,6 @@ actual open class SkiaLayer internal constructor(
backedLayer.removeKeyListener(l) backedLayer.removeKeyListener(l)
} }
override fun setFocusTraversalKeysEnabled(focusTraversalKeysEnabled: Boolean) {
backedLayer.focusTraversalKeysEnabled = focusTraversalKeysEnabled
}
/** /**
* Redraw on the next animation Frame (on vsync signal if vsync is enabled). * Redraw on the next animation Frame (on vsync signal if vsync is enabled).
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment