blob: 3110abd9c306561cbb50c69e6cd56f68c5eea501 [file] [log] [blame]
// 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 CHROME_FRAME_INFOBARS_INTERNAL_DISPLACED_WINDOW_MANAGER_H_
#define CHROME_FRAME_INFOBARS_INTERNAL_DISPLACED_WINDOW_MANAGER_H_
#include <atlbase.h>
#include <atlcrack.h>
#include <atlwin.h>
#include "base/basictypes.h"
#include "chrome_frame/infobars/internal/subclassing_window_with_delegate.h"
// DisplacedWindowManager observes the HWND passed to Initialize and:
// 1) Intercepts NCCALCSIZE events allowing the client to modify the window's
// requested dimensions.
// 2) Allows the client to request a recalculation of the window's dimensions
// (resulting in a deferred callback as in [1]).
// 3) Is destroyed only when the window is destroyed.
class DisplacedWindowManager
: public SubclassingWindowWithDelegate<DisplacedWindowManager> {
public:
DisplacedWindowManager();
// Triggers an immediate re-evaluation of the dimensions of the displaced
// window. Delegate::AdjustDisplacedWindowDimensions will be called with the
// natural dimensions of the displaced window.
void UpdateLayout();
BEGIN_MSG_MAP_EX(DisplacedWindowManager)
MSG_WM_NCCALCSIZE(OnNcCalcSize)
CHAIN_MSG_MAP(SubclassingWindowWithDelegate<DisplacedWindowManager>)
END_MSG_MAP()
private:
// The size of the displaced window is being calculated. Allow
// InfobarWindows to reserve a part of the space for themselves, if they are
// visible.
LRESULT OnNcCalcSize(BOOL calc_valid_rects, LPARAM lparam);
DISALLOW_COPY_AND_ASSIGN(DisplacedWindowManager);
}; // class DisplacedWindowManager
#endif // CHROME_FRAME_INFOBARS_INTERNAL_DISPLACED_WINDOW_MANAGER_H_