1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 #include "SpellDialogChildWindow.hxx"
28 #include <svx/svxids.hrc>
29 #include <sfx2/app.hxx>
30 #include <sfx2/bindings.hxx>
31 #include <sfx2/dispatch.hxx>
32 
33 namespace sd{
34 
35 SFX_IMPL_CHILDWINDOW(SpellDialogChildWindow, SID_SPELL_DIALOG)
36 }
37 
38 #include "ViewShell.hxx"
39 #include "ViewShellBase.hxx"
40 #include "DrawViewShell.hxx"
41 #include "OutlineViewShell.hxx"
42 #include <Outliner.hxx>
43 #include "drawdoc.hxx"
44 
45 
46 namespace sd {
47 
48 SpellDialogChildWindow::SpellDialogChildWindow (
49     ::Window* _pParent,
50     sal_uInt16 nId,
51     SfxBindings* pBindings,
52     SfxChildWinInfo* pInfo)
53     : ::svx::SpellDialogChildWindow (_pParent, nId, pBindings, pInfo),
54       mpSdOutliner (NULL),
55       mbOwnOutliner (false)
56 {
57     ProvideOutliner();
58 }
59 
60 
61 
62 
63 SpellDialogChildWindow::~SpellDialogChildWindow (void)
64 {
65 	if (mpSdOutliner != NULL)
66 		mpSdOutliner->EndSpelling();
67 
68 	if (mbOwnOutliner)
69 		delete mpSdOutliner;
70 }
71 
72 
73 
74 
75 
76 
77 
78 
79 SfxChildWinInfo SpellDialogChildWindow::GetInfo (void) const
80 {
81 	return ::svx::SpellDialogChildWindow::GetInfo();
82 }
83 
84 
85 
86 
87 void SpellDialogChildWindow::InvalidateSpellDialog (void)
88 {
89     ::svx::SpellDialogChildWindow::InvalidateSpellDialog();
90 }
91 
92 
93 
94 
95 ::svx::SpellPortions SpellDialogChildWindow::GetNextWrongSentence( bool /*bRecheck*/ )
96 {
97     ::svx::SpellPortions aResult;
98 
99     if (mpSdOutliner != NULL)
100 	{
101 		ProvideOutliner();
102 	    aResult = mpSdOutliner->GetNextSpellSentence();
103 	}
104 
105     // Close the spell check dialog when there are no more sentences to
106     // check.
107     if (aResult.empty())
108     {
109         SfxBoolItem aItem (SID_SPELL_DIALOG, sal_False);
110         GetBindings().GetDispatcher()->Execute(
111             SID_SPELL_DIALOG,
112             SFX_CALLMODE_ASYNCHRON,
113             &aItem,
114             0L);
115     }
116 
117     return aResult;
118 }
119 
120 
121 
122 
123 void SpellDialogChildWindow::ApplyChangedSentence (
124     const ::svx::SpellPortions& rChanged, bool bRecheck )
125 {
126     if (mpSdOutliner != NULL)
127     {
128         OutlinerView* pOutlinerView = mpSdOutliner->GetView(0);
129         if (pOutlinerView != NULL)
130             mpSdOutliner->ApplyChangedSentence (
131                 pOutlinerView->GetEditView(),
132                 rChanged, bRecheck);
133     }
134 }
135 
136 
137 
138 
139 void SpellDialogChildWindow::GetFocus (void)
140 {
141     // In order to detect a cursor movement we could compare the
142     // currently selected text shape with the one that was selected
143     // when LoseFocus() was called the last time.
144     // For the time being we instead rely on the DetectChange() method
145     // in the SdOutliner class.
146 }
147 
148 
149 
150 
151 void SpellDialogChildWindow::LoseFocus()
152 {
153 }
154 
155 
156 
157 
158 void SpellDialogChildWindow::ProvideOutliner (void)
159 {
160     ViewShellBase* pViewShellBase = PTR_CAST (ViewShellBase, SfxViewShell::Current());
161 
162 	if (pViewShellBase != NULL)
163 	{
164         ViewShell* pViewShell = pViewShellBase->GetMainViewShell().get();
165         // If there already exists an outliner that has been created
166         // for another view shell then destroy it first.
167 		if (mpSdOutliner != NULL)
168             if ((pViewShell->ISA(DrawViewShell) && ! mbOwnOutliner)
169                 || (pViewShell->ISA(OutlineViewShell) && mbOwnOutliner))
170             {
171                 mpSdOutliner->EndSpelling();
172                 if (mbOwnOutliner)
173                     delete mpSdOutliner;
174                 mpSdOutliner = NULL;
175             }
176 
177         // Now create/get an outliner if none is present.
178         if (mpSdOutliner == NULL)
179         {
180             if (pViewShell->ISA(DrawViewShell))
181             {
182                 // We need an outliner for the spell check so we have
183                 // to create one.
184                 mbOwnOutliner = true;
185                 mpSdOutliner = new Outliner (
186                     pViewShell->GetDoc(),
187                     OUTLINERMODE_TEXTOBJECT);
188             }
189             else if (pViewShell->ISA(OutlineViewShell))
190             {
191                 // An outline view is already visible. The SdOutliner
192                 // will use it instead of creating its own.
193                 mbOwnOutliner = false;
194                 mpSdOutliner = pViewShell->GetDoc()->GetOutliner();
195             }
196 
197             // Initialize spelling.
198             if (mpSdOutliner != NULL)
199             {
200                 mpSdOutliner->PrepareSpelling();
201                 mpSdOutliner->StartSpelling();
202             }
203         }
204     }
205 }
206 
207 
208 
209 } // end of namespace ::sd
210