 /*************************************************************************
 *
 *  $RCSfile: Dataimport.java,v $
 *
 *  $Revision: 1.26 $
 *
 *  last change: $Author: vg $ $Date: 2003-05-22 10:15:51 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library 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 for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 */

package com.sun.star.wizards.report;
import com.sun.star.wizards.common.TextDocument;
import com.sun.star.wizards.common.UNODialogs;
import com.sun.star.wizards.common.Tools;
import com.sun.star.wizards.common.TextDocument.UnknownHiddenControlException;
import com.sun.star.container.XIndexAccess;
import com.sun.star.container.XElementAccess;
import com.sun.star.container.XNameAccess;
import com.sun.star.container.XNamed;
import com.sun.star.container.XEnumerationAccess;
import com.sun.star.container.XEnumeration;
import com.sun.star.container.XNameContainer;
import com.sun.star.container.XIndexContainer;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.XMultiPropertySet;
import com.sun.star.comp.servicemanager.ServiceManager;
import com.sun.star.connection.XConnector;
import com.sun.star.connection.XConnection;
import com.sun.star.sdb.XCompletedConnection;
import com.sun.star.sdbcx.XColumnsSupplier;
import com.sun.star.sdbc.*;
import com.sun.star.sdb.XColumn;
import com.sun.star.sdb.*;
import com.sun.star.sdbc.XColumnLocate;
import com.sun.star.sdbcx.XTablesSupplier;
import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.uno.XInterface;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.uno.XNamingService;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.Any;
import com.sun.star.uno.*;
import com.sun.star.sheet.*;
import com.sun.star.document.XDocumentInfoSupplier;
import com.sun.star.document.XDocumentInfo;
import com.sun.star.document.XEventsSupplier;
import com.sun.star.document.*;
import com.sun.star.table.*;
import com.sun.star.sdb.*;
import com.sun.star.sdbc.XResultSet;
import com.sun.star.text.XTextFieldsSupplier;
import com.sun.star.text.XTextRange;
import com.sun.star.text.XTextTablesSupplier;
import com.sun.star.text.XTextCursor;
import com.sun.star.text.XTextContent;
import com.sun.star.text.XTextSectionsSupplier;
import com.sun.star.text.XTextViewCursorSupplier;
import com.sun.star.text.XTextViewCursor;
import com.sun.star.text.XSimpleText;
import com.sun.star.text.XTextViewCursorSupplier;
import com.sun.star.text.XPageCursor;
import com.sun.star.text.XText;
import com.sun.star.table.XCellRange;
import com.sun.star.task.XInteractionHandler;
import com.sun.star.task.XStatusIndicatorFactory;
import com.sun.star.task.XStatusIndicator;
import com.sun.star.util.XLinkUpdate;
import com.sun.star.util.XNumberFormats;
import com.sun.star.util.XNumberFormatsSupplier;
import com.sun.star.util.NumberFormat;
import com.sun.star.util.XRefreshable;
import com.sun.star.view.XViewSettingsSupplier;
import com.sun.star.form.XFormsSupplier;
import com.sun.star.drawing.XDrawPageSupplier;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.lang.Locale;
import com.sun.star.lang.XTypeProvider;
import com.sun.star.lang.*;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.EventObject;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XFramesSupplier;
import com.sun.star.frame.XModel;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XTextTable;
import com.sun.star.text.TableColumnSeparator;
import com.sun.star.script.XInvocation;
import com.sun.star.style.XStyleFamiliesSupplier;
import com.sun.star.style.XStyleLoader;
import com.sun.star.style.BreakType;
import com.sun.star.style.TabStop;
import com.sun.star.frame.XFrame;
import com.sun.star.awt.XListBox;
import com.sun.star.awt.XToolkit;
import com.sun.star.awt.XWindowPeer;
import com.sun.star.awt.Size;
import com.sun.star.awt.XTextComponent;
import com.sun.star.awt.XWindow;
import com.sun.star.awt.ActionEvent;
import com.sun.star.awt.XActionListener;



public class Dataimport extends ReportWizard{

    ReportDocument CurReportDocument;
    UNODialogs CurUNOProgressDialog;
    static boolean bStopProcess;
    static boolean brenamefirstTable = true;

    public Dataimport() {
    }

    class ActionListenerImpl implements com.sun.star.awt.XActionListener {

        public void disposing(EventObject eventObject) {
        }
        public void actionPerformed(ActionEvent actionEvent){
        bStopProcess = true;
        }
    }


