/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
 *************************************************************/

#include "precompiled_sfx2.hxx"

#include "TitleBar.hxx"
#include "Paint.hxx"
#include "Accessible.hxx"
#include "AccessibleTitleBar.hxx"

#include <tools/svborder.hxx>
#include <vcl/gradient.hxx>
#include <vcl/lineinfo.hxx>

#include <com/sun/star/accessibility/AccessibleRole.hpp>

ToolbarValue::~ToolbarValue (void) {}

namespace
{
	const static sal_Int32 gnLeftIconSpace (3);
	const static sal_Int32 gnRightIconSpace (3);
}

namespace sfx2 { namespace sidebar {

TitleBar::TitleBar (
	const ::rtl::OUString& rsTitle,
	Window* pParentWindow,
	const sidebar::Paint& rInitialBackgroundPaint)
	: Window(pParentWindow),
	  maToolBox(this),
	  msTitle(rsTitle),
	  maIcon()
{
	SetBackground(rInitialBackgroundPaint.GetWallpaper());

	maToolBox.SetSelectHdl(LINK(this, TitleBar, SelectionHandler));
}

TitleBar::~TitleBar (void)
{
}

void TitleBar::SetTitle (const ::rtl::OUString& rsTitle)
{
	msTitle = rsTitle;
	Invalidate();
}

void TitleBar::SetIcon (const Image& rIcon)
{
	maIcon = rIcon;
	Invalidate();
}

void TitleBar::Paint (const Rectangle& rUpdateArea)
{
	(void)rUpdateArea;

	// Paint title bar background.
	Size aWindowSize (GetOutputSizePixel());
	Rectangle aTitleBarBox(
		0,
		0,
		aWindowSize.Width(),
		aWindowSize.Height()
		);

	PaintDecoration(aTitleBarBox);
	const Rectangle aTitleBox (GetTitleArea(aTitleBarBox));
	PaintTitle(aTitleBox);
	PaintFocus(aTitleBox);
}

void TitleBar::DataChanged (const DataChangedEvent& rEvent)
{
	(void)rEvent;

	SetBackground(GetBackgroundPaint().GetWallpaper());
}

void TitleBar::SetPosSizePixel (
	long nX,
	long nY,
	long nWidth,
	long nHeight,
	sal_uInt16 nFlags)
{
	Window::SetPosSizePixel(nX,nY,nWidth,nHeight,nFlags);

	// Place the toolbox.
	const sal_Int32 nToolBoxWidth (maToolBox.GetItemPosRect(0).GetWidth());
	maToolBox.SetPosSizePixel(nWidth-nToolBoxWidth,0, nToolBoxWidth,nHeight, WINDOW_POSSIZE_POSSIZE);
	maToolBox.Show();
}

ToolBox& TitleBar::GetToolBox (void)
{
	return maToolBox;
}

const ToolBox& TitleBar::GetToolBox (void) const
{
	return maToolBox;
}

void TitleBar::HandleToolBoxItemClick (const sal_uInt16 nItemIndex)
{
	(void)nItemIndex;
	// Any real processing has to be done in derived class.
}

cssu::Reference<css::accessibility::XAccessible> TitleBar::CreateAccessible (void)
{
	SetAccessibleRole(css::accessibility::AccessibleRole::PANEL);
	return AccessibleTitleBar::Create(*this);
}

void TitleBar::PaintTitle (const Rectangle& rTitleBox)
{
	Push(PUSH_FONT | PUSH_TEXTCOLOR);

	Rectangle aTitleBox (rTitleBox);

	// When there is an icon then paint it at the left of the given box.
	if ( !! maIcon)
	{
		DrawImage(
			Point(
				aTitleBox.Left() + gnLeftIconSpace,
				aTitleBox.Top() + (aTitleBox.GetHeight()-maIcon.GetSizePixel().Height())/2),
			maIcon);
		aTitleBox.Left() += gnLeftIconSpace + maIcon.GetSizePixel().Width() + gnRightIconSpace;
	}

	Font aFont(GetFont());
	aFont.SetWeight(WEIGHT_BOLD);
	SetFont(aFont);

	// Paint title bar text.
	SetTextColor(GetTextColor());
	DrawText(
		aTitleBox,
		msTitle,
		TEXT_DRAW_LEFT | TEXT_DRAW_VCENTER);

	Pop();
}

void TitleBar::PaintFocus (const Rectangle& rFocusBox)
{
	Push(PUSH_FONT | PUSH_TEXTCOLOR);

	Font aFont(GetFont());
	aFont.SetWeight(WEIGHT_BOLD);
	SetFont(aFont);

	const Rectangle aTextBox (
		GetTextRect(
			rFocusBox,
			msTitle,
			TEXT_DRAW_LEFT | TEXT_DRAW_VCENTER));
	const Rectangle aLargerTextBox (
		aTextBox.Left() - 2,
		aTextBox.Top() - 2,
		aTextBox.Right() + 2,
		aTextBox.Bottom() + 2);

	if (HasFocus())
		Window::ShowFocus(aLargerTextBox);
	else
		Window::HideFocus();

	Pop();
}

IMPL_LINK(TitleBar, SelectionHandler, ToolBox*, pToolBox)
{
	(void)pToolBox;
	OSL_ASSERT(&maToolBox==pToolBox);
	const sal_uInt16 nItemId (maToolBox.GetHighlightItemId());

	HandleToolBoxItemClick(nItemId);

	return sal_True;
}

} } // end of namespace sfx2::sidebar

/* vim: set noet sw=4 ts=4: */
