1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_cui.hxx"
24
25 #include <vcl/wrkwin.hxx>
26 #include <dialmgr.hxx>
27 #include <sfx2/docfile.hxx>
28 #include <vcl/svapp.hxx>
29 #include <vcl/settings.hxx>
30
31 // UNO-Stuff
32 #include <comphelper/processfactory.hxx>
33 #include <com/sun/star/awt/XBitmap.hpp>
34 #include <com/sun/star/frame/XDesktop.hpp>
35 #include <com/sun/star/frame/XDesktop.hpp>
36 #include <com/sun/star/frame/XComponentLoader.hpp>
37 #include <com/sun/star/beans/PropertyValue.hpp>
38 #include <com/sun/star/document/XLinkTargetSupplier.hpp>
39 #include <com/sun/star/beans/XPropertySet.hpp>
40
41 #include <toolkit/helper/vclunohelper.hxx>
42
43 #include <cuires.hrc>
44 #include "hlmarkwn.hrc"
45 #include "hlmarkwn.hxx"
46 #include "hltpbase.hxx"
47
48 using namespace ::com::sun::star;
49 using namespace ::rtl;
50
51 /*************************************************************************
52 |* Userdata-struct for tree-entries
53 |************************************************************************/
54
55 struct TargetData
56 {
57 OUString aUStrLinkname;
58 sal_Bool bIsTarget;
59
TargetDataTargetData60 TargetData ( OUString aUStrLName, sal_Bool bTarget )
61 : bIsTarget ( bTarget )
62 {
63 if ( bIsTarget )
64 aUStrLinkname = aUStrLName;
65 }
66 };
67
68
69 //########################################################################
70 //# Tree-Window #
71 //########################################################################
72
SvxHlmarkTreeLBox(Window * pParent,const ResId & rResId)73 SvxHlmarkTreeLBox::SvxHlmarkTreeLBox( Window* pParent, const ResId& rResId )
74 : SvTreeListBox ( pParent, rResId ),
75 mpParentWnd ( (SvxHlinkDlgMarkWnd*) pParent )
76 {
77 SetNodeDefaultImages();
78 }
79
Paint(const Rectangle & rRect)80 void SvxHlmarkTreeLBox::Paint( const Rectangle& rRect )
81 {
82 if( mpParentWnd->mnError == LERR_NOERROR )
83 {
84 SvTreeListBox::Paint(rRect);
85 }
86 else
87 {
88 Erase();
89
90 Rectangle aDrawRect( Point( 0, 0 ), GetSizePixel() );
91
92 String aStrMessage;
93
94 switch( mpParentWnd->mnError )
95 {
96 case LERR_NOENTRIES :
97 aStrMessage = CUI_RESSTR( RID_SVXSTR_HYPDLG_ERR_LERR_NOENTRIES );
98 break;
99 case LERR_DOCNOTOPEN :
100 aStrMessage = CUI_RESSTR( RID_SVXSTR_HYPDLG_ERR_LERR_DOCNOTOPEN );
101 break;
102 }
103
104 DrawText( aDrawRect, aStrMessage, TEXT_DRAW_LEFT | TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
105 }
106
107 }
108
109 //########################################################################
110 //# Window-Class #
111 //########################################################################
112
113 /*************************************************************************
114 |* Constructor / Destructor
115 |************************************************************************/
116
SvxHlinkDlgMarkWnd(SvxHyperlinkTabPageBase * pParent)117 SvxHlinkDlgMarkWnd::SvxHlinkDlgMarkWnd( SvxHyperlinkTabPageBase *pParent )
118 : ModalDialog( (Window*)pParent, CUI_RES ( RID_SVXFLOAT_HYPERLINK_MARKWND ) ),
119 maBtApply( this, CUI_RES (BT_APPLY) ),
120 maBtClose( this, CUI_RES (BT_CLOSE) ),
121 maLbTree ( this, CUI_RES (TLB_MARK) ),
122 mbUserMoved ( sal_False ),
123 mbFirst ( sal_True ),
124 mpParent ( pParent ),
125 mnError ( LERR_NOERROR )
126 {
127 FreeResource();
128
129 maBtApply.SetClickHdl ( LINK ( this, SvxHlinkDlgMarkWnd, ClickApplyHdl_Impl ) );
130 maBtClose.SetClickHdl ( LINK ( this, SvxHlinkDlgMarkWnd, ClickCloseHdl_Impl ) );
131 maLbTree.SetDoubleClickHdl ( LINK ( this, SvxHlinkDlgMarkWnd, ClickApplyHdl_Impl ) );
132
133 // Tree-ListBox mit Linien versehen
134 maLbTree.SetStyle( maLbTree.GetStyle() | WB_TABSTOP | WB_BORDER | WB_HASLINES |
135 WB_HASBUTTONS | //WB_HASLINESATROOT |
136 WB_HSCROLL | WB_HASBUTTONSATROOT );
137
138 maLbTree.SetAccessibleName(String(CUI_RES(STR_MARK_TREE)));
139
140 }
141
~SvxHlinkDlgMarkWnd()142 SvxHlinkDlgMarkWnd::~SvxHlinkDlgMarkWnd()
143 {
144 ClearTree();
145 }
146
147 /*************************************************************************
148 |* Set an errorstatus
149 |************************************************************************/
150
SetError(sal_uInt16 nError)151 sal_uInt16 SvxHlinkDlgMarkWnd::SetError( sal_uInt16 nError)
152 {
153 sal_uInt16 nOldError = mnError;
154 mnError = nError;
155
156 if( mnError != LERR_NOERROR )
157 ClearTree();
158
159 maLbTree.Invalidate();
160
161 return nOldError;
162 }
163
164 /*************************************************************************
165 |* Move window
166 |************************************************************************/
167
MoveTo(Point aNewPos)168 sal_Bool SvxHlinkDlgMarkWnd::MoveTo ( Point aNewPos )
169 {
170 if ( !mbUserMoved )
171 {
172 sal_Bool bOldStatus = mbUserMoved;
173 SetPosPixel ( aNewPos );
174 mbUserMoved = bOldStatus;
175 }
176
177 return mbUserMoved;
178 }
179
Move()180 void SvxHlinkDlgMarkWnd::Move ()
181 {
182 Window::Move();
183
184 if ( IsReallyVisible() )
185 mbUserMoved = sal_True;
186 }
187
ConnectToDialog(sal_Bool bDoit)188 sal_Bool SvxHlinkDlgMarkWnd::ConnectToDialog( sal_Bool bDoit )
189 {
190 sal_Bool bOldStatus = mbUserMoved;
191
192 mbUserMoved = !bDoit;
193
194 return bOldStatus;
195 }
196
197 /*************************************************************************
198 |* Interface to refresh tree
199 |************************************************************************/
200
RefreshTree(String aStrURL)201 void SvxHlinkDlgMarkWnd::RefreshTree ( String aStrURL )
202 {
203 String aEmptyStr;
204 OUString aUStrURL;
205
206 EnterWait();
207
208 ClearTree();
209
210 xub_StrLen nPos = aStrURL.Search ( sal_Unicode('#') );
211
212 if( nPos != 0 )
213 aUStrURL = ::rtl::OUString( aStrURL );
214
215 if( !RefreshFromDoc ( aUStrURL ) )
216 maLbTree.Invalidate();
217
218 if ( nPos != STRING_NOTFOUND )
219 {
220 String aStrMark = aStrURL.Copy ( nPos+1 );
221 SelectEntry ( aStrMark );
222 }
223
224 LeaveWait();
225
226 maStrLastURL = aStrURL;
227 }
228
229 /*************************************************************************
230 |* get links from document
231 |************************************************************************/
232
RefreshFromDoc(OUString aURL)233 sal_Bool SvxHlinkDlgMarkWnd::RefreshFromDoc( OUString aURL )
234 {
235 mnError = LERR_NOERROR;
236
237 uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
238 if( xFactory.is() )
239 {
240 uno::Reference< frame::XDesktop > xDesktop( xFactory->createInstance( OUString::createFromAscii( "com.sun.star.frame.Desktop" ) ),
241 uno::UNO_QUERY );
242 if( xDesktop.is() )
243 {
244 uno::Reference< lang::XComponent > xComp;
245
246 if( aURL.getLength() )
247 {
248 // load from url
249 uno::Reference< frame::XComponentLoader > xLoader( xDesktop, uno::UNO_QUERY );
250 if( xLoader.is() )
251 {
252 try
253 {
254 uno::Sequence< beans::PropertyValue > aArg(1);
255 aArg.getArray()[0].Name = OUString::createFromAscii( "Hidden" );
256 aArg.getArray()[0].Value <<= (sal_Bool) sal_True;
257 xComp = xLoader->loadComponentFromURL( aURL, OUString::createFromAscii( "_blank" ), 0, aArg );
258 }
259 catch( const io::IOException& )
260 {
261
262 }
263 catch( const lang::IllegalArgumentException& )
264 {
265
266 }
267 }
268 }
269 else
270 {
271 // the component with user focus ( current document )
272 xComp = xDesktop->getCurrentComponent();
273 }
274
275 if( xComp.is() )
276 {
277 uno::Reference< document::XLinkTargetSupplier > xLTS( xComp, uno::UNO_QUERY );
278
279 if( xLTS.is() )
280 {
281 if( FillTree( xLTS->getLinks() ) == 0 )
282 mnError = LERR_NOENTRIES;
283 }
284 else
285 mnError = LERR_DOCNOTOPEN;
286
287 if ( aURL.getLength() )
288 xComp->dispose();
289 }
290 else
291 {
292 if( aURL.getLength() )
293 mnError=LERR_DOCNOTOPEN;
294 }
295 }
296 }
297 return (mnError==0);
298 }
299 /*
300 void SvxHlinkDlgMarkWnd::Error(int nNr)
301 {
302 switch(nNr)
303 {
304 case 0:
305 {
306 Rectangle aDrawRect( Point( 0, 0 ), maLbTree.GetSizePixel() );
307 //maLbTree.SetTextColor( Color(COL_BLACK) );
308 //maLbTree.DrawText( aDrawRect, "Keine Ziele im Dokument vorhanden.", TEXT_DRAW_LEFT);// | TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
309 maLbTree.DrawText( Point(0,0), "Keine Ziele im Dokument vorhanden.");
310 maLbTree.DrawLine(aDrawRect.TopLeft(), aDrawRect.BottomRight() );
311 }
312 break;
313 case 1:
314 Rectangle aDrawRect( Point( 0, 0 ), maLbTree.GetSizePixel() );
315 maLbTree.DrawText( aDrawRect, "Das Dokument konnte nicht ge�ffnet werden.", TEXT_DRAW_LEFT | TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
316 break;
317 }
318 }
319 */
320 /*************************************************************************
321 |* Fill Tree-Control
322 |************************************************************************/
323
FillTree(uno::Reference<container::XNameAccess> xLinks,SvLBoxEntry * pParentEntry)324 int SvxHlinkDlgMarkWnd::FillTree( uno::Reference< container::XNameAccess > xLinks, SvLBoxEntry* pParentEntry )
325 {
326 int nEntries=0;
327 const uno::Sequence< OUString > aNames( xLinks->getElementNames() );
328 const sal_uLong nLinks = aNames.getLength();
329 const OUString* pNames = aNames.getConstArray();
330
331 Color aMaskColor( COL_LIGHTMAGENTA );
332 const OUString aProp_LinkDisplayName( RTL_CONSTASCII_USTRINGPARAM( "LinkDisplayName" ) );
333 const OUString aProp_LinkTarget( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.LinkTarget" ) );
334 const OUString aProp_LinkDisplayBitmap( RTL_CONSTASCII_USTRINGPARAM( "LinkDisplayBitmap" ) );
335 for( sal_uLong i = 0; i < nLinks; i++ )
336 {
337 uno::Any aAny;
338 OUString aLink( *pNames++ );
339
340 sal_Bool bError = sal_False;
341 try
342 {
343 aAny = xLinks->getByName( aLink );
344 }
345 catch(const uno::Exception&)
346 {
347 // if the name of the target was invalid (like empty headings)
348 // no object can be provided
349 bError = sal_True;
350 }
351 if(bError)
352 continue;
353
354 uno::Reference< beans::XPropertySet > xTarget;
355
356 if( aAny >>= xTarget )
357 {
358 try
359 {
360 // get name to display
361 aAny = xTarget->getPropertyValue( aProp_LinkDisplayName );
362 OUString aDisplayName;
363 aAny >>= aDisplayName;
364 String aStrDisplayname ( aDisplayName );
365
366 // is it a target?
367 uno::Reference< lang::XServiceInfo > xSI( xTarget, uno::UNO_QUERY );
368 sal_Bool bIsTarget = xSI->supportsService( aProp_LinkTarget );
369
370 // create userdata
371 TargetData *pData = new TargetData ( aLink, bIsTarget );
372
373 SvLBoxEntry* pEntry;
374
375 try
376 {
377 // get bitmap for the tree-entry
378 uno::Reference< awt::XBitmap > aXBitmap( xTarget->getPropertyValue( aProp_LinkDisplayBitmap ), uno::UNO_QUERY );
379 if( aXBitmap.is() )
380 {
381 Image aBmp( VCLUnoHelper::GetBitmap( aXBitmap ).GetBitmap(), aMaskColor );
382 // insert Displayname into treelist with bitmaps
383 pEntry = maLbTree.InsertEntry ( aStrDisplayname,
384 aBmp, aBmp,
385 pParentEntry,
386 sal_False, LIST_APPEND,
387 (void*)pData );
388 maLbTree.SetExpandedEntryBmp( pEntry, aBmp, BMP_COLOR_HIGHCONTRAST );
389 maLbTree.SetCollapsedEntryBmp( pEntry, aBmp, BMP_COLOR_HIGHCONTRAST );
390 nEntries++;
391 }
392 else
393 {
394 // insert Displayname into treelist without bitmaps
395 pEntry = maLbTree.InsertEntry ( aStrDisplayname,
396 pParentEntry,
397 sal_False, LIST_APPEND,
398 (void*)pData );
399 nEntries++;
400 }
401 }
402 catch(const com::sun::star::uno::Exception&)
403 {
404 // insert Displayname into treelist without bitmaps
405 pEntry = maLbTree.InsertEntry ( aStrDisplayname,
406 pParentEntry,
407 sal_False, LIST_APPEND,
408 (void*)pData );
409 nEntries++;
410 }
411
412 uno::Reference< document::XLinkTargetSupplier > xLTS( xTarget, uno::UNO_QUERY );
413 if( xLTS.is() )
414 nEntries += FillTree( xLTS->getLinks(), pEntry );
415 }
416 catch(const com::sun::star::uno::Exception&)
417 {
418 }
419 }
420 }
421
422 return nEntries;
423 }
424
425 /*************************************************************************
426 |* Clear Tree
427 |************************************************************************/
428
ClearTree()429 void SvxHlinkDlgMarkWnd::ClearTree()
430 {
431 SvLBoxEntry* pEntry = maLbTree.First();
432
433 while ( pEntry )
434 {
435 TargetData* pUserData = ( TargetData * ) pEntry->GetUserData();
436 delete pUserData;
437
438 pEntry = maLbTree.Next( pEntry );
439 }
440
441 maLbTree.Clear();
442 }
443
444 /*************************************************************************
445 |* Find Entry for String
446 |************************************************************************/
447
FindEntry(String aStrName)448 SvLBoxEntry* SvxHlinkDlgMarkWnd::FindEntry ( String aStrName )
449 {
450 sal_Bool bFound=sal_False;
451 SvLBoxEntry* pEntry = maLbTree.First();
452
453 while ( pEntry && !bFound )
454 {
455 TargetData* pUserData = ( TargetData * ) pEntry->GetUserData ();
456 if ( aStrName == String( pUserData->aUStrLinkname ) )
457 bFound = sal_True;
458 else
459 pEntry = maLbTree.Next( pEntry );
460 }
461
462 return pEntry;
463 }
464
465 /*************************************************************************
466 |* Select Entry
467 |************************************************************************/
468
SelectEntry(String aStrMark)469 void SvxHlinkDlgMarkWnd::SelectEntry ( String aStrMark )
470 {
471 SvLBoxEntry* pEntry = FindEntry ( aStrMark );
472 if ( pEntry )
473 {
474 maLbTree.Select ( pEntry );
475 maLbTree.MakeVisible ( pEntry );
476 }
477 }
478
479 /*************************************************************************
480 |* Click on Apply-Button / Doubleclick on item in tree
481 |************************************************************************/
482
IMPL_LINK(SvxHlinkDlgMarkWnd,ClickApplyHdl_Impl,void *,EMPTYARG)483 IMPL_LINK ( SvxHlinkDlgMarkWnd, ClickApplyHdl_Impl, void *, EMPTYARG )
484 {
485 SvLBoxEntry* pEntry = maLbTree.GetCurEntry();
486
487 if ( pEntry )
488 {
489 TargetData *pData = ( TargetData * )pEntry->GetUserData();
490
491 if ( pData->bIsTarget )
492 {
493 String aStrMark ( pData->aUStrLinkname );
494 mpParent->SetMarkStr ( aStrMark );
495 }
496 }
497
498 return( 0L );
499 }
500
501 /*************************************************************************
502 |* Click on Close-Button
503 |************************************************************************/
504
IMPL_LINK(SvxHlinkDlgMarkWnd,ClickCloseHdl_Impl,void *,EMPTYARG)505 IMPL_LINK ( SvxHlinkDlgMarkWnd, ClickCloseHdl_Impl, void *, EMPTYARG )
506 {
507 Close();
508
509 return( 0L );
510 }
511
512 /* vim: set noet sw=4 ts=4: */
513