    public static void main (String args[])
    {
        String ConnectStr = "uno:socket,host=localhost,port=8100;urp,negotiate=0,forcesynchronous=1;StarOffice.NamingService";
        XMultiServiceFactory xMSF = null;
        try {
            xMSF = Tools.connect(ConnectStr);
        if( xMSF != null )  System.out.println("Connected to "+ ConnectStr );
        Dataimport CurDataimport = new Dataimport();
        CurDataimport.createReport(xMSF);
        }
        catch(com.sun.star.uno.Exception e) {
            e.printStackTrace(System.out);
        }
        catch(java.lang.Exception javaexception ){
        javaexception.printStackTrace(System.out);
    }
    }


    public void showProgressDisplay(XMultiServiceFactory xMSF, boolean bgetConnection){
    try{
        int iHeight;
        CurUNOProgressDialog = new UNODialogs(xMSF, new String[] {"Height", "Step", "Title", "Width"},
                            new Object[] {new Integer(84), new Integer(0), sProgressTitle, new Integer(180)});
        com.sun.star.awt.FontDescriptor oFontDesc = new com.sun.star.awt.FontDescriptor();
        oFontDesc.Weight = com.sun.star.awt.FontWeight.BOLD;

        if (bgetConnection){
        CurUNOProgressDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblProgressDBConnection",
                            new String[] {"FontDescriptor", "Height", "Label", "PositionX", "PositionY", "Step", "Width"},
                            new Object[] {oFontDesc, new Integer(10), sProgressDBConnection, new Integer(6), new Integer(6), new Integer(0), new Integer(150)});

        CurUNOProgressDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblProgressDataImport",
                            new String[] {"Height", "Label", "PositionX", "PositionY", "Step", "Width"},
                            new Object[] {new Integer(10), sProgressDataImport, new Integer(6), new Integer(24), new Integer(0), new Integer(120)});
        }
        else{
        CurUNOProgressDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblProgressDataImport",
                        new String[] {"FontDescriptor", "Height", "Label", "PositionX", "PositionY", "Step", "Width"},
                        new Object[] {oFontDesc, new Integer(10), sProgressDataImport, new Integer(6), new Integer(24), new Integer(0), new Integer(120)});
        }

        CurUNOProgressDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblCurProgress",
                            new String[] {"Height", "Label", "PositionX", "PositionY", "Step", "Width"},
                            new Object[] {new Integer(10), "", new Integer(12), new Integer(42), new Integer(0), new Integer(120)});

        CurUNOProgressDialog.insertButton("cmdCancel", 10000, new ActionListenerImpl(),
                            new String[] {"Height", "HelpURL", "PositionX", "PositionY", "Step", "TabIndex", "Width", "Label"},
                            new Object[] {new Integer(14), "HID:34321", new Integer(74), new Integer(58), new Integer(0), new Short((short) 1), new Integer(40), sStop});
        CurUNOProgressDialog.createWindowPeer(CurReportDocument.xWindowPeer);
        CurUNOProgressDialog.calculateDialogPosition(CurReportDocument.xFrame.getComponentWindow().getPosSize());
        CurUNOProgressDialog.xWindow.setVisible(true);

    return;
    }
    catch(com.sun.star.uno.Exception exception)
    {
        exception.printStackTrace(System.out);
    return;
    }
    catch(java.lang.Exception jexception ){
    jexception.printStackTrace(System.out);
    return;
    }}


    public void importReportData(final XMultiServiceFactory xMSF, final Dataimport CurDataimport, final ReportDocument CurReportDocument){
/*    Thread ProgressThread = new Thread(new Runnable(CurUNOProgressDialog) {
        private UNODialogs dialog;
    public Runnable( UNODialogs x )
    {
        dialog = x;
    }*/
    Thread ProgressThread = new Thread(new Runnable() {
    public void run(){
    try{
        if (reconnectToDatabase(xMSF)){
        CurUNOProgressDialog.modifyFontWeight("lblProgressDBConnection", com.sun.star.awt.FontWeight.NORMAL);
        CurUNOProgressDialog.modifyFontWeight("lblProgressDataImport", com.sun.star.awt.FontWeight.BOLD);
        insertDatabaseDatatoReportDocument(xMSF);
        }
        CurDataimport.CurUNOProgressDialog.xComponent.dispose();
        CurReportDocument.CurDBMetaData.disposeDBMetaData();
    }
    catch (ThreadDeath td){
        System.out.println("could not stop thread");
        CurUNOProgressDialog.xComponent.dispose();
    }
    }
        });

    ProgressThread.start();
//        try {
//      ProgressThread.join();
//       }
//  catch(InterruptedException e){
//      System.out.println("could not join Threads");
//  }
    }


    public void createReport(final XMultiServiceFactory xMSF){
    try{
    if (ReportWizard.getReportResources(xMSF, true)){
        CurReportDocument = new ReportDocument(xMSF, false, true, ReportMessages);
        int iWidth = CurReportDocument.xFrame.getComponentWindow().getPosSize().Width;
        showProgressDisplay(xMSF, true);
        importReportData(xMSF, this, CurReportDocument);
    }
    }
    catch(java.lang.Exception jexception ){
    jexception.printStackTrace(System.out);
    }}


    public boolean reconnectToDatabase(XMultiServiceFactory xMSF){
    try{
    XNameContainer xNamedForms = CurReportDocument.getDocumentForms();
    Object oDBForm = Tools.getUNOObjectbyName(xNamedForms, SOREPORTFORMNAME);
    boolean bgetConnection;
    if (oDBForm != null){
        String sMsg = sMsgHiddenControlMissing + (char) 13 + sMsgEndAutopilot;
        XNameAccess xNamedForm = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, oDBForm);
        // Todo make up an exception class to catch that error
        CurReportDocument.CurDBMetaData.DataSourceName = (String) CurReportDocument.getValueofHiddenControl(xNamedForm, "DataSourceName", sMsg);
        CurReportDocument.CurDBMetaData.Command = CurReportDocument.getValueofHiddenControl(xNamedForm, "Command", sMsg);
        String sCommandType = CurReportDocument.getValueofHiddenControl(xNamedForm, "CommandType", sMsg);
        String sGroupFieldNames = CurReportDocument.getValueofHiddenControl(xNamedForm, "GroupFieldNames", sMsg);
        String sFieldNames = CurReportDocument.getValueofHiddenControl(xNamedForm, "FieldNames", sMsg);
        String sRecordFieldNames = CurReportDocument.getValueofHiddenControl(xNamedForm, "RecordFieldNames", sMsg);
        CurReportDocument.CurDBMetaData.FieldNames = Tools.ArrayoutofString(sFieldNames,";");
        CurReportDocument.CurDBMetaData.RecordFieldNames = Tools.ArrayoutofString(sRecordFieldNames,";");
        CurReportDocument.CurDBMetaData.GroupFieldNames = Tools.ArrayoutofString(sGroupFieldNames,";");
        CurReportDocument.CurDBMetaData.CommandType = Integer.valueOf(sCommandType).intValue();
        sMsgQueryCreationImpossible = Tools.replaceSubString(sMsgQueryCreationImpossible, CurReportDocument.CurDBMetaData.Command, "<STATEMENT>");
        bgetConnection = CurReportDocument.CurDBMetaData.getConnection(sMsgNoConnection, sMsgConnectionImpossible);
        if (bgetConnection){
        boolean bexecute = CurReportDocument.CurDBMetaData.executeCommand(sMsgQueryCreationImpossible + (char) 13 + sMsgEndAutopilot, true);
        if (bexecute == true)
            CurReportDocument.getallDBColumns();
        return bexecute;
        }
        else
        return false;
    }
    else{
        sReportFormNotExisting = Tools.replaceSubString(sReportFormNotExisting, SOREPORTFORMNAME, "<REPORTFORM>");
        UNODialogs.showMessageBox(xMSF, "ErrorBox", com.sun.star.awt.VclWindowPeerAttribute.OK, sReportFormNotExisting + (char) 13 + sMsgEndAutopilot);
        return false;
    }
    }
    catch (Tools.InvalidQueryException queryexception){
    return false;
    }
    catch(java.lang.Exception javaexception ){
    javaexception.printStackTrace(System.out);
    return false;
    }
    catch(UnknownHiddenControlException exception){
    return false;
     }}



    public void insertDatabaseDatatoReportDocument(XMultiServiceFactory xMSF){
    try{
        int ColIndex;
        int i;
    boolean breset;
    Object oTable;
    XCellRange xCellRange;
    XTextCursor xTextCursor;
    XTextDocument xTextDocument;
    java.util.Vector DataVector = new java.util.Vector();
    ReportDocument.DBColumn CurDBColumn;
    Object CurGroupValue;
    String CurGroupTableName;
    DBMetaData CurDBMetaData = CurReportDocument.CurDBMetaData;
    int GroupFieldCount = Tools.getArraylength(CurDBMetaData.GroupFieldNames);
    int FieldCount = Tools.getArraylength(CurDBMetaData.FieldNames);
    Object[] OldGroupFieldValues = new Object[GroupFieldCount];
    XTextTable[] xGroupBaseTables = new XTextTable[GroupFieldCount];
    int RecordFieldCount = FieldCount - GroupFieldCount;
    BreakType CorrBreakValue = null;
    String CorrPageDescName = "";
    XNameAccess xTextTables = CurReportDocument.xTextTablesSupplier.getTextTables();
    xTextDocument = CurReportDocument.xTextDocument;
        xTextCursor = CurReportDocument.createTextCursor(CurReportDocument.xTextDocument.getText());
    xTextDocument.lockControllers();
        if (CurDBMetaData.ResultSet.next() == true){
        replaceUserFields();
        Tools.setUNOPropertyValue(xTextCursor, "PageDescName", "First Page");
        for (ColIndex = 0; ColIndex < GroupFieldCount; ColIndex++){
            CurGroupTableName = "Tbl_GroupField" + Integer.toString(ColIndex+1);
            oTable = CurReportDocument.xTextTablesSupplier.getTextTables().getByName(CurGroupTableName);
        xGroupBaseTables[ColIndex] = (XTextTable) UnoRuntime.queryInterface(XTextTable.class, oTable);
        if (ColIndex == 0){
            CorrBreakValue = CurReportDocument.resetBreakTypeofTextTable(xGroupBaseTables[ColIndex]);
            String PageDescName = AnyConverter.toString(Tools.getUNOPropertyValue(xGroupBaseTables[ColIndex], "PageDescName"));
            if (PageDescName.equals("") == false){
            CorrPageDescName = PageDescName;
            Tools.setUNOPropertyValue(xGroupBaseTables[ColIndex], "PageDescName", "");
            }
        }
            CurGroupValue = CurDBMetaData.getGroupColumnValue(ColIndex);
        OldGroupFieldValues[ColIndex] = CurGroupValue;
        CurDBColumn = (ReportDocument.DBColumn) CurReportDocument.GroupFormatVector.elementAt(ColIndex);
        addLinkedTextSection(xTextCursor, "GroupField" + Integer.toString(ColIndex+1), CurDBColumn, CurGroupValue);
        }
        if (CurDBMetaData.getcurrentRecordData(ColIndex, FieldCount, RecordFieldCount, DataVector, sMsgQueryCreationImpossible) == true){
        int RowIndex = 1;
        bStopProcess = false;
        while ((CurDBMetaData.ResultSet.next() == true) && (bStopProcess == false)){
            RowIndex += 1;
            breset = false;
            for (ColIndex = 0; ColIndex < GroupFieldCount; ColIndex++){
            CurGroupValue = CurDBMetaData.getGroupColumnValue(ColIndex);
            if ((CurGroupValue.equals((Object) OldGroupFieldValues[ColIndex]) == false) || (breset)){
                breset = true;
                insertDataToRecordTable(xTextCursor, DataVector, RecordFieldCount);
                CurDBColumn = (ReportDocument.DBColumn) CurReportDocument.GroupFormatVector.elementAt(ColIndex);
                addLinkedTextSection(xTextCursor, "GroupField" + Integer.toString(ColIndex+1), CurDBColumn, CurGroupValue);
                OldGroupFieldValues[ColIndex] = CurGroupValue;
                breset = !(ColIndex == GroupFieldCount-1);
            }
            }
            CurDBMetaData.getcurrentRecordData(ColIndex, FieldCount, RecordFieldCount, DataVector, sMsgQueryCreationImpossible);
            updateProgressDisplay(RowIndex);
        }
        insertDataToRecordTable(xTextCursor, DataVector, RecordFieldCount);
        }
        else{
        CurReportDocument.unlockallControllers();
        return;
        }
        }
    setLayoutSectionsInvisible(GroupFieldCount);
    CurReportDocument.breakLinkofTextSections();
    if (CurReportDocument.xTextTablesSupplier.getTextTables().hasByName("FirstVisibleTextTable")){
        Object oTextTable = CurReportDocument.xTextTablesSupplier.getTextTables().getByName("FirstVisibleTextTable");
        if (CorrBreakValue != null)
        Tools.setUNOPropertyValue(oTextTable, "BreakType", CorrBreakValue);
        if (CorrPageDescName != "")
        Tools.setUNOPropertyValue(oTextTable, "PageDescName", CorrPageDescName);
    }
    }
    catch( com.sun.star.uno.Exception exception ){
        exception.printStackTrace(System.out);
    }

    catch(java.lang.Exception javaexception ){
        javaexception.printStackTrace(System.out);
    }
    CurReportDocument.unlockallControllers();
    }


    public void setLayoutSectionsInvisible(int GroupFieldCount){
    try{
    XNameAccess xTextSections = CurReportDocument.xTextSectionsSupplier.getTextSections();
    Object oTextSection;
    for (int i = 0; i< GroupFieldCount; i++){
        oTextSection = xTextSections.getByName("GroupField" + String.valueOf(i+1));
        Tools.setUNOPropertyValue(oTextSection, "IsVisible", new Boolean(false));
    }
    if (xTextSections.hasByName("RecordSection")){
        oTextSection = xTextSections.getByName("RecordSection");
        Tools.setUNOPropertyValue(oTextSection, "IsVisible", new Boolean(false));
    }
    }
    catch( com.sun.star.uno.Exception exception ){
        exception.printStackTrace(System.out);
    }}


    public void insertDataToRecordTable(XTextCursor xTextCursor, java.util.Vector DataVector, int FieldCount){
    try{
    int DataLength = DataVector.size();
    if ((FieldCount > 0)&& (DataLength > 0)){
        addLinkedTextSection(xTextCursor, "RecordSection", null, null);
        Object[][] RecordArray = new Object[DataLength][FieldCount];
        DataVector.copyInto(RecordArray);
        XTextTable xTextTable = CurReportDocument.getlastTextTable();
        if (DataLength > 1){
        xTextTable.getRows().insertByIndex(xTextTable.getRows().getCount(), DataLength - 1);
        }
        XCellRange xCellRange = (XCellRange) UnoRuntime.queryInterface(XCellRange.class, xTextTable);
        int iRowCount = xTextTable.getRows().getCount();
        int iColCount = xTextTable.getColumns().getCount();

        XCellRange xNewRange = xCellRange.getCellRangeByPosition(0,1,FieldCount -1, DataLength);
        XCellRangeData xDataArray = (XCellRangeData) UnoRuntime.queryInterface(XCellRangeData.class, xNewRange);
        xDataArray.setDataArray(RecordArray);
    }
    DataVector.removeAllElements();
    }
    catch( com.sun.star.uno.Exception exception ){
    exception.printStackTrace(System.out);
     }}


    public void updateProgressDisplay(int iCounter){
    try{
    if (iCounter % 10 == 0){
        sProgressCurRecord = Tools.replaceSubString(sProgressBaseCurRecord, String.valueOf(iCounter), "<COUNT>");
            CurUNOProgressDialog.assignPropertyToDialogControl("lblCurProgress", "Label", sProgressCurRecord);
    }
    }
    catch(java.lang.Exception jexception ){
    jexception.printStackTrace(System.out);
    }}


    public void addLinkedTextSection(XTextCursor xTextCursor, String sLinkRegion, ReportDocument.DBColumn CurDBColumn, Object CurGroupValue){
    try{
    XInterface xTextSection = (XInterface) CurReportDocument.xMSFDoc.createInstance("com.sun.star.text.TextSection");
    XTextContent xTextSectionContent = (XTextContent) UnoRuntime.queryInterface(XTextContent.class, xTextSection);
    xTextCursor.gotoEnd(false);
    xTextCursor.getText().insertTextContent(xTextCursor, xTextSectionContent, true);
    Tools.setUNOPropertyValue(xTextSection, "LinkRegion", sLinkRegion);
    if (CurDBColumn != null){
        boolean bIsGroupTable = (sLinkRegion.equals("RecordSection") != true);
        if (bIsGroupTable == true){
        XTextTable xTextTable = CurReportDocument.getlastTextTable();
        XCellRange xCellRange = (XCellRange) UnoRuntime.queryInterface(XCellRange.class, xTextTable);
        CurDBColumn.modifyCellContent(xCellRange, CurGroupValue);
        }
    }
    if (brenamefirstTable == true){
        brenamefirstTable = false;
        XTextTable xTextTable = CurReportDocument.getlastTextTable();
        XNamed xNamedTable = (XNamed) UnoRuntime.queryInterface(XNamed.class, xTextTable);
        xNamedTable.setName("FirstVisibleTextTable");

    }
    }
    catch( com.sun.star.uno.Exception exception ){
        exception.printStackTrace(System.out);
    }}


    public void replaceUserFields(){
    ReportDocument.DBColumn CurDBColumn;
    XTextCursor xNameCellCursor;
    String FieldContent;
    int iCount = CurReportDocument.GroupFormatVector.size();
    for (int i = 0; i < iCount; i++){
        CurDBColumn = (ReportDocument.DBColumn) CurReportDocument.GroupFormatVector.elementAt(i);
        xNameCellCursor = CurReportDocument.createTextCursor(CurDBColumn.xNameCell);
        xNameCellCursor.gotoStart(false);
        FieldContent = CurReportDocument.getUserFieldContent(xNameCellCursor);
        xNameCellCursor.goRight((short)1, true);
        xNameCellCursor.setString(FieldContent);
    }
    }
}
