1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_cui.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski // include ---------------------------------------------------------------
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski #include <svx/svxdlg.hxx>
30*b1cdbd2cSJim Jagielski #include <tools/shl.hxx>
31*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
32*b1cdbd2cSJim Jagielski #include <sfx2/filedlghelper.hxx>
33*b1cdbd2cSJim Jagielski #include <sfx2/app.hxx>
34*b1cdbd2cSJim Jagielski #include <svl/aeitem.hxx>
35*b1cdbd2cSJim Jagielski #include <svtools/svtabbx.hxx>
36*b1cdbd2cSJim Jagielski #include <svtools/filedlg.hxx>
37*b1cdbd2cSJim Jagielski #include <tools/config.hxx>
38*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
39*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
40*b1cdbd2cSJim Jagielski #include <unotools/defaultoptions.hxx>
41*b1cdbd2cSJim Jagielski #include <unotools/localfilehelper.hxx>
42*b1cdbd2cSJim Jagielski #include <unotools/pathoptions.hxx>
43*b1cdbd2cSJim Jagielski #include <unotools/moduleoptions.hxx>
44*b1cdbd2cSJim Jagielski #include <unotools/viewoptions.hxx>
45*b1cdbd2cSJim Jagielski
46*b1cdbd2cSJim Jagielski #define _SVX_OPTPATH_CXX
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski #include "optpath.hxx"
49*b1cdbd2cSJim Jagielski #include <dialmgr.hxx>
50*b1cdbd2cSJim Jagielski #include "optpath.hrc"
51*b1cdbd2cSJim Jagielski #include <cuires.hrc>
52*b1cdbd2cSJim Jagielski #include "helpid.hrc"
53*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
54*b1cdbd2cSJim Jagielski #include <comphelper/configurationhelper.hxx>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Exception.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp>
61*b1cdbd2cSJim Jagielski #include "optHeaderTabListbox.hxx"
62*b1cdbd2cSJim Jagielski #include <readonlyimage.hxx>
63*b1cdbd2cSJim Jagielski #include <vcl/help.hxx>
64*b1cdbd2cSJim Jagielski
65*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
66*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
67*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ui::dialogs;
68*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
69*b1cdbd2cSJim Jagielski using namespace svx;
70*b1cdbd2cSJim Jagielski
71*b1cdbd2cSJim Jagielski // define ----------------------------------------------------------------
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielski #define TAB_WIDTH1 80
74*b1cdbd2cSJim Jagielski #define TAB_WIDTH_MIN 10
75*b1cdbd2cSJim Jagielski #define TAB_WIDTH2 1000
76*b1cdbd2cSJim Jagielski #define ITEMID_TYPE 1
77*b1cdbd2cSJim Jagielski #define ITEMID_PATH 2
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski #define POSTFIX_INTERNAL String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "_internal" ) )
80*b1cdbd2cSJim Jagielski #define POSTFIX_USER String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "_user" ) )
81*b1cdbd2cSJim Jagielski #define POSTFIX_WRITABLE String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "_writable" ) )
82*b1cdbd2cSJim Jagielski #define POSTFIX_READONLY String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "_readonly" ) )
83*b1cdbd2cSJim Jagielski #define VAR_ONE String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "%1" ) )
84*b1cdbd2cSJim Jagielski #define IODLG_CONFIGNAME String(DEFINE_CONST_UNICODE("FilePicker_Save"))
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski // struct OptPath_Impl ---------------------------------------------------
87*b1cdbd2cSJim Jagielski
88*b1cdbd2cSJim Jagielski struct OptPath_Impl
89*b1cdbd2cSJim Jagielski {
90*b1cdbd2cSJim Jagielski SvtDefaultOptions m_aDefOpt;
91*b1cdbd2cSJim Jagielski Image m_aLockImage;
92*b1cdbd2cSJim Jagielski Image m_aLockImageHC;
93*b1cdbd2cSJim Jagielski String m_sMultiPathDlg;
94*b1cdbd2cSJim Jagielski Reference< XPropertySet > m_xPathSettings;
95*b1cdbd2cSJim Jagielski
OptPath_ImplOptPath_Impl96*b1cdbd2cSJim Jagielski OptPath_Impl(const ResId& rLockRes, const ResId& rLockResHC) :
97*b1cdbd2cSJim Jagielski m_aLockImage(rLockRes),
98*b1cdbd2cSJim Jagielski m_aLockImageHC(rLockResHC){}
99*b1cdbd2cSJim Jagielski };
100*b1cdbd2cSJim Jagielski
101*b1cdbd2cSJim Jagielski // struct PathUserData_Impl ----------------------------------------------
102*b1cdbd2cSJim Jagielski
103*b1cdbd2cSJim Jagielski struct PathUserData_Impl
104*b1cdbd2cSJim Jagielski {
105*b1cdbd2cSJim Jagielski sal_uInt16 nRealId;
106*b1cdbd2cSJim Jagielski SfxItemState eState;
107*b1cdbd2cSJim Jagielski String sUserPath;
108*b1cdbd2cSJim Jagielski String sWritablePath;
109*b1cdbd2cSJim Jagielski
PathUserData_ImplPathUserData_Impl110*b1cdbd2cSJim Jagielski PathUserData_Impl( sal_uInt16 nId ) :
111*b1cdbd2cSJim Jagielski nRealId( nId ), eState( SFX_ITEM_UNKNOWN ) {}
112*b1cdbd2cSJim Jagielski };
113*b1cdbd2cSJim Jagielski
114*b1cdbd2cSJim Jagielski struct Handle2CfgNameMapping_Impl
115*b1cdbd2cSJim Jagielski {
116*b1cdbd2cSJim Jagielski sal_uInt16 m_nHandle;
117*b1cdbd2cSJim Jagielski const char* m_pCfgName;
118*b1cdbd2cSJim Jagielski };
119*b1cdbd2cSJim Jagielski
120*b1cdbd2cSJim Jagielski static Handle2CfgNameMapping_Impl __READONLY_DATA Hdl2CfgMap_Impl[] =
121*b1cdbd2cSJim Jagielski {
122*b1cdbd2cSJim Jagielski { SvtPathOptions::PATH_AUTOCORRECT, "AutoCorrect" },
123*b1cdbd2cSJim Jagielski { SvtPathOptions::PATH_AUTOTEXT, "AutoText" },
124*b1cdbd2cSJim Jagielski { SvtPathOptions::PATH_BACKUP, "Backup" },
125*b1cdbd2cSJim Jagielski { SvtPathOptions::PATH_GALLERY, "Gallery" },
126*b1cdbd2cSJim Jagielski { SvtPathOptions::PATH_GRAPHIC, "Graphic" },
127*b1cdbd2cSJim Jagielski { SvtPathOptions::PATH_TEMP, "Temp" },
128*b1cdbd2cSJim Jagielski { SvtPathOptions::PATH_TEMPLATE, "Template" },
129*b1cdbd2cSJim Jagielski { SvtPathOptions::PATH_WORK, "Work" },
130*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
131*b1cdbd2cSJim Jagielski { SvtPathOptions::PATH_LINGUISTIC, "Linguistic" },
132*b1cdbd2cSJim Jagielski { SvtPathOptions::PATH_DICTIONARY, "Dictionary" },
133*b1cdbd2cSJim Jagielski #endif
134*b1cdbd2cSJim Jagielski { USHRT_MAX, NULL }
135*b1cdbd2cSJim Jagielski };
136*b1cdbd2cSJim Jagielski
getCfgName_Impl(sal_uInt16 _nHandle)137*b1cdbd2cSJim Jagielski static String getCfgName_Impl( sal_uInt16 _nHandle )
138*b1cdbd2cSJim Jagielski {
139*b1cdbd2cSJim Jagielski String sCfgName;
140*b1cdbd2cSJim Jagielski sal_uInt16 nIndex = 0;
141*b1cdbd2cSJim Jagielski while ( Hdl2CfgMap_Impl[ nIndex ].m_nHandle != USHRT_MAX )
142*b1cdbd2cSJim Jagielski {
143*b1cdbd2cSJim Jagielski if ( Hdl2CfgMap_Impl[ nIndex ].m_nHandle == _nHandle )
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski // config name found
146*b1cdbd2cSJim Jagielski sCfgName = String::CreateFromAscii( Hdl2CfgMap_Impl[ nIndex ].m_pCfgName );
147*b1cdbd2cSJim Jagielski break;
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski ++nIndex;
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski
152*b1cdbd2cSJim Jagielski return sCfgName;
153*b1cdbd2cSJim Jagielski }
154*b1cdbd2cSJim Jagielski
155*b1cdbd2cSJim Jagielski #define MULTIPATH_DELIMITER ';'
156*b1cdbd2cSJim Jagielski
Convert_Impl(const String & rValue)157*b1cdbd2cSJim Jagielski String Convert_Impl( const String& rValue )
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski char cDelim = MULTIPATH_DELIMITER;
160*b1cdbd2cSJim Jagielski sal_uInt16 nCount = rValue.GetTokenCount( cDelim );
161*b1cdbd2cSJim Jagielski String aReturn;
162*b1cdbd2cSJim Jagielski for ( sal_uInt16 i=0; i<nCount ; ++i )
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski String aValue = rValue.GetToken( i, cDelim );
165*b1cdbd2cSJim Jagielski INetURLObject aObj( aValue );
166*b1cdbd2cSJim Jagielski if ( aObj.GetProtocol() == INET_PROT_FILE )
167*b1cdbd2cSJim Jagielski aReturn += String(aObj.PathToFileName());
168*b1cdbd2cSJim Jagielski else if ( ::utl::LocalFileHelper::IsFileContent( aValue ) )
169*b1cdbd2cSJim Jagielski aReturn += String(aObj.GetURLPath( INetURLObject::DECODE_WITH_CHARSET ));
170*b1cdbd2cSJim Jagielski if ( i+1 < nCount)
171*b1cdbd2cSJim Jagielski aReturn += MULTIPATH_DELIMITER;
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski
174*b1cdbd2cSJim Jagielski return aReturn;
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski
177*b1cdbd2cSJim Jagielski // class SvxControlFocusHelper ---------------------------------------------
178*b1cdbd2cSJim Jagielski
Notify(NotifyEvent & rNEvt)179*b1cdbd2cSJim Jagielski long SvxControlFocusHelper::Notify( NotifyEvent& rNEvt )
180*b1cdbd2cSJim Jagielski {
181*b1cdbd2cSJim Jagielski long nRet = Control::Notify( rNEvt );
182*b1cdbd2cSJim Jagielski
183*b1cdbd2cSJim Jagielski if ( m_pFocusCtrl && rNEvt.GetWindow() != m_pFocusCtrl && rNEvt.GetType() == EVENT_GETFOCUS )
184*b1cdbd2cSJim Jagielski m_pFocusCtrl->GrabFocus();
185*b1cdbd2cSJim Jagielski return nRet;
186*b1cdbd2cSJim Jagielski }
187*b1cdbd2cSJim Jagielski
188*b1cdbd2cSJim Jagielski // functions -------------------------------------------------------------
189*b1cdbd2cSJim Jagielski
IsMultiPath_Impl(const sal_uInt16 nIndex)190*b1cdbd2cSJim Jagielski sal_Bool IsMultiPath_Impl( const sal_uInt16 nIndex )
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
193*b1cdbd2cSJim Jagielski return ( SvtPathOptions::PATH_AUTOCORRECT == nIndex ||
194*b1cdbd2cSJim Jagielski SvtPathOptions::PATH_AUTOTEXT == nIndex ||
195*b1cdbd2cSJim Jagielski SvtPathOptions::PATH_BASIC == nIndex ||
196*b1cdbd2cSJim Jagielski SvtPathOptions::PATH_GALLERY == nIndex ||
197*b1cdbd2cSJim Jagielski SvtPathOptions::PATH_TEMPLATE == nIndex );
198*b1cdbd2cSJim Jagielski #else
199*b1cdbd2cSJim Jagielski return ( SvtPathOptions::PATH_AUTOCORRECT == nIndex ||
200*b1cdbd2cSJim Jagielski SvtPathOptions::PATH_AUTOTEXT == nIndex ||
201*b1cdbd2cSJim Jagielski SvtPathOptions::PATH_BASIC == nIndex ||
202*b1cdbd2cSJim Jagielski SvtPathOptions::PATH_GALLERY == nIndex ||
203*b1cdbd2cSJim Jagielski SvtPathOptions::PATH_TEMPLATE == nIndex ||
204*b1cdbd2cSJim Jagielski SvtPathOptions::PATH_LINGUISTIC == nIndex ||
205*b1cdbd2cSJim Jagielski SvtPathOptions::PATH_DICTIONARY == nIndex );
206*b1cdbd2cSJim Jagielski #endif
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski
209*b1cdbd2cSJim Jagielski // class SvxPathTabPage --------------------------------------------------
210*b1cdbd2cSJim Jagielski
SvxPathTabPage(Window * pParent,const SfxItemSet & rSet)211*b1cdbd2cSJim Jagielski SvxPathTabPage::SvxPathTabPage( Window* pParent, const SfxItemSet& rSet ) :
212*b1cdbd2cSJim Jagielski
213*b1cdbd2cSJim Jagielski SfxTabPage( pParent, CUI_RES( RID_SFXPAGE_PATH ), rSet ),
214*b1cdbd2cSJim Jagielski
215*b1cdbd2cSJim Jagielski aStdBox ( this, CUI_RES( GB_STD ) ),
216*b1cdbd2cSJim Jagielski aTypeText ( this, CUI_RES( FT_TYPE ) ),
217*b1cdbd2cSJim Jagielski aPathText ( this, CUI_RES( FT_PATH ) ),
218*b1cdbd2cSJim Jagielski aPathCtrl ( this, CUI_RES( LB_PATH ) ),
219*b1cdbd2cSJim Jagielski aStandardBtn ( this, CUI_RES( BTN_STANDARD ) ),
220*b1cdbd2cSJim Jagielski aPathBtn ( this, CUI_RES( BTN_PATH ) ),
221*b1cdbd2cSJim Jagielski pHeaderBar ( NULL ),
222*b1cdbd2cSJim Jagielski pPathBox ( NULL ),
223*b1cdbd2cSJim Jagielski pImpl ( new OptPath_Impl( CUI_RES(IMG_LOCK), CUI_RES(IMG_LOCK_HC) ) ),
224*b1cdbd2cSJim Jagielski xDialogListener ( new ::svt::DialogClosedListener() )
225*b1cdbd2cSJim Jagielski
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski pImpl->m_sMultiPathDlg = String( CUI_RES( STR_MULTIPATHDLG ) );
228*b1cdbd2cSJim Jagielski aStandardBtn.SetClickHdl( LINK( this, SvxPathTabPage, StandardHdl_Impl ) );
229*b1cdbd2cSJim Jagielski Link aLink = LINK( this, SvxPathTabPage, PathHdl_Impl );
230*b1cdbd2cSJim Jagielski aPathBtn.SetClickHdl( aLink );
231*b1cdbd2cSJim Jagielski Size aBoxSize = aPathCtrl.GetOutputSizePixel();
232*b1cdbd2cSJim Jagielski pHeaderBar = new HeaderBar( &aPathCtrl, WB_BUTTONSTYLE | WB_BOTTOMBORDER );
233*b1cdbd2cSJim Jagielski pHeaderBar->SetPosSizePixel( Point( 0, 0 ), Size( aBoxSize.Width(), 16 ) );
234*b1cdbd2cSJim Jagielski pHeaderBar->SetSelectHdl( LINK( this, SvxPathTabPage, HeaderSelect_Impl ) );
235*b1cdbd2cSJim Jagielski pHeaderBar->SetEndDragHdl( LINK( this, SvxPathTabPage, HeaderEndDrag_Impl ) );
236*b1cdbd2cSJim Jagielski Size aSz;
237*b1cdbd2cSJim Jagielski aSz.Width() = TAB_WIDTH1;
238*b1cdbd2cSJim Jagielski pHeaderBar->InsertItem( ITEMID_TYPE, aTypeText.GetText(),
239*b1cdbd2cSJim Jagielski LogicToPixel( aSz, MapMode( MAP_APPFONT ) ).Width(),
240*b1cdbd2cSJim Jagielski HIB_LEFT | HIB_VCENTER | HIB_CLICKABLE | HIB_UPARROW );
241*b1cdbd2cSJim Jagielski aSz.Width() = TAB_WIDTH2;
242*b1cdbd2cSJim Jagielski pHeaderBar->InsertItem( ITEMID_PATH, aPathText.GetText(),
243*b1cdbd2cSJim Jagielski LogicToPixel( aSz, MapMode( MAP_APPFONT ) ).Width(),
244*b1cdbd2cSJim Jagielski HIB_LEFT | HIB_VCENTER );
245*b1cdbd2cSJim Jagielski
246*b1cdbd2cSJim Jagielski static long nTabs[] = {3, 0, TAB_WIDTH1, TAB_WIDTH1 + TAB_WIDTH2 };
247*b1cdbd2cSJim Jagielski Size aHeadSize = pHeaderBar->GetSizePixel();
248*b1cdbd2cSJim Jagielski
249*b1cdbd2cSJim Jagielski WinBits nBits = WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP;
250*b1cdbd2cSJim Jagielski pPathBox = new svx::OptHeaderTabListBox( &aPathCtrl, nBits );
251*b1cdbd2cSJim Jagielski aPathCtrl.SetFocusControl( pPathBox );
252*b1cdbd2cSJim Jagielski pPathBox->SetDoubleClickHdl( aLink );
253*b1cdbd2cSJim Jagielski pPathBox->SetSelectHdl( LINK( this, SvxPathTabPage, PathSelect_Impl ) );
254*b1cdbd2cSJim Jagielski pPathBox->SetSelectionMode( MULTIPLE_SELECTION );
255*b1cdbd2cSJim Jagielski pPathBox->SetPosSizePixel( Point( 0, aHeadSize.Height() ),
256*b1cdbd2cSJim Jagielski Size( aBoxSize.Width(), aBoxSize.Height() - aHeadSize.Height() ) );
257*b1cdbd2cSJim Jagielski pPathBox->SetTabs( &nTabs[0], MAP_APPFONT );
258*b1cdbd2cSJim Jagielski pPathBox->InitHeaderBar( pHeaderBar );
259*b1cdbd2cSJim Jagielski pPathBox->SetHighlightRange();
260*b1cdbd2cSJim Jagielski pPathBox->SetHelpId( HID_OPTPATH_CTL_PATH );
261*b1cdbd2cSJim Jagielski pHeaderBar->SetHelpId( HID_OPTPATH_HEADERBAR );
262*b1cdbd2cSJim Jagielski pPathBox->Show();
263*b1cdbd2cSJim Jagielski pHeaderBar->Show();
264*b1cdbd2cSJim Jagielski
265*b1cdbd2cSJim Jagielski FreeResource();
266*b1cdbd2cSJim Jagielski
267*b1cdbd2cSJim Jagielski xDialogListener->SetDialogClosedLink( LINK( this, SvxPathTabPage, DialogClosedHdl ) );
268*b1cdbd2cSJim Jagielski }
269*b1cdbd2cSJim Jagielski
270*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
271*b1cdbd2cSJim Jagielski
~SvxPathTabPage()272*b1cdbd2cSJim Jagielski SvxPathTabPage::~SvxPathTabPage()
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski // #110603# do not grab focus to a destroyed window !!!
275*b1cdbd2cSJim Jagielski aPathCtrl.SetFocusControl( NULL );
276*b1cdbd2cSJim Jagielski
277*b1cdbd2cSJim Jagielski pHeaderBar->Hide();
278*b1cdbd2cSJim Jagielski for ( sal_uInt16 i = 0; i < pPathBox->GetEntryCount(); ++i )
279*b1cdbd2cSJim Jagielski delete (PathUserData_Impl*)pPathBox->GetEntry(i)->GetUserData();
280*b1cdbd2cSJim Jagielski delete pPathBox;
281*b1cdbd2cSJim Jagielski delete pHeaderBar;
282*b1cdbd2cSJim Jagielski delete pImpl;
283*b1cdbd2cSJim Jagielski }
284*b1cdbd2cSJim Jagielski
285*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
286*b1cdbd2cSJim Jagielski
Create(Window * pParent,const SfxItemSet & rAttrSet)287*b1cdbd2cSJim Jagielski SfxTabPage* SvxPathTabPage::Create( Window* pParent,
288*b1cdbd2cSJim Jagielski const SfxItemSet& rAttrSet )
289*b1cdbd2cSJim Jagielski {
290*b1cdbd2cSJim Jagielski return ( new SvxPathTabPage( pParent, rAttrSet ) );
291*b1cdbd2cSJim Jagielski }
292*b1cdbd2cSJim Jagielski
293*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
294*b1cdbd2cSJim Jagielski
FillItemSet(SfxItemSet &)295*b1cdbd2cSJim Jagielski sal_Bool SvxPathTabPage::FillItemSet( SfxItemSet& )
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski SvtPathOptions aPathOpt;
298*b1cdbd2cSJim Jagielski for ( sal_uInt16 i = 0; i < pPathBox->GetEntryCount(); ++i )
299*b1cdbd2cSJim Jagielski {
300*b1cdbd2cSJim Jagielski PathUserData_Impl* pPathImpl = (PathUserData_Impl*)pPathBox->GetEntry(i)->GetUserData();
301*b1cdbd2cSJim Jagielski sal_uInt16 nRealId = pPathImpl->nRealId;
302*b1cdbd2cSJim Jagielski if ( pPathImpl->eState == SFX_ITEM_SET )
303*b1cdbd2cSJim Jagielski SetPathList( nRealId, pPathImpl->sUserPath, pPathImpl->sWritablePath );
304*b1cdbd2cSJim Jagielski }
305*b1cdbd2cSJim Jagielski return sal_True;
306*b1cdbd2cSJim Jagielski }
307*b1cdbd2cSJim Jagielski
308*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
309*b1cdbd2cSJim Jagielski
Reset(const SfxItemSet &)310*b1cdbd2cSJim Jagielski void SvxPathTabPage::Reset( const SfxItemSet& )
311*b1cdbd2cSJim Jagielski {
312*b1cdbd2cSJim Jagielski pPathBox->Clear();
313*b1cdbd2cSJim Jagielski SvtPathOptions aPathOpt; //! deprecated
314*b1cdbd2cSJim Jagielski
315*b1cdbd2cSJim Jagielski for( sal_uInt16 i = 0; i <= (sal_uInt16)SvtPathOptions::PATH_WORK; ++i )
316*b1cdbd2cSJim Jagielski {
317*b1cdbd2cSJim Jagielski // only writer uses autotext
318*b1cdbd2cSJim Jagielski if ( i == SvtPathOptions::PATH_AUTOTEXT
319*b1cdbd2cSJim Jagielski && !SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::E_SWRITER ) )
320*b1cdbd2cSJim Jagielski continue;
321*b1cdbd2cSJim Jagielski
322*b1cdbd2cSJim Jagielski switch (i)
323*b1cdbd2cSJim Jagielski {
324*b1cdbd2cSJim Jagielski case SvtPathOptions::PATH_AUTOCORRECT:
325*b1cdbd2cSJim Jagielski case SvtPathOptions::PATH_AUTOTEXT:
326*b1cdbd2cSJim Jagielski case SvtPathOptions::PATH_BACKUP:
327*b1cdbd2cSJim Jagielski case SvtPathOptions::PATH_GALLERY:
328*b1cdbd2cSJim Jagielski case SvtPathOptions::PATH_GRAPHIC:
329*b1cdbd2cSJim Jagielski case SvtPathOptions::PATH_TEMP:
330*b1cdbd2cSJim Jagielski case SvtPathOptions::PATH_TEMPLATE:
331*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
332*b1cdbd2cSJim Jagielski case SvtPathOptions::PATH_LINGUISTIC:
333*b1cdbd2cSJim Jagielski case SvtPathOptions::PATH_DICTIONARY:
334*b1cdbd2cSJim Jagielski #endif
335*b1cdbd2cSJim Jagielski case SvtPathOptions::PATH_WORK:
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski String aStr( CUI_RES( RID_SVXSTR_PATH_NAME_START + i ) );
338*b1cdbd2cSJim Jagielski String sInternal, sUser, sWritable;
339*b1cdbd2cSJim Jagielski sal_Bool bReadOnly = sal_False;
340*b1cdbd2cSJim Jagielski GetPathList( i, sInternal, sUser, sWritable, bReadOnly );
341*b1cdbd2cSJim Jagielski String sTmpPath = sUser;
342*b1cdbd2cSJim Jagielski if ( sTmpPath.Len() > 0 && sWritable.Len() > 0 )
343*b1cdbd2cSJim Jagielski sTmpPath += MULTIPATH_DELIMITER;
344*b1cdbd2cSJim Jagielski sTmpPath += sWritable;
345*b1cdbd2cSJim Jagielski String aValue( sTmpPath );
346*b1cdbd2cSJim Jagielski aStr += '\t';
347*b1cdbd2cSJim Jagielski aStr += Convert_Impl( aValue );
348*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = pPathBox->InsertEntry( aStr );
349*b1cdbd2cSJim Jagielski if ( bReadOnly )
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski pPathBox->SetCollapsedEntryBmp( pEntry, pImpl->m_aLockImage, BMP_COLOR_NORMAL );
352*b1cdbd2cSJim Jagielski pPathBox->SetCollapsedEntryBmp( pEntry, pImpl->m_aLockImageHC, BMP_COLOR_HIGHCONTRAST );
353*b1cdbd2cSJim Jagielski }
354*b1cdbd2cSJim Jagielski PathUserData_Impl* pPathImpl = new PathUserData_Impl(i);
355*b1cdbd2cSJim Jagielski pPathImpl->sUserPath = sUser;
356*b1cdbd2cSJim Jagielski pPathImpl->sWritablePath = sWritable;
357*b1cdbd2cSJim Jagielski pEntry->SetUserData( pPathImpl );
358*b1cdbd2cSJim Jagielski }
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski }
361*b1cdbd2cSJim Jagielski
362*b1cdbd2cSJim Jagielski String aUserData = GetUserData();
363*b1cdbd2cSJim Jagielski if ( aUserData.Len() )
364*b1cdbd2cSJim Jagielski {
365*b1cdbd2cSJim Jagielski // Spaltenbreite restaurieren
366*b1cdbd2cSJim Jagielski pHeaderBar->SetItemSize( ITEMID_TYPE, aUserData.GetToken(0).ToInt32() );
367*b1cdbd2cSJim Jagielski HeaderEndDrag_Impl( NULL );
368*b1cdbd2cSJim Jagielski // Sortierrichtung restaurieren
369*b1cdbd2cSJim Jagielski sal_Bool bUp = (sal_Bool)(sal_uInt16)aUserData.GetToken(1).ToInt32();
370*b1cdbd2cSJim Jagielski HeaderBarItemBits nBits = pHeaderBar->GetItemBits(ITEMID_TYPE);
371*b1cdbd2cSJim Jagielski
372*b1cdbd2cSJim Jagielski if ( bUp )
373*b1cdbd2cSJim Jagielski {
374*b1cdbd2cSJim Jagielski nBits &= ~HIB_UPARROW;
375*b1cdbd2cSJim Jagielski nBits |= HIB_DOWNARROW;
376*b1cdbd2cSJim Jagielski }
377*b1cdbd2cSJim Jagielski else
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski nBits &= ~HIB_DOWNARROW;
380*b1cdbd2cSJim Jagielski nBits |= HIB_UPARROW;
381*b1cdbd2cSJim Jagielski }
382*b1cdbd2cSJim Jagielski pHeaderBar->SetItemBits( ITEMID_TYPE, nBits );
383*b1cdbd2cSJim Jagielski HeaderSelect_Impl( NULL );
384*b1cdbd2cSJim Jagielski }
385*b1cdbd2cSJim Jagielski PathSelect_Impl( NULL );
386*b1cdbd2cSJim Jagielski }
387*b1cdbd2cSJim Jagielski
388*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
389*b1cdbd2cSJim Jagielski
FillUserData()390*b1cdbd2cSJim Jagielski void SvxPathTabPage::FillUserData()
391*b1cdbd2cSJim Jagielski {
392*b1cdbd2cSJim Jagielski String aUserData = String::CreateFromInt32( pHeaderBar->GetItemSize( ITEMID_TYPE ) );
393*b1cdbd2cSJim Jagielski aUserData += ';';
394*b1cdbd2cSJim Jagielski HeaderBarItemBits nBits = pHeaderBar->GetItemBits( ITEMID_TYPE );
395*b1cdbd2cSJim Jagielski sal_Bool bUp = ( ( nBits & HIB_UPARROW ) == HIB_UPARROW );
396*b1cdbd2cSJim Jagielski aUserData += bUp ? '1' : '0';
397*b1cdbd2cSJim Jagielski SetUserData( aUserData );
398*b1cdbd2cSJim Jagielski }
399*b1cdbd2cSJim Jagielski
400*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
401*b1cdbd2cSJim Jagielski
IMPL_LINK(SvxPathTabPage,PathSelect_Impl,svx::OptHeaderTabListBox *,EMPTYARG)402*b1cdbd2cSJim Jagielski IMPL_LINK( SvxPathTabPage, PathSelect_Impl, svx::OptHeaderTabListBox *, EMPTYARG )
403*b1cdbd2cSJim Jagielski
404*b1cdbd2cSJim Jagielski /* [Beschreibung]
405*b1cdbd2cSJim Jagielski
406*b1cdbd2cSJim Jagielski */
407*b1cdbd2cSJim Jagielski
408*b1cdbd2cSJim Jagielski {
409*b1cdbd2cSJim Jagielski sal_uInt16 nSelCount = 0;
410*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = pPathBox->FirstSelected();
411*b1cdbd2cSJim Jagielski
412*b1cdbd2cSJim Jagielski //the entry image indicates whether the path is write protected
413*b1cdbd2cSJim Jagielski Image aEntryImage;
414*b1cdbd2cSJim Jagielski if(pEntry)
415*b1cdbd2cSJim Jagielski aEntryImage = pPathBox->GetCollapsedEntryBmp( pEntry );
416*b1cdbd2cSJim Jagielski sal_Bool bEnable = !aEntryImage;
417*b1cdbd2cSJim Jagielski while ( pEntry && ( nSelCount < 2 ) )
418*b1cdbd2cSJim Jagielski {
419*b1cdbd2cSJim Jagielski nSelCount++;
420*b1cdbd2cSJim Jagielski pEntry = pPathBox->NextSelected( pEntry );
421*b1cdbd2cSJim Jagielski }
422*b1cdbd2cSJim Jagielski
423*b1cdbd2cSJim Jagielski aPathBtn.Enable( 1 == nSelCount && bEnable);
424*b1cdbd2cSJim Jagielski aStandardBtn.Enable( nSelCount > 0 && bEnable);
425*b1cdbd2cSJim Jagielski return 0;
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski
428*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
429*b1cdbd2cSJim Jagielski
IMPL_LINK(SvxPathTabPage,StandardHdl_Impl,PushButton *,EMPTYARG)430*b1cdbd2cSJim Jagielski IMPL_LINK( SvxPathTabPage, StandardHdl_Impl, PushButton *, EMPTYARG )
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = pPathBox->FirstSelected();
433*b1cdbd2cSJim Jagielski while ( pEntry )
434*b1cdbd2cSJim Jagielski {
435*b1cdbd2cSJim Jagielski PathUserData_Impl* pPathImpl = (PathUserData_Impl*)pEntry->GetUserData();
436*b1cdbd2cSJim Jagielski String aOldPath = pImpl->m_aDefOpt.GetDefaultPath( pPathImpl->nRealId );
437*b1cdbd2cSJim Jagielski
438*b1cdbd2cSJim Jagielski if ( aOldPath.Len() )
439*b1cdbd2cSJim Jagielski {
440*b1cdbd2cSJim Jagielski String sInternal, sUser, sWritable, sTemp;
441*b1cdbd2cSJim Jagielski sal_Bool bReadOnly = sal_False;
442*b1cdbd2cSJim Jagielski GetPathList( pPathImpl->nRealId, sInternal, sUser, sWritable, bReadOnly );
443*b1cdbd2cSJim Jagielski
444*b1cdbd2cSJim Jagielski sal_uInt16 i;
445*b1cdbd2cSJim Jagielski sal_uInt16 nOldCount = aOldPath.GetTokenCount( MULTIPATH_DELIMITER );
446*b1cdbd2cSJim Jagielski sal_uInt16 nIntCount = sInternal.GetTokenCount( MULTIPATH_DELIMITER );
447*b1cdbd2cSJim Jagielski for ( i = 0; i < nOldCount; ++i )
448*b1cdbd2cSJim Jagielski {
449*b1cdbd2cSJim Jagielski bool bFound = false;
450*b1cdbd2cSJim Jagielski String sOnePath = aOldPath.GetToken( i, MULTIPATH_DELIMITER );
451*b1cdbd2cSJim Jagielski for ( sal_uInt16 j = 0; !bFound && j < nIntCount; ++j )
452*b1cdbd2cSJim Jagielski {
453*b1cdbd2cSJim Jagielski if ( sInternal.GetToken( i, MULTIPATH_DELIMITER ) == sOnePath )
454*b1cdbd2cSJim Jagielski bFound = true;
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski if ( !bFound )
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski if ( sTemp.Len() > 0 )
459*b1cdbd2cSJim Jagielski sTemp += MULTIPATH_DELIMITER;
460*b1cdbd2cSJim Jagielski sTemp += sOnePath;
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski }
463*b1cdbd2cSJim Jagielski
464*b1cdbd2cSJim Jagielski String sUserPath, sWritablePath;
465*b1cdbd2cSJim Jagielski nOldCount = sTemp.GetTokenCount( MULTIPATH_DELIMITER );
466*b1cdbd2cSJim Jagielski for ( i = 0; nOldCount > 0 && i < nOldCount - 1; ++i )
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski if ( sUserPath.Len() > 0 )
469*b1cdbd2cSJim Jagielski sUserPath += MULTIPATH_DELIMITER;
470*b1cdbd2cSJim Jagielski sUserPath += sTemp.GetToken( i, MULTIPATH_DELIMITER );
471*b1cdbd2cSJim Jagielski }
472*b1cdbd2cSJim Jagielski sWritablePath = sTemp.GetToken( nOldCount - 1, MULTIPATH_DELIMITER );
473*b1cdbd2cSJim Jagielski
474*b1cdbd2cSJim Jagielski pPathBox->SetEntryText( Convert_Impl( sTemp ), pEntry, 1 );
475*b1cdbd2cSJim Jagielski pPathImpl->eState = SFX_ITEM_SET;
476*b1cdbd2cSJim Jagielski pPathImpl->sUserPath = sUserPath;
477*b1cdbd2cSJim Jagielski pPathImpl->sWritablePath = sWritablePath;
478*b1cdbd2cSJim Jagielski }
479*b1cdbd2cSJim Jagielski pEntry = pPathBox->NextSelected( pEntry );
480*b1cdbd2cSJim Jagielski }
481*b1cdbd2cSJim Jagielski return 0;
482*b1cdbd2cSJim Jagielski }
483*b1cdbd2cSJim Jagielski
484*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
485*b1cdbd2cSJim Jagielski
ChangeCurrentEntry(const String & _rFolder)486*b1cdbd2cSJim Jagielski void SvxPathTabPage::ChangeCurrentEntry( const String& _rFolder )
487*b1cdbd2cSJim Jagielski {
488*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = pPathBox->GetCurEntry();
489*b1cdbd2cSJim Jagielski if ( !pEntry )
490*b1cdbd2cSJim Jagielski {
491*b1cdbd2cSJim Jagielski DBG_ERRORFILE( "SvxPathTabPage::ChangeCurrentEntry(): no entry" );
492*b1cdbd2cSJim Jagielski return;
493*b1cdbd2cSJim Jagielski }
494*b1cdbd2cSJim Jagielski
495*b1cdbd2cSJim Jagielski String sInternal, sUser, sWritable;
496*b1cdbd2cSJim Jagielski PathUserData_Impl* pPathImpl = (PathUserData_Impl*)pEntry->GetUserData();
497*b1cdbd2cSJim Jagielski sal_Bool bReadOnly = sal_False;
498*b1cdbd2cSJim Jagielski GetPathList( pPathImpl->nRealId, sInternal, sUser, sWritable, bReadOnly );
499*b1cdbd2cSJim Jagielski sUser = pPathImpl->sUserPath;
500*b1cdbd2cSJim Jagielski sWritable = pPathImpl->sWritablePath;
501*b1cdbd2cSJim Jagielski sal_uInt16 nPos = pPathImpl->nRealId;
502*b1cdbd2cSJim Jagielski
503*b1cdbd2cSJim Jagielski // old path is an URL?
504*b1cdbd2cSJim Jagielski INetURLObject aObj( sWritable );
505*b1cdbd2cSJim Jagielski FASTBOOL bURL = ( aObj.GetProtocol() != INET_PROT_NOT_VALID );
506*b1cdbd2cSJim Jagielski rtl::OUString aPathStr( _rFolder );
507*b1cdbd2cSJim Jagielski INetURLObject aNewObj( aPathStr );
508*b1cdbd2cSJim Jagielski aNewObj.removeFinalSlash();
509*b1cdbd2cSJim Jagielski
510*b1cdbd2cSJim Jagielski // then the new path also an URL else system path
511*b1cdbd2cSJim Jagielski String sNewPathStr = bURL ? aPathStr : aNewObj.getFSysPath( INetURLObject::FSYS_DETECT );
512*b1cdbd2cSJim Jagielski
513*b1cdbd2cSJim Jagielski FASTBOOL bChanged =
514*b1cdbd2cSJim Jagielski #ifdef UNX
515*b1cdbd2cSJim Jagielski // Unix is case sensitive
516*b1cdbd2cSJim Jagielski ( sNewPathStr != sWritable );
517*b1cdbd2cSJim Jagielski #else
518*b1cdbd2cSJim Jagielski ( sNewPathStr.CompareIgnoreCaseToAscii( sWritable ) != COMPARE_EQUAL );
519*b1cdbd2cSJim Jagielski #endif
520*b1cdbd2cSJim Jagielski
521*b1cdbd2cSJim Jagielski if ( bChanged )
522*b1cdbd2cSJim Jagielski {
523*b1cdbd2cSJim Jagielski pPathBox->SetEntryText( Convert_Impl( sNewPathStr ), pEntry, 1 );
524*b1cdbd2cSJim Jagielski nPos = (sal_uInt16)pPathBox->GetModel()->GetAbsPos( pEntry );
525*b1cdbd2cSJim Jagielski pPathImpl = (PathUserData_Impl*)pPathBox->GetEntry(nPos)->GetUserData();
526*b1cdbd2cSJim Jagielski pPathImpl->eState = SFX_ITEM_SET;
527*b1cdbd2cSJim Jagielski pPathImpl->sWritablePath = sNewPathStr;
528*b1cdbd2cSJim Jagielski if ( SvtPathOptions::PATH_WORK == pPathImpl->nRealId )
529*b1cdbd2cSJim Jagielski {
530*b1cdbd2cSJim Jagielski // Remove view options entry so the new work path
531*b1cdbd2cSJim Jagielski // will be used for the next open dialog.
532*b1cdbd2cSJim Jagielski SvtViewOptions aDlgOpt( E_DIALOG, IODLG_CONFIGNAME );
533*b1cdbd2cSJim Jagielski aDlgOpt.Delete();
534*b1cdbd2cSJim Jagielski // Reset also last used dir in the sfx application instance
535*b1cdbd2cSJim Jagielski SfxApplication *pSfxApp = SFX_APP();
536*b1cdbd2cSJim Jagielski pSfxApp->ResetLastDir();
537*b1cdbd2cSJim Jagielski
538*b1cdbd2cSJim Jagielski // Set configuration flag to notify file picker that it's necessary
539*b1cdbd2cSJim Jagielski // to take over the path provided.
540*b1cdbd2cSJim Jagielski Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
541*b1cdbd2cSJim Jagielski ::comphelper::ConfigurationHelper::writeDirectKey(xFactory,
542*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.Common/")),
543*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Path/Info")),
544*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkPathChanged")),
545*b1cdbd2cSJim Jagielski ::com::sun::star::uno::makeAny(true),
546*b1cdbd2cSJim Jagielski ::comphelper::ConfigurationHelper::E_STANDARD);
547*b1cdbd2cSJim Jagielski }
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski }
550*b1cdbd2cSJim Jagielski
551*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
552*b1cdbd2cSJim Jagielski
IMPL_LINK(SvxPathTabPage,PathHdl_Impl,PushButton *,EMPTYARG)553*b1cdbd2cSJim Jagielski IMPL_LINK( SvxPathTabPage, PathHdl_Impl, PushButton *, EMPTYARG )
554*b1cdbd2cSJim Jagielski {
555*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = pPathBox->GetCurEntry();
556*b1cdbd2cSJim Jagielski sal_uInt16 nPos = ( pEntry != NULL ) ? ( (PathUserData_Impl*)pEntry->GetUserData() )->nRealId : 0;
557*b1cdbd2cSJim Jagielski String sInternal, sUser, sWritable;
558*b1cdbd2cSJim Jagielski if ( pEntry )
559*b1cdbd2cSJim Jagielski {
560*b1cdbd2cSJim Jagielski PathUserData_Impl* pPathImpl = (PathUserData_Impl*)pEntry->GetUserData();
561*b1cdbd2cSJim Jagielski sal_Bool bReadOnly = sal_False;
562*b1cdbd2cSJim Jagielski GetPathList( pPathImpl->nRealId, sInternal, sUser, sWritable, bReadOnly );
563*b1cdbd2cSJim Jagielski sUser = pPathImpl->sUserPath;
564*b1cdbd2cSJim Jagielski sWritable = pPathImpl->sWritablePath;
565*b1cdbd2cSJim Jagielski }
566*b1cdbd2cSJim Jagielski
567*b1cdbd2cSJim Jagielski if(pEntry && !(!((OptHeaderTabListBox*)pPathBox)->GetCollapsedEntryBmp(pEntry)))
568*b1cdbd2cSJim Jagielski return 0;
569*b1cdbd2cSJim Jagielski
570*b1cdbd2cSJim Jagielski if ( IsMultiPath_Impl( nPos ) )
571*b1cdbd2cSJim Jagielski {
572*b1cdbd2cSJim Jagielski SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
573*b1cdbd2cSJim Jagielski if ( pFact )
574*b1cdbd2cSJim Jagielski {
575*b1cdbd2cSJim Jagielski AbstractSvxMultiPathDialog* pMultiDlg =
576*b1cdbd2cSJim Jagielski pFact->CreateSvxMultiPathDialog( this );
577*b1cdbd2cSJim Jagielski DBG_ASSERT( pMultiDlg, "Dialogdiet fail!" );
578*b1cdbd2cSJim Jagielski pMultiDlg->EnableRadioButtonMode();
579*b1cdbd2cSJim Jagielski
580*b1cdbd2cSJim Jagielski String sPath( sUser );
581*b1cdbd2cSJim Jagielski if ( sPath.Len() > 0 )
582*b1cdbd2cSJim Jagielski sPath += MULTIPATH_DELIMITER;
583*b1cdbd2cSJim Jagielski sPath += sWritable;
584*b1cdbd2cSJim Jagielski pMultiDlg->SetPath( sPath );
585*b1cdbd2cSJim Jagielski
586*b1cdbd2cSJim Jagielski String sPathName = pPathBox->GetEntryText( pEntry, 0 );
587*b1cdbd2cSJim Jagielski String sNewTitle( pImpl->m_sMultiPathDlg );
588*b1cdbd2cSJim Jagielski sNewTitle.SearchAndReplace( VAR_ONE, sPathName );
589*b1cdbd2cSJim Jagielski pMultiDlg->SetTitle( sNewTitle );
590*b1cdbd2cSJim Jagielski
591*b1cdbd2cSJim Jagielski if ( pMultiDlg->Execute() == RET_OK && pEntry )
592*b1cdbd2cSJim Jagielski {
593*b1cdbd2cSJim Jagielski sUser.Erase();
594*b1cdbd2cSJim Jagielski sWritable.Erase();
595*b1cdbd2cSJim Jagielski String sFullPath;
596*b1cdbd2cSJim Jagielski String sNewPath = pMultiDlg->GetPath();
597*b1cdbd2cSJim Jagielski char cDelim = MULTIPATH_DELIMITER;
598*b1cdbd2cSJim Jagielski sal_uInt16 nCount = sNewPath.GetTokenCount( cDelim );
599*b1cdbd2cSJim Jagielski if ( nCount > 0 )
600*b1cdbd2cSJim Jagielski {
601*b1cdbd2cSJim Jagielski sal_uInt16 i = 0;
602*b1cdbd2cSJim Jagielski for ( ; i < nCount - 1; ++i )
603*b1cdbd2cSJim Jagielski {
604*b1cdbd2cSJim Jagielski if ( sUser.Len() > 0 )
605*b1cdbd2cSJim Jagielski sUser += cDelim;
606*b1cdbd2cSJim Jagielski sUser += sNewPath.GetToken( i, cDelim );
607*b1cdbd2cSJim Jagielski }
608*b1cdbd2cSJim Jagielski if ( sFullPath.Len() > 0 )
609*b1cdbd2cSJim Jagielski sFullPath += cDelim;
610*b1cdbd2cSJim Jagielski sFullPath += sUser;
611*b1cdbd2cSJim Jagielski sWritable += sNewPath.GetToken( i, cDelim );
612*b1cdbd2cSJim Jagielski if ( sFullPath.Len() > 0 )
613*b1cdbd2cSJim Jagielski sFullPath += cDelim;
614*b1cdbd2cSJim Jagielski sFullPath += sWritable;
615*b1cdbd2cSJim Jagielski }
616*b1cdbd2cSJim Jagielski
617*b1cdbd2cSJim Jagielski pPathBox->SetEntryText( Convert_Impl( sFullPath ), pEntry, 1 );
618*b1cdbd2cSJim Jagielski // save modified flag
619*b1cdbd2cSJim Jagielski PathUserData_Impl* pPathImpl = (PathUserData_Impl*)pEntry->GetUserData();
620*b1cdbd2cSJim Jagielski pPathImpl->eState = SFX_ITEM_SET;
621*b1cdbd2cSJim Jagielski pPathImpl->sUserPath = sUser;
622*b1cdbd2cSJim Jagielski pPathImpl->sWritablePath = sWritable;
623*b1cdbd2cSJim Jagielski }
624*b1cdbd2cSJim Jagielski delete pMultiDlg;
625*b1cdbd2cSJim Jagielski }
626*b1cdbd2cSJim Jagielski }
627*b1cdbd2cSJim Jagielski else if ( pEntry )
628*b1cdbd2cSJim Jagielski {
629*b1cdbd2cSJim Jagielski try
630*b1cdbd2cSJim Jagielski {
631*b1cdbd2cSJim Jagielski rtl::OUString aService( RTL_CONSTASCII_USTRINGPARAM( FOLDER_PICKER_SERVICE_NAME ) );
632*b1cdbd2cSJim Jagielski Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
633*b1cdbd2cSJim Jagielski xFolderPicker = ::com::sun::star::uno::Reference< XFolderPicker >(
634*b1cdbd2cSJim Jagielski xFactory->createInstance( aService ), UNO_QUERY );
635*b1cdbd2cSJim Jagielski
636*b1cdbd2cSJim Jagielski INetURLObject aURL( sWritable, INET_PROT_FILE );
637*b1cdbd2cSJim Jagielski xFolderPicker->setDisplayDirectory( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
638*b1cdbd2cSJim Jagielski
639*b1cdbd2cSJim Jagielski Reference< XAsynchronousExecutableDialog > xAsyncDlg( xFolderPicker, UNO_QUERY );
640*b1cdbd2cSJim Jagielski if ( xAsyncDlg.is() )
641*b1cdbd2cSJim Jagielski xAsyncDlg->startExecuteModal( xDialogListener.get() );
642*b1cdbd2cSJim Jagielski else
643*b1cdbd2cSJim Jagielski {
644*b1cdbd2cSJim Jagielski short nRet = xFolderPicker->execute();
645*b1cdbd2cSJim Jagielski if ( ExecutableDialogResults::OK != nRet )
646*b1cdbd2cSJim Jagielski return 0;
647*b1cdbd2cSJim Jagielski
648*b1cdbd2cSJim Jagielski String sFolder( xFolderPicker->getDirectory() );
649*b1cdbd2cSJim Jagielski ChangeCurrentEntry( sFolder );
650*b1cdbd2cSJim Jagielski }
651*b1cdbd2cSJim Jagielski }
652*b1cdbd2cSJim Jagielski catch( Exception& )
653*b1cdbd2cSJim Jagielski {
654*b1cdbd2cSJim Jagielski DBG_ERRORFILE( "SvxPathTabPage::PathHdl_Impl: exception from folder picker" );
655*b1cdbd2cSJim Jagielski }
656*b1cdbd2cSJim Jagielski }
657*b1cdbd2cSJim Jagielski return 0;
658*b1cdbd2cSJim Jagielski }
659*b1cdbd2cSJim Jagielski
660*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
661*b1cdbd2cSJim Jagielski
IMPL_LINK(SvxPathTabPage,HeaderSelect_Impl,HeaderBar *,pBar)662*b1cdbd2cSJim Jagielski IMPL_LINK( SvxPathTabPage, HeaderSelect_Impl, HeaderBar*, pBar )
663*b1cdbd2cSJim Jagielski {
664*b1cdbd2cSJim Jagielski if ( pBar && pBar->GetCurItemId() != ITEMID_TYPE )
665*b1cdbd2cSJim Jagielski return 0;
666*b1cdbd2cSJim Jagielski
667*b1cdbd2cSJim Jagielski HeaderBarItemBits nBits = pHeaderBar->GetItemBits(ITEMID_TYPE);
668*b1cdbd2cSJim Jagielski sal_Bool bUp = ( ( nBits & HIB_UPARROW ) == HIB_UPARROW );
669*b1cdbd2cSJim Jagielski SvSortMode eMode = SortAscending;
670*b1cdbd2cSJim Jagielski
671*b1cdbd2cSJim Jagielski if ( bUp )
672*b1cdbd2cSJim Jagielski {
673*b1cdbd2cSJim Jagielski nBits &= ~HIB_UPARROW;
674*b1cdbd2cSJim Jagielski nBits |= HIB_DOWNARROW;
675*b1cdbd2cSJim Jagielski eMode = SortDescending;
676*b1cdbd2cSJim Jagielski }
677*b1cdbd2cSJim Jagielski else
678*b1cdbd2cSJim Jagielski {
679*b1cdbd2cSJim Jagielski nBits &= ~HIB_DOWNARROW;
680*b1cdbd2cSJim Jagielski nBits |= HIB_UPARROW;
681*b1cdbd2cSJim Jagielski }
682*b1cdbd2cSJim Jagielski pHeaderBar->SetItemBits( ITEMID_TYPE, nBits );
683*b1cdbd2cSJim Jagielski SvTreeList* pModel = pPathBox->GetModel();
684*b1cdbd2cSJim Jagielski pModel->SetSortMode( eMode );
685*b1cdbd2cSJim Jagielski pModel->Resort();
686*b1cdbd2cSJim Jagielski return 1;
687*b1cdbd2cSJim Jagielski }
688*b1cdbd2cSJim Jagielski
689*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
690*b1cdbd2cSJim Jagielski
IMPL_LINK(SvxPathTabPage,HeaderEndDrag_Impl,HeaderBar *,pBar)691*b1cdbd2cSJim Jagielski IMPL_LINK( SvxPathTabPage, HeaderEndDrag_Impl, HeaderBar*, pBar )
692*b1cdbd2cSJim Jagielski {
693*b1cdbd2cSJim Jagielski if ( pBar && !pBar->GetCurItemId() )
694*b1cdbd2cSJim Jagielski return 0;
695*b1cdbd2cSJim Jagielski
696*b1cdbd2cSJim Jagielski if ( !pHeaderBar->IsItemMode() )
697*b1cdbd2cSJim Jagielski {
698*b1cdbd2cSJim Jagielski Size aSz;
699*b1cdbd2cSJim Jagielski sal_uInt16 nTabs = pHeaderBar->GetItemCount();
700*b1cdbd2cSJim Jagielski long nTmpSz = 0;
701*b1cdbd2cSJim Jagielski long nWidth = pHeaderBar->GetItemSize(ITEMID_TYPE);
702*b1cdbd2cSJim Jagielski long nBarWidth = pHeaderBar->GetSizePixel().Width();
703*b1cdbd2cSJim Jagielski
704*b1cdbd2cSJim Jagielski if(nWidth < TAB_WIDTH_MIN)
705*b1cdbd2cSJim Jagielski pHeaderBar->SetItemSize( ITEMID_TYPE, TAB_WIDTH_MIN);
706*b1cdbd2cSJim Jagielski else if ( ( nBarWidth - nWidth ) < TAB_WIDTH_MIN )
707*b1cdbd2cSJim Jagielski pHeaderBar->SetItemSize( ITEMID_TYPE, nBarWidth - TAB_WIDTH_MIN );
708*b1cdbd2cSJim Jagielski
709*b1cdbd2cSJim Jagielski for ( sal_uInt16 i = 1; i <= nTabs; ++i )
710*b1cdbd2cSJim Jagielski {
711*b1cdbd2cSJim Jagielski long _nWidth = pHeaderBar->GetItemSize(i);
712*b1cdbd2cSJim Jagielski aSz.Width() = _nWidth + nTmpSz;
713*b1cdbd2cSJim Jagielski nTmpSz += _nWidth;
714*b1cdbd2cSJim Jagielski pPathBox->SetTab( i, PixelToLogic( aSz, MapMode(MAP_APPFONT) ).Width(), MAP_APPFONT );
715*b1cdbd2cSJim Jagielski }
716*b1cdbd2cSJim Jagielski }
717*b1cdbd2cSJim Jagielski return 1;
718*b1cdbd2cSJim Jagielski }
719*b1cdbd2cSJim Jagielski
720*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
721*b1cdbd2cSJim Jagielski
IMPL_LINK(SvxPathTabPage,DialogClosedHdl,DialogClosedEvent *,pEvt)722*b1cdbd2cSJim Jagielski IMPL_LINK( SvxPathTabPage, DialogClosedHdl, DialogClosedEvent*, pEvt )
723*b1cdbd2cSJim Jagielski {
724*b1cdbd2cSJim Jagielski if ( RET_OK == pEvt->DialogResult )
725*b1cdbd2cSJim Jagielski {
726*b1cdbd2cSJim Jagielski DBG_ASSERT( xFolderPicker.is() == sal_True, "SvxPathTabPage::DialogClosedHdl(): no folder picker" );
727*b1cdbd2cSJim Jagielski
728*b1cdbd2cSJim Jagielski String sURL = String( xFolderPicker->getDirectory() );
729*b1cdbd2cSJim Jagielski ChangeCurrentEntry( sURL );
730*b1cdbd2cSJim Jagielski }
731*b1cdbd2cSJim Jagielski return 0L;
732*b1cdbd2cSJim Jagielski }
733*b1cdbd2cSJim Jagielski
734*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
735*b1cdbd2cSJim Jagielski
GetPathList(sal_uInt16 _nPathHandle,String & _rInternalPath,String & _rUserPath,String & _rWritablePath,sal_Bool & _rReadOnly)736*b1cdbd2cSJim Jagielski void SvxPathTabPage::GetPathList(
737*b1cdbd2cSJim Jagielski sal_uInt16 _nPathHandle, String& _rInternalPath,
738*b1cdbd2cSJim Jagielski String& _rUserPath, String& _rWritablePath, sal_Bool& _rReadOnly )
739*b1cdbd2cSJim Jagielski {
740*b1cdbd2cSJim Jagielski String sCfgName = getCfgName_Impl( _nPathHandle );
741*b1cdbd2cSJim Jagielski
742*b1cdbd2cSJim Jagielski // load PathSettings service if necessary
743*b1cdbd2cSJim Jagielski if ( !pImpl->m_xPathSettings.is() )
744*b1cdbd2cSJim Jagielski {
745*b1cdbd2cSJim Jagielski Reference< XMultiServiceFactory > xSMgr = comphelper::getProcessServiceFactory();
746*b1cdbd2cSJim Jagielski pImpl->m_xPathSettings = Reference< XPropertySet >( xSMgr->createInstance(
747*b1cdbd2cSJim Jagielski rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
748*b1cdbd2cSJim Jagielski "com.sun.star.util.PathSettings") ) ), UNO_QUERY );
749*b1cdbd2cSJim Jagielski }
750*b1cdbd2cSJim Jagielski
751*b1cdbd2cSJim Jagielski try
752*b1cdbd2cSJim Jagielski {
753*b1cdbd2cSJim Jagielski if ( pImpl->m_xPathSettings.is() )
754*b1cdbd2cSJim Jagielski {
755*b1cdbd2cSJim Jagielski // load internal paths
756*b1cdbd2cSJim Jagielski String sProp( sCfgName );
757*b1cdbd2cSJim Jagielski sProp = sCfgName;
758*b1cdbd2cSJim Jagielski sProp += POSTFIX_INTERNAL;
759*b1cdbd2cSJim Jagielski Any aAny = pImpl->m_xPathSettings->getPropertyValue( sProp );
760*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > aPathSeq;
761*b1cdbd2cSJim Jagielski if ( aAny >>= aPathSeq )
762*b1cdbd2cSJim Jagielski {
763*b1cdbd2cSJim Jagielski long i, nCount = aPathSeq.getLength();
764*b1cdbd2cSJim Jagielski const ::rtl::OUString* pPaths = aPathSeq.getConstArray();
765*b1cdbd2cSJim Jagielski
766*b1cdbd2cSJim Jagielski for ( i = 0; i < nCount; ++i )
767*b1cdbd2cSJim Jagielski {
768*b1cdbd2cSJim Jagielski if ( _rInternalPath.Len() > 0 )
769*b1cdbd2cSJim Jagielski _rInternalPath += ';';
770*b1cdbd2cSJim Jagielski _rInternalPath += String( pPaths[i] );
771*b1cdbd2cSJim Jagielski }
772*b1cdbd2cSJim Jagielski }
773*b1cdbd2cSJim Jagielski // load user paths
774*b1cdbd2cSJim Jagielski sProp = sCfgName;
775*b1cdbd2cSJim Jagielski sProp += POSTFIX_USER;
776*b1cdbd2cSJim Jagielski aAny = pImpl->m_xPathSettings->getPropertyValue( sProp );
777*b1cdbd2cSJim Jagielski if ( aAny >>= aPathSeq )
778*b1cdbd2cSJim Jagielski {
779*b1cdbd2cSJim Jagielski long i, nCount = aPathSeq.getLength();
780*b1cdbd2cSJim Jagielski const ::rtl::OUString* pPaths = aPathSeq.getConstArray();
781*b1cdbd2cSJim Jagielski
782*b1cdbd2cSJim Jagielski for ( i = 0; i < nCount; ++i )
783*b1cdbd2cSJim Jagielski {
784*b1cdbd2cSJim Jagielski if ( _rUserPath.Len() > 0 )
785*b1cdbd2cSJim Jagielski _rUserPath += ';';
786*b1cdbd2cSJim Jagielski _rUserPath += String( pPaths[i] );
787*b1cdbd2cSJim Jagielski }
788*b1cdbd2cSJim Jagielski }
789*b1cdbd2cSJim Jagielski // then the writable path
790*b1cdbd2cSJim Jagielski sProp = sCfgName;
791*b1cdbd2cSJim Jagielski sProp += POSTFIX_WRITABLE;
792*b1cdbd2cSJim Jagielski aAny = pImpl->m_xPathSettings->getPropertyValue( sProp );
793*b1cdbd2cSJim Jagielski ::rtl::OUString sWritablePath;
794*b1cdbd2cSJim Jagielski if ( aAny >>= sWritablePath )
795*b1cdbd2cSJim Jagielski _rWritablePath = String( sWritablePath );
796*b1cdbd2cSJim Jagielski
797*b1cdbd2cSJim Jagielski // and the readonly flag
798*b1cdbd2cSJim Jagielski sProp = sCfgName;
799*b1cdbd2cSJim Jagielski Reference< XPropertySetInfo > xInfo = pImpl->m_xPathSettings->getPropertySetInfo();
800*b1cdbd2cSJim Jagielski Property aProp = xInfo->getPropertyByName( sProp );
801*b1cdbd2cSJim Jagielski _rReadOnly = ( ( aProp.Attributes & PropertyAttribute::READONLY ) == PropertyAttribute::READONLY );
802*b1cdbd2cSJim Jagielski }
803*b1cdbd2cSJim Jagielski }
804*b1cdbd2cSJim Jagielski catch( const Exception& )
805*b1cdbd2cSJim Jagielski {
806*b1cdbd2cSJim Jagielski OSL_ENSURE( sal_False, "SvxPathTabPage::GetPathList(): caught an exception!" );
807*b1cdbd2cSJim Jagielski }
808*b1cdbd2cSJim Jagielski }
809*b1cdbd2cSJim Jagielski
810*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
811*b1cdbd2cSJim Jagielski
SetPathList(sal_uInt16 _nPathHandle,const String & _rUserPath,const String & _rWritablePath)812*b1cdbd2cSJim Jagielski void SvxPathTabPage::SetPathList(
813*b1cdbd2cSJim Jagielski sal_uInt16 _nPathHandle, const String& _rUserPath, const String& _rWritablePath )
814*b1cdbd2cSJim Jagielski {
815*b1cdbd2cSJim Jagielski String sCfgName = getCfgName_Impl( _nPathHandle );
816*b1cdbd2cSJim Jagielski
817*b1cdbd2cSJim Jagielski // load PathSettings service if necessary
818*b1cdbd2cSJim Jagielski if ( !pImpl->m_xPathSettings.is() )
819*b1cdbd2cSJim Jagielski {
820*b1cdbd2cSJim Jagielski Reference< XMultiServiceFactory > xSMgr = comphelper::getProcessServiceFactory();
821*b1cdbd2cSJim Jagielski pImpl->m_xPathSettings = Reference< XPropertySet >( xSMgr->createInstance(
822*b1cdbd2cSJim Jagielski rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
823*b1cdbd2cSJim Jagielski "com.sun.star.util.PathSettings") ) ), UNO_QUERY );
824*b1cdbd2cSJim Jagielski }
825*b1cdbd2cSJim Jagielski
826*b1cdbd2cSJim Jagielski try
827*b1cdbd2cSJim Jagielski {
828*b1cdbd2cSJim Jagielski if ( pImpl->m_xPathSettings.is() )
829*b1cdbd2cSJim Jagielski {
830*b1cdbd2cSJim Jagielski // save user paths
831*b1cdbd2cSJim Jagielski char cDelim = MULTIPATH_DELIMITER;
832*b1cdbd2cSJim Jagielski sal_uInt16 nCount = _rUserPath.GetTokenCount( cDelim );
833*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > aPathSeq( nCount );
834*b1cdbd2cSJim Jagielski ::rtl::OUString* pArray = aPathSeq.getArray();
835*b1cdbd2cSJim Jagielski for ( sal_uInt16 i = 0; i < nCount; ++i )
836*b1cdbd2cSJim Jagielski pArray[i] = ::rtl::OUString( _rUserPath.GetToken( i, cDelim ) );
837*b1cdbd2cSJim Jagielski String sProp( sCfgName );
838*b1cdbd2cSJim Jagielski sProp += POSTFIX_USER;
839*b1cdbd2cSJim Jagielski Any aValue = makeAny( aPathSeq );
840*b1cdbd2cSJim Jagielski pImpl->m_xPathSettings->setPropertyValue( sProp, aValue );
841*b1cdbd2cSJim Jagielski
842*b1cdbd2cSJim Jagielski // then the writable path
843*b1cdbd2cSJim Jagielski aValue = makeAny( ::rtl::OUString( _rWritablePath ) );
844*b1cdbd2cSJim Jagielski sProp = sCfgName;
845*b1cdbd2cSJim Jagielski sProp += POSTFIX_WRITABLE;
846*b1cdbd2cSJim Jagielski pImpl->m_xPathSettings->setPropertyValue( sProp, aValue );
847*b1cdbd2cSJim Jagielski }
848*b1cdbd2cSJim Jagielski }
849*b1cdbd2cSJim Jagielski catch( const Exception& )
850*b1cdbd2cSJim Jagielski {
851*b1cdbd2cSJim Jagielski OSL_ENSURE( sal_False, "SvxPathTabPage::SetPathList(): caught an exception!" );
852*b1cdbd2cSJim Jagielski }
853*b1cdbd2cSJim Jagielski }
854*b1cdbd2cSJim Jagielski
855