summaryrefslogtreecommitdiffstats
path: root/extensions/source/bibliography/general.cxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--extensions/source/bibliography/general.cxx707
1 files changed, 707 insertions, 0 deletions
diff --git a/extensions/source/bibliography/general.cxx b/extensions/source/bibliography/general.cxx
new file mode 100644
index 000000000..c1963ae32
--- /dev/null
+++ b/extensions/source/bibliography/general.cxx
@@ -0,0 +1,707 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <comphelper/processfactory.hxx>
+#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 <cppuhelper/implbase.hxx>
+#include <vcl/builder.hxx>
+#include <vcl/scrbar.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/fixed.hxx>
+#include "general.hxx"
+#include "bibresid.hxx"
+#include "datman.hxx"
+#include "bibconfig.hxx"
+#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>
+
+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 )
+{
+ 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>
+{
+ 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;
+
+};
+
+}
+
+BibPosListener::BibPosListener(BibGeneralPage* pParent) :
+ pParentPage(pParent)
+{
+}
+
+void BibPosListener::cursorMoved(const lang::EventObject& /*aEvent*/)
+{
+ 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);
+ }
+ }
+ }
+ catch(const Exception&)
+ {
+ OSL_FAIL("BibPosListener::cursorMoved: something went wrong !");
+ }
+}
+
+void BibPosListener::disposing(const lang::EventObject& /*Source*/)
+{
+}
+
+BibGeneralPage::BibGeneralPage(vcl::Window* pParent, BibDataManager* pMan):
+ TabPage(pParent, "GeneralPage", "modules/sbibliography/ui/generalpage.ui"),
+ BibShortCutHandler( this ),
+ mxBibGeneralPageFocusListener(new BibGeneralPageFocusListener(this)),
+ pDatMan(pMan)
+{
+ 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;
+ }
+
+ BibConfig* pBibConfig = BibModul::GetConfig();
+ BibDBDescriptor aDesc;
+ aDesc.sDataSource = pDatMan->getActiveDataSource();
+ aDesc.sTableOrQuery = pDatMan->getActiveDataTable();
+ aDesc.nCommandType = CommandType::TABLE;
+ const Mapping* pMapping = pBibConfig->GetMapping(aDesc);
+
+ xCtrlContnr = VCLUnoHelper::CreateControlContainer(pGrid);
+
+ std::vector<vcl::Window*> aChildren;
+
+ AddControlWithError(lcl_GetColumnName(pMapping, IDENTIFIER_POS), *pIdentifierFT,
+ sTableErrorString,
+ HID_BIB_IDENTIFIER_POS, 0, aChildren);
+
+ sTypeColumnName = lcl_GetColumnName(pMapping, AUTHORITYTYPE_POS);
+
+ AddControlWithError(sTypeColumnName, *pAuthTypeFT, sTableErrorString,
+ HID_BIB_AUTHORITYTYPE_POS, 1, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, YEAR_POS), *pYearFT,
+ sTableErrorString, HID_BIB_YEAR_POS, 2, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, AUTHOR_POS), *pAuthorFT,
+ sTableErrorString, HID_BIB_AUTHOR_POS, 3, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, TITLE_POS), *pTitleFT, sTableErrorString,
+ HID_BIB_TITLE_POS, 4, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, PUBLISHER_POS), *pPublisherFT,
+ sTableErrorString, HID_BIB_PUBLISHER_POS, 5, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, ADDRESS_POS), *pAddressFT,
+ sTableErrorString, HID_BIB_ADDRESS_POS, 6, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, ISBN_POS), *pISBNFT,
+ sTableErrorString, HID_BIB_ISBN_POS, 7, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, CHAPTER_POS), *pChapterFT,
+ sTableErrorString, HID_BIB_CHAPTER_POS, 8, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, PAGES_POS), *pPagesFT,
+ sTableErrorString, HID_BIB_PAGES_POS, 9, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, EDITOR_POS), *pEditorFT,
+ sTableErrorString, HID_BIB_EDITOR_POS, 10, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, EDITION_POS), *pEditionFT,
+ sTableErrorString, HID_BIB_EDITION_POS, 11, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, BOOKTITLE_POS), *pBooktitleFT,
+ sTableErrorString, HID_BIB_BOOKTITLE_POS, 12, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, VOLUME_POS), *pVolumeFT,
+ sTableErrorString, HID_BIB_VOLUME_POS, 13, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, HOWPUBLISHED_POS), *pHowpublishedFT,
+ sTableErrorString, HID_BIB_HOWPUBLISHED_POS, 14, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, ORGANIZATIONS_POS), *pOrganizationsFT,
+ sTableErrorString, HID_BIB_ORGANIZATIONS_POS, 15, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, INSTITUTION_POS), *pInstitutionFT,
+ sTableErrorString, HID_BIB_INSTITUTION_POS, 16, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, SCHOOL_POS), *pSchoolFT,
+ sTableErrorString, HID_BIB_SCHOOL_POS, 17, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, REPORTTYPE_POS), *pReportTypeFT,
+ sTableErrorString, HID_BIB_REPORTTYPE_POS, 18, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, MONTH_POS), *pMonthFT,
+ sTableErrorString, HID_BIB_MONTH_POS, 19, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, JOURNAL_POS), *pJournalFT,
+ sTableErrorString, HID_BIB_JOURNAL_POS, 20, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, NUMBER_POS), *pNumberFT,
+ sTableErrorString, HID_BIB_NUMBER_POS, 21, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, SERIES_POS), *pSeriesFT,
+ sTableErrorString, HID_BIB_SERIES_POS, 22, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, ANNOTE_POS), *pAnnoteFT,
+ sTableErrorString, HID_BIB_ANNOTE_POS, 23, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, NOTE_POS),*pNoteFT,
+ sTableErrorString, HID_BIB_NOTE_POS, 24, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, URL_POS), *pURLFT,
+ sTableErrorString, HID_BIB_URL_POS, 25, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM1_POS), *pCustom1FT,
+ sTableErrorString, HID_BIB_CUSTOM1_POS, 26, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM2_POS), *pCustom2FT,
+ sTableErrorString, HID_BIB_CUSTOM2_POS, 27, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM3_POS), *pCustom3FT,
+ sTableErrorString, HID_BIB_CUSTOM3_POS, 28, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM4_POS), *pCustom4FT,
+ sTableErrorString, HID_BIB_CUSTOM4_POS, 29, aChildren);
+
+ AddControlWithError(lcl_GetColumnName(pMapping, CUSTOM5_POS), *pCustom5FT,
+ sTableErrorString, HID_BIB_CUSTOM5_POS, 30, aChildren);
+
+ BuilderUtils::reorderWithinParent(aChildren, false);
+
+ 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();
+
+ if(!sTableErrorString.isEmpty())
+ sTableErrorString = BibResId(ST_ERROR_PREFIX) + sTableErrorString;
+
+ SetText(BibResId(ST_TYPE_TITLE));
+
+ Size aSize(LogicToPixel(Size(0, 209), MapMode(MapUnit::MapAppFont)));
+ set_height_request(aSize.Height());
+}
+
+BibGeneralPage::~BibGeneralPage()
+{
+ disposeOnce();
+}
+
+void BibGeneralPage::dispose()
+{
+ if (pDatMan && xPosListener.is())
+ {
+ uno::Reference< sdbc::XRowSet > xRowSet(pDatMan->getForm(), UNO_QUERY);
+ if(xRowSet.is())
+ xRowSet->removeRowSetListener(xPosListener);
+ }
+ 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();
+ TabPage::dispose();
+}
+
+void BibGeneralPage::RemoveListeners()
+{
+ for(uno::Reference<awt::XWindow> & aControl : aControls)
+ {
+ if(aControl.is())
+ {
+ aControl->removeFocusListener( mxBibGeneralPageFocusListener.get() );
+ aControl = nullptr;
+ }
+ }
+}
+
+void BibGeneralPage::CommitActiveControl()
+{
+ uno::Reference< form::runtime::XFormController > xFormCtrl = pDatMan->GetFormController();
+ uno::Reference< awt::XControl > xCurr = xFormCtrl->getCurrentControl();
+ if(xCurr.is())
+ {
+ uno::Reference< awt::XControlModel > xModel = xCurr->getModel();
+ uno::Reference< form::XBoundComponent > xBound(xModel, UNO_QUERY);
+ if(xBound.is())
+ xBound->commit();
+ }
+}
+
+void BibGeneralPage::AddControlWithError( const OUString& rColumnName, FixedText &rLabel,
+ OUString& rErrorString, const OString& sHelpId, sal_uInt16 nIndexInFTArray, std::vector<vcl::Window*> &rChildren)
+{
+ const OUString aColumnUIName(rLabel.GetText());
+ // adds also the XControl and creates a map entry in nFT2CtrlMap[] for mapping between control and FT
+
+ sal_Int16 nIndex = -1;
+ bool bSuccess = AddXControl(rColumnName, rLabel, sHelpId, nIndex, rChildren);
+ if (bSuccess)
+ {
+ 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
+ {
+ if( !rErrorString.isEmpty() )
+ rErrorString += "\n";
+
+ rErrorString += MnemonicGenerator::EraseAllMnemonicChars( aColumnUIName );
+ }
+}
+
+bool BibGeneralPage::AddXControl(
+ const OUString& rName,
+ FixedText& rLabel, const OString& sHelpId, sal_Int16& rIndex,
+ std::vector<vcl::Window*>& rChildren)
+{
+ uno::Reference< awt::XControlModel > xCtrModel;
+ try
+ {
+ const bool bTypeListBox = sTypeColumnName == rName;
+ xCtrModel = pDatMan->loadControlModel(rName, bTypeListBox);
+ if ( xCtrModel.is() )
+ {
+ uno::Reference< beans::XPropertySet > xPropSet( xCtrModel, UNO_QUERY );
+
+ if( xPropSet.is())
+ {
+ uno::Reference< beans::XPropertySetInfo > xPropInfo = xPropSet->getPropertySetInfo();
+
+ OUString aControlName;
+ if (bTypeListBox)
+ {
+ aControlName = "com.sun.star.form.control.ListBox";
+ xLBModel.set(xCtrModel, UNO_QUERY);
+ }
+ 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 ) );
+ }
+
+ 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);
+ }
+ }
+ }
+ }
+ 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 )
+ aMnemonicGenerator.CreateMnemonic( aFixedStrings[ i ] );
+
+ // set texts
+ for( i = 0 ; i < FIELD_COUNT ; ++i )
+ aFixedTexts[ i ]->SetText( aFixedStrings[ i ] );
+}
+
+void BibGeneralPage::focusGained(const awt::FocusEvent& rEvent)
+{
+ Reference<awt::XWindow> xCtrWin(rEvent.Source, UNO_QUERY );
+ if(!xCtrWin.is())
+ return;
+
+ ::Size aOutSize = pScrolledWindow->getVisibleChildSize();
+ awt::Rectangle aRect = xCtrWin->getPosSize();
+ Point aOffset(pGrid->GetPosPixel());
+ long nX = aRect.X + aOffset.X();
+ if (nX < 0 || nX > aOutSize.Width())
+ {
+ pScrolledWindow->getHorzScrollBar().DoScroll(aRect.X);
+ }
+
+ long nY = aRect.Y + aOffset.Y();
+ if (nY < 0 || nY > aOutSize.Height())
+ {
+ pScrolledWindow->getVertScrollBar().DoScroll(aRect.Y);
+ }
+}
+
+void BibGeneralPage::focusLost()
+{
+ CommitActiveControl();
+}
+
+void BibGeneralPage::GetFocus()
+{
+ Reference< awt::XWindow >* pxControl = aControls;
+
+ for( int i = FIELD_COUNT ; i ; --i, ++pxControl )
+ {
+ if( pxControl->is() )
+ {
+ ( *pxControl )->setFocus();
+ return;
+ }
+ }
+
+ // fallback
+ GrabFocus();
+}
+
+bool BibGeneralPage::HandleShortCutKey( const KeyEvent& rKeyEvent )
+{
+ DBG_ASSERT( KEY_MOD2 == rKeyEvent.GetKeyCode().GetModifier(), "+BibGeneralPage::HandleShortCutKey(): this is not for me!" );
+
+ const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper();
+ const sal_Unicode c = rKeyEvent.GetCharCode();
+ bool bHandled = false;
+
+ sal_Int16 i;
+
+ 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!" );
+
+ std::vector<sal_Int16> aMatchList;
+
+ for( i = 0 ; i < FIELD_COUNT ; ++i )
+ {
+ if( rI18nHelper.MatchMnemonic( aFixedTexts[ i ]->GetText(), c ) )
+ {
+ bHandled = true;
+ sal_Int16 nCtrlIndex = nFT2CtrlMap[ i ];
+
+ if( nCtrlIndex >= 0 )
+ { // store index of control
+ DBG_ASSERT( aControls[ nCtrlIndex ].is(), "-BibGeneralPage::HandleShortCutKey(): valid index and no control?" );
+
+ uno::Reference< awt::XControl > xControl( aControls[ nCtrlIndex ], UNO_QUERY );
+ DBG_ASSERT( xControl.is(), "-BibGeneralPage::HandleShortCutKey(): a control which is not a control!" );
+
+ VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow( xControl->getPeer() );
+
+ if( pWindow )
+ {
+ 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;
+ }
+ }
+ }
+ }
+ }
+
+ if( bHandled )
+ {
+ 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();
+ }
+
+ return bHandled;
+}
+
+BibGeneralPageFocusListener::BibGeneralPageFocusListener(BibGeneralPage *pBibGeneralPage): mpBibGeneralPage(pBibGeneralPage)
+{}
+
+void BibGeneralPageFocusListener::focusGained( const css::awt::FocusEvent& e )
+{
+ mpBibGeneralPage->focusGained(e);
+}
+
+void BibGeneralPageFocusListener::focusLost( const css::awt::FocusEvent& )
+{
+ mpBibGeneralPage->focusLost();
+}
+
+void BibGeneralPageFocusListener::disposing( const css::lang::EventObject& )
+{}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */