// Copyright (c) 2013 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.

#include "chrome/browser/ui/accelerator_utils.h"

#import <Cocoa/Cocoa.h>

#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/global_keyboard_shortcuts_mac.h"
#include "chrome/browser/ui/cocoa/accelerators_cocoa.h"
#include "ui/base/accelerators/accelerator.h"
#import "ui/base/accelerators/platform_accelerator_cocoa.h"
#import "ui/events/keycodes/keyboard_code_conversion_mac.h"

namespace chrome {

bool IsChromeAccelerator(const ui::Accelerator& accelerator, Profile* profile) {
  NSUInteger modifiers = (accelerator.IsCtrlDown() ? NSControlKeyMask : 0) |
                         (accelerator.IsCmdDown() ? NSCommandKeyMask : 0) |
                         (accelerator.IsAltDown() ? NSAlternateKeyMask : 0) |
                         (accelerator.IsShiftDown() ? NSShiftKeyMask : 0);

  // The |accelerator| passed in contains a Windows key code but no platform
  // accelerator info. The Accelerator list is the opposite: It has accelerators
  // that have key_code() == VKEY_UNKNOWN but they contain a platform
  // accelerator. We find common ground by converting the passed in Windows key
  // code to a character and use that when comparing against the Accelerator
  // list.
  unichar shifted_character;
  unichar character;
  int mac_keycode = ui::MacKeyCodeForWindowsKeyCode(
      accelerator.key_code(), modifiers, &shifted_character, &character);
  if (mac_keycode == -1)
    return false;

  NSString* characters = [NSString stringWithFormat:@"%C", character];
  NSString* charactersIgnoringModifiers =
      [NSString stringWithFormat:@"%C", shifted_character];

  NSEvent* event = [NSEvent keyEventWithType:NSKeyDown
                                    location:NSZeroPoint
                               modifierFlags:modifiers
                                   timestamp:0
                                windowNumber:0
                                     context:nil
                                  characters:characters
                 charactersIgnoringModifiers:charactersIgnoringModifiers
                                   isARepeat:NO
                                     keyCode:mac_keycode];

  return CommandForKeyEvent(event).found();
}

ui::Accelerator GetPrimaryChromeAcceleratorForBookmarkPage() {
  const ui::Accelerator* accelerator =
      AcceleratorsCocoa::GetInstance()->GetAcceleratorForCommand(
          IDC_BOOKMARK_PAGE);

  return accelerator ? *accelerator : ui::Accelerator();
}

}  // namespace chrome
