summaryrefslogtreecommitdiff
path: root/extensions/source/bibliography/general.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/bibliography/general.cxx')
-rw-r--r--extensions/source/bibliography/general.cxx1211
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: */