xref: /aoo42x/main/svx/source/sidebar/tools/Popup.cxx (revision 550fbbbd)
1*550fbbbdSOliver-Rainer Wittmann /**************************************************************
2*550fbbbdSOliver-Rainer Wittmann  *
3*550fbbbdSOliver-Rainer Wittmann  * Licensed to the Apache Software Foundation (ASF) under one
4*550fbbbdSOliver-Rainer Wittmann  * or more contributor license agreements.  See the NOTICE file
5*550fbbbdSOliver-Rainer Wittmann  * distributed with this work for additional information
6*550fbbbdSOliver-Rainer Wittmann  * regarding copyright ownership.  The ASF licenses this file
7*550fbbbdSOliver-Rainer Wittmann  * to you under the Apache License, Version 2.0 (the
8*550fbbbdSOliver-Rainer Wittmann  * "License"); you may not use this file except in compliance
9*550fbbbdSOliver-Rainer Wittmann  * with the License.  You may obtain a copy of the License at
10*550fbbbdSOliver-Rainer Wittmann  *
11*550fbbbdSOliver-Rainer Wittmann  *   http://www.apache.org/licenses/LICENSE-2.0
12*550fbbbdSOliver-Rainer Wittmann  *
13*550fbbbdSOliver-Rainer Wittmann  * Unless required by applicable law or agreed to in writing,
14*550fbbbdSOliver-Rainer Wittmann  * software distributed under the License is distributed on an
15*550fbbbdSOliver-Rainer Wittmann  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*550fbbbdSOliver-Rainer Wittmann  * KIND, either express or implied.  See the License for the
17*550fbbbdSOliver-Rainer Wittmann  * specific language governing permissions and limitations
18*550fbbbdSOliver-Rainer Wittmann  * under the License.
19*550fbbbdSOliver-Rainer Wittmann  *
20*550fbbbdSOliver-Rainer Wittmann  *************************************************************/
21*550fbbbdSOliver-Rainer Wittmann 
22*550fbbbdSOliver-Rainer Wittmann #include "svx/sidebar/Popup.hxx"
23*550fbbbdSOliver-Rainer Wittmann #include "svx/sidebar/PopupContainer.hxx"
24*550fbbbdSOliver-Rainer Wittmann #include "svx/sidebar/PopupControl.hxx"
25*550fbbbdSOliver-Rainer Wittmann 
26*550fbbbdSOliver-Rainer Wittmann #include <vcl/toolbox.hxx>
27*550fbbbdSOliver-Rainer Wittmann 
28*550fbbbdSOliver-Rainer Wittmann 
29*550fbbbdSOliver-Rainer Wittmann namespace svx { namespace sidebar {
30*550fbbbdSOliver-Rainer Wittmann 
Popup(Window * pParent,const::boost::function<PopupControl * (PopupContainer *)> & rControlCreator,const::rtl::OUString & rsAccessibleName)31*550fbbbdSOliver-Rainer Wittmann Popup::Popup (
32*550fbbbdSOliver-Rainer Wittmann     Window* pParent,
33*550fbbbdSOliver-Rainer Wittmann     const ::boost::function<PopupControl*(PopupContainer*)>& rControlCreator,
34*550fbbbdSOliver-Rainer Wittmann     const ::rtl::OUString& rsAccessibleName)
35*550fbbbdSOliver-Rainer Wittmann     : mpControl(),
36*550fbbbdSOliver-Rainer Wittmann       mpParent(pParent),
37*550fbbbdSOliver-Rainer Wittmann       maControlCreator(rControlCreator),
38*550fbbbdSOliver-Rainer Wittmann       maPopupModeEndCallback(),
39*550fbbbdSOliver-Rainer Wittmann       msAccessibleName(rsAccessibleName),
40*550fbbbdSOliver-Rainer Wittmann       mpContainer()
41*550fbbbdSOliver-Rainer Wittmann {
42*550fbbbdSOliver-Rainer Wittmann     OSL_ASSERT(mpParent!=NULL);
43*550fbbbdSOliver-Rainer Wittmann     OSL_ASSERT(maControlCreator);
44*550fbbbdSOliver-Rainer Wittmann }
45*550fbbbdSOliver-Rainer Wittmann 
46*550fbbbdSOliver-Rainer Wittmann 
47*550fbbbdSOliver-Rainer Wittmann 
48*550fbbbdSOliver-Rainer Wittmann 
~Popup(void)49*550fbbbdSOliver-Rainer Wittmann Popup::~Popup (void)
50*550fbbbdSOliver-Rainer Wittmann {
51*550fbbbdSOliver-Rainer Wittmann     mpControl.reset();
52*550fbbbdSOliver-Rainer Wittmann     mpContainer.reset();
53*550fbbbdSOliver-Rainer Wittmann }
54*550fbbbdSOliver-Rainer Wittmann 
55*550fbbbdSOliver-Rainer Wittmann 
56*550fbbbdSOliver-Rainer Wittmann 
57*550fbbbdSOliver-Rainer Wittmann 
Show(ToolBox & rToolBox)58*550fbbbdSOliver-Rainer Wittmann void Popup::Show (ToolBox& rToolBox)
59*550fbbbdSOliver-Rainer Wittmann {
60*550fbbbdSOliver-Rainer Wittmann     rToolBox.SetItemDown(rToolBox.GetCurItemId(), true);
61*550fbbbdSOliver-Rainer Wittmann 
62*550fbbbdSOliver-Rainer Wittmann     ProvideContainerAndControl();
63*550fbbbdSOliver-Rainer Wittmann     if ( ! (mpContainer && mpControl))
64*550fbbbdSOliver-Rainer Wittmann     {
65*550fbbbdSOliver-Rainer Wittmann         OSL_ASSERT(mpContainer);
66*550fbbbdSOliver-Rainer Wittmann         OSL_ASSERT(mpControl);
67*550fbbbdSOliver-Rainer Wittmann         return;
68*550fbbbdSOliver-Rainer Wittmann     }
69*550fbbbdSOliver-Rainer Wittmann 
70*550fbbbdSOliver-Rainer Wittmann     if ( !mpContainer->IsInPopupMode() )
71*550fbbbdSOliver-Rainer Wittmann     {
72*550fbbbdSOliver-Rainer Wittmann         mpContainer->SetSizePixel(mpControl->GetOutputSizePixel());
73*550fbbbdSOliver-Rainer Wittmann 
74*550fbbbdSOliver-Rainer Wittmann         const Point aPos (mpParent->OutputToScreenPixel(rToolBox.GetPosPixel()));
75*550fbbbdSOliver-Rainer Wittmann         const Size aSize (rToolBox.GetSizePixel());
76*550fbbbdSOliver-Rainer Wittmann         const Rectangle aRect (aPos, aSize);
77*550fbbbdSOliver-Rainer Wittmann 
78*550fbbbdSOliver-Rainer Wittmann         mpContainer->StartPopupMode(
79*550fbbbdSOliver-Rainer Wittmann             aRect,
80*550fbbbdSOliver-Rainer Wittmann             FLOATWIN_POPUPMODE_NOFOCUSCLOSE|FLOATWIN_POPUPMODE_DOWN);
81*550fbbbdSOliver-Rainer Wittmann         mpContainer->SetPopupModeFlags(
82*550fbbbdSOliver-Rainer Wittmann             mpContainer->GetPopupModeFlags()
83*550fbbbdSOliver-Rainer Wittmann                 | FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE);
84*550fbbbdSOliver-Rainer Wittmann 
85*550fbbbdSOliver-Rainer Wittmann         mpControl->GetFocus();
86*550fbbbdSOliver-Rainer Wittmann     }
87*550fbbbdSOliver-Rainer Wittmann }
88*550fbbbdSOliver-Rainer Wittmann 
89*550fbbbdSOliver-Rainer Wittmann 
90*550fbbbdSOliver-Rainer Wittmann 
91*550fbbbdSOliver-Rainer Wittmann 
Hide(void)92*550fbbbdSOliver-Rainer Wittmann void Popup::Hide (void)
93*550fbbbdSOliver-Rainer Wittmann {
94*550fbbbdSOliver-Rainer Wittmann     if (mpContainer)
95*550fbbbdSOliver-Rainer Wittmann         if (mpContainer->IsInPopupMode())
96*550fbbbdSOliver-Rainer Wittmann 			mpContainer->EndPopupMode();
97*550fbbbdSOliver-Rainer Wittmann }
98*550fbbbdSOliver-Rainer Wittmann 
99*550fbbbdSOliver-Rainer Wittmann 
100*550fbbbdSOliver-Rainer Wittmann 
101*550fbbbdSOliver-Rainer Wittmann 
SetPopupModeEndHandler(const::boost::function<void (void)> & rCallback)102*550fbbbdSOliver-Rainer Wittmann void Popup::SetPopupModeEndHandler (const ::boost::function<void(void)>& rCallback)
103*550fbbbdSOliver-Rainer Wittmann {
104*550fbbbdSOliver-Rainer Wittmann     maPopupModeEndCallback = rCallback;
105*550fbbbdSOliver-Rainer Wittmann     if (mpContainer)
106*550fbbbdSOliver-Rainer Wittmann         mpContainer->SetPopupModeEndHdl(LINK(this, Popup, PopupModeEndHandler));
107*550fbbbdSOliver-Rainer Wittmann }
108*550fbbbdSOliver-Rainer Wittmann 
109*550fbbbdSOliver-Rainer Wittmann 
110*550fbbbdSOliver-Rainer Wittmann 
111*550fbbbdSOliver-Rainer Wittmann 
ProvideContainerAndControl(void)112*550fbbbdSOliver-Rainer Wittmann void Popup::ProvideContainerAndControl (void)
113*550fbbbdSOliver-Rainer Wittmann {
114*550fbbbdSOliver-Rainer Wittmann     if ( ! (mpContainer && mpControl)
115*550fbbbdSOliver-Rainer Wittmann         && mpParent!=NULL
116*550fbbbdSOliver-Rainer Wittmann         && maControlCreator)
117*550fbbbdSOliver-Rainer Wittmann     {
118*550fbbbdSOliver-Rainer Wittmann         CreateContainerAndControl();
119*550fbbbdSOliver-Rainer Wittmann     }
120*550fbbbdSOliver-Rainer Wittmann }
121*550fbbbdSOliver-Rainer Wittmann 
122*550fbbbdSOliver-Rainer Wittmann 
123*550fbbbdSOliver-Rainer Wittmann 
124*550fbbbdSOliver-Rainer Wittmann 
CreateContainerAndControl(void)125*550fbbbdSOliver-Rainer Wittmann void Popup::CreateContainerAndControl (void)
126*550fbbbdSOliver-Rainer Wittmann {
127*550fbbbdSOliver-Rainer Wittmann     mpContainer.reset(new PopupContainer(mpParent));
128*550fbbbdSOliver-Rainer Wittmann     mpContainer->SetAccessibleName(msAccessibleName);
129*550fbbbdSOliver-Rainer Wittmann     mpContainer->SetPopupModeEndHdl(LINK(this, Popup, PopupModeEndHandler));
130*550fbbbdSOliver-Rainer Wittmann     mpContainer->SetBorderStyle(mpContainer->GetBorderStyle() | WINDOW_BORDER_MENU);
131*550fbbbdSOliver-Rainer Wittmann 
132*550fbbbdSOliver-Rainer Wittmann     mpControl.reset(maControlCreator(mpContainer.get()));
133*550fbbbdSOliver-Rainer Wittmann }
134*550fbbbdSOliver-Rainer Wittmann 
135*550fbbbdSOliver-Rainer Wittmann 
136*550fbbbdSOliver-Rainer Wittmann 
137*550fbbbdSOliver-Rainer Wittmann 
IMPL_LINK(Popup,PopupModeEndHandler,void *,EMPTYARG)138*550fbbbdSOliver-Rainer Wittmann IMPL_LINK(Popup, PopupModeEndHandler, void*, EMPTYARG)
139*550fbbbdSOliver-Rainer Wittmann {
140*550fbbbdSOliver-Rainer Wittmann     if (maPopupModeEndCallback)
141*550fbbbdSOliver-Rainer Wittmann         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 
147*550fbbbdSOliver-Rainer Wittmann     return 0;
148*550fbbbdSOliver-Rainer Wittmann }
149*550fbbbdSOliver-Rainer Wittmann 
150*550fbbbdSOliver-Rainer Wittmann 
151*550fbbbdSOliver-Rainer Wittmann 
152*550fbbbdSOliver-Rainer Wittmann } } // end of namespace svx::sidebar
153