diff options
Diffstat (limited to 'extensions/source/bibliography/general.cxx')
-rw-r--r-- | extensions/source/bibliography/general.cxx | 1211 |
1 files changed, 688 insertions, 523 deletions
diff --git a/extensions/source/bibliography/general.cxx b/extensions/source/bibliography/general.cxx index 1d2f66517a10..92a4c6843ec1 100644 --- a/extensions/source/bibliography/general.cxx +++ b/extensions/source/bibliography/general.cxx @@ -18,18 +18,22 @@ */ #include <comphelper/processfactory.hxx> +#include <com/sun/star/beans/XPropertyChangeListener.hpp> +#include <com/sun/star/form/XBoundComponent.hpp> #include <com/sun/star/sdbc/XRowSet.hpp> #include <com/sun/star/sdb/XColumn.hpp> #include <com/sun/star/sdb/CommandType.hpp> -#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> -#include <com/sun/star/awt/XWindow.hpp> -#include <com/sun/star/uno/XComponentContext.hpp> -#include <toolkit/helper/vclunohelper.hxx> +#include <com/sun/star/ui/dialogs/TemplateDescription.hpp> +#include <com/sun/star/uri/UriReferenceFactory.hpp> + +#include <o3tl/safeint.hxx> +#include <o3tl/string_view.hxx> +#include <sal/log.hxx> +#include <osl/diagnose.h> #include <cppuhelper/implbase.hxx> -#include <vcl/builder.hxx> -#include <vcl/scrbar.hxx> -#include <vcl/settings.hxx> -#include <vcl/fixed.hxx> +#include <utility> +#include <vcl/event.hxx> +#include <vcl/mnemonic.hxx> #include "general.hxx" #include "bibresid.hxx" #include "datman.hxx" @@ -37,187 +41,165 @@ #include <strings.hrc> #include "bibmod.hxx" #include <helpids.h> -#include <tools/debug.hxx> -#include <vcl/svapp.hxx> -#include <vcl/i18nhelp.hxx> -#include <vcl/mnemonic.hxx> #include <algorithm> -#include <tools/urlobj.hxx> +#include <sfx2/filedlghelper.hxx> +#include <sfx2/objsh.hxx> using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::form; using namespace ::com::sun::star::sdb; -static OUString lcl_GetColumnName( const Mapping* pMapping, sal_uInt16 nIndexPos ) +namespace { - BibConfig* pBibConfig = BibModul::GetConfig(); - OUString sRet = pBibConfig->GetDefColumnName(nIndexPos); - if(pMapping) - for(const auto & aColumnPair : pMapping->aColumnPairs) - { - if(aColumnPair.sLogicalColumnName == sRet) - { - sRet = aColumnPair.sRealColumnName; - break; - } - } - return sRet; -} - -namespace { - -class BibPosListener :public cppu::WeakImplHelper <sdbc::XRowSetListener> +/// Tries to split rText into rURL and nPageNumber. +bool SplitUrlAndPage(const OUString& rText, OUString& rUrl, int& nPageNumber) { - VclPtr<BibGeneralPage> pParentPage; -public: - explicit BibPosListener(BibGeneralPage* pParent); - - //XPositioningListener - virtual void SAL_CALL cursorMoved(const lang::EventObject& event) override; - virtual void SAL_CALL rowChanged(const lang::EventObject& /*event*/) override { /* not interested in */ } - virtual void SAL_CALL rowSetChanged(const lang::EventObject& /*event*/) override { /* not interested in */ } - - //XEventListener - virtual void SAL_CALL disposing(const lang::EventObject& Source) override; + uno::Reference<uri::XUriReferenceFactory> xUriReferenceFactory + = uri::UriReferenceFactory::create(comphelper::getProcessComponentContext()); + uno::Reference<uri::XUriReference> xUriRef; + try + { + xUriRef = xUriReferenceFactory->parse(rText); + } + catch (const uno::Exception& rException) + { + SAL_WARN("extensions.biblio", + "SplitUrlAndPage: failed to parse url: " << rException.Message); + return false; + } -}; + OUString aPagePrefix("page="); + if (!xUriRef->getFragment().startsWith(aPagePrefix)) + { + return false; + } + nPageNumber = o3tl::toInt32(xUriRef->getFragment().subView(aPagePrefix.getLength())); + xUriRef->clearFragment(); + rUrl = xUriRef->getUriReference(); + return true; } -BibPosListener::BibPosListener(BibGeneralPage* pParent) : - pParentPage(pParent) +/// Merges rUrl and rPageSB to a URL string. +OUString MergeUrlAndPage(const OUString& rUrl, const weld::SpinButton& rPageSB) { -} + if (!rPageSB.get_sensitive()) + { + return rUrl; + } -void BibPosListener::cursorMoved(const lang::EventObject& /*aEvent*/) -{ + uno::Reference<uri::XUriReferenceFactory> xUriReferenceFactory + = uri::UriReferenceFactory::create(comphelper::getProcessComponentContext()); + uno::Reference<uri::XUriReference> xUriRef; try { - uno::Reference< form::XBoundComponent > xLstBox = pParentPage->GetTypeListBoxModel(); - uno::Reference< beans::XPropertySet > xPropSet(xLstBox, UNO_QUERY); - if(xPropSet.is()) - { - BibConfig* pBibConfig = BibModul::GetConfig(); - BibDataManager* pDatMan = pParentPage->GetDataManager(); - BibDBDescriptor aDesc; - aDesc.sDataSource = pDatMan->getActiveDataSource(); - aDesc.sTableOrQuery = pDatMan->getActiveDataTable(); - aDesc.nCommandType = CommandType::TABLE; - - const Mapping* pMapping = pBibConfig->GetMapping(aDesc); - OUString sTypeMapping = pBibConfig->GetDefColumnName(AUTHORITYTYPE_POS); - if(pMapping) - { - for(const auto & aColumnPair : pMapping->aColumnPairs) - { - if(aColumnPair.sLogicalColumnName == sTypeMapping) - { - sTypeMapping = aColumnPair.sRealColumnName; - break; - } - } - } - OUString uTypeMapping = sTypeMapping; - - uno::Reference< form::XForm > xForm = pDatMan->getForm(); - uno::Reference< sdbcx::XColumnsSupplier > xSupplyCols(xForm, UNO_QUERY); - uno::Reference< container::XNameAccess > xValueAcc; - if (xSupplyCols.is()) - xValueAcc = xSupplyCols->getColumns(); - - sal_Int16 nTempVal = -1; - if(xValueAcc.is() && xValueAcc->hasByName(uTypeMapping)) - { - uno::Any aVal = xValueAcc->getByName(uTypeMapping); - uno::Reference< sdb::XColumn > xCol(aVal, UNO_QUERY); - DBG_ASSERT(xCol.is(), "BibPosListener::cursorMoved : invalid column (no sdb::XColumn) !"); - if (xCol.is()) - { - nTempVal = xCol->getShort(); - // getShort returns zero if the value is not a number - if (!nTempVal || xCol->wasNull()) - { - OUString sTempVal = xCol->getString(); - if(sTempVal != "0") - nTempVal = -1; - } - } - } - if(nTempVal < 0 || nTempVal >= TYPE_COUNT) - { - uno::Any aSel; - uno::Sequence<sal_Int16> aSelSeq(1); - sal_Int16* pArr = aSelSeq.getArray(); - pArr[0] = TYPE_COUNT; - aSel <<= aSelSeq; - xPropSet->setPropertyValue("SelectedItems", aSel); - } - } + xUriRef = xUriReferenceFactory->parse(rUrl); } - catch(const Exception&) + catch (const uno::Exception& rException) { - OSL_FAIL("BibPosListener::cursorMoved: something went wrong !"); + SAL_WARN("extensions.biblio", + "MergeUrlAndPage: failed to parse url: " << rException.Message); + return rUrl; } + + OUString aFragment("page=" + OUString::number(rPageSB.get_value())); + xUriRef->setFragment(aFragment); + return xUriRef->getUriReference(); +} } -void BibPosListener::disposing(const lang::EventObject& /*Source*/) +static OUString lcl_GetColumnName( const Mapping* pMapping, sal_uInt16 nIndexPos ) { + BibConfig* pBibConfig = BibModul::GetConfig(); + OUString sRet = pBibConfig->GetDefColumnName(nIndexPos); + if(pMapping) + for(const auto & aColumnPair : pMapping->aColumnPairs) + { + if(aColumnPair.sLogicalColumnName == sRet) + { + sRet = aColumnPair.sRealColumnName; + break; + } + } + return sRet; } -BibGeneralPage::BibGeneralPage(vcl::Window* pParent, BibDataManager* pMan): - TabPage(pParent), - BibShortCutHandler( this ), - mxBibGeneralPageFocusListener(new BibGeneralPageFocusListener(this)), - pDatMan(pMan) +BibGeneralPage::BibGeneralPage(vcl::Window* pParent, BibDataManager* pMan) + : InterimItemWindow(pParent, "modules/sbibliography/ui/generalpage.ui", "GeneralPage") + , BibShortCutHandler(this) + , xScrolledWindow(m_xBuilder->weld_scrolled_window("scrolledwindow")) + , xGrid(m_xBuilder->weld_widget("grid")) + , xIdentifierFT(m_xBuilder->weld_label("shortname")) + , xIdentifierED(m_xBuilder->weld_entry("shortnamecontrol")) + , xAuthTypeFT(m_xBuilder->weld_label("authtype")) + , xAuthTypeLB(m_xBuilder->weld_combo_box("authtypecontrol")) + , xYearFT(m_xBuilder->weld_label("year")) + , xYearED(m_xBuilder->weld_entry("yearcontrol")) + , xAuthorFT(m_xBuilder->weld_label("authors")) + , xAuthorED(m_xBuilder->weld_entry("authorscontrol")) + , xTitleFT(m_xBuilder->weld_label("title")) + , xTitleED(m_xBuilder->weld_entry("titlecontrol")) + , xPublisherFT(m_xBuilder->weld_label("publisher")) + , xPublisherED(m_xBuilder->weld_entry("publishercontrol")) + , xAddressFT(m_xBuilder->weld_label("address")) + , xAddressED(m_xBuilder->weld_entry("addresscontrol")) + , xISBNFT(m_xBuilder->weld_label("isbn")) + , xISBNED(m_xBuilder->weld_entry("isbncontrol")) + , xChapterFT(m_xBuilder->weld_label("chapter")) + , xChapterED(m_xBuilder->weld_entry("chaptercontrol")) + , xPagesFT(m_xBuilder->weld_label("pages")) + , xPagesED(m_xBuilder->weld_entry("pagescontrol")) + , xEditorFT(m_xBuilder->weld_label("editor")) + , xEditorED(m_xBuilder->weld_entry("editorcontrol")) + , xEditionFT(m_xBuilder->weld_label("edition")) + , xEditionED(m_xBuilder->weld_entry("editioncontrol")) + , xBooktitleFT(m_xBuilder->weld_label("booktitle")) + , xBooktitleED(m_xBuilder->weld_entry("booktitlecontrol")) + , xVolumeFT(m_xBuilder->weld_label("volume")) + , xVolumeED(m_xBuilder->weld_entry("volumecontrol")) + , xHowpublishedFT(m_xBuilder->weld_label("publicationtype")) + , xHowpublishedED(m_xBuilder->weld_entry("publicationtypecontrol")) + , xOrganizationsFT(m_xBuilder->weld_label("organization")) + , xOrganizationsED(m_xBuilder->weld_entry("organizationcontrol")) + , xInstitutionFT(m_xBuilder->weld_label("institution")) + , xInstitutionED(m_xBuilder->weld_entry("institutioncontrol")) + , xSchoolFT(m_xBuilder->weld_label("university")) + , xSchoolED(m_xBuilder->weld_entry("universitycontrol")) + , xReportTypeFT(m_xBuilder->weld_label("reporttype")) + , xReportTypeED(m_xBuilder->weld_entry("reporttypecontrol")) + , xMonthFT(m_xBuilder->weld_label("month")) + , xMonthED(m_xBuilder->weld_entry("monthcontrol")) + , xJournalFT(m_xBuilder->weld_label("journal")) + , xJournalED(m_xBuilder->weld_entry("journalcontrol")) + , xNumberFT(m_xBuilder->weld_label("number")) + , xNumberED(m_xBuilder->weld_entry("numbercontrol")) + , xSeriesFT(m_xBuilder->weld_label("series")) + , xSeriesED(m_xBuilder->weld_entry("seriescontrol")) + , xAnnoteFT(m_xBuilder->weld_label("annotation")) + , xAnnoteED(m_xBuilder->weld_entry("annotationcontrol")) + , xNoteFT(m_xBuilder->weld_label("note")) + , xNoteED(m_xBuilder->weld_entry("notecontrol")) + , xURLFT(m_xBuilder->weld_label("url")) + , xURLED(m_xBuilder->weld_entry("urlcontrol")) + , xCustom1FT(m_xBuilder->weld_label("custom1")) + , xCustom1ED(m_xBuilder->weld_entry("custom1control")) + , xCustom2FT(m_xBuilder->weld_label("custom2")) + , xCustom2ED(m_xBuilder->weld_entry("custom2control")) + , xCustom3FT(m_xBuilder->weld_label("custom3")) + , xCustom3ED(m_xBuilder->weld_entry("custom3control")) + , xCustom4FT(m_xBuilder->weld_label("custom4")) + , xCustom4ED(m_xBuilder->weld_entry("custom4control")) + , xCustom5FT(m_xBuilder->weld_label("custom5")) + , xCustom5ED(m_xBuilder->weld_entry("custom5control")) + , m_xLocalURLFT(m_xBuilder->weld_label("localurl")) + , m_xLocalURLED(m_xBuilder->weld_entry("localurlcontrol")) + , m_xLocalBrowseButton(m_xBuilder->weld_button("localbrowse")) + , m_xLocalPageCB(m_xBuilder->weld_check_button("localpagecb")) + , m_xLocalPageSB(m_xBuilder->weld_spin_button("localpagesb")) + , pDatMan(pMan) { - m_pUIBuilder.reset(new VclBuilder(this, AllSettings::GetUIRootDir(), "modules/sbibliography/ui/generalpage.ui", "GeneralPage")); - set_hexpand(true); - set_vexpand(true); - set_expand(true); - - get(pIdentifierFT, "shortname"); - get(pAuthTypeFT, "authtype"); - get(pGrid, "grid"); - get(pScrolledWindow, "scrolledwindow"); - get(pYearFT, "year"); - get(pAuthorFT, "authors"); - get(pTitleFT, "title"); - get(pPublisherFT, "publisher"); - get(pAddressFT, "address"); - get(pISBNFT, "isbn"); - get(pChapterFT, "chapter"); - get(pPagesFT, "pages"); - get(pEditorFT, "editor"); - get(pEditionFT, "edition"); - get(pBooktitleFT, "booktitle"); - get(pVolumeFT, "volume"); - get(pHowpublishedFT, "publicationtype"); - get(pOrganizationsFT, "organization"); - get(pInstitutionFT, "institution"); - get(pSchoolFT, "university"); - get(pReportTypeFT, "reporttype"); - get(pMonthFT, "month"); - get(pJournalFT, "journal"); - get(pNumberFT, "number"); - get(pSeriesFT, "series"); - get(pAnnoteFT, "annotation"); - get(pNoteFT, "note"); - get(pURLFT, "url"); - get(pCustom1FT, "custom1"); - get(pCustom2FT, "custom2"); - get(pCustom3FT, "custom3"); - get(pCustom4FT, "custom4"); - get(pCustom5FT, "custom5"); - - InitFixedTexts(); - - sal_Int16* pMap = nFT2CtrlMap; - for( sal_uInt16 i = 0 ; i < FIELD_COUNT ; ++i, ++pMap ) - { - aControls[ i ] = nullptr; - *pMap = -1; - } + SetStyle(GetStyle() | WB_DIALOGCONTROL); BibConfig* pBibConfig = BibModul::GetConfig(); BibDBDescriptor aDesc; @@ -226,115 +208,140 @@ BibGeneralPage::BibGeneralPage(vcl::Window* pParent, BibDataManager* pMan): aDesc.nCommandType = CommandType::TABLE; const Mapping* pMapping = pBibConfig->GetMapping(aDesc); - xCtrlContnr = VCLUnoHelper::CreateControlContainer(pGrid); - - std::vector<vcl::Window*> aChildren; + xIdentifierED->connect_key_press(LINK(this, BibGeneralPage, FirstElementKeyInputHdl)); - AddControlWithError(lcl_GetColumnName(pMapping, IDENTIFIER_POS), *pIdentifierFT, - sTableErrorString, - HID_BIB_IDENTIFIER_POS, 0, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, IDENTIFIER_POS), + xIdentifierFT->get_label(), *xIdentifierED, + sTableErrorString, HID_BIB_IDENTIFIER_POS); - sTypeColumnName = lcl_GetColumnName(pMapping, AUTHORITYTYPE_POS); + AddControlWithError(lcl_GetColumnName(pMapping, AUTHORITYTYPE_POS), + xAuthTypeFT->get_label(), *xAuthTypeLB, + sTableErrorString, HID_BIB_AUTHORITYTYPE_POS); - AddControlWithError(sTypeColumnName, *pAuthTypeFT, sTableErrorString, - HID_BIB_AUTHORITYTYPE_POS, 1, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, YEAR_POS), + xYearFT->get_label(), *xYearED, + sTableErrorString, HID_BIB_YEAR_POS); - AddControlWithError(lcl_GetColumnName(pMapping, YEAR_POS), *pYearFT, - sTableErrorString, HID_BIB_YEAR_POS, 2, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, AUTHOR_POS), + xAuthorFT->get_label(), *xAuthorED, + sTableErrorString, HID_BIB_AUTHOR_POS); - AddControlWithError(lcl_GetColumnName(pMapping, AUTHOR_POS), *pAuthorFT, - sTableErrorString, HID_BIB_AUTHOR_POS, 3, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, TITLE_POS), + xTitleFT->get_label(), *xTitleED, + sTableErrorString, HID_BIB_TITLE_POS); - AddControlWithError(lcl_GetColumnName(pMapping, TITLE_POS), *pTitleFT, sTableErrorString, - HID_BIB_TITLE_POS, 4, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, PUBLISHER_POS), + xPublisherFT->get_label(), *xPublisherED, + sTableErrorString, HID_BIB_PUBLISHER_POS); - AddControlWithError(lcl_GetColumnName(pMapping, PUBLISHER_POS), *pPublisherFT, - sTableErrorString, HID_BIB_PUBLISHER_POS, 5, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, ADDRESS_POS), + xAddressFT->get_label(), *xAddressED, + sTableErrorString, HID_BIB_ADDRESS_POS); - AddControlWithError(lcl_GetColumnName(pMapping, ADDRESS_POS), *pAddressFT, - sTableErrorString, HID_BIB_ADDRESS_POS, 6, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, ISBN_POS), + xISBNFT->get_label(), *xISBNED, + sTableErrorString, HID_BIB_ISBN_POS); - AddControlWithError(lcl_GetColumnName(pMapping, ISBN_POS), *pISBNFT, - sTableErrorString, HID_BIB_ISBN_POS, 7, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, CHAPTER_POS), + xChapterFT->get_label(), *xChapterED, + sTableErrorString, HID_BIB_CHAPTER_POS); - AddControlWithError(lcl_GetColumnName(pMapping, CHAPTER_POS), *pChapterFT, - sTableErrorString, HID_BIB_CHAPTER_POS, 8, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, PAGES_POS), + xPagesFT->get_label(), *xPagesED, + sTableErrorString, HID_BIB_PAGES_POS); - AddControlWithError(lcl_GetColumnName(pMapping, PAGES_POS), *pPagesFT, - sTableErrorString, HID_BIB_PAGES_POS, 9, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, EDITOR_POS), + xEditorFT->get_label(), *xEditorED, + sTableErrorString, HID_BIB_EDITOR_POS); - AddControlWithError(lcl_GetColumnName(pMapping, EDITOR_POS), *pEditorFT, - sTableErrorString, HID_BIB_EDITOR_POS, 10, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, EDITION_POS), + xEditionFT->get_label(), *xEditionED, + sTableErrorString, HID_BIB_EDITION_POS); - AddControlWithError(lcl_GetColumnName(pMapping, EDITION_POS), *pEditionFT, - sTableErrorString, HID_BIB_EDITION_POS, 11, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, BOOKTITLE_POS), + xBooktitleFT->get_label(), *xBooktitleED, + sTableErrorString, HID_BIB_BOOKTITLE_POS); - AddControlWithError(lcl_GetColumnName(pMapping, BOOKTITLE_POS), *pBooktitleFT, - sTableErrorString, HID_BIB_BOOKTITLE_POS, 12, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, VOLUME_POS), + xVolumeFT->get_label(), *xVolumeED, + sTableErrorString, HID_BIB_VOLUME_POS); - AddControlWithError(lcl_GetColumnName(pMapping, VOLUME_POS), *pVolumeFT, - sTableErrorString, HID_BIB_VOLUME_POS, 13, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, HOWPUBLISHED_POS), + xHowpublishedFT->get_label(), *xHowpublishedED, + sTableErrorString, HID_BIB_HOWPUBLISHED_POS); - AddControlWithError(lcl_GetColumnName(pMapping, HOWPUBLISHED_POS), *pHowpublishedFT, - sTableErrorString, HID_BIB_HOWPUBLISHED_POS, 14, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, ORGANIZATIONS_POS), + xOrganizationsFT->get_label(), *xOrganizationsED, + sTableErrorString, HID_BIB_ORGANIZATIONS_POS); - AddControlWithError(lcl_GetColumnName(pMapping, ORGANIZATIONS_POS), *pOrganizationsFT, - sTableErrorString, HID_BIB_ORGANIZATIONS_POS, 15, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, INSTITUTION_POS), + xInstitutionFT->get_label(), *xInstitutionED, + sTableErrorString, HID_BIB_INSTITUTION_POS); - AddControlWithError(lcl_GetColumnName(pMapping, INSTITUTION_POS), *pInstitutionFT, - sTableErrorString, HID_BIB_INSTITUTION_POS, 16, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, SCHOOL_POS), + xSchoolFT->get_label(), *xSchoolED, + sTableErrorString, HID_BIB_SCHOOL_POS); - AddControlWithError(lcl_GetColumnName(pMapping, SCHOOL_POS), *pSchoolFT, - sTableErrorString, HID_BIB_SCHOOL_POS, 17, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, REPORTTYPE_POS), + xReportTypeFT->get_label(), *xReportTypeED, + sTableErrorString, HID_BIB_REPORTTYPE_POS); - AddControlWithError(lcl_GetColumnName(pMapping, REPORTTYPE_POS), *pReportTypeFT, - sTableErrorString, HID_BIB_REPORTTYPE_POS, 18, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, MONTH_POS), + xMonthFT->get_label(), *xMonthED, + sTableErrorString, HID_BIB_MONTH_POS); - AddControlWithError(lcl_GetColumnName(pMapping, MONTH_POS), *pMonthFT, - sTableErrorString, HID_BIB_MONTH_POS, 19, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, JOURNAL_POS), + xJournalFT->get_label(), *xJournalED, + sTableErrorString, HID_BIB_JOURNAL_POS); - AddControlWithError(lcl_GetColumnName(pMapping, JOURNAL_POS), *pJournalFT, - sTableErrorString, HID_BIB_JOURNAL_POS, 20, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, NUMBER_POS), + xNumberFT->get_label(), *xNumberED, + sTableErrorString, HID_BIB_NUMBER_POS); - AddControlWithError(lcl_GetColumnName(pMapping, NUMBER_POS), *pNumberFT, - sTableErrorString, HID_BIB_NUMBER_POS, 21, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, SERIES_POS), + xSeriesFT->get_label(), *xSeriesED, + sTableErrorString, HID_BIB_SERIES_POS); - AddControlWithError(lcl_GetColumnName(pMapping, SERIES_POS), *pSeriesFT, - sTableErrorString, HID_BIB_SERIES_POS, 22, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, ANNOTE_POS), + xAnnoteFT->get_label(), *xAnnoteED, + sTableErrorString, HID_BIB_ANNOTE_POS); - AddControlWithError(lcl_GetColumnName(pMapping, ANNOTE_POS), *pAnnoteFT, - sTableErrorString, HID_BIB_ANNOTE_POS, 23, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, NOTE_POS), + xNoteFT->get_label(), *xNoteED, + sTableErrorString, HID_BIB_NOTE_POS); - AddControlWithError(lcl_GetColumnName(pMapping, NOTE_POS),*pNoteFT, - sTableErrorString, HID_BIB_NOTE_POS, 24, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, URL_POS), + xURLFT->get_label(), *xURLED, + sTableErrorString, HID_BIB_URL_POS); - AddControlWithError(lcl_GetColumnName(pMapping, URL_POS), *pURLFT, - sTableErrorString, HID_BIB_URL_POS, 25, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM1_POS), + xCustom1FT->get_label(), *xCustom1ED, + sTableErrorString, HID_BIB_CUSTOM1_POS); - AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM1_POS), *pCustom1FT, - sTableErrorString, HID_BIB_CUSTOM1_POS, 26, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM2_POS), + xCustom2FT->get_label(), *xCustom2ED, + sTableErrorString, HID_BIB_CUSTOM2_POS); - AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM2_POS), *pCustom2FT, - sTableErrorString, HID_BIB_CUSTOM2_POS, 27, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM3_POS), + xCustom3FT->get_label(), *xCustom3ED, + sTableErrorString, HID_BIB_CUSTOM3_POS); - AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM3_POS), *pCustom3FT, - sTableErrorString, HID_BIB_CUSTOM3_POS, 28, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM4_POS), + xCustom4FT->get_label(), *xCustom4ED, + sTableErrorString, HID_BIB_CUSTOM4_POS); - AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM4_POS), *pCustom4FT, - sTableErrorString, HID_BIB_CUSTOM4_POS, 29, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM5_POS), + xCustom5FT->get_label(), *xCustom5ED, + sTableErrorString, HID_BIB_CUSTOM5_POS); - AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM5_POS), *pCustom5FT, - sTableErrorString, HID_BIB_CUSTOM5_POS, 30, aChildren); + AddControlWithError(lcl_GetColumnName(pMapping, LOCAL_URL_POS), + m_xLocalURLFT->get_label(), *m_xLocalURLED, + sTableErrorString, HID_BIB_LOCAL_URL_POS); - BuilderUtils::reorderWithinParent(aChildren, false); + m_xLocalBrowseButton->connect_clicked(LINK(this, BibGeneralPage, BrowseHdl)); + m_xLocalPageCB->connect_toggled(LINK(this, BibGeneralPage, PageNumHdl)); - xPosListener = new BibPosListener(this); - uno::Reference< sdbc::XRowSet > xRowSet(pDatMan->getForm(), UNO_QUERY); - if(xRowSet.is()) - xRowSet->addRowSetListener(xPosListener); - uno::Reference< form::runtime::XFormController > xFormCtrl = pDatMan->GetFormController(); - xFormCtrl->setContainer(xCtrlContnr); - xFormCtrl->activateTabOrder(); + m_xLocalURLED->connect_key_press(LINK(this, BibGeneralPage, LastElementKeyInputHdl)); if(!sTableErrorString.isEmpty()) sTableErrorString = BibResId(ST_ERROR_PREFIX) + sTableErrorString; @@ -345,369 +352,527 @@ BibGeneralPage::BibGeneralPage(vcl::Window* pParent, BibDataManager* pMan): set_height_request(aSize.Height()); } -BibGeneralPage::~BibGeneralPage() +IMPL_LINK_NOARG(BibGeneralPage, BrowseHdl, weld::Button&, void) { - disposeOnce(); + sfx2::FileDialogHelper aFileDlg(ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, + FileDialogFlags::NONE, GetFrameWeld()); + OUString aPath = m_xLocalURLED->get_text(); + if (!aPath.isEmpty()) + { + aFileDlg.SetDisplayDirectory(aPath); + } + else + { + OUString aBaseURL; + if (SfxObjectShell* pShell = SfxObjectShell::Current()) + { + aBaseURL = pShell->getDocumentBaseURL(); + } + if (!aBaseURL.isEmpty()) + { + aFileDlg.SetDisplayDirectory(aBaseURL); + } + } + + if (aFileDlg.Execute() != ERRCODE_NONE) + { + return; + } + + weld::Entry& rEntry = *m_xLocalURLED; + rEntry.set_text(aFileDlg.GetPath()); +}; + +IMPL_LINK(BibGeneralPage, PageNumHdl, weld::Toggleable&, rPageCB, void) +{ + weld::SpinButton& rPageSB = *m_xLocalPageSB; + if (rPageCB.get_active()) + { + rPageSB.set_sensitive(true); + rPageSB.set_value(1); + } + else + { + rPageSB.set_sensitive(false); + } } -void BibGeneralPage::dispose() +IMPL_LINK(BibGeneralPage, FirstElementKeyInputHdl, const KeyEvent&, rKeyEvent, bool) { - if (pDatMan && xPosListener.is()) + sal_uInt16 nCode = rKeyEvent.GetKeyCode().GetCode(); + bool bShift = rKeyEvent.GetKeyCode().IsShift(); + bool bCtrl = rKeyEvent.GetKeyCode().IsMod1(); + bool bAlt = rKeyEvent.GetKeyCode().IsMod2(); + if (KEY_TAB == nCode && bShift && !bCtrl && !bAlt) { - uno::Reference< sdbc::XRowSet > xRowSet(pDatMan->getForm(), UNO_QUERY); - if(xRowSet.is()) - xRowSet->removeRowSetListener(xPosListener); + SaveChanges(); + uno::Reference<sdbc::XRowSet> xRowSet(pDatMan->getForm(), UNO_QUERY); + if (xRowSet.is() && !xRowSet->isFirst()) + xRowSet->previous(); + m_xLocalURLED->grab_focus(); + m_xLocalURLED->select_region(0, -1); + GainFocusHdl(*m_xLocalURLED); + return true; } - pGrid.clear(); - pScrolledWindow.clear(); - pIdentifierFT.clear(); - pAuthTypeFT.clear(); - pYearFT.clear(); - pAuthorFT.clear(); - pTitleFT.clear(); - pPublisherFT.clear(); - pAddressFT.clear(); - pISBNFT.clear(); - pChapterFT.clear(); - pPagesFT.clear(); - pEditorFT.clear(); - pEditionFT.clear(); - pBooktitleFT.clear(); - pVolumeFT.clear(); - pHowpublishedFT.clear(); - pOrganizationsFT.clear(); - pInstitutionFT.clear(); - pSchoolFT.clear(); - pReportTypeFT.clear(); - pMonthFT.clear(); - pJournalFT.clear(); - pNumberFT.clear(); - pSeriesFT.clear(); - pAnnoteFT.clear(); - pNoteFT.clear(); - pURLFT.clear(); - pCustom1FT.clear(); - pCustom2FT.clear(); - pCustom3FT.clear(); - pCustom4FT.clear(); - pCustom5FT.clear(); - for (auto & a: aFixedTexts) a.clear(); - mxBibGeneralPageFocusListener.clear(); - disposeBuilder(); - TabPage::dispose(); + return false; } -void BibGeneralPage::RemoveListeners() +void BibGeneralPage::SaveChanges() { - for(uno::Reference<awt::XWindow> & aControl : aControls) + Reference< XForm > xForm = pDatMan->getForm(); + Reference< beans::XPropertySet > xProps( xForm, UNO_QUERY ); + Reference< sdbc::XResultSetUpdate > xResUpd( xProps, UNO_QUERY ); + if (!xResUpd.is() ) + return; + + Any aModified = xProps->getPropertyValue( "IsModified" ); + bool bFlag = false; + if ( !( aModified >>= bFlag ) || !bFlag ) + return; + + try { - if(aControl.is()) - { - aControl->removeFocusListener( mxBibGeneralPageFocusListener.get() ); - aControl = nullptr; - } + Any aNew = xProps->getPropertyValue( "IsNew" ); + aNew >>= bFlag; + if ( bFlag ) + xResUpd->insertRow(); + else + xResUpd->updateRow(); } + catch( const uno::Exception&) {} } -void BibGeneralPage::CommitActiveControl() +IMPL_LINK(BibGeneralPage, LastElementKeyInputHdl, const KeyEvent&, rKeyEvent, bool) { - uno::Reference< form::runtime::XFormController > xFormCtrl = pDatMan->GetFormController(); - uno::Reference< awt::XControl > xCurr = xFormCtrl->getCurrentControl(); - if(xCurr.is()) + sal_uInt16 nCode = rKeyEvent.GetKeyCode().GetCode(); + bool bShift = rKeyEvent.GetKeyCode().IsShift(); + bool bCtrl = rKeyEvent.GetKeyCode().IsMod1(); + bool bAlt = rKeyEvent.GetKeyCode().IsMod2(); + if (KEY_TAB != nCode || bShift || bCtrl || bAlt) + return false; + SaveChanges(); + uno::Reference<sdbc::XRowSet> xRowSet(pDatMan->getForm(), UNO_QUERY); + if (xRowSet.is()) { - uno::Reference< awt::XControlModel > xModel = xCurr->getModel(); - uno::Reference< form::XBoundComponent > xBound(xModel, UNO_QUERY); - if(xBound.is()) - xBound->commit(); + if (xRowSet->isLast()) + { + uno::Reference<sdbc::XResultSetUpdate> xUpdateCursor(xRowSet, UNO_QUERY); + if (xUpdateCursor.is()) + xUpdateCursor->moveToInsertRow(); + } + else + (void)xRowSet->next(); } + xIdentifierED->grab_focus(); + xIdentifierED->select_region(0, -1); + GainFocusHdl(*xIdentifierED); + return true; } -void BibGeneralPage::AddControlWithError( const OUString& rColumnName, FixedText &rLabel, - OUString& rErrorString, std::string_view sHelpId, sal_uInt16 nIndexInFTArray, std::vector<vcl::Window*> &rChildren) +BibGeneralPage::~BibGeneralPage() { - const OUString aColumnUIName(rLabel.GetText()); - // adds also the XControl and creates a map entry in nFT2CtrlMap[] for mapping between control and FT + disposeOnce(); +} - sal_Int16 nIndex = -1; - bool bSuccess = AddXControl(rColumnName, rLabel, sHelpId, nIndex, rChildren); - if (bSuccess) +class ChangeListener : public cppu::WeakImplHelper<css::beans::XPropertyChangeListener> +{ +public: + explicit ChangeListener(css::uno::Reference<css::beans::XPropertySet> xPropSet) + : m_xPropSet(std::move(xPropSet)) + , m_bSelfChanging(false) { - DBG_ASSERT( nIndexInFTArray < FIELD_COUNT, "*BibGeneralPage::AddControlWithError(): wrong array index!" ); - DBG_ASSERT( nFT2CtrlMap[ nIndexInFTArray ] < 0, "+BibGeneralPage::AddControlWithError(): index already in use!" ); - - nFT2CtrlMap[ nIndexInFTArray ] = nIndex; } - else + + virtual void SAL_CALL disposing(lang::EventObject const &) override { - if( !rErrorString.isEmpty() ) - rErrorString += "\n"; + } - rErrorString += MnemonicGenerator::EraseAllMnemonicChars( aColumnUIName ); + virtual void start() = 0; + virtual void stop() + { + WriteBack(); } -} -bool BibGeneralPage::AddXControl( - const OUString& rName, - FixedText& rLabel, std::string_view sHelpId, sal_Int16& rIndex, - std::vector<vcl::Window*>& rChildren) + virtual void WriteBack() = 0; + +protected: + css::uno::Reference<css::beans::XPropertySet> m_xPropSet; + bool m_bSelfChanging; +}; + +namespace { - uno::Reference< awt::XControlModel > xCtrModel; - try + class EntryChangeListener : public ChangeListener { - const bool bTypeListBox = sTypeColumnName == rName; - xCtrModel = pDatMan->loadControlModel(rName, bTypeListBox); - if ( xCtrModel.is() ) + public: + explicit EntryChangeListener(weld::Entry& rEntry, const css::uno::Reference<css::beans::XPropertySet>& rPropSet, + BibGeneralPage& rPage) + : ChangeListener(rPropSet) + , m_rEntry(rEntry) + , m_rPage(rPage) { - uno::Reference< beans::XPropertySet > xPropSet( xCtrModel, UNO_QUERY ); + rEntry.connect_focus_out(LINK(this, EntryChangeListener, LoseFocusHdl)); + setValue(rPropSet->getPropertyValue("Text")); + } - if( xPropSet.is()) - { - uno::Reference< beans::XPropertySetInfo > xPropInfo = xPropSet->getPropertySetInfo(); + virtual void SAL_CALL propertyChange(const css::beans::PropertyChangeEvent& evt) override + { + if (m_bSelfChanging) + return; + setValue(evt.NewValue); + } + + virtual void start() override + { + m_xPropSet->addPropertyChangeListener("Text", this); + } + + virtual void stop() override + { + m_xPropSet->removePropertyChangeListener("Text", this); + ChangeListener::stop(); + } - OUString aControlName; - if (bTypeListBox) + private: + weld::Entry& m_rEntry; + BibGeneralPage& m_rPage; + + DECL_LINK(LoseFocusHdl, weld::Widget&, void); + + /// Updates the UI widget(s) based on rValue. + void setValue(const css::uno::Any& rValue) + { + OUString sNewName; + rValue >>= sNewName; + if (&m_rEntry == &m_rPage.GetLocalURLED()) + { + OUString aUrl; + int nPageNumber; + if (SplitUrlAndPage(sNewName, aUrl, nPageNumber)) { - aControlName = "com.sun.star.form.control.ListBox"; - xLBModel.set(xCtrModel, UNO_QUERY); + m_rEntry.set_text(aUrl); + m_rPage.GetLocalPageCB().set_active(true); + m_rPage.GetLocalPageSB().set_sensitive(true); + m_rPage.GetLocalPageSB().set_value(nPageNumber); } else { - uno::Any aAny = xPropSet->getPropertyValue( "DefaultControl" ); - aAny >>= aControlName; - } - - OUString uProp("HelpURL"); - if(xPropInfo->hasPropertyByName(uProp)) - { - OUString sId( INET_HID_SCHEME ); - DBG_ASSERT( INetURLObject( OStringToOUString( sHelpId, RTL_TEXTENCODING_UTF8 ) ).GetProtocol() == INetProtocol::NotValid, "Wrong HelpId!" ); - sId += OStringToOUString( sHelpId, RTL_TEXTENCODING_UTF8 ); - xPropSet->setPropertyValue( uProp, makeAny( sId ) ); + m_rEntry.set_text(sNewName); + m_rPage.GetLocalPageCB().set_active(false); + m_rPage.GetLocalPageSB().set_sensitive(false); + m_rPage.GetLocalPageSB().set_value(0); } + } + else + { + m_rEntry.set_text(sNewName); + } - uno::Reference< XComponentContext > xContext = comphelper::getProcessComponentContext(); - uno::Reference< awt::XControl > xControl( xContext->getServiceManager()->createInstanceWithContext(aControlName, xContext), UNO_QUERY); - if ( xControl.is() ) - { - xControl->setModel( xCtrModel); - - // Peer as Child to the FrameWindow - xCtrlContnr->addControl(rName, xControl); - uno::Reference< awt::XWindow > xCtrWin(xControl, UNO_QUERY ); - xCtrWin->addFocusListener( mxBibGeneralPageFocusListener.get() ); - rIndex = -1; // -> implies, that not found - for(sal_uInt16 i = 0; i < FIELD_COUNT; i++) - if(!aControls[i].is()) - { - aControls[i] = xCtrWin; - rIndex = sal_Int16( i ); - break; - } - // initially switch on the design mode - switch it off _after_ loading the form - xCtrWin->setVisible( true ); - xControl->setDesignMode( true ); - - VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(xControl->getPeer()); - pWindow->set_grid_top_attach(rLabel.get_grid_top_attach()); - pWindow->set_grid_left_attach(rLabel.get_grid_left_attach()+1); - pWindow->set_valign(VclAlign::Center); - rLabel.set_mnemonic_widget(pWindow); - if (&rLabel == pTitleFT) - pWindow->set_grid_width(3); - else - pWindow->set_hexpand(true); - rChildren.push_back(&rLabel); - rChildren.push_back(pWindow); - } + m_rEntry.save_value(); + if (&m_rEntry == &m_rPage.GetLocalURLED()) + { + m_rPage.GetLocalPageSB().save_value(); } } - } - catch(const Exception&) - { - OSL_FAIL("BibGeneralPage::AddXControl: something went wrong!"); - } - return xCtrModel.is(); -} -void BibGeneralPage::InitFixedTexts() -{ - aFixedTexts[0] = pIdentifierFT; - aFixedTexts[1] = pAuthTypeFT; - aFixedTexts[2] = pYearFT; - aFixedTexts[3] = pAuthorFT; - aFixedTexts[4] = pTitleFT; - aFixedTexts[5] = pPublisherFT; - aFixedTexts[6] = pAddressFT; - aFixedTexts[7] = pISBNFT; - aFixedTexts[8] = pChapterFT; - aFixedTexts[9] = pPagesFT; - - aFixedTexts[10] = pEditorFT; - aFixedTexts[11] = pEditionFT; - aFixedTexts[12] = pBooktitleFT; - aFixedTexts[13] = pVolumeFT; - aFixedTexts[14] = pHowpublishedFT; - aFixedTexts[15] = pOrganizationsFT; - aFixedTexts[16] = pInstitutionFT; - aFixedTexts[17] = pSchoolFT; - aFixedTexts[18] = pReportTypeFT; - aFixedTexts[19] = pMonthFT; - - aFixedTexts[20] = pJournalFT; - aFixedTexts[21] = pNumberFT; - aFixedTexts[22] = pSeriesFT; - aFixedTexts[23] = pAnnoteFT; - aFixedTexts[24] = pNoteFT; - aFixedTexts[25] = pURLFT; - - aFixedTexts[26] = pCustom1FT; - aFixedTexts[27] = pCustom2FT; - aFixedTexts[28] = pCustom3FT; - aFixedTexts[29] = pCustom4FT; - aFixedTexts[30] = pCustom5FT; - - int i; - - MnemonicGenerator aMnemonicGenerator; - - OUString aFixedStrings[ FIELD_COUNT ]; - for( i = 0 ; i < FIELD_COUNT ; ++i ) - aFixedStrings[i] = aFixedTexts[i]->GetText(); - - // init mnemonics, first register all strings - for( i = 0 ; i < FIELD_COUNT ; ++i ) - aMnemonicGenerator.RegisterMnemonic( aFixedStrings[ i ] ); - - // ... then get all strings - for( i = 0 ; i < FIELD_COUNT ; ++i ) - aFixedStrings[i] = aMnemonicGenerator.CreateMnemonic(aFixedStrings[i]); - - // set texts - for( i = 0 ; i < FIELD_COUNT ; ++i ) - aFixedTexts[ i ]->SetText( aFixedStrings[ i ] ); -} + /// Updates m_xPropSet based on the UI widget(s). + virtual void WriteBack() override + { + bool bLocalURL = &m_rEntry == &m_rPage.GetLocalURLED() + && m_rPage.GetLocalPageSB().get_value_changed_from_saved(); + if (!m_rEntry.get_value_changed_from_saved() && !bLocalURL) + return; -void BibGeneralPage::focusGained(const awt::FocusEvent& rEvent) -{ - Reference<awt::XWindow> xCtrWin(rEvent.Source, UNO_QUERY ); - if(!xCtrWin.is()) - return; + m_bSelfChanging = true; + + OUString aText; + if (&m_rEntry == &m_rPage.GetLocalURLED()) + { + aText = MergeUrlAndPage(m_rEntry.get_text(), m_rPage.GetLocalPageSB()); + } + else + { + aText = m_rEntry.get_text(); + } + m_xPropSet->setPropertyValue("Text", Any(aText)); + + css::uno::Reference<css::form::XBoundComponent> xBound(m_xPropSet, css::uno::UNO_QUERY); + if (xBound.is()) + xBound->commit(); + + m_bSelfChanging = false; + m_rEntry.save_value(); + if (&m_rEntry == &m_rPage.GetLocalURLED()) + { + m_rPage.GetLocalPageSB().save_value(); + } + } + + }; - ::Size aOutSize = pScrolledWindow->getVisibleChildSize(); - awt::Rectangle aRect = xCtrWin->getPosSize(); - Point aOffset(pGrid->GetPosPixel()); - tools::Long nX = aRect.X + aOffset.X(); - if (nX < 0 || nX > aOutSize.Width()) + IMPL_LINK_NOARG(EntryChangeListener, LoseFocusHdl, weld::Widget&, void) { - pScrolledWindow->getHorzScrollBar().DoScroll(aRect.X); + WriteBack(); } - tools::Long nY = aRect.Y + aOffset.Y(); - if (nY < 0 || nY > aOutSize.Height()) + class ComboBoxChangeListener : public ChangeListener { - pScrolledWindow->getVertScrollBar().DoScroll(aRect.Y); - } -} + public: + explicit ComboBoxChangeListener(weld::ComboBox& rComboBox, const css::uno::Reference<css::beans::XPropertySet>& rPropSet) + : ChangeListener(rPropSet) + , m_rComboBox(rComboBox) + { + rComboBox.connect_changed(LINK(this, ComboBoxChangeListener, ChangeHdl)); + setValue(rPropSet->getPropertyValue("SelectedItems")); + } -void BibGeneralPage::focusLost() -{ - CommitActiveControl(); -} + virtual void SAL_CALL propertyChange(const css::beans::PropertyChangeEvent& evt) override + { + if (m_bSelfChanging) + return; + setValue(evt.NewValue); + } -void BibGeneralPage::GetFocus() -{ - Reference< awt::XWindow >* pxControl = aControls; + virtual void start() override + { + m_xPropSet->addPropertyChangeListener("SelectedItems", this); + } - for( int i = FIELD_COUNT ; i ; --i, ++pxControl ) - { - if( pxControl->is() ) + virtual void stop() override { - ( *pxControl )->setFocus(); - return; + m_xPropSet->removePropertyChangeListener("SelectedItems", this); + ChangeListener::stop(); } - } - // fallback - GrabFocus(); -} + private: + weld::ComboBox& m_rComboBox; -bool BibGeneralPage::HandleShortCutKey( const KeyEvent& rKeyEvent ) -{ - DBG_ASSERT( KEY_MOD2 == rKeyEvent.GetKeyCode().GetModifier(), "+BibGeneralPage::HandleShortCutKey(): this is not for me!" ); + DECL_LINK(ChangeHdl, weld::ComboBox&, void); + + void setValue(const css::uno::Any& rValue) + { + sal_Int16 nSelection = -1; + Sequence<sal_Int16> aSelection; + rValue >>= aSelection; + if (aSelection.hasElements()) + nSelection = aSelection[0]; + + m_rComboBox.set_active(nSelection); + m_rComboBox.save_value(); + } - const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper(); - const sal_Unicode c = rKeyEvent.GetCharCode(); - bool bHandled = false; + virtual void WriteBack() override + { + if (!m_rComboBox.get_value_changed_from_saved()) + return; + m_bSelfChanging = true; - sal_Int16 i; + Sequence<sal_Int16> aSelection{ o3tl::narrowing<sal_Int16>(m_rComboBox.get_active()) }; + m_xPropSet->setPropertyValue("SelectedItems", Any(aSelection)); - std::vector<sal_Int16>::size_type nFocused = 0xFFFF; // index of focused in vector, no one focused initial - DBG_ASSERT( nFocused > 0, "*BibGeneralPage::HandleShortCutKey(): size_type works not as expected!" ); + css::uno::Reference<css::form::XBoundComponent> xBound(m_xPropSet, css::uno::UNO_QUERY); + if (xBound.is()) + xBound->commit(); - std::vector<sal_Int16> aMatchList; + m_bSelfChanging = false; + m_rComboBox.save_value(); + } + }; - for( i = 0 ; i < FIELD_COUNT ; ++i ) + IMPL_LINK_NOARG(ComboBoxChangeListener, ChangeHdl, weld::ComboBox&, void) { - if( rI18nHelper.MatchMnemonic( aFixedTexts[ i ]->GetText(), c ) ) - { - bHandled = true; - sal_Int16 nCtrlIndex = nFT2CtrlMap[ i ]; + WriteBack(); + } +} + +void BibGeneralPage::dispose() +{ + for (auto& listener : maChangeListeners) + listener->stop(); + maChangeListeners.clear(); + + SaveChanges(); + + xScrolledWindow.reset(); + xGrid.reset(); + xIdentifierFT.reset(); + xIdentifierED.reset(); + xAuthTypeFT.reset(); + xAuthTypeLB.reset(); + xYearFT.reset(); + xYearED.reset(); + xAuthorFT.reset(); + xAuthorED.reset(); + xTitleFT.reset(); + xTitleED.reset(); + xPublisherFT.reset(); + xPublisherED.reset(); + xAddressFT.reset(); + xAddressED.reset(); + xISBNFT.reset(); + xISBNED.reset(); + xChapterFT.reset(); + xChapterED.reset(); + xPagesFT.reset(); + xPagesED.reset(); + xEditorFT.reset(); + xEditorED.reset(); + xEditionFT.reset(); + xEditionED.reset(); + xBooktitleFT.reset(); + xBooktitleED.reset(); + xVolumeFT.reset(); + xVolumeED.reset(); + xHowpublishedFT.reset(); + xHowpublishedED.reset(); + xOrganizationsFT.reset(); + xOrganizationsED.reset(); + xInstitutionFT.reset(); + xInstitutionED.reset(); + xSchoolFT.reset(); + xSchoolED.reset(); + xReportTypeFT.reset(); + xReportTypeED.reset(); + xMonthFT.reset(); + xMonthED.reset(); + xJournalFT.reset(); + xJournalED.reset(); + xNumberFT.reset(); + xNumberED.reset(); + xSeriesFT.reset(); + xSeriesED.reset(); + xAnnoteFT.reset(); + xAnnoteED.reset(); + xNoteFT.reset(); + xNoteED.reset(); + xURLFT.reset(); + xURLED.reset(); + xCustom1FT.reset(); + xCustom1ED.reset(); + xCustom2FT.reset(); + xCustom2ED.reset(); + xCustom3FT.reset(); + xCustom3ED.reset(); + xCustom4FT.reset(); + xCustom4ED.reset(); + xCustom5FT.reset(); + xCustom5ED.reset(); + m_xLocalURLFT.reset(); + m_xLocalURLED.reset(); + m_xLocalBrowseButton.reset(); + m_xLocalPageCB.reset(); + m_xLocalPageSB.reset(); + InterimItemWindow::dispose(); +} - if( nCtrlIndex >= 0 ) - { // store index of control - DBG_ASSERT( aControls[ nCtrlIndex ].is(), "-BibGeneralPage::HandleShortCutKey(): valid index and no control?" ); +weld::Entry& BibGeneralPage::GetLocalURLED() { return *m_xLocalURLED; } - uno::Reference< awt::XControl > xControl( aControls[ nCtrlIndex ], UNO_QUERY ); - DBG_ASSERT( xControl.is(), "-BibGeneralPage::HandleShortCutKey(): a control which is not a control!" ); +weld::CheckButton& BibGeneralPage::GetLocalPageCB() { return *m_xLocalPageCB; } - VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow( xControl->getPeer() ); +weld::SpinButton& BibGeneralPage::GetLocalPageSB() { return *m_xLocalPageSB; } - if( pWindow ) +bool BibGeneralPage::AddXControl(const OUString& rName, weld::Entry& rEntry) +{ + uno::Reference< awt::XControlModel > xCtrModel; + try + { + xCtrModel = pDatMan->loadControlModel(rName, false); + if ( xCtrModel.is() ) + { + uno::Reference< beans::XPropertySet > xPropSet( xCtrModel, UNO_QUERY ); + + if( xPropSet.is()) + { + maChangeListeners.emplace_back(new EntryChangeListener(rEntry, xPropSet, *this)); + maChangeListeners.back()->start(); + if (&rEntry == m_xLocalURLED.get()) { - aMatchList.push_back( nCtrlIndex ); - if( pWindow->HasChildPathFocus() ) - { // save focused control - DBG_ASSERT( nFocused == 0xFFFF, "+BibGeneralPage::HandleShortCutKey(): more than one with focus?!" ); - DBG_ASSERT( !aMatchList.empty(), "+BibGeneralPage::HandleShortCutKey(): push_back and no content?!" ); - nFocused = aMatchList.size() - 1; - } + m_aURLListener = maChangeListeners.back(); + m_xLocalPageSB->connect_focus_out(LINK(this, BibGeneralPage, LosePageFocusHdl)); } } } } - - if( bHandled ) + catch(const Exception&) { - DBG_ASSERT( !aMatchList.empty(), "*BibGeneralPage::HandleShortCutKey(): be prepared to crash..." ); - - if( nFocused >= ( aMatchList.size() - 1 ) ) - // >=... includes 0xFFFF - // no one or last focused, take first - nFocused = 0; - else - // take next one - nFocused++; - - aControls[ aMatchList[ nFocused ] ]->setFocus(); + OSL_FAIL("BibGeneralPage::AddXControl: something went wrong!"); } - - return bHandled; + return xCtrModel.is(); } -BibGeneralPageFocusListener::BibGeneralPageFocusListener(BibGeneralPage *pBibGeneralPage): mpBibGeneralPage(pBibGeneralPage) -{} +IMPL_LINK_NOARG(BibGeneralPage, LosePageFocusHdl, weld::Widget&, void) +{ + m_aURLListener->WriteBack(); +} -void BibGeneralPageFocusListener::focusGained( const css::awt::FocusEvent& e ) +IMPL_LINK(BibGeneralPage, GainFocusHdl, weld::Widget&, rWidget, void) { - mpBibGeneralPage->focusGained(e); + int x, y, width, height; + if (!rWidget.get_extents_relative_to(*xGrid, x, y, width, height)) + return; + + int bottom = y + height; + int nVScrollPos = xScrolledWindow->vadjustment_get_value(); + if (y < nVScrollPos || bottom > nVScrollPos + xScrolledWindow->vadjustment_get_page_size()) + xScrolledWindow->vadjustment_set_value(y); + + int right = x + width; + int nHScrollPos = xScrolledWindow->hadjustment_get_value(); + if (x < nHScrollPos || right > nHScrollPos + xScrolledWindow->hadjustment_get_page_size()) + xScrolledWindow->hadjustment_set_value(x); } -void BibGeneralPageFocusListener::focusLost( const css::awt::FocusEvent& ) +template<class Target> void BibGeneralPage::AddControlWithError(const OUString& rColumnName, const OUString& rColumnUIName, + Target& rWidget, OUString& rErrorString, const OUString& rHelpId) { - mpBibGeneralPage->focusLost(); + rWidget.set_help_id(rHelpId); + rWidget.connect_focus_in(LINK(this, BibGeneralPage, GainFocusHdl)); + bool bSuccess = AddXControl(rColumnName, rWidget); + if (!bSuccess) + { + if( !rErrorString.isEmpty() ) + rErrorString += "\n"; + + rErrorString += MnemonicGenerator::EraseAllMnemonicChars(rColumnUIName); + } } -void BibGeneralPageFocusListener::disposing( const css::lang::EventObject& ) -{} +bool BibGeneralPage::AddXControl(const OUString& rName, weld::ComboBox& rList) +{ + uno::Reference< awt::XControlModel > xCtrModel; + try + { + xCtrModel = pDatMan->loadControlModel(rName, true); + if ( xCtrModel.is() ) + { + uno::Reference< beans::XPropertySet > xPropSet( xCtrModel, UNO_QUERY ); + + if( xPropSet.is()) + { + css::uno::Sequence<OUString> aEntries; + xPropSet->getPropertyValue("StringItemList") >>= aEntries; + for (const OUString& rString : aEntries) + rList.append_text(rString); + + sal_Int16 nSelection = -1; + Sequence<sal_Int16> aSelection; + xPropSet->getPropertyValue("SelectedItems") >>= aSelection; + if (aSelection.hasElements()) + nSelection = aSelection[0]; + + rList.set_active(nSelection); + rList.save_value(); + + maChangeListeners.emplace_back(new ComboBoxChangeListener(rList, xPropSet)); + maChangeListeners.back()->start(); + } + } + } + catch(const Exception&) + { + OSL_FAIL("BibGeneralPage::AddXControl: something went wrong!"); + } + return xCtrModel.is(); +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |