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