summaryrefslogtreecommitdiff
path: root/svx/source/cui/hlmarkwn.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/cui/hlmarkwn.cxx')
-rw-r--r--svx/source/cui/hlmarkwn.cxx549
1 files changed, 549 insertions, 0 deletions
diff --git a/svx/source/cui/hlmarkwn.cxx b/svx/source/cui/hlmarkwn.cxx
new file mode 100644
index 0000000000..e65fbb228d
--- /dev/null
+++ b/svx/source/cui/hlmarkwn.cxx
@@ -0,0 +1,549 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: hlmarkwn.cxx,v $
+ * $Revision: 1.19.216.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_svx.hxx"
+
+#ifdef SVX_DLLIMPLEMENTATION
+#undef SVX_DLLIMPLEMENTATION
+#endif
+#include <vcl/wrkwin.hxx>
+#include <svx/dialmgr.hxx>
+#include <sfx2/docfile.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/settings.hxx>
+
+// UNO-Stuff
+#include <comphelper/processfactory.hxx>
+#include <com/sun/star/awt/XBitmap.hpp>
+#include <com/sun/star/frame/XDesktop.hpp>
+#include <com/sun/star/frame/XDesktop.hpp>
+#include <com/sun/star/frame/XComponentLoader.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/document/XLinkTargetSupplier.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+
+#include <toolkit/unohlp.hxx>
+
+#include <svx/dialogs.hrc>
+#include "hlmarkwn.hrc"
+#include "hlmarkwn.hxx"
+#include "hltpbase.hxx"
+
+using namespace ::com::sun::star;
+using namespace ::rtl;
+
+/*************************************************************************
+|*
+|* Userdata-struct for tree-entries
+|*
+|************************************************************************/
+
+struct TargetData
+{
+ OUString aUStrLinkname;
+ BOOL bIsTarget;
+
+ TargetData ( OUString aUStrLName, BOOL bTarget )
+ : bIsTarget ( bTarget )
+ {
+ if ( bIsTarget )
+ aUStrLinkname = aUStrLName;
+ }
+};
+
+
+//########################################################################
+//# #
+//# Tree-Window #
+//# #
+//########################################################################
+
+SvxHlmarkTreeLBox::SvxHlmarkTreeLBox( Window* pParent, const ResId& rResId )
+: SvTreeListBox ( pParent, rResId ),
+ mpParentWnd ( (SvxHlinkDlgMarkWnd*) pParent )
+{
+ SetNodeDefaultImages();
+}
+
+void SvxHlmarkTreeLBox::Paint( const Rectangle& rRect )
+{
+ if( mpParentWnd->mnError == LERR_NOERROR )
+ {
+ SvTreeListBox::Paint(rRect);
+ }
+ else
+ {
+ Erase();
+
+ Rectangle aDrawRect( Point( 0, 0 ), GetSizePixel() );
+
+ String aStrMessage;
+
+ switch( mpParentWnd->mnError )
+ {
+ case LERR_NOENTRIES :
+ aStrMessage = SVX_RESSTR( RID_SVXSTR_HYPDLG_ERR_LERR_NOENTRIES );
+ break;
+ case LERR_DOCNOTOPEN :
+ aStrMessage = SVX_RESSTR( RID_SVXSTR_HYPDLG_ERR_LERR_DOCNOTOPEN );
+ break;
+ }
+
+ DrawText( aDrawRect, aStrMessage, TEXT_DRAW_LEFT | TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
+ }
+
+}
+
+//########################################################################
+//# #
+//# Window-Class #
+//# #
+//########################################################################
+
+/*************************************************************************
+|*
+|* Contructor / Destructor
+|*
+|************************************************************************/
+
+SvxHlinkDlgMarkWnd::SvxHlinkDlgMarkWnd( SvxHyperlinkTabPageBase *pParent )
+: ModalDialog( (Window*)pParent, SVX_RES ( RID_SVXFLOAT_HYPERLINK_MARKWND ) ),
+ maBtApply( this, SVX_RES (BT_APPLY) ),
+ maBtClose( this, SVX_RES (BT_CLOSE) ),
+ maLbTree ( this, SVX_RES (TLB_MARK) ),
+ mbUserMoved ( FALSE ),
+ mbFirst ( TRUE ),
+ mpParent ( pParent ),
+ mnError ( LERR_NOERROR )
+{
+ FreeResource();
+
+ maBtApply.SetClickHdl ( LINK ( this, SvxHlinkDlgMarkWnd, ClickApplyHdl_Impl ) );
+ maBtClose.SetClickHdl ( LINK ( this, SvxHlinkDlgMarkWnd, ClickCloseHdl_Impl ) );
+ maLbTree.SetDoubleClickHdl ( LINK ( this, SvxHlinkDlgMarkWnd, ClickApplyHdl_Impl ) );
+
+ // Tree-ListBox mit Linien versehen
+ maLbTree.SetWindowBits( WinBits( WB_TABSTOP | WB_BORDER | WB_HASLINES |
+ WB_HASBUTTONS | //WB_HASLINESATROOT |
+ WB_HSCROLL | WB_HASBUTTONSATROOT ) );
+}
+
+SvxHlinkDlgMarkWnd::~SvxHlinkDlgMarkWnd()
+{
+ ClearTree();
+}
+
+/*************************************************************************
+|*
+|* Set an errorstatus
+|*
+|************************************************************************/
+
+USHORT SvxHlinkDlgMarkWnd::SetError( USHORT nError)
+{
+ USHORT nOldError = mnError;
+ mnError = nError;
+
+ if( mnError != LERR_NOERROR )
+ ClearTree();
+
+ maLbTree.Invalidate();
+
+ return nOldError;
+}
+
+/*************************************************************************
+|*
+|* Move window
+|*
+|************************************************************************/
+
+BOOL SvxHlinkDlgMarkWnd::MoveTo ( Point aNewPos )
+{
+ if ( !mbUserMoved )
+ {
+ BOOL bOldStatus = mbUserMoved;
+ SetPosPixel ( aNewPos );
+ mbUserMoved = bOldStatus;
+ }
+
+ return mbUserMoved;
+}
+
+void SvxHlinkDlgMarkWnd::Move ()
+{
+ Window::Move();
+
+ if ( IsReallyVisible() )
+ mbUserMoved = TRUE;
+}
+
+BOOL SvxHlinkDlgMarkWnd::ConnectToDialog( BOOL bDoit )
+{
+ BOOL bOldStatus = mbUserMoved;
+
+ mbUserMoved = !bDoit;
+
+ return bOldStatus;
+}
+
+/*************************************************************************
+|*
+|* Interface to refresh tree
+|*
+|************************************************************************/
+
+void SvxHlinkDlgMarkWnd::RefreshTree ( String aStrURL )
+{
+ String aEmptyStr;
+ OUString aUStrURL;
+
+ EnterWait();
+
+ ClearTree();
+
+ xub_StrLen nPos = aStrURL.Search ( sal_Unicode('#') );
+
+ if( nPos != 0 )
+ aUStrURL = ::rtl::OUString( aStrURL );
+
+ if( !RefreshFromDoc ( aUStrURL ) )
+ maLbTree.Invalidate();
+
+ if ( nPos != STRING_NOTFOUND )
+ {
+ String aStrMark = aStrURL.Copy ( nPos+1 );
+ SelectEntry ( aStrMark );
+ }
+
+ LeaveWait();
+
+ maStrLastURL = aStrURL;
+}
+
+/*************************************************************************
+|*
+|* get links from document
+|*
+|************************************************************************/
+
+BOOL SvxHlinkDlgMarkWnd::RefreshFromDoc( OUString aURL )
+{
+ mnError = LERR_NOERROR;
+
+ uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
+ if( xFactory.is() )
+ {
+ uno::Reference< frame::XDesktop > xDesktop( xFactory->createInstance( OUString::createFromAscii( "com.sun.star.frame.Desktop" ) ),
+ uno::UNO_QUERY );
+ if( xDesktop.is() )
+ {
+ uno::Reference< lang::XComponent > xComp;
+
+ if( aURL.getLength() )
+ {
+ // load from url
+ uno::Reference< frame::XComponentLoader > xLoader( xDesktop, uno::UNO_QUERY );
+ if( xLoader.is() )
+ {
+ try
+ {
+ uno::Sequence< beans::PropertyValue > aArg(1);
+ aArg.getArray()[0].Name = OUString::createFromAscii( "Hidden" );
+ aArg.getArray()[0].Value <<= (sal_Bool) TRUE;
+ xComp = xLoader->loadComponentFromURL( aURL, OUString::createFromAscii( "_blank" ), 0, aArg );
+ }
+ catch( const io::IOException& )
+ {
+
+ }
+ catch( const lang::IllegalArgumentException& )
+ {
+
+ }
+ }
+ }
+ else
+ {
+ // the component with user focus ( current document )
+ xComp = xDesktop->getCurrentComponent();
+ }
+
+ if( xComp.is() )
+ {
+ uno::Reference< document::XLinkTargetSupplier > xLTS( xComp, uno::UNO_QUERY );
+
+ if( xLTS.is() )
+ {
+ if( FillTree( xLTS->getLinks() ) == 0 )
+ mnError = LERR_NOENTRIES;
+ }
+ else
+ mnError = LERR_DOCNOTOPEN;
+
+ if ( aURL.getLength() )
+ xComp->dispose();
+ }
+ else
+ {
+ if( aURL.getLength() )
+ mnError=LERR_DOCNOTOPEN;
+ }
+ }
+ }
+ return (mnError==0);
+}
+/*
+void SvxHlinkDlgMarkWnd::Error(int nNr)
+{
+ switch(nNr)
+ {
+ case 0:
+ {
+ Rectangle aDrawRect( Point( 0, 0 ), maLbTree.GetSizePixel() );
+ //maLbTree.SetTextColor( Color(COL_BLACK) );
+ //maLbTree.DrawText( aDrawRect, "Keine Ziele im Dokument vorhanden.", TEXT_DRAW_LEFT);// | TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
+ maLbTree.DrawText( Point(0,0), "Keine Ziele im Dokument vorhanden.");
+ maLbTree.DrawLine(aDrawRect.TopLeft(), aDrawRect.BottomRight() );
+ }
+ break;
+ case 1:
+ Rectangle aDrawRect( Point( 0, 0 ), maLbTree.GetSizePixel() );
+ maLbTree.DrawText( aDrawRect, "Das Dokument konnte nicht ge�ffnet werden.", TEXT_DRAW_LEFT | TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
+ break;
+ }
+}
+*/
+/*************************************************************************
+|*
+|* Fill Tree-Control
+|*
+|************************************************************************/
+
+int SvxHlinkDlgMarkWnd::FillTree( uno::Reference< container::XNameAccess > xLinks, SvLBoxEntry* pParentEntry )
+{
+ int nEntries=0;
+ const uno::Sequence< OUString > aNames( xLinks->getElementNames() );
+ const ULONG nLinks = aNames.getLength();
+ const OUString* pNames = aNames.getConstArray();
+
+ Color aMaskColor( COL_LIGHTMAGENTA );
+ const OUString aProp_LinkDisplayName( RTL_CONSTASCII_USTRINGPARAM( "LinkDisplayName" ) );
+ const OUString aProp_LinkTarget( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.LinkTarget" ) );
+ const OUString aProp_LinkDisplayBitmap( RTL_CONSTASCII_USTRINGPARAM( "LinkDisplayBitmap" ) );
+ for( ULONG i = 0; i < nLinks; i++ )
+ {
+ uno::Any aAny;
+ OUString aLink( *pNames++ );
+
+ BOOL bError = FALSE;
+ try
+ {
+ aAny = xLinks->getByName( aLink );
+ }
+ catch(const uno::Exception&)
+ {
+ // if the name of the target was invalid (like empty headings)
+ // no object can be provided
+ bError = TRUE;
+ }
+ if(bError)
+ continue;
+
+ uno::Reference< beans::XPropertySet > xTarget;
+
+ if( aAny >>= xTarget )
+ {
+ try
+ {
+ // get name to display
+ aAny = xTarget->getPropertyValue( aProp_LinkDisplayName );
+ OUString aDisplayName;
+ aAny >>= aDisplayName;
+ String aStrDisplayname ( aDisplayName );
+
+ // is it a target ?
+ uno::Reference< lang::XServiceInfo > xSI( xTarget, uno::UNO_QUERY );
+ BOOL bIsTarget = xSI->supportsService( aProp_LinkTarget );
+
+ // create userdata
+ TargetData *pData = new TargetData ( aLink, bIsTarget );
+
+ SvLBoxEntry* pEntry;
+
+ try
+ {
+ // get bitmap for the tree-entry
+ uno::Reference< awt::XBitmap > aXBitmap( xTarget->getPropertyValue( aProp_LinkDisplayBitmap ), uno::UNO_QUERY );
+ if( aXBitmap.is() )
+ {
+ Image aBmp( VCLUnoHelper::GetBitmap( aXBitmap ).GetBitmap(), aMaskColor );
+ // insert Displayname into treelist with bitmaps
+ pEntry = maLbTree.InsertEntry ( aStrDisplayname,
+ aBmp, aBmp,
+ pParentEntry,
+ FALSE, LIST_APPEND,
+ (void*)pData );
+ maLbTree.SetExpandedEntryBmp( pEntry, aBmp, BMP_COLOR_HIGHCONTRAST );
+ maLbTree.SetCollapsedEntryBmp( pEntry, aBmp, BMP_COLOR_HIGHCONTRAST );
+ nEntries++;
+ }
+ else
+ {
+ // insert Displayname into treelist without bitmaps
+ pEntry = maLbTree.InsertEntry ( aStrDisplayname,
+ pParentEntry,
+ FALSE, LIST_APPEND,
+ (void*)pData );
+ nEntries++;
+ }
+ }
+ catch(const com::sun::star::uno::Exception&)
+ {
+ // insert Displayname into treelist without bitmaps
+ pEntry = maLbTree.InsertEntry ( aStrDisplayname,
+ pParentEntry,
+ FALSE, LIST_APPEND,
+ (void*)pData );
+ nEntries++;
+ }
+
+ uno::Reference< document::XLinkTargetSupplier > xLTS( xTarget, uno::UNO_QUERY );
+ if( xLTS.is() )
+ nEntries += FillTree( xLTS->getLinks(), pEntry );
+ }
+ catch(const com::sun::star::uno::Exception&)
+ {
+ }
+ }
+ }
+
+ return nEntries;
+}
+
+/*************************************************************************
+|*
+|* Clear Tree
+|*
+|************************************************************************/
+
+void SvxHlinkDlgMarkWnd::ClearTree()
+{
+ SvLBoxEntry* pEntry = maLbTree.First();
+
+ while ( pEntry )
+ {
+ TargetData* pUserData = ( TargetData * ) pEntry->GetUserData();
+ delete pUserData;
+
+ pEntry = maLbTree.Next( pEntry );
+ }
+
+ maLbTree.Clear();
+}
+
+/*************************************************************************
+|*
+|* Find Entry for Strng
+|*
+|************************************************************************/
+
+SvLBoxEntry* SvxHlinkDlgMarkWnd::FindEntry ( String aStrName )
+{
+ BOOL bFound=FALSE;
+ SvLBoxEntry* pEntry = maLbTree.First();
+
+ while ( pEntry && !bFound )
+ {
+ TargetData* pUserData = ( TargetData * ) pEntry->GetUserData ();
+ if ( aStrName == String( pUserData->aUStrLinkname ) )
+ bFound = TRUE;
+ else
+ pEntry = maLbTree.Next( pEntry );
+ }
+
+ return pEntry;
+}
+
+/*************************************************************************
+|*
+|* Select Entry
+|*
+|************************************************************************/
+
+void SvxHlinkDlgMarkWnd::SelectEntry ( String aStrMark )
+{
+ SvLBoxEntry* pEntry = FindEntry ( aStrMark );
+ if ( pEntry )
+ {
+ maLbTree.Select ( pEntry );
+ maLbTree.MakeVisible ( pEntry );
+ }
+}
+
+/*************************************************************************
+|*
+|* Click on Apply-Button / Doubleclick on item in tree
+|*
+|************************************************************************/
+
+IMPL_LINK ( SvxHlinkDlgMarkWnd, ClickApplyHdl_Impl, void *, EMPTYARG )
+{
+ SvLBoxEntry* pEntry = maLbTree.GetCurEntry();
+
+ if ( pEntry )
+ {
+ TargetData *pData = ( TargetData * )pEntry->GetUserData();
+
+ if ( pData->bIsTarget )
+ {
+ String aStrMark ( pData->aUStrLinkname );
+ mpParent->SetMarkStr ( aStrMark );
+ }
+ }
+
+ return( 0L );
+}
+
+/*************************************************************************
+|*
+|* Click on Close-Button
+|*
+|************************************************************************/
+
+IMPL_LINK ( SvxHlinkDlgMarkWnd, ClickCloseHdl_Impl, void *, EMPTYARG )
+{
+ Close();
+
+ return( 0L );
+}
+
+