// Copyright 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 "ash/shelf/shelf_util.h"

#include "ash/shelf/shelf_constants.h"
#include "ui/aura/window_property.h"

DECLARE_WINDOW_PROPERTY_TYPE(ash::ShelfID);
DECLARE_WINDOW_PROPERTY_TYPE(ash::ShelfItemDetails*);

namespace ash {

DEFINE_WINDOW_PROPERTY_KEY(ShelfID, kShelfID, kInvalidShelfID);

// ShelfItemDetails for kShelfItemDetaildKey is owned by the window
// and will be freed automatically.
DEFINE_OWNED_WINDOW_PROPERTY_KEY(ShelfItemDetails,
                                 kShelfItemDetailsKey,
                                 NULL);

void SetShelfIDForWindow(ShelfID id, aura::Window* window) {
  if (!window)
    return;

  window->SetProperty(kShelfID, id);
}

ShelfID GetShelfIDForWindow(const aura::Window* window) {
  DCHECK(window);
  return window->GetProperty(kShelfID);
}

void SetShelfItemDetailsForWindow(aura::Window* window,
                                  const ShelfItemDetails& details) {
  // |item_details| is owned by |window|.
  ShelfItemDetails* item_details = new ShelfItemDetails(details);
  window->SetProperty(kShelfItemDetailsKey, item_details);
}

void SetShelfItemDetailsForDialogWindow(aura::Window* window,
                                        int image_resource_id) {
  // |item_details| is owned by |window|.
  ShelfItemDetails* item_details = new ShelfItemDetails;
  item_details->type = TYPE_DIALOG;
  item_details->image_resource_id = image_resource_id;
  item_details->title = window->title();
  window->SetProperty(kShelfItemDetailsKey, item_details);
}

void ClearShelfItemDetailsForWindow(aura::Window* window) {
  window->ClearProperty(kShelfItemDetailsKey);
}

const ShelfItemDetails* GetShelfItemDetailsForWindow(
    aura::Window* window) {
  return window->GetProperty(kShelfItemDetailsKey);
}

}  // namespace ash
