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