Line data Source code
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 : #ifndef INCLUDED_SW_INC_SWABSTDLG_HXX
20 : #define INCLUDED_SW_INC_SWABSTDLG_HXX
21 :
22 : #include <rtl/ustring.hxx>
23 : #include <tools/solar.h>
24 : #include <sfx2/sfxdlg.hxx>
25 : #include <svx/svxdlg.hxx>
26 : #include <vcl/syswin.hxx>
27 : #include <globals.hrc>
28 : #include <com/sun/star/uno/Reference.h>
29 : #include <com/sun/star/uno/Sequence.h>
30 : #include <com/sun/star/frame/XModel.hpp>
31 : #include <com/sun/star/frame/XController.hpp>
32 : #include <com/sun/star/text/XTextCursor.hpp>
33 : #include <com/sun/star/container/XNameAccess.hpp>
34 : #include <com/sun/star/awt/XControl.hpp>
35 : #include <com/sun/star/container/XNamed.hpp>
36 : #include "itabenum.hxx"
37 : #include <boost/optional.hpp>
38 :
39 : class SfxViewFrame;
40 : class SfxBindings;
41 : class SfxItemSet;
42 : class ResId;
43 : class Window;
44 : class SfxItemPool;
45 : class SfxStyleSheetBase;
46 : class SwGlossaryHdl;
47 : class SwField;
48 :
49 : class SwLabFmtPage;
50 : class SwLabRec;
51 : class SwAsciiOptions;
52 : class SwDocShell;
53 : class SvStream;
54 : class SwWrtShell;
55 : class SfxRequest;
56 : class SwView;
57 : class SwTableAutoFmt;
58 : class SwTOXMgr;
59 : class SwForm;
60 : struct CurTOXType;
61 : class SwTOXDescription;
62 : class SwTOXBase;
63 : class SwSectionData;
64 : struct SwDBData;
65 : class SwField;
66 : class Printer;
67 : class SwLabItem;
68 : class SwNewDBMgr;
69 : class SwTableFUNC;
70 : class SwChildWinWrapper;
71 : struct SfxChildWinInfo;
72 : class SwTOXMark;
73 : struct SwDocStat;
74 : #include <cnttab.hxx>
75 :
76 : namespace com{namespace sun{namespace star{
77 : namespace frame{
78 : class XFrame;
79 : }
80 : namespace sdbcx{
81 : class XColumnsSupplier;
82 : }
83 : namespace sdbc{
84 : class XDataSource;
85 : class XConnection;
86 : class XResultSet;
87 : }
88 : }}}
89 :
90 : typedef void (*SwLabDlgMethod) (::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel>& xModel, const SwLabItem& rItem);
91 :
92 : typedef OUString (*GlossaryGetCurrGroup)();
93 : typedef void (*GlossarySetActGroup)(const OUString& rNewGroup);
94 :
95 0 : class AbstractGlossaryDlg : public VclAbstractDialog
96 : {
97 : public:
98 : virtual OUString GetCurrGrpName() const = 0;
99 : virtual OUString GetCurrShortName() const = 0;
100 : };
101 :
102 0 : class AbstractFldInputDlg : public VclAbstractTerminatedDialog
103 : {
104 : public:
105 : //from class SalFrame
106 : virtual void SetWindowState( const OString & rStr ) = 0;
107 : virtual OString GetWindowState( sal_uLong nMask = WINDOWSTATE_MASK_ALL ) const = 0;
108 : virtual void EndDialog(long ) SAL_OVERRIDE = 0;
109 : };
110 :
111 0 : class AbstractInsFootNoteDlg : public VclAbstractDialog
112 : {
113 : public:
114 : virtual OUString GetFontName() = 0;
115 : virtual sal_Bool IsEndNote() = 0;
116 : virtual OUString GetStr() = 0;
117 : //from class Window
118 : virtual void SetHelpId( const OString& sHelpId ) = 0;
119 : virtual void SetText( const OUString& rStr ) = 0;
120 : };
121 :
122 0 : class AbstractInsTableDlg : public VclAbstractDialog
123 : {
124 : public:
125 : virtual void GetValues( OUString& rName, sal_uInt16& rRow, sal_uInt16& rCol,
126 : SwInsertTableOptions& rInsTblFlags, OUString& rTableAutoFmtName,
127 : SwTableAutoFmt *& prTAFmt ) = 0;
128 : };
129 :
130 0 : class AbstractJavaEditDialog : public VclAbstractDialog
131 : {
132 : public:
133 : virtual OUString GetScriptText() const = 0;
134 : virtual OUString GetScriptType() const = 0;
135 : virtual sal_Bool IsUrl() const = 0;
136 : virtual sal_Bool IsNew() const = 0;
137 : virtual bool IsUpdate() const = 0;
138 : };
139 :
140 0 : class AbstractMailMergeDlg : public VclAbstractDialog
141 : {
142 : public:
143 : virtual sal_uInt16 GetMergeType() = 0;
144 : virtual const OUString& GetSaveFilter() const = 0;
145 : virtual const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > GetSelection() const = 0;
146 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet> GetResultSet() const = 0;
147 : virtual bool IsSaveIndividualDocs() const = 0;
148 : virtual bool IsGenerateFromDataBase() const = 0;
149 : virtual OUString GetColumnName() const = 0;
150 : virtual OUString GetPath() const = 0;
151 :
152 : };
153 0 : class AbstractMailMergeCreateFromDlg : public VclAbstractDialog
154 : {
155 : public:
156 : virtual sal_Bool IsThisDocument() const = 0;
157 : };
158 0 : class AbstractMailMergeFieldConnectionsDlg : public VclAbstractDialog
159 : {
160 : public:
161 : virtual sal_Bool IsUseExistingConnections() const = 0;
162 : };
163 :
164 0 : class AbstractMultiTOXTabDialog : public VclAbstractDialog
165 : {
166 : public:
167 : virtual SwForm* GetForm(CurTOXType eType) = 0;
168 : virtual CurTOXType GetCurrentTOXType() const = 0;
169 : virtual SwTOXDescription& GetTOXDescription(CurTOXType eTOXTypes) = 0;
170 : //from SfxTabDialog
171 : virtual const SfxItemSet* GetOutputItemSet() const = 0;
172 : };
173 :
174 0 : class AbstractEditRegionDlg : public VclAbstractDialog
175 : {
176 : public:
177 : virtual void SelectSection(const OUString& rSectionName) = 0;
178 : };
179 0 : class AbstractInsertSectionTabDialog : public VclAbstractDialog
180 : {
181 : public:
182 : virtual void SetSectionData(SwSectionData const& rSect) = 0;
183 : };
184 :
185 0 : class AbstractSwWordCountFloatDlg : public VclAbstractDialog
186 : {
187 : public:
188 : virtual void UpdateCounts() = 0;
189 : virtual void SetCounts(const SwDocStat &rCurrCnt, const SwDocStat &rDocStat) = 0;
190 : virtual Window * GetWindow() = 0; //this method is added for return a Window type pointer
191 : };
192 :
193 0 : class AbstractSwInsertAbstractDlg : public VclAbstractDialog
194 : {
195 : public:
196 : virtual sal_uInt8 GetLevel() const = 0;
197 : virtual sal_uInt8 GetPara() const = 0;
198 : };
199 :
200 0 : class AbstractSwAsciiFilterDlg : public VclAbstractDialog
201 : {
202 : public:
203 : virtual void FillOptions( SwAsciiOptions& rOptions ) = 0;
204 :
205 : };
206 :
207 0 : class AbstractSwBreakDlg : public VclAbstractDialog
208 : {
209 : public:
210 : virtual OUString GetTemplateName() = 0;
211 : virtual sal_uInt16 GetKind() = 0;
212 : virtual ::boost::optional<sal_uInt16> GetPageNumber() = 0;
213 :
214 : };
215 :
216 0 : class AbstractSplitTableDialog : public VclAbstractDialog // add for
217 : {
218 : public:
219 : virtual sal_uInt16 GetSplitMode() = 0;
220 : };
221 :
222 0 : class AbstractSwConvertTableDlg : public VclAbstractDialog
223 : {
224 : public:
225 : virtual void GetValues( sal_Unicode& rDelim,
226 : SwInsertTableOptions& rInsTblFlags,
227 : SwTableAutoFmt const*& prTAFmt ) = 0;
228 : };
229 :
230 0 : class AbstractSwInsertDBColAutoPilot : public VclAbstractDialog
231 : {
232 : public:
233 :
234 : virtual void DataToDoc( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rSelection,
235 : ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource> rxSource,
236 : ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> xConnection,
237 : ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > xResultSet) = 0;
238 : };
239 :
240 0 : class AbstractDropDownFieldDialog : public VclAbstractDialog
241 : {
242 : public:
243 : virtual OString GetWindowState( sal_uLong nMask = WINDOWSTATE_MASK_ALL ) const = 0; //this method inherit from SystemWindow
244 : virtual void SetWindowState( const OString & rStr ) =0;//this method inherit from SystemWindow
245 : };
246 :
247 0 : class AbstractSwLabDlg : public SfxAbstractTabDialog
248 : {
249 : public:
250 : virtual const OUString& GetBusinessCardStr() const = 0;
251 : virtual Printer *GetPrt() =0;
252 : };
253 :
254 0 : class AbstractSwSelGlossaryDlg : public VclAbstractDialog
255 : {
256 : public:
257 : virtual void InsertGlos(const OUString &rRegion, const OUString &rGlosName) = 0; // inline
258 : virtual sal_Int32 GetSelectedIdx() const = 0; // inline
259 : virtual void SelectEntryPos(sal_Int32 nIdx) = 0; // inline
260 : };
261 :
262 0 : class AbstractSwAutoFormatDlg : public VclAbstractDialog
263 : {
264 : public:
265 : virtual void FillAutoFmtOfIndex( SwTableAutoFmt*& rToFill ) const = 0;
266 : };
267 :
268 0 : class AbstractSwFldDlg : public SfxAbstractTabDialog
269 : {
270 : public:
271 : virtual void Start( sal_Bool bShow = sal_True ) = 0; //this method from sfxtabdialog
272 : virtual void Initialize(SfxChildWinInfo *pInfo) = 0;
273 : virtual void ReInitDlg() = 0;
274 : virtual void ActivateDatabasePage() = 0;
275 : virtual void ShowReferencePage() = 0;
276 : virtual Window * GetWindow() = 0; //this method is added for return a Window type pointer
277 : };
278 :
279 0 : class AbstractSwRenameXNamedDlg : public VclAbstractDialog
280 : {
281 : public:
282 : virtual void SetForbiddenChars( const OUString& rSet ) = 0;
283 : virtual void SetAlternativeAccess(
284 : ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > & xSecond,
285 : ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > & xThird ) = 0;
286 : };
287 :
288 0 : class AbstractSwModalRedlineAcceptDlg : public VclAbstractDialog
289 : {
290 : public:
291 : virtual void AcceptAll( sal_Bool bAccept ) = 0;
292 : };
293 :
294 0 : class AbstractMarkFloatDlg : public VclAbstractDialog
295 : {
296 : public:
297 : virtual void ReInitDlg(SwWrtShell& rWrtShell) = 0;
298 : virtual Window * GetWindow() = 0; //this method is added for return a Window type pointer
299 : };
300 :
301 : #define RET_LOAD_DOC 100
302 : #define RET_EDIT_DOC 101
303 : #define RET_EDIT_RESULT_DOC 102
304 : #define RET_TARGET_CREATED 103
305 : #define RET_REMOVE_TARGET 104
306 : #define RET_APPLY_TEMPLATE 105
307 :
308 : class SwView;
309 : class SwMailMergeConfigItem;
310 :
311 0 : class AbstractMailMergeWizard : public VclAbstractDialog2
312 : {
313 : public:
314 : virtual void SetReloadDocument(const OUString& rURL) = 0;
315 : virtual OUString GetReloadDocument() const = 0;
316 : virtual sal_Bool ShowPage( sal_uInt16 nLevel ) = 0;
317 : virtual sal_uInt16 GetRestartPage() const = 0;
318 : };
319 :
320 0 : class SwAbstractDialogFactory
321 : {
322 : public:
323 : static SwAbstractDialogFactory* Create();
324 :
325 : virtual SfxAbstractDialog* CreateSfxDialog( Window* pParent,
326 : const SfxItemSet& rAttr,
327 : const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& _rxFrame,
328 : sal_uInt32 nResId
329 : ) = 0;
330 : virtual AbstractSwWordCountFloatDlg* CreateSwWordCountDialog(SfxBindings* pBindings,
331 : SfxChildWindow* pChild, Window *pParent, SfxChildWinInfo* pInfo) = 0;
332 :
333 : virtual AbstractSwInsertAbstractDlg * CreateSwInsertAbstractDlg(Window* pParent) = 0;
334 : virtual AbstractSwAsciiFilterDlg* CreateSwAsciiFilterDlg ( Window* pParent, SwDocShell& rDocSh,
335 : SvStream* pStream ) = 0;
336 : virtual VclAbstractDialog * CreateSwInsertBookmarkDlg( Window *pParent, SwWrtShell &rSh, SfxRequest& rReq, int nResId ) = 0;
337 :
338 : virtual AbstractSwBreakDlg * CreateSwBreakDlg(Window *pParent, SwWrtShell &rSh) = 0;
339 : virtual VclAbstractDialog * CreateSwChangeDBDlg(SwView& rVw) = 0;
340 : virtual SfxAbstractTabDialog * CreateSwCharDlg(Window* pParent, SwView& pVw, const SfxItemSet& rCoreSet,
341 : sal_uInt8 nDialogMode, const OUString* pFmtStr = 0) = 0;
342 : virtual AbstractSwConvertTableDlg* CreateSwConvertTableDlg(SwView& rView, bool bToTable) = 0;
343 : virtual VclAbstractDialog * CreateSwCaptionDialog ( Window *pParent, SwView &rV,int nResId) = 0;
344 :
345 : virtual AbstractSwInsertDBColAutoPilot* CreateSwInsertDBColAutoPilot(SwView& rView,
346 : ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource> rxSource,
347 : com::sun::star::uno::Reference<com::sun::star::sdbcx::XColumnsSupplier> xColSupp,
348 : const SwDBData& rData) = 0;
349 : virtual SfxAbstractTabDialog * CreateSwFootNoteOptionDlg(Window *pParent, SwWrtShell &rSh) = 0;
350 :
351 : virtual AbstractDropDownFieldDialog * CreateDropDownFieldDialog(Window *pParent, SwWrtShell &rSh,
352 : SwField* pField, sal_Bool bNextButton = sal_False) = 0;
353 : virtual SfxAbstractTabDialog* CreateSwEnvDlg ( Window* pParent, const SfxItemSet& rSet, SwWrtShell* pWrtSh, Printer* pPrt, sal_Bool bInsert ) = 0;
354 :
355 : virtual AbstractSwLabDlg* CreateSwLabDlg(Window* pParent, const SfxItemSet& rSet,
356 : SwNewDBMgr* pNewDBMgr, bool bLabel) = 0;
357 :
358 : virtual SwLabDlgMethod GetSwLabDlgStaticMethod () =0;
359 :
360 : virtual SfxAbstractTabDialog* CreateSwParaDlg ( Window *pParent,
361 : SwView& rVw,
362 : const SfxItemSet& rCoreSet,
363 : sal_uInt8 nDialogMode,
364 : const OUString *pCollName = 0,
365 : sal_Bool bDraw = sal_False,
366 : const OString& sDefPage = OString() ) = 0;
367 :
368 : virtual AbstractSwSelGlossaryDlg * CreateSwSelGlossaryDlg(Window * pParent, const OUString &rShortName) = 0;
369 :
370 : virtual VclAbstractDialog * CreateVclAbstractDialog ( Window * pParent, SwWrtShell &rSh, int nResId ) = 0;
371 : virtual AbstractSplitTableDialog * CreateSplitTblDialog ( Window * pParent, SwWrtShell &rSh ) = 0;
372 :
373 : virtual AbstractSwAutoFormatDlg * CreateSwAutoFormatDlg( Window* pParent, SwWrtShell* pShell,
374 : sal_Bool bSetAutoFmt = sal_True,
375 : const SwTableAutoFmt* pSelFmt = 0 ) = 0;
376 : virtual SfxAbstractDialog * CreateSwBorderDlg ( Window* pParent, SfxItemSet& rSet, sal_uInt16 nType, int nResId ) = 0;
377 : virtual SfxAbstractDialog * CreateSwWrapDlg ( Window* pParent, SfxItemSet& rSet, SwWrtShell* pSh, sal_Bool bDrawMode, int nResId ) = 0;
378 :
379 : virtual VclAbstractDialog * CreateSwTableWidthDlg(Window *pParent, SwTableFUNC &rFnc) = 0;
380 : virtual SfxAbstractTabDialog* CreateSwTableTabDlg(Window* pParent, SfxItemPool& Pool,
381 : const SfxItemSet* pItemSet, SwWrtShell* pSh) = 0;
382 :
383 : virtual AbstractSwFldDlg * CreateSwFldDlg(SfxBindings* pB, SwChildWinWrapper* pCW, Window *pParent) = 0;
384 : virtual SfxAbstractDialog* CreateSwFldEditDlg ( SwView& rVw, int nResId ) = 0;
385 : virtual AbstractSwRenameXNamedDlg * CreateSwRenameXNamedDlg(Window* pParent,
386 : ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed > & xNamed,
387 : ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > & xNameAccess) = 0;
388 : virtual AbstractSwModalRedlineAcceptDlg * CreateSwModalRedlineAcceptDlg(Window *pParent) = 0;
389 :
390 : virtual VclAbstractDialog* CreateTblMergeDialog( Window* pParent, sal_Bool& rWithPrev ) = 0;
391 : virtual SfxAbstractTabDialog* CreateFrmTabDialog(const OString &rDialogType,
392 : SfxViewFrame *pFrame, Window *pParent,
393 : const SfxItemSet& rCoreSet,
394 : bool bNewFrm = true,
395 : bool bFmt = false,
396 : const OString& sDefPage = OString(),
397 : const OUString* pFmtStr = 0) = 0;
398 : // @param nSlot
399 : // Identifies optional Slot by which the creation of the Template (Style) dialog is triggered.
400 : // Currently used, if nRegion == SFX_STYLE_FAMILY_PAGE in order to activate certain dialog pane
401 : virtual SfxAbstractApplyTabDialog* CreateTemplateDialog(
402 : Window* pParent,
403 : SfxStyleSheetBase& rBase,
404 : sal_uInt16 nRegion,
405 : const OString& sPage = OString(),
406 : SwWrtShell* pActShell = 0,
407 : bool bNew = false) = 0;
408 : virtual AbstractGlossaryDlg* CreateGlossaryDlg(SfxViewFrame* pViewFrame,
409 : SwGlossaryHdl* pGlosHdl,
410 : SwWrtShell *pWrtShell) = 0;
411 : virtual AbstractFldInputDlg* CreateFldInputDlg(Window *pParent,
412 : SwWrtShell &rSh, SwField* pField, bool bNextButton = false) = 0;
413 : virtual AbstractInsFootNoteDlg* CreateInsFootNoteDlg(Window * pParent,
414 : SwWrtShell &rSh, sal_Bool bEd = sal_False) = 0;
415 : virtual VclAbstractDialog* CreateTitlePageDlg ( Window * pParent ) = 0;
416 : virtual VclAbstractDialog * CreateVclSwViewDialog(SwView& rView) = 0;
417 : virtual AbstractInsTableDlg* CreateInsTableDlg(SwView& rView) = 0;
418 : virtual AbstractJavaEditDialog* CreateJavaEditDialog(Window* pParent,
419 : SwWrtShell* pWrtSh) = 0;
420 : virtual AbstractMailMergeDlg* CreateMailMergeDlg( int nResId,
421 : Window* pParent, SwWrtShell& rSh,
422 : const OUString& rSourceName,
423 : const OUString& rTblName,
424 : sal_Int32 nCommandType,
425 : const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& xConnection,
426 : ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >* pSelection = 0 ) = 0;
427 : virtual AbstractMailMergeCreateFromDlg* CreateMailMergeCreateFromDlg(Window* pParent) = 0;
428 : virtual AbstractMailMergeFieldConnectionsDlg* CreateMailMergeFieldConnectionsDlg(Window* pParent) = 0;
429 : virtual VclAbstractDialog* CreateMultiTOXMarkDlg(Window* pParent, SwTOXMgr &rTOXMgr) = 0;
430 : virtual SfxAbstractTabDialog* CreateSwTabDialog( int nResId,
431 : Window* pParent,
432 : const SfxItemSet* pSwItemSet,
433 : SwWrtShell &) = 0;
434 : virtual AbstractMultiTOXTabDialog* CreateMultiTOXTabDialog(
435 : Window* pParent, const SfxItemSet& rSet,
436 : SwWrtShell &rShell,
437 : SwTOXBase* pCurTOX, sal_uInt16 nToxType = USHRT_MAX,
438 : sal_Bool bGlobal = sal_False) = 0;
439 : virtual AbstractEditRegionDlg* CreateEditRegionDlg(Window* pParent, SwWrtShell& rWrtSh) = 0;
440 : virtual AbstractInsertSectionTabDialog* CreateInsertSectionTabDialog(
441 : Window* pParent, const SfxItemSet& rSet, SwWrtShell& rSh) = 0;
442 : virtual AbstractMarkFloatDlg* CreateIndexMarkFloatDlg(
443 : SfxBindings* pBindings,
444 : SfxChildWindow* pChild,
445 : Window *pParent,
446 : SfxChildWinInfo* pInfo,
447 : sal_Bool bNew=sal_True) = 0;
448 : virtual AbstractMarkFloatDlg* CreateAuthMarkFloatDlg(
449 : SfxBindings* pBindings,
450 : SfxChildWindow* pChild,
451 : Window *pParent,
452 : SfxChildWinInfo* pInfo,
453 : sal_Bool bNew=sal_True) = 0;
454 : virtual VclAbstractDialog * CreateIndexMarkModalDlg(
455 : Window *pParent, SwWrtShell& rSh, SwTOXMark* pCurTOXMark) = 0;
456 :
457 : virtual AbstractMailMergeWizard* CreateMailMergeWizard(SwView& rView, SwMailMergeConfigItem& rConfigItem) = 0;
458 :
459 : virtual GlossaryGetCurrGroup GetGlossaryCurrGroupFunc() = 0;
460 : virtual GlossarySetActGroup SetGlossaryActGroupFunc() = 0;
461 :
462 : // for tabpage
463 : virtual CreateTabPage GetTabPageCreatorFunc( sal_uInt16 nId ) = 0;
464 : virtual GetTabPageRanges GetTabPageRangesFunc( sal_uInt16 nId ) = 0;
465 :
466 : protected:
467 0 : ~SwAbstractDialogFactory() {}
468 : };
469 :
470 : #endif
471 :
472 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|