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_SFX2_SOURCE_APPL_NEWHELP_HXX
20 : #define INCLUDED_SFX2_SOURCE_APPL_NEWHELP_HXX
21 :
22 : #include <cppuhelper/implbase1.hxx>
23 : #include <com/sun/star/uno/Reference.h>
24 : #include <com/sun/star/frame/XDispatchResultListener.hpp>
25 : #include <com/sun/star/frame/XDispatch.hpp>
26 : #include <com/sun/star/frame/XFrame2.hpp>
27 :
28 : namespace com { namespace sun { namespace star { namespace awt { class XWindow; } } } }
29 : namespace com { namespace sun { namespace star { namespace i18n { class XBreakIterator; } } } }
30 : namespace com { namespace sun { namespace star { namespace text { class XTextRange; } } } }
31 :
32 : #include <vcl/window.hxx>
33 : #include <vcl/toolbox.hxx>
34 : #include <vcl/tabpage.hxx>
35 : #include <vcl/splitwin.hxx>
36 : #include <vcl/tabctrl.hxx>
37 : #include <vcl/combobox.hxx>
38 : #include <vcl/fixed.hxx>
39 : #include <vcl/button.hxx>
40 : #include <vcl/lstbox.hxx>
41 : #include <vcl/dialog.hxx>
42 : #include <svtools/treelistbox.hxx>
43 : #include <unotools/moduleoptions.hxx>
44 :
45 : #include "srchdlg.hxx"
46 :
47 : // ContentListBox_Impl ---------------------------------------------------
48 :
49 : class ContentListBox_Impl : public SvTreeListBox
50 : {
51 : private:
52 : Image aOpenBookImage;
53 : Image aClosedBookImage;
54 : Image aDocumentImage;
55 :
56 : void InitRoot();
57 : void ClearChildren( SvTreeListEntry* pParent );
58 :
59 : public:
60 : ContentListBox_Impl(Window* pParent, WinBits nStyle);
61 : virtual ~ContentListBox_Impl();
62 :
63 :
64 : virtual void RequestingChildren( SvTreeListEntry* pParent ) SAL_OVERRIDE;
65 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
66 :
67 0 : inline void SetOpenHdl( const Link& rLink ) { SetDoubleClickHdl( rLink ); }
68 : OUString GetSelectEntry() const;
69 : };
70 :
71 : // class HelpTabPage_Impl ------------------------------------------------
72 :
73 : class SfxHelpIndexWindow_Impl;
74 :
75 0 : class HelpTabPage_Impl : public TabPage
76 : {
77 : protected:
78 : SfxHelpIndexWindow_Impl* m_pIdxWin;
79 :
80 : public:
81 : HelpTabPage_Impl(Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin,
82 : const OString& rID, const OUString& rUIXMLDescription);
83 :
84 : virtual Control* GetLastFocusControl() = 0;
85 : };
86 :
87 : // class ContentTabPage_Impl ---------------------------------------------
88 :
89 0 : class ContentTabPage_Impl : public HelpTabPage_Impl
90 : {
91 : private:
92 : ContentListBox_Impl* m_pContentBox;
93 :
94 : public:
95 : ContentTabPage_Impl(Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin);
96 :
97 : virtual void ActivatePage() SAL_OVERRIDE;
98 : virtual Control* GetLastFocusControl() SAL_OVERRIDE;
99 :
100 0 : void SetOpenHdl( const Link& rLink ) { m_pContentBox->SetOpenHdl( rLink ); }
101 0 : OUString GetSelectEntry() const { return m_pContentBox->GetSelectEntry(); }
102 0 : void SetFocusOnBox() { m_pContentBox->GrabFocus(); }
103 : };
104 :
105 : // class IndexTabPage_Impl -----------------------------------------------
106 :
107 0 : class IndexBox_Impl : public ComboBox
108 : {
109 : public:
110 : IndexBox_Impl(Window* pParent, WinBits nStyle);
111 :
112 : virtual void UserDraw( const UserDrawEvent& rUDEvt ) SAL_OVERRIDE;
113 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
114 :
115 : void SelectExecutableEntry();
116 : };
117 :
118 : class IndexTabPage_Impl : public HelpTabPage_Impl
119 : {
120 : private:
121 : IndexBox_Impl* m_pIndexCB;
122 : PushButton* m_pOpenBtn;
123 :
124 : Timer aFactoryTimer;
125 : Timer aKeywordTimer;
126 : Link aKeywordLink;
127 :
128 : OUString sFactory;
129 : OUString sKeyword;
130 :
131 : bool bIsActivated;
132 :
133 : void InitializeIndex();
134 : void ClearIndex();
135 :
136 : DECL_LINK(OpenHdl, void *);
137 : DECL_LINK( TimeoutHdl, Timer* );
138 :
139 : public:
140 : IndexTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin );
141 : virtual ~IndexTabPage_Impl();
142 :
143 : virtual void ActivatePage() SAL_OVERRIDE;
144 : virtual Control* GetLastFocusControl() SAL_OVERRIDE;
145 :
146 : void SetDoubleClickHdl( const Link& rLink );
147 : void SetFactory( const OUString& rFactory );
148 0 : inline OUString GetFactory() const { return sFactory; }
149 : OUString GetSelectEntry() const;
150 0 : inline void SetFocusOnBox() { m_pIndexCB->GrabFocus(); }
151 0 : inline bool HasFocusOnEdit() const { return m_pIndexCB->HasChildPathFocus(); }
152 :
153 0 : inline void SetKeywordHdl( const Link& rLink ) { aKeywordLink = rLink; }
154 : void SetKeyword( const OUString& rKeyword );
155 : bool HasKeyword() const;
156 : bool HasKeywordIgnoreCase();
157 : void OpenKeyword();
158 :
159 0 : inline void SelectExecutableEntry() { m_pIndexCB->SelectExecutableEntry(); }
160 : };
161 :
162 : // class SearchTabPage_Impl ----------------------------------------------
163 :
164 0 : class SearchBox_Impl : public ComboBox
165 : {
166 : private:
167 : Link aSearchLink;
168 :
169 : public:
170 0 : SearchBox_Impl(Window* pParent, WinBits nStyle)
171 0 : : ComboBox(pParent, nStyle)
172 : {
173 0 : SetDropDownLineCount(5);
174 0 : }
175 :
176 : virtual bool PreNotify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
177 : virtual void Select() SAL_OVERRIDE;
178 :
179 0 : inline void SetSearchLink( const Link& rLink ) { aSearchLink = rLink; }
180 : };
181 :
182 0 : class SearchResultsBox_Impl : public ListBox
183 : {
184 : public:
185 0 : SearchResultsBox_Impl(Window* pParent, WinBits nStyle)
186 0 : : ListBox(pParent, nStyle)
187 : {
188 0 : }
189 :
190 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
191 : };
192 :
193 : class SearchTabPage_Impl : public HelpTabPage_Impl
194 : {
195 : private:
196 : SearchBox_Impl* m_pSearchED;
197 : PushButton* m_pSearchBtn;
198 : CheckBox* m_pFullWordsCB;
199 : CheckBox* m_pScopeCB;
200 : SearchResultsBox_Impl* m_pResultsLB;
201 : PushButton* m_pOpenBtn;
202 :
203 : OUString aFactory;
204 :
205 : ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator >
206 : xBreakIterator;
207 :
208 : void ClearSearchResults();
209 : void RememberSearchText( const OUString& rSearchText );
210 :
211 : DECL_LINK(SearchHdl, void *);
212 : DECL_LINK(OpenHdl, void *);
213 : DECL_LINK(ModifyHdl, void *);
214 :
215 : public:
216 : SearchTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin );
217 : virtual ~SearchTabPage_Impl();
218 :
219 : virtual void ActivatePage() SAL_OVERRIDE;
220 : virtual Control* GetLastFocusControl() SAL_OVERRIDE;
221 :
222 : void SetDoubleClickHdl( const Link& rLink );
223 0 : inline void SetFactory( const OUString& rFactory ) { aFactory = rFactory; }
224 : OUString GetSelectEntry() const;
225 : void ClearPage();
226 0 : inline void SetFocusOnBox() { m_pResultsLB->GrabFocus(); }
227 0 : inline bool HasFocusOnEdit() const { return m_pSearchED->HasChildPathFocus(); }
228 0 : inline OUString GetSearchText() const { return m_pSearchED->GetText(); }
229 0 : inline bool IsFullWordSearch() const { return m_pFullWordsCB->IsChecked(); }
230 : bool OpenKeyword( const OUString& rKeyword );
231 : };
232 :
233 : // class BookmarksTabPage_Impl -------------------------------------------
234 :
235 : class BookmarksBox_Impl : public ListBox
236 : {
237 : private:
238 : void DoAction( sal_uInt16 nAction );
239 :
240 : public:
241 : BookmarksBox_Impl(Window* pParent, WinBits nStyle);
242 : virtual ~BookmarksBox_Impl();
243 :
244 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
245 : };
246 :
247 0 : class BookmarksTabPage_Impl : public HelpTabPage_Impl
248 : {
249 : private:
250 : BookmarksBox_Impl* m_pBookmarksBox;
251 : PushButton* m_pBookmarksPB;
252 :
253 : DECL_LINK(OpenHdl, void *);
254 :
255 : public:
256 : BookmarksTabPage_Impl( Window* pParent, SfxHelpIndexWindow_Impl* _pIdxWin );
257 :
258 : virtual void ActivatePage() SAL_OVERRIDE;
259 : virtual Control* GetLastFocusControl() SAL_OVERRIDE;
260 :
261 : void SetDoubleClickHdl( const Link& rLink );
262 : OUString GetSelectEntry() const;
263 : void AddBookmarks( const OUString& rTitle, const OUString& rURL );
264 0 : void SetFocusOnBox() { m_pBookmarksBox->GrabFocus(); }
265 : };
266 :
267 : // class SfxHelpIndexWindow_Impl -----------------------------------------
268 :
269 : class SfxHelpWindow_Impl;
270 :
271 : class SfxHelpIndexWindow_Impl : public Window
272 : {
273 : private:
274 : ListBox aActiveLB;
275 : FixedLine aActiveLine;
276 :
277 : TabControl aTabCtrl;
278 : Timer aTimer;
279 :
280 : Link aSelectFactoryLink;
281 : Link aPageDoubleClickLink;
282 : Link aIndexKeywordLink;
283 : OUString sKeyword;
284 :
285 : SfxHelpWindow_Impl* pParentWin;
286 :
287 : ContentTabPage_Impl* pCPage;
288 : IndexTabPage_Impl* pIPage;
289 : SearchTabPage_Impl* pSPage;
290 : BookmarksTabPage_Impl* pBPage;
291 :
292 : long nMinWidth;
293 : bool bWasCursorLeftOrRight;
294 : bool bIsInitDone;
295 :
296 : void Initialize();
297 : void SetActiveFactory();
298 : HelpTabPage_Impl* GetCurrentPage( sal_uInt16& rCurId );
299 :
300 : inline ContentTabPage_Impl* GetContentPage();
301 : inline IndexTabPage_Impl* GetIndexPage();
302 : inline SearchTabPage_Impl* GetSearchPage();
303 : inline BookmarksTabPage_Impl* GetBookmarksPage();
304 :
305 : DECL_LINK( ActivatePageHdl, TabControl* );
306 : DECL_LINK(SelectHdl, void *);
307 : DECL_LINK(InitHdl, void *);
308 : DECL_LINK(SelectFactoryHdl, void *);
309 : DECL_LINK(KeywordHdl, void *);
310 :
311 : public:
312 : SfxHelpIndexWindow_Impl( SfxHelpWindow_Impl* pParent );
313 : virtual ~SfxHelpIndexWindow_Impl();
314 :
315 : virtual void Resize() SAL_OVERRIDE;
316 : virtual bool PreNotify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
317 : virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
318 :
319 : void SetDoubleClickHdl( const Link& rLink );
320 0 : inline void SetSelectFactoryHdl( const Link& rLink ) { aSelectFactoryLink = rLink; }
321 : void SetFactory( const OUString& rFactory, bool bActive );
322 0 : inline OUString GetFactory() const { return pIPage->GetFactory(); }
323 : OUString GetSelectEntry() const;
324 : void AddBookmarks( const OUString& rTitle, const OUString& rURL );
325 : bool IsValidFactory( const OUString& _rFactory );
326 0 : inline OUString GetActiveFactoryTitle() const { return aActiveLB.GetSelectEntry(); }
327 : inline void UpdateTabControl() { aTabCtrl.Invalidate(); }
328 : void ClearSearchPage();
329 : void GrabFocusBack();
330 : bool HasFocusOnEdit() const;
331 : OUString GetSearchText() const;
332 : bool IsFullWordSearch() const;
333 : void OpenKeyword( const OUString& rKeyword );
334 : void SelectExecutableEntry();
335 : inline bool WasCursorLeftOrRight();
336 : };
337 :
338 : // inlines ---------------------------------------------------------------
339 :
340 0 : ContentTabPage_Impl* SfxHelpIndexWindow_Impl::GetContentPage()
341 : {
342 0 : if ( !pCPage )
343 : {
344 0 : pCPage = new ContentTabPage_Impl( &aTabCtrl, this );
345 0 : pCPage->SetOpenHdl( aPageDoubleClickLink );
346 : }
347 0 : return pCPage;
348 : }
349 0 : IndexTabPage_Impl* SfxHelpIndexWindow_Impl::GetIndexPage()
350 : {
351 0 : if ( !pIPage )
352 : {
353 0 : pIPage = new IndexTabPage_Impl( &aTabCtrl, this );
354 0 : pIPage->SetDoubleClickHdl( aPageDoubleClickLink );
355 0 : pIPage->SetKeywordHdl( aIndexKeywordLink );
356 : }
357 0 : return pIPage;
358 : }
359 :
360 0 : SearchTabPage_Impl* SfxHelpIndexWindow_Impl::GetSearchPage()
361 : {
362 0 : if ( !pSPage )
363 : {
364 0 : pSPage = new SearchTabPage_Impl( &aTabCtrl, this );
365 0 : pSPage->SetDoubleClickHdl( aPageDoubleClickLink );
366 : }
367 0 : return pSPage;
368 : }
369 :
370 0 : BookmarksTabPage_Impl* SfxHelpIndexWindow_Impl::GetBookmarksPage()
371 : {
372 0 : if ( !pBPage )
373 : {
374 0 : pBPage = new BookmarksTabPage_Impl( &aTabCtrl, this );
375 0 : pBPage->SetDoubleClickHdl( aPageDoubleClickLink );
376 : }
377 0 : return pBPage;
378 : }
379 :
380 0 : bool SfxHelpIndexWindow_Impl::WasCursorLeftOrRight()
381 : {
382 0 : bool bRet = bWasCursorLeftOrRight;
383 0 : bWasCursorLeftOrRight = false;
384 0 : return bRet;
385 : }
386 :
387 : // class TextWin_Impl ----------------------------------------------------
388 :
389 : class TextWin_Impl : public DockingWindow
390 : {
391 : public:
392 : TextWin_Impl( Window* pParent );
393 : virtual ~TextWin_Impl();
394 :
395 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
396 : };
397 :
398 : // class SfxHelpTextWindow_Impl ------------------------------------------
399 :
400 : class SvtMiscOptions;
401 : class SfxHelpWindow_Impl;
402 :
403 : class SfxHelpTextWindow_Impl : public Window
404 : {
405 : private:
406 : ToolBox aToolBox;
407 : CheckBox aOnStartupCB;
408 : Timer aSelectTimer;
409 : Image aIndexOnImage;
410 : Image aIndexOffImage;
411 : OUString aIndexOnText;
412 : OUString aIndexOffText;
413 : OUString aSearchText;
414 : OUString aOnStartupText;
415 : OUString sCurrentFactory;
416 :
417 : SfxHelpWindow_Impl* pHelpWin;
418 : Window* pTextWin;
419 : sfx2::SearchDialog* pSrchDlg;
420 : ::com::sun::star::uno::Reference < ::com::sun::star::frame::XFrame2 >
421 : xFrame;
422 : ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator >
423 : xBreakIterator;
424 : ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
425 : xConfiguration;
426 : long nMinPos;
427 : bool bIsDebug;
428 : bool bIsIndexOn;
429 : bool bIsInClose;
430 : bool bIsFullWordSearch;
431 :
432 : bool HasSelection() const;
433 : void InitToolBoxImages();
434 : void InitOnStartupBox( bool bOnlyText );
435 : void SetOnStartupBoxPosition();
436 :
437 : ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator >
438 : GetBreakIterator();
439 : ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >
440 : getCursor() const;
441 : bool isHandledKey( const KeyCode& _rKeyCode );
442 :
443 : DECL_LINK(SelectHdl, void *);
444 : DECL_LINK( NotifyHdl, SvtMiscOptions* );
445 : DECL_LINK( FindHdl, sfx2::SearchDialog* );
446 : DECL_LINK( CloseHdl, sfx2::SearchDialog* );
447 : DECL_LINK( CheckHdl, CheckBox* );
448 :
449 : public:
450 : SfxHelpTextWindow_Impl( SfxHelpWindow_Impl* pParent );
451 : virtual ~SfxHelpTextWindow_Impl();
452 :
453 : virtual void Resize() SAL_OVERRIDE;
454 : virtual bool PreNotify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
455 : virtual void GetFocus() SAL_OVERRIDE;
456 : virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
457 :
458 : inline ::com::sun::star::uno::Reference < ::com::sun::star::frame::XFrame2 >
459 0 : getFrame() const { return xFrame; }
460 :
461 0 : inline void SetSelectHdl( const Link& rLink ) { aToolBox.SetSelectHdl( rLink ); }
462 : void ToggleIndex( bool bOn );
463 : void SelectSearchText( const OUString& rSearchText, bool _bIsFullWordSearch );
464 : void SetPageStyleHeaderOff() const;
465 0 : inline ToolBox& GetToolBox() { return aToolBox; }
466 : void CloseFrame();
467 : void DoSearch();
468 : };
469 :
470 : // class SfxHelpWindow_Impl ----------------------------------------------
471 :
472 : class HelpInterceptor_Impl;
473 : class HelpListener_Impl;
474 : class SfxHelpWindow_Impl : public SplitWindow
475 : {
476 : private:
477 : friend class SfxHelpIndexWindow_Impl;
478 :
479 : ::com::sun::star::uno::Reference < ::com::sun::star::awt::XWindow >
480 : xWindow;
481 : ::com::sun::star::uno::Reference < ::com::sun::star::frame::XDispatchResultListener >
482 : xOpenListener;
483 : ::com::sun::star::uno::Reference < ::com::sun::star::frame::XFrame2 >
484 : xFrame;
485 :
486 : SfxHelpIndexWindow_Impl* pIndexWin;
487 : SfxHelpTextWindow_Impl* pTextWin;
488 : HelpInterceptor_Impl* pHelpInterceptor;
489 : HelpListener_Impl* pHelpListener;
490 :
491 : sal_Int32 nExpandWidth;
492 : sal_Int32 nCollapseWidth;
493 : sal_Int32 nHeight;
494 : long nIndexSize;
495 : long nTextSize;
496 : bool bIndex;
497 : bool bGrabFocusToToolBox;
498 : Point aWinPos;
499 : OUString sTitle;
500 : OUString sKeyword;
501 :
502 : virtual void Resize() SAL_OVERRIDE;
503 : virtual void Split() SAL_OVERRIDE;
504 : virtual void GetFocus() SAL_OVERRIDE;
505 :
506 : void MakeLayout();
507 : void InitSizes();
508 : void LoadConfig();
509 : void SaveConfig();
510 : void ShowStartPage();
511 :
512 : DECL_LINK( SelectHdl, ToolBox* );
513 : DECL_LINK(OpenHdl, void *);
514 : DECL_LINK( SelectFactoryHdl, SfxHelpIndexWindow_Impl* );
515 : DECL_LINK( ChangeHdl, HelpListener_Impl* );
516 :
517 : public:
518 : SfxHelpWindow_Impl( const ::com::sun::star::uno::Reference < ::com::sun::star::frame::XFrame2 >& rFrame,
519 : Window* pParent, WinBits nBits );
520 : virtual ~SfxHelpWindow_Impl();
521 :
522 : virtual bool PreNotify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
523 :
524 : void setContainerWindow(
525 : ::com::sun::star::uno::Reference < ::com::sun::star::awt::XWindow > xWin );
526 : inline ::com::sun::star::uno::Reference < ::com::sun::star::frame::XFrame2 >
527 0 : getTextFrame() const { return pTextWin->getFrame(); }
528 : inline ::com::sun::star::uno::Reference < ::com::sun::star::frame::XDispatchResultListener >
529 : getOpenListener() const { return xOpenListener; }
530 :
531 : void SetFactory( const OUString& rFactory );
532 : void SetHelpURL( const OUString& rURL );
533 : void DoAction( sal_uInt16 nActionId );
534 : void CloseWindow();
535 :
536 : void UpdateToolbox();
537 0 : inline void OpenKeyword( const OUString& rKeyword ) { pIndexWin->OpenKeyword( rKeyword ); }
538 : inline OUString GetFactory() const { return pIndexWin->GetFactory(); }
539 :
540 : bool HasHistoryPredecessor() const; // forward to interceptor
541 : bool HasHistorySuccessor() const; // forward to interceptor
542 :
543 : void openDone(const OUString& sURL ,
544 : bool bSuccess);
545 :
546 : static OUString buildHelpURL(const OUString& sFactory ,
547 : const OUString& sContent ,
548 : const OUString& sAnchor ,
549 : bool bUseQuestionMark);
550 :
551 : void loadHelpContent(const OUString& sHelpURL ,
552 : bool bAddToHistory = true);
553 : };
554 :
555 0 : class SfxAddHelpBookmarkDialog_Impl : public ModalDialog
556 : {
557 : private:
558 : Edit* m_pTitleED;
559 : public:
560 : SfxAddHelpBookmarkDialog_Impl( Window* pParent, bool bRename = true );
561 :
562 : void SetTitle( const OUString& rTitle );
563 0 : OUString GetTitle() const { return m_pTitleED->GetText(); }
564 : };
565 :
566 : /// Appends ?Language=xy&System=abc to the help URL in rURL
567 : void AppendConfigToken(OUStringBuffer& rURL, bool bQuestionMark, const OUString &rLang = OUString());
568 :
569 : #endif // INCLUDED_SFX2_SOURCE_APPL_NEWHELP_HXX
570 :
571 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|