// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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.
package com.google.collide.client.editor.input;
import elemental.js.util.JsMapFromIntTo;
import org.waveprotocol.wave.client.common.util.SignalEvent;
/**
* Controller around a group of {@link InputMode}s to direct text/modifier
* key input to the active mode. Provides access to the current {@link InputController}
* to the active mode for performing shortcut actions.
*
* Each scheme can contain additional state that needs to be shared between modes,
* such as a vi line-mode search "/class", and additional command-mode next match
* "n" commands
*
* Tied to the lifetime of an editor instance
*
*
*/
public abstract class InputScheme {
/**
* Store a reference to the editor's input controller to pass to active mode
*/
private InputController inputController;
private InputMode activeMode = null;
/**
* Map from mode number to mode object. Mode numbers should be constants
* defined for each scheme.
*/
private JsMapFromIntTo<InputMode> modes;
public InputScheme() {
this.inputController = null;
this.modes = JsMapFromIntTo.create();
}
public InputScheme(InputController input) {
this.inputController = input;
this.modes = JsMapFromIntTo.create();
}
/**
* Add all Scheme modes and setup the default {@link InputMode} by calling
* switchMode. Optionally make any scheme-specific document changes
* (add status bar, etc)
*/
public abstract void setup();
/**
* Called when switching editor modes, this should undo all document
* changes made in {@link InputScheme#setup()}
*/
public void teardown() {
if (activeMode != null) {
activeMode.teardown();
}
}
/**
* Add a new mode to this scheme
*/
public void addMode(int modeNumber, InputMode mode) {
mode.setScheme(this);
modes.put(modeNumber, mode);
}
public InputController getInputController() {
return inputController;
}
public InputMode getMode() {
return activeMode;
}
/**
* Switch to the new mode:
* call teardown() on active mode (if there is one)
* call setup() on new mode
*/
public void switchMode(int modeNumber) {
if (modes.hasKey(modeNumber)) {
if (activeMode != null) {
activeMode.teardown();
}
activeMode = modes.get(modeNumber);
activeMode.setup();
}
}
/**
* Called from the event handler, dispatch this event to the active mode
*/
public boolean handleEvent(SignalEvent event, String text) {
if (activeMode != null) {
return activeMode.handleEvent(event, text);
} else {
return false;
}
}
/**
* This is called after a shortcut has been dispatched.
*/
protected void handleShortcutCalled() {
}
}