1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski #include "precompiled_sd.hxx"
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski #include "SidebarShellManager.hxx"
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielski #include "ViewShellManager.hxx"
27*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
28*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
29*b1cdbd2cSJim Jagielski
30*b1cdbd2cSJim Jagielski #include <algorithm>
31*b1cdbd2cSJim Jagielski
32*b1cdbd2cSJim Jagielski namespace sd { namespace sidebar {
33*b1cdbd2cSJim Jagielski
SidebarShellManager(const::boost::shared_ptr<ViewShellManager> & rpViewShellManager,const ViewShell & rViewShell)34*b1cdbd2cSJim Jagielski SidebarShellManager::SidebarShellManager (
35*b1cdbd2cSJim Jagielski const ::boost::shared_ptr<ViewShellManager>& rpViewShellManager,
36*b1cdbd2cSJim Jagielski const ViewShell& rViewShell)
37*b1cdbd2cSJim Jagielski : mpViewShellManager(rpViewShellManager),
38*b1cdbd2cSJim Jagielski mrViewShell(rViewShell),
39*b1cdbd2cSJim Jagielski maSubShells()
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski }
42*b1cdbd2cSJim Jagielski
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielski
45*b1cdbd2cSJim Jagielski
~SidebarShellManager(void)46*b1cdbd2cSJim Jagielski SidebarShellManager::~SidebarShellManager (void)
47*b1cdbd2cSJim Jagielski {
48*b1cdbd2cSJim Jagielski while ( ! maSubShells.empty())
49*b1cdbd2cSJim Jagielski RemoveSubShell(maSubShells.begin()->second.mpShell);
50*b1cdbd2cSJim Jagielski }
51*b1cdbd2cSJim Jagielski
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielski
54*b1cdbd2cSJim Jagielski
CreateShell(ShellId nId,::Window *,FrameView *)55*b1cdbd2cSJim Jagielski SfxShell* SidebarShellManager::CreateShell( ShellId nId, ::Window* , FrameView* )
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski SubShells::const_iterator iShell (maSubShells.find(nId));
58*b1cdbd2cSJim Jagielski if (iShell != maSubShells.end())
59*b1cdbd2cSJim Jagielski return iShell->second.mpShell;
60*b1cdbd2cSJim Jagielski else
61*b1cdbd2cSJim Jagielski return NULL;
62*b1cdbd2cSJim Jagielski }
63*b1cdbd2cSJim Jagielski
64*b1cdbd2cSJim Jagielski
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielski
ReleaseShell(SfxShell *)67*b1cdbd2cSJim Jagielski void SidebarShellManager::ReleaseShell (SfxShell* )
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski // Nothing to do.
70*b1cdbd2cSJim Jagielski }
71*b1cdbd2cSJim Jagielski
AddSubShell(ShellId nId,SfxShell * pShell,::Window * pWindow)72*b1cdbd2cSJim Jagielski void SidebarShellManager::AddSubShell (
73*b1cdbd2cSJim Jagielski ShellId nId,
74*b1cdbd2cSJim Jagielski SfxShell* pShell,
75*b1cdbd2cSJim Jagielski ::Window* pWindow)
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski if (pShell != NULL)
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski maSubShells[nId] = ShellDescriptor(pShell,pWindow);
80*b1cdbd2cSJim Jagielski if (pWindow != NULL)
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski pWindow->AddEventListener(LINK(this,SidebarShellManager,WindowCallback));
83*b1cdbd2cSJim Jagielski if (pWindow->IsReallyVisible())
84*b1cdbd2cSJim Jagielski mpViewShellManager->ActivateSubShell(mrViewShell, nId);
85*b1cdbd2cSJim Jagielski }
86*b1cdbd2cSJim Jagielski else
87*b1cdbd2cSJim Jagielski mpViewShellManager->ActivateSubShell(mrViewShell, nId);
88*b1cdbd2cSJim Jagielski }
89*b1cdbd2cSJim Jagielski }
90*b1cdbd2cSJim Jagielski
91*b1cdbd2cSJim Jagielski
92*b1cdbd2cSJim Jagielski
93*b1cdbd2cSJim Jagielski
RemoveSubShell(const ShellId i_nShellId)94*b1cdbd2cSJim Jagielski void SidebarShellManager::RemoveSubShell (const ShellId i_nShellId)
95*b1cdbd2cSJim Jagielski {
96*b1cdbd2cSJim Jagielski SubShells::iterator pos = maSubShells.find( i_nShellId );
97*b1cdbd2cSJim Jagielski ENSURE_OR_RETURN_VOID( pos != maSubShells.end(), "no shell for this ID" );
98*b1cdbd2cSJim Jagielski if ( pos->second.mpWindow != NULL )
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski pos->second.mpWindow->RemoveEventListener( LINK( this, SidebarShellManager, WindowCallback ) );
101*b1cdbd2cSJim Jagielski }
102*b1cdbd2cSJim Jagielski mpViewShellManager->DeactivateSubShell( mrViewShell, pos->first );
103*b1cdbd2cSJim Jagielski maSubShells.erase( pos );
104*b1cdbd2cSJim Jagielski }
105*b1cdbd2cSJim Jagielski
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski
108*b1cdbd2cSJim Jagielski
RemoveSubShell(const SfxShell * pShell)109*b1cdbd2cSJim Jagielski void SidebarShellManager::RemoveSubShell (const SfxShell* pShell)
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski if (pShell != NULL)
112*b1cdbd2cSJim Jagielski {
113*b1cdbd2cSJim Jagielski SubShells::iterator iShell;
114*b1cdbd2cSJim Jagielski for (iShell=maSubShells.begin(); iShell!=maSubShells.end(); ++iShell)
115*b1cdbd2cSJim Jagielski if (iShell->second.mpShell == pShell)
116*b1cdbd2cSJim Jagielski {
117*b1cdbd2cSJim Jagielski if (iShell->second.mpWindow != NULL)
118*b1cdbd2cSJim Jagielski iShell->second.mpWindow->RemoveEventListener(
119*b1cdbd2cSJim Jagielski LINK(this,SidebarShellManager,WindowCallback));
120*b1cdbd2cSJim Jagielski mpViewShellManager->DeactivateSubShell(mrViewShell,iShell->first);
121*b1cdbd2cSJim Jagielski maSubShells.erase(iShell);
122*b1cdbd2cSJim Jagielski break;
123*b1cdbd2cSJim Jagielski }
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski }
126*b1cdbd2cSJim Jagielski
127*b1cdbd2cSJim Jagielski
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielski
MoveToTop(SfxShell * pShell)130*b1cdbd2cSJim Jagielski void SidebarShellManager::MoveToTop (SfxShell* pShell)
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski SubShells::const_iterator iShell;
133*b1cdbd2cSJim Jagielski for (iShell=maSubShells.begin(); iShell!=maSubShells.end(); ++iShell)
134*b1cdbd2cSJim Jagielski if (iShell->second.mpShell == pShell)
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski ViewShellManager::UpdateLock aLocker (mpViewShellManager);
137*b1cdbd2cSJim Jagielski mpViewShellManager->MoveSubShellToTop(mrViewShell,iShell->first);
138*b1cdbd2cSJim Jagielski mpViewShellManager->MoveToTop(mrViewShell);
139*b1cdbd2cSJim Jagielski break;
140*b1cdbd2cSJim Jagielski }
141*b1cdbd2cSJim Jagielski }
142*b1cdbd2cSJim Jagielski
143*b1cdbd2cSJim Jagielski
144*b1cdbd2cSJim Jagielski
145*b1cdbd2cSJim Jagielski
IMPL_LINK(SidebarShellManager,WindowCallback,VclWindowEvent *,pEvent)146*b1cdbd2cSJim Jagielski IMPL_LINK(SidebarShellManager, WindowCallback, VclWindowEvent*, pEvent)
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski if (pEvent != NULL)
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski SubShells::const_iterator iShell;
151*b1cdbd2cSJim Jagielski ::Window* pWindow = pEvent->GetWindow();
152*b1cdbd2cSJim Jagielski for (iShell=maSubShells.begin(); iShell!=maSubShells.end(); ++iShell)
153*b1cdbd2cSJim Jagielski if (iShell->second.mpWindow == pWindow)
154*b1cdbd2cSJim Jagielski break;
155*b1cdbd2cSJim Jagielski if (iShell != maSubShells.end())
156*b1cdbd2cSJim Jagielski switch (pEvent->GetId())
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski case VCLEVENT_WINDOW_SHOW:
159*b1cdbd2cSJim Jagielski mpViewShellManager->ActivateSubShell(mrViewShell,iShell->first);
160*b1cdbd2cSJim Jagielski break;
161*b1cdbd2cSJim Jagielski
162*b1cdbd2cSJim Jagielski case VCLEVENT_WINDOW_HIDE:
163*b1cdbd2cSJim Jagielski // Do not activate the sub shell. This leads to
164*b1cdbd2cSJim Jagielski // problems with shapes currently being in text edit
165*b1cdbd2cSJim Jagielski // mode: Deactivating the shell leads to leaving the
166*b1cdbd2cSJim Jagielski // text editing mode.
167*b1cdbd2cSJim Jagielski // mpViewShellManager->DeactivateSubShell(mrViewShell,iShell->first);
168*b1cdbd2cSJim Jagielski break;
169*b1cdbd2cSJim Jagielski }
170*b1cdbd2cSJim Jagielski }
171*b1cdbd2cSJim Jagielski
172*b1cdbd2cSJim Jagielski return 0;
173*b1cdbd2cSJim Jagielski }
174*b1cdbd2cSJim Jagielski
175*b1cdbd2cSJim Jagielski
176*b1cdbd2cSJim Jagielski } } // end of namespace ::sd::sidebar
177