xref: /AOO41X/main/sfx2/source/doc/docvor.cxx (revision 1776ad396d100a46b9f68f725413ce2ae561dd84)
1d119d52dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3d119d52dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4d119d52dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5d119d52dSAndrew Rist  * distributed with this work for additional information
6d119d52dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7d119d52dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8d119d52dSAndrew Rist  * "License"); you may not use this file except in compliance
9d119d52dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11d119d52dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13d119d52dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14d119d52dSAndrew Rist  * software distributed under the License is distributed on an
15d119d52dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16d119d52dSAndrew Rist  * KIND, either express or implied.  See the License for the
17d119d52dSAndrew Rist  * specific language governing permissions and limitations
18d119d52dSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20d119d52dSAndrew Rist  *************************************************************/
21d119d52dSAndrew Rist 
22d119d52dSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sfx2.hxx"
26cdf0e10cSrcweir #include <com/sun/star/embed/XStorage.hpp>
27cdf0e10cSrcweir #include <com/sun/star/embed/ElementModes.hpp>
28cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
29cdf0e10cSrcweir #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include <stdio.h>
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #ifndef _SV_PRNSETUP_HXX //autogen
34cdf0e10cSrcweir #include <svtools/prnsetup.hxx>
35cdf0e10cSrcweir #endif
36cdf0e10cSrcweir #include <vcl/cmdevt.hxx>
37cdf0e10cSrcweir #include <vcl/menubtn.hxx>
38cdf0e10cSrcweir #include <vcl/msgbox.hxx>
39cdf0e10cSrcweir #include <vcl/print.hxx>
40cdf0e10cSrcweir #include <svl/style.hxx>
41cdf0e10cSrcweir #include <svl/stritem.hxx>
42cdf0e10cSrcweir #include <svl/eitem.hxx>
43cdf0e10cSrcweir #include <svtools/sfxecode.hxx>
44cdf0e10cSrcweir #include <svtools/ehdl.hxx>
45cdf0e10cSrcweir #include <svtools/imagemgr.hxx>
46cdf0e10cSrcweir #include <vcl/waitobj.hxx>
47cdf0e10cSrcweir #include <tools/urlobj.hxx>
48cdf0e10cSrcweir #include <tools/color.hxx>
49cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
50cdf0e10cSrcweir #include <unotools/moduleoptions.hxx>
51cdf0e10cSrcweir #include <sot/exchange.hxx>
52cdf0e10cSrcweir #include <comphelper/storagehelper.hxx>
53cdf0e10cSrcweir 
54cdf0e10cSrcweir #include "helpid.hrc"
55cdf0e10cSrcweir #include "docvor.hxx"
56cdf0e10cSrcweir #include <sfx2/docfac.hxx>
57cdf0e10cSrcweir #include "orgmgr.hxx"
58cdf0e10cSrcweir #include <sfx2/doctempl.hxx>
59cdf0e10cSrcweir #include <sfx2/templdlg.hxx>
60cdf0e10cSrcweir #include "sfxtypes.hxx"
61cdf0e10cSrcweir #include <sfx2/app.hxx>
62cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
63cdf0e10cSrcweir #include "sfx2/sfxresid.hxx"
64cdf0e10cSrcweir #include "doc.hrc"
65cdf0e10cSrcweir #include <sfx2/sfx.hrc>
66cdf0e10cSrcweir #include "docvor.hrc"
67cdf0e10cSrcweir #include <sfx2/docfilt.hxx>
68cdf0e10cSrcweir #include <sfx2/filedlghelper.hxx>
69cdf0e10cSrcweir #include <sfx2/docfilt.hxx>
70cdf0e10cSrcweir #include <sfx2/fcontnr.hxx>
71cdf0e10cSrcweir #include <svtools/localresaccess.hxx>
72cdf0e10cSrcweir #ifndef _SVT_DOC_ADDRESSTEMPLATE_HXX_
73cdf0e10cSrcweir #include <svtools/addresstemplate.hxx>
74cdf0e10cSrcweir #endif
75cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
76cdf0e10cSrcweir #define _SVSTDARR_STRINGSDTOR
77cdf0e10cSrcweir #include <svl/svstdarr.hxx>
78cdf0e10cSrcweir 
79cdf0e10cSrcweir static const char cDelim = ':';
80cdf0e10cSrcweir sal_Bool SfxOrganizeListBox_Impl::bDropMoveOk = sal_True;
81cdf0e10cSrcweir 
82cdf0e10cSrcweir using namespace ::com::sun::star;
83cdf0e10cSrcweir 
84cdf0e10cSrcweir //=========================================================================
85cdf0e10cSrcweir 
86cdf0e10cSrcweir class SuspendAccel
87cdf0e10cSrcweir {
88cdf0e10cSrcweir public:
89cdf0e10cSrcweir 	Accelerator*	pAccel;
90cdf0e10cSrcweir 
SuspendAccel(Accelerator * pA)91cdf0e10cSrcweir 	SuspendAccel( Accelerator* pA )
92cdf0e10cSrcweir 	{
93cdf0e10cSrcweir 		pAccel=pA;
94cdf0e10cSrcweir 		GetpApp()->RemoveAccel( pAccel );
95cdf0e10cSrcweir 	}
~SuspendAccel()96cdf0e10cSrcweir 	~SuspendAccel()
97cdf0e10cSrcweir 	{
98cdf0e10cSrcweir 		GetpApp()->InsertAccel( pAccel );
99cdf0e10cSrcweir 	}
100cdf0e10cSrcweir };
101cdf0e10cSrcweir 
102cdf0e10cSrcweir //=========================================================================
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 
SetBitmaps(const Image & rOFolder,const Image & rCFolder,const Image & rODoc,const Image & rCDoc,const Image & rOFolderHC,const Image & rCFolderHC,const Image & rODocHC,const Image & rCDocHC)105cdf0e10cSrcweir inline void SfxOrganizeListBox_Impl::SetBitmaps(
106cdf0e10cSrcweir 	const Image &rOFolder, const Image &rCFolder, const Image &rODoc, const Image &rCDoc,
107cdf0e10cSrcweir 	const Image &rOFolderHC, const Image &rCFolderHC, const Image &rODocHC, const Image &rCDocHC )
108cdf0e10cSrcweir {
109cdf0e10cSrcweir 	aOpenedFolderBmp = rOFolder;
110cdf0e10cSrcweir 	aClosedFolderBmp = rCFolder;
111cdf0e10cSrcweir 	aOpenedDocBmp = rODoc;
112cdf0e10cSrcweir 	aClosedDocBmp = rCDoc;
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 	aOpenedFolderBmpHC = rOFolderHC;
115cdf0e10cSrcweir 	aClosedFolderBmpHC = rCFolderHC;
116cdf0e10cSrcweir 	aOpenedDocBmpHC = rODocHC;
117cdf0e10cSrcweir 	aClosedDocBmpHC = rCDocHC;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir }
120cdf0e10cSrcweir 
121cdf0e10cSrcweir //=========================================================================
122cdf0e10cSrcweir 
123cdf0e10cSrcweir #define NO_DROP_ACTION  ((sal_Int8)-1)
124cdf0e10cSrcweir 
125cdf0e10cSrcweir class SfxOrganizeDlg_Impl
126cdf0e10cSrcweir {
127cdf0e10cSrcweir friend class SfxTemplateOrganizeDlg;
128cdf0e10cSrcweir friend class SfxOrganizeListBox_Impl;
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 	SuspendAccel*			pSuspend;
131cdf0e10cSrcweir 	SfxTemplateOrganizeDlg* pDialog;
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 	SfxOrganizeListBox_Impl* pFocusBox;
134cdf0e10cSrcweir 	Printer*				 pPrt;
135cdf0e10cSrcweir 
136cdf0e10cSrcweir 	// save pointer for asynchronous D&D
137cdf0e10cSrcweir 	SvLBox*					pSourceView;
138cdf0e10cSrcweir 	SvLBoxEntry*			pTargetEntry;
139cdf0e10cSrcweir     SfxOrganizeListBox_Impl* pFinishedBox;
140cdf0e10cSrcweir     sal_Int8                nDropAction;
141cdf0e10cSrcweir     bool                    bExecDropFinished;
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     // save some variables for the asynchronous file dialog
144cdf0e10cSrcweir     sal_uInt16                  m_nRegion;
145cdf0e10cSrcweir     sal_uInt16                  m_nIndex;
146cdf0e10cSrcweir     String                  m_sExtension4Save;
147cdf0e10cSrcweir 
148cdf0e10cSrcweir 	SfxOrganizeListBox_Impl aLeftLb;
149cdf0e10cSrcweir 	ListBox                 aLeftTypLb;
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 	SfxOrganizeListBox_Impl aRightLb;
152cdf0e10cSrcweir 	ListBox                 aRightTypLb;
153cdf0e10cSrcweir 
154cdf0e10cSrcweir 	OKButton                aOkBtn;
155cdf0e10cSrcweir 	MenuButton              aEditBtn;
156cdf0e10cSrcweir 	HelpButton              aHelpBtn;
157cdf0e10cSrcweir 	PushButton              aAddressTemplateBtn;
158cdf0e10cSrcweir 	PushButton              aFilesBtn;
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 	Accelerator             aEditAcc;
161cdf0e10cSrcweir 
162cdf0e10cSrcweir 	String                  aLastDir;
163cdf0e10cSrcweir 	SfxOrganizeMgr          aMgr;
164cdf0e10cSrcweir     sfx2::FileDialogHelper* pFileDlg;
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 	SvStringsDtor* 			GetAllFactoryURLs_Impl() const;
167cdf0e10cSrcweir 	sal_Bool				GetServiceName_Impl( String& rFactoryURL, String& rFileURL ) const;
168cdf0e10cSrcweir 	long                    Dispatch_Impl( sal_uInt16 nId, Menu* _pMenu );
169cdf0e10cSrcweir 	String                  GetPath_Impl( sal_Bool bOpen, const String& rFileName );
170cdf0e10cSrcweir     ::com::sun::star::uno::Sequence< ::rtl::OUString >
171cdf0e10cSrcweir                             GetPaths_Impl( const String& rFileName );
172cdf0e10cSrcweir 	void					InitBitmaps( void );
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 	DECL_LINK( GetFocus_Impl, SfxOrganizeListBox_Impl * );
175cdf0e10cSrcweir 	DECL_LINK( LeftListBoxSelect_Impl, ListBox * );
176cdf0e10cSrcweir 	DECL_LINK( RightListBoxSelect_Impl, ListBox * );
177cdf0e10cSrcweir 	DECL_LINK( AccelSelect_Impl, Accelerator * );
178cdf0e10cSrcweir 	DECL_LINK( MenuSelect_Impl, Menu * );
179cdf0e10cSrcweir 	DECL_LINK( MenuActivate_Impl, Menu * );
180cdf0e10cSrcweir 	DECL_LINK( AddFiles_Impl, Button * );
181cdf0e10cSrcweir 	DECL_LINK( OnAddressTemplateClicked, Button * );
182cdf0e10cSrcweir 
183cdf0e10cSrcweir     DECL_LINK( ImportHdl, sfx2::FileDialogHelper* );
184cdf0e10cSrcweir     DECL_LINK( ExportHdl, sfx2::FileDialogHelper* );
185cdf0e10cSrcweir     DECL_LINK( AddFilesHdl, sfx2::FileDialogHelper* );
186cdf0e10cSrcweir 
187cdf0e10cSrcweir     sal_Bool        DontDelete_Impl( SvLBoxEntry* pEntry );
188cdf0e10cSrcweir     void        OkHdl( Button* );
189cdf0e10cSrcweir 
190cdf0e10cSrcweir public:
191cdf0e10cSrcweir     SfxOrganizeDlg_Impl( SfxTemplateOrganizeDlg* pParent, SfxDocumentTemplates* pTempl );
192cdf0e10cSrcweir     ~SfxOrganizeDlg_Impl();
193cdf0e10cSrcweir };
194cdf0e10cSrcweir 
195cdf0e10cSrcweir //-------------------------------------------------------------------------
196cdf0e10cSrcweir 
SfxOrganizeDlg_Impl(SfxTemplateOrganizeDlg * pParent,SfxDocumentTemplates * pTempl)197cdf0e10cSrcweir SfxOrganizeDlg_Impl::SfxOrganizeDlg_Impl( SfxTemplateOrganizeDlg* pParent,
198cdf0e10cSrcweir 										  SfxDocumentTemplates* pTempl ) :
199cdf0e10cSrcweir 
200cdf0e10cSrcweir     pSuspend            ( NULL ),
201cdf0e10cSrcweir     pDialog             ( pParent ),
202cdf0e10cSrcweir     pFocusBox           ( NULL ),
203cdf0e10cSrcweir     pPrt                ( NULL ),
204cdf0e10cSrcweir     pSourceView         ( NULL ),
205cdf0e10cSrcweir     pTargetEntry        ( NULL ),
206cdf0e10cSrcweir     pFinishedBox        ( NULL ),
207cdf0e10cSrcweir     nDropAction         ( NO_DROP_ACTION ),
208cdf0e10cSrcweir     bExecDropFinished   ( true ),
209cdf0e10cSrcweir 
210cdf0e10cSrcweir 	aLeftLb		( this, pParent, WB_BORDER | WB_TABSTOP | WB_HSCROLL, SfxOrganizeListBox_Impl::VIEW_TEMPLATES ),
211cdf0e10cSrcweir 	aLeftTypLb	(  pParent, SfxResId( LB_LEFT_TYP ) ),
212cdf0e10cSrcweir 
213cdf0e10cSrcweir 	aRightLb	( this, pParent, WB_BORDER | WB_TABSTOP | WB_HSCROLL, SfxOrganizeListBox_Impl::VIEW_FILES ),
214cdf0e10cSrcweir 	aRightTypLb	( pParent, SfxResId( LB_RIGHT_TYP ) ),
215cdf0e10cSrcweir 
216cdf0e10cSrcweir 	aOkBtn				( pParent, SfxResId( BTN_OK ) ),
217cdf0e10cSrcweir 	aEditBtn			( pParent, SfxResId( BTN_EDIT ) ),
218cdf0e10cSrcweir 	aHelpBtn			( pParent, SfxResId( BTN_HELP ) ),
219cdf0e10cSrcweir 	aAddressTemplateBtn	( pParent, SfxResId( BTN_ADDRESSTEMPLATE ) ),
220cdf0e10cSrcweir 	aFilesBtn			( pParent, SfxResId( BTN_FILES ) ),
221cdf0e10cSrcweir 
222cdf0e10cSrcweir 	aEditAcc	( SfxResId( ACC_EDIT ) ),
223cdf0e10cSrcweir     aMgr        ( &aLeftLb, &aRightLb, pTempl ),
224cdf0e10cSrcweir     pFileDlg    ( NULL )
225cdf0e10cSrcweir 
226cdf0e10cSrcweir {
227cdf0e10cSrcweir 	// update the SfxDocumentTemplates the manager works with
228cdf0e10cSrcweir 	if ( aMgr.GetTemplates() )	// should never fail, but who knows ....
229cdf0e10cSrcweir 	{
230cdf0e10cSrcweir 		// for this, show a wait cursor (it may take a while)
231cdf0e10cSrcweir 		Window* pWaitObjectRange = pDialog ? pDialog->GetParent() : NULL;
232cdf0e10cSrcweir 		if ( !pWaitObjectRange )
233cdf0e10cSrcweir 			pWaitObjectRange = pDialog;
234cdf0e10cSrcweir 
235cdf0e10cSrcweir 		WaitObject aWaitCursor( pWaitObjectRange );
236cdf0e10cSrcweir 		const_cast< SfxDocumentTemplates* >( aMgr.GetTemplates() )->Update( sal_True /* be smart */ );
237cdf0e10cSrcweir 			// this const_cast is a hack - but the alternative would be to
238cdf0e10cSrcweir 			// * have a method which returns the templates non-const
239cdf0e10cSrcweir 			// * use a new SfxDocumentTemplates instance for the update (knowing that they all share the same
240cdf0e10cSrcweir 			//	 implementation class)
241cdf0e10cSrcweir 			// * always work with an own instance, even if we get only NULL in this ctor
242cdf0e10cSrcweir 	}
243cdf0e10cSrcweir 
244cdf0e10cSrcweir 	aLeftLb.SetHelpId( HID_CTL_ORGANIZER_LEFT );
245cdf0e10cSrcweir 	aRightLb.SetHelpId( HID_CTL_ORGANIZER_RIGHT );
246cdf0e10cSrcweir 
247cdf0e10cSrcweir 	String aWorkPath = SvtPathOptions().GetWorkPath();
248cdf0e10cSrcweir 	if ( aWorkPath.Len() )
249cdf0e10cSrcweir 	{
250cdf0e10cSrcweir         INetURLObject aObj( aWorkPath );
251cdf0e10cSrcweir         DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Illegal URL !" );
252cdf0e10cSrcweir 		aObj.setFinalSlash();
253cdf0e10cSrcweir 		aLastDir = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI );
254cdf0e10cSrcweir 	}
255cdf0e10cSrcweir 	else
256cdf0e10cSrcweir 	{
257cdf0e10cSrcweir 		// fallback
258cdf0e10cSrcweir         String aProgURL = SvtPathOptions().SubstituteVariable( String::CreateFromAscii("$(PROGURL)") );
259cdf0e10cSrcweir         INetURLObject aObj( aProgURL );
260cdf0e10cSrcweir         DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Illegal URL !" );
261cdf0e10cSrcweir 		aLastDir = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI );
262cdf0e10cSrcweir 	}
263cdf0e10cSrcweir 
264cdf0e10cSrcweir 	InitBitmaps();
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 	aEditBtn.GetPopupMenu()->SetSelectHdl( LINK( this, SfxOrganizeDlg_Impl, MenuSelect_Impl ) );
267cdf0e10cSrcweir 	aEditBtn.GetPopupMenu()->SetActivateHdl( LINK( this, SfxOrganizeDlg_Impl, MenuActivate_Impl ) );
268cdf0e10cSrcweir 	aEditAcc.SetSelectHdl( LINK( this, SfxOrganizeDlg_Impl, AccelSelect_Impl ) );
269cdf0e10cSrcweir 	GetpApp()->InsertAccel( &aEditAcc );
270cdf0e10cSrcweir 
271cdf0e10cSrcweir 	aFilesBtn.SetClickHdl(
272cdf0e10cSrcweir 		LINK(this,SfxOrganizeDlg_Impl, AddFiles_Impl));
273cdf0e10cSrcweir 	aAddressTemplateBtn.SetClickHdl(
274cdf0e10cSrcweir 		LINK(this,SfxOrganizeDlg_Impl, OnAddressTemplateClicked));
275cdf0e10cSrcweir 	aLeftTypLb.SetSelectHdl(
276cdf0e10cSrcweir 		LINK(this, SfxOrganizeDlg_Impl, LeftListBoxSelect_Impl));
277cdf0e10cSrcweir 	aRightTypLb.SetSelectHdl(
278cdf0e10cSrcweir 		LINK(this, SfxOrganizeDlg_Impl, RightListBoxSelect_Impl));
279cdf0e10cSrcweir 	aLeftLb.SetGetFocusHdl(
280cdf0e10cSrcweir 		LINK(this, SfxOrganizeDlg_Impl, GetFocus_Impl));
281cdf0e10cSrcweir 	aRightLb.SetGetFocusHdl(
282cdf0e10cSrcweir 		LINK(this, SfxOrganizeDlg_Impl, GetFocus_Impl));
283cdf0e10cSrcweir 	aLeftLb.SetPosSizePixel(pParent->LogicToPixel(Point(3, 6), MAP_APPFONT),
284cdf0e10cSrcweir 							pParent->LogicToPixel(Size(94, 132), MAP_APPFONT));
285cdf0e10cSrcweir 	aRightLb.SetPosSizePixel(pParent->LogicToPixel(Point(103, 6), MAP_APPFONT),
286cdf0e10cSrcweir 							 pParent->LogicToPixel(Size(94, 132), MAP_APPFONT));
287cdf0e10cSrcweir 
288cdf0e10cSrcweir     if ( !SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE) )
289cdf0e10cSrcweir         aAddressTemplateBtn.Hide();
290cdf0e10cSrcweir 	Font aFont(aLeftLb.GetFont());
291cdf0e10cSrcweir 	aFont.SetWeight(WEIGHT_NORMAL);
292cdf0e10cSrcweir 	aLeftLb.SetFont(aFont);
293cdf0e10cSrcweir 	aRightLb.SetFont(aFont);
294cdf0e10cSrcweir 	const long nIndent = aLeftLb.GetIndent() / 2;
295cdf0e10cSrcweir 	aLeftLb.SetIndent( (short)nIndent );
296cdf0e10cSrcweir 	aRightLb.SetIndent( (short)nIndent );
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 	aLeftLb.SetMgr(&aMgr);
299cdf0e10cSrcweir 	aRightLb.SetMgr(&aMgr);
300cdf0e10cSrcweir 	aLeftLb.Reset();
301cdf0e10cSrcweir 	aRightLb.Reset();//SetModel(aLeftLb.GetModel());
302cdf0e10cSrcweir 
303cdf0e10cSrcweir 	aLeftLb.Show();
304cdf0e10cSrcweir 	aRightLb.Show();
305cdf0e10cSrcweir 
306cdf0e10cSrcweir 	aLeftLb.SelectAll( sal_False );
307cdf0e10cSrcweir 	aRightLb.SelectAll( sal_False );
308cdf0e10cSrcweir 	aRightLb.GrabFocus();
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir //-------------------------------------------------------------------------
312cdf0e10cSrcweir 
~SfxOrganizeDlg_Impl()313cdf0e10cSrcweir SfxOrganizeDlg_Impl::~SfxOrganizeDlg_Impl()
314cdf0e10cSrcweir {
315cdf0e10cSrcweir     delete pFileDlg;
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir //-------------------------------------------------------------------------
319cdf0e10cSrcweir 
InitBitmaps(void)320cdf0e10cSrcweir void SfxOrganizeDlg_Impl::InitBitmaps( void )
321cdf0e10cSrcweir {
322cdf0e10cSrcweir 	Image	aOpenedFolderBmp( SfxResId( IMG_OPENED_FOLDER ) );
323cdf0e10cSrcweir 	Image	aClosedFolderBmp( SfxResId( IMG_CLOSED_FOLDER ) );
324cdf0e10cSrcweir 	Image	aOpenedDocBmp( SfxResId( IMG_OPENED_DOC ) );
325cdf0e10cSrcweir 	Image	aClosedDocBmp( SfxResId( IMG_CLOSED_DOC ) );
326cdf0e10cSrcweir 
327cdf0e10cSrcweir 	Image	aOpenedFolderBmpHC( SfxResId( IMG_OPENED_FOLDER_HC ) );
328cdf0e10cSrcweir 	Image	aClosedFolderBmpHC( SfxResId( IMG_CLOSED_FOLDER_HC ) );
329cdf0e10cSrcweir 	Image	aOpenedDocBmpHC( SfxResId( IMG_OPENED_DOC_HC ) );
330cdf0e10cSrcweir 	Image	aClosedDocBmpHC( SfxResId( IMG_CLOSED_DOC_HC ) );
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 	aLeftLb.SetBitmaps( aOpenedFolderBmp, aClosedFolderBmp, aOpenedDocBmp, aClosedDocBmp,
333cdf0e10cSrcweir 						aOpenedFolderBmpHC, aClosedFolderBmpHC, aOpenedDocBmpHC, aClosedDocBmpHC );
334cdf0e10cSrcweir 	aRightLb.SetBitmaps( aOpenedFolderBmp, aClosedFolderBmp, aOpenedDocBmp, aClosedDocBmp,
335cdf0e10cSrcweir 						aOpenedFolderBmpHC, aClosedFolderBmpHC, aOpenedDocBmpHC, aClosedDocBmpHC );
336cdf0e10cSrcweir }
337cdf0e10cSrcweir 
338cdf0e10cSrcweir //=========================================================================
339cdf0e10cSrcweir 
QueryDelete_Impl(Window * pParent,sal_uInt16 nId,const String & rTemplateName)340cdf0e10cSrcweir sal_Bool QueryDelete_Impl(Window *pParent,      // Parent der QueryBox
341cdf0e10cSrcweir 							 sal_uInt16 nId,            // Resource Id
342cdf0e10cSrcweir 							 const String &rTemplateName)   // Name der zu l"oschenden Vorlage
343cdf0e10cSrcweir /*  [Beschreibung]
344cdf0e10cSrcweir 
345cdf0e10cSrcweir 	"oschabfrage
346cdf0e10cSrcweir 
347cdf0e10cSrcweir */
348cdf0e10cSrcweir {
349cdf0e10cSrcweir 	SfxResId aResId( nId );
350cdf0e10cSrcweir 	String aEntryText( aResId );
351cdf0e10cSrcweir 	aEntryText.SearchAndReplaceAscii( "$1", rTemplateName );
352cdf0e10cSrcweir 	QueryBox aBox( pParent, WB_YES_NO | WB_DEF_NO, aEntryText );
353cdf0e10cSrcweir 	return RET_NO != aBox.Execute();
354cdf0e10cSrcweir }
355cdf0e10cSrcweir 
356cdf0e10cSrcweir //-------------------------------------------------------------------------
357cdf0e10cSrcweir 
ErrorDelete_Impl(Window * pParent,const String & rName,sal_Bool bFolder=sal_False)358cdf0e10cSrcweir void ErrorDelete_Impl(Window *pParent, const String &rName, sal_Bool bFolder = sal_False )
359cdf0e10cSrcweir 
360cdf0e10cSrcweir /*  [Beschreibung]
361cdf0e10cSrcweir 
362cdf0e10cSrcweir 	Benutzerinformation, da"s die Vorlage rName nicht gel"oscht werden konnte
363cdf0e10cSrcweir 
364cdf0e10cSrcweir */
365cdf0e10cSrcweir {
366cdf0e10cSrcweir 	if ( bFolder )
367cdf0e10cSrcweir 	{
368cdf0e10cSrcweir 		String aText( SfxResId( STR_ERROR_DELETE_TEMPLATE_DIR ) );
369cdf0e10cSrcweir 		ErrorBox( pParent, WB_OK, aText ).Execute();
370cdf0e10cSrcweir 	}
371cdf0e10cSrcweir 	else
372cdf0e10cSrcweir 	{
373cdf0e10cSrcweir 		String aText( SfxResId( STR_ERROR_DELETE_TEMPLATE ) );
374cdf0e10cSrcweir 		aText.SearchAndReplaceAscii( "$1", rName );
375cdf0e10cSrcweir 		ErrorBox( pParent, WB_OK, aText ).Execute();
376cdf0e10cSrcweir 	}
377cdf0e10cSrcweir }
378cdf0e10cSrcweir 
379cdf0e10cSrcweir 
380cdf0e10cSrcweir //=========================================================================
381cdf0e10cSrcweir 
382cdf0e10cSrcweir /*  [Beschreibung]
383cdf0e10cSrcweir 
384cdf0e10cSrcweir 	Implementierungsklasse; Referenzklasse f"ur USHORT-Array
385cdf0e10cSrcweir 
386cdf0e10cSrcweir */
387cdf0e10cSrcweir 
388cdf0e10cSrcweir struct ImpPath_Impl
389cdf0e10cSrcweir {
390cdf0e10cSrcweir 	SvUShorts	aUS;
391cdf0e10cSrcweir 	sal_uInt16		nRef;
392cdf0e10cSrcweir 
393cdf0e10cSrcweir 	ImpPath_Impl();
394cdf0e10cSrcweir 	ImpPath_Impl( const ImpPath_Impl& rCopy );
395cdf0e10cSrcweir };
396cdf0e10cSrcweir 
397cdf0e10cSrcweir //-------------------------------------------------------------------------
398cdf0e10cSrcweir 
ImpPath_Impl()399cdf0e10cSrcweir ImpPath_Impl::ImpPath_Impl() : aUS(5), nRef(1)
400cdf0e10cSrcweir {
401cdf0e10cSrcweir }
402cdf0e10cSrcweir 
403cdf0e10cSrcweir //-------------------------------------------------------------------------
404cdf0e10cSrcweir 
ImpPath_Impl(const ImpPath_Impl & rCopy)405cdf0e10cSrcweir ImpPath_Impl::ImpPath_Impl( const ImpPath_Impl& rCopy ) :
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 	aUS	( (sal_uInt8)rCopy.aUS.Count() ),
408cdf0e10cSrcweir 	nRef( 1 )
409cdf0e10cSrcweir 
410cdf0e10cSrcweir {
411cdf0e10cSrcweir 	const sal_uInt16 nCount = rCopy.aUS.Count();
412cdf0e10cSrcweir 
413cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < nCount; ++i )
414cdf0e10cSrcweir 		aUS.Insert( rCopy.aUS[i], i );
415cdf0e10cSrcweir }
416cdf0e10cSrcweir 
417cdf0e10cSrcweir //==========================================================================
418cdf0e10cSrcweir 
419cdf0e10cSrcweir /*  [Beschreibung]
420cdf0e10cSrcweir 
421cdf0e10cSrcweir 	Implementierungsklasse; Darstellung einer Position in der Outline-
422cdf0e10cSrcweir 	Listbox als sal_uInt16-Array; dieses beschreibt die Position jeweil
423cdf0e10cSrcweir 	als relative Postion zum "ubergeordneten Eintrag
424cdf0e10cSrcweir 
425cdf0e10cSrcweir */
426cdf0e10cSrcweir class Path
427cdf0e10cSrcweir {
428cdf0e10cSrcweir 	ImpPath_Impl *pData;
429cdf0e10cSrcweir 	void NewImp();
430cdf0e10cSrcweir public:
431cdf0e10cSrcweir 	Path(SvLBox *pBox, SvLBoxEntry *pEntry);
Path(const Path & rPath)432cdf0e10cSrcweir 	Path(const Path &rPath):
433cdf0e10cSrcweir 		pData(rPath.pData)
434cdf0e10cSrcweir 	{
435cdf0e10cSrcweir 		++pData->nRef;
436cdf0e10cSrcweir 	}
operator =(const Path & rPath)437cdf0e10cSrcweir 	const Path &operator=(const Path &rPath)
438cdf0e10cSrcweir 	{
439cdf0e10cSrcweir 		if(&rPath != this)
440cdf0e10cSrcweir 		{
441cdf0e10cSrcweir 			if(!--pData->nRef)
442cdf0e10cSrcweir 				delete pData;
443cdf0e10cSrcweir 			pData = rPath.pData;
444cdf0e10cSrcweir 			pData->nRef++;
445cdf0e10cSrcweir 		}
446cdf0e10cSrcweir 		return *this;
447cdf0e10cSrcweir 	}
~Path()448cdf0e10cSrcweir 	~Path()
449cdf0e10cSrcweir 	{
450cdf0e10cSrcweir 		if(!--pData->nRef)
451cdf0e10cSrcweir 			delete pData;
452cdf0e10cSrcweir 	}
Count() const453cdf0e10cSrcweir 	sal_uInt16 Count() const { return pData->aUS.Count(); }
operator [](sal_uInt16 i) const454cdf0e10cSrcweir 	sal_uInt16 operator[]( sal_uInt16 i ) const
455cdf0e10cSrcweir 	{
456cdf0e10cSrcweir 		return i < Count()? pData->aUS[i]: INDEX_IGNORE;
457cdf0e10cSrcweir 	}
458cdf0e10cSrcweir };
459cdf0e10cSrcweir 
460cdf0e10cSrcweir //-------------------------------------------------------------------------
461cdf0e10cSrcweir 
Path(SvLBox * pBox,SvLBoxEntry * pEntry)462cdf0e10cSrcweir Path::Path(SvLBox *pBox, SvLBoxEntry *pEntry) :
463cdf0e10cSrcweir 	pData(new ImpPath_Impl)
464cdf0e10cSrcweir {
465cdf0e10cSrcweir 	DBG_ASSERT(pEntry != 0, "EntryPtr ist NULL");
466cdf0e10cSrcweir 	if(!pEntry)
467cdf0e10cSrcweir 		return;
468cdf0e10cSrcweir 	SvLBoxEntry *pParent = pBox->GetParent(pEntry);
469cdf0e10cSrcweir 	do {
470cdf0e10cSrcweir 		pData->aUS.Insert((sal_uInt16)pBox->GetModel()->GetRelPos(pEntry), 0);
471cdf0e10cSrcweir 		if(0 == pParent)
472cdf0e10cSrcweir 			break;
473cdf0e10cSrcweir 		pEntry = pParent;
474cdf0e10cSrcweir 		pParent = pBox->GetParent(pEntry);
475cdf0e10cSrcweir 	} while(1);
476cdf0e10cSrcweir }
477cdf0e10cSrcweir 
478cdf0e10cSrcweir //-------------------------------------------------------------------------
479cdf0e10cSrcweir 
NewImp()480cdf0e10cSrcweir void Path::NewImp()
481cdf0e10cSrcweir {
482cdf0e10cSrcweir 	if(pData->nRef != 1)
483cdf0e10cSrcweir 	{
484cdf0e10cSrcweir 		pData->nRef--;
485cdf0e10cSrcweir 		pData = new ImpPath_Impl(*pData);
486cdf0e10cSrcweir 	}
487cdf0e10cSrcweir }
488cdf0e10cSrcweir 
489cdf0e10cSrcweir //-------------------------------------------------------------------------
490cdf0e10cSrcweir 
GetIndices_Impl(SvLBox * pBox,SvLBoxEntry * pEntry,sal_uInt16 & rRegion,sal_uInt16 & rOffset)491cdf0e10cSrcweir SvLBoxEntry *GetIndices_Impl(SvLBox *pBox,
492cdf0e10cSrcweir 							   SvLBoxEntry *pEntry,
493cdf0e10cSrcweir 							   sal_uInt16 &rRegion,
494cdf0e10cSrcweir 							   sal_uInt16 &rOffset)
495cdf0e10cSrcweir /*  [Beschreibung]
496cdf0e10cSrcweir 
497cdf0e10cSrcweir 	Bereich und Position innerhalb eines Bereiches f"ur eine
498cdf0e10cSrcweir 	Dokumentvorlage wird ermittelt.
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 	[Parameter]
501cdf0e10cSrcweir 
502cdf0e10cSrcweir 	SvLBox *pBox            Listbox, an der das Ereignis auftrat
503cdf0e10cSrcweir 	SvLBoxEntry *pEntry     Eintrag, dessen Position ermittelt werden soll
504cdf0e10cSrcweir 	sal_uInt16 &rRegion         der Bereich innerhalb der Bereiche der
505cdf0e10cSrcweir 							Dokumentvorlagen (Out-Parameter)
506cdf0e10cSrcweir 	sal_uInt16 &rOffset         die Position innerhalb des Bereiches
507cdf0e10cSrcweir 							Dokumentvorlagen (Out-Parameter)
508cdf0e10cSrcweir 
509cdf0e10cSrcweir 	[Querverweise]
510cdf0e10cSrcweir 
511cdf0e10cSrcweir 	<class Path>    (unter Umst"anden kann auf diese Funktion zugunsten
512cdf0e10cSrcweir 					 von Path verzichtet werden.)
513cdf0e10cSrcweir 
514cdf0e10cSrcweir */
515cdf0e10cSrcweir 
516cdf0e10cSrcweir {
517cdf0e10cSrcweir 	if(!pEntry)
518cdf0e10cSrcweir 	{
519cdf0e10cSrcweir 		rRegion = rOffset = 0;
520cdf0e10cSrcweir 		return pEntry;
521cdf0e10cSrcweir 	}
522cdf0e10cSrcweir 	if(0 == pBox->GetModel()->GetDepth(pEntry))
523cdf0e10cSrcweir 	{
524cdf0e10cSrcweir 		rRegion = (sal_uInt16)pBox->GetModel()->GetRelPos(pEntry);
525cdf0e10cSrcweir 		rOffset = USHRT_MAX;
526cdf0e10cSrcweir 		return pEntry;
527cdf0e10cSrcweir 	}
528cdf0e10cSrcweir 	SvLBoxEntry *pParent = pBox->GetParent(pEntry);
529cdf0e10cSrcweir 	rRegion = (sal_uInt16)pBox->GetModel()->GetRelPos(pParent);
530cdf0e10cSrcweir 	rOffset = (sal_uInt16)pBox->GetModel()->GetRelPos(pEntry);
531cdf0e10cSrcweir 	return pEntry;
532cdf0e10cSrcweir }
533cdf0e10cSrcweir 
534cdf0e10cSrcweir //-------------------------------------------------------------------------
535cdf0e10cSrcweir 
Select(SvLBoxEntry * pEntry,sal_Bool bSelect)536cdf0e10cSrcweir sal_Bool SfxOrganizeListBox_Impl::Select( SvLBoxEntry* pEntry, sal_Bool bSelect )
537cdf0e10cSrcweir {
538cdf0e10cSrcweir 	if(!bSelect)
539cdf0e10cSrcweir 		return SvTreeListBox::Select(pEntry,bSelect);
540cdf0e10cSrcweir 	sal_uInt16 nLevel = GetDocLevel();
541cdf0e10cSrcweir 	if(GetModel()->GetDepth(pEntry)+nLevel<3)
542cdf0e10cSrcweir 		return SvTreeListBox::Select(pEntry,bSelect);
543cdf0e10cSrcweir 
544cdf0e10cSrcweir 	Path aPath(this, pEntry);
545cdf0e10cSrcweir 
546cdf0e10cSrcweir     // it is ok to use the SfxObjectShellRef here since the object that
547cdf0e10cSrcweir     // provides it ( GetObjectShell() calls CreateObjectShell() ) has a lock on it
548cdf0e10cSrcweir 	GetObjectShell(aPath)->TriggerHelpPI(
549cdf0e10cSrcweir 		aPath[nLevel+1], aPath[nLevel+2], aPath[nLevel+3]);
550cdf0e10cSrcweir 	return SvTreeListBox::Select(pEntry,bSelect);
551cdf0e10cSrcweir }
552cdf0e10cSrcweir 
553cdf0e10cSrcweir //-------------------------------------------------------------------------
554cdf0e10cSrcweir 
MoveOrCopyTemplates(SvLBox * pSourceBox,SvLBoxEntry * pSource,SvLBoxEntry * pTarget,SvLBoxEntry * & pNewParent,sal_uIntPtr & rIdx,sal_Bool bCopy)555cdf0e10cSrcweir sal_Bool SfxOrganizeListBox_Impl::MoveOrCopyTemplates(SvLBox *pSourceBox,
556cdf0e10cSrcweir 											SvLBoxEntry *pSource,
557cdf0e10cSrcweir 											SvLBoxEntry* pTarget,
558cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
559cdf0e10cSrcweir 											sal_uIntPtr &rIdx,
560cdf0e10cSrcweir 											sal_Bool bCopy)
561cdf0e10cSrcweir /*  [Beschreibung]
562cdf0e10cSrcweir 
563cdf0e10cSrcweir 	Verschieben oder Kopieren von Dokumentvorlagen
564cdf0e10cSrcweir 
565cdf0e10cSrcweir 	[Parameter]
566cdf0e10cSrcweir 
567cdf0e10cSrcweir 	SvLBox *pSourceBox          Quell-Listbox, an der das Ereignis auftrat
568cdf0e10cSrcweir 	SvLBoxEntry *pSource        Quell-Eintrag, der kopiert / verschoben werden soll
569cdf0e10cSrcweir 	SvLBoxEntry* pTarget        Ziel-Eintrag, auf den verschoben werden soll
570cdf0e10cSrcweir 	SvLBoxEntry *&pNewParent    der Parent der an der Zielposition erzeugten
571cdf0e10cSrcweir 								Eintrags (Out-Parameter)
572cdf0e10cSrcweir 	sal_uIntPtr &rIdx                 Index des Zieleintrags
573cdf0e10cSrcweir 	sal_Bool bCopy                  Flag f"ur Kopieren / Verschieben
574cdf0e10cSrcweir 
575cdf0e10cSrcweir 
576cdf0e10cSrcweir 	[Returnwert]                sal_Bool: Erfolg oder Mi"serfolg
577cdf0e10cSrcweir 
578cdf0e10cSrcweir 	[Querverweise]
579cdf0e10cSrcweir 
580cdf0e10cSrcweir 	<SfxOrganizeListBox_Impl::MoveOrCopyContents(SvLBox *pSourceBox,
581cdf0e10cSrcweir 											SvLBoxEntry *pSource,
582cdf0e10cSrcweir 											SvLBoxEntry* pTarget,
583cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
584cdf0e10cSrcweir 											sal_uIntPtr &rIdx,
585cdf0e10cSrcweir 											sal_Bool bCopy)>
586cdf0e10cSrcweir 	<sal_Bool SfxOrganizeListBox_Impl::NotifyMoving(SvLBoxEntry *pTarget,
587cdf0e10cSrcweir 											SvLBoxEntry* pSource,
588cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
589cdf0e10cSrcweir 											sal_uIntPtr &rIdx)>
590cdf0e10cSrcweir 	<sal_Bool SfxOrganizeListBox_Impl::NotifyCopying(SvLBoxEntry *pTarget,
591cdf0e10cSrcweir 											SvLBoxEntry* pSource,
592cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
593cdf0e10cSrcweir 											sal_uIntPtr &rIdx)>
594cdf0e10cSrcweir */
595cdf0e10cSrcweir 
596cdf0e10cSrcweir {
597cdf0e10cSrcweir 	sal_Bool bOk = sal_False;
598cdf0e10cSrcweir 
599cdf0e10cSrcweir 	if(pSource)
600cdf0e10cSrcweir 	{
601cdf0e10cSrcweir 		sal_uInt16 nTargetRegion = 0, nTargetIndex = 0;
602cdf0e10cSrcweir 		GetIndices_Impl(this, pTarget, nTargetRegion, nTargetIndex);
603cdf0e10cSrcweir 
604cdf0e10cSrcweir 		sal_uInt16 nSourceRegion = 0, nSourceIndex = 0;
605cdf0e10cSrcweir 		GetIndices_Impl(pSourceBox, pSource, nSourceRegion, nSourceIndex);
606cdf0e10cSrcweir 
607cdf0e10cSrcweir 		bOk =  bCopy ?
608cdf0e10cSrcweir 			pMgr->Copy(nTargetRegion, nTargetIndex+1,
609cdf0e10cSrcweir 					   nSourceRegion, nSourceIndex):
610cdf0e10cSrcweir 			pMgr->Move(nTargetRegion, nTargetIndex+1,
611cdf0e10cSrcweir 					   nSourceRegion, nSourceIndex);
612cdf0e10cSrcweir 
613cdf0e10cSrcweir 		if(bOk)
614cdf0e10cSrcweir 		{
615cdf0e10cSrcweir 			if(pSourceBox->GetModel()->GetDepth(pSource) == GetModel()->GetDepth(pTarget))
616cdf0e10cSrcweir 			{
617cdf0e10cSrcweir 				pNewParent = GetParent(pTarget);
618cdf0e10cSrcweir 				rIdx = GetModel()->GetRelPos(pTarget)+1;
619cdf0e10cSrcweir 			}
620cdf0e10cSrcweir 			else
621cdf0e10cSrcweir 			{
622cdf0e10cSrcweir 				if(nTargetIndex == USHRT_MAX)
623cdf0e10cSrcweir 				{
624cdf0e10cSrcweir 					pNewParent = pTarget;
625cdf0e10cSrcweir 					rIdx = 0;
626cdf0e10cSrcweir 				}
627cdf0e10cSrcweir 				else
628cdf0e10cSrcweir 					SvLBox::NotifyCopying(
629cdf0e10cSrcweir 						pTarget, pSource, pNewParent, rIdx);
630cdf0e10cSrcweir 			}
631cdf0e10cSrcweir 		}
632cdf0e10cSrcweir 		else if ( bCopy )
633cdf0e10cSrcweir 		{
634cdf0e10cSrcweir 			// the template organizer always tries copy after the move, so no error is required for move case
635cdf0e10cSrcweir 			String aText( SfxResId( bCopy ? STR_ERROR_COPY_TEMPLATE : STR_ERROR_MOVE_TEMPLATE ) );
636cdf0e10cSrcweir 			aText.SearchAndReplaceAscii( "$1",
637cdf0e10cSrcweir 										 ( (SvTreeListBox *)pSourceBox )->GetEntryText( pSource ) );
638cdf0e10cSrcweir 			ErrorBox( this, WB_OK, aText ).Execute();
639cdf0e10cSrcweir 		}
640cdf0e10cSrcweir 	}
641cdf0e10cSrcweir 	return bOk;
642cdf0e10cSrcweir }
643cdf0e10cSrcweir 
644cdf0e10cSrcweir //-------------------------------------------------------------------------
645cdf0e10cSrcweir 
MoveOrCopyContents(SvLBox * pSourceBox,SvLBoxEntry * pSource,SvLBoxEntry * pTarget,SvLBoxEntry * & pNewParent,sal_uIntPtr & rIdx,sal_Bool bCopy)646cdf0e10cSrcweir sal_Bool SfxOrganizeListBox_Impl::MoveOrCopyContents(SvLBox *pSourceBox,
647cdf0e10cSrcweir 											SvLBoxEntry *pSource,
648cdf0e10cSrcweir 											SvLBoxEntry* pTarget,
649cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
650cdf0e10cSrcweir 											sal_uIntPtr &rIdx,
651cdf0e10cSrcweir 											sal_Bool bCopy)
652cdf0e10cSrcweir /*  [Beschreibung]
653cdf0e10cSrcweir 
654cdf0e10cSrcweir 	Verschieben oder Kopieren von Dokumentinhalten
655cdf0e10cSrcweir 
656cdf0e10cSrcweir 	[Parameter]
657cdf0e10cSrcweir 
658cdf0e10cSrcweir 	SvLBox *pSourceBox          Quell-Listbox, an der das Ereignis auftrat
659cdf0e10cSrcweir 	SvLBoxEntry *pSource        Quell-Eintrag, der kopiert / verschoben werden soll
660cdf0e10cSrcweir 	SvLBoxEntry* pTarget        Ziel-Eintrag, auf den verschoben werden soll
661cdf0e10cSrcweir 	SvLBoxEntry *&pNewParent    der Parent der an der Zielposition erzeugten
662cdf0e10cSrcweir 								Eintrags (Out-Parameter)
663cdf0e10cSrcweir 	sal_uIntPtr &rIdx                 Index des Zieleintrags
664cdf0e10cSrcweir 	sal_Bool bCopy                  Flag f"ur Kopieren / Verschieben
665cdf0e10cSrcweir 
666cdf0e10cSrcweir 
667cdf0e10cSrcweir 	[Returnwert]                sal_Bool: Erfolg oder Mi"serfolg
668cdf0e10cSrcweir 
669cdf0e10cSrcweir 	[Querverweise]
670cdf0e10cSrcweir 
671cdf0e10cSrcweir 	<SfxOrganizeListBox_Impl::MoveOrCopyTemplates(SvLBox *pSourceBox,
672cdf0e10cSrcweir 											SvLBoxEntry *pSource,
673cdf0e10cSrcweir 											SvLBoxEntry* pTarget,
674cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
675cdf0e10cSrcweir 											sal_uIntPtr &rIdx,
676cdf0e10cSrcweir 											sal_Bool bCopy)>
677cdf0e10cSrcweir 	<sal_Bool SfxOrganizeListBox_Impl::NotifyMoving(SvLBoxEntry *pTarget,
678cdf0e10cSrcweir 											SvLBoxEntry* pSource,
679cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
680cdf0e10cSrcweir 											sal_uIntPtr &rIdx)>
681cdf0e10cSrcweir 	<sal_Bool SfxOrganizeListBox_Impl::NotifyCopying(SvLBoxEntry *pTarget,
682cdf0e10cSrcweir 											SvLBoxEntry* pSource,
683cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
684cdf0e10cSrcweir 											sal_uIntPtr &rIdx)>
685cdf0e10cSrcweir */
686cdf0e10cSrcweir 
687cdf0e10cSrcweir {
688cdf0e10cSrcweir 	SfxErrorContext aEc( ERRCTX_SFX_MOVEORCOPYCONTENTS, this);
689cdf0e10cSrcweir 	sal_Bool bOk = sal_False, bKeepExpansion = sal_False;
690cdf0e10cSrcweir 	sal_Bool bRemovedFromSource = sal_False;
691cdf0e10cSrcweir 	Path aSource(pSourceBox, pSource);
692cdf0e10cSrcweir 	Path aTarget(this, pTarget);
693cdf0e10cSrcweir 
694cdf0e10cSrcweir     // it is ok to use the SfxObjectShellRef here since the object that
695cdf0e10cSrcweir     // provides it ( GetObjectShell() calls CreateObjectShell() ) has a lock on it
696cdf0e10cSrcweir 	SfxObjectShellRef aSourceDoc = ((SfxOrganizeListBox_Impl *)pSourceBox)->GetObjectShell(aSource);
697cdf0e10cSrcweir 	SfxObjectShellRef aTargetDoc = GetObjectShell(aTarget);
698cdf0e10cSrcweir 
699cdf0e10cSrcweir 	const sal_uInt16 nSLevel =
700cdf0e10cSrcweir 		((SfxOrganizeListBox_Impl *)pSourceBox)->GetDocLevel();
701cdf0e10cSrcweir 	const sal_uInt16 nTLevel = GetDocLevel();
702cdf0e10cSrcweir 
703cdf0e10cSrcweir 	if(aSourceDoc.Is() && aTargetDoc.Is())
704cdf0e10cSrcweir 	{
705cdf0e10cSrcweir 		if (aSourceDoc->GetStyleSheetPool())
706cdf0e10cSrcweir 			aSourceDoc->GetStyleSheetPool()->SetSearchMask(
707cdf0e10cSrcweir 				SFX_STYLE_FAMILY_ALL, SFXSTYLEBIT_USERDEF | SFXSTYLEBIT_USED);
708cdf0e10cSrcweir 
709cdf0e10cSrcweir 		if (aTargetDoc->GetStyleSheetPool())
710cdf0e10cSrcweir 			aTargetDoc->GetStyleSheetPool()->SetSearchMask(
711cdf0e10cSrcweir 				SFX_STYLE_FAMILY_ALL, SFXSTYLEBIT_USERDEF | SFXSTYLEBIT_USED);
712cdf0e10cSrcweir 		sal_uInt16 p[3];
713cdf0e10cSrcweir 		sal_uInt16 nIdxDeleted = INDEX_IGNORE;
714cdf0e10cSrcweir 		p[0]=aTarget[nTLevel+1];
715cdf0e10cSrcweir 		p[1]=aTarget[nTLevel+2];
716cdf0e10cSrcweir 		if(p[1]!=INDEX_IGNORE)p[1]++;
717cdf0e10cSrcweir 		p[2]=aTarget[nTLevel+3];
718cdf0e10cSrcweir 
719cdf0e10cSrcweir 		bOk = aTargetDoc->Insert(
720cdf0e10cSrcweir 			*aSourceDoc, aSource[nSLevel+1],
721cdf0e10cSrcweir 			aSource[nSLevel+2], aSource[nSLevel+3],
722cdf0e10cSrcweir 			p[0], p[1], p[2],  nIdxDeleted);
723cdf0e10cSrcweir 		// Positionskorrektur auswerten
724cdf0e10cSrcweir 		// a = Dokumentinhalt
725cdf0e10cSrcweir 		// b = Position Sub-Inhalt 1
726cdf0e10cSrcweir 		// c = Position Sub-Inhalt 2
727cdf0e10cSrcweir 		// doppelte Eintraege loeschen
728cdf0e10cSrcweir 		if(bOk)
729cdf0e10cSrcweir 		{
730cdf0e10cSrcweir 			SvLBoxEntry *pParentIter = pTarget;
731cdf0e10cSrcweir 			// bis auf die DokumentEbene nach oben als
732cdf0e10cSrcweir 			// allgemeiner Bezugspunkt
733cdf0e10cSrcweir 			while(GetModel()->GetDepth(pParentIter) != nTLevel)
734cdf0e10cSrcweir 				pParentIter = GetParent(pParentIter);
735cdf0e10cSrcweir 			if(pParentIter->HasChildsOnDemand() &&
736cdf0e10cSrcweir 				!GetModel()->HasChilds(pParentIter))
737cdf0e10cSrcweir 				RequestingChilds(pParentIter);
738cdf0e10cSrcweir 			SvLBoxEntry *pChildIter = 0;
739cdf0e10cSrcweir 
740cdf0e10cSrcweir 			sal_uInt16 i = 0;
741cdf0e10cSrcweir 			while(i < 2 && p[i+1] != INDEX_IGNORE)
742cdf0e10cSrcweir 			{
743cdf0e10cSrcweir 				pChildIter = FirstChild(pParentIter);
744cdf0e10cSrcweir 				// bis zum Index der aktuellen Ebene
745cdf0e10cSrcweir 				for(sal_uInt16 j = 0; j < p[i]; ++j)
746cdf0e10cSrcweir 					pChildIter = NextSibling(pChildIter);
747cdf0e10cSrcweir 				// gfs Fuellen bei Items onDemand
748cdf0e10cSrcweir 				++i;
749*1776ad39SArmin Le Grand 				if((i < 2) && p[i+1] != INDEX_IGNORE &&
750cdf0e10cSrcweir 				   pChildIter->HasChildsOnDemand() &&
751cdf0e10cSrcweir 				   !GetModel()->HasChilds(pChildIter))
752cdf0e10cSrcweir 					RequestingChilds(pChildIter);
753cdf0e10cSrcweir 				pParentIter = pChildIter;
754cdf0e10cSrcweir 			}
755cdf0e10cSrcweir 			rIdx = p[i];
756cdf0e10cSrcweir 			pNewParent = pParentIter;
757cdf0e10cSrcweir 			if(!IsExpanded(pNewParent) &&
758cdf0e10cSrcweir 			   pNewParent->HasChildsOnDemand() &&
759cdf0e10cSrcweir 			   !GetModel()->HasChilds(pNewParent))
760cdf0e10cSrcweir 			{
761cdf0e10cSrcweir 				bOk = sal_False;
762cdf0e10cSrcweir 				if(!bCopy)
763cdf0e10cSrcweir 					pSourceBox->GetModel()->Remove(pSource);
764cdf0e10cSrcweir 			}
765cdf0e10cSrcweir 			// Geloeschte Eintraege entfernen
766cdf0e10cSrcweir 			// (kann durch Ueberschreiben geschehen)
767cdf0e10cSrcweir 			if(nIdxDeleted != INDEX_IGNORE)
768cdf0e10cSrcweir 			{
769cdf0e10cSrcweir 				pChildIter = FirstChild(pParentIter);
770cdf0e10cSrcweir 				for(sal_uInt16 j = 0; j < nIdxDeleted; ++j)
771cdf0e10cSrcweir 					pChildIter = NextSibling(pChildIter);
772cdf0e10cSrcweir 				if( pChildIter && pChildIter != pSource )
773cdf0e10cSrcweir 				{
774cdf0e10cSrcweir 					bKeepExpansion = IsExpanded(pParentIter);
775cdf0e10cSrcweir 					GetModel()->Remove(pChildIter);
776cdf0e10cSrcweir 				}
777cdf0e10cSrcweir 				else
778cdf0e10cSrcweir 					bOk = sal_False;
779cdf0e10cSrcweir 			}
780cdf0e10cSrcweir 			if(!bCopy && &aSourceDoc != &aTargetDoc)
781cdf0e10cSrcweir 			{
782cdf0e10cSrcweir 				//#109566# pool styles that are moved produce
783cdf0e10cSrcweir 				//an rIdx == INDEX_IGNORE
784cdf0e10cSrcweir 				//the method has to return true to keep the box content consistent
785cdf0e10cSrcweir 				bRemovedFromSource = aSourceDoc->Remove(aSource[nSLevel+1],
786cdf0e10cSrcweir 									 aSource[nSLevel+2],
787cdf0e10cSrcweir 									 aSource[nSLevel+3]);
788cdf0e10cSrcweir 			}
789cdf0e10cSrcweir 		}
790cdf0e10cSrcweir 	}
791cdf0e10cSrcweir //  rIdx++;
792cdf0e10cSrcweir 	return (((rIdx != INDEX_IGNORE)|| bRemovedFromSource) && bOk )
793cdf0e10cSrcweir 		? bKeepExpansion? (sal_Bool)2: sal_True: sal_False;
794cdf0e10cSrcweir }
795cdf0e10cSrcweir 
796cdf0e10cSrcweir //-------------------------------------------------------------------------
797cdf0e10cSrcweir 
NotifyMoving(SvLBoxEntry * pTarget,SvLBoxEntry * pSource,SvLBoxEntry * & pNewParent,sal_uIntPtr & rIdx)798cdf0e10cSrcweir sal_Bool SfxOrganizeListBox_Impl::NotifyMoving(SvLBoxEntry *pTarget,
799cdf0e10cSrcweir 										SvLBoxEntry* pSource,
800cdf0e10cSrcweir 										SvLBoxEntry *&pNewParent,
801cdf0e10cSrcweir 										sal_uIntPtr &rIdx)
802cdf0e10cSrcweir 
803cdf0e10cSrcweir /*  [Beschreibung]
804cdf0e10cSrcweir 
805cdf0e10cSrcweir 	Benachrichtigung, da"s ein Eintrag verschoben werden soll
806cdf0e10cSrcweir 	(SV-Handler)
807cdf0e10cSrcweir 
808cdf0e10cSrcweir 	[Parameter]
809cdf0e10cSrcweir 
810cdf0e10cSrcweir 	SvLBoxEntry* pTarget        Ziel-Eintrag, auf den verschoben werden soll
811cdf0e10cSrcweir 	SvLBoxEntry *pSource        Quell-Eintrag, der verschoben werden soll
812cdf0e10cSrcweir 	SvLBoxEntry *&pNewParent    der Parent der an der Zielposition erzeugten
813cdf0e10cSrcweir 								Eintrags (Out-Parameter)
814cdf0e10cSrcweir 	sal_uIntPtr &rIdx                 Index des Zieleintrags
815cdf0e10cSrcweir 
816cdf0e10cSrcweir 
817cdf0e10cSrcweir 	[Returnwert]                sal_Bool: Erfolg oder Mi"serfolg
818cdf0e10cSrcweir 
819cdf0e10cSrcweir 	[Querverweise]
820cdf0e10cSrcweir 
821cdf0e10cSrcweir 	<SfxOrganizeListBox_Impl::MoveOrCopyTemplates(SvLBox *pSourceBox,
822cdf0e10cSrcweir 											SvLBoxEntry *pSource,
823cdf0e10cSrcweir 											SvLBoxEntry* pTarget,
824cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
825cdf0e10cSrcweir 											sal_uIntPtr &rIdx,
826cdf0e10cSrcweir 											sal_Bool bCopy)>
827cdf0e10cSrcweir 	<SfxOrganizeListBox_Impl::MoveOrCopyContents(SvLBox *pSourceBox,
828cdf0e10cSrcweir 											SvLBoxEntry *pSource,
829cdf0e10cSrcweir 											SvLBoxEntry* pTarget,
830cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
831cdf0e10cSrcweir 											sal_uIntPtr &rIdx,
832cdf0e10cSrcweir 											sal_Bool bCopy)>
833cdf0e10cSrcweir 	<sal_Bool SfxOrganizeListBox_Impl::NotifyCopying(SvLBoxEntry *pTarget,
834cdf0e10cSrcweir 											SvLBoxEntry* pSource,
835cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
836cdf0e10cSrcweir 											sal_uIntPtr &rIdx)>
837cdf0e10cSrcweir */
838cdf0e10cSrcweir 
839cdf0e10cSrcweir {
840cdf0e10cSrcweir 	sal_Bool bOk =  sal_False;
841cdf0e10cSrcweir 	SvLBox* pSourceBox = GetSourceView();
842cdf0e10cSrcweir 	if ( !pSourceBox )
843cdf0e10cSrcweir 		pSourceBox = pDlg->pSourceView;
844cdf0e10cSrcweir 	DBG_ASSERT( pSourceBox, "no source view" );
845cdf0e10cSrcweir 	if ( !pTarget )
846cdf0e10cSrcweir 		pTarget = pDlg->pTargetEntry;
847cdf0e10cSrcweir 
848cdf0e10cSrcweir 	if ( pSourceBox->GetModel()->GetDepth( pSource ) <= GetDocLevel() &&
849cdf0e10cSrcweir 		 		     GetModel()->GetDepth( pTarget ) <= GetDocLevel() )
850cdf0e10cSrcweir 		bOk = MoveOrCopyTemplates( pSourceBox, pSource, pTarget, pNewParent, rIdx, sal_False );
851cdf0e10cSrcweir 	else
852cdf0e10cSrcweir 		bOk = MoveOrCopyContents(pSourceBox, pSource, pTarget, pNewParent, rIdx, sal_False );
853cdf0e10cSrcweir 
854cdf0e10cSrcweir 	return bOk;
855cdf0e10cSrcweir }
856cdf0e10cSrcweir 
857cdf0e10cSrcweir //-------------------------------------------------------------------------
858cdf0e10cSrcweir 
NotifyCopying(SvLBoxEntry * pTarget,SvLBoxEntry * pSource,SvLBoxEntry * & pNewParent,sal_uIntPtr & rIdx)859cdf0e10cSrcweir sal_Bool SfxOrganizeListBox_Impl::NotifyCopying(SvLBoxEntry *pTarget,
860cdf0e10cSrcweir 										SvLBoxEntry* pSource,
861cdf0e10cSrcweir 										SvLBoxEntry *&pNewParent,
862cdf0e10cSrcweir 										sal_uIntPtr &rIdx)
863cdf0e10cSrcweir /*  [Beschreibung]
864cdf0e10cSrcweir 
865cdf0e10cSrcweir 	Benachrichtigung, da"s ein Eintrag kopiert werden soll
866cdf0e10cSrcweir 	(SV-Handler)
867cdf0e10cSrcweir 
868cdf0e10cSrcweir 	[Parameter]
869cdf0e10cSrcweir 
870cdf0e10cSrcweir 	SvLBoxEntry* pTarget        Ziel-Eintrag, auf den kopiert werden soll
871cdf0e10cSrcweir 	SvLBoxEntry *pSource        Quell-Eintrag, der kopiert werden soll
872cdf0e10cSrcweir 	SvLBoxEntry *&pNewParent    der Parent der an der Zielposition erzeugten
873cdf0e10cSrcweir 								Eintrags (Out-Parameter)
874cdf0e10cSrcweir 	sal_uIntPtr &rIdx                 Index des Zieleintrags
875cdf0e10cSrcweir 
876cdf0e10cSrcweir 
877cdf0e10cSrcweir 	[Returnwert]                sal_Bool: Erfolg oder Mi"serfolg
878cdf0e10cSrcweir 
879cdf0e10cSrcweir 	[Querverweise]
880cdf0e10cSrcweir 
881cdf0e10cSrcweir 	<SfxOrganizeListBox_Impl::MoveOrCopyTemplates(SvLBox *pSourceBox,
882cdf0e10cSrcweir 											SvLBoxEntry *pSource,
883cdf0e10cSrcweir 											SvLBoxEntry* pTarget,
884cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
885cdf0e10cSrcweir 											sal_uIntPtr &rIdx,
886cdf0e10cSrcweir 											sal_Bool bCopy)>
887cdf0e10cSrcweir 	<SfxOrganizeListBox_Impl::MoveOrCopyContents(SvLBox *pSourceBox,
888cdf0e10cSrcweir 											SvLBoxEntry *pSource,
889cdf0e10cSrcweir 											SvLBoxEntry* pTarget,
890cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
891cdf0e10cSrcweir 											sal_uIntPtr &rIdx,
892cdf0e10cSrcweir 											sal_Bool bCopy)>
893cdf0e10cSrcweir 	<sal_Bool SfxOrganizeListBox_Impl::NotifyMoving(SvLBoxEntry *pTarget,
894cdf0e10cSrcweir 											SvLBoxEntry* pSource,
895cdf0e10cSrcweir 											SvLBoxEntry *&pNewParent,
896cdf0e10cSrcweir 											sal_uIntPtr &rIdx)>
897cdf0e10cSrcweir */
898cdf0e10cSrcweir {
899cdf0e10cSrcweir 	sal_Bool bOk =  sal_False;
900cdf0e10cSrcweir 	SvLBox* pSourceBox = GetSourceView();
901cdf0e10cSrcweir 	if ( !pSourceBox )
902cdf0e10cSrcweir 		pSourceBox = pDlg->pSourceView;
903cdf0e10cSrcweir 	DBG_ASSERT( pSourceBox, "no source view" );
904cdf0e10cSrcweir 	if ( !pTarget )
905cdf0e10cSrcweir 		pTarget = pDlg->pTargetEntry;
906cdf0e10cSrcweir 	if ( pSourceBox->GetModel()->GetDepth( pSource ) <= GetDocLevel() &&
907cdf0e10cSrcweir 					 GetModel()->GetDepth( pTarget ) <= GetDocLevel() )
908cdf0e10cSrcweir 		bOk = MoveOrCopyTemplates( pSourceBox, pSource, pTarget, pNewParent, rIdx, sal_True );
909cdf0e10cSrcweir 	else
910cdf0e10cSrcweir 		bOk = MoveOrCopyContents( pSourceBox, pSource, pTarget, pNewParent, rIdx, sal_True );
911cdf0e10cSrcweir 
912cdf0e10cSrcweir 	return bOk;
913cdf0e10cSrcweir }
914cdf0e10cSrcweir 
915cdf0e10cSrcweir //-------------------------------------------------------------------------
916cdf0e10cSrcweir 
EditingEntry(SvLBoxEntry * pEntry,Selection &)917cdf0e10cSrcweir sal_Bool SfxOrganizeListBox_Impl::EditingEntry( SvLBoxEntry* pEntry, Selection&  )
918cdf0e10cSrcweir 
919cdf0e10cSrcweir /*  [Beschreibung]
920cdf0e10cSrcweir 
921cdf0e10cSrcweir 	Nachfrage, ob ein Eintrag editierbar ist
922cdf0e10cSrcweir 	(SV-Handler)
923cdf0e10cSrcweir 
924cdf0e10cSrcweir 	[Querverweise]
925cdf0e10cSrcweir 	<SfxOrganizeListBox_Impl::EditedEntry(SvLBoxEntry* pEntry, const String& rText)>
926cdf0e10cSrcweir */
927cdf0e10cSrcweir 
928cdf0e10cSrcweir {
929cdf0e10cSrcweir 	if( VIEW_TEMPLATES == eViewType &&
930cdf0e10cSrcweir         GetModel()->GetDepth(pEntry) < 2 )
931cdf0e10cSrcweir 	{
932cdf0e10cSrcweir 		pDlg->pSuspend = new SuspendAccel( &pDlg->aEditAcc );
933cdf0e10cSrcweir 		return sal_True;
934cdf0e10cSrcweir 	}
935cdf0e10cSrcweir 	return sal_False;
936cdf0e10cSrcweir }
937cdf0e10cSrcweir 
938cdf0e10cSrcweir //-------------------------------------------------------------------------
939cdf0e10cSrcweir 
EditedEntry(SvLBoxEntry * pEntry,const String & rText)940cdf0e10cSrcweir sal_Bool SfxOrganizeListBox_Impl::EditedEntry(SvLBoxEntry* pEntry, const String& rText)
941cdf0e10cSrcweir 
942cdf0e10cSrcweir /*  [Beschreibung]
943cdf0e10cSrcweir 
944cdf0e10cSrcweir 	Der Name eines Eintrags wurde bearbeitet; ist der eingegebene Name
945cdf0e10cSrcweir 	ein g"ultiger Name ("ange > 0), wird das Model aktualisiert.
946cdf0e10cSrcweir 	(SV-Handler)
947cdf0e10cSrcweir 
948cdf0e10cSrcweir 	[Returnwert]
949cdf0e10cSrcweir 
950cdf0e10cSrcweir 	sal_Bool                sal_True: der Name soll in der Anzeige ge"andert werden
951cdf0e10cSrcweir 						    sal_False:der Name soll nicht ge"andert werden
952cdf0e10cSrcweir 
953cdf0e10cSrcweir 	[Querverweise]
954cdf0e10cSrcweir 	<SfxOrganizeListBox_Impl::EditingEntry(SvLBoxEntry* pEntry, const String& rText)>
955cdf0e10cSrcweir */
956cdf0e10cSrcweir 
957cdf0e10cSrcweir {
958cdf0e10cSrcweir 	DBG_ASSERT(pEntry, "kein Entry selektiert");
959cdf0e10cSrcweir 	delete pDlg->pSuspend;
960cdf0e10cSrcweir 	pDlg->pSuspend = NULL;
961cdf0e10cSrcweir 	SvLBoxEntry* pParent = GetParent(pEntry);
962cdf0e10cSrcweir 	if( !rText.Len() )
963cdf0e10cSrcweir 	{
964cdf0e10cSrcweir 		ErrorBox aBox( this, SfxResId( MSG_ERROR_EMPTY_NAME ) );
965cdf0e10cSrcweir 		aBox.GrabFocus();
966cdf0e10cSrcweir 		aBox.Execute();
967cdf0e10cSrcweir 		return sal_False;
968cdf0e10cSrcweir 	}
969cdf0e10cSrcweir 	if ( !IsUniqName_Impl( rText, pParent, pEntry ) )
970cdf0e10cSrcweir 	{
971cdf0e10cSrcweir 		ErrorBox aBox( this, SfxResId( MSG_ERROR_UNIQ_NAME ) );
972cdf0e10cSrcweir 		aBox.GrabFocus();
973cdf0e10cSrcweir 		aBox.Execute();
974cdf0e10cSrcweir 		return sal_False;
975cdf0e10cSrcweir 	}
976cdf0e10cSrcweir 	sal_uInt16 nRegion = 0, nIndex = 0;
977cdf0e10cSrcweir 	GetIndices_Impl( this, pEntry, nRegion, nIndex );
978cdf0e10cSrcweir 	String aOldName;
979cdf0e10cSrcweir 	if ( USHRT_MAX != nIndex )
980cdf0e10cSrcweir 		aOldName = pMgr->GetTemplates()->GetName( nRegion, nIndex );
981cdf0e10cSrcweir 	else
982cdf0e10cSrcweir 		aOldName = pMgr->GetTemplates()->GetRegionName( nRegion );
983cdf0e10cSrcweir 
984cdf0e10cSrcweir 	if ( !pMgr->SetName( rText, nRegion, nIndex ) )
985cdf0e10cSrcweir 	{
986cdf0e10cSrcweir 		SfxResId aResId( USHRT_MAX != nIndex ? MSG_ERROR_RENAME_TEMPLATE
987cdf0e10cSrcweir 											 : MSG_ERROR_RENAME_TEMPLATE_REGION );
988cdf0e10cSrcweir 		ErrorBox( this, aResId ).Execute();
989cdf0e10cSrcweir 		return sal_False;
990cdf0e10cSrcweir 	}
991cdf0e10cSrcweir /*
992cdf0e10cSrcweir 	else
993cdf0e10cSrcweir 	{
994cdf0e10cSrcweir 		SfxTemplateOrganizeDlg* pDlg = (SfxTemplateOrganizeDlg*)Window::GetParent();
995cdf0e10cSrcweir 	}
996cdf0e10cSrcweir */
997cdf0e10cSrcweir 	return sal_True;
998cdf0e10cSrcweir }
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir //-------------------------------------------------------------------------
1001cdf0e10cSrcweir 
NotifyStartDrag(TransferDataContainer &,SvLBoxEntry * pEntry)1002cdf0e10cSrcweir DragDropMode SfxOrganizeListBox_Impl::NotifyStartDrag( TransferDataContainer&, SvLBoxEntry* pEntry )
1003cdf0e10cSrcweir {
1004cdf0e10cSrcweir 	sal_uInt16 nSourceLevel = GetModel()->GetDepth( pEntry );
1005cdf0e10cSrcweir 	if ( VIEW_FILES == GetViewType() )
1006cdf0e10cSrcweir 		++nSourceLevel;
1007cdf0e10cSrcweir 	if ( nSourceLevel >= 2 )
1008cdf0e10cSrcweir 		bDropMoveOk = sal_False;
1009cdf0e10cSrcweir 	else
1010cdf0e10cSrcweir 		bDropMoveOk = sal_True;
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir 	return GetDragDropMode();
1013cdf0e10cSrcweir }
1014cdf0e10cSrcweir 
1015cdf0e10cSrcweir //-------------------------------------------------------------------------
1016cdf0e10cSrcweir 
NotifyAcceptDrop(SvLBoxEntry * pEntry)1017cdf0e10cSrcweir sal_Bool SfxOrganizeListBox_Impl::NotifyAcceptDrop( SvLBoxEntry* pEntry )
1018cdf0e10cSrcweir {
1019cdf0e10cSrcweir 	if(!pEntry)
1020cdf0e10cSrcweir 		return sal_False;
1021cdf0e10cSrcweir 	SvLBox *pSource = GetSourceView();
1022cdf0e10cSrcweir 	SvLBoxEntry *pSourceEntry = pSource->FirstSelected();
1023cdf0e10cSrcweir 	if(pEntry == pSourceEntry)
1024cdf0e10cSrcweir 		return sal_False;
1025cdf0e10cSrcweir 	sal_uInt16 nSourceLevel = pSource->GetModel()->GetDepth(pSourceEntry);
1026cdf0e10cSrcweir 	if(VIEW_FILES == ((SfxOrganizeListBox_Impl *)pSource)->GetViewType())
1027cdf0e10cSrcweir 		++nSourceLevel;
1028cdf0e10cSrcweir 	sal_uInt16 nTargetLevel = GetModel()->GetDepth(pEntry);
1029cdf0e10cSrcweir 	if(VIEW_FILES == GetViewType())
1030cdf0e10cSrcweir 		++nTargetLevel;
1031cdf0e10cSrcweir 	Path aSource(pSource, pSourceEntry);
1032cdf0e10cSrcweir 	Path aTarget(this, pEntry);
1033cdf0e10cSrcweir 	const sal_uInt16 SL = ((SfxOrganizeListBox_Impl *)pSource)->GetDocLevel();
1034cdf0e10cSrcweir 	const sal_uInt16 TL = GetDocLevel();
1035cdf0e10cSrcweir 
1036cdf0e10cSrcweir 	return( (nSourceLevel == 1 && nTargetLevel == 0 &&
1037cdf0e10cSrcweir 			VIEW_TEMPLATES ==
1038cdf0e10cSrcweir 			((SfxOrganizeListBox_Impl *)pSource)->GetViewType()) ||
1039cdf0e10cSrcweir 		   (nSourceLevel == 1 && nTargetLevel == 1 &&
1040cdf0e10cSrcweir 			VIEW_TEMPLATES ==
1041cdf0e10cSrcweir 			((SfxOrganizeListBox_Impl *)pSource)->GetViewType() &&
1042cdf0e10cSrcweir 			VIEW_TEMPLATES == GetViewType()) ||
1043cdf0e10cSrcweir 		   (nSourceLevel == 3 && nTargetLevel == 1) ||
1044cdf0e10cSrcweir 		   (nSourceLevel == 3 && nTargetLevel == 2 &&
1045cdf0e10cSrcweir 			aSource[1+SL] == aTarget[1+TL]) ||
1046cdf0e10cSrcweir 		   (nSourceLevel == 3 && nTargetLevel == 3 &&
1047cdf0e10cSrcweir 			aSource[1+SL] == aTarget[1+TL]) ||
1048cdf0e10cSrcweir 		   (nSourceLevel == 4 && nTargetLevel == 3 &&
1049cdf0e10cSrcweir 			aSource[1+SL] == aTarget[1+TL] &&
1050cdf0e10cSrcweir 			aSource[2+SL] == aTarget[2+TL]) ||
1051cdf0e10cSrcweir 		   (nSourceLevel == 4 && nTargetLevel == 4 &&
1052cdf0e10cSrcweir 			aSource[1+SL] == aTarget[1+TL] &&
1053cdf0e10cSrcweir 			aSource[2+SL] == aTarget[2+TL]));
1054cdf0e10cSrcweir }
1055cdf0e10cSrcweir 
1056cdf0e10cSrcweir //-------------------------------------------------------------------------
1057cdf0e10cSrcweir 
AcceptDrop(const AcceptDropEvent & rEvt)1058cdf0e10cSrcweir sal_Int8 SfxOrganizeListBox_Impl::AcceptDrop( const AcceptDropEvent& rEvt )
1059cdf0e10cSrcweir {
1060cdf0e10cSrcweir 	sal_Bool bAccept = ( eViewType == VIEW_FILES && IsDropFormatSupported( SOT_FORMAT_FILE ) );
1061cdf0e10cSrcweir 	if ( bAccept )
1062cdf0e10cSrcweir 		return rEvt.mnAction;
1063cdf0e10cSrcweir 	else
1064cdf0e10cSrcweir 		return SvTreeListBox::AcceptDrop( rEvt );
1065cdf0e10cSrcweir }
1066cdf0e10cSrcweir 
1067cdf0e10cSrcweir //-------------------------------------------------------------------------
1068cdf0e10cSrcweir 
ExecuteDrop(const ExecuteDropEvent & rEvt)1069cdf0e10cSrcweir sal_Int8 SfxOrganizeListBox_Impl::ExecuteDrop( const ExecuteDropEvent& rEvt )
1070cdf0e10cSrcweir {
1071cdf0e10cSrcweir 	TransferableDataHelper aHelper( rEvt.maDropEvent.Transferable );
1072cdf0e10cSrcweir 	sal_uInt32 nFormatCount = aHelper.GetFormatCount();
1073cdf0e10cSrcweir 	sal_Bool bSuccess = sal_False;
1074cdf0e10cSrcweir 	for ( sal_uInt32 i = 0; i < nFormatCount; ++i )
1075cdf0e10cSrcweir 	{
1076cdf0e10cSrcweir 		String aFileName;
1077cdf0e10cSrcweir 		SotFormatStringId nId = aHelper.GetFormat(i);
1078cdf0e10cSrcweir 
1079cdf0e10cSrcweir 		if ( SOT_FORMAT_FILE == nId && aHelper.GetString( nId, aFileName ) )
1080cdf0e10cSrcweir 		{
1081cdf0e10cSrcweir 			INetURLObject aObj( aFileName, INET_PROT_FILE );
1082cdf0e10cSrcweir 			bSuccess |= pMgr->InsertFile( this, aObj.GetMainURL(INetURLObject::DECODE_TO_IURI) );
1083cdf0e10cSrcweir 		}
1084cdf0e10cSrcweir 	}
1085cdf0e10cSrcweir 	bDropMoveOk = sal_True;
1086cdf0e10cSrcweir 	sal_Int8 nRet = rEvt.mnAction;
1087cdf0e10cSrcweir 	if ( !bSuccess )
1088cdf0e10cSrcweir 	{
1089cdf0e10cSrcweir 		// asynchronous, because of MessBoxes
1090cdf0e10cSrcweir 		pDlg->pSourceView = GetSourceView();
1091cdf0e10cSrcweir 		pDlg->pTargetEntry = pTargetEntry;
1092cdf0e10cSrcweir         pDlg->pFinishedBox = NULL;
1093cdf0e10cSrcweir         pDlg->nDropAction = NO_DROP_ACTION;
1094cdf0e10cSrcweir 		PostUserEvent( LINK( this, SfxOrganizeListBox_Impl, OnAsyncExecuteDrop ),
1095cdf0e10cSrcweir 					   new ExecuteDropEvent( rEvt ) );
1096cdf0e10cSrcweir 	}
1097cdf0e10cSrcweir 
1098cdf0e10cSrcweir 	return nRet;
1099cdf0e10cSrcweir }
1100cdf0e10cSrcweir 
1101cdf0e10cSrcweir //-------------------------------------------------------------------------
1102cdf0e10cSrcweir 
DragFinished(sal_Int8 nDropAction)1103cdf0e10cSrcweir void SfxOrganizeListBox_Impl::DragFinished( sal_Int8 nDropAction )
1104cdf0e10cSrcweir {
1105cdf0e10cSrcweir     if ( pDlg->bExecDropFinished )
1106cdf0e10cSrcweir     {
1107cdf0e10cSrcweir         if ( pDlg->nDropAction != NO_DROP_ACTION )
1108cdf0e10cSrcweir             nDropAction = pDlg->nDropAction;
1109cdf0e10cSrcweir         SvTreeListBox::DragFinished( nDropAction );
1110cdf0e10cSrcweir         pDlg->nDropAction = NO_DROP_ACTION;
1111cdf0e10cSrcweir     }
1112cdf0e10cSrcweir     else
1113cdf0e10cSrcweir         pDlg->pFinishedBox = this;
1114cdf0e10cSrcweir }
1115cdf0e10cSrcweir 
1116cdf0e10cSrcweir //-------------------------------------------------------------------------
1117cdf0e10cSrcweir 
GetDocLevel() const1118cdf0e10cSrcweir inline sal_uInt16 SfxOrganizeListBox_Impl::GetDocLevel() const
1119cdf0e10cSrcweir 
1120cdf0e10cSrcweir /*  [Beschreibung]
1121cdf0e10cSrcweir 
1122cdf0e10cSrcweir 	Ermittelt, auf welche Ebene sich Dokumente befinden (unterschiedlich
1123cdf0e10cSrcweir 	in der Dokumentvorlagensicht und der Dokumentensicht)
1124cdf0e10cSrcweir 
1125cdf0e10cSrcweir 	[Returnwert]
1126cdf0e10cSrcweir 
1127cdf0e10cSrcweir 	sal_uInt16              Die Ebene der Dokumente
1128cdf0e10cSrcweir 
1129cdf0e10cSrcweir */
1130cdf0e10cSrcweir 
1131cdf0e10cSrcweir {
1132cdf0e10cSrcweir 	return eViewType == VIEW_FILES? 0: 1;
1133cdf0e10cSrcweir }
1134cdf0e10cSrcweir 
1135cdf0e10cSrcweir //-------------------------------------------------------------------------
1136cdf0e10cSrcweir 
GetObjectShell(const Path & rPath)1137cdf0e10cSrcweir SfxObjectShellRef SfxOrganizeListBox_Impl::GetObjectShell(const Path &rPath)
1138cdf0e10cSrcweir 
1139cdf0e10cSrcweir /*  [Beschreibung]
1140cdf0e10cSrcweir 
1141cdf0e10cSrcweir 	Zugriff auf die ObjectShell, die dem aktuellen Eintrag zugeordnet
1142cdf0e10cSrcweir 	ist.
1143cdf0e10cSrcweir 
1144cdf0e10cSrcweir 	[Parameter]
1145cdf0e10cSrcweir 
1146cdf0e10cSrcweir 	const Path &rPath       Beschreibung des aktuellen Eintrags
1147cdf0e10cSrcweir 
1148cdf0e10cSrcweir 	[Returnwert]
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir 	SfxObjectShellRef     Referenz auf die ObjectShell
1151cdf0e10cSrcweir 
1152cdf0e10cSrcweir 	[Querverweise]
1153cdf0e10cSrcweir 
1154cdf0e10cSrcweir 	<class Path>
1155cdf0e10cSrcweir 
1156cdf0e10cSrcweir */
1157cdf0e10cSrcweir 
1158cdf0e10cSrcweir {
1159cdf0e10cSrcweir 	SfxObjectShellRef aDoc;
1160cdf0e10cSrcweir 	if(eViewType == VIEW_FILES)
1161cdf0e10cSrcweir 		aDoc = pMgr->CreateObjectShell(rPath[0]);
1162cdf0e10cSrcweir 	else
1163cdf0e10cSrcweir 		aDoc = pMgr->CreateObjectShell(rPath[0], rPath[1]);
1164cdf0e10cSrcweir 	return aDoc;
1165cdf0e10cSrcweir }
1166cdf0e10cSrcweir 
1167cdf0e10cSrcweir //-------------------------------------------------------------------------
1168cdf0e10cSrcweir 
RequestingChilds(SvLBoxEntry * pEntry)1169cdf0e10cSrcweir void SfxOrganizeListBox_Impl::RequestingChilds( SvLBoxEntry* pEntry )
1170cdf0e10cSrcweir 
1171cdf0e10cSrcweir /*  [Beschreibung]
1172cdf0e10cSrcweir 
1173cdf0e10cSrcweir 	Aufforderung, der Childs eines Eintrags einzuf"ugen
1174cdf0e10cSrcweir 	ist.
1175cdf0e10cSrcweir 	(SV-Handler)
1176cdf0e10cSrcweir 
1177cdf0e10cSrcweir 	[Parameter]
1178cdf0e10cSrcweir 
1179cdf0e10cSrcweir 	SvLBoxEntry* pEntry     der Eintrag, dessen Childs erfragt werden
1180cdf0e10cSrcweir 
1181cdf0e10cSrcweir 
1182cdf0e10cSrcweir */
1183cdf0e10cSrcweir 
1184cdf0e10cSrcweir {
1185cdf0e10cSrcweir 	// wenn keine Childs vorhanden sind, gfs. Childs
1186cdf0e10cSrcweir 	// einfuegen
1187cdf0e10cSrcweir 	BmpColorMode eColorMode = BMP_COLOR_NORMAL;
1188cdf0e10cSrcweir 
1189cdf0e10cSrcweir 	if ( GetSettings().GetStyleSettings().GetHighContrastMode() )
1190cdf0e10cSrcweir 		eColorMode = BMP_COLOR_HIGHCONTRAST;
1191cdf0e10cSrcweir 
1192cdf0e10cSrcweir 
1193cdf0e10cSrcweir 	if ( !GetModel()->HasChilds( pEntry ) )
1194cdf0e10cSrcweir 	{
1195cdf0e10cSrcweir 		WaitObject aWaitCursor( this );
1196cdf0e10cSrcweir 
1197cdf0e10cSrcweir 		// Choose the correct mask color dependent from eColorMode. This must be adopted if
1198cdf0e10cSrcweir 		// we change the mask color for normal images, too!
1199cdf0e10cSrcweir 		Color aMaskColor( COL_LIGHTMAGENTA );
1200cdf0e10cSrcweir 
1201cdf0e10cSrcweir 		// hier sind alle initial eingefuegt
1202cdf0e10cSrcweir 		SfxErrorContext aEc(ERRCTX_SFX_CREATEOBJSH, pDlg->pDialog);
1203cdf0e10cSrcweir 		if(VIEW_TEMPLATES == GetViewType() && 0 == GetModel()->GetDepth(pEntry))
1204cdf0e10cSrcweir 		{
1205cdf0e10cSrcweir 			sal_uInt16 i = (sal_uInt16)GetModel()->GetRelPos(pEntry);
1206cdf0e10cSrcweir 			const sal_uInt16 nEntryCount = pMgr->GetTemplates()->GetCount(i);
1207cdf0e10cSrcweir 			for(sal_uInt16 j = 0; j < nEntryCount; ++j)
1208cdf0e10cSrcweir 				InsertEntryByBmpType( pMgr->GetTemplates()->GetName( i, j ), BMPTYPE_DOC, pEntry, sal_True );
1209cdf0e10cSrcweir 		}
1210cdf0e10cSrcweir 		else
1211cdf0e10cSrcweir 		{
1212cdf0e10cSrcweir 			const sal_uInt16 nDocLevel = GetDocLevel();
1213cdf0e10cSrcweir 			Path aPath(this, pEntry);
1214cdf0e10cSrcweir 
1215cdf0e10cSrcweir             // it is ok to use the SfxObjectShellRef here since the object that
1216cdf0e10cSrcweir             // provides it ( GetObjectShell() calls CreateObjectShell() ) has a lock on it
1217cdf0e10cSrcweir 			SfxObjectShellRef aRef = GetObjectShell(aPath);
1218cdf0e10cSrcweir 			if(aRef.Is())
1219cdf0e10cSrcweir 			{
1220cdf0e10cSrcweir 				const sal_uInt16 nCount = aRef->GetContentCount(
1221cdf0e10cSrcweir 					aPath[nDocLevel+1], aPath[nDocLevel+2]);
1222cdf0e10cSrcweir 				String aText;
1223cdf0e10cSrcweir 				Bitmap aClosedBmp, aOpenedBmp;
1224cdf0e10cSrcweir 				const sal_Bool bCanHaveChilds =
1225cdf0e10cSrcweir 					aRef->CanHaveChilds(aPath[nDocLevel+1],
1226cdf0e10cSrcweir 										aPath[nDocLevel+2]);
1227cdf0e10cSrcweir 				for(sal_uInt16 i = 0; i < nCount; ++i)
1228cdf0e10cSrcweir 				{
1229cdf0e10cSrcweir 					sal_Bool bDeletable;
1230cdf0e10cSrcweir 					aRef->GetContent(
1231cdf0e10cSrcweir 						aText, aClosedBmp, aOpenedBmp, eColorMode, bDeletable,
1232cdf0e10cSrcweir 						i, aPath[nDocLevel+1], aPath[nDocLevel+2]);
1233cdf0e10cSrcweir 
1234cdf0e10cSrcweir 					// Create image with the correct mask color
1235cdf0e10cSrcweir 					Image aClosedImage( aClosedBmp, aMaskColor );
1236cdf0e10cSrcweir 					Image aOpenedImage( aOpenedBmp, aMaskColor );
1237cdf0e10cSrcweir 
1238cdf0e10cSrcweir 					SvLBoxEntry *pNew = SvTreeListBox::InsertEntry(
1239cdf0e10cSrcweir 						aText, aOpenedImage, aClosedImage,
1240cdf0e10cSrcweir 						pEntry, bCanHaveChilds);
1241cdf0e10cSrcweir 					pNew->SetUserData(bDeletable ? &bDeletable : 0);
1242cdf0e10cSrcweir 				}
1243cdf0e10cSrcweir 			}
1244cdf0e10cSrcweir 		}
1245cdf0e10cSrcweir 	}
1246cdf0e10cSrcweir }
1247cdf0e10cSrcweir 
1248cdf0e10cSrcweir //-------------------------------------------------------------------------
1249cdf0e10cSrcweir 
ExpandingHdl()1250cdf0e10cSrcweir long SfxOrganizeListBox_Impl::ExpandingHdl()
1251cdf0e10cSrcweir 
1252cdf0e10cSrcweir /*  [Beschreibung]
1253cdf0e10cSrcweir 
1254cdf0e10cSrcweir 	SV-Handler, der nach dem und vor dem Aufklappen eines Eintrags
1255cdf0e10cSrcweir 	gerufen wird.
1256cdf0e10cSrcweir 	Wird verwendet, um gfs. die ObjectShell wieder zu schlie"sen;
1257cdf0e10cSrcweir 	die Eintr"age mit den Inhalten dieser Shell werden ebenfalls
1258cdf0e10cSrcweir 	entfernt.
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir */
1261cdf0e10cSrcweir 
1262cdf0e10cSrcweir {
1263cdf0e10cSrcweir 	if ( !(nImpFlags & SVLBOX_IS_EXPANDING) )
1264cdf0e10cSrcweir 	{
1265cdf0e10cSrcweir 		SvLBoxEntry* pEntry  = GetHdlEntry();
1266cdf0e10cSrcweir 		const sal_uInt16 nLevel = GetModel()->GetDepth(pEntry);
1267cdf0e10cSrcweir 		if((eViewType == VIEW_FILES && nLevel == 0) ||
1268cdf0e10cSrcweir 		   (eViewType == VIEW_TEMPLATES && nLevel == 1))
1269cdf0e10cSrcweir 		{
1270cdf0e10cSrcweir 			Path aPath(this, pEntry);
1271cdf0e10cSrcweir 			// Beim Schliessen des Files die ObjectShell freigeben
1272cdf0e10cSrcweir 			if(eViewType == VIEW_FILES && nLevel == 0)
1273cdf0e10cSrcweir 				pMgr->DeleteObjectShell(aPath[0]);
1274cdf0e10cSrcweir 			else
1275cdf0e10cSrcweir 				pMgr->DeleteObjectShell(aPath[0], aPath[1]);
1276cdf0e10cSrcweir 			// alle SubEntries loeschen
1277cdf0e10cSrcweir 			SvLBoxEntry *pToDel = SvLBox::GetEntry(pEntry, 0);
1278cdf0e10cSrcweir 			while(pToDel)
1279cdf0e10cSrcweir 			{
1280cdf0e10cSrcweir 				GetModel()->Remove(pToDel);
1281cdf0e10cSrcweir 				pToDel = SvLBox::GetEntry(pEntry, 0);
1282cdf0e10cSrcweir 			}
1283cdf0e10cSrcweir 		}
1284cdf0e10cSrcweir 	}
1285cdf0e10cSrcweir 	return sal_True;
1286cdf0e10cSrcweir }
1287cdf0e10cSrcweir 
1288cdf0e10cSrcweir //-------------------------------------------------------------------------
1289cdf0e10cSrcweir 
IsUniqName_Impl(const String & rText,SvLBoxEntry * pParent,SvLBoxEntry * pEntry) const1290cdf0e10cSrcweir sal_Bool SfxOrganizeListBox_Impl::IsUniqName_Impl(const String &rText,
1291cdf0e10cSrcweir 										 SvLBoxEntry* pParent, SvLBoxEntry *pEntry) const
1292cdf0e10cSrcweir 
1293cdf0e10cSrcweir /*  [Beschreibung]
1294cdf0e10cSrcweir 
1295cdf0e10cSrcweir 	Pr"uft, ob eine Name auf seiner Ebene eindeutig ist.
1296cdf0e10cSrcweir 
1297cdf0e10cSrcweir 	[Parameter]
1298cdf0e10cSrcweir 
1299cdf0e10cSrcweir 	const String &         Name des zu suchenden Eintrags
1300cdf0e10cSrcweir 	SvLBoxEntry* pSibling  Geschwister (bezeichnet die Ebene)
1301cdf0e10cSrcweir 
1302cdf0e10cSrcweir 	[Returnwert]
1303cdf0e10cSrcweir 
1304cdf0e10cSrcweir 	sal_Bool                     sal_True, wenn der Name eindeutig ist, sonst sal_False
1305cdf0e10cSrcweir */
1306cdf0e10cSrcweir 
1307cdf0e10cSrcweir {
1308cdf0e10cSrcweir 	SvLBoxEntry* pChild = FirstChild(pParent);
1309cdf0e10cSrcweir 	while(pChild)  {
1310cdf0e10cSrcweir 		const String aEntryText(GetEntryText(pChild));
1311cdf0e10cSrcweir 		if(COMPARE_EQUAL == aEntryText.CompareIgnoreCaseToAscii(rText)&&(!pEntry || pEntry!=pChild))
1312cdf0e10cSrcweir 			return sal_False;
1313cdf0e10cSrcweir 		pChild = NextSibling(pChild);
1314cdf0e10cSrcweir 	}
1315cdf0e10cSrcweir 	return sal_True;
1316cdf0e10cSrcweir }
1317cdf0e10cSrcweir 
1318cdf0e10cSrcweir //-------------------------------------------------------------------------
1319cdf0e10cSrcweir 
GetLevelCount_Impl(SvLBoxEntry * pParent) const1320cdf0e10cSrcweir sal_uInt16 SfxOrganizeListBox_Impl::GetLevelCount_Impl(SvLBoxEntry* pParent) const
1321cdf0e10cSrcweir {
1322cdf0e10cSrcweir 	SvLBoxEntry* pChild = FirstChild(pParent);
1323cdf0e10cSrcweir 	sal_uInt16 nCount = 0;
1324cdf0e10cSrcweir 	while(pChild)  {
1325cdf0e10cSrcweir 		pChild = NextSibling(pChild);
1326cdf0e10cSrcweir 		++nCount;
1327cdf0e10cSrcweir 	}
1328cdf0e10cSrcweir 	return nCount;
1329cdf0e10cSrcweir }
1330cdf0e10cSrcweir 
1331cdf0e10cSrcweir //-------------------------------------------------------------------------
1332cdf0e10cSrcweir 
InsertEntryByBmpType(const XubString & rText,BMPTYPE eBmpType,SvLBoxEntry * pParent,sal_Bool bChildsOnDemand,sal_uIntPtr nPos,void * pUserData)1333cdf0e10cSrcweir SvLBoxEntry* SfxOrganizeListBox_Impl::InsertEntryByBmpType( const XubString& rText, BMPTYPE eBmpType,
1334cdf0e10cSrcweir 	SvLBoxEntry* pParent, sal_Bool bChildsOnDemand, sal_uIntPtr nPos, void* pUserData )
1335cdf0e10cSrcweir {
1336cdf0e10cSrcweir 	SvLBoxEntry*	pEntry = NULL;
1337cdf0e10cSrcweir 	const Image*	pExp = NULL;
1338cdf0e10cSrcweir 	const Image*	pCol = NULL;
1339cdf0e10cSrcweir 	const Image*	pExpHC = NULL;
1340cdf0e10cSrcweir 	const Image*	pColHC = NULL;
1341cdf0e10cSrcweir 
1342cdf0e10cSrcweir 	switch( eBmpType )
1343cdf0e10cSrcweir 	{
1344cdf0e10cSrcweir 		case BMPTYPE_FOLDER:
1345cdf0e10cSrcweir 			pExp = &aOpenedFolderBmp;
1346cdf0e10cSrcweir 			pCol = &aClosedFolderBmp;
1347cdf0e10cSrcweir 			pExpHC = &aOpenedFolderBmpHC;
1348cdf0e10cSrcweir 			pColHC = &aClosedFolderBmpHC;
1349cdf0e10cSrcweir 			break;
1350cdf0e10cSrcweir 		default:
1351cdf0e10cSrcweir 			DBG_ERROR( "SfxOrganizeListBox_Impl::InsertEntryByBmpType(): something forgotten?!" );
1352cdf0e10cSrcweir 
1353cdf0e10cSrcweir 		case BMPTYPE_DOC:
1354cdf0e10cSrcweir 			pExp = &aOpenedDocBmp;
1355cdf0e10cSrcweir 			pCol = &aClosedDocBmp;
1356cdf0e10cSrcweir 			pExpHC = &aOpenedDocBmpHC;
1357cdf0e10cSrcweir 			pColHC = &aClosedDocBmpHC;
1358cdf0e10cSrcweir 			break;
1359cdf0e10cSrcweir 	}
1360cdf0e10cSrcweir 
1361cdf0e10cSrcweir 	pEntry = SvTreeListBox::InsertEntry( rText, *pExp, *pCol, pParent, bChildsOnDemand, nPos, pUserData );
1362cdf0e10cSrcweir 
1363cdf0e10cSrcweir 	SetExpandedEntryBmp( pEntry, *pExpHC, BMP_COLOR_HIGHCONTRAST );
1364cdf0e10cSrcweir 	SetCollapsedEntryBmp( pEntry, *pColHC, BMP_COLOR_HIGHCONTRAST );
1365cdf0e10cSrcweir 
1366cdf0e10cSrcweir 	return pEntry;
1367cdf0e10cSrcweir }
1368cdf0e10cSrcweir 
1369cdf0e10cSrcweir //-------------------------------------------------------------------------
1370cdf0e10cSrcweir 
SfxOrganizeListBox_Impl(SfxOrganizeDlg_Impl * pArgDlg,Window * pParent,WinBits nBits,DataEnum eType)1371cdf0e10cSrcweir SfxOrganizeListBox_Impl::SfxOrganizeListBox_Impl
1372cdf0e10cSrcweir (
1373cdf0e10cSrcweir 	SfxOrganizeDlg_Impl* pArgDlg,
1374cdf0e10cSrcweir 	Window* pParent,
1375cdf0e10cSrcweir 	WinBits nBits,
1376cdf0e10cSrcweir 	DataEnum eType
1377cdf0e10cSrcweir ) :
1378cdf0e10cSrcweir 
1379cdf0e10cSrcweir 	SvTreeListBox( pParent, nBits ),
1380cdf0e10cSrcweir 
1381cdf0e10cSrcweir 	pMgr		( NULL ),
1382cdf0e10cSrcweir 	pDlg		( pArgDlg ),
1383cdf0e10cSrcweir 	eViewType	( eType )
1384cdf0e10cSrcweir 
1385cdf0e10cSrcweir /*  [Beschreibung]
1386cdf0e10cSrcweir 
1387cdf0e10cSrcweir 	Konstruktor SfxOrganizeListBox
1388cdf0e10cSrcweir 
1389cdf0e10cSrcweir */
1390cdf0e10cSrcweir 
1391cdf0e10cSrcweir {
1392cdf0e10cSrcweir 	SetDragDropMode(
1393cdf0e10cSrcweir 		SV_DRAGDROP_CTRL_MOVE | SV_DRAGDROP_CTRL_COPY |
1394cdf0e10cSrcweir 		SV_DRAGDROP_APP_MOVE  | SV_DRAGDROP_APP_COPY  | SV_DRAGDROP_APP_DROP );
1395cdf0e10cSrcweir 	SetEntryHeight( 16 );
1396cdf0e10cSrcweir 	SetSelectionMode( SINGLE_SELECTION );
1397cdf0e10cSrcweir     GetModel()->SetSortMode( SortNone );
1398cdf0e10cSrcweir 
1399cdf0e10cSrcweir 	EnableContextMenuHandling();
1400cdf0e10cSrcweir }
1401cdf0e10cSrcweir 
1402cdf0e10cSrcweir //-------------------------------------------------------------------------
1403cdf0e10cSrcweir 
IMPL_LINK(SfxOrganizeListBox_Impl,OnAsyncExecuteDrop,ExecuteDropEvent *,pEvent)1404cdf0e10cSrcweir IMPL_LINK( SfxOrganizeListBox_Impl, OnAsyncExecuteDrop, ExecuteDropEvent*, pEvent )
1405cdf0e10cSrcweir {
1406cdf0e10cSrcweir 	DBG_ASSERT( pEvent, "invalid DropEvent" );
1407cdf0e10cSrcweir 	if ( pEvent )
1408cdf0e10cSrcweir 	{
1409cdf0e10cSrcweir 		SvLBox* pSourceView = GetSourceView();
1410cdf0e10cSrcweir 		if ( !pSourceView )
1411cdf0e10cSrcweir 			pSourceView = pDlg->pSourceView;
1412cdf0e10cSrcweir         pDlg->bExecDropFinished = false;
1413cdf0e10cSrcweir 		// if a template can not be moved it should be copied
1414cdf0e10cSrcweir 		if ( pEvent->mnAction == DND_ACTION_MOVE )
1415cdf0e10cSrcweir 			pEvent->mnAction = DND_ACTION_COPYMOVE;
1416cdf0e10cSrcweir         pDlg->nDropAction = SvTreeListBox::ExecuteDrop( *pEvent, pSourceView );
1417cdf0e10cSrcweir 		delete pEvent;
1418cdf0e10cSrcweir 		pDlg->pSourceView = NULL;
1419cdf0e10cSrcweir 		pDlg->pTargetEntry = NULL;
1420cdf0e10cSrcweir         pDlg->bExecDropFinished = true;
1421cdf0e10cSrcweir         if ( pDlg->pFinishedBox )
1422cdf0e10cSrcweir         {
1423cdf0e10cSrcweir             pDlg->pFinishedBox->DragFinished( pDlg->nDropAction );
1424cdf0e10cSrcweir             pDlg->pFinishedBox = NULL;
1425cdf0e10cSrcweir         }
1426cdf0e10cSrcweir 	}
1427cdf0e10cSrcweir 	return 0;
1428cdf0e10cSrcweir }
1429cdf0e10cSrcweir 
1430cdf0e10cSrcweir //-------------------------------------------------------------------------
1431cdf0e10cSrcweir 
Reset()1432cdf0e10cSrcweir void SfxOrganizeListBox_Impl::Reset()
1433cdf0e10cSrcweir 
1434cdf0e10cSrcweir /*  [Beschreibung]
1435cdf0e10cSrcweir 
1436cdf0e10cSrcweir 	Einf"ugen der Elemente in die ListBox
1437cdf0e10cSrcweir 
1438cdf0e10cSrcweir */
1439cdf0e10cSrcweir 
1440cdf0e10cSrcweir {
1441cdf0e10cSrcweir 	DBG_ASSERT( pMgr != 0, "kein Manager" );
1442cdf0e10cSrcweir 	// Inhalte l"oschen
1443cdf0e10cSrcweir 	SetUpdateMode(sal_False);
1444cdf0e10cSrcweir 	Clear();
1445cdf0e10cSrcweir 	if ( VIEW_TEMPLATES == eViewType )
1446cdf0e10cSrcweir 	{
1447cdf0e10cSrcweir 		const sal_uInt16 nCount = pMgr->GetTemplates()->GetRegionCount();
1448cdf0e10cSrcweir 		for ( sal_uInt16 i = 0; i < nCount; ++i )
1449cdf0e10cSrcweir 			InsertEntryByBmpType( pMgr->GetTemplates()->GetFullRegionName(i), BMPTYPE_FOLDER, 0, sal_True );
1450cdf0e10cSrcweir 	}
1451cdf0e10cSrcweir 	else
1452cdf0e10cSrcweir 	{
1453cdf0e10cSrcweir 		const SfxObjectList& rList = pMgr->GetObjectList();
1454cdf0e10cSrcweir 		const sal_uInt16 nCount = rList.Count();
1455cdf0e10cSrcweir 		for ( sal_uInt16 i = 0; i < nCount; ++i )
1456cdf0e10cSrcweir 			InsertEntryByBmpType( rList.GetBaseName(i), BMPTYPE_DOC, 0, sal_True );
1457cdf0e10cSrcweir 
1458cdf0e10cSrcweir 	}
1459cdf0e10cSrcweir 	SetUpdateMode(sal_True);
1460cdf0e10cSrcweir 	Invalidate();
1461cdf0e10cSrcweir 	Update();
1462cdf0e10cSrcweir }
1463cdf0e10cSrcweir 
1464cdf0e10cSrcweir //-------------------------------------------------------------------------
1465cdf0e10cSrcweir 
GetClosedBmp(sal_uInt16 nLevel) const1466cdf0e10cSrcweir const Image &SfxOrganizeListBox_Impl::GetClosedBmp(sal_uInt16 nLevel) const
1467cdf0e10cSrcweir 
1468cdf0e10cSrcweir /*  [Beschreibung]
1469cdf0e10cSrcweir 
1470cdf0e10cSrcweir 	Zugriff auf die Bitmap f"ur einen geschlossenen Eintrag
1471cdf0e10cSrcweir 	der jeweiligen Ebene
1472cdf0e10cSrcweir 
1473cdf0e10cSrcweir 	[Parameter]
1474cdf0e10cSrcweir 
1475cdf0e10cSrcweir 	sal_uInt16 nLevel       Angabe der Ebene, 2 Ebenen sind erlaubt
1476cdf0e10cSrcweir 
1477cdf0e10cSrcweir 	[Returnwert]
1478cdf0e10cSrcweir 
1479cdf0e10cSrcweir 	const Image &       das Image auf der Ebenen nLevel
1480cdf0e10cSrcweir 
1481cdf0e10cSrcweir */
1482cdf0e10cSrcweir 
1483cdf0e10cSrcweir {
1484cdf0e10cSrcweir 	sal_Bool			bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
1485cdf0e10cSrcweir 	const Image*	pRet = NULL;
1486cdf0e10cSrcweir 
1487cdf0e10cSrcweir 	switch( nLevel )
1488cdf0e10cSrcweir 	{
1489cdf0e10cSrcweir 		default:	DBG_ERROR( "Bitmaps ueberindiziert" );
1490cdf0e10cSrcweir 
1491cdf0e10cSrcweir 		case 0:		pRet = bHC? &aClosedFolderBmpHC : &aClosedFolderBmp;		break;
1492cdf0e10cSrcweir 		case 1:		pRet = bHC? &aClosedDocBmpHC : &aClosedDocBmp;				break;
1493cdf0e10cSrcweir 	}
1494cdf0e10cSrcweir 
1495cdf0e10cSrcweir 	return *pRet;
1496cdf0e10cSrcweir }
1497cdf0e10cSrcweir 
1498cdf0e10cSrcweir //-------------------------------------------------------------------------
1499cdf0e10cSrcweir 
GetOpenedBmp(sal_uInt16 nLevel) const1500cdf0e10cSrcweir const Image &SfxOrganizeListBox_Impl::GetOpenedBmp(sal_uInt16 nLevel) const
1501cdf0e10cSrcweir 
1502cdf0e10cSrcweir /*  [Beschreibung]
1503cdf0e10cSrcweir 
1504cdf0e10cSrcweir 	Zugriff auf die Bitmap f"ur einen ge"offneten Eintrag
1505cdf0e10cSrcweir 	der jeweiligen Ebene
1506cdf0e10cSrcweir 
1507cdf0e10cSrcweir 	[Parameter]
1508cdf0e10cSrcweir 
1509cdf0e10cSrcweir 	sal_uInt16 nLevel       Angabe der Ebene, 2 Ebenen sind erlaubt
1510cdf0e10cSrcweir 
1511cdf0e10cSrcweir 	[Returnwert]
1512cdf0e10cSrcweir 
1513cdf0e10cSrcweir 	const Image &       das Image auf der Ebenen nLevel
1514cdf0e10cSrcweir 
1515cdf0e10cSrcweir */
1516cdf0e10cSrcweir 
1517cdf0e10cSrcweir {
1518cdf0e10cSrcweir     sal_Bool         bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
1519cdf0e10cSrcweir     const Image* pRet = NULL;
1520cdf0e10cSrcweir 
1521cdf0e10cSrcweir     switch( nLevel )
1522cdf0e10cSrcweir     {
1523cdf0e10cSrcweir         case 0:
1524cdf0e10cSrcweir            pRet = bHC ? &aOpenedFolderBmpHC : &aOpenedFolderBmp; break;
1525cdf0e10cSrcweir         case 1:
1526cdf0e10cSrcweir            pRet = bHC ? &aOpenedDocBmpHC : &aOpenedDocBmp; break;
1527cdf0e10cSrcweir         default:
1528cdf0e10cSrcweir             pRet = bHC ? &aClosedFolderBmpHC : &aClosedFolderBmp; break;
1529cdf0e10cSrcweir     }
1530cdf0e10cSrcweir 
1531cdf0e10cSrcweir     return *pRet;
1532cdf0e10cSrcweir }
1533cdf0e10cSrcweir 
1534cdf0e10cSrcweir //-------------------------------------------------------------------------
1535cdf0e10cSrcweir 
CreateContextMenu()1536cdf0e10cSrcweir PopupMenu* SfxOrganizeListBox_Impl::CreateContextMenu()
1537cdf0e10cSrcweir {
1538cdf0e10cSrcweir 	return new PopupMenu( *( pDlg->aEditBtn.GetPopupMenu() ) );
1539cdf0e10cSrcweir }
1540cdf0e10cSrcweir 
1541cdf0e10cSrcweir //-------------------------------------------------------------------------
1542cdf0e10cSrcweir 
GetPath_Impl(sal_Bool bOpen,const String & rFileName)1543cdf0e10cSrcweir String SfxOrganizeDlg_Impl::GetPath_Impl( sal_Bool bOpen, const String& rFileName )
1544cdf0e10cSrcweir 
1545cdf0e10cSrcweir /*  [Beschreibung]
1546cdf0e10cSrcweir 
1547cdf0e10cSrcweir 	Pfad per FileDialog erfragen, f"ur Import / Export von
1548cdf0e10cSrcweir 	Dokumentvorlagen
1549cdf0e10cSrcweir 
1550cdf0e10cSrcweir 	[Parameter]
1551cdf0e10cSrcweir 
1552cdf0e10cSrcweir 	sal_Bool bOpen                      Flag: "Offnen / Speichern
1553cdf0e10cSrcweir 	const String& rFileName			aktueller Dateiname als Vorschlag
1554cdf0e10cSrcweir 
1555cdf0e10cSrcweir 	[R"uckgabewert]                 Dateiname mit Pfad oder Leerstring, wenn
1556cdf0e10cSrcweir 									der Benutzer 'Abbrechen' gedr"uckt hat
1557cdf0e10cSrcweir */
1558cdf0e10cSrcweir 
1559cdf0e10cSrcweir {
1560cdf0e10cSrcweir     String aPath;
1561cdf0e10cSrcweir     m_sExtension4Save = DEFINE_CONST_UNICODE( "vor" );
1562cdf0e10cSrcweir 	sal_Int16 nDialogType = bOpen
1563cdf0e10cSrcweir         ? com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE
1564cdf0e10cSrcweir         : com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE;
1565cdf0e10cSrcweir     if ( pFileDlg )
1566cdf0e10cSrcweir         delete pFileDlg;
1567cdf0e10cSrcweir     pFileDlg = new sfx2::FileDialogHelper( nDialogType, 0L );
1568cdf0e10cSrcweir 
1569cdf0e10cSrcweir 	// add "All" filter
1570cdf0e10cSrcweir     pFileDlg->AddFilter( String( SfxResId( STR_SFX_FILTERNAME_ALL ) ),
1571cdf0e10cSrcweir                          DEFINE_CONST_UNICODE( FILEDIALOG_FILTER_ALL ) );
1572cdf0e10cSrcweir 	// add template filter
1573cdf0e10cSrcweir     String sFilterName( SfxResId( STR_TEMPLATE_FILTER ) );
1574cdf0e10cSrcweir     String sFilterExt;
1575cdf0e10cSrcweir     // add filters of modules which are installed
1576cdf0e10cSrcweir     SvtModuleOptions aModuleOpt;
1577cdf0e10cSrcweir     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) )
1578cdf0e10cSrcweir         sFilterExt += DEFINE_CONST_UNICODE( "*.ott;*.stw;*.oth" );
1579cdf0e10cSrcweir     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) )
1580cdf0e10cSrcweir     {
1581cdf0e10cSrcweir         if ( sFilterExt.Len() > 0 )
1582cdf0e10cSrcweir             sFilterExt += ';';
1583cdf0e10cSrcweir         sFilterExt += DEFINE_CONST_UNICODE( "*.ots;*.stc" );
1584cdf0e10cSrcweir     }
1585cdf0e10cSrcweir     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) )
1586cdf0e10cSrcweir     {
1587cdf0e10cSrcweir         if ( sFilterExt.Len() > 0 )
1588cdf0e10cSrcweir             sFilterExt += ';';
1589cdf0e10cSrcweir         sFilterExt += DEFINE_CONST_UNICODE( "*.otp;*.sti" );
1590cdf0e10cSrcweir     }
1591cdf0e10cSrcweir     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) )
1592cdf0e10cSrcweir     {
1593cdf0e10cSrcweir         if ( sFilterExt.Len() > 0 )
1594cdf0e10cSrcweir             sFilterExt += ';';
1595cdf0e10cSrcweir         sFilterExt += DEFINE_CONST_UNICODE( "*.otg;*.std" );
1596cdf0e10cSrcweir     }
1597cdf0e10cSrcweir     if ( sFilterExt.Len() > 0 )
1598cdf0e10cSrcweir         sFilterExt += ';';
1599cdf0e10cSrcweir     sFilterExt += DEFINE_CONST_UNICODE( "*.vor" );
1600cdf0e10cSrcweir 
1601cdf0e10cSrcweir     sFilterName += DEFINE_CONST_UNICODE( " (" );
1602cdf0e10cSrcweir 	sFilterName += sFilterExt;
1603cdf0e10cSrcweir 	sFilterName += ')';
1604cdf0e10cSrcweir     pFileDlg->AddFilter( sFilterName, sFilterExt );
1605cdf0e10cSrcweir     pFileDlg->SetCurrentFilter( sFilterName );
1606cdf0e10cSrcweir 
1607cdf0e10cSrcweir     if ( aLastDir.Len() || rFileName.Len() )
1608cdf0e10cSrcweir 	{
1609cdf0e10cSrcweir 		INetURLObject aObj;
1610cdf0e10cSrcweir 		if ( aLastDir.Len() )
1611cdf0e10cSrcweir 		{
1612cdf0e10cSrcweir             aObj.SetURL( aLastDir );
1613cdf0e10cSrcweir 			if ( rFileName.Len() )
1614cdf0e10cSrcweir 				aObj.insertName( rFileName );
1615cdf0e10cSrcweir 		}
1616cdf0e10cSrcweir 		else
1617cdf0e10cSrcweir             aObj.SetURL( rFileName );
1618cdf0e10cSrcweir 
1619cdf0e10cSrcweir         if ( aObj.hasExtension() )
1620cdf0e10cSrcweir 		{
1621cdf0e10cSrcweir             m_sExtension4Save = aObj.getExtension(
1622cdf0e10cSrcweir                 INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET );
1623cdf0e10cSrcweir 			aObj.removeExtension();
1624cdf0e10cSrcweir 		}
1625cdf0e10cSrcweir 
1626cdf0e10cSrcweir 		DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
1627cdf0e10cSrcweir         pFileDlg->SetDisplayDirectory( aObj.GetMainURL( INetURLObject::NO_DECODE ) );
1628cdf0e10cSrcweir 	}
1629cdf0e10cSrcweir 
1630cdf0e10cSrcweir     pFileDlg->StartExecuteModal( LINK( this, SfxOrganizeDlg_Impl, ImportHdl ) );
1631cdf0e10cSrcweir 
1632cdf0e10cSrcweir     return aPath;
1633cdf0e10cSrcweir }
1634cdf0e10cSrcweir 
1635cdf0e10cSrcweir //-------------------------------------------------------------------------
1636cdf0e10cSrcweir 
1637cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::rtl::OUString >
GetPaths_Impl(const String & rFileName)1638cdf0e10cSrcweir     SfxOrganizeDlg_Impl::GetPaths_Impl( const String& rFileName )
1639cdf0e10cSrcweir 
1640cdf0e10cSrcweir /*  [Description]
1641cdf0e10cSrcweir 
1642cdf0e10cSrcweir    Query plural paths by FileDialog, for Import / Export from document
1643cdf0e10cSrcweir    templates
1644cdf0e10cSrcweir 
1645cdf0e10cSrcweir    [Parameter]
1646cdf0e10cSrcweir 
1647cdf0e10cSrcweir    const String& rFileName         The default file name when dialog executes
1648cdf0e10cSrcweir 
1649cdf0e10cSrcweir    [Return value]                 Empty sequence when users have clicked
1650cdf0e10cSrcweir                                   'Cancel', a sequence just containing one
1651cdf0e10cSrcweir                                   file name with path when they have
1652cdf0e10cSrcweir                                   choosed one file or a sequence containing
1653cdf0e10cSrcweir                                   path and file names without path
1654cdf0e10cSrcweir */
1655cdf0e10cSrcweir 
1656cdf0e10cSrcweir {
1657cdf0e10cSrcweir     ::com::sun::star::uno::Sequence< ::rtl::OUString > aPaths;
1658cdf0e10cSrcweir     m_sExtension4Save = DEFINE_CONST_UNICODE( "vor" );
1659cdf0e10cSrcweir     if ( pFileDlg )
1660cdf0e10cSrcweir             delete pFileDlg;
1661cdf0e10cSrcweir     pFileDlg = new sfx2::FileDialogHelper(
1662cdf0e10cSrcweir 		com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, SFXWB_MULTISELECTION );
1663cdf0e10cSrcweir 
1664cdf0e10cSrcweir     // add "All" filter
1665cdf0e10cSrcweir     pFileDlg->AddFilter( String( SfxResId( STR_SFX_FILTERNAME_ALL ) ),
1666cdf0e10cSrcweir                          DEFINE_CONST_UNICODE( FILEDIALOG_FILTER_ALL ) );
1667cdf0e10cSrcweir 
1668cdf0e10cSrcweir     // add template filter
1669cdf0e10cSrcweir     String sFilterName( SfxResId( STR_TEMPLATE_FILTER ) );
1670cdf0e10cSrcweir     String sFilterExt;
1671cdf0e10cSrcweir     // add filters of modules which are installed
1672cdf0e10cSrcweir     SvtModuleOptions aModuleOpt;
1673cdf0e10cSrcweir     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SWRITER ) )
1674cdf0e10cSrcweir         sFilterExt += DEFINE_CONST_UNICODE( "*.ott;*.stw;*.oth" );
1675cdf0e10cSrcweir     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SCALC ) )
1676cdf0e10cSrcweir     {
1677cdf0e10cSrcweir         if ( sFilterExt.Len() > 0 )
1678cdf0e10cSrcweir             sFilterExt += ';';
1679cdf0e10cSrcweir         sFilterExt += DEFINE_CONST_UNICODE( "*.ots;*.stc" );
1680cdf0e10cSrcweir     }
1681cdf0e10cSrcweir     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SIMPRESS ) )
1682cdf0e10cSrcweir     {
1683cdf0e10cSrcweir         if ( sFilterExt.Len() > 0 )
1684cdf0e10cSrcweir             sFilterExt += ';';
1685cdf0e10cSrcweir         sFilterExt += DEFINE_CONST_UNICODE( "*.otp;*.sti" );
1686cdf0e10cSrcweir     }
1687cdf0e10cSrcweir     if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::E_SDRAW ) )
1688cdf0e10cSrcweir     {
1689cdf0e10cSrcweir         if ( sFilterExt.Len() > 0 )
1690cdf0e10cSrcweir             sFilterExt += ';';
1691cdf0e10cSrcweir         sFilterExt += DEFINE_CONST_UNICODE( "*.otg;*.std" );
1692cdf0e10cSrcweir     }
1693cdf0e10cSrcweir     if ( sFilterExt.Len() > 0 )
1694cdf0e10cSrcweir         sFilterExt += ';';
1695cdf0e10cSrcweir     sFilterExt += DEFINE_CONST_UNICODE( "*.vor" );
1696cdf0e10cSrcweir 
1697cdf0e10cSrcweir     sFilterName += DEFINE_CONST_UNICODE( " (" );
1698cdf0e10cSrcweir     sFilterName += sFilterExt;
1699cdf0e10cSrcweir     sFilterName += ')';
1700cdf0e10cSrcweir     pFileDlg->AddFilter( sFilterName, sFilterExt );
1701cdf0e10cSrcweir     pFileDlg->SetCurrentFilter( sFilterName );
1702cdf0e10cSrcweir 
1703cdf0e10cSrcweir     if ( aLastDir.Len() || rFileName.Len() )
1704cdf0e10cSrcweir     {
1705cdf0e10cSrcweir         INetURLObject aObj;
1706cdf0e10cSrcweir         if ( aLastDir.Len() )
1707cdf0e10cSrcweir         {
1708cdf0e10cSrcweir             aObj.SetURL( aLastDir );
1709cdf0e10cSrcweir             if ( rFileName.Len() )
1710cdf0e10cSrcweir                 aObj.insertName( rFileName );
1711cdf0e10cSrcweir         }
1712cdf0e10cSrcweir         else
1713cdf0e10cSrcweir             aObj.SetURL( rFileName );
1714cdf0e10cSrcweir 
1715cdf0e10cSrcweir         if ( aObj.hasExtension() )
1716cdf0e10cSrcweir         {
1717cdf0e10cSrcweir             m_sExtension4Save = aObj.getExtension(
1718cdf0e10cSrcweir                  INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET );
1719cdf0e10cSrcweir             aObj.removeExtension();
1720cdf0e10cSrcweir         }
1721cdf0e10cSrcweir 
1722cdf0e10cSrcweir         DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL!" );
1723cdf0e10cSrcweir         pFileDlg->SetDisplayDirectory( aObj.GetMainURL( INetURLObject::NO_DECODE ) );
1724cdf0e10cSrcweir     }
1725cdf0e10cSrcweir 
1726cdf0e10cSrcweir     pFileDlg->StartExecuteModal( LINK( this, SfxOrganizeDlg_Impl, ExportHdl ) );
1727cdf0e10cSrcweir 
1728cdf0e10cSrcweir     return aPaths;
1729cdf0e10cSrcweir }
1730cdf0e10cSrcweir 
1731cdf0e10cSrcweir //-------------------------------------------------------------------------
1732cdf0e10cSrcweir 
DontDelete_Impl(SvLBoxEntry * pEntry)1733cdf0e10cSrcweir sal_Bool SfxOrganizeDlg_Impl::DontDelete_Impl( SvLBoxEntry* pEntry )
1734cdf0e10cSrcweir {
1735cdf0e10cSrcweir 	sal_uInt16 nDepth = pFocusBox->GetModel()->GetDepth(pEntry);
1736cdf0e10cSrcweir 	if(SfxOrganizeListBox_Impl::VIEW_FILES ==
1737cdf0e10cSrcweir 	   pFocusBox->GetViewType())
1738cdf0e10cSrcweir 		nDepth++;
1739cdf0e10cSrcweir 	if( (nDepth > 2 && !pEntry->GetUserData()) ||
1740cdf0e10cSrcweir 	   //Delete ueber GetContent verboten
1741cdf0e10cSrcweir 	   nDepth==2 || //Vorlage / Konfigurtionsrubrik nicht loeshcen
1742cdf0e10cSrcweir 	   (nDepth==1 && SfxOrganizeListBox_Impl::VIEW_FILES ==
1743cdf0e10cSrcweir 		pFocusBox->GetViewType()) || //Files nicht loeschen
1744cdf0e10cSrcweir 	   (0 == nDepth && pFocusBox->GetLevelCount_Impl(0) < 2))
1745cdf0e10cSrcweir 		//Mindestens eine Vorlage behalten
1746cdf0e10cSrcweir 	{
1747cdf0e10cSrcweir 		return sal_True;
1748cdf0e10cSrcweir 	}
1749cdf0e10cSrcweir 
1750cdf0e10cSrcweir 	sal_uInt16 nRegion = 0, nIndex = 0;
1751cdf0e10cSrcweir 	GetIndices_Impl( pFocusBox, pEntry, nRegion, nIndex );
1752cdf0e10cSrcweir     const SfxDocumentTemplates* pTemplates = aMgr.GetTemplates();
1753cdf0e10cSrcweir 	if ( !pTemplates || !pTemplates->HasUserContents( nRegion, nIndex ) )
1754cdf0e10cSrcweir 		return sal_True;
1755cdf0e10cSrcweir 
1756cdf0e10cSrcweir 	return sal_False;
1757cdf0e10cSrcweir }
1758cdf0e10cSrcweir 
GetAllFactoryURLs_Impl() const1759cdf0e10cSrcweir SvStringsDtor* SfxOrganizeDlg_Impl::GetAllFactoryURLs_Impl( ) const
1760cdf0e10cSrcweir {
1761cdf0e10cSrcweir 	SvtModuleOptions aModOpt;
1762cdf0e10cSrcweir 	const ::com::sun::star::uno::Sequence < ::rtl::OUString >& aServiceNames = aModOpt.GetAllServiceNames() ;
1763cdf0e10cSrcweir     SvStringsDtor* pList = new SvStringsDtor;
1764cdf0e10cSrcweir 	sal_Int32 nCount = aServiceNames.getLength();
1765cdf0e10cSrcweir     for( sal_Int32 i=0; i<nCount; ++i )
1766cdf0e10cSrcweir     {
1767cdf0e10cSrcweir 		if ( SfxObjectFactory::GetStandardTemplate( aServiceNames[i] ).Len() > 0 )
1768cdf0e10cSrcweir 		{
1769cdf0e10cSrcweir 			SvtModuleOptions::EFactory eFac = SvtModuleOptions::E_WRITER;
1770cdf0e10cSrcweir 			SvtModuleOptions::ClassifyFactoryByName( aServiceNames[i], eFac );
1771cdf0e10cSrcweir 			String* pURL = new String( aModOpt.GetFactoryEmptyDocumentURL( eFac ) );
1772cdf0e10cSrcweir 	        pList->Insert( pURL, pList->Count() );
1773cdf0e10cSrcweir 		}
1774cdf0e10cSrcweir     }
1775cdf0e10cSrcweir 
1776cdf0e10cSrcweir     return pList;
1777cdf0e10cSrcweir }
1778cdf0e10cSrcweir 
GetServiceName_Impl(String & rName,String & rFileURL) const1779cdf0e10cSrcweir sal_Bool SfxOrganizeDlg_Impl::GetServiceName_Impl( String& rName, String& rFileURL ) const
1780cdf0e10cSrcweir {
1781cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
1782cdf0e10cSrcweir 	const SfxDocumentTemplates*	pTemplates = aMgr.GetTemplates();
1783cdf0e10cSrcweir 	SvLBoxEntry* pEntry = pFocusBox ? pFocusBox->FirstSelected() : NULL;
1784cdf0e10cSrcweir 	sal_uInt16 nRegion = 0, nIndex = 0;
1785cdf0e10cSrcweir 	GetIndices_Impl( pFocusBox, pEntry, nRegion, nIndex );
1786cdf0e10cSrcweir 	rFileURL = pTemplates->GetPath( nRegion, nIndex );
1787cdf0e10cSrcweir 	if ( rFileURL.Len() > 0 )
1788cdf0e10cSrcweir 	{
1789cdf0e10cSrcweir         try
1790cdf0e10cSrcweir         {
1791cdf0e10cSrcweir             uno::Reference< embed::XStorage > xStorage = ::comphelper::OStorageHelper::GetStorageFromURL(
1792cdf0e10cSrcweir                                                     rFileURL,
1793cdf0e10cSrcweir                                                     embed::ElementModes::READ );
1794cdf0e10cSrcweir             sal_uIntPtr nFormat = SotStorage::GetFormatID( xStorage );
1795cdf0e10cSrcweir             const SfxFilter* pFilter =
1796cdf0e10cSrcweir                 SFX_APP()->GetFilterMatcher().GetFilter4ClipBoardId( nFormat );
1797cdf0e10cSrcweir             if ( pFilter )
1798cdf0e10cSrcweir             {
1799cdf0e10cSrcweir                 rName = pFilter->GetServiceName();
1800cdf0e10cSrcweir                 bRet = sal_True;
1801cdf0e10cSrcweir             }
1802cdf0e10cSrcweir 		}
1803cdf0e10cSrcweir 		catch( uno::Exception& )
1804cdf0e10cSrcweir 		{}
1805cdf0e10cSrcweir 	}
1806cdf0e10cSrcweir 
1807cdf0e10cSrcweir 	return bRet;
1808cdf0e10cSrcweir }
1809cdf0e10cSrcweir 
Dispatch_Impl(sal_uInt16 nId,Menu * _pMenu)1810cdf0e10cSrcweir long SfxOrganizeDlg_Impl::Dispatch_Impl( sal_uInt16 nId, Menu* _pMenu )
1811cdf0e10cSrcweir 
1812cdf0e10cSrcweir /*  [Beschreibung]
1813cdf0e10cSrcweir 
1814cdf0e10cSrcweir 	Verarbeiten der Events aus MenuButton oder Accelerator
1815cdf0e10cSrcweir 
1816cdf0e10cSrcweir 	[Parameter]
1817cdf0e10cSrcweir 
1818cdf0e10cSrcweir 	sal_uInt16 nId                      ID des Events
1819cdf0e10cSrcweir 
1820cdf0e10cSrcweir 	[R"uckgabewert]                 1: Event wurde verarbeitet,
1821cdf0e10cSrcweir 									0: Event wurde nicht verarbeitet (SV-Menu)
1822cdf0e10cSrcweir 
1823cdf0e10cSrcweir */
1824cdf0e10cSrcweir 
1825cdf0e10cSrcweir {
1826cdf0e10cSrcweir 	SuspendAccel aTmp(&aEditAcc);
1827cdf0e10cSrcweir 	SvLBoxEntry *pEntry = pFocusBox? pFocusBox->FirstSelected(): 0;
1828cdf0e10cSrcweir 	sal_Bool bHandled = sal_True;
1829cdf0e10cSrcweir 	switch(nId)
1830cdf0e10cSrcweir 	{
1831cdf0e10cSrcweir 		case ID_NEW:
1832cdf0e10cSrcweir 		{
1833cdf0e10cSrcweir 			if(!pEntry)
1834cdf0e10cSrcweir 				return 1;
1835cdf0e10cSrcweir 			if(pFocusBox->GetViewType() == SfxOrganizeListBox_Impl::VIEW_TEMPLATES)
1836cdf0e10cSrcweir 			{
1837cdf0e10cSrcweir 				if(0 == pFocusBox->GetModel()->GetDepth(pEntry))
1838cdf0e10cSrcweir 				{
1839cdf0e10cSrcweir 					const String aNoName( SfxResId(STR_NONAME) );
1840cdf0e10cSrcweir 					SvLBoxEntry* pParent = pFocusBox->GetParent(pEntry);
1841cdf0e10cSrcweir 					String aName(aNoName);
1842cdf0e10cSrcweir 					sal_uInt16 n = 1;
1843cdf0e10cSrcweir 					while(!pFocusBox->IsUniqName_Impl(aName, pParent))
1844cdf0e10cSrcweir 					{
1845cdf0e10cSrcweir 						aName = aNoName;
1846cdf0e10cSrcweir 						aName += String::CreateFromInt32( n++ );
1847cdf0e10cSrcweir 					}
1848cdf0e10cSrcweir 					aMgr.InsertDir( pFocusBox, aName,
1849cdf0e10cSrcweir 							(sal_uInt16)pFocusBox->GetModel()->GetRelPos(pEntry)+1);
1850cdf0e10cSrcweir 				}
1851cdf0e10cSrcweir 			}
1852cdf0e10cSrcweir 			break;
1853cdf0e10cSrcweir 		}
1854cdf0e10cSrcweir 
1855cdf0e10cSrcweir 		case ID_DELETE:
1856cdf0e10cSrcweir 		{
1857cdf0e10cSrcweir 			if(!pEntry || DontDelete_Impl(pEntry))
1858cdf0e10cSrcweir 				return 1;
1859cdf0e10cSrcweir 			const sal_uInt16 nDepth = pFocusBox->GetModel()->GetDepth(pEntry);
1860cdf0e10cSrcweir 			if(nDepth < 2)
1861cdf0e10cSrcweir 			{
1862cdf0e10cSrcweir 				if(0 == nDepth && pFocusBox->GetLevelCount_Impl(0) < 2) return 1;
1863cdf0e10cSrcweir                 if(SfxOrganizeListBox_Impl::VIEW_TEMPLATES == pFocusBox->GetViewType())
1864cdf0e10cSrcweir 				{
1865cdf0e10cSrcweir 					sal_uInt16 nResId = nDepth? STR_DELETE_TEMPLATE :
1866cdf0e10cSrcweir 											STR_DELETE_REGION;
1867cdf0e10cSrcweir 					if( !QueryDelete_Impl(
1868cdf0e10cSrcweir 						pDialog, nResId, pFocusBox->GetEntryText(pEntry)))
1869cdf0e10cSrcweir 						return 1;
1870cdf0e10cSrcweir 					if ( STR_DELETE_REGION == nResId &&
1871cdf0e10cSrcweir 						 pFocusBox->GetChildCount(pEntry))
1872cdf0e10cSrcweir 					{
1873cdf0e10cSrcweir 						QueryBox aQBox(pDialog, SfxResId(MSG_REGION_NOTEMPTY));
1874cdf0e10cSrcweir 						if(RET_NO == aQBox.Execute())
1875cdf0e10cSrcweir 							return 1;
1876cdf0e10cSrcweir 					}
1877cdf0e10cSrcweir 					sal_uInt16 nRegion = 0, nIndex = 0;
1878cdf0e10cSrcweir 					GetIndices_Impl(pFocusBox, pEntry, nRegion, nIndex);
1879cdf0e10cSrcweir 
1880cdf0e10cSrcweir 					sal_uInt16 nDeleteInd = ( STR_DELETE_REGION == nResId? USHRT_MAX: nIndex );
1881cdf0e10cSrcweir 					if ( !aMgr.Delete( pFocusBox, nRegion, nDeleteInd ) )
1882cdf0e10cSrcweir 						ErrorDelete_Impl(
1883cdf0e10cSrcweir 							pDialog,
1884cdf0e10cSrcweir 							pFocusBox->GetEntryText(pEntry),
1885cdf0e10cSrcweir 							( nDeleteInd == USHRT_MAX && pFocusBox->GetChildCount(pEntry) ) );
1886cdf0e10cSrcweir 				}
1887cdf0e10cSrcweir 			}
1888cdf0e10cSrcweir 			// Inhaltsformen
1889cdf0e10cSrcweir 			else if(nDepth + pFocusBox->GetDocLevel() >= 2)
1890cdf0e10cSrcweir 			{
1891cdf0e10cSrcweir 				if(!QueryDelete_Impl(pDialog, STR_DELETE_TEMPLATE, pFocusBox->GetEntryText(pEntry)))
1892cdf0e10cSrcweir 					return 1;
1893cdf0e10cSrcweir 				Path aPath(pFocusBox, pEntry);
1894cdf0e10cSrcweir 
1895cdf0e10cSrcweir                 // it is ok to use the SfxObjectShellRef here since the object that
1896cdf0e10cSrcweir                 // provides it ( GetObjectShell() calls CreateObjectShell() ) has a lock on it
1897cdf0e10cSrcweir 				SfxObjectShellRef aRef = pFocusBox->GetObjectShell(aPath);
1898cdf0e10cSrcweir 				if(aRef.Is() &&
1899cdf0e10cSrcweir 					aRef->Remove(aPath[1+pFocusBox->GetDocLevel()],
1900cdf0e10cSrcweir 								 aPath[2+pFocusBox->GetDocLevel()],
1901cdf0e10cSrcweir 								 aPath[3+pFocusBox->GetDocLevel()]))
1902cdf0e10cSrcweir 					pFocusBox->GetModel()->Remove(pEntry);
1903cdf0e10cSrcweir 				else
1904cdf0e10cSrcweir 					ErrorDelete_Impl(pDialog, pFocusBox->GetEntryText(pEntry), sal_False );
1905cdf0e10cSrcweir 			}
1906cdf0e10cSrcweir 			break;
1907cdf0e10cSrcweir 		}
1908cdf0e10cSrcweir 
1909cdf0e10cSrcweir 		case ID_EDIT:
1910cdf0e10cSrcweir 		{
1911cdf0e10cSrcweir 			if(!pEntry)
1912cdf0e10cSrcweir 				return 1;
1913cdf0e10cSrcweir 			sal_uInt16 nRegion = 0, nIndex = 0;
1914cdf0e10cSrcweir 			GetIndices_Impl( pFocusBox, pEntry, nRegion, nIndex );
1915cdf0e10cSrcweir 			const SfxStringItem aName( SID_FILE_NAME, aMgr.GetTemplates()->GetPath( nRegion, nIndex ) );
1916cdf0e10cSrcweir 			const SfxStringItem aLongName( SID_FILE_LONGNAME, pFocusBox->GetEntryText( pEntry ) );
1917cdf0e10cSrcweir 			const SfxStringItem aReferer( SID_REFERER, DEFINE_CONST_UNICODE( "private:user" ) );
1918cdf0e10cSrcweir 			const SfxStringItem aTargetName( SID_TARGETNAME, DEFINE_CONST_UNICODE( "_default" ) );
1919cdf0e10cSrcweir 			const SfxBoolItem	aTemplateIndicator( SID_TEMPLATE, sal_False );
1920cdf0e10cSrcweir 
1921cdf0e10cSrcweir             SFX_APP()->GetAppDispatcher_Impl()->Execute( SID_OPENTEMPLATE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
1922cdf0e10cSrcweir 									  &aName, &aLongName, &aReferer, &aTargetName, &aTemplateIndicator, 0L );
1923cdf0e10cSrcweir 			pDialog->EndDialog( RET_EDIT_STYLE );
1924cdf0e10cSrcweir 			break;
1925cdf0e10cSrcweir 		}
1926cdf0e10cSrcweir 
1927cdf0e10cSrcweir 		case ID_COPY_FROM:
1928cdf0e10cSrcweir 		{
1929cdf0e10cSrcweir 			if ( !pEntry )
1930cdf0e10cSrcweir 				return 1;
1931cdf0e10cSrcweir             m_nRegion = 0;
1932cdf0e10cSrcweir             m_nIndex = 0;
1933cdf0e10cSrcweir             GetIndices_Impl( pFocusBox, pEntry, m_nRegion, m_nIndex );
1934cdf0e10cSrcweir             GetPaths_Impl( String() );
1935cdf0e10cSrcweir 			break;
1936cdf0e10cSrcweir 		}
1937cdf0e10cSrcweir 
1938cdf0e10cSrcweir 		case ID_COPY_TO:
1939cdf0e10cSrcweir 		{
1940cdf0e10cSrcweir 			if ( !pEntry )
1941cdf0e10cSrcweir 				return 1;
1942cdf0e10cSrcweir             m_nRegion = 0;
1943cdf0e10cSrcweir             m_nIndex = 0;
1944cdf0e10cSrcweir             GetIndices_Impl( pFocusBox, pEntry, m_nRegion, m_nIndex );
1945cdf0e10cSrcweir             GetPath_Impl( sal_False, aMgr.GetTemplates()->GetFileName( m_nRegion, m_nIndex ) );
1946cdf0e10cSrcweir 			break;
1947cdf0e10cSrcweir 		}
1948cdf0e10cSrcweir 
1949cdf0e10cSrcweir 		case ID_RESCAN:
1950cdf0e10cSrcweir 			if ( !aMgr.Rescan() )
1951cdf0e10cSrcweir 				ErrorBox( pDialog, SfxResId( MSG_ERROR_RESCAN ) ).Execute();
1952cdf0e10cSrcweir 			if ( SfxOrganizeListBox_Impl::VIEW_TEMPLATES == aLeftLb.GetViewType() )
1953cdf0e10cSrcweir 				aLeftLb.Reset();
1954cdf0e10cSrcweir 			if ( SfxOrganizeListBox_Impl::VIEW_TEMPLATES == aRightLb.GetViewType() )
1955cdf0e10cSrcweir 				aRightLb.Reset();
1956cdf0e10cSrcweir 			break;
1957cdf0e10cSrcweir 
1958cdf0e10cSrcweir 		case ID_PRINT:
1959cdf0e10cSrcweir 		{
1960cdf0e10cSrcweir 			if ( !pEntry )
1961cdf0e10cSrcweir 				return 1;
1962cdf0e10cSrcweir 			Path aPath( pFocusBox, pEntry );
1963cdf0e10cSrcweir 
1964cdf0e10cSrcweir             // it is ok to use the SfxObjectShellRef here since the object that
1965cdf0e10cSrcweir             // provides it ( GetObjectShell() calls CreateObjectShell() ) has a lock on it
1966cdf0e10cSrcweir 			SfxObjectShellRef aRef = pFocusBox->GetObjectShell( aPath );
1967cdf0e10cSrcweir 			if ( aRef.Is() )
1968cdf0e10cSrcweir 			{
1969cdf0e10cSrcweir 				const sal_uInt16 nDocLevel = pFocusBox->GetDocLevel();
1970cdf0e10cSrcweir 				if ( !pPrt )
1971cdf0e10cSrcweir 					pPrt = new Printer;
1972cdf0e10cSrcweir 				SvLBoxEntry *pDocEntry = pEntry;
1973cdf0e10cSrcweir 				while ( pFocusBox->GetModel()->GetDepth( pDocEntry ) > nDocLevel )
1974cdf0e10cSrcweir 					pDocEntry = pFocusBox->GetParent( pDocEntry );
1975cdf0e10cSrcweir 				const String aName(pFocusBox->GetEntryText(pDocEntry));
1976cdf0e10cSrcweir 				if ( !aRef->Print( *pPrt, aPath[1+nDocLevel],
1977cdf0e10cSrcweir 								   aPath[2+nDocLevel], aPath[3+nDocLevel], &aName ) )
1978cdf0e10cSrcweir 					ErrorBox( pDialog, SfxResId( MSG_PRINT_ERROR ) ).Execute();
1979cdf0e10cSrcweir 			}
1980cdf0e10cSrcweir 			break;
1981cdf0e10cSrcweir 		}
1982cdf0e10cSrcweir 
1983cdf0e10cSrcweir 		case ID_PRINTER_SETUP:
1984cdf0e10cSrcweir 		{
1985cdf0e10cSrcweir 			PrinterSetupDialog* pDlg = new PrinterSetupDialog( pDialog );
1986cdf0e10cSrcweir 			if ( !pPrt )
1987cdf0e10cSrcweir 				pPrt = new Printer;
1988cdf0e10cSrcweir 			pDlg->SetPrinter( pPrt );
1989cdf0e10cSrcweir 			pDlg->Execute();
1990cdf0e10cSrcweir 			delete pDlg;
1991cdf0e10cSrcweir 			break;
1992cdf0e10cSrcweir 		}
1993cdf0e10cSrcweir 
1994cdf0e10cSrcweir 		case ID_DEFAULT_TEMPLATE:
1995cdf0e10cSrcweir 		{
1996cdf0e10cSrcweir 			String aServiceName, aFileURL;
1997cdf0e10cSrcweir 			if ( GetServiceName_Impl( aServiceName, aFileURL ) )
1998cdf0e10cSrcweir 				SfxObjectFactory::SetStandardTemplate( aServiceName, aFileURL );
1999cdf0e10cSrcweir 			break;
2000cdf0e10cSrcweir 		}
2001cdf0e10cSrcweir 
2002cdf0e10cSrcweir 		default:
2003cdf0e10cSrcweir 			bHandled = sal_False;
2004cdf0e10cSrcweir 	}
2005cdf0e10cSrcweir 
2006cdf0e10cSrcweir 	if ( !bHandled && ( nId > ID_RESET_DEFAULT_TEMPLATE || nId <= ID_RESET_DEFAULT_TEMPLATE_END ) )
2007cdf0e10cSrcweir 	{
2008cdf0e10cSrcweir 		Menu* pSubMenu = _pMenu ? _pMenu : aEditBtn.GetPopupMenu()->GetPopupMenu( ID_RESET_DEFAULT_TEMPLATE );
2009cdf0e10cSrcweir 		if ( pSubMenu )
2010cdf0e10cSrcweir 		{
2011cdf0e10cSrcweir 			String aServiceName = SfxObjectShell::GetServiceNameFromFactory( pSubMenu->GetItemCommand( nId ) );
2012cdf0e10cSrcweir 			SfxObjectFactory::SetStandardTemplate( aServiceName, String() );
2013cdf0e10cSrcweir 			bHandled = sal_True;
2014cdf0e10cSrcweir 		}
2015cdf0e10cSrcweir 	}
2016cdf0e10cSrcweir 
2017cdf0e10cSrcweir 	return bHandled ? 1 : 0;
2018cdf0e10cSrcweir }
2019cdf0e10cSrcweir 
2020cdf0e10cSrcweir //-------------------------------------------------------------------------
2021cdf0e10cSrcweir 
IMPL_LINK_INLINE_START(SfxOrganizeDlg_Impl,MenuSelect_Impl,Menu *,pMenu)2022cdf0e10cSrcweir IMPL_LINK_INLINE_START( SfxOrganizeDlg_Impl, MenuSelect_Impl, Menu *, pMenu )
2023cdf0e10cSrcweir 
2024cdf0e10cSrcweir /*  [Beschreibung]
2025cdf0e10cSrcweir 
2026cdf0e10cSrcweir 	SelectHandler des Men"us des Men"ubuttons (SV)
2027cdf0e10cSrcweir 
2028cdf0e10cSrcweir 	[Parameter]
2029cdf0e10cSrcweir 
2030cdf0e10cSrcweir 	MenuButton *pBtn                der das Event ausl"osende Button
2031cdf0e10cSrcweir 
2032cdf0e10cSrcweir 	[R"uckgabewert]                 1: Event wurde verarbeitet,
2033cdf0e10cSrcweir 									0: Event wurde nicht verarbeitet (SV-Menu)
2034cdf0e10cSrcweir 
2035cdf0e10cSrcweir */
2036cdf0e10cSrcweir {
2037cdf0e10cSrcweir 	return Dispatch_Impl( pMenu->GetCurItemId(), pMenu );
2038cdf0e10cSrcweir }
IMPL_LINK_INLINE_END(SfxOrganizeDlg_Impl,MenuSelect_Impl,Menu *,pMenu)2039cdf0e10cSrcweir IMPL_LINK_INLINE_END( SfxOrganizeDlg_Impl, MenuSelect_Impl, Menu *, pMenu )
2040cdf0e10cSrcweir 
2041cdf0e10cSrcweir //-------------------------------------------------------------------------
2042cdf0e10cSrcweir 
2043cdf0e10cSrcweir IMPL_LINK( SfxOrganizeDlg_Impl, AccelSelect_Impl, Accelerator *, pAccel )
2044cdf0e10cSrcweir 
2045cdf0e10cSrcweir /*  [Beschreibung]
2046cdf0e10cSrcweir 
2047cdf0e10cSrcweir 	SelectHandler des Accelerators (SV)
2048cdf0e10cSrcweir 
2049cdf0e10cSrcweir 	[Parameter]
2050cdf0e10cSrcweir 
2051cdf0e10cSrcweir 	Accelerator *pAccel             der das Event ausl"osende Accelerator
2052cdf0e10cSrcweir 
2053cdf0e10cSrcweir 	[R"uckgabewert]                 1: Event wurde verarbeitet,
2054cdf0e10cSrcweir 									0: Event wurde nicht verarbeitet (SV)
2055cdf0e10cSrcweir 
2056cdf0e10cSrcweir */
2057cdf0e10cSrcweir 
2058cdf0e10cSrcweir {
2059cdf0e10cSrcweir 	SvLBoxEntry* pEntry = pFocusBox && pFocusBox->GetSelectionCount() ?
2060cdf0e10cSrcweir 		pFocusBox->FirstSelected() : NULL ;
2061cdf0e10cSrcweir 	return pEntry && ( pAccel->GetCurItemId() == ID_NEW  || !DontDelete_Impl( pEntry ) ) ?
2062cdf0e10cSrcweir 		Dispatch_Impl( pAccel->GetCurItemId(), NULL ) : 0;
2063cdf0e10cSrcweir }
2064cdf0e10cSrcweir 
2065cdf0e10cSrcweir //-------------------------------------------------------------------------
2066cdf0e10cSrcweir 
OkHdl(Button * pButton)2067cdf0e10cSrcweir void SfxOrganizeDlg_Impl::OkHdl(Button *pButton)
2068cdf0e10cSrcweir {
2069cdf0e10cSrcweir 	if(pFocusBox && pFocusBox->IsEditingActive())
2070cdf0e10cSrcweir 		pFocusBox->EndEditing(sal_False);
2071cdf0e10cSrcweir 	pButton->Click();
2072cdf0e10cSrcweir }
2073cdf0e10cSrcweir 
2074cdf0e10cSrcweir 
2075cdf0e10cSrcweir 
IMPL_LINK(SfxOrganizeDlg_Impl,MenuActivate_Impl,Menu *,pMenu)2076cdf0e10cSrcweir IMPL_LINK( SfxOrganizeDlg_Impl, MenuActivate_Impl, Menu *, pMenu )
2077cdf0e10cSrcweir 
2078cdf0e10cSrcweir /*  [Beschreibung]
2079cdf0e10cSrcweir 
2080cdf0e10cSrcweir 	ActivateHandler des Men"us des Men"ubuttons (SV)
2081cdf0e10cSrcweir 
2082cdf0e10cSrcweir 	[Parameter]
2083cdf0e10cSrcweir 
2084cdf0e10cSrcweir 	Menu *pMenu                     das das Event ausl"osende Men"u
2085cdf0e10cSrcweir 
2086cdf0e10cSrcweir 	[R"uckgabewert]                 1: Event wurde verarbeitet,
2087cdf0e10cSrcweir 									0: Event wurde nicht verarbeitet (SV-Menu)
2088cdf0e10cSrcweir 
2089cdf0e10cSrcweir */
2090cdf0e10cSrcweir {
2091cdf0e10cSrcweir 	if ( pFocusBox && pFocusBox->IsEditingActive() )
2092cdf0e10cSrcweir 		pFocusBox->EndEditing( sal_False );
2093cdf0e10cSrcweir 	sal_Bool bEnable = ( pFocusBox && pFocusBox->GetSelectionCount() );
2094cdf0e10cSrcweir 	SvLBoxEntry* pEntry = bEnable ? pFocusBox->FirstSelected() : NULL;
2095cdf0e10cSrcweir 	const sal_uInt16 nDepth =
2096cdf0e10cSrcweir 		( bEnable && pFocusBox->GetSelectionCount() ) ? pFocusBox->GetModel()->GetDepth( pEntry ) : 0;
2097cdf0e10cSrcweir 	const sal_uInt16 nDocLevel = bEnable ? pFocusBox->GetDocLevel() : 0;
2098cdf0e10cSrcweir 	int eVT = pFocusBox ? pFocusBox->GetViewType() : 0;
2099cdf0e10cSrcweir 		// nur Vorlagen anlegen
2100cdf0e10cSrcweir 	pMenu->EnableItem( ID_NEW, bEnable && 0 == nDepth && SfxOrganizeListBox_Impl::VIEW_TEMPLATES == eVT );
2101cdf0e10cSrcweir 	// Vorlagen: Loeschen Ebene 0,1,3ff
2102cdf0e10cSrcweir 	//           ein Bereich mu"s mindestens erhalten bleiben
2103cdf0e10cSrcweir 	// Dateien : Loeschen Ebene > 2
2104cdf0e10cSrcweir 
2105cdf0e10cSrcweir 	pMenu->EnableItem( ID_DELETE, bEnable && !DontDelete_Impl( pEntry ) );
2106cdf0e10cSrcweir 	pMenu->EnableItem( ID_EDIT,
2107cdf0e10cSrcweir 					   bEnable && eVT == SfxOrganizeListBox_Impl::VIEW_TEMPLATES && nDepth == nDocLevel
2108cdf0e10cSrcweir 					       && !DontDelete_Impl( pEntry ) );
2109cdf0e10cSrcweir 	pMenu->EnableItem( ID_COPY_FROM,
2110cdf0e10cSrcweir 					   bEnable && eVT == SfxOrganizeListBox_Impl::VIEW_TEMPLATES &&
2111cdf0e10cSrcweir 					   ( nDepth == nDocLevel || nDepth == nDocLevel - 1 ) );
2112cdf0e10cSrcweir 	pMenu->EnableItem( ID_COPY_TO,
2113cdf0e10cSrcweir 					   bEnable && eVT == SfxOrganizeListBox_Impl::VIEW_TEMPLATES &&
2114cdf0e10cSrcweir 					   nDepth == nDocLevel );
2115cdf0e10cSrcweir 	pMenu->EnableItem( ID_RESCAN,
2116cdf0e10cSrcweir 					   SfxOrganizeListBox_Impl::VIEW_TEMPLATES == aRightLb.GetViewType() ||
2117cdf0e10cSrcweir 					   SfxOrganizeListBox_Impl::VIEW_TEMPLATES == aLeftLb.GetViewType() );
2118cdf0e10cSrcweir 	sal_Bool bPrint = bEnable && nDepth > pFocusBox->GetDocLevel();
2119cdf0e10cSrcweir 	if ( bPrint && pPrt )
2120cdf0e10cSrcweir 		bPrint = !pPrt->IsPrinting() && !pPrt->IsJobActive();
2121cdf0e10cSrcweir 	if ( bPrint && bEnable )
2122cdf0e10cSrcweir 	{
2123cdf0e10cSrcweir 		// only styles printable
2124cdf0e10cSrcweir 		Path aPath( pFocusBox, pFocusBox->FirstSelected() );
2125cdf0e10cSrcweir 		sal_uInt16 nIndex = aPath[ nDocLevel + 1 ];
2126cdf0e10cSrcweir 		bPrint = ( nIndex == CONTENT_STYLE );
2127cdf0e10cSrcweir 				}
2128cdf0e10cSrcweir 	pMenu->EnableItem( ID_PRINT, bPrint );
2129cdf0e10cSrcweir 
2130cdf0e10cSrcweir 	if ( bEnable && eVT == SfxOrganizeListBox_Impl::VIEW_TEMPLATES && nDepth == nDocLevel )
2131cdf0e10cSrcweir 	{
2132cdf0e10cSrcweir 		String aFactoryURL, aFileURL;
2133cdf0e10cSrcweir 		bEnable = GetServiceName_Impl( aFactoryURL, aFileURL );
2134cdf0e10cSrcweir 	}
2135cdf0e10cSrcweir 	else if ( bEnable )
2136cdf0e10cSrcweir 		bEnable = sal_False;
2137cdf0e10cSrcweir 	pMenu->EnableItem( ID_DEFAULT_TEMPLATE, bEnable );
2138cdf0e10cSrcweir 
2139cdf0e10cSrcweir 	bEnable = sal_True;
2140cdf0e10cSrcweir 	SvStringsDtor* pList = GetAllFactoryURLs_Impl();
2141cdf0e10cSrcweir 	sal_uInt16 nCount = pList->Count();
2142cdf0e10cSrcweir 	if ( nCount > 0 )
2143cdf0e10cSrcweir 	{
2144cdf0e10cSrcweir 		PopupMenu* pSubMenu = new PopupMenu;
2145cdf0e10cSrcweir 		sal_uInt16 nItemId = ID_RESET_DEFAULT_TEMPLATE + 1;
2146cdf0e10cSrcweir 		for ( sal_uInt16 i = 0; i < nCount; ++i )
2147cdf0e10cSrcweir 		{
2148cdf0e10cSrcweir 			String aObjFacURL( *pList->GetObject(i) );
2149cdf0e10cSrcweir 			String aTitle = SvFileInformationManager::GetDescription(
2150cdf0e10cSrcweir 				INetURLObject(aObjFacURL) );
2151cdf0e10cSrcweir 			pSubMenu->InsertItem( nItemId, aTitle,
2152cdf0e10cSrcweir 				SvFileInformationManager::GetImage(INetURLObject(aObjFacURL)) );
2153cdf0e10cSrcweir 			pSubMenu->SetItemCommand( nItemId++, aObjFacURL );
2154cdf0e10cSrcweir 			DBG_ASSERT( nItemId <= ID_RESET_DEFAULT_TEMPLATE_END, "menu item id overflow" );
2155cdf0e10cSrcweir 		}
2156cdf0e10cSrcweir 		pMenu->SetPopupMenu( ID_RESET_DEFAULT_TEMPLATE, pSubMenu );
2157cdf0e10cSrcweir 	}
2158cdf0e10cSrcweir 	else
2159cdf0e10cSrcweir 		bEnable = sal_False;
2160cdf0e10cSrcweir 
2161cdf0e10cSrcweir 	delete pList;
2162cdf0e10cSrcweir 	pMenu->EnableItem( ID_RESET_DEFAULT_TEMPLATE, bEnable );
2163cdf0e10cSrcweir 
2164cdf0e10cSrcweir 	return 1;
2165cdf0e10cSrcweir }
2166cdf0e10cSrcweir 
2167cdf0e10cSrcweir //-------------------------------------------------------------------------
2168cdf0e10cSrcweir 
IMPL_LINK(SfxOrganizeDlg_Impl,GetFocus_Impl,SfxOrganizeListBox_Impl *,pBox)2169cdf0e10cSrcweir IMPL_LINK( SfxOrganizeDlg_Impl, GetFocus_Impl, SfxOrganizeListBox_Impl *, pBox )
2170cdf0e10cSrcweir 
2171cdf0e10cSrcweir /*  [Beschreibung]
2172cdf0e10cSrcweir 
2173cdf0e10cSrcweir 	GetFocus-Handler, wird aus den Select-Handler der Listboxen
2174cdf0e10cSrcweir 	gerufen.
2175cdf0e10cSrcweir 	Wird verwendet, im die Listbox, die den Focus besitzt sowie
2176cdf0e10cSrcweir 	deren Zustand zu ermitteln.
2177cdf0e10cSrcweir 
2178cdf0e10cSrcweir 	[Parameter]
2179cdf0e10cSrcweir 
2180cdf0e10cSrcweir 	SfxOrganizeListBox *pBox        die rufende Box
2181cdf0e10cSrcweir 
2182cdf0e10cSrcweir */
2183cdf0e10cSrcweir 
2184cdf0e10cSrcweir {
2185cdf0e10cSrcweir 	if(pFocusBox && pFocusBox != pBox)
2186cdf0e10cSrcweir 		pFocusBox->SelectAll(sal_False);
2187cdf0e10cSrcweir 	pFocusBox = pBox;
2188cdf0e10cSrcweir 	aFilesBtn.Enable( SfxOrganizeListBox_Impl::VIEW_FILES ==
2189cdf0e10cSrcweir 					  pFocusBox->GetViewType() );
2190cdf0e10cSrcweir 	return 0;
2191cdf0e10cSrcweir }
2192cdf0e10cSrcweir 
2193cdf0e10cSrcweir //-------------------------------------------------------------------------
2194cdf0e10cSrcweir 
IMPL_LINK(SfxOrganizeDlg_Impl,LeftListBoxSelect_Impl,ListBox *,pBox)2195cdf0e10cSrcweir IMPL_LINK( SfxOrganizeDlg_Impl, LeftListBoxSelect_Impl, ListBox *, pBox )
2196cdf0e10cSrcweir 
2197cdf0e10cSrcweir /*  [Beschreibung]
2198cdf0e10cSrcweir 
2199cdf0e10cSrcweir 	Select-Handler, wird aus den Select-Handler der Listboxen
2200cdf0e10cSrcweir 	gerufen.
2201cdf0e10cSrcweir 	Wenn sich der Modus der Boxen (Dokumentsicht, Dokumentvorlagensicht)
2202cdf0e10cSrcweir 	unterscheiden, werden die Models getrennt; andernfalls zusammengefa"st.
2203cdf0e10cSrcweir 
2204cdf0e10cSrcweir 	[Parameter]
2205cdf0e10cSrcweir 
2206cdf0e10cSrcweir 	ListBox *pBox               die rufende Box
2207cdf0e10cSrcweir 
2208cdf0e10cSrcweir */
2209cdf0e10cSrcweir {
2210cdf0e10cSrcweir 	const SfxOrganizeListBox_Impl::DataEnum
2211cdf0e10cSrcweir 		eViewType = pBox->GetSelectEntryPos() == 0 ?
2212cdf0e10cSrcweir 		SfxOrganizeListBox_Impl::VIEW_TEMPLATES : SfxOrganizeListBox_Impl::VIEW_FILES;
2213cdf0e10cSrcweir 	if(eViewType!= aLeftLb.GetViewType()) {
2214cdf0e10cSrcweir 		aLeftLb.SetViewType(eViewType);
2215cdf0e10cSrcweir 		if(aRightLb.GetViewType() == eViewType)
2216cdf0e10cSrcweir 			aLeftLb.SetModel(aRightLb.GetModel());
2217cdf0e10cSrcweir 		else {
2218cdf0e10cSrcweir 			// Models trennen
2219cdf0e10cSrcweir 			aLeftLb.DisconnectFromModel();
2220cdf0e10cSrcweir 			aLeftLb.Reset();
2221cdf0e10cSrcweir 		}
2222cdf0e10cSrcweir 	}
2223cdf0e10cSrcweir 	GetFocus_Impl(&aLeftLb);
2224cdf0e10cSrcweir 	return 0;
2225cdf0e10cSrcweir }
2226cdf0e10cSrcweir 
2227cdf0e10cSrcweir //-------------------------------------------------------------------------
2228cdf0e10cSrcweir 
IMPL_LINK(SfxOrganizeDlg_Impl,RightListBoxSelect_Impl,ListBox *,pBox)2229cdf0e10cSrcweir IMPL_LINK( SfxOrganizeDlg_Impl, RightListBoxSelect_Impl, ListBox *, pBox )
2230cdf0e10cSrcweir 
2231cdf0e10cSrcweir /*  [Beschreibung]
2232cdf0e10cSrcweir 
2233cdf0e10cSrcweir 	Select-Handler, wird aus den Select-Handler der Listboxen
2234cdf0e10cSrcweir 	gerufen.
2235cdf0e10cSrcweir 	Wenn sich der Modus der Boxen (Dokumentsicht, Dokumentvorlagensicht)
2236cdf0e10cSrcweir 	unterscheiden, werden die Models getrennt; andernfalls zusammengefa"st.
2237cdf0e10cSrcweir 
2238cdf0e10cSrcweir 	[Parameter]
2239cdf0e10cSrcweir 
2240cdf0e10cSrcweir 	ListBox *pBox               die rufende Box
2241cdf0e10cSrcweir 
2242cdf0e10cSrcweir */
2243cdf0e10cSrcweir {
2244cdf0e10cSrcweir 	const SfxOrganizeListBox_Impl::DataEnum eViewType =
2245cdf0e10cSrcweir 		pBox->GetSelectEntryPos() == 0 ?
2246cdf0e10cSrcweir 		SfxOrganizeListBox_Impl::VIEW_TEMPLATES : SfxOrganizeListBox_Impl::VIEW_FILES;
2247cdf0e10cSrcweir 	if(eViewType!= aRightLb.GetViewType())
2248cdf0e10cSrcweir 	{
2249cdf0e10cSrcweir 		aRightLb.SetViewType(eViewType);
2250cdf0e10cSrcweir 		if(aLeftLb.GetViewType() == eViewType)
2251cdf0e10cSrcweir 			aRightLb.SetModel(aLeftLb.GetModel());
2252cdf0e10cSrcweir 		else
2253cdf0e10cSrcweir 		{
2254cdf0e10cSrcweir 			// Models trennen
2255cdf0e10cSrcweir 			aRightLb.DisconnectFromModel();
2256cdf0e10cSrcweir 			aRightLb.Reset();
2257cdf0e10cSrcweir 		}
2258cdf0e10cSrcweir 	}
2259cdf0e10cSrcweir 	aRightLb.GrabFocus();
2260cdf0e10cSrcweir 	GetFocus_Impl(&aRightLb);
2261cdf0e10cSrcweir 	return 0;
2262cdf0e10cSrcweir }
2263cdf0e10cSrcweir 
2264cdf0e10cSrcweir //-------------------------------------------------------------------------
2265cdf0e10cSrcweir 
IMPL_LINK(SfxOrganizeDlg_Impl,OnAddressTemplateClicked,Button *,pButton)2266cdf0e10cSrcweir IMPL_LINK( SfxOrganizeDlg_Impl, OnAddressTemplateClicked, Button *, pButton )
2267cdf0e10cSrcweir {
2268cdf0e10cSrcweir     (void)pButton; //unused
2269cdf0e10cSrcweir 	svt::AddressBookSourceDialog aDialog(pDialog, ::comphelper::getProcessServiceFactory());
2270cdf0e10cSrcweir 	aDialog.Execute();
2271cdf0e10cSrcweir 	return 0L;
2272cdf0e10cSrcweir }
2273cdf0e10cSrcweir 
2274cdf0e10cSrcweir //-------------------------------------------------------------------------
2275cdf0e10cSrcweir 
IMPL_LINK(SfxOrganizeDlg_Impl,AddFiles_Impl,Button *,pButton)2276cdf0e10cSrcweir IMPL_LINK( SfxOrganizeDlg_Impl, AddFiles_Impl, Button *, pButton )
2277cdf0e10cSrcweir 
2278cdf0e10cSrcweir /*  [Beschreibung]
2279cdf0e10cSrcweir 
2280cdf0e10cSrcweir 	Handler des Buttons f"ur das Hinzuf"ugen von Dateien per Dialog.
2281cdf0e10cSrcweir 
2282cdf0e10cSrcweir 	[Parameter]
2283cdf0e10cSrcweir 
2284cdf0e10cSrcweir 	Button *                der Button, der dieses Events ausgel"ost hat.
2285cdf0e10cSrcweir 
2286cdf0e10cSrcweir */
2287cdf0e10cSrcweir {
2288cdf0e10cSrcweir     (void)pButton; //unused
2289cdf0e10cSrcweir     if ( pFileDlg )
2290cdf0e10cSrcweir         delete pFileDlg;
2291cdf0e10cSrcweir     pFileDlg = new sfx2::FileDialogHelper( WB_OPEN, String() );
2292cdf0e10cSrcweir 
2293cdf0e10cSrcweir     // add config and basic filter
2294cdf0e10cSrcweir 	static String sOpenBracket( DEFINE_CONST_UNICODE( " (" ) );
2295cdf0e10cSrcweir 	static String sCloseBracket( DEFINE_CONST_UNICODE( ")" ) );
2296cdf0e10cSrcweir 	static String sConfigExt( DEFINE_CONST_UNICODE( "*.cfg" ) );
2297cdf0e10cSrcweir 	static String sBasicExt( DEFINE_CONST_UNICODE( "*.sbl" ) );
2298cdf0e10cSrcweir 
2299cdf0e10cSrcweir 	String sFilterName( SfxResId( RID_STR_FILTCONFIG ) );
2300cdf0e10cSrcweir 	sFilterName += sOpenBracket;
2301cdf0e10cSrcweir 	sFilterName += sConfigExt;
2302cdf0e10cSrcweir 	sFilterName += sCloseBracket;
2303cdf0e10cSrcweir     pFileDlg->AddFilter( sFilterName, sConfigExt );
2304cdf0e10cSrcweir 
2305cdf0e10cSrcweir 	sFilterName = String( SfxResId( RID_STR_FILTBASIC ) );
2306cdf0e10cSrcweir 	sFilterName += sOpenBracket;
2307cdf0e10cSrcweir 	sFilterName += sBasicExt;
2308cdf0e10cSrcweir 	sFilterName += sCloseBracket;
2309cdf0e10cSrcweir     pFileDlg->AddFilter( sFilterName, sBasicExt );
2310cdf0e10cSrcweir 
2311cdf0e10cSrcweir 	// set "All" filter as current
2312cdf0e10cSrcweir     pFileDlg->SetCurrentFilter( String( SfxResId( STR_SFX_FILTERNAME_ALL ) ) );
2313cdf0e10cSrcweir 
2314cdf0e10cSrcweir 	if ( aLastDir.Len() )
2315cdf0e10cSrcweir         pFileDlg->SetDisplayDirectory( aLastDir );
2316cdf0e10cSrcweir 
2317cdf0e10cSrcweir     pFileDlg->StartExecuteModal( LINK( this, SfxOrganizeDlg_Impl, AddFilesHdl ) );
2318cdf0e10cSrcweir 
2319cdf0e10cSrcweir     return 0;
2320cdf0e10cSrcweir }
2321cdf0e10cSrcweir 
2322cdf0e10cSrcweir //-------------------------------------------------------------------------
2323cdf0e10cSrcweir 
IMPL_LINK(SfxOrganizeDlg_Impl,ImportHdl,sfx2::FileDialogHelper *,EMPTYARG)2324cdf0e10cSrcweir IMPL_LINK( SfxOrganizeDlg_Impl, ImportHdl, sfx2::FileDialogHelper *, EMPTYARG )
2325cdf0e10cSrcweir {
2326cdf0e10cSrcweir     DBG_ASSERT( pFileDlg, "SfxOrganizeDlg_Impl::ImportHdl(): no file dialog" );
2327cdf0e10cSrcweir 
2328cdf0e10cSrcweir     if ( ERRCODE_NONE == pFileDlg->GetError() )
2329cdf0e10cSrcweir     {
2330cdf0e10cSrcweir         String aPath = pFileDlg->GetPath();
2331cdf0e10cSrcweir         INetURLObject aObj( aPath );
2332cdf0e10cSrcweir 
2333cdf0e10cSrcweir         // we want to keep the original extension when exporting, the file open dialog
2334cdf0e10cSrcweir         // always sets the extension to *.vor
2335cdf0e10cSrcweir         if ( pFileDlg->GetDialogType() ==
2336cdf0e10cSrcweir                 com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE )
2337cdf0e10cSrcweir         {
2338cdf0e10cSrcweir             if ( aObj.hasExtension() )
2339cdf0e10cSrcweir                 aObj.removeExtension();
2340cdf0e10cSrcweir 
2341cdf0e10cSrcweir             aObj.setExtension( m_sExtension4Save );
2342cdf0e10cSrcweir             aPath = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI );
2343cdf0e10cSrcweir         }
2344cdf0e10cSrcweir 
2345cdf0e10cSrcweir         aObj.removeSegment();
2346cdf0e10cSrcweir         aLastDir = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI );
2347cdf0e10cSrcweir 
2348cdf0e10cSrcweir         if ( aPath.Len() && !aMgr.CopyTo( m_nRegion, m_nIndex, aPath ) )
2349cdf0e10cSrcweir         {
2350cdf0e10cSrcweir             String aText( SfxResId( STR_ERROR_COPY_TEMPLATE ) );
2351cdf0e10cSrcweir             aText.SearchAndReplaceAscii( "$1", aPath );
2352cdf0e10cSrcweir             ErrorBox( pDialog, WB_OK, aText ).Execute();
2353cdf0e10cSrcweir         }
2354cdf0e10cSrcweir     }
2355cdf0e10cSrcweir 
2356cdf0e10cSrcweir     return 0L;
2357cdf0e10cSrcweir }
2358cdf0e10cSrcweir 
2359cdf0e10cSrcweir //-------------------------------------------------------------------------
2360cdf0e10cSrcweir 
IMPL_LINK(SfxOrganizeDlg_Impl,ExportHdl,sfx2::FileDialogHelper *,EMPTYARG)2361cdf0e10cSrcweir IMPL_LINK( SfxOrganizeDlg_Impl, ExportHdl, sfx2::FileDialogHelper *, EMPTYARG )
2362cdf0e10cSrcweir {
2363cdf0e10cSrcweir     DBG_ASSERT( pFileDlg, "SfxOrganizeDlg_Impl::ImportHdl(): no file dialog" );
2364cdf0e10cSrcweir     ::com::sun::star::uno::Sequence< ::rtl::OUString > aPaths;
2365cdf0e10cSrcweir 
2366cdf0e10cSrcweir     if ( ERRCODE_NONE == pFileDlg->GetError() )
2367cdf0e10cSrcweir     {
2368cdf0e10cSrcweir         aPaths = pFileDlg->GetMPath();
2369cdf0e10cSrcweir         sal_Int32 lastCount = aPaths.getLength() - 1;
2370cdf0e10cSrcweir         INetURLObject aObj( aPaths.getArray()[ lastCount ] );
2371cdf0e10cSrcweir 
2372cdf0e10cSrcweir         aObj.removeSegment();
2373cdf0e10cSrcweir         aLastDir = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI );
2374cdf0e10cSrcweir     }
2375cdf0e10cSrcweir 
2376cdf0e10cSrcweir     sal_Int32 nCount = aPaths.getLength();
2377cdf0e10cSrcweir     if ( 1 == nCount )
2378cdf0e10cSrcweir     {
2379cdf0e10cSrcweir        String aPath = String( aPaths.getArray()[0] );
2380cdf0e10cSrcweir        if ( aPath.Len() && !aMgr.CopyFrom( pFocusBox, m_nRegion, m_nIndex, aPath ) )
2381cdf0e10cSrcweir        {
2382cdf0e10cSrcweir            String aText( SfxResId( STR_ERROR_COPY_TEMPLATE ) );
2383cdf0e10cSrcweir            aText.SearchAndReplaceAscii( "$1", aPath );
2384cdf0e10cSrcweir            ErrorBox( pDialog, WB_OK, aText ).Execute();
2385cdf0e10cSrcweir        }
2386cdf0e10cSrcweir     }
2387cdf0e10cSrcweir     else if ( nCount > 1 )
2388cdf0e10cSrcweir     {
2389cdf0e10cSrcweir         INetURLObject aPathObj( aPaths[0] );
2390cdf0e10cSrcweir         aPathObj.setFinalSlash();
2391cdf0e10cSrcweir         for ( sal_uInt16 i = 1; i < nCount; ++i )
2392cdf0e10cSrcweir         {
2393cdf0e10cSrcweir             if ( 1 == i )
2394cdf0e10cSrcweir                 aPathObj.Append( aPaths[i] );
2395cdf0e10cSrcweir             else
2396cdf0e10cSrcweir                 aPathObj.setName( aPaths[i] );
2397cdf0e10cSrcweir             String aPath = aPathObj.GetMainURL( INetURLObject::NO_DECODE );
2398cdf0e10cSrcweir             if ( aPath.Len() && !aMgr.CopyFrom( pFocusBox, m_nRegion, m_nIndex, aPath ) )
2399cdf0e10cSrcweir             {
2400cdf0e10cSrcweir                 String aText( SfxResId( STR_ERROR_COPY_TEMPLATE ) );
2401cdf0e10cSrcweir                 aText.SearchAndReplaceAscii( "$1", aPath );
2402cdf0e10cSrcweir                 ErrorBox( pDialog, WB_OK, aText ).Execute();
2403cdf0e10cSrcweir             }
2404cdf0e10cSrcweir         }
2405cdf0e10cSrcweir     }
2406cdf0e10cSrcweir 
2407cdf0e10cSrcweir     return 0L;
2408cdf0e10cSrcweir }
2409cdf0e10cSrcweir 
2410cdf0e10cSrcweir //-------------------------------------------------------------------------
2411cdf0e10cSrcweir 
IMPL_LINK(SfxOrganizeDlg_Impl,AddFilesHdl,sfx2::FileDialogHelper *,EMPTYARG)2412cdf0e10cSrcweir IMPL_LINK( SfxOrganizeDlg_Impl, AddFilesHdl, sfx2::FileDialogHelper *, EMPTYARG )
2413cdf0e10cSrcweir {
2414cdf0e10cSrcweir     if ( ERRCODE_NONE == pFileDlg->GetError() )
2415cdf0e10cSrcweir     {
2416cdf0e10cSrcweir         String aPath = pFileDlg->GetPath();
2417cdf0e10cSrcweir         aMgr.InsertFile( pFocusBox, aPath );
2418cdf0e10cSrcweir         INetURLObject aObj( aPath );
2419cdf0e10cSrcweir         aObj.removeSegment();
2420cdf0e10cSrcweir         aObj.setFinalSlash();
2421cdf0e10cSrcweir         aLastDir = aObj.GetMainURL( INetURLObject::DECODE_TO_IURI );
2422cdf0e10cSrcweir     }
2423cdf0e10cSrcweir 
2424cdf0e10cSrcweir     return 0L;
2425cdf0e10cSrcweir }
2426cdf0e10cSrcweir 
2427cdf0e10cSrcweir //-------------------------------------------------------------------------
2428cdf0e10cSrcweir 
Execute()2429cdf0e10cSrcweir short SfxTemplateOrganizeDlg::Execute()
2430cdf0e10cSrcweir 
2431cdf0e10cSrcweir /*  [Beschreibung]
2432cdf0e10cSrcweir 
2433cdf0e10cSrcweir 	"Uberladene Execute- Methode; speichert gfs. "Anderungen an den
2434cdf0e10cSrcweir 	Dokumentvorlagen
2435cdf0e10cSrcweir 	(SV-Methode)
2436cdf0e10cSrcweir 
2437cdf0e10cSrcweir */
2438cdf0e10cSrcweir 
2439cdf0e10cSrcweir {
2440cdf0e10cSrcweir 	const short nRet = ModalDialog::Execute();
2441cdf0e10cSrcweir 	if(RET_CANCEL != nRet)
2442cdf0e10cSrcweir 	{
2443cdf0e10cSrcweir 		pImp->aMgr.SaveAll(this);
2444cdf0e10cSrcweir 		SfxTemplateDialog* pTemplDlg = SFX_APP()->GetTemplateDialog();
2445cdf0e10cSrcweir 		if(pTemplDlg)
2446cdf0e10cSrcweir 			pTemplDlg->Update();
2447cdf0e10cSrcweir 	}
2448cdf0e10cSrcweir 	return nRet;
2449cdf0e10cSrcweir }
2450cdf0e10cSrcweir 
2451cdf0e10cSrcweir 
2452cdf0e10cSrcweir //-------------------------------------------------------------------------
2453cdf0e10cSrcweir 
SfxTemplateOrganizeDlg(Window * pParent,SfxDocumentTemplates * pTempl)2454cdf0e10cSrcweir SfxTemplateOrganizeDlg::SfxTemplateOrganizeDlg(Window * pParent,
2455cdf0e10cSrcweir 												SfxDocumentTemplates *pTempl)
2456cdf0e10cSrcweir :   ModalDialog( pParent, SfxResId(DLG_ORGANIZE)),
2457cdf0e10cSrcweir 	pImp( new SfxOrganizeDlg_Impl(this, pTempl) )
2458cdf0e10cSrcweir 
2459cdf0e10cSrcweir /*  [Beschreibung]
2460cdf0e10cSrcweir 
2461cdf0e10cSrcweir 	Konstruktor
2462cdf0e10cSrcweir 
2463cdf0e10cSrcweir */
2464cdf0e10cSrcweir {
2465cdf0e10cSrcweir 	FreeResource();
2466cdf0e10cSrcweir }
2467cdf0e10cSrcweir 
2468cdf0e10cSrcweir //-------------------------------------------------------------------------
2469cdf0e10cSrcweir 
~SfxTemplateOrganizeDlg()2470cdf0e10cSrcweir SfxTemplateOrganizeDlg::~SfxTemplateOrganizeDlg()
2471cdf0e10cSrcweir {
2472cdf0e10cSrcweir 	GetpApp()->RemoveAccel(&pImp->aEditAcc);
2473cdf0e10cSrcweir 	delete pImp->pPrt;
2474cdf0e10cSrcweir 	delete pImp;
2475cdf0e10cSrcweir }
2476cdf0e10cSrcweir 
2477