summaryrefslogtreecommitdiff
path: root/sc/source/filter/excel/xltracer.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/filter/excel/xltracer.cxx')
-rw-r--r--sc/source/filter/excel/xltracer.cxx273
1 files changed, 273 insertions, 0 deletions
diff --git a/sc/source/filter/excel/xltracer.cxx b/sc/source/filter/excel/xltracer.cxx
new file mode 100644
index 000000000000..fa7c0a17c5c1
--- /dev/null
+++ b/sc/source/filter/excel/xltracer.cxx
@@ -0,0 +1,273 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: xltracer.cxx,v $
+ * $Revision: 1.10.32.1 $
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+// ============================================================================
+#include "xltracer.hxx"
+#include <filter/msfilter/msfiltertracer.hxx>
+#include "address.hxx"
+
+using ::rtl::OUString;
+using ::com::sun::star::uno::Sequence;
+using ::com::sun::star::beans::PropertyValue;
+
+// ============================================================================
+
+// Trace Table details are grouped by functionality using the context entry.
+// Each separate context starts at the next 1000 interval. New entries should
+// be added to their appropriate context. New contexts should be added onto
+// the end. Any gaps in the 1000 sequence or within the 1000 are the result
+// of trace events no longer present.
+static const XclTracerDetails pTracerDetails[] =
+{
+ { eUnKnown, 0, "UNKNOWN", "UNKNOWN", "Unknown trace property." },
+ { eRowLimitExceeded, 1000, "Limits", "Sheet", "Row limit exceeded." },
+ { eTabLimitExceeded, 1001, "Limits", "Sheet", "Sheet limit exceeded." },
+ { ePassword, 2000, "Protection", "Password", "Document is password protected." },
+ { ePrintRange, 3000, "Print", "Print Range", "Print Range present." },
+ { eShortDate, 4000, "CellFormatting", "Short Dates", "Possible Date format issue." },
+ { eBorderLineStyle, 4004, "CellFormatting", "Border", "Line style not supported.", },
+ { eFillPattern, 4005, "CellFormatting", "Pattern", "Fill Pattern not supported.", },
+ { eInvisibleGrid, 5000, "Properties", "Grid Invisible", "Grid invisible on first sheet." },
+ { eFormattedNote, 6000, "Notes", "Formatting", "Text may be formatted." },
+ { eFormulaExtName, 7000, "Formula", "External Name", "External names not supported." },
+ { eFormulaMissingArg, 7001, "Formula", "Missing Argument","Parameter missing." },
+ { ePivotDataSource, 8000, "Chart", "Pivot", "External data source not supported."},
+ { ePivotChartExists, 8001, "Chart", "Pivot", "Pivot Chart not supported."},
+ { eChartUnKnownType, 8002, "Chart", "Type", "Chart Type not supported."},
+ { eChartTrendLines, 8003, "Chart", "Type", "Chart trendlines not supported."},
+ { eChartOnlySheet, 8004, "Chart", "Type", "Chart only sheet not supported."},
+ { eChartRange, 8005, "Chart", "Source Data", "Chart source ranges too complex."},
+ { eChartDSName, 8006, "Chart", "Source Data", "Series titles not linked to cells."},
+ { eChartDataTable, 8007, "Chart", "Legend", "Data table not supported."},
+ { eChartLegendPosition, 8008, "Chart", "Legend", "Position not guaranteed."},
+ { eChartTextFormatting, 8009, "Chart", "Formatting", "Text formatting present."},
+ { eChartEmbeddedObj, 8010, "Chart", "Area", "Object inside chart."},
+ { eChartAxisAuto, 8012, "Chart", "Axis", "Axis interval is automatic."},
+ { eChartInvalidXY, 8013, "Chart", "Scatter", "Unsupported or invalid data range for XY chart."},
+ { eChartErrorBars, 8014, "Chart", "Type", "Chart error bars not supported."},
+ { eChartAxisManual, 8015, "Chart", "Axis", "Manual axis crossing point adjusted."},
+ { eUnsupportedObject, 9000, "Object", "Type", "Limited Object support."},
+ { eObjectNotPrintable, 9001, "Object", "Print", "Object not printable."},
+ { eDVType, 10000, "DataValidation", "Type", "Custom type present."}
+};
+
+XclTracer::XclTracer( const String& rDocUrl, const OUString& rConfigPath ) :
+ maFirstTimes(eTraceLength,true)
+{
+ Sequence< PropertyValue > aConfigData( 1 );
+ aConfigData[ 0 ].Name = CREATE_OUSTRING( "DocumentURL" );
+ aConfigData[ 0 ].Value <<= OUString( rDocUrl );
+ mpTracer.reset( new MSFilterTracer( rConfigPath, &aConfigData ) );
+ mpTracer->StartTracing();
+ mbEnabled = mpTracer->IsEnabled();
+}
+
+XclTracer::~XclTracer()
+{
+ mpTracer->EndTracing();
+}
+
+void XclTracer::AddAttribute( const OUString& rName, const OUString& rValue )
+{
+ if( mbEnabled )
+ mpTracer->AddAttribute( rName, rValue );
+}
+
+void XclTracer::Trace( const OUString& rElementID, const OUString& rMessage )
+{
+ if( mbEnabled )
+ {
+ mpTracer->Trace( rElementID, rMessage );
+ mpTracer->ClearAttributes();
+ }
+}
+
+void XclTracer::TraceLog( XclTracerId eProblem, sal_Int32 nValue )
+{
+ if( mbEnabled )
+ {
+ OUString sID( CREATE_STRING( "SC" ) );
+ sID += OUString::valueOf( static_cast< sal_Int32 >( pTracerDetails[ eProblem ].mnID ) );
+ OUString sProblem = OUString::createFromAscii( pTracerDetails[ eProblem ].mpProblem );
+
+ switch (eProblem)
+ {
+ case eRowLimitExceeded:
+ Context(eProblem,static_cast<SCTAB>(nValue));
+ break;
+ case eTabLimitExceeded:
+ Context(eProblem,static_cast<SCTAB>(nValue));
+ break;
+ default:
+ Context(eProblem);
+ break;
+ }
+ Trace(sID, sProblem);
+ }
+}
+
+void XclTracer::Context( XclTracerId eProblem, SCTAB nTab )
+{
+ OUString sContext = OUString::createFromAscii( pTracerDetails[ eProblem ].mpContext );
+ OUString sDetail = OUString::createFromAscii( pTracerDetails[ eProblem ].mpDetail );
+
+ switch (eProblem)
+ {
+ case eRowLimitExceeded:
+ case eTabLimitExceeded:
+ sDetail += OUString::valueOf( static_cast< sal_Int32 >( nTab + 1 ) );
+ break;
+ default:
+ break;
+ }
+ AddAttribute(sContext, sDetail);
+}
+
+void XclTracer::ProcessTraceOnce(XclTracerId eProblem, SCTAB nTab)
+{
+ if( mbEnabled && maFirstTimes[eProblem])
+ {
+ TraceLog(pTracerDetails[eProblem].meProblemId, nTab);
+ maFirstTimes[eProblem] = false;
+ }
+}
+
+void XclTracer::TraceInvalidAddress( const ScAddress& rPos, const ScAddress& rMaxPos )
+{
+ TraceInvalidRow(rPos.Tab(), rPos.Row(), rMaxPos.Row());
+ TraceInvalidTab(rPos.Tab(), rMaxPos.Tab());
+}
+
+void XclTracer::TraceInvalidRow( SCTAB nTab, sal_uInt32 nRow, sal_uInt32 nMaxRow )
+{
+ if(nRow > nMaxRow)
+ ProcessTraceOnce(eRowLimitExceeded, nTab);
+}
+
+void XclTracer::TraceInvalidTab( SCTAB nTab, SCTAB nMaxTab )
+{
+ if(nTab > nMaxTab)
+ ProcessTraceOnce(eTabLimitExceeded, nTab);
+}
+
+void XclTracer::TracePrintRange()
+{
+ ProcessTraceOnce( ePrintRange);
+}
+
+void XclTracer::TraceDates( sal_uInt16 nNumFmt)
+{
+ // Short Date = 14 and Short Date+Time = 22
+ if(nNumFmt == 14 || nNumFmt == 22)
+ ProcessTraceOnce(eShortDate);
+}
+
+void XclTracer::TraceBorderLineStyle( bool bBorderLineStyle)
+{
+ if(bBorderLineStyle)
+ ProcessTraceOnce(eBorderLineStyle);
+}
+
+void XclTracer::TraceFillPattern( bool bFillPattern)
+{
+ if(bFillPattern)
+ ProcessTraceOnce(eFillPattern);
+}
+
+void XclTracer::TraceFormulaMissingArg()
+{
+ // missing parameter in Formula record
+ ProcessTraceOnce(eFormulaMissingArg);
+}
+
+void XclTracer::TracePivotDataSource( bool bExternal)
+{
+ if(bExternal)
+ ProcessTraceOnce(ePivotDataSource);
+}
+
+void XclTracer::TracePivotChartExists()
+{
+ // Pivot Charts not currently displayed.
+ ProcessTraceOnce(ePivotChartExists);
+}
+
+void XclTracer::TraceChartUnKnownType()
+{
+ ProcessTraceOnce(eChartUnKnownType);
+}
+
+void XclTracer::TraceChartOnlySheet()
+{
+ ProcessTraceOnce(eChartOnlySheet);
+}
+
+void XclTracer::TraceChartDataTable()
+{
+ // Data table is not supported.
+ ProcessTraceOnce(eChartDataTable);
+}
+
+void XclTracer::TraceChartLegendPosition()
+{
+ // If position is set to "not docked or inside the plot area" then
+ // we cannot guarantee the legend position.
+ ProcessTraceOnce(eChartLegendPosition);
+}
+
+void XclTracer::TraceChartEmbeddedObj()
+{
+ // drawing objects e.g. text boxes etc not supported inside charts
+ ProcessTraceOnce(eChartEmbeddedObj);
+}
+
+void XclTracer::TraceUnsupportedObjects()
+{
+ // Called from Excel 5.0 - limited Graphical object support.
+ ProcessTraceOnce(eUnsupportedObject);
+}
+
+void XclTracer::TraceObjectNotPrintable()
+{
+ ProcessTraceOnce(eObjectNotPrintable);
+}
+
+void XclTracer::TraceDVType( bool bType)
+{
+ // Custom types work if 'Data->validity dialog' is not OKed.
+ if(bType)
+ ProcessTraceOnce(eDVType);
+}
+
+// ============================================================================
+