xref: /trunk/main/cui/source/options/doclinkdialog.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_cui.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include "doclinkdialog.hxx"
32*cdf0e10cSrcweir #include "doclinkdialog.hrc"
33*cdf0e10cSrcweir #include <cuires.hrc>
34*cdf0e10cSrcweir #include <tools/debug.hxx>
35*cdf0e10cSrcweir #include <svl/filenotation.hxx>
36*cdf0e10cSrcweir #include <vcl/msgbox.hxx>
37*cdf0e10cSrcweir #include <ucbhelper/content.hxx>
38*cdf0e10cSrcweir #include <dialmgr.hxx>
39*cdf0e10cSrcweir #include <tools/urlobj.hxx>
40*cdf0e10cSrcweir #include <sfx2/filedlghelper.hxx>
41*cdf0e10cSrcweir #include <sfx2/docfilt.hxx>
42*cdf0e10cSrcweir //......................................................................
43*cdf0e10cSrcweir namespace svx
44*cdf0e10cSrcweir {
45*cdf0e10cSrcweir //......................................................................
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
48*cdf0e10cSrcweir     using namespace ::com::sun::star::ucb;
49*cdf0e10cSrcweir     using namespace ::svt;
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir     //==================================================================
52*cdf0e10cSrcweir     //= ODocumentLinkDialog
53*cdf0e10cSrcweir     //==================================================================
54*cdf0e10cSrcweir     //------------------------------------------------------------------
55*cdf0e10cSrcweir     ODocumentLinkDialog::ODocumentLinkDialog( Window* _pParent, sal_Bool _bCreateNew )
56*cdf0e10cSrcweir         :ModalDialog( _pParent, CUI_RES(DLG_DOCUMENTLINK) )
57*cdf0e10cSrcweir         ,m_aURLLabel        (this, CUI_RES(FT_URL))
58*cdf0e10cSrcweir         ,m_aURL             (this, CUI_RES(CMB_URL))
59*cdf0e10cSrcweir         ,m_aBrowseFile      (this, CUI_RES(PB_BROWSEFILE))
60*cdf0e10cSrcweir         ,m_aNameLabel       (this, CUI_RES(FT_NAME))
61*cdf0e10cSrcweir         ,m_aName            (this, CUI_RES(ET_NAME))
62*cdf0e10cSrcweir         ,m_aBottomLine      (this, CUI_RES(FL_BOTTOM))
63*cdf0e10cSrcweir         ,m_aOK              (this, CUI_RES(BTN_OK))
64*cdf0e10cSrcweir         ,m_aCancel          (this, CUI_RES(BTN_CANCEL))
65*cdf0e10cSrcweir         ,m_aHelp            (this, CUI_RES(BTN_HELP))
66*cdf0e10cSrcweir         ,m_bCreatingNew(_bCreateNew)
67*cdf0e10cSrcweir     {
68*cdf0e10cSrcweir         String sText = String( CUI_RES( m_bCreatingNew ? STR_NEW_LINK : STR_EDIT_LINK ) );
69*cdf0e10cSrcweir         SetText(sText);
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir         FreeResource();
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir         String sTemp = String::CreateFromAscii("*.odb");
74*cdf0e10cSrcweir         m_aURL.SetFilter(sTemp);
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir         m_aName.SetModifyHdl( LINK(this, ODocumentLinkDialog, OnTextModified) );
77*cdf0e10cSrcweir         m_aURL.SetModifyHdl( LINK(this, ODocumentLinkDialog, OnTextModified) );
78*cdf0e10cSrcweir         m_aBrowseFile.SetClickHdl( LINK(this, ODocumentLinkDialog, OnBrowseFile) );
79*cdf0e10cSrcweir         m_aOK.SetClickHdl( LINK(this, ODocumentLinkDialog, OnOk) );
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir         m_aURL.SetDropDownLineCount(10);
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir         validate();
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir         //  m_aURL.SetHelpId( HID_DOCLINKEDIT_URL );
86*cdf0e10cSrcweir         m_aURL.SetDropDownLineCount( 5 );
87*cdf0e10cSrcweir     }
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir     //------------------------------------------------------------------
90*cdf0e10cSrcweir     void ODocumentLinkDialog::set( const String& _rName, const String& _rURL )
91*cdf0e10cSrcweir     {
92*cdf0e10cSrcweir         m_aName.SetText(_rName);
93*cdf0e10cSrcweir         m_aURL.SetText(_rURL);
94*cdf0e10cSrcweir         validate();
95*cdf0e10cSrcweir     }
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir     //------------------------------------------------------------------
98*cdf0e10cSrcweir     void ODocumentLinkDialog::get( String& _rName, String& _rURL ) const
99*cdf0e10cSrcweir     {
100*cdf0e10cSrcweir         _rName = m_aName.GetText();
101*cdf0e10cSrcweir         _rURL = m_aURL.GetText();
102*cdf0e10cSrcweir     }
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir     //------------------------------------------------------------------
105*cdf0e10cSrcweir     void ODocumentLinkDialog::validate( )
106*cdf0e10cSrcweir     {
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir         m_aOK.Enable( (0 != m_aName.GetText().Len()) && ( 0 != m_aURL.GetText().Len() ) );
109*cdf0e10cSrcweir     }
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir     //------------------------------------------------------------------
112*cdf0e10cSrcweir     IMPL_LINK( ODocumentLinkDialog, OnOk, void*, EMPTYARG )
113*cdf0e10cSrcweir     {
114*cdf0e10cSrcweir         // get the current URL
115*cdf0e10cSrcweir         ::rtl::OUString sURL = m_aURL.GetText();
116*cdf0e10cSrcweir         OFileNotation aTransformer(sURL);
117*cdf0e10cSrcweir         sURL = aTransformer.get(OFileNotation::N_URL);
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir         // check for the existence of the selected file
120*cdf0e10cSrcweir         sal_Bool bFileExists = sal_False;
121*cdf0e10cSrcweir         try
122*cdf0e10cSrcweir         {
123*cdf0e10cSrcweir             ::ucbhelper::Content aFile(sURL, Reference< XCommandEnvironment >());
124*cdf0e10cSrcweir             if (aFile.isDocument())
125*cdf0e10cSrcweir                 bFileExists = sal_True;
126*cdf0e10cSrcweir         }
127*cdf0e10cSrcweir         catch(Exception&)
128*cdf0e10cSrcweir         {
129*cdf0e10cSrcweir         }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir         if (!bFileExists)
132*cdf0e10cSrcweir         {
133*cdf0e10cSrcweir             String sMsg = String(CUI_RES(STR_LINKEDDOC_DOESNOTEXIST));
134*cdf0e10cSrcweir             sMsg.SearchAndReplaceAscii("$file$", m_aURL.GetText());
135*cdf0e10cSrcweir             ErrorBox aError(this, WB_OK , sMsg);
136*cdf0e10cSrcweir             aError.Execute();
137*cdf0e10cSrcweir             return 0L;
138*cdf0e10cSrcweir         } // if (!bFileExists)
139*cdf0e10cSrcweir         INetURLObject aURL( sURL );
140*cdf0e10cSrcweir         if ( aURL.GetProtocol() != INET_PROT_FILE )
141*cdf0e10cSrcweir         {
142*cdf0e10cSrcweir             String sMsg = String(CUI_RES(STR_LINKEDDOC_NO_SYSTEM_FILE));
143*cdf0e10cSrcweir             sMsg.SearchAndReplaceAscii("$file$", m_aURL.GetText());
144*cdf0e10cSrcweir             ErrorBox aError(this, WB_OK , sMsg);
145*cdf0e10cSrcweir             aError.Execute();
146*cdf0e10cSrcweir             return 0L;
147*cdf0e10cSrcweir         }
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir         String sCurrentText = m_aName.GetText();
150*cdf0e10cSrcweir         if ( m_aNameValidator.IsSet() )
151*cdf0e10cSrcweir         {
152*cdf0e10cSrcweir             if ( !m_aNameValidator.Call( &sCurrentText ) )
153*cdf0e10cSrcweir             {
154*cdf0e10cSrcweir                 String sMsg = String(CUI_RES(STR_NAME_CONFLICT));
155*cdf0e10cSrcweir                 sMsg.SearchAndReplaceAscii("$file$", sCurrentText);
156*cdf0e10cSrcweir                 InfoBox aError(this, sMsg);
157*cdf0e10cSrcweir                 aError.Execute();
158*cdf0e10cSrcweir 
159*cdf0e10cSrcweir                 m_aName.SetSelection(Selection(0,sCurrentText.Len()));
160*cdf0e10cSrcweir                 m_aName.GrabFocus();
161*cdf0e10cSrcweir                 return 0L;
162*cdf0e10cSrcweir             }
163*cdf0e10cSrcweir         }
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir         EndDialog(RET_OK);
166*cdf0e10cSrcweir         return 0L;
167*cdf0e10cSrcweir     }
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir     //------------------------------------------------------------------
170*cdf0e10cSrcweir     IMPL_LINK( ODocumentLinkDialog, OnBrowseFile, void*, EMPTYARG )
171*cdf0e10cSrcweir     {
172*cdf0e10cSrcweir         ::sfx2::FileDialogHelper aFileDlg(WB_3DLOOK | WB_STDMODAL | WB_OPEN);
173*cdf0e10cSrcweir         static const String s_sDatabaseType = String::CreateFromAscii("StarOffice XML (Base)");
174*cdf0e10cSrcweir         const SfxFilter* pFilter = SfxFilter::GetFilterByName( s_sDatabaseType);
175*cdf0e10cSrcweir         if ( pFilter )
176*cdf0e10cSrcweir         {
177*cdf0e10cSrcweir             aFileDlg.AddFilter(pFilter->GetUIName(),pFilter->GetDefaultExtension());
178*cdf0e10cSrcweir             aFileDlg.SetCurrentFilter(pFilter->GetUIName());
179*cdf0e10cSrcweir         }
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir         String sPath = m_aURL.GetText();
182*cdf0e10cSrcweir         if (sPath.Len())
183*cdf0e10cSrcweir         {
184*cdf0e10cSrcweir             OFileNotation aTransformer( sPath, OFileNotation::N_SYSTEM );
185*cdf0e10cSrcweir             aFileDlg.SetDisplayDirectory( aTransformer.get( OFileNotation::N_URL ) );
186*cdf0e10cSrcweir         }
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir         if (0 != aFileDlg.Execute())
189*cdf0e10cSrcweir             return 0L;
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir         if (0 == m_aName.GetText().Len())
192*cdf0e10cSrcweir         {   // default the name to the base of the chosen URL
193*cdf0e10cSrcweir             INetURLObject aParser;
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir             aParser.SetSmartProtocol(INET_PROT_FILE);
196*cdf0e10cSrcweir             aParser.SetSmartURL(aFileDlg.GetPath());
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir             m_aName.SetText(aParser.getBase(INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET));
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir             m_aName.SetSelection(Selection(0,m_aName.GetText().Len()));
201*cdf0e10cSrcweir             m_aName.GrabFocus();
202*cdf0e10cSrcweir         }
203*cdf0e10cSrcweir         else
204*cdf0e10cSrcweir             m_aURL.GrabFocus();
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir         // get the path in system notation
207*cdf0e10cSrcweir         OFileNotation aTransformer(aFileDlg.GetPath(), OFileNotation::N_URL);
208*cdf0e10cSrcweir         m_aURL.SetText(aTransformer.get(OFileNotation::N_SYSTEM));
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir         validate();
211*cdf0e10cSrcweir         return 0L;
212*cdf0e10cSrcweir     }
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir     //------------------------------------------------------------------
215*cdf0e10cSrcweir     IMPL_LINK( ODocumentLinkDialog, OnTextModified, Control*, EMPTYARG )
216*cdf0e10cSrcweir     {
217*cdf0e10cSrcweir         validate( );
218*cdf0e10cSrcweir         return 0L;
219*cdf0e10cSrcweir     }
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir //......................................................................
222*cdf0e10cSrcweir }   // namespace svx
223*cdf0e10cSrcweir //......................................................................
224*cdf0e10cSrcweir 
225