blob: 03e4ac00d172bc39b7084cd826099ab4feb90645 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#ifdef SW_DLLIMPLEMENTATION
#undef SW_DLLIMPLEMENTATION
#endif
#include <hintids.hxx>
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#include <svl/urihelper.hxx>
#include <svl/stritem.hxx>
#include <editeng/flstitem.hxx>
#include <svx/htmlmode.hxx>
#include <svl/cjkoptions.hxx>
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _HELPID_H
#include <helpid.h>
#endif
#include <swtypes.hxx>
#include <errhdl.hxx>
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#include <wrtsh.hxx>
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#include <uitool.hxx>
#include <fmtinfmt.hxx>
#include <macassgn.hxx>
#ifndef _CHRDLG_HXX
#include <chrdlg.hxx> // der Dialog
#endif
#include <swmodule.hxx>
#include <poolfmt.hxx>
#ifndef _GLOBALS_HRC
#include <globals.hrc>
#endif
#ifndef _CHRDLG_HRC
#include <chrdlg.hrc>
#endif
#ifndef _CHARDLG_HRC
#include <chardlg.hrc>
#endif
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
#include <com/sun/star/ui/dialogs/XFilePicker.hpp>
#include <SwStyleNameMapper.hxx>
#include <sfx2/filedlghelper.hxx>
#include <sfx2/viewfrm.hxx>
#include <svx/svxdlg.hxx>
#include <svx/svxids.hrc>
#include <svx/flagsdef.hxx>
#include <svx/dialogs.hrc>
using namespace ::com::sun::star::ui::dialogs;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::uno;
using namespace ::sfx2;
/*--------------------------------------------------------------------
Beschreibung: Der Traeger des Dialoges
--------------------------------------------------------------------*/
SwCharDlg::SwCharDlg(Window* pParent, SwView& rVw, const SfxItemSet& rCoreSet,
const String* pStr, sal_Bool bIsDrwTxtDlg) :
SfxTabDialog(pParent, SW_RES(DLG_CHAR), &rCoreSet, pStr != 0),
rView(rVw),
bIsDrwTxtMode(bIsDrwTxtDlg)
{
FreeResource();
// bspFonr fuer beide Bsp-TabPages
if(pStr)
{
String aTmp( GetText() );
aTmp += SW_RESSTR(STR_TEXTCOLL_HEADER);
aTmp += *pStr;
aTmp += ')';
SetText(aTmp);
}
SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "Dialogdiet fail!");
AddTabPage(TP_CHAR_STD, pFact->GetTabPageCreatorFunc( RID_SVXPAGE_CHAR_NAME ), 0 );
AddTabPage(TP_CHAR_EXT, pFact->GetTabPageCreatorFunc( RID_SVXPAGE_CHAR_EFFECTS ), 0 );
AddTabPage(TP_CHAR_POS, pFact->GetTabPageCreatorFunc( RID_SVXPAGE_CHAR_POSITION ), 0 );
AddTabPage(TP_CHAR_TWOLN, pFact->GetTabPageCreatorFunc( RID_SVXPAGE_CHAR_TWOLINES ), 0 );
AddTabPage(TP_CHAR_URL, SwCharURLPage::Create, 0);
AddTabPage(TP_BACKGROUND, pFact->GetTabPageCreatorFunc( RID_SVXPAGE_BACKGROUND ), 0 );
SvtCJKOptions aCJKOptions;
if(bIsDrwTxtMode)
{
RemoveTabPage( TP_CHAR_URL );
RemoveTabPage( TP_BACKGROUND );
RemoveTabPage( TP_CHAR_TWOLN );
}
else if(!aCJKOptions.IsDoubleLinesEnabled())
RemoveTabPage( TP_CHAR_TWOLN );
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
SwCharDlg::~SwCharDlg()
{
}
/*--------------------------------------------------------------------
Beschreibung: FontList setzen
--------------------------------------------------------------------*/
void SwCharDlg::PageCreated( sal_uInt16 nId, SfxTabPage &rPage )
{
SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
switch( nId )
{
case TP_CHAR_STD:
{
SvxFontListItem aFontListItem( *( (SvxFontListItem*)
( rView.GetDocShell()->GetItem( SID_ATTR_CHAR_FONTLIST ) ) ) );
aSet.Put (SvxFontListItem( aFontListItem.GetFontList(), SID_ATTR_CHAR_FONTLIST));
if(!bIsDrwTxtMode)
aSet.Put (SfxUInt32Item(SID_FLAG_TYPE,SVX_PREVIEW_CHARACTER));
rPage.PageCreated(aSet);
}
break;
case TP_CHAR_EXT:
if(bIsDrwTxtMode)
aSet.Put (SfxUInt16Item(SID_DISABLE_CTL,DISABLE_CASEMAP));
else
{
aSet.Put (SfxUInt32Item(SID_FLAG_TYPE,SVX_PREVIEW_CHARACTER|SVX_ENABLE_FLASH));
}
rPage.PageCreated(aSet);
break;
case TP_CHAR_POS:
aSet.Put (SfxUInt32Item(SID_FLAG_TYPE,SVX_PREVIEW_CHARACTER));
rPage.PageCreated(aSet);
break;
case TP_CHAR_TWOLN:
aSet.Put (SfxUInt32Item(SID_FLAG_TYPE,SVX_PREVIEW_CHARACTER));
rPage.PageCreated(aSet);
break;
}
}
/*-----------------14.08.96 11.28-------------------
--------------------------------------------------*/
SwCharURLPage::SwCharURLPage( Window* pParent,
const SfxItemSet& rCoreSet ) :
SfxTabPage( pParent, SW_RES( TP_CHAR_URL ), rCoreSet ),
aURLFL ( this, SW_RES(FL_URL)),
aURLFT( this, SW_RES(FT_URL )),
aURLED( this, SW_RES(ED_URL )),
aTextFT( this, SW_RES(FT_TEXT )),
aTextED( this, SW_RES(ED_TEXT )),
aNameFT( this, SW_RES(FT_NAME )),
aNameED( this, SW_RES(ED_NAME)),
aTargetFrmFT( this, SW_RES(FT_TARGET )),
aTargetFrmLB( this, SW_RES(LB_TARGET )),
aURLPB( this, SW_RES(PB_URL )),
aEventPB( this, SW_RES(PB_EVENT )),
aStyleFL( this, SW_RES(FL_STYLE )),
aVisitedFT( this, SW_RES(FT_VISITED )),
aVisitedLB( this, SW_RES(LB_VISITED )),
aNotVisitedFT( this, SW_RES(FT_NOT_VISITED)),
aNotVisitedLB( this, SW_RES(LB_NOT_VISITED)),
pINetItem(0),
bModified(sal_False)
{
FreeResource();
aEventPB.SetAccessibleRelationMemberOf(&aURLFL);
const SfxPoolItem* pItem;
SfxObjectShell* pShell;
if(SFX_ITEM_SET == rCoreSet.GetItemState(SID_HTML_MODE, sal_False, &pItem) ||
( 0 != ( pShell = SfxObjectShell::Current()) &&
0 != (pItem = pShell->GetItem(SID_HTML_MODE))))
{
sal_uInt16 nHtmlMode = ((const SfxUInt16Item*)pItem)->GetValue();
if(HTMLMODE_ON & nHtmlMode)
{
aStyleFL.Hide();
aVisitedFT.Hide();
aVisitedLB.Hide();
aNotVisitedFT.Hide();
aNotVisitedLB.Hide();
}
}
aURLPB.SetClickHdl (LINK( this, SwCharURLPage, InsertFileHdl));
aEventPB.SetClickHdl(LINK( this, SwCharURLPage, EventHdl ));
SwView *pView = ::GetActiveView();
::FillCharStyleListBox(aVisitedLB, pView->GetDocShell());
::FillCharStyleListBox(aNotVisitedLB, pView->GetDocShell());
TargetList* pList = new TargetList;
const SfxFrame& rFrame = pView->GetViewFrame()->GetTopFrame();
rFrame.GetTargetList(*pList);
sal_uInt16 nCount = (sal_uInt16)pList->Count();
if( nCount )
{
sal_uInt16 i;
for ( i = 0; i < nCount; i++ )
{
aTargetFrmLB.InsertEntry(*pList->GetObject(i));
}
for ( i = nCount; i; i-- )
{
delete pList->GetObject( i - 1 );
}
}
delete pList;
}
/*-----------------15.08.96 09.04-------------------
--------------------------------------------------*/
SwCharURLPage::~SwCharURLPage()
{
delete pINetItem;
}
/*-----------------14.08.96 11.31-------------------
--------------------------------------------------*/
void SwCharURLPage::Reset(const SfxItemSet& rSet)
{
const SfxPoolItem* pItem;
if ( SFX_ITEM_SET == rSet.GetItemState( RES_TXTATR_INETFMT, sal_False, &pItem ) )
{
const SwFmtINetFmt* pINetFmt = (const SwFmtINetFmt*) pItem;
aURLED.SetText( INetURLObject::decode( pINetFmt->GetValue(),
INET_HEX_ESCAPE, INetURLObject::DECODE_UNAMBIGUOUS,
RTL_TEXTENCODING_UTF8 ) );
aURLED.SaveValue();
aNameED.SetText( pINetFmt->GetName() );
String sEntry = pINetFmt->GetVisitedFmt();
if ( sEntry.Len() == 0 )
{
ASSERT( false, "<SwCharURLPage::Reset(..)> - missing visited character format at hyperlink attribute" );
SwStyleNameMapper::FillUIName( RES_POOLCHR_INET_VISIT, sEntry );
}
aVisitedLB.SelectEntry( sEntry );
sEntry = pINetFmt->GetINetFmt();
if ( sEntry.Len() == 0 )
{
ASSERT( false, "<SwCharURLPage::Reset(..)> - missing unvisited character format at hyperlink attribute" );
SwStyleNameMapper::FillUIName( RES_POOLCHR_INET_NORMAL, sEntry );
}
aNotVisitedLB.SelectEntry( sEntry );
aTargetFrmLB.SetText(pINetFmt->GetTargetFrame());
aVisitedLB. SaveValue();
aNotVisitedLB.SaveValue();
aTargetFrmLB. SaveValue();
pINetItem = new SvxMacroItem(FN_INET_FIELD_MACRO);
if( pINetFmt->GetMacroTbl() )
pINetItem->SetMacroTable( *pINetFmt->GetMacroTbl() );
}
if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_SELECTION, sal_False, &pItem))
{
aTextED.SetText(((const SfxStringItem*)pItem)->GetValue());
aTextFT.Enable( sal_False );
aTextED.Enable( sal_False );
}
}
/*-----------------14.08.96 11.32-------------------
--------------------------------------------------*/
sal_Bool SwCharURLPage::FillItemSet(SfxItemSet& rSet)
{
::rtl::OUString sURL = aURLED.GetText();
if(sURL.getLength())
{
sURL = URIHelper::SmartRel2Abs(INetURLObject(), sURL, Link(), false );
// #i100683# file URLs should be normalized in the UI
static const sal_Char* pFile = "file:";
sal_Int32 nLength = ((sal_Int32)sizeof(pFile)-1);
if( sURL.copy(0, nLength ).equalsAsciiL( pFile, nLength ))
sURL = URIHelper::simpleNormalizedMakeRelative(::rtl::OUString(), sURL);
}
SwFmtINetFmt aINetFmt(sURL, aTargetFrmLB.GetText());
aINetFmt.SetName(aNameED.GetText());
bModified |= aURLED.GetText() != aURLED.GetSavedValue();
bModified |= aNameED.IsModified();
bModified |= aTargetFrmLB.GetSavedValue() != aTargetFrmLB.GetText();
//zuerst die gueltigen Einstellungen setzen
String sEntry = aVisitedLB.GetSelectEntry();
sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( sEntry, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT);
aINetFmt.SetVisitedFmtAndId( sEntry, nId );
sEntry = aNotVisitedLB.GetSelectEntry();
nId = SwStyleNameMapper::GetPoolIdFromUIName( sEntry, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT);
aINetFmt.SetINetFmtAndId( sEntry, nId );
if( pINetItem && pINetItem->GetMacroTable().Count() )
aINetFmt.SetMacroTbl( &pINetItem->GetMacroTable() );
if(aVisitedLB.GetSavedValue() != aVisitedLB.GetSelectEntryPos())
bModified = sal_True;
if(aNotVisitedLB.GetSavedValue() != aNotVisitedLB.GetSelectEntryPos())
bModified = sal_True;
if(aTextED.IsModified())
{
bModified = sal_True;
rSet.Put(SfxStringItem(FN_PARAM_SELECTION, aTextED.GetText()));
}
if(bModified)
rSet.Put(aINetFmt);
return bModified;
}
/*-----------------14.08.96 11.30-------------------
--------------------------------------------------*/
SfxTabPage* SwCharURLPage::Create( Window* pParent,
const SfxItemSet& rAttrSet )
{
return ( new SwCharURLPage( pParent, rAttrSet ) );
}
/*-----------------14.08.96 15.00-------------------
--------------------------------------------------*/
IMPL_LINK( SwCharURLPage, InsertFileHdl, PushButton *, EMPTYARG )
{
FileDialogHelper aDlgHelper( TemplateDescription::FILEOPEN_SIMPLE, 0 );
if( aDlgHelper.Execute() == ERRCODE_NONE )
{
Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
aURLED.SetText(xFP->getFiles().getConstArray()[0]);
}
return 0;
}
/*-----------------14.08.96 15.00-------------------
--------------------------------------------------*/
IMPL_LINK( SwCharURLPage, EventHdl, PushButton *, EMPTYARG )
{
bModified |= SwMacroAssignDlg::INetFmtDlg( this,
::GetActiveView()->GetWrtShell(), pINetItem );
return 0;
}