/* -*- 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 .
*/
short OControlWizard::run()
{ // get the class id of the control we're dealing with
sal_Int16 nClassId = FormComponentType::CONTROL; try
{
getContext().xObjectModel->getPropertyValue(u"ClassId"_ustr) >>= nClassId;
} catch(const Exception&)
{
OSL_FAIL("OControlWizard::activate: could not obtain the class id!");
} if (!approveControl(nClassId))
{ // TODO: MessageBox or exception return RET_CANCEL;
}
// for comparing the model
Reference< XControlModel > xModelCompare(m_aContext.xObjectModel, UNO_QUERY);
if (!xPageObjects.is()) return;
// loop through all objects of the page
sal_Int32 nObjects = xPageObjects->getCount();
Reference< XControlShape > xControlShape;
Reference< XControlModel > xControlModel; for (sal_Int32 i=0; i<nObjects; ++i)
{ if (xPageObjects->getByIndex(i) >>= xControlShape)
{ // it _is_ a control shape
xControlModel = xControlShape->getControl();
DBG_ASSERT(xControlModel.is(), "OControlWizard::implDetermineShape: control shape without model!"); if (xModelCompare.get() == xControlModel.get())
{
m_aContext.xObjectShape = xControlShape; break;
}
}
}
}
m_aContext.xForm.set(xControlParent, UNO_QUERY);
m_aContext.xRowSet.set(xControlParent, UNO_QUERY);
DBG_ASSERT(m_aContext.xForm.is() && m_aContext.xRowSet.is(), "OControlWizard::implDetermineForm: missing some interfaces of the control parent!");
}
void OControlWizard::implDeterminePage()
{ try
{ // get the document model
Reference< XChild > xControlAsChild(m_aContext.xObjectModel, UNO_QUERY);
Reference< XChild > xModelSearch(xControlAsChild->getParent(), UNO_QUERY);
Reference< XDrawPage > xPage; if (xModel.is())
{
m_aContext.xDocumentModel = xModel;
Reference< XDrawPageSupplier > xPageSupp(xModel, UNO_QUERY); if (xPageSupp.is())
{ // it's a document with only one page -> Writer
xPage = xPageSupp->getDrawPage();
} else
{ // get the controller currently working on this model
Reference< XController > xController = xModel->getCurrentController();
DBG_ASSERT(xController.is(), "OControlWizard::implDeterminePage: no current controller!");
// maybe it's a spreadsheet
Reference< XSpreadsheetView > xView(xController, UNO_QUERY); if (xView.is())
{ // okay, it is one
Reference< XSpreadsheet > xSheet = xView->getActiveSheet();
xPageSupp.set(xSheet, UNO_QUERY);
DBG_ASSERT(xPageSupp.is(), "OControlWizard::implDeterminePage: a spreadsheet which is no page supplier!"); if (xPageSupp.is())
xPage = xPageSupp->getDrawPage();
} else
{ // can be a draw/impress doc only
Reference< XDrawView > xDrawView(xController, UNO_QUERY);
DBG_ASSERT(xDrawView.is(), "OControlWizard::implDeterminePage: no alternatives left ... can't determine the page!"); if (xDrawView.is())
xPage = xDrawView->getCurrentPage();
}
}
} else
{
DBG_ASSERT(xPage.is(), "OControlWizard::implDeterminePage: can't determine the page (no model)!");
}
m_aContext.xDrawPage = std::move(xPage);
} catch(const Exception&)
{
TOOLS_WARN_EXCEPTION("extensions.dbpilots", "OControlWizard::implDeterminePage");
}
}
void OControlWizard::implGetDSContext()
{ try
{
DBG_ASSERT(m_xContext.is(), "OControlWizard::implGetDSContext: invalid service factory!");
// set the new connection if ( _bAutoDispose )
{ // for this, use an AutoDisposer (so the conn is cleaned up when the form dies or gets another connection)
Reference< XRowSet > xFormRowSet( m_aContext.xForm, UNO_QUERY ); new OAutoConnectionDisposer( xFormRowSet, _rxConn );
} else
{
m_aContext.xForm->setPropertyValue(u"ActiveConnection"_ustr, Any( _rxConn ) );
}
} catch(const Exception&)
{
TOOLS_WARN_EXCEPTION( "extensions.dbpilots", "OControlWizard::setFormConnection");
}
}
bool OControlWizard::initContext()
{
DBG_ASSERT(m_aContext.xObjectModel.is(), "OGroupBoxWizard::initContext: have no control model to work with!"); if (!m_aContext.xObjectModel.is()) returnfalse;
// reset the context
m_aContext.xForm.clear();
m_aContext.xRowSet.clear();
m_aContext.xDocumentModel.clear();
m_aContext.xDrawPage.clear();
m_aContext.xObjectShape.clear();
m_aContext.aFieldNames.realloc(0);
Any aSQLException;
Reference< XPreparedStatement > xStatement; try
{ // get the datasource context
implGetDSContext();
// first, determine the form the control belongs to
implDetermineForm();
// need the page, too
implDeterminePage();
// the shape of the control
implDetermineShape();
// get the columns of the object the settings refer to
Reference< XNameAccess > xColumns;
if (m_aContext.xForm.is())
{ // collect some properties of the form
OUString sObjectName = ::comphelper::getString(m_aContext.xForm->getPropertyValue(u"Command"_ustr));
sal_Int32 nObjectType = ::comphelper::getINT32(m_aContext.xForm->getPropertyValue(u"CommandType"_ustr));
// calculate the connection the rowset is working with
Reference< XConnection > xConnection;
m_aContext.bEmbedded = ::dbtools::isEmbeddedInDatabase( m_aContext.xForm, xConnection ); if ( !m_aContext.bEmbedded )
xConnection = ::dbtools::connectRowset( m_aContext.xRowSet, m_xContext, nullptr );
// not interested in any results, only in the fields
Reference< XPropertySet > xStatementProps(xStatement, UNO_QUERY);
xStatementProps->setPropertyValue(u"MaxRows"_ustr, Any(sal_Int32(0)));
// TODO: think about handling local SQLExceptions here ...
Reference< XColumnsSupplier > xSupplyCols(xStatement->executeQuery(), UNO_QUERY); if (xSupplyCols.is())
xColumns = xSupplyCols->getColumns();
}
}
}
}
if (aSQLException.hasValue())
{ // an SQLException (or derivee) was thrown ...
// prepend an extra SQLContext explaining what we were doing
SQLContext aContext(compmodule::ModuleRes(RID_STR_COULDNOTOPENTABLE), {}, {}, 0,
aSQLException, {});
// create an interaction handler to display this exception
Reference< XInteractionHandler > xHandler = getInteractionHandler(m_xAssistant.get()); if ( !xHandler.is() ) returnfalse;
void OControlWizard::commitControlSettings(OControlWizardSettings const * _pSettings)
{
DBG_ASSERT(m_aContext.xObjectModel.is(), "OControlWizard::commitControlSettings: have no control model to work with!"); if (!m_aContext.xObjectModel.is()) return;
// the only thing we have at the moment is the label try
{
Reference< XPropertySetInfo > xInfo = m_aContext.xObjectModel->getPropertySetInfo(); if (xInfo.is() && xInfo->hasPropertyByName(u"Label"_ustr))
{
OUString sControlLabel(_pSettings->sControlLabel);
m_aContext.xObjectModel->setPropertyValue(
u"Label"_ustr,
Any(sControlLabel)
);
}
} catch(const Exception&)
{
TOOLS_WARN_EXCEPTION( "extensions.dbpilots", "OControlWizard::commitControlSettings: could not commit the basic control settings!");
}
}
void OControlWizard::initControlSettings(OControlWizardSettings* _pSettings)
{
DBG_ASSERT(m_aContext.xObjectModel.is(), "OControlWizard::initControlSettings: have no control model to work with!"); if (!m_aContext.xObjectModel.is()) return;
// initialize some settings from the control model give try
{
OUString sLabelPropertyName(u"Label"_ustr);
Reference< XPropertySetInfo > xInfo = m_aContext.xObjectModel->getPropertySetInfo(); if (xInfo.is() && xInfo->hasPropertyByName(sLabelPropertyName))
{
OUString sControlLabel;
m_aContext.xObjectModel->getPropertyValue(sLabelPropertyName) >>= sControlLabel;
_pSettings->sControlLabel = sControlLabel;
}
} catch(const Exception&)
{
TOOLS_WARN_EXCEPTION( "extensions.dbpilots", "OControlWizard::initControlSettings: could not retrieve the basic control settings!");
}
}
bool OControlWizard::needDatasourceSelection()
{ // lemme see ... return !getContext().aFieldNames.hasElements(); // if we got fields, the data source is valid ...
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.