| /******************************************************************************* |
| * Copyright (c) 2017 Fabio Zadrozny and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Fabio Zadrozny - initial API and implementation - http://eclip.se/8519 |
| *******************************************************************************/ |
| package org.eclipse.ui.workbench.texteditor.macros.internal; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.e4.core.macros.IMacroInstruction; |
| import org.eclipse.swt.widgets.Event; |
| |
| /** |
| * Base class for a macro instruction based on events from a given type. |
| * |
| * Note that it doesn't store all the information on events, only character, |
| * stateMask, keyCode, keyLocation and detail (and the actual type is meant to |
| * be gotten from the class which overrides it or passed when needed). |
| * |
| * The actual fields that it stores may grow over time (and when restored, if |
| * those weren't properly saved, default values should be used). |
| */ |
| public abstract class AbstractSWTEventMacroInstruction implements IMacroInstruction { |
| |
| private static final String CHARACTER = "character"; //$NON-NLS-1$ |
| |
| private static final String STATE_MASK = "stateMask"; //$NON-NLS-1$ |
| |
| private static final String KEY_CODE = "keyCode"; //$NON-NLS-1$ |
| |
| private static final String DETAIL = "detail"; //$NON-NLS-1$ |
| |
| private static final String KEY_LOCATION = "keyLocation"; //$NON-NLS-1$ |
| |
| protected final Event fEvent; |
| |
| /** |
| * @param event |
| * the event for which the macro instruction is being created. |
| */ |
| public AbstractSWTEventMacroInstruction(Event event) { |
| // Create a new event (we want to make sure that only the given info is |
| // really needed on playback and don't want to keep a reference to the |
| // original widget). |
| Assert.isTrue(event.type == getEventType()); |
| Event newEvent = copyEvent(event); |
| |
| this.fEvent = newEvent; |
| } |
| |
| /** |
| * |
| * @return the event type of the events that this macro instruction is related |
| * to. |
| */ |
| protected abstract int getEventType(); |
| |
| /** |
| * Helper to create a copy of some event. |
| * |
| * @param event |
| * the event to be copied. |
| * @return a copy of the passed event. |
| */ |
| protected Event copyEvent(Event event) { |
| Event newEvent = new Event(); |
| newEvent.keyCode = event.keyCode; |
| newEvent.stateMask = event.stateMask; |
| newEvent.type = event.type; |
| newEvent.character = event.character; |
| newEvent.detail = event.detail; |
| newEvent.keyLocation = event.keyLocation; |
| return newEvent; |
| } |
| |
| /** |
| * Actually creates an event based on the contents previously gotten from |
| * {@link #toMap()}. |
| */ |
| protected static Event createEventFromMap(Map<String, String> map, int eventType) { |
| Event event = new Event(); |
| event.type = eventType; |
| |
| String keyCode = map.get(KEY_CODE); |
| if (keyCode != null) { |
| event.keyCode = Integer.parseInt(keyCode); |
| } else { |
| event.keyCode = 0; |
| } |
| |
| String stateMask = map.get(STATE_MASK); |
| if (stateMask != null) { |
| event.stateMask = Integer.parseInt(stateMask); |
| } else { |
| event.stateMask = 0; |
| } |
| |
| String character = map.get(CHARACTER); |
| if (character != null) { |
| event.character = character.charAt(0); |
| } else { |
| event.character = '\0'; |
| } |
| |
| String detail = map.get(DETAIL); |
| if (detail != null) { |
| event.detail = Integer.parseInt(detail); |
| } else { |
| event.detail = 0; |
| } |
| |
| String keyLocation = map.get(KEY_LOCATION); |
| if (keyLocation != null) { |
| event.keyLocation = Integer.parseInt(keyLocation); |
| } else { |
| event.keyLocation = 0; |
| } |
| return event; |
| } |
| |
| @Override |
| public Map<String, String> toMap() { |
| Map<String, String> map = new HashMap<>(); |
| |
| // Only save non-default values. |
| |
| if (fEvent.keyCode != 0) { |
| map.put(KEY_CODE, Integer.toString(fEvent.keyCode)); |
| } |
| |
| if (fEvent.stateMask != 0) { |
| map.put(STATE_MASK, Integer.toString(fEvent.stateMask)); |
| } |
| |
| if (fEvent.character != '\0') { |
| map.put(CHARACTER, Character.toString(fEvent.character)); |
| } |
| |
| if (fEvent.detail != 0) { |
| map.put(DETAIL, Integer.toString(fEvent.detail)); |
| } |
| |
| if (fEvent.keyLocation != 0) { |
| map.put(KEY_LOCATION, Integer.toString(fEvent.keyLocation)); |
| } |
| return map; |
| } |
| |
| } |