/************************************************************** * * 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 namespace svx { namespace sidebar { Popup::Popup ( Window* pParent, const ::boost::function& 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& 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