package org.codefx.libfx.dom; import java.util.Objects; import java.util.Optional; import javax.swing.event.HyperlinkEvent.EventType; /** * The names of those types of DOM events for which an equivalent hyperlink {@link EventType EventType}s exists. * <p> * * @see <a href="http://www.w3.org/TR/DOM-Level-3-Events/#event-types-list">DOM Level 3 Events Specification - Event * Type List</a> */ public enum DomEventType { // #begin INSTANCES /** * A mouse click. * <p> * This event can be canceled. * * @see <a href="http://www.w3.org/TR/DOM-Level-3-Events/#event-type-click">DOM Level 3 Events Specification - CLICK * Event</a> */ CLICK("click"), /** * The mouse entered an element's boundaries. Is <b>not</b> dispatched when the mouse moves inside the element * between its descendant elements. * <p> * This event can not be canceled, i.e. canceling it has no effect. * * @see <a href="http://www.w3.org/TR/DOM-Level-3-Events/#event-type-mouseenter">DOM Level 3 Events Specification - * MOUSEENTER Event</a> */ MOUSE_ENTER("mouseenter"), /** * The mouse left an element's boundaries. Is <b>not</b> dispatched when the mouse moves inside the element between * its descendant elements. * <p> * This event can not be canceled, i.e. canceling it has no effect. * * @see <a href="http://www.w3.org/TR/DOM-Level-3-Events/#event-type-mouseleave">DOM Level 3 Events Specification - * MOUSELEAVE Event</a> */ MOUSE_LEAVE("mouseleave"); // #end INSTANCES // #begin DEFINITION /** * The event's name. */ private final String domName; /** * Creates a new DOM event type with the specified name. * * @param domName * the name of the event as per <a href="http://www.w3.org/TR/DOM-Level-3-Events/#event-types-list">DOM * Level 3 Events Specification </a> */ private DomEventType(String domName) { this.domName = domName; } /** * @return the name of the event as per <a href="http://www.w3.org/TR/DOM-Level-3-Events/#event-types-list">DOM * Level 3 Events Specification </a> */ public String getDomName() { return domName; } // #end DEFINITION // #begin HELPER /** * Returns the DOM event type for the specified event name. * * @param domEventName * the name of the DOM event as per W3C specification * @return a {@link DomEventType} if it could be determined; otherwise {@link Optional#empty()} * @see <a href="http://www.w3.org/TR/DOM-Level-3-Events/#event-types-list">DOM Level 3 Events Specification - Event * Type List</a> */ public static Optional<DomEventType> byName(String domEventName) { Objects.requireNonNull(domEventName, "The argument 'domEventName' must not be null."); for (DomEventType type : DomEventType.values()) if (type.getDomName().equals(domEventName)) return Optional.of(type); return Optional.empty(); } /** * Returns the representation of this DOM event as an {@link EventType HyperlinkEventType} if that is possible. * Otherwise returns an empty Optional. * * @return <ul> * <li> {@link #CLICK} → {@link EventType#ACTIVATED ACTIVATED} * <li> {@link #MOUSE_ENTER} → {@link EventType#ENTERED ENTERED} * <li> {@link #MOUSE_LEAVE} → {@link EventType#EXITED EXITED} * <li>Otherwise → {@link Optional#empty() empty} * </ul> */ public Optional<EventType> toHyperlinkEventType() { switch (this) { case CLICK: return Optional.of(EventType.ACTIVATED); case MOUSE_ENTER: return Optional.of(EventType.ENTERED); case MOUSE_LEAVE: return Optional.of(EventType.EXITED); default: return Optional.empty(); } } // #end HELPER }