diff options
Diffstat (limited to '')
-rw-r--r-- | sw/source/ui/chrdlg/chardlg.cxx | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/sw/source/ui/chrdlg/chardlg.cxx b/sw/source/ui/chrdlg/chardlg.cxx new file mode 100644 index 000000000..5e89cfdaa --- /dev/null +++ b/sw/source/ui/chrdlg/chardlg.cxx @@ -0,0 +1,309 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <memory> +#include <hintids.hxx> + +#include <comphelper/fileurl.hxx> +#include <svl/urihelper.hxx> +#include <svl/stritem.hxx> +#include <editeng/flstitem.hxx> +#include <sfx2/htmlmode.hxx> +#include <svl/cjkoptions.hxx> +#include <svl/macitem.hxx> + +#include <cmdid.h> +#include <swtypes.hxx> +#include <view.hxx> +#include <docsh.hxx> +#include <uitool.hxx> +#include <fmtinfmt.hxx> +#include <macassgn.hxx> +#include <chrdlg.hxx> +#include <swmodule.hxx> +#include <poolfmt.hxx> + +#include <strings.hrc> +#include <chrdlgmodes.hxx> +#include <com/sun/star/ui/dialogs/TemplateDescription.hpp> +#include <com/sun/star/ui/dialogs/XFilePicker3.hpp> +#include <SwStyleNameMapper.hxx> +#include <sfx2/filedlghelper.hxx> +#include <sfx2/frame.hxx> + +#include <svx/svxdlg.hxx> +#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; + +SwCharDlg::SwCharDlg(weld::Window* pParent, SwView& rVw, const SfxItemSet& rCoreSet, + SwCharDlgMode nDialogMode, const OUString* pStr) + : SfxTabDialogController(pParent, "modules/swriter/ui/characterproperties.ui", + "CharacterPropertiesDialog", &rCoreSet, pStr != nullptr) + , m_rView(rVw) + , m_nDialogMode(nDialogMode) +{ + if (pStr) + { + m_xDialog->set_title(m_xDialog->get_title() + SwResId(STR_TEXTCOLL_HEADER) + *pStr + ")"); + } + SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create(); + AddTabPage("font", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_CHAR_NAME), nullptr); + AddTabPage("fonteffects", pFact->GetTabPageCreatorFunc(RID_SVXPAGE_CHAR_EFFECTS), nullptr); + AddTabPage("position", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_CHAR_POSITION ), nullptr ); + AddTabPage("asianlayout", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_CHAR_TWOLINES ), nullptr ); + AddTabPage("hyperlink", SwCharURLPage::Create, nullptr); + AddTabPage("background", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_BKG ), nullptr ); + AddTabPage("borders", pFact->GetTabPageCreatorFunc( RID_SVXPAGE_BORDER ), nullptr ); + + if (m_nDialogMode == SwCharDlgMode::Draw || m_nDialogMode == SwCharDlgMode::Ann) + { + RemoveTabPage("hyperlink"); + RemoveTabPage("asianlayout"); + } + else + { + SvtCJKOptions aCJKOptions; + if (!aCJKOptions.IsDoubleLinesEnabled()) + RemoveTabPage("asianlayout"); + } + + if (m_nDialogMode != SwCharDlgMode::Std) + RemoveTabPage("borders"); +} + +SwCharDlg::~SwCharDlg() +{ +} + +// set FontList +void SwCharDlg::PageCreated(const OString& rId, SfxTabPage &rPage) +{ + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + if (rId == "font") + { + SvxFontListItem aFontListItem( *static_cast<const SvxFontListItem*>( + ( m_rView.GetDocShell()->GetItem( SID_ATTR_CHAR_FONTLIST ) ) ) ); + aSet.Put (SvxFontListItem( aFontListItem.GetFontList(), SID_ATTR_CHAR_FONTLIST)); + if(m_nDialogMode != SwCharDlgMode::Draw && m_nDialogMode != SwCharDlgMode::Ann) + aSet.Put (SfxUInt32Item(SID_FLAG_TYPE,SVX_PREVIEW_CHARACTER)); + rPage.PageCreated(aSet); + } + else if (rId == "fonteffects") + { + aSet.Put(SfxUInt32Item(SID_FLAG_TYPE, SVX_PREVIEW_CHARACTER | SVX_ENABLE_FLASH + | SVX_ENABLE_CHAR_TRANSPARENCY)); + rPage.PageCreated(aSet); + } + else if (rId == "position") + { + aSet.Put (SfxUInt32Item(SID_FLAG_TYPE,SVX_PREVIEW_CHARACTER)); + rPage.PageCreated(aSet); + } + else if (rId == "asianlayout") + { + aSet.Put (SfxUInt32Item(SID_FLAG_TYPE,SVX_PREVIEW_CHARACTER)); + rPage.PageCreated(aSet); + } + else if (rId == "background") + { + SvxBackgroundTabFlags eFlags(SvxBackgroundTabFlags::SHOW_HIGHLIGHTING); + if (m_nDialogMode == SwCharDlgMode::Draw || m_nDialogMode == SwCharDlgMode::Ann) + eFlags = SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR; + aSet.Put (SfxUInt32Item(SID_FLAG_TYPE,static_cast<sal_uInt32>(eFlags))); + rPage.PageCreated(aSet); + } +} + +SwCharURLPage::SwCharURLPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rCoreSet) + : SfxTabPage(pPage, pController, "modules/swriter/ui/charurlpage.ui", "CharURLPage", &rCoreSet) + , bModified(false) + , m_xURLED(m_xBuilder->weld_entry("urled")) + , m_xTextFT(m_xBuilder->weld_label("textft")) + , m_xTextED(m_xBuilder->weld_entry("texted")) + , m_xNameED(m_xBuilder->weld_entry("nameed")) + , m_xTargetFrameLB(m_xBuilder->weld_combo_box("targetfrmlb")) + , m_xURLPB(m_xBuilder->weld_button("urlpb")) + , m_xEventPB(m_xBuilder->weld_button("eventpb")) + , m_xVisitedLB(m_xBuilder->weld_combo_box("visitedlb")) + , m_xNotVisitedLB(m_xBuilder->weld_combo_box("unvisitedlb")) + , m_xCharStyleContainer(m_xBuilder->weld_widget("charstyle")) +{ + // tdf#120188 like SfxManageStyleSheetPage limit the width of the style combos + const int nMaxWidth(m_xVisitedLB->get_approximate_digit_width() * 50); + m_xVisitedLB->set_size_request(nMaxWidth , -1); + m_xNotVisitedLB->set_size_request(nMaxWidth , -1); + + const SfxPoolItem* pItem; + SfxObjectShell* pShell; + if(SfxItemState::SET == rCoreSet.GetItemState(SID_HTML_MODE, false, &pItem) || + ( nullptr != ( pShell = SfxObjectShell::Current()) && + nullptr != (pItem = pShell->GetItem(SID_HTML_MODE)))) + { + sal_uInt16 nHtmlMode = static_cast<const SfxUInt16Item*>(pItem)->GetValue(); + if (HTMLMODE_ON & nHtmlMode) + m_xCharStyleContainer->hide(); + } + + m_xURLPB->connect_clicked(LINK( this, SwCharURLPage, InsertFileHdl)); + m_xEventPB->connect_clicked(LINK( this, SwCharURLPage, EventHdl)); + + SwView *pView = ::GetActiveView(); + ::FillCharStyleListBox(*m_xVisitedLB, pView->GetDocShell()); + ::FillCharStyleListBox(*m_xNotVisitedLB, pView->GetDocShell()); + m_xVisitedLB->set_active_id(OUString::number(RES_POOLCHR_INET_VISIT)); + m_xVisitedLB->save_value(); + m_xNotVisitedLB->set_active_id(OUString::number(RES_POOLCHR_INET_NORMAL)); + m_xNotVisitedLB->save_value(); + + std::unique_ptr<TargetList> pList( new TargetList ); + SfxFrame::GetDefaultTargetList(*pList); + + m_xTargetFrameLB->freeze(); + size_t nCount = pList->size(); + for (size_t i = 0; i < nCount; ++i) + { + m_xTargetFrameLB->append_text(pList->at(i)); + } + m_xTargetFrameLB->thaw(); +} + +SwCharURLPage::~SwCharURLPage() +{ + pINetItem.reset(); +} + +void SwCharURLPage::Reset(const SfxItemSet* rSet) +{ + const SfxPoolItem* pItem; + if (SfxItemState::SET == rSet->GetItemState(RES_TXTATR_INETFMT, false, &pItem)) + { + const SwFormatINetFormat* pINetFormat = static_cast<const SwFormatINetFormat*>( pItem); + m_xURLED->set_text(INetURLObject::decode(pINetFormat->GetValue(), + INetURLObject::DecodeMechanism::Unambiguous)); + m_xURLED->save_value(); + m_xNameED->set_text(pINetFormat->GetName()); + m_xNameED->save_value(); + + OUString sEntry = pINetFormat->GetVisitedFormat(); + if (sEntry.isEmpty()) + { + OSL_ENSURE( false, "<SwCharURLPage::Reset(..)> - missing visited character format at hyperlink attribute" ); + SwStyleNameMapper::FillUIName(RES_POOLCHR_INET_VISIT, sEntry); + } + m_xVisitedLB->set_active_text(sEntry); + + sEntry = pINetFormat->GetINetFormat(); + if (sEntry.isEmpty()) + { + OSL_ENSURE( false, "<SwCharURLPage::Reset(..)> - missing unvisited character format at hyperlink attribute" ); + SwStyleNameMapper::FillUIName(RES_POOLCHR_INET_NORMAL, sEntry); + } + m_xNotVisitedLB->set_active_text(sEntry); + + m_xTargetFrameLB->set_entry_text(pINetFormat->GetTargetFrame()); + m_xVisitedLB->save_value(); + m_xNotVisitedLB->save_value(); + m_xTargetFrameLB->save_value(); + pINetItem.reset( new SvxMacroItem(FN_INET_FIELD_MACRO) ); + + if( pINetFormat->GetMacroTable() ) + pINetItem->SetMacroTable(*pINetFormat->GetMacroTable()); + } + if (SfxItemState::SET == rSet->GetItemState(FN_PARAM_SELECTION, false, &pItem)) + { + m_xTextED->set_text(static_cast<const SfxStringItem*>(pItem)->GetValue()); + m_xTextFT->set_sensitive(false); + m_xTextED->set_sensitive(false); + } +} + +bool SwCharURLPage::FillItemSet(SfxItemSet* rSet) +{ + OUString sURL = m_xURLED->get_text(); + if (!sURL.isEmpty()) + { + sURL = URIHelper::SmartRel2Abs(INetURLObject(), sURL, Link<OUString *, bool>(), false ); + // #i100683# file URLs should be normalized in the UI + if ( comphelper::isFileUrl(sURL) ) + sURL = URIHelper::simpleNormalizedMakeRelative(OUString(), sURL); + } + + SwFormatINetFormat aINetFormat(sURL, m_xTargetFrameLB->get_active_text()); + aINetFormat.SetName(m_xNameED->get_text()); + bool bURLModified = m_xURLED->get_value_changed_from_saved(); + bool bNameModified = m_xNameED->get_value_changed_from_saved(); + bool bTargetModified = m_xTargetFrameLB->get_value_changed_from_saved(); + bModified = bURLModified || bNameModified || bTargetModified; + + // set valid settings first + OUString sEntry = m_xVisitedLB->get_active_text(); + sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( sEntry, SwGetPoolIdFromName::ChrFmt); + aINetFormat.SetVisitedFormatAndId( sEntry, nId ); + + sEntry = m_xNotVisitedLB->get_active_text(); + nId = SwStyleNameMapper::GetPoolIdFromUIName( sEntry, SwGetPoolIdFromName::ChrFmt); + aINetFormat.SetINetFormatAndId( sEntry, nId ); + + if (pINetItem && !pINetItem->GetMacroTable().empty()) + aINetFormat.SetMacroTable(&pINetItem->GetMacroTable()); + + if (m_xVisitedLB->get_value_changed_from_saved()) + bModified = true; + + if (m_xNotVisitedLB->get_value_changed_from_saved()) + bModified = true; + + if (bNameModified) + { + bModified = true; + rSet->Put(SfxStringItem(FN_PARAM_SELECTION, m_xTextED->get_text())); + } + if(bModified) + rSet->Put(aINetFormat); + return bModified; +} + +std::unique_ptr<SfxTabPage> SwCharURLPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rAttrSet) +{ + return std::make_unique<SwCharURLPage>(pPage, pController, *rAttrSet); +} + +IMPL_LINK_NOARG(SwCharURLPage, InsertFileHdl, weld::Button&, void) +{ + FileDialogHelper aDlgHelper(TemplateDescription::FILEOPEN_SIMPLE, + FileDialogFlags::NONE, GetFrameWeld()); + if( aDlgHelper.Execute() == ERRCODE_NONE ) + { + const Reference<XFilePicker3>& xFP = aDlgHelper.GetFilePicker(); + m_xURLED->set_text(xFP->getSelectedFiles().getConstArray()[0]); + } +} + +IMPL_LINK_NOARG(SwCharURLPage, EventHdl, weld::Button&, void) +{ + bModified |= SwMacroAssignDlg::INetFormatDlg(GetFrameWeld(), + ::GetActiveView()->GetWrtShell(), pINetItem); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |