diff options
Diffstat (limited to 'wizards/com/sun/star/wizards/reportbuilder/layout')
14 files changed, 3188 insertions, 0 deletions
diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarSingleColumn.java b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarSingleColumn.java new file mode 100644 index 000000000000..ccb74ebf6f07 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarSingleColumn.java @@ -0,0 +1,105 @@ +/* + ************************************************************************ + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.Rectangle; +import com.sun.star.report.XSection; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.UIConsts; + +/** + * + * @author ll93751 + */ +public class ColumnarSingleColumn extends ReportBuilderLayouter +{ + + public ColumnarSingleColumn(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + public String getName() + { + return "ColumnarSingleColumnLayoutOfData"; + } + + public String getLocalizedName() + { + final String sLocalizedName = getResource().getResText(UIConsts.RID_REPORT + 81); + return sLocalizedName; + } + + protected void insertDetailFields() + { + copyDetailProperties(); + + final String[] aFieldTitleNames = getFieldTitleNames(); + if (aFieldTitleNames == null) + { + return; + } + final String[] aFieldNames = getFieldNames(); + if (aFieldNames == null) + { + return; + } +// int nGroups = getReportDefinition().getGroups().getCount(); + + final XSection xSection = getReportDefinition().getDetail(); + + Rectangle aRect = new Rectangle(); + + final int nLabelWidth = getMaxLabelWidth(); + final SectionObject aSOLabel = getDesignTemplate().getDetailLabel(); + aSOLabel.setFontToBold(); + final SectionObject aSOTextField = getDesignTemplate().getDetailTextField(); + + final int nWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - getLeftGroupIndent(getCountOfGroups()) - nLabelWidth; + + for (int i = 0; i < aFieldNames.length; i++) + { + aRect.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + final String sLabel = aFieldTitleNames[i]; + aRect = insertLabel(xSection, sLabel, aRect, nLabelWidth, aSOLabel); + final String sFieldName = convertToFieldName(aFieldNames[i]); + aRect = insertFormattedField(xSection, sFieldName, aRect, nWidth, aSOTextField); + int nHeight = aRect.Height; + aRect.Y += Math.max(aSOLabel.getHeight(LayoutConstants.LabelHeight), nHeight); + } + aRect.Y += aSOLabel.getHeight(LayoutConstants.EmptyLineHeight); // one empty line + xSection.setHeight(aRect.Y); + doNotBreakInTable(xSection); + } + + protected void insertDetailFieldTitles() + { + // we won't extra field titles + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarThreeColumns.java b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarThreeColumns.java new file mode 100644 index 000000000000..2dc468fb09e7 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarThreeColumns.java @@ -0,0 +1,62 @@ +/* + * *********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + * ********************************************************************** + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.*; + +/** + * + * @author ll93751 + */ +public class ColumnarThreeColumns extends ColumnarTwoColumns +{ + + public ColumnarThreeColumns(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + public String getName() + { + return "ColumnarThreeColumnsLayoutOfData"; + } + + public String getLocalizedName() + { + final String sLocalizedName = getResource().getResText(UIConsts.RID_REPORT + 83); + return sLocalizedName; + } + + protected void insertDetailFields() + { + insertDetailFields(3); + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarTwoColumns.java b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarTwoColumns.java new file mode 100644 index 000000000000..d79713524021 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarTwoColumns.java @@ -0,0 +1,137 @@ +/* + ************************************************************************ + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.Rectangle; +import com.sun.star.report.XSection; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.UIConsts; + +/** + * + * @author ll93751 + */ +public class ColumnarTwoColumns extends ReportBuilderLayouter +{ + + public ColumnarTwoColumns(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + public String getName() + { + return "ColumnarTwoColumnsLayoutOfData"; + } + + public String getLocalizedName() + { + final String sLocalizedName = getResource().getResText(UIConsts.RID_REPORT + 82); + return sLocalizedName; + } + + protected void insertDetailFields() + { + insertDetailFields(2); + } + + protected void insertDetailFields(int _nColumns) + { + copyDetailProperties(); + + if (_nColumns < 1) + { + return; + } + final String[] aFieldTitleNames = getFieldTitleNames(); + if (aFieldTitleNames == null) + { + return; + } + final String[] aFieldNames = getFieldNames(); + if (aFieldNames == null) + { + return; + } +// int nGroups = getReportDefinition().getGroups().getCount(); + + final XSection xSection = getReportDefinition().getDetail(); + + Rectangle aRect = new Rectangle(); + + final int nLabelWidth = getMaxLabelWidth(); // 3000; + + final int nUsablePageWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - getLeftGroupIndent(getCountOfGroups()); + int i = 0; + int nRows = aFieldNames.length / _nColumns; + if ((aFieldNames.length % _nColumns) != 0) + { + ++nRows; + } + final int nWidth = (nUsablePageWidth - nLabelWidth * _nColumns) / _nColumns; + if (nWidth < 0) + { + // TODO: error message in logging + return; + } + + final SectionObject aSOLabel = getDesignTemplate().getDetailLabel(); + aSOLabel.setFontToBold(); + final SectionObject aSOTextField = getDesignTemplate().getDetailTextField(); + int nMaxHeight = 0; + for (int x = 0; x < _nColumns; x++) + { + aRect.Y = 0; + for (int y = 0; y < nRows; y++) + { + aRect.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()) + x * (nWidth + nLabelWidth); + if (i < aFieldNames.length) + { + final String sLabel = aFieldTitleNames[i]; + aRect = insertLabel(xSection, sLabel, aRect, nLabelWidth, aSOLabel); + final String sFieldName = convertToFieldName(aFieldNames[i]); + aRect = insertFormattedField(xSection, sFieldName, aRect, nWidth, aSOTextField); + + aRect.Y += Math.max(aSOLabel.getHeight(LayoutConstants.LabelHeight), aRect.Height); + ++i; + } + } + nMaxHeight = Math.max(aRect.Y, nMaxHeight); + } + aRect.Y = Math.max(aSOLabel.getHeight(LayoutConstants.LabelHeight) * nRows, nMaxHeight); + aRect.Y += aSOLabel.getHeight(LayoutConstants.EmptyLineHeight); // one empty line + xSection.setHeight(aRect.Y); + doNotBreakInTable(xSection); + } + + protected void insertDetailFieldTitles() + { + // we won't extra field titles + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/DesignTemplate.java b/wizards/com/sun/star/wizards/reportbuilder/layout/DesignTemplate.java new file mode 100644 index 000000000000..55fdafe6c79a --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/DesignTemplate.java @@ -0,0 +1,333 @@ +/* + * *********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + * ********************************************************************** + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.beans.PropertyValue; +// import com.sun.star.container.NoSuchElementException; +// import com.sun.star.lang.IndexOutOfBoundsException; +// import com.sun.star.lang.WrappedTargetException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.report.XFixedText; +import com.sun.star.report.XFormattedField; +import com.sun.star.report.XGroup; +import com.sun.star.report.XGroups; +import com.sun.star.report.XReportDefinition; +import com.sun.star.report.XSection; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Properties; + +/** + * + * @author ll93751 + */ +public class DesignTemplate +{ + + private XReportDefinition m_xReportDefinition; + XMultiServiceFactory m_xGlobalMSF; + String m_sFilename; + + private DesignTemplate() + { + } + // ------------------------------------------------------------------------- + // All functions from XReportDefinition, we use + // ------------------------------------------------------------------------- + XGroups getGroups() + { + return m_xReportDefinition.getGroups(); + } + + XSection getDetail() + { + return m_xReportDefinition.getDetail(); + } + + boolean getReportHeaderOn() + { + return m_xReportDefinition.getReportHeaderOn(); + } + + XSection getReportHeader() throws com.sun.star.container.NoSuchElementException + { + return m_xReportDefinition.getReportHeader(); + } + + boolean getReportFooterOn() + { + return m_xReportDefinition.getReportFooterOn(); + } + + XSection getReportFooter() throws com.sun.star.container.NoSuchElementException + { + return m_xReportDefinition.getReportFooter(); + } + + boolean getPageHeaderOn() + { + return m_xReportDefinition.getPageHeaderOn(); + } + + XSection getPageHeader() throws com.sun.star.container.NoSuchElementException + { + return m_xReportDefinition.getPageHeader(); + } + + boolean getPageFooterOn() + { + return m_xReportDefinition.getPageFooterOn(); + } + + XSection getPageFooter() throws com.sun.star.container.NoSuchElementException + { + return m_xReportDefinition.getPageFooter(); + } // ------------------------------------------------------------------------- + private SectionObject m_aDetailLabel; + private SectionObject m_aDetailTextField; + private SectionObject[] m_aGroupLabel; + private SectionObject[] m_aGroupTextField; + + SectionObject getDetailLabel() + { + if (m_aDetailLabel == null) + { + return SectionEmptyObject.create(); + } + return m_aDetailLabel; + } + + SectionObject getDetailTextField() + { + if (m_aDetailTextField == null) + { + return SectionEmptyObject.create(); + } + return m_aDetailTextField; + } + + SectionObject getGroupTextField(int _nGroup) + { + return getGroupSectionObject(m_aGroupTextField, _nGroup); + } + + SectionObject getGroupLabel(int _nGroup) + { + return getGroupSectionObject(m_aGroupLabel, _nGroup); + } + + private SectionObject getGroupSectionObject(SectionObject _aGroupList[], int _nGroup) + { + SectionObject a = null; + if (_nGroup < _aGroupList.length) + { + a = _aGroupList[_nGroup]; + } + else + { + // if there are not enough groups, the last one will win + if (_aGroupList.length > 0) + { + a = _aGroupList[_aGroupList.length - 1]; + } + } + // we show if the group is null + if (a == null) + { + a = SectionEmptyObject.create(); + // a empty group has to use bold font + a.setPropertyValue("CharWeight", new Float(com.sun.star.awt.FontWeight.BOLD)); + } + return a; + } + + // we analyse the loaded ReportDefinition, we want to know the FontDescriptor of all XSections + private void analyseReportDefinition() + { + final XSection xDetailSection = m_xReportDefinition.getDetail(); + final int nDetailCount = xDetailSection.getCount(); + for (int i = 0; i < nDetailCount; i++) + { + try + { + Object aObj = xDetailSection.getByIndex(i); + // is aObj a label + // is aObj a textfield + // m_aDetailLabel_FD + // m_aDetailTextField_FD + XFixedText aFixedText = (XFixedText) UnoRuntime.queryInterface(XFixedText.class, aObj); + if (aFixedText != null && + m_aDetailLabel == null) + { + m_aDetailLabel = SectionLabel.create(aFixedText); + } + else + { + XFormattedField aFormattedField = (XFormattedField) UnoRuntime.queryInterface(XFormattedField.class, aObj); + if (aFormattedField != null && + m_aDetailTextField == null) + { + m_aDetailTextField = SectionTextField.create(aFormattedField); + } + } + int dummy = 0; + } + catch (com.sun.star.lang.IndexOutOfBoundsException ex) + { + } + catch (com.sun.star.lang.WrappedTargetException ex) + { + } + } + + final XGroups xGroups = m_xReportDefinition.getGroups(); + final int nGroupCount = xGroups.getCount(); + // create a m_aGroupLabel_FD[] + // create a m_aGroupTextField_FD[] + m_aGroupLabel = new SectionObject[nGroupCount]; + m_aGroupTextField = new SectionObject[nGroupCount]; + + for (int nGroup = 0; nGroup < nGroupCount; nGroup++) + { + try + { + Object aGroup = xGroups.getByIndex(nGroup); + XGroup xGroup = (XGroup) UnoRuntime.queryInterface(XGroup.class, aGroup); + XSection xGroupSection = xGroup.getHeader(); + + final int nCount = xGroupSection.getCount(); + for (int i = 0; i < nCount; i++) + { + try + { + Object aObj = xGroupSection.getByIndex(i); + XFixedText aFixedText = (XFixedText) UnoRuntime.queryInterface(XFixedText.class, aObj); + // is aObj a label + // is aObj a textfield + if (aFixedText != null && + m_aGroupLabel[nGroup] == null) + { + m_aGroupLabel[nGroup] = SectionLabel.create(aFixedText); + } + else + { + XFormattedField aFormattedField = (XFormattedField) UnoRuntime.queryInterface(XFormattedField.class, aObj); + if (aFormattedField != null && + m_aGroupTextField[nGroup] == null) + { + m_aGroupTextField[nGroup] = SectionTextField.create(aFormattedField); + } + } + int dummy = 0; + } + catch (com.sun.star.lang.IndexOutOfBoundsException ex) + { + } + catch (com.sun.star.lang.WrappedTargetException ex) + { + } + } + } + catch (com.sun.star.container.NoSuchElementException ex) + { + } + catch (com.sun.star.lang.IndexOutOfBoundsException ex) + { + } + catch (com.sun.star.lang.WrappedTargetException ex) + { + } + } + } + + /** + * close our current ReportDefinition + */ + void close() + { + try + { + m_xReportDefinition.close(true); + } + catch (com.sun.star.util.CloseVetoException e) + { + } + } + + /** + * create a new DesignTemplate by try to load a otr file from the given path. + * Internally we store the loaded ReportDefinition. + * + * @param _xMSF + * @param _sPath + * @return + */ + public static DesignTemplate create(XMultiServiceFactory _xMSF, String _sPath) + { + DesignTemplate a = new DesignTemplate(); + try + { + a.load(_xMSF, _sPath); + } + catch (com.sun.star.lang.WrappedTargetRuntimeException e) + { + // this should not happen + a = null; + throw new java.lang.RuntimeException(e.getMessage()); + } + catch (com.sun.star.uno.Exception e) + { + a = null; + } + catch (Exception e) + { + a = null; + } + return a; + } + + private void load(XMultiServiceFactory _xMSF, String _sPath) throws com.sun.star.uno.Exception + { + m_xGlobalMSF = _xMSF; + m_sFilename = _sPath; + final Object aObj = _xMSF.createInstance("com.sun.star.report.ReportDefinition"); + m_xReportDefinition = (XReportDefinition) UnoRuntime.queryInterface(XReportDefinition.class, aObj); + + PropertyValue[] aLoadProps = new PropertyValue[2]; + aLoadProps[0] = Properties.createProperty("URL", _sPath); + aLoadProps[1] = Properties.createProperty("ReadOnly", Boolean.TRUE); + + m_xReportDefinition.load(aLoadProps); + analyseReportDefinition(); + } + + public XReportDefinition getReportDefinition() + { + return m_xReportDefinition; + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsAbove.java b/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsAbove.java new file mode 100644 index 000000000000..9fd891a446f2 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsAbove.java @@ -0,0 +1,166 @@ +/* + * *********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + * ********************************************************************** + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.Rectangle; +import com.sun.star.report.XSection; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.*; + +/** + * + * @author ll93751 + */ +public class InBlocksLabelsAbove extends ColumnarTwoColumns +{ + + public InBlocksLabelsAbove(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + public String getName() + { + return "InBlocksLabelsAboveLayoutOfData"; + } + + public String getLocalizedName() + { + final String sLocalizedName = getResource().getResText(UIConsts.RID_REPORT + 85); + return sLocalizedName; + } + + protected void insertDetailFields() + { + copyDetailProperties(); + + final String[] aFieldTitleNames = getFieldTitleNames(); + if (aFieldTitleNames == null) + { + return; + } + final String[] aFieldNames = getFieldNames(); + if (aFieldNames == null) + { + return; + } +// int nGroups = getReportDefinition().getGroups().getCount(); + + final XSection xSection = getReportDefinition().getDetail(); + + Rectangle aRectLabels = new Rectangle(); + Rectangle aRectFields = new Rectangle(); + + + final int nUsablePageWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - getLeftGroupIndent(getCountOfGroups()); + + int i = 0; + int nCount = aFieldTitleNames.length; + // int x = 0; + aRectLabels.Y = 0; + aRectLabels.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + aRectFields.Y = LayoutConstants.LabelHeight; + aRectFields.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + // first run only calculates the width. + int nDelta = 0; + int nFieldWidth = 3000; + while (nCount > 0) + { + // String sLabel = aFieldTitleNames[i]; + // int nLabelWidth = 3000; + // String sFieldName = convertToFieldName(aFieldNames[i]); + aRectFields.X += nFieldWidth; + // aRectLabels.X += nFieldWidth; + + final int nNextX = aRectFields.X + nFieldWidth; + if (nNextX > (getPageWidth() - getRightPageIndent())) + { + // all other values are not from interest. + break; + } + + ++i; + --nCount; + } + final int nDeltaTotal = nUsablePageWidth - i * nFieldWidth; + nDelta = nDeltaTotal; + if (i > 0) + { + nDelta = nDeltaTotal / i; + } + + aRectLabels.Y = 0; + aRectLabels.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + final SectionObject aSOLabel = getDesignTemplate().getDetailLabel(); + aSOLabel.setFontToBold(); + final SectionObject aSOTextField = getDesignTemplate().getDetailTextField(); + + aRectFields.Y = aSOLabel.getHeight(LayoutConstants.LabelHeight); + aRectFields.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + i = 0; + nCount = aFieldTitleNames.length; + int nLastHeight = 0; + while (nCount > 0) + { + final String sLabel = aFieldTitleNames[i]; + final int nLabelWidth = 3000 + nDelta; + aRectLabels = insertLabel(xSection, sLabel, aRectLabels, nLabelWidth, aSOLabel); + final String sFieldName = convertToFieldName(aFieldNames[i]); + nFieldWidth = 3000 + nDelta; + aRectFields = insertFormattedField(xSection, sFieldName, aRectFields, nFieldWidth, aSOTextField); + nLastHeight = Math.max(nLastHeight, aRectFields.Height); + int nNextX = aRectFields.X + nFieldWidth; + if (nNextX > (getPageWidth() - getRightPageIndent()) & nCount > 1) + { + int nHeight = (aSOLabel.getHeight(LayoutConstants.LabelHeight) + Math.max(aSOTextField.getHeight(LayoutConstants.FormattedFieldHeight), nLastHeight)); + nLastHeight = 0; + aRectLabels.Y += nHeight; // 2 * label height + aRectLabels.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + aRectFields.Y += nHeight; + aRectFields.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + } + ++i; + --nCount; + } + aRectFields.Y += Math.max(aSOTextField.getHeight(LayoutConstants.FormattedFieldHeight), nLastHeight); + aRectFields.Y += aSOTextField.getHeight(LayoutConstants.EmptyLineHeight); // one empty line + xSection.setHeight(aRectFields.Y); + doNotBreakInTable(xSection); + } + + protected void insertDetailFieldTitles() + { + // we won't extra field titles + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsLeft.java b/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsLeft.java new file mode 100644 index 000000000000..c03cf7cec909 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsLeft.java @@ -0,0 +1,133 @@ +/* + * *********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + * ********************************************************************** + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.Rectangle; +import com.sun.star.report.XSection; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.*; + +/** + * + * @author ll93751 + */ +public class InBlocksLabelsLeft extends ColumnarTwoColumns +{ + + public InBlocksLabelsLeft(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + public String getName() + { + return "InBlocksLabelsLeftLayoutOfData"; + } + + public String getLocalizedName() + { + final String sLocalizedName = getResource().getResText(UIConsts.RID_REPORT + 84); + return sLocalizedName; + } + + protected void insertDetailFields() + { + copyDetailProperties(); + + final String[] aFieldTitleNames = getFieldTitleNames(); + if (aFieldTitleNames == null) + { + return; + } + final String[] aFieldNames = getFieldNames(); + if (aFieldNames == null) + { + return; + } +// int nGroups = getReportDefinition().getGroups().getCount(); + + final XSection xSection = getReportDefinition().getDetail(); + + Rectangle aRectLabelFields = new Rectangle(); + + final int nUsablePageWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - getLeftGroupIndent(getCountOfGroups()); + + final int nLabelWidth = getMaxLabelWidth(); // 3000; + int nFieldWidth = 3000; + + final int nFactor = nUsablePageWidth / (nLabelWidth + nFieldWidth); + int nDeltaTotal = 0; + int nDelta = 0; + if (nFactor > 0) + { + nDeltaTotal = nUsablePageWidth - (nFactor * (nLabelWidth + nFieldWidth)); + nDelta = nDeltaTotal / nFactor; + } + + int i = 0; + int nCount = aFieldTitleNames.length; + // int x = 0; + aRectLabelFields.Y = 0; + aRectLabelFields.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + SectionObject aSOLabel = getDesignTemplate().getDetailLabel(); + aSOLabel.setFontToBold(); + SectionObject aSOTextField = getDesignTemplate().getDetailTextField(); + int nLastHeight = 0; + while (nCount > 0) + { + final String sLabel = aFieldTitleNames[i]; +// nLabelWidth = 3000; + aRectLabelFields = insertLabel(xSection, sLabel, aRectLabelFields, nLabelWidth, aSOLabel); + final String sFieldName = convertToFieldName(aFieldNames[i]); + nFieldWidth = 3000 + nDelta; + aRectLabelFields = insertFormattedField(xSection, sFieldName, aRectLabelFields, nFieldWidth, aSOTextField); + nLastHeight = Math.max(aRectLabelFields.Height, nLastHeight); + final int nNextX = aRectLabelFields.X + nLabelWidth + nFieldWidth; + if (nNextX > (getPageWidth() - getRightPageIndent())) + { + // TODO: label height is fix + aRectLabelFields.Y += Math.max(aSOTextField.getHeight(LayoutConstants.FormattedFieldHeight), nLastHeight); + nLastHeight = 0; + aRectLabelFields.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + } + ++i; + --nCount; + } + aRectLabelFields.Y += Math.max(aSOLabel.getHeight(LayoutConstants.EmptyLineHeight), nLastHeight); // one empty line + xSection.setHeight(aRectLabelFields.Y); + doNotBreakInTable(xSection); + } + + protected void insertDetailFieldTitles() + { + // we won't extra field titles + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/LayoutConstants.java b/wizards/com/sun/star/wizards/reportbuilder/layout/LayoutConstants.java new file mode 100644 index 000000000000..c31ce4b5f277 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/LayoutConstants.java @@ -0,0 +1,52 @@ +/* + * *********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + * ********************************************************************** + */ + +package com.sun.star.wizards.reportbuilder.layout; + +/** + * + * @author ll93751 + */ +public class LayoutConstants +{ + public static final int LabelHeight = 500; + public static final int FormattedFieldHeight = 500; + public static final int EmptyLineHeight = 500; + + public static final int BinaryHeight = 4000; + public static final int MemoFieldHeight = 4000; + + public static final int LineHeight = 250; + + /** + * Groups will indent + * This is the factor (5mm) which will multiply with the current indent + */ + public static final int IndentFactorWidth = 500; +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/ReportBuilderLayouter.java b/wizards/com/sun/star/wizards/reportbuilder/layout/ReportBuilderLayouter.java new file mode 100644 index 000000000000..a10affa9ea2c --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/ReportBuilderLayouter.java @@ -0,0 +1,1693 @@ +/* + ************************************************************************ + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.FontDescriptor; +import com.sun.star.awt.Rectangle; +import com.sun.star.awt.Size; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XControlModel; +import com.sun.star.awt.XLayoutConstrains; +import com.sun.star.awt.XUnitConversion; +import com.sun.star.awt.XWindow; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.Property; +import com.sun.star.beans.PropertyAttribute; +import com.sun.star.beans.UnknownPropertyException; +import com.sun.star.beans.XPropertySet; +import com.sun.star.beans.XPropertySetInfo; +import com.sun.star.container.XEnumeration; +import com.sun.star.container.XNameAccess; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.report.XFixedLine; +import com.sun.star.report.XFixedText; +import com.sun.star.report.XFormattedField; +import com.sun.star.report.XGroup; +import com.sun.star.report.XGroups; +import com.sun.star.report.XImageControl; +import com.sun.star.report.XReportComponent; +import com.sun.star.report.XReportControlModel; +import com.sun.star.report.XReportDefinition; +import com.sun.star.report.XSection; +import com.sun.star.drawing.XShape; +import com.sun.star.sdbc.DataType; +import com.sun.star.style.XStyle; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.XNumberFormatTypes; +import com.sun.star.util.XNumberFormats; +import com.sun.star.util.XNumberFormatsSupplier; +import com.sun.star.wizards.common.Configuration; +import com.sun.star.wizards.common.FileAccess; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertySetHelper; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportBuilderLayouter; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.UIConsts; +import java.util.HashMap; +import java.util.Locale; + +/** + * This class is abstract and more like a helper for create different layouts for Report Builder Wizard. + * @author ll93751 + */// TODO: let a little bit place between 2 formatted fields +// TODO: move all sectionobjects which have a connect to the right max page width to left if there is a orientation change. +abstract public class ReportBuilderLayouter implements IReportBuilderLayouter +{ + + private IReportDefinitionReadAccess m_xReportDefinitionReadAccess; + private Resource m_aResource; + + /** + * dispose the ReportBuilderLayouter + */ + public void dispose() + { + closeDesignTemplate(); + m_xReportDefinitionReadAccess = null; + // m_xReportBuilderLayouter = null; + } + + /** + * The Constructor is protected, this is a abstract class, use Tabular or other to create an instance. + * @param _xDefinitionAccess + * @param _aResource + */ + protected ReportBuilderLayouter(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + m_xReportDefinitionReadAccess = _xDefinitionAccess; + m_aResource = _aResource; + } + + /** + * Access to the current ReportDefinition + * @return the ReportDefinition + */ + public XReportDefinition getReportDefinition() + { + // we have to ask our parent for this value + return m_xReportDefinitionReadAccess.getReportDefinition(); + } + + /** + * Access to the global MultiServiceFactory + * @return the global Service Factory + */ + private XMultiServiceFactory getGlobalMSF() + { + return m_xReportDefinitionReadAccess.getGlobalMSF(); + } + + /** + * Layout the complete report new, by all information we know until this time. + * + * If there are some information less, it is no problem for this function, they will be leaved out. + * It is possible to call this function after every change, but be careful, could take a little bit longer. + */ + public synchronized void layout() + { + try + { + // we bring the clear and insert methods together, this should be a little bit smoother + clearReportHeader(); + insertReportHeader(); + + clearReportFooter(); + insertReportFooter(); + + clearPageHeader(); + insertPageHeader(); + + clearPageFooter(); + insertPageFooter(); + + clearGroups(); + insertGroups(); + + clearDetails(); + // clearFieldTitles(); + insertDetailFieldTitles(); + insertDetailFields(); + } + catch (java.lang.ArrayIndexOutOfBoundsException e) + { + // could happen, if you change the count of values + } + catch (java.lang.RuntimeException e) + { + throw e; + } + catch (Exception e) + { + // Exception not set. Not from interest here. + int dummy = 0; + } + } + // ------------------------------------------------------------------------- + /** + * Remove all Groups + */ + protected void clearGroups() + { + final XGroups xGroups = getReportDefinition().getGroups(); +// int nCount = xGroups.getCount(); + while (xGroups.hasElements()) + { + try + { + xGroups.removeByIndex(0); + } + catch (com.sun.star.uno.Exception e) + { + // Exception not set. Not from interest here. + } + } + } + // ------------------------------------------------------------------------- + /** + * Remove all fields + * @param _xSectionToClear + */ + private void emptySection(XSection _xSectionToClear) + { + if (_xSectionToClear == null) + { + return; + } + // int nCount = _xSectionToClear.getCount(); + while (_xSectionToClear.hasElements()) + { + try + { + final Object aObj = _xSectionToClear.getByIndex(0); + final XShape aShape = (XShape) UnoRuntime.queryInterface(XShape.class, aObj); + _xSectionToClear.remove(aShape); + } + catch (com.sun.star.uno.Exception e) + { + // Exception not set. + int dummy = 0; + } + + } + } + + private void clearDetails() + { + final XSection xSection = getReportDefinition().getDetail(); + emptySection(xSection); + } +// public void clearFieldTitles() +// { +// } + /** + * + * @param _nGroupCount + * @return the left indent in 1/100mm + */ + protected int getLeftGroupIndent(int _nGroupCount) + { +// TODO: Fix values for group indent (1/2cm) only the first 2 groups + int nIndent = 0; + final int MAX_INDENT = 2; + if (_nGroupCount <= MAX_INDENT) + { + nIndent = _nGroupCount * LayoutConstants.IndentFactorWidth; + } + else + { + nIndent = MAX_INDENT * LayoutConstants.IndentFactorWidth; + } + return nIndent; + } + /** + * Get left page indent. + * The left indent is the area on the left side which will no be printed. + * The default is 2000 1/100mm what is 2cm of DIN A4. + * @return the left indent in 1/100mm + */ + int m_nLeftIndent = -1; + + protected int getLeftPageIndent() + { + if (m_nLeftIndent < 0) + { + m_nLeftIndent = getFromPageStyles("LeftMargin", 2000); + } + return m_nLeftIndent; + } + /** + * Get right page indent. + * The right indent is the area on the right side which will no be printed. + * The default is 2000 1/100mm what is 2cm of DIN A4. + * @return the right indent in 1/100mm + */ + int m_nRightIndent = -1; + + protected int getRightPageIndent() + { + if (m_nRightIndent < 0) + { + m_nRightIndent = getFromPageStyles("RightMargin", 2000); + } + return m_nRightIndent; + } + + private XStyle getUsedStyle(String _sStyleName) + { + XStyle aUsedStyle = null; + final XNameAccess xNameAccess = getReportDefinition().getStyleFamilies(); + try + { + // <Analysecode> + // String[] aNames = xNameAccess.getElementNames(); + // </Analysecode> + + // get all Page Styles + final Object aPageStylesObj = xNameAccess.getByName(_sStyleName); + final XNameAccess xContainer = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, aPageStylesObj); + + // step over all Page Styles, search the one which is in use + final String[] aElementNames = xContainer.getElementNames(); + for (int i = 0; i < aElementNames.length; i++) + { + final String sName = aElementNames[i]; + final Object aObj = xContainer.getByName(sName); + final XStyle xStyle = (XStyle) UnoRuntime.queryInterface(XStyle.class, aObj); + if (xStyle.isInUse()) + { + aUsedStyle = xStyle; + break; + } + } + } + catch (com.sun.star.uno.Exception e) + { + // TODO: Exception not set. + e.printStackTrace(); + } + return aUsedStyle; + } + + protected int getFromPageStyles(String _sStyleName, int _nDefault) + { + int nValue = _nDefault; + final XStyle xStyle = getUsedStyle("PageStyles"); + if (xStyle != null) + { + // we found the page style which is in use + final PropertySetHelper aHelper = new PropertySetHelper(xStyle); + nValue = aHelper.getPropertyValueAsInteger(_sStyleName, nValue); + } + return nValue; + } + + protected void setToPageStyles(String _sStyleName, Object _aObj) + { + final XStyle xStyle = getUsedStyle("PageStyles"); + if (xStyle != null) + { + final PropertySetHelper aHelper = new PropertySetHelper(xStyle); + aHelper.setPropertyValueDontThrow(_sStyleName, _aObj); + } + } + /** + * Get page width. The default is 21000 1/100mm what is 21cm of DIN A4. + * @return the Width of the page in 1/100mm + */ + int m_nPageWidth = -1; + + protected int getPageWidth() + { + if (m_nPageWidth < 0) + { + m_nPageWidth = getFromPageStyles("Width", 21000); + } + return m_nPageWidth; + } + // ------------------------------------------------------------------------- + /** + * Stores the Group names. To insert/create a report with such group names, call layout() + * @param _aGroupNames + */ + public void insertGroupNames(String[] _aGroupNames) + { + m_aGroupNames = _aGroupNames; + } + + protected void copyGroupProperties(int _nGroup) + { + if (getDesignTemplate() != null) + { + try + { + final XGroups xForeignGroups = getDesignTemplate().getGroups(); + int nGroups = xForeignGroups.getCount(); + Object aForeignGroup = xForeignGroups.getByIndex(_nGroup); + XGroup xForeignGroup = (XGroup) UnoRuntime.queryInterface(XGroup.class, aForeignGroup); + XSection xForeignGroupSection = xForeignGroup.getHeader(); + + if (xForeignGroupSection != null) + { + final XGroups xGroups = getReportDefinition().getGroups(); + Object aGroup = xGroups.getByIndex(_nGroup); + XGroup xGroup = (XGroup) UnoRuntime.queryInterface(XGroup.class, aGroup); + XSection xGroupSection = xGroup.getHeader(); + + // copy Properties + copyProperties(xForeignGroupSection, xGroupSection); + } + } + catch (Exception e) + { + int dummy = 0; + } + } + } + // ------------------------------------------------------------------------- + protected void insertGroups() + { + if (m_aGroupNames == null) + { + return; + } + + final XGroups xGroups = getReportDefinition().getGroups(); + final int nLeftPageIndent = getLeftPageIndent(); + final int nLabelWidth = getMaxLabelWidth(); // 3000; + final int nUsablePageWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - getLeftGroupIndent(getCountOfGroups()); + final int nFieldWidth = nUsablePageWidth - nLabelWidth; + + // after done with all groups, we need access to the last group, for set property 'KeepTogether' so we remember it. + XGroup aLastGroup = null; + + for (int i = 0; i < m_aGroupNames.length; i++) + { + final XGroup xGroup = xGroups.createGroup(); + aLastGroup = xGroup; + + // TODO: debug what the m_aGroupNames are, "field:[...]" or the "fieldname" + xGroup.setExpression(m_aGroupNames[i]); + xGroup.setHeaderOn(true); + // we don't want any group footer (default off) + // xGroup.setFooterOn(true); + + try + { + // we need to append by hand + // TODO: documentation is unclear here, that we have to insert by hand + int nCount = xGroups.getCount(); + xGroups.insertByIndex(nCount, xGroup); + + final XSection xGroupSection = xGroup.getHeader(); + copyGroupProperties(nCount); + + Rectangle aRect = new Rectangle(); + aRect.X = nLeftPageIndent + getLeftGroupIndent(i); + SectionObject aSO = getDesignTemplate().getGroupLabel(i); + int nLabelHeight = 0; +// if (aSO != null) +// { + nLabelHeight = aSO.getHeight(LayoutConstants.LabelHeight); + aRect = insertLabel(xGroupSection, getTitleFromFieldName(m_aGroupNames[i]), aRect, nLabelWidth, aSO); +// } +// else +// { +// nLabelHeight = 500; +// aRect = insertBoldLabel(xGroupSection, getTitleFromFieldName(m_aGroupNames[i]), aRect, nLabelWidth); +// } + final String sGroupName = convertToFieldName(m_aGroupNames[i]); + aSO = getDesignTemplate().getGroupTextField(i); + insertFormattedField(xGroupSection, sGroupName, aRect, nFieldWidth, aSO); + + // draw a line under the label/formattedfield + aRect.X = nLeftPageIndent + getLeftGroupIndent(i); + aRect.Y = nLabelHeight; + final int nLineWidth = getPageWidth() - getRightPageIndent() - aRect.X; + final int nLineHeight = LayoutConstants.LineHeight; + insertHorizontalLine(xGroupSection, aRect, nLineWidth, nLineHeight); + xGroupSection.setHeight(nLabelHeight + nLineHeight); + } + catch (com.sun.star.uno.Exception e) + { + // TODO: Exception not set. + } + } + + // hold the inner group together + if (aLastGroup != null) + { + doNotBreakInTable(aLastGroup); + } + } + + // ------------------------------------------------------------------------- + /** + * Give a list off all field title names to insert the field title names, call layout() + * @param _aFieldTitleNames + */ + public void insertFieldTitles(String[] _aFieldTitleNames) + { + m_aFieldTitleNames = _aFieldTitleNames; + } + + // ------------------------------------------------------------------------- + protected String getTitleFromFieldName(String _sField) + { + for (int i = 0; i < m_aFieldNames.length; i++) + { + if (m_aFieldNames[i].equals(_sField)) + { + return m_aFieldTitleNames[i]; + } + } + return ""; + } + + protected int getTypeFromFieldName(String _sField) + { + for (int i = 0; i < m_aFieldNames.length; i++) + { + if (m_aFieldNames[i].equals(_sField)) + { + return m_aFieldTypes[i]; + } + } + return 0; + } + + protected boolean listContains(String[] _aList, String _aValue) + { + for (int i = 0; i < _aList.length; i++) + { + if (_aList[i].equals(_aValue)) + { + return true; + } + } + return false; + } + // ------------------------------------------------------------------------- + /** + * Helper to get all field names without the names which are already in the group names + * @param _aList + * @param _aGetResultFrom + * @return + */ + protected String[] getNamesWithoutGroupNames(String[] _aList, String[] _aGetResultFrom) + { + if (_aList == null /* || _aGetResultsFrom == null */) + { + return new String[] + { + }; /* empty list */ + } + if (getCountOfGroups() == 0) + { + if (_aGetResultFrom != null) + { + return _aGetResultFrom; + } + return _aList; + } + final int nNewLength = _aList.length - getCountOfGroups(); + String[] aNewList = new String[nNewLength]; + int j = 0; + for (int i = 0; i < _aList.length; i++) + { + final String sField = _aList[i]; + if (listContains(m_aGroupNames, sField) == true) + { + continue; + } + if (_aGetResultFrom != null) + { + aNewList[j++] = _aGetResultFrom[i]; + } + else + { + aNewList[j++] = sField; + } + if (j == nNewLength) + { + break; // Emergency break, we leave the result list. + } + } + return aNewList; + } + + // ------------------------------------------------------------------------- + protected int calculateFieldWidth(int _nLeftIndent, int _nFieldCount) + { + int nWidth = 3000; + if (_nFieldCount > 0) + { + nWidth = (getPageWidth() - getLeftPageIndent() - getRightPageIndent() - _nLeftIndent) / _nFieldCount; + } + return nWidth; + } + + protected String[] getFieldTitleNames() + { + return getNamesWithoutGroupNames(m_aFieldNames, m_aFieldTitleNames); + } + // ------------------------------------------------------------------------- + abstract protected void insertDetailFieldTitles(); + // ------------------------------------------------------------------------- + /** + * Give a list off all field names to insert the field names, call layout() + * @param _aFieldNames + */ + public void insertFieldNames(String[] _aFieldNames) + { + m_aFieldNames = _aFieldNames; + } + + public void insertFieldTypes(int[] _aFieldTypes) + { + m_aFieldTypes = _aFieldTypes; + } + + public void insertFieldWidths(int[] _aFieldWidths) + { + m_aFieldWidths = _aFieldWidths; + } + + protected int getCountOfGroups() + { + return ((m_aGroupNames == null) ? 0 : m_aGroupNames.length); + } + + // ------------------------------------------------------------------------- + protected String[] getFieldNames() + { + return getNamesWithoutGroupNames(m_aFieldNames, null); + } + + abstract protected void insertDetailFields(); + + protected void copyDetailProperties() + { + if (getDesignTemplate() != null) + { + try + { + XSection xForeignSection = getDesignTemplate().getDetail(); + if (xForeignSection != null) + { + XSection xSection = getReportDefinition().getDetail(); + + // copy Properties + copyProperties(xForeignSection, xSection); + } + } + catch (Exception e) + { + } + } + } + // ------------------------------------------------------------------------- + protected Rectangle insertLabel(XSection _xSection, String _sLabel, Rectangle _aRect, int _nWidth, SectionObject _aSO) + { + if (_xSection != null) + { + try + { + final Object aFixedText = getMSFofReportDefinition().createInstance("com.sun.star.report.FixedText"); + final XFixedText xFixedText = (XFixedText) UnoRuntime.queryInterface(XFixedText.class, aFixedText); + + + int nHeight = LayoutConstants.LabelHeight; // default height of label is fixed. + if (_aSO != null) + { + if (_aSO instanceof SectionEmptyObject) + { + float fCharWeight = _aSO.getCharWeight(com.sun.star.awt.FontWeight.NORMAL); + if (fCharWeight > 0.1f) + { + xFixedText.setCharWeight(fCharWeight); + } + } + else + { +// TODO: there seems to be some problems with copy all properties from the design template to the current design + final FontDescriptor aFD = _aSO.getFontDescriptor(); + if (aFD != null) + { + xFixedText.setFontDescriptor(aFD); + copyProperties(_aSO.getParent(), xFixedText); + } + nHeight = _aSO.getHeight(LayoutConstants.LabelHeight); + } + } + xFixedText.setLabel(_sLabel); + + xFixedText.setPositionX(_aRect.X); + xFixedText.setPositionY(_aRect.Y); + + // Width will calculate from outside. + // We have to set, because there exist no right default (0) + xFixedText.setWidth(_nWidth); + _aRect.X += _nWidth; + xFixedText.setHeight(nHeight); + _xSection.add(xFixedText); + } + catch (com.sun.star.uno.Exception e) + { + // TODO: Exception not set. + int dummy = 0; + } + } + return _aRect; + } + // ------------------------------------------------------------------------- + protected String convertToFieldName(String _sElementName) + { + final StringBuffer aDataField = new StringBuffer(32); + aDataField.append("field:[").append(_sElementName).append(']'); + return aDataField.toString(); + + } + protected String convertFromFieldName(String _sName) + { + if (_sName.startsWith("field:[")) + { + int nCloseBrace = _sName.lastIndexOf("]"); + final String sName = _sName.substring(7, nCloseBrace).trim(); + return sName; + } + return _sName; + } + // ------------------------------------------------------------------------- + /** + * Insert a already formatted field name into a given section + * + * Use 'convertToFieldName(dbfield)' to convert a dbfield name in the right. + * + * @param _xSection in which section the formatted field will store + * @param _sFormattedfield as String a dbfield or an other function + * @param _aRect .X, .Y are the absolute position (1/100mm) where the formatted field will set + * @param _nWidth the width of the field in 1/100mm + * @param _aSO + * @return a new Rectangle with the new Rect.X position, Rect.Y will not change. + */ + protected Rectangle insertFormattedField(XSection _xSection, String _sFormattedfield, Rectangle _aRect, int _nWidth, SectionObject _aSO) + { + return insertFormattedField(_xSection, _sFormattedfield, _aRect, _nWidth, _aSO, (short) com.sun.star.awt.TextAlign.LEFT); + } + + protected Rectangle insertFormattedField(XSection _xSection, String _sFormattedfield, Rectangle _aRect, int _nWidth, SectionObject _aSO, short _nAlignment) + { + if (_xSection != null) + { + try + { + Object aField; + int nHeight = LayoutConstants.FormattedFieldHeight; + + int nType = getTypeFromFieldName(convertFromFieldName(_sFormattedfield)); + if (nType == DataType.BINARY || + nType == DataType.VARBINARY || + nType == DataType.LONGVARBINARY) + { + aField = getMSFofReportDefinition().createInstance("com.sun.star.report.ImageControl"); + nHeight = LayoutConstants.BinaryHeight; + } + else + { + aField = getMSFofReportDefinition().createInstance("com.sun.star.report.FormattedField"); + nHeight = LayoutConstants.FormattedFieldHeight; + if (nType == DataType.LONGVARCHAR) /* memo */ + { + nHeight = LayoutConstants.MemoFieldHeight; // special case for memo + } + } + _aRect.Height = nHeight; + + final XReportControlModel xReportControlModel = (XReportControlModel) UnoRuntime.queryInterface(XReportControlModel.class, aField); + if (xReportControlModel != null) + { + // #i86907# not documented right in idl description. + xReportControlModel.setDataField(_sFormattedfield); + if (_aSO != null) + { + // TODO: there seems to be some problems with copy all properties from the design template to the current design + final FontDescriptor aFD = _aSO.getFontDescriptor(); + if (aFD != null) + { + xReportControlModel.setFontDescriptor(aFD); + copyProperties(_aSO.getParent(), xReportControlModel); + } + nHeight = _aSO.getHeight(nHeight); + } + xReportControlModel.setPositionX(_aRect.X); + xReportControlModel.setPositionY(_aRect.Y); + xReportControlModel.setWidth(_nWidth); + _aRect.X += _nWidth; + xReportControlModel.setHeight(nHeight); + + if (nType == DataType.BINARY || + nType == DataType.VARBINARY || + nType == DataType.LONGVARBINARY) + { + // aField = getMSFofReportDefinition().createInstance("com.sun.star.report.ImageControl"); + final XImageControl xImageControl = (XImageControl) UnoRuntime.queryInterface(XImageControl.class, xReportControlModel); + if (xImageControl != null) + { + // xImageControl.setScaleImage(true); + + xImageControl.setScaleMode(com.sun.star.awt.ImageScaleMode.Isotropic); + } + } + else + { + try + { + xReportControlModel.setParaAdjust(_nAlignment); + // if (nType == DataType.LONGVARCHAR) + // { + // xReportControlModel.??? + // } + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + // seems we not able to set ParaAdjust + } + } + // spezial case rpt:now() (default date format) + if (_sFormattedfield.equals("rpt:now()")) + { + final XFormattedField xFormattedField = (XFormattedField) UnoRuntime.queryInterface(XFormattedField.class, xReportControlModel); + + XNumberFormatsSupplier x = xFormattedField.getFormatsSupplier(); + XNumberFormats xFormats = x.getNumberFormats(); + XNumberFormatTypes x3 = (XNumberFormatTypes) UnoRuntime.queryInterface(XNumberFormatTypes.class, xFormats); + Locale.getDefault(); + com.sun.star.lang.Locale aLocale = new com.sun.star.lang.Locale(); + aLocale.Country = Locale.getDefault().getCountry(); + aLocale.Language = Locale.getDefault().getLanguage(); + + int nFormat = x3.getStandardFormat(com.sun.star.util.NumberFormat.DATE, aLocale); + xFormattedField.setFormatKey(nFormat); + } + _xSection.add(xReportControlModel); + } + } + catch (com.sun.star.uno.Exception e) + { + // TODO: Exception not set. + int dummy = 0; + } + } + return _aRect; + } + + // ------------------------------------------------------------------------- +// TODO: check with Query, this code will not work with Queries + public void setTableName(int _aType, String _sTableName) + { + m_aCommandType = _aType; + m_sTableName = _sTableName; + + // getReportDefinition().setCommandType(com.sun.star.sdb.CommandType.TABLE); + getReportDefinition().setCommandType(_aType); + getReportDefinition().setCommand(_sTableName); + } // ------------------------------------------------------------------------- + protected XMultiServiceFactory m_xMSF; + + protected XMultiServiceFactory getMSFofReportDefinition() + { + if (m_xMSF == null) + { + final XMultiServiceFactory xMSF = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, getReportDefinition()); + m_xMSF = xMSF; + } + return m_xMSF; + } + // ------------------------------------------------------------------------- + protected Rectangle insertVerticalLine(XSection _xSection, Rectangle _aRect, int _nWidth, int _nHeight) + { + return insertLine(_xSection, _aRect, _nWidth, _nHeight, 1); + } + + protected Rectangle insertHorizontalLine(XSection _xSection, Rectangle _aRect, int _nWidth, int _nHeight) + { + return insertLine(_xSection, _aRect, _nWidth, _nHeight, 0); + } + + protected Rectangle insertLine(XSection _xSection, Rectangle _aRect, int _nWidth, int _nHeight, int _nOrientation) + { + if (_xSection != null) + { + try + { + final Object aFixedLine = getMSFofReportDefinition().createInstance("com.sun.star.report.FixedLine"); + final XFixedLine xFixedLine = (XFixedLine) UnoRuntime.queryInterface(XFixedLine.class, aFixedLine); + + xFixedLine.setOrientation(_nOrientation); + // TODO: line width is fixed + xFixedLine.setLineWidth(8); + + xFixedLine.setPositionX(_aRect.X); + xFixedLine.setPositionY(_aRect.Y); + + xFixedLine.setWidth(_nWidth); + _aRect.X += _nWidth; + xFixedLine.setHeight(_nHeight); + _xSection.add(xFixedLine); + } + catch (com.sun.star.uno.Exception e) + { + // TODO: Exception not set. + int dummy = 0; + } + } + return _aRect; + } + // ------------------------------------------------------------------------- + protected void clearReportHeader() + { + XSection xSection; + try + { + if (getReportDefinition().getReportHeaderOn()) + { + xSection = getReportDefinition().getReportHeader(); + emptySection(xSection); + } + } + catch (com.sun.star.container.NoSuchElementException e) + { + // Exception not set. Not really from interest. + } + } + + protected void insertReportHeader() + { + if (getDesignTemplate() != null) + { + if (getDesignTemplate().getReportHeaderOn()) + { + // copy all Section information from Page Header to our Header + try + { + XSection xForeignSection = getDesignTemplate().getReportHeader(); + + if (xForeignSection != null) + { + getReportDefinition().setReportHeaderOn(true); + XSection xSection = getReportDefinition().getReportHeader(); + + // copy Sections + copySection(xForeignSection, xSection); + } + } + catch (Exception e) + { + } + } + else + { + // we won't a page header + getReportDefinition().setReportHeaderOn(false); + } + } + } + + protected void clearReportFooter() + { + XSection xSection; + try + { + if (getReportDefinition().getReportFooterOn()) + { + xSection = getReportDefinition().getReportFooter(); + emptySection(xSection); + } + } + catch (com.sun.star.container.NoSuchElementException e) + { + // Exception not set. Not really from interest. + } + } + + protected void insertReportFooter() + { + if (getDesignTemplate() != null) + { + if (getDesignTemplate().getReportFooterOn()) + { + // copy all Section information from Page Header to our Header + try + { + XSection xForeignSection = getDesignTemplate().getReportFooter(); + + if (xForeignSection != null) + { + getReportDefinition().setReportFooterOn(true); + XSection xSection = getReportDefinition().getReportFooter(); + + // copy Sections + copySection(xForeignSection, xSection); + } + } + catch (Exception e) + { + } + } + else + { + // we won't a page header + getReportDefinition().setReportFooterOn(false); + } + } + } + // ------------------------------------------------------------------------- + protected void clearPageHeader() + { + XSection xSection; + try + { + if (getReportDefinition().getPageHeaderOn()) + { + xSection = getReportDefinition().getPageHeader(); + emptySection(xSection); + } + } + catch (com.sun.star.container.NoSuchElementException e) + { + // Exception not set. Not really from interest. + } + } + +// protected static String getDateString(String _sFormat) +// { +// GregorianCalendar aCalendar = new GregorianCalendar(); +// StringBuffer aBuf = new StringBuffer(); +// +// Locale aLocale = new Locale("en","US"); +// SimpleDateFormat aFormat = new SimpleDateFormat(_sFormat, aLocale); +// aBuf = aFormat.format(aCalendar.getTime(), aBuf, new FieldPosition(0) ); +// // DebugHelper.writeInfo("Date: " + aBuf.toString()); +// return aBuf.toString(); +// } + +// protected String getCurrentDate() +// { +// Calendar aCalendar = Calendar.getInstance(); +//// aCalendar.setTimeInMillis(1202382900000L); +//// aCalendar. +// Date aDate = new Date(); +// String sDate = DateFormat.getDateInstance().format(aDate); +// // String aCalStr = aCalendar.toString(); +// return sDate; +// // +//// Date aDate = new Date(); +//// aDate.setSeconds(0); +//// aDate.setMinutes(15); +//// aDate.setHours(12); +//// // aDate.setMonth(2); +//// // aDate.setYear(2008); +//// // aDate.setDay(7); +//// long nTime = aDate.getTime(); +//// Long aLong = new Long(nTime); +//// String aStr = aLong.toString(); +//// +//// Date aNewDate = new Date(1202382900000L); +////// aNewDate. +//// String aDateStr = aNewDate.toString(); +////// Datetime aNewTime = new Time(1202382900); +////// String aTimeStr = aNewTime.toString(); +//// +// +// } + protected void clearPageFooter() + { + XSection xSection; + try + { + if (getReportDefinition().getPageFooterOn()) + { + xSection = getReportDefinition().getPageFooter(); + emptySection(xSection); + } + } + catch (com.sun.star.container.NoSuchElementException e) + { + // Exception not set. Should not from interest here. + } + } + + public void setPageOrientation(int _nOrientation) + { + final int nWidth = getFromPageStyles("Width", 0); + final int nHeight = getFromPageStyles("Height", 0); + + if (com.sun.star.wizards.report.ReportLayouter.SOOPTLANDSCAPE == _nOrientation) + { + setToPageStyles("IsLandscape", Boolean.TRUE); + if (nWidth < nHeight) + { + setToPageStyles("Width", new Integer(nHeight)); + setToPageStyles("Height", new Integer(nWidth)); + } + } + else + { + setToPageStyles("IsLandscape", Boolean.FALSE); + if (nHeight < nWidth) + { + setToPageStyles("Width", new Integer(nHeight)); + setToPageStyles("Height", new Integer(nWidth)); + } + } + // dirty the PageWidth + m_nPageWidth = -1; + } + + /** + * Returns the width and height of a given string (_sText) in 1/100mm drawn in the given font descriptor. + * TODO: This function is a performance leak, we could store already calculated values in a map, to build a cache. Access should be much faster then. + * + * @param _sText + * @param _aFont + * @return width of given text in 1/100mm + */ + Size getPreferredSize(String _sText, FontDescriptor _aFont) + { + Size aSizeMM_100TH = new Size(0, 0); + try + { + // Object aControlContainer = getGlobalMSF().createInstance("com.sun.star.awt.UnoControlContainer"); + // XControlContainer xControlContainer = (XControlContainer)UnoRuntime.queryInterface(XControlContainer.class, aControlContainer); + + final Object aFixedTextModel = getGlobalMSF().createInstance("com.sun.star.awt.UnoControlFixedTextModel"); + final XControlModel xFixedTextModel = (XControlModel) UnoRuntime.queryInterface(XControlModel.class, aFixedTextModel); + + final PropertySetHelper aPropertySetHelper = new PropertySetHelper(xFixedTextModel); +// aPropertySetHelper.showProperties(); + aPropertySetHelper.setPropertyValueDontThrow("FontDescriptor", _aFont); + + final Object aUnoCtrlFixedText = getGlobalMSF().createInstance("com.sun.star.awt.UnoControlFixedText"); +// XServiceInfo xServiceInfo2 = (XServiceInfo)UnoRuntime.queryInterface(XServiceInfo.class, aUnoCtrlFixedText); +// String[] sServices2 = xServiceInfo2.getSupportedServiceNames(); + + final XWindow xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, aUnoCtrlFixedText); + xWindow.setVisible(false); + + final XControl xControl = (XControl) UnoRuntime.queryInterface(XControl.class, aUnoCtrlFixedText); + xControl.setModel(xFixedTextModel); + + final com.sun.star.awt.XFixedText xFixedText = (com.sun.star.awt.XFixedText) UnoRuntime.queryInterface(com.sun.star.awt.XFixedText.class, aUnoCtrlFixedText); + xFixedText.setText(_sText); + + final XLayoutConstrains xLayoutConstraints = (XLayoutConstrains) UnoRuntime.queryInterface(XLayoutConstrains.class, aUnoCtrlFixedText); + final Size aSizeInPixel = xLayoutConstraints.getPreferredSize(); + + final XWindowPeer xPeerOfReportDefinition = (XWindowPeer) UnoRuntime.queryInterface(XWindowPeer.class, getReportDefinition().getCurrentController().getFrame().getComponentWindow()); + xControl.createPeer(null, xPeerOfReportDefinition); + + final XWindowPeer x = xControl.getPeer(); + + final XUnitConversion xConversion = (XUnitConversion) UnoRuntime.queryInterface(XUnitConversion.class, x); + aSizeMM_100TH = xConversion.convertSizeToLogic(aSizeInPixel, com.sun.star.util.MeasureUnit.MM_100TH); + // xToolkit.createScreenCompatibleDevice(_nWidth, _nWidth). + // XWindow x = getReportDefinition().getCurrentController().getFrame().getContainerWindow(); + // Object aObj = _xSection.getParent(); + + // we don't need the created objects any longer + final XComponent xFixedTextDeleter = (XComponent) UnoRuntime.queryInterface(XComponent.class, xFixedText); + xFixedTextDeleter.dispose(); + + final XComponent xFixedTextModelDeleter = (XComponent) UnoRuntime.queryInterface(XComponent.class, aFixedTextModel); + xFixedTextModelDeleter.dispose(); + } + catch (Exception e) + { + // TODO: Exception not set. + } + return aSizeMM_100TH; + } + + protected String getTableName() + { + if (m_sTableName != null) + { + return m_sTableName; + } + return ""; + } + + protected String getUserNameFromConfiguration() + { + String sFirstName = ""; + String sLastName = ""; + try + { + Object oProdNameAccess = Configuration.getConfigurationRoot(getGlobalMSF(), "org.openoffice.UserProfile/Data", false); + sFirstName = (String) Helper.getUnoObjectbyName(oProdNameAccess, "givenname"); + sLastName = (String) Helper.getUnoObjectbyName(oProdNameAccess, "sn"); + } + catch (Exception exception) + { + exception.printStackTrace(System.out); + } + return sFirstName + " " + sLastName; + } + + /** + * Helper function, to copy all not read only properties of _xFromSection to _xToSection + * @param _xFromSection + * @param _xToSection + */ + private void copyProperties(Object _aFrom, Object _aTo) + { + XPropertySet xFrom = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, _aFrom); + XPropertySet xTo = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, _aTo); + + + XPropertySetInfo xForeignPropInfo = xFrom.getPropertySetInfo(); + XPropertySetInfo xSectionPropInfo = xTo.getPropertySetInfo(); + Property[] aAllProperties = xForeignPropInfo.getProperties(); + for (int i = 0; i < aAllProperties.length; i++) + { + String sPropertyName = aAllProperties[i].Name; + if (xSectionPropInfo.hasPropertyByName(sPropertyName)) + { + try + { + Property aDestProp = xForeignPropInfo.getPropertyByName(sPropertyName); + if ((aDestProp.Attributes & PropertyAttribute.READONLY) == 0) + { + xTo.setPropertyValue(sPropertyName, xFrom.getPropertyValue(sPropertyName)); + } + } + catch (Exception e) + { + } + } + } + } + + /** + * Helper Funktion to copy the whole content of _xFromSection to the _xToSection + * @param _xFromSection + * @param _xToSection + */ + private void copySection(XSection _xFromSection, XSection _xToSection) + { + copyProperties(_xFromSection, _xToSection); + + try + { + XEnumeration xEnum = _xFromSection.createEnumeration(); + while (xEnum.hasMoreElements()) + { + Object aEnumObj = xEnum.nextElement(); + XReportComponent aComponent = (XReportComponent) UnoRuntime.queryInterface(XReportComponent.class, aEnumObj); + + // XCloneable aClone = (XCloneable)UnoRuntime.queryInterface(XCloneable.class, aEnumObj); + if (aComponent != null) + { + Object aClone = aComponent.createClone(); + if (aClone != null) + { + String sName = aComponent.getName(); + com.sun.star.awt.Point aPosition = aComponent.getPosition(); + Size aSize = aComponent.getSize(); + + XShape aShape = (XShape) UnoRuntime.queryInterface(XShape.class, aClone); + String sShapeType = aShape.getShapeType(); + com.sun.star.awt.Point aShapePoint = aShape.getPosition(); + Size aShapeSize = aShape.getSize(); + + // normally 'createClone' will create a real clone of the component, + // but there seems some problems, we have to controll. + copyProperties(aComponent, aClone); + + // aShape.setPosition(aComponent.getPosition()); + // aShape.setSize(aComponent.getSize()); + _xToSection.add(aShape); + } + } + } + } + catch (Exception e) + { + } + // String sName = xForeignSection.getName(); + // int dummy = 0; + } + + protected void insertPageHeader() + { + if (getDesignTemplate() != null) + { + if (getDesignTemplate().getPageHeaderOn()) + { + // copy all Section information from Page Header to our Header + try + { + XSection xForeignSection = getDesignTemplate().getPageHeader(); + + if (xForeignSection != null) + { + getReportDefinition().setPageHeaderOn(true); + XSection xSection = getReportDefinition().getPageHeader(); + + // copy Sections + copySection(xForeignSection, xSection); + } + } + catch (Exception e) + { + } + return; + } + else + { + // we won't a page header + // getReportDefinition().setPageHeaderOn(true); + getReportDefinition().setPageHeaderOn(false); + } + } + else + { + if (getReportDefinition() == null) + { + return; + } + // there is no foreign report definition + // TODO: #i86902# rpt:Title() out of the document + + // TODO: #i86902# rpt:Author() can't set with something like rpt:author() + // TODO: #i86902# more fieldnames need. + final String sTitleTitle = getResource().getResText(UIConsts.RID_REPORT + 86); // "Title:" + final String sTitle = getTableName(); // "Default title, this is a first draft report generated by the new report wizard."; + final String sAuthorTitle = getResource().getResText(UIConsts.RID_REPORT + 87); // "Author:" + final String sAuthor = getUserNameFromConfiguration(); // "You"; // rpt:fieldvalue(); + final String sDateTitle = getResource().getResText(UIConsts.RID_REPORT + 88); // "Date:" + // TODO: #i86911# Date: we need to set the style of the date. + final String sDate = "rpt:now()"; // getDateString("EEE, d MMM yyyy HH:mm:ss zzzz"); + + try + { + getReportDefinition().setPageHeaderOn(true); + XSection xSection = null; + xSection = getReportDefinition().getPageHeader(); + + Rectangle aRect = new Rectangle(); + aRect.X = getLeftPageIndent(); + SectionObject aSOLabel = SectionEmptyObject.create(); + aSOLabel.setFontToBold(); + aRect.Y = aSOLabel.getHeight(LayoutConstants.LabelHeight); + + final int nWidth = 3000; + + aRect = insertLabel(xSection, sTitleTitle, aRect, nWidth, aSOLabel); + + final int nTitleWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - 3000; + // aRect = insertFormattedField(xSection, "rpt:Title()", aRect, nTitleWidth); + aRect = insertLabel(xSection, sTitle, aRect, nTitleWidth, aSOLabel); + + aRect.Y += aSOLabel.getHeight(LayoutConstants.LabelHeight) + LayoutConstants.LineHeight; + + aRect.X = getLeftPageIndent(); + aRect = insertLabel(xSection, sAuthorTitle, aRect, nWidth, aSOLabel); + // aRect = insertFormattedField(xSection, "rpt:Author()", aRect, nWidth); + aRect = insertLabel(xSection, sAuthor, aRect, nTitleWidth, aSOLabel); + + aRect.Y += aSOLabel.getHeight(LayoutConstants.LabelHeight); + + aRect.X = getLeftPageIndent(); + aRect = insertLabel(xSection, sDateTitle, aRect, nWidth, aSOLabel); + // aRect = insertFormattedField(xSection, "rpt:Date()", aRect, nWidth); + aRect = insertFormattedField(xSection, sDate, aRect, nTitleWidth, aSOLabel); + + aRect.Y += aSOLabel.getHeight(LayoutConstants.FormattedFieldHeight) + LayoutConstants.LineHeight; + + // draw a line under the label/formattedfield + aRect.X = getLeftPageIndent(); + final int nLineWidth = getPageWidth() - getRightPageIndent() - aRect.X; + final int nLineHeight = LayoutConstants.LineHeight; + insertHorizontalLine(xSection, aRect, nLineWidth, nLineHeight); + + aRect.Y += nLineHeight; + + xSection.setHeight(aRect.Y); + } + catch (com.sun.star.uno.Exception e) + { + // TODO: Exception not set. + } + } + } + + protected void insertPageFooter() + { + if (getDesignTemplate() != null) + { + if (getDesignTemplate().getPageFooterOn()) + { + try + { + XSection xForeignSection = getDesignTemplate().getPageFooter(); + + if (xForeignSection != null) + { + getReportDefinition().setPageFooterOn(true); + XSection xSection = getReportDefinition().getPageFooter(); + + // copy Sections + copySection(xForeignSection, xSection); + } + } + catch (Exception e) + { + } + } + else + { + // getReportDefinition().setPageFooterOn(true); + getReportDefinition().setPageFooterOn(false); + } + } + else + { + if (getReportDefinition() == null) + { + return; + } + + // TODO: how should we arrive this code (set page and pagecount in the middle of the page footer) + // If there exists a design template, don't use it. + + // we don't have a default report definition + final String sPageOf = getResource().getResText(UIConsts.RID_REPORT + 89); // 'Page #page# of #count#' + + // Convert + // 'Page #page# of #count#' + // to something like + // '\"Page \" & PageNumber() & \" of \" & PageCount()' + // due to the fact that is is not fixed, where #page# or #count# occurs, we make it + // a little bit trickier. + // we first surround the string with double quotes, + // second, replace the #...# + // last, we remove double 'double quotes'. + final String sSurroundDoubleQuotes = "\"" + sPageOf + "\""; + final String sPageNumber = sSurroundDoubleQuotes.replaceAll("#page#", "\" & PageNumber() & \""); + final String sPageCount = sPageNumber.replaceAll("#count#", "\" & PageCount() & \""); + final String sNoLastUnusedQuotes = sPageCount.replaceAll(" & \\\"\\\"", ""); + final String sNoFirstUnusedQuotes = sNoLastUnusedQuotes.replaceAll("\\\"\\\" & ", ""); + + final int nUsablePageWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent(); + + try + { + getReportDefinition().setPageFooterOn(true); + XSection xSection = null; + xSection = getReportDefinition().getPageFooter(); + + Rectangle aRect = new Rectangle(); + aRect.X = getLeftPageIndent(); + + // draw a line over the label/formattedfield + final int nLineWidth = getPageWidth() - getRightPageIndent() - aRect.X; + final int nLineHeight = LayoutConstants.LineHeight; + insertHorizontalLine(xSection, aRect, nLineWidth, nLineHeight); + + aRect.Y += nLineHeight; + aRect.Y += LayoutConstants.LabelHeight; + + final int nWidth = nUsablePageWidth; + aRect.X = getLeftPageIndent(); + + aRect = insertFormattedField(xSection, "rpt:" + sNoFirstUnusedQuotes, aRect, nWidth, null, (short) com.sun.star.awt.TextAlign.CENTER); + + aRect.Y += LayoutConstants.FormattedFieldHeight + LayoutConstants.LineHeight; + xSection.setHeight(aRect.Y); + } + catch (Exception e) + { + // TODO: Exception not set. + } + } + } + + protected Resource getResource() + { + return m_aResource; + } + protected int m_aCommandType; // Table or Query + protected String m_sTableName; + protected String[] m_aGroupNames; + protected String[] m_aFieldNames; + protected String[] m_aFieldTitleNames; + protected int[] m_aFieldWidths; + protected int[] m_aFieldTypes; + // protected int[] m_nLeftIndent; + private DesignTemplate m_xDesignTemplate = null; + + public void initializeData(IReportBuilderLayouter _aOther) + { + if (_aOther instanceof ReportBuilderLayouter) + { + final ReportBuilderLayouter aOther = (ReportBuilderLayouter) _aOther; + m_aCommandType = aOther.m_aCommandType; + m_sTableName = aOther.m_sTableName; + m_aGroupNames = aOther.m_aGroupNames; + m_aFieldNames = aOther.m_aFieldNames; + m_aFieldTitleNames = aOther.m_aFieldTitleNames; + m_aFieldWidths = aOther.m_aFieldWidths; + m_aFieldTypes = aOther.m_aFieldTypes; + // m_nLeftIndent = aOther.m_nLeftIndent; + m_xDesignTemplate = aOther.m_xDesignTemplate; + + // dirty PageWidth + m_nPageWidth = -1; + } + } + + /** + * Get the maximal label width of all labels + * @return the width in 1/100mm + */ + protected int getMaxLabelWidth() + { + int nWidth = 0; + final String[] aFieldTitles = m_aFieldTitleNames; // we want all Field Titles here // getFieldTitleNames(); + for (int i = 0; i < aFieldTitles.length; i++) + { + final String sLabel = aFieldTitles[i]; + nWidth = Math.max(nWidth, getLabelWidth(sLabel)); + } + for (int i = 0; i < m_aGroupNames.length; i++) + { + final String sGroupName = m_aGroupNames[i]; + final SectionObject a = getDesignTemplate().getGroupLabel(i); + final FontDescriptor aFD = a.getFontDescriptor(); + nWidth = Math.max(nWidth, getLabelWidth(sGroupName, aFD)); + } + + if (nWidth == 0) + { + nWidth = 3000; + } + else + { + nWidth += 500; + } + return nWidth; + } + + /** + * Get width of a given string (Label) in 1/100mm + * @param _sLabel + * @return the width in 1/100mm + */ + protected int getLabelWidth(String _sLabel) + { + return getLabelWidth(_sLabel, 0.0f, 0.0f); + } + XFixedText m_aFixedTextHelper = null; + HashMap m_aLabelWidthMap; + + protected int getLabelWidth(String _sLabel, FontDescriptor _aFD) + { + float fCharWeight = 0.0f; + float fCharHeight = 0.0f; + if (_aFD != null) + { + fCharWeight = _aFD.Weight; + fCharHeight = _aFD.Height; + } + return getLabelWidth(_sLabel, fCharWeight, fCharHeight); + } + + protected int getLabelWidth(String _sLabel, float _nCharWeight, float _nCharHeight) + { + int nWidth = 0; + + if (m_aLabelWidthMap == null) + { + m_aLabelWidthMap = new HashMap(); + } + // At first, try to get the Width out of a HashMap (Cache) + StringBuffer aKey = new StringBuffer(40); + final String sKey = aKey.append(_sLabel).append(_nCharWeight).append(_nCharHeight).toString(); + if (m_aLabelWidthMap.containsKey(sKey)) + { + final Object aWidth = m_aLabelWidthMap.get(sKey); + final Integer aIntegerWidth = (Integer) aWidth; + nWidth = aIntegerWidth.intValue(); + } + else + { + try + { + if (m_aFixedTextHelper == null) + { + final Object aFixedText = getMSFofReportDefinition().createInstance("com.sun.star.report.FixedText"); + m_aFixedTextHelper = (XFixedText) UnoRuntime.queryInterface(XFixedText.class, aFixedText); + } + + m_aFixedTextHelper.setLabel(_sLabel); + if (_nCharWeight > 0.1f) + { + m_aFixedTextHelper.setCharWeight(_nCharWeight); + } + if (_nCharHeight > 0.1f) + { + m_aFixedTextHelper.setCharHeight(_nCharHeight); + } + + final FontDescriptor xFont = m_aFixedTextHelper.getFontDescriptor(); + final Size aSize = getPreferredSize(_sLabel, xFont); + nWidth = aSize.Width; + // cache the found width + m_aLabelWidthMap.put(sKey, new Integer(nWidth)); + } + catch (com.sun.star.uno.Exception e) + { + // TODO: Exception not set. + } + } + return nWidth; + } + + protected void doNotBreakInTable(Object _xSectionOrGroup) + { +// try +// { +// _xSection.setKeepTogether(true); + final PropertySetHelper aHelper = new PropertySetHelper(_xSectionOrGroup); + aHelper.setPropertyValueDontThrow("KeepTogether", Boolean.TRUE); +// } +// catch (com.sun.star.uno.Exception e) +// { +// // Exception not set, but not really from interest. +// } + } + + protected DesignTemplate getDesignTemplate() + { + if (m_xDesignTemplate == null) + { + // initialise the report definition. + String sDefaultHeaderLayout = m_xReportDefinitionReadAccess.getDefaultHeaderLayout(); + loadAndSetBackgroundTemplate(sDefaultHeaderLayout); + + // copy all functions from the design template to the current report definition +// XFunctions xOtherFunctions = m_xDesignTemplate.getReportDefinition().getFunctions(); +// final int nFunctionCount = xOtherFunctions.getCount(); +// for (int i=0;i<nFunctionCount;i++) +// { +// try +// { +// Object aOtherFunction = xOtherFunctions.getByIndex(i); +// XFunctions xFunctions = getReportDefinition().getFunctions(); +// XFunction xFunction = xFunctions.createFunction(); +// +// copyProperties(aOtherFunction, xFunction); +// xFunctions.insertByIndex(xFunctions.getCount(), xFunction); +// } +// catch (com.sun.star.lang.IllegalArgumentException e) +// { +// } +// catch (IndexOutOfBoundsException ex) +// { +// ex.printStackTrace(); +// } +// catch (WrappedTargetException ex) +// { +// ex.printStackTrace(); +// } +// +// } + + } + return m_xDesignTemplate; + } + + /** + * If there already exists a foreign report definition, which we use to get the layout from + * close it. + * Veto is not allowed here. + */ + private void closeDesignTemplate() + { + if (m_xDesignTemplate != null) + { + m_xDesignTemplate.close(); + m_xDesignTemplate = null; + } + } + + /** + * load the given string as a template and use it's content to paint the other + * @param LayoutTemplatePath + */ + public void loadAndSetBackgroundTemplate(String LayoutTemplatePath) + { + closeDesignTemplate(); + + String sName = FileAccess.getFilename(LayoutTemplatePath); + if (sName.toLowerCase().equals("default.otr_") || + LayoutTemplatePath.equals("DefaultLayoutOfHeaders")) + { + // this is the default layout, we don't want to have a layout for this. + } + else + { + XMultiServiceFactory xMSF = getGlobalMSF(); + m_xDesignTemplate = DesignTemplate.create(xMSF, LayoutTemplatePath); + } + } +} + diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/SectionEmptyObject.java b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionEmptyObject.java new file mode 100644 index 000000000000..8df754795e63 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionEmptyObject.java @@ -0,0 +1,55 @@ +/* + * *********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + * ********************************************************************** + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.FontDescriptor; + +/** + * + * @author ll93751 + */ +public class SectionEmptyObject extends SectionObject +{ + + protected SectionEmptyObject() + { + m_aParentObject = null; + } + + public static SectionObject create() + { + SectionEmptyObject a = new SectionEmptyObject(); + return a; + } + + public FontDescriptor getFontDescriptor() + { + return null; + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/SectionLabel.java b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionLabel.java new file mode 100644 index 000000000000..ae3766fd3391 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionLabel.java @@ -0,0 +1,74 @@ +/* + * *********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + * ********************************************************************** + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.FontDescriptor; +import com.sun.star.report.XFixedText; +// import com.sun.star.wizards.common.PropertySetHelper; +/** + * + * @author ll93751 + */ +public class SectionLabel extends SectionObject +{ + + protected SectionLabel(XFixedText _aFixedText) + { + m_aParentObject = _aFixedText; + // We would like to know, what properties are in this object. +// PropertySetHelper aHelper = new PropertySetHelper(_aFixedText); +// aHelper.showProperties(); + } + + public static SectionObject create(XFixedText _aFixedText) + { + final SectionLabel a = new SectionLabel(_aFixedText); + return a; + } + + /** + * Return the current FontDescriptor + * @return + */ + public FontDescriptor getFontDescriptor() + { + FontDescriptor a = null; + try + { + final XFixedText aLabel = (XFixedText) getParent(); + a = aLabel.getFontDescriptor(); + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + } + return a; + } +} + + diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/SectionObject.java b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionObject.java new file mode 100644 index 000000000000..fa33e85d39cb --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionObject.java @@ -0,0 +1,86 @@ +/* + * *********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + * ********************************************************************** + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.FontDescriptor; +import com.sun.star.wizards.common.PropertySetHelper; + +/** + * + * @author ll93751 + */ +abstract public class SectionObject +{ + + Object m_aParentObject; // this could be FixedText or FormattedField or null + PropertySetHelper m_aPropertySetHelper; + + public SectionObject() + { + m_aParentObject = null; + } + + protected Object getParent() + { + return m_aParentObject; + } + + abstract public FontDescriptor getFontDescriptor(); + + private PropertySetHelper getPropertySetHelper() + { + if (m_aPropertySetHelper == null) + { + m_aPropertySetHelper = new PropertySetHelper(getParent()); + } + return m_aPropertySetHelper; + } + + public int getHeight(int _nDefault) + { + final int nHeight = getPropertySetHelper().getPropertyValueAsInteger("Height", _nDefault); + return nHeight; + } + + public float getCharWeight(float _nDefault) + { + final float fCharWeight = (float) getPropertySetHelper().getPropertyValueAsDouble("CharWeight", _nDefault); + return fCharWeight; + } + + public void setFontToBold() + { + setPropertyValue("CharWeight", new Float(com.sun.star.awt.FontWeight.BOLD)); + } + + public void setPropertyValue(String _sKey, Object _nValue) + { + getPropertySetHelper().setPropertyValueDontThrow(_sKey, _nValue); + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/SectionTextField.java b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionTextField.java new file mode 100644 index 000000000000..2a11fcd56f04 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionTextField.java @@ -0,0 +1,67 @@ +/* + * *********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + * ********************************************************************** + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.FontDescriptor; +import com.sun.star.report.XFormattedField; + +/** + * + * @author ll93751 + */ +public class SectionTextField extends SectionObject +{ + + protected SectionTextField(XFormattedField _aFormattedField) + { + m_aParentObject = _aFormattedField; + // We would like to know, what properties are in this object. + } + + public static SectionObject create(XFormattedField _aFormattedField) + { + SectionTextField a = new SectionTextField(_aFormattedField); + return a; + } + + public FontDescriptor getFontDescriptor() + { + FontDescriptor a = null; + try + { + XFormattedField aField = (XFormattedField) getParent(); + a = aField.getFontDescriptor(); + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + } + return a; + } +} + diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/Tabular.java b/wizards/com/sun/star/wizards/reportbuilder/layout/Tabular.java new file mode 100644 index 000000000000..0fe168b28263 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/Tabular.java @@ -0,0 +1,154 @@ +/* + ************************************************************************ + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.Rectangle; +import com.sun.star.report.XGroup; +import com.sun.star.report.XGroups; +import com.sun.star.report.XSection; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.UIConsts; + +/** + * + * @author ll93751 + */ +public class Tabular extends ReportBuilderLayouter +{ + + public Tabular(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + public String getName() + { + return "DefaultLayoutOfData"; + } + + public String getLocalizedName() + { + String sLocalizedName = getResource().getResText(UIConsts.RID_REPORT + 80); + return sLocalizedName; + } + + protected void insertDetailFields() + { + copyDetailProperties(); + + String[] aFieldNames = getFieldNames(); + if (aFieldNames == null) + { + return; + } + if (aFieldNames.length == 0) + { + return; + } +// int nGroups = getReportDefinition().getGroups().getCount(); + + final XSection xSection = getReportDefinition().getDetail(); + + Rectangle aRect = new Rectangle(); + aRect.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + final int nWidth = calculateFieldWidth(getLeftGroupIndent(getCountOfGroups()), aFieldNames.length); + final SectionObject aSO = getDesignTemplate().getDetailTextField(); + int nHeight = LayoutConstants.FormattedFieldHeight; + for (int i = 0; i < aFieldNames.length; i++) + { + final String sFieldName = convertToFieldName(aFieldNames[i]); + aRect = insertFormattedField(xSection, sFieldName, aRect, nWidth, aSO); + nHeight = Math.max(aRect.Height, nHeight); + } + nHeight = Math.max(aSO.getHeight(nHeight), nHeight); + xSection.setHeight(nHeight); + } + + protected void insertDetailFieldTitles() + { + final String[] aFieldTitleNames = getFieldTitleNames(); + if (aFieldTitleNames == null) + { + return; + } + if (aFieldTitleNames.length == 0) + { + return; + } + final int nGroups = getReportDefinition().getGroups().getCount(); + try + { + XSection xSection = null; + SectionObject aSO = null; + if (nGroups == 0) + { + // Spezial case, there is no Group. + final XGroups xGroups = getReportDefinition().getGroups(); + final XGroup xGroup = xGroups.createGroup(); + xGroup.setHeaderOn(true); + + xGroups.insertByIndex(xGroups.getCount(), xGroup); + xSection = xGroup.getHeader(); + copyGroupProperties(0); + aSO = getDesignTemplate().getDetailLabel(); + aSO.setFontToBold(); + } + else + { + final XGroups xGroups = getReportDefinition().getGroups(); + // we insert the titles in the last group + final Object aGroup = xGroups.getByIndex(nGroups - 1); + final XGroup xGroup = (XGroup) UnoRuntime.queryInterface(XGroup.class, aGroup); + xSection = xGroup.getHeader(); + + // We don't need to copy the GroupProperties, because this is done in the insertGroup() member function + // copyGroupProperties(0); + aSO = getDesignTemplate().getGroupLabel(nGroups - 1); + } + + Rectangle aRect = new Rectangle(); +// TODO: getCountOfGroups() == nGroups??? + aRect.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + // TODO: group line is fix + aRect.Y = aSO.getHeight(LayoutConstants.LabelHeight) + LayoutConstants.LineHeight; // group height + a little empty line + final int nWidth = calculateFieldWidth(getLeftGroupIndent(getCountOfGroups()), aFieldTitleNames.length); + + for (int i = 0; i < aFieldTitleNames.length; i++) + { + aRect = insertLabel(xSection, aFieldTitleNames[i], aRect, nWidth, aSO); + } + xSection.setHeight(aSO.getHeight(LayoutConstants.LabelHeight) + LayoutConstants.LineHeight + aSO.getHeight(LayoutConstants.LabelHeight)); + } + catch (com.sun.star.uno.Exception e) + { + } + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/makefile.mk b/wizards/com/sun/star/wizards/reportbuilder/layout/makefile.mk new file mode 100644 index 000000000000..1af9e7c53862 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/makefile.mk @@ -0,0 +1,71 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ = ..$/..$/..$/..$/..$/.. +PRJNAME = wizards +TARGET = reportbuilderwizardlayouts +PACKAGE = com$/sun$/star$/wizards$/reportbuilder$/layout + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +#.INCLUDE : $(PRJ)$/util$/makefile.pmk + +JARFILES= unoil.jar jurt.jar ridl.jar juh.jar java_uno.jar commonwizards.jar report.jar + +# CUSTOMMANIFESTFILE= MANIFEST.MF + +JARCLASSDIRS = \ + com$/sun$/star$/wizards$/reportbuilder$/layout \ + com$/sun$/star$/wizards$/report + +# JARTARGET = $(TARGET).jar +# JARCLASSPATH = commonwizards.jar report.jar + +# --- Files -------------------------------------------------------- + +JAVAFILES= \ + LayoutConstants.java \ + ReportBuilderLayouter.java \ + Tabular.java \ + ColumnarSingleColumn.java \ + ColumnarTwoColumns.java \ + ColumnarThreeColumns.java \ + InBlocksLabelsAbove.java \ + InBlocksLabelsLeft.java \ + SectionObject.java \ + SectionEmptyObject.java \ + SectionLabel.java \ + SectionTextField.java \ + DesignTemplate.java + +JAVACLASSFILES = $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + |