blob: 75d3e03ea3a95cb42ad7232800831e78fae6d616 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef OOX_OLE_VBACONTROL_HXX
#define OOX_OLE_VBACONTROL_HXX
#include "oox/ole/axcontrol.hxx"
namespace com { namespace sun { namespace star {
namespace container { class XNameContainer; }
namespace uno { class XComponentContext; }
} } }
namespace oox { class StorageBase; }
namespace oox {
namespace ole {
// ============================================================================
/** Common properties for all controls that are part of a VBA user form or of
another container control in a VBA user form. */
class VbaSiteModel
{
public:
explicit VbaSiteModel();
virtual ~VbaSiteModel();
/** Allows to set single properties specified by XML token identifier. */
void importProperty( sal_Int32 nPropId, const ::rtl::OUString& rValue );
/** Imports the site model data from the passed input stream. */
bool importBinaryModel( BinaryInputStream& rInStrm );
/** Moves the control relative to its current position by the passed distance. */
void moveRelative( const AxPairData& rDistance );
/** Returns the programmatical name of the control. */
inline const ::rtl::OUString& getName() const { return maName; }
/** Returns the position of the control in its parent. */
inline const AxPairData& getPosition() const { return maPos; }
/** Returns the unique identifier of this control. */
inline sal_Int32 getId() const { return mnId; }
/** Returns true, if the control is visible. */
bool isVisible() const;
/** Returns true, if this control is a container control. */
bool isContainer() const;
/** Returns the length of the stream data for stream based controls. */
sal_uInt32 getStreamLength() const;
/** Returns the name of the substorage for the container control data. */
::rtl::OUString getSubStorageName() const;
/** Returns the tab index of the control. */
inline sal_Int16 getTabIndex() const { return mnTabIndex; }
/** Tries to create the control model according to the site model. */
ControlModelRef createControlModel( const AxClassTable& rClassTable ) const;
/** Converts all form site properties. */
void convertProperties(
PropertyMap& rPropMap,
const ControlConverter& rConv,
ApiControlType eCtrlType,
sal_Int32 nCtrlIndex ) const;
/** Binds the passed control model to the data sources. The implementation
will check which source types are supported. */
void bindToSources(
const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& rxCtrlModel,
const ControlConverter& rConv ) const;
protected:
::rtl::OUString maName; /// Name of the control.
::rtl::OUString maTag; /// User defined tag.
::rtl::OUString maToolTip; /// Tool tip for the control.
::rtl::OUString maControlSource; /// Linked cell for the control value in a spreadsheet.
::rtl::OUString maRowSource; /// Source data for the control in a spreadsheet.
AxPairData maPos; /// Position in parent container.
sal_Int32 mnId; /// Control identifier.
sal_Int32 mnHelpContextId; /// Help context identifier.
sal_uInt32 mnFlags; /// Various flags.
sal_uInt32 mnStreamLen; /// Size of control stream data.
sal_Int16 mnTabIndex; /// Tab order index.
sal_uInt16 mnClassIdOrCache; /// Class name identifier or GUID cache index.
sal_uInt16 mnGroupId; /// Group identifier for grouped controls.
};
typedef ::boost::shared_ptr< VbaSiteModel > VbaSiteModelRef;
// ============================================================================
/** A control that is embedded in a VBA user form or in another container
control in a VBA user form.
The control may be a 'simple' control with its data stored in the 'o'
stream, or it may be a container control with its data stored in an own
substorage.
*/
class VbaFormControl
{
public:
explicit VbaFormControl();
virtual ~VbaFormControl();
/** Imports the model from the passed stream or storage, depending on the
control's type. Imports all embedded controls, if this is a container. */
void importModelOrStorage(
BinaryInputStream& rInStrm,
StorageBase& rStrg,
const AxClassTable& rClassTable );
/** Returns the programmatical name of the control. */
::rtl::OUString getControlName() const;
/** Returns the unique identifier of this control. */
sal_Int32 getControlId() const;
/** Creates the UNO control model, inserts it into the passed container,
and converts all control properties. */
void createAndConvert(
sal_Int32 nCtrlIndex,
const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& rxParentNC,
const ControlConverter& rConv ) const;
protected:
/** Creates and imports the control model containing properties of the control. */
void importControlModel( BinaryInputStream& rInStrm, const AxClassTable& rClassTable );
/** Creates and imports the control model, and imports all embedded
controls from the passed substorage. */
void importStorage( StorageBase& rStrg, const AxClassTable& rClassTable );
/** Converts all control properties, and inserts and converts embedded controls. */
bool convertProperties(
const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& rxCtrlModel,
const ControlConverter& rConv,
sal_Int32 nCtrlIndex ) const;
private:
typedef RefVector< VbaFormControl > VbaFormControlVector;
typedef VbaFormControlVector::value_type VbaFormControlRef;
/** Creates the control model according to the current site model. */
void createControlModel( const AxClassTable& rClassTable );
/** Imports the site model data containing common properties of the control. */
bool importSiteModel( BinaryInputStream& rInStrm );
/** Imports the site models of all embedded controls from the 'f' stream. */
bool importEmbeddedSiteModels( BinaryInputStream& rInStrm );
/* Final processing of all embedded controls after import. */
void finalizeEmbeddedControls();
/** Moves the control relative to its current position by the passed distance. */
void moveRelative( const AxPairData& rDistance );
/** Moves all embedded controls from their relative position in this
control to an absolute position in the parent of this control. */
void moveEmbeddedToAbsoluteParent();
/** Functor for comparing controls by their tab index. */
static bool compareByTabIndex( const VbaFormControlRef& rxLeft, const VbaFormControlRef& rxRight );
protected:
VbaSiteModelRef mxSiteModel; /// Common control properties.
ControlModelRef mxCtrlModel; /// Specific control properties.
private:
VbaFormControlVector maControls; /// All embedded form controls.
AxClassTable maClassTable; /// Class identifiers for exotic embedded controls.
};
// ============================================================================
class VbaUserForm : public VbaFormControl
{
public:
explicit VbaUserForm(
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext,
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& rxDocModel,
const GraphicHelper& rGraphicHelper,
bool bDefaultColorBgr = true );
/** Imports the form and its embedded controls, and inserts the form with
all its controls into the passed dialog library. */
void importForm(
const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& rxDialogLib,
StorageBase& rVbaFormStrg,
const ::rtl::OUString& rModuleName,
rtl_TextEncoding eTextEnc );
private:
::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > mxContext;
::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > mxDocModel;
ControlConverter maConverter;
};
// ============================================================================
} // namespace ole
} // namespace oox
#endif