LibreOffice Module sw (master)  1
wview.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <config_features.h>
21 
22 #include <sfx2/msg.hxx>
23 #include <svl/srchitem.hxx>
24 #include <sfx2/dispatch.hxx>
25 #include <sfx2/infobar.hxx>
26 #include <sfx2/templdlg.hxx>
27 #include <sfx2/viewfrm.hxx>
28 #include <svx/srchdlg.hxx>
29 #include <basic/sbxobj.hxx>
30 #include <uivwimp.hxx>
31 #include <svx/fmshell.hxx>
32 #include <svx/fmview.hxx>
33 #include <svx/extrusionbar.hxx>
34 #include <svx/fontworkbar.hxx>
35 #include <svx/svxids.hrc>
36 #include <vcl/inputctx.hxx>
37 
38 #include <sfx2/objface.hxx>
39 #include <swmodule.hxx>
40 #include <unotxvw.hxx>
41 #include <swtypes.hxx>
42 #include <cmdid.h>
43 #include <globals.hrc>
44 #include <wrtsh.hxx>
45 #include <edtwin.hxx>
46 #include <wgrfsh.hxx>
47 #include <wfrmsh.hxx>
48 #include <wolesh.hxx>
49 #include <wtabsh.hxx>
50 #include <wlistsh.hxx>
51 #include <wformsh.hxx>
52 #include <wtextsh.hxx>
53 #include <barcfg.hxx>
54 #include <doc.hxx>
55 
56 // TECHNICALLY not possible !!
57 #include <beziersh.hxx>
58 #include <drawsh.hxx>
59 #include <drwtxtsh.hxx>
60 #include <annotsh.hxx>
61 
62 #include <wview.hxx>
63 #include <wdocsh.hxx>
64 
65 #include <sfx2/request.hxx>
66  // needed for -fsanitize=function visibility of typeinfo for functions of
67  // type void(SfxShell*,SfxRequest&) defined in swslots.hxx
68 #include <sfx2/viewfac.hxx>
69 #define ShellClass_SwWebView
70 #define ShellClass_Text
71 #include <swslots.hxx>
72 
74 {
76 }
77 
79 
80 void SwWebView::InitInterface_Impl()
81 {
82  GetStaticInterface()->RegisterChildWindow(SvxSearchDialogWrapper::GetChildWindowId());
83  GetStaticInterface()->RegisterChildWindow(SfxInfoBarContainerChild::GetChildWindowId());
84 
85  GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_TOOLS, SfxVisibilityFlags::Standard|SfxVisibilityFlags::Server,
86  ToolbarId::Webtools_Toolbox);
87 }
88 
89 
91  SwView(_pFrame, _pShell)
92 {
93 }
94 
96 {
97 }
98 
100 {
101 #if HAVE_FEATURE_DESKTOP
102  // Decision whether UpdateTable must be called
103  bool bUpdateTable = false;
104  const SwFrameFormat* pCurTableFormat = GetWrtShell().GetTableFormat();
105  if(pCurTableFormat && pCurTableFormat != GetLastTableFrameFormat())
106  {
107  bUpdateTable = true; // can only be executed later
108  }
109  SetLastTableFrameFormat(pCurTableFormat);
110  //SEL_TBL and SEL_TBL_CELLS can be ored!
111  SelectionType nNewSelectionType = GetWrtShell().GetSelectionType()
113 
114  SelectionType _nSelectionType = GetSelectionType();
115  if ( nNewSelectionType == _nSelectionType )
116  {
117  GetViewFrame()->GetBindings().InvalidateAll( false );
118  if ( _nSelectionType & SelectionType::Ole ||
119  _nSelectionType & SelectionType::Graphic )
120  //The verb may of course change for graphics and OLE!
121  ImpSetVerb( nNewSelectionType );
122  }
123  else
124  {
125  SfxDispatcher &rDispatcher = *GetViewFrame()->GetDispatcher();
126  SwToolbarConfigItem *pBarCfg = SW_MOD()->GetWebToolbarConfig();
127 
128  if( GetCurShell() )
129  {
130  rDispatcher.Flush(); // really delete all cached shells
131 
132  //Additional to the old selection remember which toolbar was visible.
133  ToolbarId eId = rDispatcher.GetObjectBarId(SFX_OBJECTBAR_OBJECT);
134  if (eId != ToolbarId::None)
135  pBarCfg->SetTopToolbar( _nSelectionType, eId );
136 
137  SfxShell *pSfxShell;
138  sal_uInt16 i;
139  for ( i = 0; true; ++i )
140  {
141  pSfxShell = rDispatcher.GetShell( i );
142  if ( !( dynamic_cast< const SwBaseShell *>( pSfxShell ) != nullptr ||
143  dynamic_cast< const SwDrawTextShell *>( pSfxShell ) || dynamic_cast< const SwAnnotationShell *>( pSfxShell ) != nullptr ) )
144  break;
145  }
146  if (i)
147  {
148  pSfxShell = rDispatcher.GetShell( --i );
149  OSL_ENSURE( pSfxShell, "My Shell is lost in space" );
150  rDispatcher.Pop( *pSfxShell, SfxDispatcherPopFlags::POP_UNTIL | SfxDispatcherPopFlags::POP_DELETE);
151  }
152  }
153 
154  bool bInitFormShell = false;
155  if( !GetFormShell() )
156  {
157  bInitFormShell = true;
158  SetFormShell( new FmFormShell( this ) );
159  rDispatcher.Push( *GetFormShell() );
160  }
161 
162  bool bSetExtInpCntxt = false;
163  _nSelectionType = nNewSelectionType;
164  SetSelectionType( _nSelectionType );
165  ShellMode eShellMode;
166 
167  if ( _nSelectionType & SelectionType::Ole )
168  {
169  eShellMode = ShellMode::Object;
170  SetShell( new SwWebOleShell( *this ));
171  rDispatcher.Push( *GetCurShell() );
172  }
173  else if ( _nSelectionType & SelectionType::Frame
174  || _nSelectionType & SelectionType::Graphic)
175  {
176  eShellMode = ShellMode::Frame;
177  SetShell( new SwWebFrameShell( *this ));
178  rDispatcher.Push( *GetCurShell() );
179  if(_nSelectionType & SelectionType::Graphic )
180  {
181  eShellMode = ShellMode::Graphic;
182  SetShell( new SwWebGrfShell( *this ));
183  rDispatcher.Push( *GetCurShell() );
184  }
185  }
186  else if ( _nSelectionType & SelectionType::Frame )
187  {
188  eShellMode = ShellMode::Frame;
189  SetShell( new SwWebFrameShell( *this ));
190  rDispatcher.Push( *GetCurShell() );
191  }
192  else if ( _nSelectionType & SelectionType::DrawObject )
193  {
194  eShellMode = ShellMode::Draw;
195  SetShell( new svx::ExtrusionBar( this ) );
196  rDispatcher.Push( *GetCurShell() );
197 
198  SetShell( new svx::FontworkBar( this ) );
199  rDispatcher.Push( *GetCurShell() );
200 
201  SetShell( new SwDrawShell( *this ));
202  rDispatcher.Push( *GetCurShell() );
203  if ( _nSelectionType & SelectionType::Ornament )
204  {
205  eShellMode = ShellMode::Bezier;
206  SetShell( new SwBezierShell( *this ));
207  rDispatcher.Push( *GetCurShell() );
208  }
209 
210  }
211  else if ( _nSelectionType & SelectionType::DbForm )
212  {
213  eShellMode = ShellMode::DrawForm;
214  SetShell( new SwWebDrawFormShell( *this ));
215 
216  rDispatcher.Push( *GetCurShell() );
217  }
218  else if ( _nSelectionType & SelectionType::DrawObjectEditMode )
219  {
220  eShellMode = ShellMode::DrawText;
221  rDispatcher.Push( *(new SwBaseShell( *this )) );
222  SetShell( new SwDrawTextShell( *this ));
223  rDispatcher.Push( *GetCurShell() );
224  }
225  else if ( _nSelectionType & SelectionType::PostIt )
226  {
227  eShellMode = ShellMode::PostIt;
228  SetShell( new SwAnnotationShell( *this ) );
229  rDispatcher.Push( *GetCurShell() );
230  }
231  else
232  {
233  bSetExtInpCntxt = true;
234  eShellMode = ShellMode::Text;
235  if ( _nSelectionType & SelectionType::NumberList )
236  {
237  eShellMode = ShellMode::ListText;
238  SetShell( new SwWebListShell( *this ));
239  rDispatcher.Push( *GetCurShell() );
240  }
241  SetShell( new SwWebTextShell(*this));
242  rDispatcher.Push( *GetCurShell() );
243  if ( _nSelectionType & SelectionType::Table )
244  {
245  eShellMode = eShellMode == ShellMode::ListText ? ShellMode::TableListText
247  SetShell( new SwWebTableShell( *this ));
248  rDispatcher.Push( *GetCurShell() );
249  }
250  }
251  ImpSetVerb( _nSelectionType );
252  GetViewImpl()->SetShellMode(eShellMode);
253 
254  if( !GetDocShell()->IsReadOnly() )
255  {
256  if( bSetExtInpCntxt && GetWrtShell().HasReadonlySel() )
257  bSetExtInpCntxt = false;
258 
259  InputContext aCntxt( GetEditWin().GetInputContext() );
260  aCntxt.SetOptions( bSetExtInpCntxt
261  ? (aCntxt.GetOptions() |
262  ( InputContextFlags::Text |
263  InputContextFlags::ExtText ))
264  : (aCntxt.GetOptions() & ~
265  InputContextFlags( InputContextFlags::Text |
266  InputContextFlags::ExtText )) );
267  GetEditWin().SetInputContext( aCntxt );
268  }
269 
270  //Additional to the selection enable the toolbar, which was
271  //activated last time
272  //Before must be a Flush(), but concerns according to MBA not the
273  //user interface and is not a performance issue.
274  // TODO/LATER: maybe now the Flush() command is superfluous?!
275  rDispatcher.Flush();
276 
278  aPnt = GetEditWin().PixelToLogic(aPnt);
279  GetEditWin().UpdatePointer(aPnt);
280 
281  if ( bInitFormShell && GetWrtShell().GetDrawView() )
282  GetFormShell()->SetView( dynamic_cast< FmFormView* >(
283  GetWrtShell().GetDrawView()));
284 
285  }
287 
288  //Opportune time for the communication with OLE objects?
289  if ( GetDocShell()->GetDoc()->IsOLEPrtNotifyPending() )
290  GetDocShell()->GetDoc()->PrtOLENotify( false );
291 
292  //now the table update
293  if(bUpdateTable)
295 #endif
296 }
297 
298 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
void SetOptions(InputContextFlags nOptions)
SfxViewFrame * GetViewFrame() const
void SetTopToolbar(SelectionType nSelType, ToolbarId eBarId)
Definition: barcfg.cxx:84
Point GetPointerPosPixel()
SwXTextView * GetUNOObject_Impl()
Definition: uivwimp.cxx:99
SFX_IMPL_NAMED_VIEWFACTORY(SwWebView,"Default")
Definition: wview.cxx:73
#define SFX_IMPL_INTERFACE(Class, SuperClass)
void Pop(SfxShell &rShell, SfxDispatcherPopFlags nMode=SfxDispatcherPopFlags::NONE)
void ImpSetVerb(SelectionType nSelType)
Definition: view.cxx:149
SfxDispatcher * GetDispatcher()
bool IsReadOnly(const OUString &rURL, bool *pbExist)
virtual ~SwWebView() override
Definition: wview.cxx:95
void SetSelectionType(SelectionType nSet)
Definition: view.hxx:340
SwEditWin & GetEditWin()
Definition: view.hxx:403
SfxShell * GetCurShell()
Definition: view.hxx:562
SwView_Impl * GetViewImpl()
Definition: view.hxx:335
SwWrtShell & GetWrtShell() const
Definition: view.hxx:400
SfxShell * GetShell(sal_uInt16 nIdx) const
void PrtOLENotify(bool bAll)
Definition: docdesc.cxx:686
ShellMode
Definition: view.hxx:87
const SwFrameFormat * GetLastTableFrameFormat() const
Definition: view.hxx:353
void SetView(FmFormView *pView)
void SetShellMode(ShellMode eSet)
Definition: uivwimp.cxx:89
SwDoc * GetDoc()
returns Doc. But be careful!
Definition: docsh.hxx:203
virtual FmFormShell * GetFormShell() override
Definition: view.hxx:565
Style of a layout element.
Definition: frmfmt.hxx:57
virtual void SelectShell() override
Definition: wview.cxx:99
#define SW_MOD()
Definition: swmodule.hxx:256
void SetInputContext(const InputContext &rInputContext)
void SetShell(SfxShell *pS)
Definition: view.hxx:343
SfxBindings & GetBindings()
int i
void SetFormShell(FmFormShell *pSh)
Definition: view.hxx:344
void NotifySelChanged()
Definition: unotxvw.cxx:684
#define SFX_VIEW_REGISTRATION(DocClass)
InputContextFlags GetOptions() const
void UpdateTable()
update fields of a listing
Definition: edtab.cxx:256
SwDocShell * GetDocShell()
Definition: view.cxx:1128
SwFrameFormat * GetTableFormat()
Definition: edws.cxx:182
#define SFX_OBJECTBAR_OBJECT
Point PixelToLogic(const Point &rDevicePt) const
SelectionType
Definition: wrtsh.hxx:58
#define SFX_OBJECTBAR_TOOLS
void UpdatePointer(const Point &, sal_uInt16 nButtons=0)
Definition: edtwin.cxx:352
void SetLastTableFrameFormat(const SwFrameFormat *pSet)
Definition: view.hxx:354
void Push(SfxShell &rShell)
ToolbarId
void InvalidateAll(bool bWithMsg)
SelectionType GetSelectionType() const
Definition: view.hxx:339
virtual SdrView * GetDrawView() const override
Definition: viewdraw.cxx:622
SelectionType GetSelectionType() const
Definition: wrtsh1.cxx:1406
ToolbarId GetObjectBarId(sal_uInt16 nPos) const
Definition: view.hxx:146
SwWebView(SfxViewFrame *pFrame, SfxViewShell *)
Definition: wview.cxx:90