// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef APP_MENUS_ACCELERATOR_COCOA_H_
#define APP_MENUS_ACCELERATOR_COCOA_H_
#pragma once

#include <Foundation/Foundation.h>

#include "app/menus/accelerator.h"
#include "base/scoped_nsobject.h"

namespace menus {

// This is a subclass of the cross-platform Accelerator, but with more direct
// support for Cocoa key equivalents. Note that the typical use case for this
// class is to initialize it with a string literal, which is why it sends
// |-copy| to the |key_code| paramater in the constructor.
class AcceleratorCocoa : public Accelerator {
 public:
  AcceleratorCocoa(NSString* key_code, NSUInteger mask)
      : Accelerator(app::VKEY_UNKNOWN, mask),
        characters_([key_code copy]) {
  }

  AcceleratorCocoa(const AcceleratorCocoa& accelerator)
      : Accelerator(accelerator) {
    characters_.reset([accelerator.characters_ copy]);
  }

  AcceleratorCocoa() : Accelerator() {}
  virtual ~AcceleratorCocoa() {}

  AcceleratorCocoa& operator=(const AcceleratorCocoa& accelerator) {
    if (this != &accelerator) {
      *static_cast<Accelerator*>(this) = accelerator;
      characters_.reset([accelerator.characters_ copy]);
    }
    return *this;
  }

  bool operator==(const AcceleratorCocoa& rhs) const {
    return [characters_ isEqualToString:rhs.characters_.get()] &&
        (modifiers_ == rhs.modifiers_);
  }

  NSString* characters() const {
    return characters_.get();
  }

 private:
  // String of characters for the key equivalent.
  scoped_nsobject<NSString> characters_;
};

}  // namespace menus

#endif  // APP_MENUS_ACCELERATOR_COCOA_H_
