1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
/* -*- 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 "optiongrouplayouter.hxx"
#include <com/sun/star/awt/Size.hpp>
#include <com/sun/star/awt/Point.hpp>
#include <com/sun/star/container/XIndexAccess.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/drawing/ShapeCollection.hpp>
#include <com/sun/star/drawing/XShapes.hpp>
#include <com/sun/star/drawing/XShapeGrouper.hpp>
#include <com/sun/star/text/TextContentAnchorType.hpp>
#include <com/sun/star/view/XSelectionSupplier.hpp>
#include "controlwizard.hxx"
#include "groupboxwiz.hxx"
#include "dbptools.hxx"
namespace dbp
{
#define BUTTON_HEIGHT 300
#define HEIGHT 450
#define OFFSET 300
#define MIN_WIDTH 600
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::drawing;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::awt;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::view;
//= OOptionGroupLayouter
OOptionGroupLayouter::OOptionGroupLayouter(const Reference< XComponentContext >& _rxContext)
:mxContext(_rxContext)
{
}
void OOptionGroupLayouter::doLayout(const OControlWizardContext& _rContext, const OOptionGroupSettings& _rSettings)
{
Reference< XShapes > xPageShapes(_rContext.xDrawPage, UNO_QUERY);
if (!xPageShapes.is())
{
OSL_FAIL("OOptionGroupLayouter::OOptionGroupLayouter: missing the XShapes interface for the page!");
return;
}
Reference< XMultiServiceFactory > xDocFactory(_rContext.xDocumentModel, UNO_QUERY);
if (!xDocFactory.is())
{
OSL_FAIL("OOptionGroupLayouter::OOptionGroupLayouter: no document service factory!");
return;
}
// no. of buttons to create
sal_Int32 nRadioButtons = _rSettings.aLabels.size();
sal_Int32 nTopSpace = 0;
// the shape of the groupbox
::com::sun::star::awt::Size aControlShapeSize = _rContext.xObjectShape->getSize();
// maybe need to adjust the size if the control shapes
sal_Int32 nMinShapeHeight = BUTTON_HEIGHT*(nRadioButtons+1) + BUTTON_HEIGHT + BUTTON_HEIGHT/4;
if (aControlShapeSize.Height < nMinShapeHeight)
aControlShapeSize.Height = nMinShapeHeight;
if (aControlShapeSize.Width < MIN_WIDTH)
aControlShapeSize.Width = MIN_WIDTH;
_rContext.xObjectShape->setSize(aControlShapeSize);
// if we're working on a writer document, we need to anchor the shape
implAnchorShape(Reference< XPropertySet >(_rContext.xObjectShape, UNO_QUERY));
// shape collection (for grouping the shapes)
Reference< XShapes > xButtonCollection( ShapeCollection::create(mxContext) );
// first member : the shape of the control
xButtonCollection->add(_rContext.xObjectShape.get());
sal_Int32 nTempHeight = (aControlShapeSize.Height - BUTTON_HEIGHT/4) / (nRadioButtons + 1);
::com::sun::star::awt::Point aShapePosition = _rContext.xObjectShape->getPosition();
::com::sun::star::awt::Size aButtonSize(aControlShapeSize);
aButtonSize.Width = aControlShapeSize.Width - OFFSET;
aButtonSize.Height = HEIGHT;
::com::sun::star::awt::Point aButtonPosition;
aButtonPosition.X = aShapePosition.X + OFFSET;
OUString sElementsName("RadioGroup");
disambiguateName(Reference< XNameAccess >(_rContext.xForm, UNO_QUERY), sElementsName);
StringArray::const_iterator aLabelIter = _rSettings.aLabels.begin();
StringArray::const_iterator aValueIter = _rSettings.aValues.begin();
for (sal_Int32 i=0; i<nRadioButtons; ++i, ++aLabelIter, ++aValueIter)
{
aButtonPosition.Y = aShapePosition.Y + (i+1) * nTempHeight + nTopSpace;
Reference< XPropertySet > xRadioModel(
xDocFactory->createInstance("com.sun.star.form.component.RadioButton"),
UNO_QUERY);
// the label
xRadioModel->setPropertyValue("Label", makeAny(OUString(*aLabelIter)));
// the value
xRadioModel->setPropertyValue("RefValue", makeAny(OUString(*aValueIter)));
// default selection
if (_rSettings.sDefaultField == *aLabelIter)
xRadioModel->setPropertyValue("DefaultState", makeAny(sal_Int16(1)));
// the connection to the database field
if (!_rSettings.sDBField.isEmpty())
xRadioModel->setPropertyValue("DataField", makeAny(OUString(_rSettings.sDBField)));
// the name for the model
xRadioModel->setPropertyValue("Name", makeAny(sElementsName));
// create a shape for the radio button
Reference< XControlShape > xRadioShape(
xDocFactory->createInstance("com.sun.star.drawing.ControlShape"),
UNO_QUERY);
Reference< XPropertySet > xShapeProperties(xRadioShape, UNO_QUERY);
// if we're working on a writer document, we need to anchor the shape
implAnchorShape(xShapeProperties);
// position it
xRadioShape->setSize(aButtonSize);
xRadioShape->setPosition(aButtonPosition);
// knitting with the model
xRadioShape->setControl(Reference< XControlModel >(xRadioModel, UNO_QUERY));
// the name of the shape
if (xShapeProperties.is())
xShapeProperties->setPropertyValue("Name", makeAny(sElementsName));
// add to the page
xPageShapes->add(xRadioShape.get());
// add to the collection (for the later grouping)
xButtonCollection->add(xRadioShape.get());
// set the GroupBox as "LabelControl" for the RadioButton
// (_after_ having inserted the model into the page!)
xRadioModel->setPropertyValue("LabelControl", makeAny(_rContext.xObjectModel));
}
// group the shapes
try
{
Reference< XShapeGrouper > xGrouper(_rContext.xDrawPage, UNO_QUERY);
if (xGrouper.is())
{
Reference< XShapeGroup > xGroupedOptions = xGrouper->group(xButtonCollection);
Reference< XSelectionSupplier > xSelector(_rContext.xDocumentModel->getCurrentController(), UNO_QUERY);
if (xSelector.is())
xSelector->select(makeAny(xGroupedOptions));
}
}
catch(Exception&)
{
OSL_FAIL("OOptionGroupLayouter::doLayout: caught an exception while grouping the shapes!");
}
}
void OOptionGroupLayouter::implAnchorShape(const Reference< XPropertySet >& _rxShapeProps)
{
static const OUString s_sAnchorPropertyName("AnchorType");
Reference< XPropertySetInfo > xPropertyInfo;
if (_rxShapeProps.is())
xPropertyInfo = _rxShapeProps->getPropertySetInfo();
if (xPropertyInfo.is() && xPropertyInfo->hasPropertyByName(s_sAnchorPropertyName))
_rxShapeProps->setPropertyValue(s_sAnchorPropertyName, makeAny(TextContentAnchorType_AT_PAGE));
}
} // namespace dbp
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|