xref: /trunk/main/svx/source/sidebar/tools/Popup.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
18dcb2a10SAndre Fischer /**************************************************************
28dcb2a10SAndre Fischer  *
38dcb2a10SAndre Fischer  * Licensed to the Apache Software Foundation (ASF) under one
48dcb2a10SAndre Fischer  * or more contributor license agreements.  See the NOTICE file
58dcb2a10SAndre Fischer  * distributed with this work for additional information
68dcb2a10SAndre Fischer  * regarding copyright ownership.  The ASF licenses this file
78dcb2a10SAndre Fischer  * to you under the Apache License, Version 2.0 (the
88dcb2a10SAndre Fischer  * "License"); you may not use this file except in compliance
98dcb2a10SAndre Fischer  * with the License.  You may obtain a copy of the License at
108dcb2a10SAndre Fischer  *
118dcb2a10SAndre Fischer  *   http://www.apache.org/licenses/LICENSE-2.0
128dcb2a10SAndre Fischer  *
138dcb2a10SAndre Fischer  * Unless required by applicable law or agreed to in writing,
148dcb2a10SAndre Fischer  * software distributed under the License is distributed on an
158dcb2a10SAndre Fischer  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
168dcb2a10SAndre Fischer  * KIND, either express or implied.  See the License for the
178dcb2a10SAndre Fischer  * specific language governing permissions and limitations
188dcb2a10SAndre Fischer  * under the License.
198dcb2a10SAndre Fischer  *
208dcb2a10SAndre Fischer  *************************************************************/
218dcb2a10SAndre Fischer 
228dcb2a10SAndre Fischer #include "svx/sidebar/Popup.hxx"
238dcb2a10SAndre Fischer #include "svx/sidebar/PopupContainer.hxx"
248dcb2a10SAndre Fischer #include "svx/sidebar/PopupControl.hxx"
258dcb2a10SAndre Fischer 
268dcb2a10SAndre Fischer #include <vcl/toolbox.hxx>
278dcb2a10SAndre Fischer 
288dcb2a10SAndre Fischer 
298dcb2a10SAndre Fischer namespace svx { namespace sidebar {
308dcb2a10SAndre Fischer 
Popup(Window * pParent,const::boost::function<PopupControl * (PopupContainer *)> & rControlCreator,const::rtl::OUString & rsAccessibleName)318dcb2a10SAndre Fischer Popup::Popup (
328dcb2a10SAndre Fischer     Window* pParent,
338dcb2a10SAndre Fischer     const ::boost::function<PopupControl*(PopupContainer*)>& rControlCreator,
348dcb2a10SAndre Fischer     const ::rtl::OUString& rsAccessibleName)
358dcb2a10SAndre Fischer     : mpControl(),
368dcb2a10SAndre Fischer       mpParent(pParent),
378dcb2a10SAndre Fischer       maControlCreator(rControlCreator),
388dcb2a10SAndre Fischer       maPopupModeEndCallback(),
398dcb2a10SAndre Fischer       msAccessibleName(rsAccessibleName),
408dcb2a10SAndre Fischer       mpContainer()
418dcb2a10SAndre Fischer {
428dcb2a10SAndre Fischer     OSL_ASSERT(mpParent!=NULL);
438dcb2a10SAndre Fischer     OSL_ASSERT(maControlCreator);
448dcb2a10SAndre Fischer }
458dcb2a10SAndre Fischer 
468dcb2a10SAndre Fischer 
478dcb2a10SAndre Fischer 
488dcb2a10SAndre Fischer 
~Popup(void)498dcb2a10SAndre Fischer Popup::~Popup (void)
508dcb2a10SAndre Fischer {
518dcb2a10SAndre Fischer     mpControl.reset();
528dcb2a10SAndre Fischer     mpContainer.reset();
538dcb2a10SAndre Fischer }
548dcb2a10SAndre Fischer 
558dcb2a10SAndre Fischer 
568dcb2a10SAndre Fischer 
578dcb2a10SAndre Fischer 
Show(ToolBox & rToolBox)588dcb2a10SAndre Fischer void Popup::Show (ToolBox& rToolBox)
598dcb2a10SAndre Fischer {
608dcb2a10SAndre Fischer     rToolBox.SetItemDown(rToolBox.GetCurItemId(), true);
618dcb2a10SAndre Fischer 
628dcb2a10SAndre Fischer     ProvideContainerAndControl();
638dcb2a10SAndre Fischer     if ( ! (mpContainer && mpControl))
648dcb2a10SAndre Fischer     {
658dcb2a10SAndre Fischer         OSL_ASSERT(mpContainer);
668dcb2a10SAndre Fischer         OSL_ASSERT(mpControl);
678dcb2a10SAndre Fischer         return;
688dcb2a10SAndre Fischer     }
698dcb2a10SAndre Fischer 
70778b1054SOliver-Rainer Wittmann     if ( !mpContainer->IsInPopupMode() )
71778b1054SOliver-Rainer Wittmann     {
728dcb2a10SAndre Fischer         mpContainer->SetSizePixel(mpControl->GetOutputSizePixel());
738dcb2a10SAndre Fischer 
748dcb2a10SAndre Fischer         const Point aPos (mpParent->OutputToScreenPixel(rToolBox.GetPosPixel()));
758dcb2a10SAndre Fischer         const Size aSize (rToolBox.GetSizePixel());
768dcb2a10SAndre Fischer         const Rectangle aRect (aPos, aSize);
778dcb2a10SAndre Fischer 
788dcb2a10SAndre Fischer         mpContainer->StartPopupMode(
798dcb2a10SAndre Fischer             aRect,
808dcb2a10SAndre Fischer             FLOATWIN_POPUPMODE_NOFOCUSCLOSE|FLOATWIN_POPUPMODE_DOWN);
818dcb2a10SAndre Fischer         mpContainer->SetPopupModeFlags(
828dcb2a10SAndre Fischer             mpContainer->GetPopupModeFlags()
838dcb2a10SAndre Fischer                 | FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE);
848dcb2a10SAndre Fischer 
858dcb2a10SAndre Fischer         mpControl->GetFocus();
868dcb2a10SAndre Fischer     }
87778b1054SOliver-Rainer Wittmann }
888dcb2a10SAndre Fischer 
898dcb2a10SAndre Fischer 
908dcb2a10SAndre Fischer 
918dcb2a10SAndre Fischer 
Hide(void)928dcb2a10SAndre Fischer void Popup::Hide (void)
938dcb2a10SAndre Fischer {
948dcb2a10SAndre Fischer     if (mpContainer)
958dcb2a10SAndre Fischer         if (mpContainer->IsInPopupMode())
968dcb2a10SAndre Fischer             mpContainer->EndPopupMode();
978dcb2a10SAndre Fischer }
988dcb2a10SAndre Fischer 
998dcb2a10SAndre Fischer 
1008dcb2a10SAndre Fischer 
1018dcb2a10SAndre Fischer 
SetPopupModeEndHandler(const::boost::function<void (void)> & rCallback)1028dcb2a10SAndre Fischer void Popup::SetPopupModeEndHandler (const ::boost::function<void(void)>& rCallback)
1038dcb2a10SAndre Fischer {
1048dcb2a10SAndre Fischer     maPopupModeEndCallback = rCallback;
1058dcb2a10SAndre Fischer     if (mpContainer)
1068dcb2a10SAndre Fischer         mpContainer->SetPopupModeEndHdl(LINK(this, Popup, PopupModeEndHandler));
1078dcb2a10SAndre Fischer }
1088dcb2a10SAndre Fischer 
1098dcb2a10SAndre Fischer 
1108dcb2a10SAndre Fischer 
1118dcb2a10SAndre Fischer 
ProvideContainerAndControl(void)1128dcb2a10SAndre Fischer void Popup::ProvideContainerAndControl (void)
1138dcb2a10SAndre Fischer {
1148dcb2a10SAndre Fischer     if ( ! (mpContainer && mpControl)
1158dcb2a10SAndre Fischer         && mpParent!=NULL
1168dcb2a10SAndre Fischer         && maControlCreator)
1178dcb2a10SAndre Fischer     {
1188dcb2a10SAndre Fischer         CreateContainerAndControl();
1198dcb2a10SAndre Fischer     }
1208dcb2a10SAndre Fischer }
1218dcb2a10SAndre Fischer 
1228dcb2a10SAndre Fischer 
1238dcb2a10SAndre Fischer 
1248dcb2a10SAndre Fischer 
CreateContainerAndControl(void)1258dcb2a10SAndre Fischer void Popup::CreateContainerAndControl (void)
1268dcb2a10SAndre Fischer {
1278dcb2a10SAndre Fischer     mpContainer.reset(new PopupContainer(mpParent));
1288dcb2a10SAndre Fischer     mpContainer->SetAccessibleName(msAccessibleName);
1298dcb2a10SAndre Fischer     mpContainer->SetPopupModeEndHdl(LINK(this, Popup, PopupModeEndHandler));
1308dcb2a10SAndre Fischer     mpContainer->SetBorderStyle(mpContainer->GetBorderStyle() | WINDOW_BORDER_MENU);
1318dcb2a10SAndre Fischer 
1328dcb2a10SAndre Fischer     mpControl.reset(maControlCreator(mpContainer.get()));
1338dcb2a10SAndre Fischer }
1348dcb2a10SAndre Fischer 
1358dcb2a10SAndre Fischer 
1368dcb2a10SAndre Fischer 
1378dcb2a10SAndre Fischer 
IMPL_LINK(Popup,PopupModeEndHandler,void *,EMPTYARG)1388dcb2a10SAndre Fischer IMPL_LINK(Popup, PopupModeEndHandler, void*, EMPTYARG)
1398dcb2a10SAndre Fischer {
1408dcb2a10SAndre Fischer     if (maPopupModeEndCallback)
1418dcb2a10SAndre Fischer         maPopupModeEndCallback();
142*550fbbbdSOliver-Rainer Wittmann 
143*550fbbbdSOliver-Rainer Wittmann     // Popup control is no longer needed and can be destroyed.
144*550fbbbdSOliver-Rainer Wittmann     mpControl.reset();
145*550fbbbdSOliver-Rainer Wittmann     mpContainer.reset();
146*550fbbbdSOliver-Rainer Wittmann 
1478dcb2a10SAndre Fischer     return 0;
1488dcb2a10SAndre Fischer }
1498dcb2a10SAndre Fischer 
1508dcb2a10SAndre Fischer 
1518dcb2a10SAndre Fischer 
1528dcb2a10SAndre Fischer } } // end of namespace svx::sidebar
153