// 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.code.autocomplete;

import org.waveprotocol.wave.client.common.util.SignalEvent;
import org.waveprotocol.wave.client.common.util.SignalEvent.KeySignalType;

import com.google.common.annotations.VisibleForTesting;

// TODO: Replace with CharCodeWithModifiers.
/**
 * Immutable holder of essential properties of
 * {@link SignalEvent}
 */
public class SignalEventEssence {
  public final int keyCode;
  public final boolean ctrlKey;
  public final boolean altKey;
  public final boolean shiftKey;
  public final boolean metaKey;
  public final KeySignalType type;

  @VisibleForTesting
  public SignalEventEssence(int keyCode, boolean ctrlKey, boolean altKey, boolean shiftKey,
      boolean metaKey, KeySignalType type) {
    this.keyCode = keyCode;
    this.ctrlKey = ctrlKey;
    this.altKey = altKey;
    this.shiftKey = shiftKey;
    this.metaKey = metaKey;
    this.type = type;
  }

  @VisibleForTesting
  public SignalEventEssence(int keyCode) {
    this(keyCode, false, false, false, false, KeySignalType.INPUT);
  }

  // TODO: Replace additional constructors with static methods.
  public SignalEventEssence(SignalEvent source) {
    this(source.getKeyCode(), source.getCtrlKey(), source.getAltKey(), source.getShiftKey(),
        source.getMetaKey(), source.getKeySignalType());
  }

  public char getChar() {
    if (ctrlKey || altKey || metaKey || (type != KeySignalType.INPUT)) {
      return 0;
    }
    return (char) keyCode;
  }
}
