blob: 5f43bbd2cccb8d88454386f391772815ad8a33d1 [file] [log] [blame]
/**************************************************************
*
* 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 "svx/sidebar/Popup.hxx"
#include "svx/sidebar/PopupContainer.hxx"
#include "svx/sidebar/PopupControl.hxx"
#include <vcl/toolbox.hxx>
namespace svx { namespace sidebar {
Popup::Popup (
Window* pParent,
const ::boost::function<PopupControl*(PopupContainer*)>& rControlCreator,
const ::rtl::OUString& rsAccessibleName)
: mpControl(),
mpParent(pParent),
maControlCreator(rControlCreator),
maPopupModeEndCallback(),
msAccessibleName(rsAccessibleName),
mpContainer()
{
OSL_ASSERT(mpParent!=NULL);
OSL_ASSERT(maControlCreator);
}
Popup::~Popup (void)
{
mpControl.reset();
mpContainer.reset();
}
void Popup::Show (ToolBox& rToolBox)
{
rToolBox.SetItemDown(rToolBox.GetCurItemId(), true);
ProvideContainerAndControl();
if ( ! (mpContainer && mpControl))
{
OSL_ASSERT(mpContainer);
OSL_ASSERT(mpControl);
return;
}
if ( !mpContainer->IsInPopupMode() )
{
mpContainer->SetSizePixel(mpControl->GetOutputSizePixel());
const Point aPos (mpParent->OutputToScreenPixel(rToolBox.GetPosPixel()));
const Size aSize (rToolBox.GetSizePixel());
const Rectangle aRect (aPos, aSize);
mpContainer->StartPopupMode(
aRect,
FLOATWIN_POPUPMODE_NOFOCUSCLOSE|FLOATWIN_POPUPMODE_DOWN);
mpContainer->SetPopupModeFlags(
mpContainer->GetPopupModeFlags()
| FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE);
mpControl->GetFocus();
}
}
void Popup::Hide (void)
{
if (mpContainer)
if (mpContainer->IsInPopupMode())
mpContainer->EndPopupMode();
}
void Popup::SetPopupModeEndHandler (const ::boost::function<void(void)>& rCallback)
{
maPopupModeEndCallback = rCallback;
if (mpContainer)
mpContainer->SetPopupModeEndHdl(LINK(this, Popup, PopupModeEndHandler));
}
void Popup::ProvideContainerAndControl (void)
{
if ( ! (mpContainer && mpControl)
&& mpParent!=NULL
&& maControlCreator)
{
CreateContainerAndControl();
}
}
void Popup::CreateContainerAndControl (void)
{
mpContainer.reset(new PopupContainer(mpParent));
mpContainer->SetAccessibleName(msAccessibleName);
mpContainer->SetPopupModeEndHdl(LINK(this, Popup, PopupModeEndHandler));
mpContainer->SetBorderStyle(mpContainer->GetBorderStyle() | WINDOW_BORDER_MENU);
mpControl.reset(maControlCreator(mpContainer.get()));
}
IMPL_LINK(Popup, PopupModeEndHandler, void*, EMPTYARG)
{
if (maPopupModeEndCallback)
maPopupModeEndCallback();
// Popup control is no longer needed and can be destroyed.
mpControl.reset();
mpContainer.reset();
return 0;
}
} } // end of namespace svx::sidebar