From 74e4b152bbe46cf55cec4da21b9365363ec2fa8d Mon Sep 17 00:00:00 2001 From: Oliver Bolte Date: Fri, 20 Feb 2009 10:24:14 +0000 Subject: #i99305#,#i99132# remove DOS lineends, remove solenv/unxmacxp/inc/poll.h --- sc/source/filter/inc/filt_pch.hxx | 648 +++--- sc/source/filter/inc/xlformula.hxx | 954 ++++----- sc/source/filter/xml/XMLStylesExportHelper.cxx | 2490 ++++++++++++------------ sc/source/filter/xml/xmlcvali.cxx | 1576 +++++++-------- sc/source/filter/xml/xmlnexpi.cxx | 524 ++--- sc/source/ui/formdlg/dwfunctr.cxx | 2370 +++++++++++----------- sc/source/ui/formdlg/formdlgs.src | 64 +- sc/source/ui/miscdlgs/crnrdlg.cxx | 2350 +++++++++++----------- sc/source/ui/miscdlgs/optsolver.cxx | 2138 ++++++++++---------- sc/source/ui/miscdlgs/solvrdlg.cxx | 632 +++--- sc/source/ui/miscdlgs/tabopdlg.cxx | 748 +++---- sc/source/ui/namedlg/namedlg.cxx | 1304 ++++++------- sc/source/ui/pagedlg/areasdlg.cxx | 1818 ++++++++--------- 13 files changed, 8808 insertions(+), 8808 deletions(-) diff --git a/sc/source/filter/inc/filt_pch.hxx b/sc/source/filter/inc/filt_pch.hxx index 4f576c861272..b0ef236519a3 100644 --- a/sc/source/filter/inc/filt_pch.hxx +++ b/sc/source/filter/inc/filt_pch.hxx @@ -1,324 +1,324 @@ -/************************************************************************* - * - * 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: filt_pch.hxx,v $ - * $Revision: 1.13 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// ItemID-Defines etc. muessen immer ganz vorne stehen - -#include "scitems.hxx" - - -#define _ZFORLIST_DECLARE_TABLE - -#define SC_PROGRESS_CXX - -// ab hier automatisch per makepch generiert -// folgende duerfen nicht aufgenommen werden: -// ... - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - - - +/************************************************************************* + * + * 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: filt_pch.hxx,v $ + * $Revision: 1.13 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// ItemID-Defines etc. muessen immer ganz vorne stehen + +#include "scitems.hxx" + + +#define _ZFORLIST_DECLARE_TABLE + +#define SC_PROGRESS_CXX + +// ab hier automatisch per makepch generiert +// folgende duerfen nicht aufgenommen werden: +// ... + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + + diff --git a/sc/source/filter/inc/xlformula.hxx b/sc/source/filter/inc/xlformula.hxx index 0c3496bdee30..ef9274bc0338 100644 --- a/sc/source/filter/inc/xlformula.hxx +++ b/sc/source/filter/inc/xlformula.hxx @@ -1,477 +1,477 @@ -/************************************************************************* - * - * 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: xlformula.hxx,v $ - * $Revision: 1.14 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef SC_XLFORMULA_HXX -#define SC_XLFORMULA_HXX - -#include -#include "address.hxx" -#include "formula/opcode.hxx" -#include "ftools.hxx" - -// Constants ================================================================== - -const size_t EXC_TOKARR_MAXLEN = 4096; /// Maximum size of a token array. - -// Token class flags ---------------------------------------------------------- - -const sal_uInt8 EXC_TOKCLASS_MASK = 0x60; -const sal_uInt8 EXC_TOKCLASS_INOP_FLAG = 0x80; /// Used in operators (internal flag). - -const sal_uInt8 EXC_TOKCLASS_NONE = 0x00; /// 00-1F: Base tokens. -const sal_uInt8 EXC_TOKCLASS_REF = 0x20; /// 20-3F: Reference class tokens. -const sal_uInt8 EXC_TOKCLASS_VAL = 0x40; /// 40-5F: Value class tokens. -const sal_uInt8 EXC_TOKCLASS_ARR = 0x60; /// 60-7F: Array class tokens. - -const sal_uInt8 EXC_TOKCLASS_ANY_IN_REFOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_NONE; -const sal_uInt8 EXC_TOKCLASS_REF_IN_VALOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_REF; -const sal_uInt8 EXC_TOKCLASS_VAL_IN_VALOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_VAL; -const sal_uInt8 EXC_TOKCLASS_ARR_IN_VALOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_ARR; - -// Base tokens ---------------------------------------------------------------- - -const sal_uInt8 EXC_TOKID_MASK = 0x1F; - -const sal_uInt8 EXC_TOKID_NONE = 0x00; /// Placeholder for invalid token id. -const sal_uInt8 EXC_TOKID_EXP = 0x01; /// Array or shared formula reference. -const sal_uInt8 EXC_TOKID_TBL = 0x02; /// Multiple operation reference. -const sal_uInt8 EXC_TOKID_ADD = 0x03; /// Addition operator. -const sal_uInt8 EXC_TOKID_SUB = 0x04; /// Subtraction operator. -const sal_uInt8 EXC_TOKID_MUL = 0x05; /// Multiplication operator. -const sal_uInt8 EXC_TOKID_DIV = 0x06; /// Division operator. -const sal_uInt8 EXC_TOKID_POWER = 0x07; /// Power operator. -const sal_uInt8 EXC_TOKID_CONCAT = 0x08; /// String concatenation operator. -const sal_uInt8 EXC_TOKID_LT = 0x09; /// Less than operator. -const sal_uInt8 EXC_TOKID_LE = 0x0A; /// Less than or equal operator. -const sal_uInt8 EXC_TOKID_EQ = 0x0B; /// Equal operator. -const sal_uInt8 EXC_TOKID_GE = 0x0C; /// Greater than or equal operator. -const sal_uInt8 EXC_TOKID_GT = 0x0D; /// Greater than operator. -const sal_uInt8 EXC_TOKID_NE = 0x0E; /// Not equal operator. -const sal_uInt8 EXC_TOKID_ISECT = 0x0F; /// Intersection operator. -const sal_uInt8 EXC_TOKID_LIST = 0x10; /// List operator. -const sal_uInt8 EXC_TOKID_RANGE = 0x11; /// Range operator. -const sal_uInt8 EXC_TOKID_UPLUS = 0x12; /// Unary plus. -const sal_uInt8 EXC_TOKID_UMINUS = 0x13; /// Unary minus. -const sal_uInt8 EXC_TOKID_PERCENT = 0x14; /// Percent sign. -const sal_uInt8 EXC_TOKID_PAREN = 0x15; /// Parentheses. -const sal_uInt8 EXC_TOKID_MISSARG = 0x16; /// Missing argument. -const sal_uInt8 EXC_TOKID_STR = 0x17; /// String constant. -const sal_uInt8 EXC_TOKID_NLR = 0x18; /// Natural language reference (NLR). -const sal_uInt8 EXC_TOKID_ATTR = 0x19; /// Special attribute. -const sal_uInt8 EXC_TOKID_SHEET = 0x1A; /// Start of a sheet reference (BIFF2-BIFF4). -const sal_uInt8 EXC_TOKID_ENDSHEET = 0x1B; /// End of a sheet reference (BIFF2-BIFF4). -const sal_uInt8 EXC_TOKID_ERR = 0x1C; /// Error constant. -const sal_uInt8 EXC_TOKID_BOOL = 0x1D; /// Boolean constant. -const sal_uInt8 EXC_TOKID_INT = 0x1E; /// Integer constant. -const sal_uInt8 EXC_TOKID_NUM = 0x1F; /// Floating-point constant. - -// Base IDs of classified tokens ---------------------------------------------- - -const sal_uInt8 EXC_TOKID_ARRAY = 0x00; /// Array constant. -const sal_uInt8 EXC_TOKID_FUNC = 0x01; /// Function, fixed number of arguments. -const sal_uInt8 EXC_TOKID_FUNCVAR = 0x02; /// Function, variable number of arguments. -const sal_uInt8 EXC_TOKID_NAME = 0x03; /// Defined name. -const sal_uInt8 EXC_TOKID_REF = 0x04; /// 2D cell reference. -const sal_uInt8 EXC_TOKID_AREA = 0x05; /// 2D area reference. -const sal_uInt8 EXC_TOKID_MEMAREA = 0x06; /// Constant reference subexpression. -const sal_uInt8 EXC_TOKID_MEMERR = 0x07; /// Deleted reference subexpression. -const sal_uInt8 EXC_TOKID_MEMNOMEM = 0x08; /// Constant reference subexpression without result. -const sal_uInt8 EXC_TOKID_MEMFUNC = 0x09; /// Variable reference subexpression. -const sal_uInt8 EXC_TOKID_REFERR = 0x0A; /// Deleted 2D cell reference. -const sal_uInt8 EXC_TOKID_AREAERR = 0x0B; /// Deleted 2D area reference. -const sal_uInt8 EXC_TOKID_REFN = 0x0C; /// Relative 2D cell reference (in names). -const sal_uInt8 EXC_TOKID_AREAN = 0x0D; /// Relative 2D area reference (in names). -const sal_uInt8 EXC_TOKID_MEMAREAN = 0x0E; /// Reference subexpression (in names). -const sal_uInt8 EXC_TOKID_MEMNOMEMN = 0x0F; /// Reference subexpression (in names) without result. -const sal_uInt8 EXC_TOKID_FUNCCE = 0x18; -const sal_uInt8 EXC_TOKID_NAMEX = 0x19; /// External reference. -const sal_uInt8 EXC_TOKID_REF3D = 0x1A; /// 3D cell reference. -const sal_uInt8 EXC_TOKID_AREA3D = 0x1B; /// 3D area reference. -const sal_uInt8 EXC_TOKID_REFERR3D = 0x1C; /// Deleted 3D cell reference. -const sal_uInt8 EXC_TOKID_AREAERR3D = 0x1D; /// Deleted 3D area reference - -// specific token constants --------------------------------------------------- - -const sal_uInt16 EXC_TOK_STR_MAXLEN = 255; /// Maximum string length of a tStr token. - -const sal_uInt8 EXC_TOK_BOOL_FALSE = 0; /// FALSE value of a tBool token. -const sal_uInt8 EXC_TOK_BOOL_TRUE = 1; /// TRUE value of a tBool token. - -const sal_uInt8 EXC_TOK_ATTR_VOLATILE = 0x01; /// Volatile function. -const sal_uInt8 EXC_TOK_ATTR_IF = 0x02; /// Start of true condition in IF function. -const sal_uInt8 EXC_TOK_ATTR_CHOOSE = 0x04; /// Jump array of CHOOSE function. -const sal_uInt8 EXC_TOK_ATTR_GOTO = 0x08; /// Jump to token. -const sal_uInt8 EXC_TOK_ATTR_SUM = 0x10; /// SUM function with one parameter. -const sal_uInt8 EXC_TOK_ATTR_ASSIGN = 0x20; /// BASIC style assignment. -const sal_uInt8 EXC_TOK_ATTR_SPACE = 0x40; /// Spaces in formula representation. - -const sal_uInt8 EXC_TOK_ATTR_SPACE_SP = 0x00; /// Spaces before next token. -const sal_uInt8 EXC_TOK_ATTR_SPACE_BR = 0x01; /// Line breaks before next token. -const sal_uInt8 EXC_TOK_ATTR_SPACE_SP_OPEN = 0x02; /// Spaces before opening parenthesis. -const sal_uInt8 EXC_TOK_ATTR_SPACE_BR_OPEN = 0x03; /// Line breaks before opening parenthesis. -const sal_uInt8 EXC_TOK_ATTR_SPACE_SP_CLOSE = 0x04; /// Spaces before closing parenthesis. -const sal_uInt8 EXC_TOK_ATTR_SPACE_BR_CLOSE = 0x05; /// Line breaks before closing parenthesis. -const sal_uInt8 EXC_TOK_ATTR_SPACE_SP_PRE = 0x06; /// Spaces before formula (BIFF3). - -const sal_uInt16 EXC_TOK_FUNCVAR_CMD = 0x8000; /// Macro command. -const sal_uInt16 EXC_TOK_FUNCVAR_INDEXMASK = 0x7FFF; /// Mask for function/command index. -const sal_uInt8 EXC_TOK_FUNCVAR_PROMPT = 0x80; /// User prompt for macro commands. -const sal_uInt8 EXC_TOK_FUNCVAR_COUNTMASK = 0x7F; /// Mask for parameter count. - -const sal_uInt16 EXC_TOK_REF_COLREL = 0x4000; /// True = Column is relative. -const sal_uInt16 EXC_TOK_REF_ROWREL = 0x8000; /// True = Row is relative. - -const sal_uInt8 EXC_TOK_NLR_ERR = 0x01; /// NLR: Invalid/deleted. -const sal_uInt8 EXC_TOK_NLR_ROWR = 0x02; /// NLR: Row index. -const sal_uInt8 EXC_TOK_NLR_COLR = 0x03; /// NLR: Column index. -const sal_uInt8 EXC_TOK_NLR_ROWV = 0x06; /// NLR: Value in row. -const sal_uInt8 EXC_TOK_NLR_COLV = 0x07; /// NLR: Value in column. -const sal_uInt8 EXC_TOK_NLR_RANGE = 0x0A; /// NLR: Range. -const sal_uInt8 EXC_TOK_NLR_SRANGE = 0x0B; /// Stacked NLR: Range. -const sal_uInt8 EXC_TOK_NLR_SROWR = 0x0C; /// Stacked NLR: Row index. -const sal_uInt8 EXC_TOK_NLR_SCOLR = 0x0D; /// Stacked NLR: Column index. -const sal_uInt8 EXC_TOK_NLR_SROWV = 0x0E; /// Stacked NLR: Value in row. -const sal_uInt8 EXC_TOK_NLR_SCOLV = 0x0F; /// Stacked NLR: Value in column. -const sal_uInt8 EXC_TOK_NLR_RANGEERR = 0x10; /// NLR: Invalid/deleted range. -const sal_uInt8 EXC_TOK_NLR_SXNAME = 0x1D; /// NLR: Pivot table name. -const sal_uInt16 EXC_TOK_NLR_REL = 0x8000; /// True = Natural language ref is relative. - -const sal_uInt32 EXC_TOK_NLR_ADDREL = 0x80000000; /// NLR relative (in appended data). -const sal_uInt32 EXC_TOK_NLR_ADDMASK = 0x3FFFFFFF; /// Mask for number of appended ranges. - -// ---------------------------------------------------------------------------- - -/** Type of a formula. */ -enum XclFormulaType -{ - EXC_FMLATYPE_CELL, /// Simple cell formula, also used in change tracking. - EXC_FMLATYPE_MATRIX, /// Matrix (array) formula. - EXC_FMLATYPE_SHARED, /// Shared formula. - EXC_FMLATYPE_CONDFMT, /// Conditional format. - EXC_FMLATYPE_DATAVAL, /// Data validation. - EXC_FMLATYPE_NAME, /// Defined name. - EXC_FMLATYPE_CHART, /// Chart source ranges. - EXC_FMLATYPE_CONTROL, /// Spreadsheet links in form controls. - EXC_FMLATYPE_WQUERY, /// Web query source range. - EXC_FMLATYPE_LISTVAL /// List (cell range) validation. -}; - -// Function data ============================================================== - -const sal_uInt8 EXC_FUNC_MAXPARAM = 30; /// Maximum parameter count. - -const sal_uInt8 EXC_FUNC_PAR_CALCONLY = 0xFD; /// Placeholder for a parameter existing in Calc, but not in Excel. -const sal_uInt8 EXC_FUNC_PAR_EXCELONLY = 0xFE; /// Placeholder for a parameter existing in Excel, but not in Calc. -const sal_uInt8 EXC_FUNC_PAR_INVALID = 0xFF; /// Placeholder for an invalid token class. - -const sal_uInt8 EXC_FUNCINFO_CLASSCOUNT = 5; /// Number of token class entries. - -const sal_uInt8 EXC_FUNCFLAG_VOLATILE = 0x01; /// Result is volatile (e.g. NOW() function). -const sal_uInt8 EXC_FUNCFLAG_IMPORTONLY = 0x02; /// Only used in import filter. -const sal_uInt8 EXC_FUNCFLAG_EXPORTONLY = 0x04; /// Only used in export filter. - -// selected function IDs -const sal_uInt16 EXC_FUNCID_IF = 1; -const sal_uInt16 EXC_FUNCID_SUM = 4; -const sal_uInt16 EXC_FUNCID_AND = 36; -const sal_uInt16 EXC_FUNCID_OR = 37; -const sal_uInt16 EXC_FUNCID_CHOOSE = 100; -const sal_uInt16 EXC_FUNCID_EXTERNCALL = 255; - -/** Represents information for a spreadsheet function for import and export. - - The member mpnParamClass contains an array of token classes for each - parameter of the function. The last existing (non-null) value in this array - is used for all following parameters used in a function. Additionally to - the three actual token classes, this array may contain the special values - EXC_FUNC_PAR_CALCONLY, EXC_FUNC_PAR_EXCELONLY, and EXC_FUNC_PAR_INVALID. - The former two specify parameters only existing in one of the applications. - EXC_FUNC_PAR_INVALID is simply a terminator for the array to prevent that - the last token class or special value is repeated for additional parameters. - */ -struct XclFunctionInfo -{ - OpCode meOpCode; /// Calc function opcode. - sal_uInt16 mnXclFunc; /// Excel function index. - sal_uInt8 mnMinParamCount; /// Minimum number of parameters. - sal_uInt8 mnMaxParamCount; /// Maximum number of parameters. - sal_uInt8 mnRetClass; /// Token class of the return value. - sal_uInt8 mpnParamClass[ EXC_FUNCINFO_CLASSCOUNT ]; /// Expected token classes of parameters. - sal_uInt8 mnFlags; /// Additional flags. - const sal_Char* mpcMacroName; /// Function name, if simulated by a macro call (UTF-8). - - /** Returns true, if the function is volatile. */ - inline bool IsVolatile() const { return ::get_flag( mnFlags, EXC_FUNCFLAG_VOLATILE ); } - /** Returns true, if the function is simulated by a macro call. */ - inline bool IsMacroFunc() const { return mpcMacroName != 0; } - /** Returns the name of the external function as string. */ - String GetMacroFuncName() const; -}; - -// ---------------------------------------------------------------------------- - -class XclRoot; - -/** Provides access to function info structs for all available functions. */ -class XclFunctionProvider -{ -public: - explicit XclFunctionProvider( const XclRoot& rRoot ); - - /** Returns the function data for an Excel function index, or 0 on error. */ - const XclFunctionInfo* GetFuncInfoFromXclFunc( sal_uInt16 nXclFunc ) const; - /** Returns the function data for an Excel function simulated by a macro call, or 0 on error. */ - const XclFunctionInfo* GetFuncInfoFromXclMacroName( const String& rXclMacroName ) const; - /** Returns the function data for a Calc opcode, or 0 on error. */ - const XclFunctionInfo* GetFuncInfoFromOpCode( OpCode eOpCode ) const; - -private: - void FillXclFuncMap( const XclFunctionInfo* pBeg, const XclFunctionInfo* pEnd ); - void FillScFuncMap( const XclFunctionInfo* pBeg, const XclFunctionInfo* pEnd ); - -private: - typedef ::std::map< sal_uInt16, const XclFunctionInfo* > XclFuncMap; - typedef ::std::map< String, const XclFunctionInfo* > XclMacroNameMap; - typedef ::std::map< OpCode, const XclFunctionInfo* > ScFuncMap; - - XclFuncMap maXclFuncMap; /// Maps Excel function indexes to function data. - XclMacroNameMap maXclMacroNameMap; /// Maps macro function names to function data. - ScFuncMap maScFuncMap; /// Maps Calc opcodes to function data. -}; - -// Token array ================================================================ - -class XclImpStream; -class XclExpStream; - -/** Binary representation of an Excel token array. */ -class XclTokenArray -{ -public: - /** Creates an empty token array. */ - explicit XclTokenArray( bool bVolatile = false ); - /** Creates a token array, swaps passed token vector into own data. */ - explicit XclTokenArray( ScfUInt8Vec& rTokVec, bool bVolatile = false, - ScfUInt8Vec* pExtensionTokens = NULL); - - /** Returns true, if the token array is empty. */ - inline bool Empty() const { return maTokVec.empty(); } - /** Returns the size of the token array in bytes. */ - sal_uInt16 GetSize() const; - /** Returns read-only access to the byte vector storing token data. */ - inline const sal_uInt8* GetData() const { return maTokVec.empty() ? 0 : &maTokVec.front(); } - /** Returns true, if the formula contains a volatile function. */ - inline bool IsVolatile() const { return mbVolatile; } - - /** Reads the size field of the token array. */ - void ReadSize( XclImpStream& rStrm ); - /** Reads the tokens of the token array (without size field). */ - void ReadArray( XclImpStream& rStrm ); - /** Reads size field and the tokens. */ - void Read( XclImpStream& rStrm ); - - /** Writes the size field of the token array. */ - void WriteSize( XclExpStream& rStrm ) const; - /** Writes the tokens of the token array (without size field). */ - void WriteArray( XclExpStream& rStrm ) const; - /** Writes size field and the tokens. */ - void Write( XclExpStream& rStrm ) const; - - /** Compares this token array with the passed. */ - bool operator==( const XclTokenArray& rTokArr ) const; - -private: - ScfUInt8Vec maTokVec; /// Byte vector containing token data. - ScfUInt8Vec maExtensions; /// Byte vector of extensions (eg inline arrays) - bool mbVolatile; /// True = Formula contains volatile function. -}; - -typedef ScfRef< XclTokenArray > XclTokenArrayRef; - -/** Calls the Read() function at the passed token array. */ -XclImpStream& operator>>( XclImpStream& rStrm, XclTokenArray& rTokArr ); -/** Calls the Read() function at the passed token array. */ -XclImpStream& operator>>( XclImpStream& rStrm, XclTokenArrayRef& rxTokArr ); -/** Calls the Write() function at the passed token array. */ -XclExpStream& operator<<( XclExpStream& rStrm, const XclTokenArray& rTokArr ); -/** Calls the Write() function at the passed token array. */ -XclExpStream& operator<<( XclExpStream& rStrm, const XclTokenArrayRef& rxTokArr ); - -// ---------------------------------------------------------------------------- - -namespace formula -{ - class FormulaToken; -} -class ScTokenArray; - -/** Special token array iterator for the Excel filters. - - Iterates over a Calc token array without modifying it (therefore the - iterator can be used with constant token arrays). - - Usage: Construct a new iterator object and pass a Calc token array, or use - the Init() function to assign another Calc token array. As long as the Is() - function returns true, the accessor functions can be used to get the - current Calc token. - */ -class XclTokenArrayIterator -{ -public: - explicit XclTokenArrayIterator(); - explicit XclTokenArrayIterator( const ScTokenArray& rScTokArr, bool bSkipSpaces ); - /** Copy constructor that allowa to change the skip-spaces mode. */ - explicit XclTokenArrayIterator( const XclTokenArrayIterator& rTokArrIt, bool bSkipSpaces ); - - void Init(); - void Init( const ScTokenArray& rScTokArr, bool bSkipSpaces ); - - inline bool Is() const { return mppScToken != 0; } - inline bool operator!() const { return !Is(); } - inline const formula::FormulaToken* Get() const { return mppScToken ? *mppScToken : 0; } - inline const formula::FormulaToken* operator->() const { return Get(); } - inline const formula::FormulaToken& operator*() const { return *Get(); } - - XclTokenArrayIterator& operator++(); - -private: - void NextRawToken(); - void SkipSpaces(); - -private: - const formula::FormulaToken*const* mppScTokenBeg; /// Pointer to first token pointer of token array. - const formula::FormulaToken*const* mppScTokenEnd; /// Pointer behind last token pointer of token array. - const formula::FormulaToken*const* mppScToken; /// Pointer to current token pointer of token array. - bool mbSkipSpaces; /// true = Skip whitespace tokens. -}; - -// ---------------------------------------------------------------------------- - -/** Contains all cell references that can be extracted from a multiple operations formula. */ -struct XclMultipleOpRefs -{ - ScAddress maFmlaScPos; /// Position of the (first) formula cell. - ScAddress maColFirstScPos; - ScAddress maColRelScPos; - ScAddress maRowFirstScPos; - ScAddress maRowRelScPos; - bool mbDblRefMode; /// true = One formula with row and column values. -}; - -// ---------------------------------------------------------------------------- - -/** A helper with Excel specific token array functions. - - The purpose to not add these functions to ScTokenArray is to prevent code - changes in low-level Calc headers and to keep the Excel specific source - code in the filter directory. Deriving from ScTokenArray is not viable - because that would need expensive copy-constructions of the token arrays. - */ -class XclTokenArrayHelper -{ -public: - // token identifiers ------------------------------------------------------ - - /** Returns the base token ID of the passed (classified) token ID. */ - inline static sal_uInt8 GetBaseTokenId( sal_uInt8 nTokenId ) { return nTokenId & EXC_TOKID_MASK; } - /** Returns the classified token ID from a base ID and the token class. */ - inline static sal_uInt8 GetTokenId( sal_uInt8 nBaseId, sal_uInt8 nTokenClass ); - - /** Returns the token class of the passed token ID. */ - inline static sal_uInt8 GetTokenClass( sal_uInt8 nTokenId ) { return nTokenId & EXC_TOKCLASS_MASK; } - /** Changes the token class in the passed classified token ID. */ - inline static void ChangeTokenClass( sal_uInt8& rnTokenId, sal_uInt8 nTokenClass ); - - // strings and string lists ----------------------------------------------- - - /** Tries to extract a string from the passed token. - @param rString (out-parameter) The string contained in the token. - @return true = Passed token is a string token, rString parameter is valid. */ - static bool GetTokenString( String& rString, const formula::FormulaToken& rScToken ); - - /** Parses the passed formula and tries to find a single string token, i.e. "abc". - @param rString (out-parameter) The string contained in the formula. - @return true = String token found, rString parameter is valid. */ - static bool GetString( String& rString, const ScTokenArray& rScTokArr ); - - /** Parses the passed formula and tries to find a string token list, i.e. "abc";"def";"ghi". - @descr Returns the unquoted (!) strings in a single string, separated with the - passed character. If a comma is specified, the function will return abc,def,ghi from - the example above. - @param rStringList (out-parameter) All strings contained in the formula as list. - @param cSep List separator character. - @return true = String token list found, rString parameter is valid. */ - static bool GetStringList( String& rStringList, const ScTokenArray& rScTokArr, sal_Unicode cSep ); - - /** Tries to convert a formula that consists of a single string token to a list of strings. - @descr Example: The formula ="abc\ndef\nghi" will be converted to the formula - ="abc";"def";"ghi", if the LF character is specified as separator. - @param rScTokArr (in/out-parameter) The token array to modify. - @param cStringSep The separator in the source string. - @param bTrimLeadingSpaces true = remove leading spaces from each token. */ - static void ConvertStringToList( ScTokenArray& rScTokArr, sal_Unicode cStringSep, bool bTrimLeadingSpaces ); - - // shared formulas -------------------------------------------------------- - - /** Tries to extract the definition of a shared formula from the passed token array. - @descr Shared formulas are stored as hidden defined names in Calc. This - function looks if the passed token array consists of the reference to - such a hidden defined name and returns its definition on success. */ - static const ScTokenArray* GetSharedFormula( const XclRoot& rRoot, const ScTokenArray& rScTokArr ); - - // multiple operations ---------------------------------------------------- - - /** Parses the passed formula and tries to extract references of a multiple operation. - @descr Requires that the formula contains a single MULTIPLE.OPERATION function call. - Spaces in the formula are silently ignored. - @return true = Multiple operation found, and all references successfully extracted. */ - static bool GetMultipleOpRefs( XclMultipleOpRefs& rRefs, const ScTokenArray& rScTokArr ); -}; - -// ---------------------------------------------------------------------------- - -inline sal_uInt8 XclTokenArrayHelper::GetTokenId( sal_uInt8 nBaseId, sal_uInt8 nTokenClass ) -{ - DBG_ASSERT( !::get_flag( nBaseId, static_cast< sal_uInt8 >( ~EXC_TOKID_MASK ) ), "XclTokenArrayHelper::GetTokenId - invalid token ID" ); - DBG_ASSERT( !::get_flag( nTokenClass, static_cast< sal_uInt8 >( ~EXC_TOKCLASS_MASK ) ), "XclTokenArrayHelper::GetTokenId - invalid token class" ); - return nBaseId | nTokenClass; -} - -inline void XclTokenArrayHelper::ChangeTokenClass( sal_uInt8& rnTokenId, sal_uInt8 nTokenClass ) -{ - DBG_ASSERT( !::get_flag( nTokenClass, static_cast< sal_uInt8 >( ~EXC_TOKCLASS_MASK ) ), "XclTokenArrayHelper::ChangeTokenClass - invalid token class" ); - ::set_flag( rnTokenId, EXC_TOKCLASS_MASK, false ); - ::set_flag( rnTokenId, nTokenClass ); -} - -// ============================================================================ - -#endif - +/************************************************************************* + * + * 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: xlformula.hxx,v $ + * $Revision: 1.14 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SC_XLFORMULA_HXX +#define SC_XLFORMULA_HXX + +#include +#include "address.hxx" +#include "formula/opcode.hxx" +#include "ftools.hxx" + +// Constants ================================================================== + +const size_t EXC_TOKARR_MAXLEN = 4096; /// Maximum size of a token array. + +// Token class flags ---------------------------------------------------------- + +const sal_uInt8 EXC_TOKCLASS_MASK = 0x60; +const sal_uInt8 EXC_TOKCLASS_INOP_FLAG = 0x80; /// Used in operators (internal flag). + +const sal_uInt8 EXC_TOKCLASS_NONE = 0x00; /// 00-1F: Base tokens. +const sal_uInt8 EXC_TOKCLASS_REF = 0x20; /// 20-3F: Reference class tokens. +const sal_uInt8 EXC_TOKCLASS_VAL = 0x40; /// 40-5F: Value class tokens. +const sal_uInt8 EXC_TOKCLASS_ARR = 0x60; /// 60-7F: Array class tokens. + +const sal_uInt8 EXC_TOKCLASS_ANY_IN_REFOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_NONE; +const sal_uInt8 EXC_TOKCLASS_REF_IN_VALOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_REF; +const sal_uInt8 EXC_TOKCLASS_VAL_IN_VALOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_VAL; +const sal_uInt8 EXC_TOKCLASS_ARR_IN_VALOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_ARR; + +// Base tokens ---------------------------------------------------------------- + +const sal_uInt8 EXC_TOKID_MASK = 0x1F; + +const sal_uInt8 EXC_TOKID_NONE = 0x00; /// Placeholder for invalid token id. +const sal_uInt8 EXC_TOKID_EXP = 0x01; /// Array or shared formula reference. +const sal_uInt8 EXC_TOKID_TBL = 0x02; /// Multiple operation reference. +const sal_uInt8 EXC_TOKID_ADD = 0x03; /// Addition operator. +const sal_uInt8 EXC_TOKID_SUB = 0x04; /// Subtraction operator. +const sal_uInt8 EXC_TOKID_MUL = 0x05; /// Multiplication operator. +const sal_uInt8 EXC_TOKID_DIV = 0x06; /// Division operator. +const sal_uInt8 EXC_TOKID_POWER = 0x07; /// Power operator. +const sal_uInt8 EXC_TOKID_CONCAT = 0x08; /// String concatenation operator. +const sal_uInt8 EXC_TOKID_LT = 0x09; /// Less than operator. +const sal_uInt8 EXC_TOKID_LE = 0x0A; /// Less than or equal operator. +const sal_uInt8 EXC_TOKID_EQ = 0x0B; /// Equal operator. +const sal_uInt8 EXC_TOKID_GE = 0x0C; /// Greater than or equal operator. +const sal_uInt8 EXC_TOKID_GT = 0x0D; /// Greater than operator. +const sal_uInt8 EXC_TOKID_NE = 0x0E; /// Not equal operator. +const sal_uInt8 EXC_TOKID_ISECT = 0x0F; /// Intersection operator. +const sal_uInt8 EXC_TOKID_LIST = 0x10; /// List operator. +const sal_uInt8 EXC_TOKID_RANGE = 0x11; /// Range operator. +const sal_uInt8 EXC_TOKID_UPLUS = 0x12; /// Unary plus. +const sal_uInt8 EXC_TOKID_UMINUS = 0x13; /// Unary minus. +const sal_uInt8 EXC_TOKID_PERCENT = 0x14; /// Percent sign. +const sal_uInt8 EXC_TOKID_PAREN = 0x15; /// Parentheses. +const sal_uInt8 EXC_TOKID_MISSARG = 0x16; /// Missing argument. +const sal_uInt8 EXC_TOKID_STR = 0x17; /// String constant. +const sal_uInt8 EXC_TOKID_NLR = 0x18; /// Natural language reference (NLR). +const sal_uInt8 EXC_TOKID_ATTR = 0x19; /// Special attribute. +const sal_uInt8 EXC_TOKID_SHEET = 0x1A; /// Start of a sheet reference (BIFF2-BIFF4). +const sal_uInt8 EXC_TOKID_ENDSHEET = 0x1B; /// End of a sheet reference (BIFF2-BIFF4). +const sal_uInt8 EXC_TOKID_ERR = 0x1C; /// Error constant. +const sal_uInt8 EXC_TOKID_BOOL = 0x1D; /// Boolean constant. +const sal_uInt8 EXC_TOKID_INT = 0x1E; /// Integer constant. +const sal_uInt8 EXC_TOKID_NUM = 0x1F; /// Floating-point constant. + +// Base IDs of classified tokens ---------------------------------------------- + +const sal_uInt8 EXC_TOKID_ARRAY = 0x00; /// Array constant. +const sal_uInt8 EXC_TOKID_FUNC = 0x01; /// Function, fixed number of arguments. +const sal_uInt8 EXC_TOKID_FUNCVAR = 0x02; /// Function, variable number of arguments. +const sal_uInt8 EXC_TOKID_NAME = 0x03; /// Defined name. +const sal_uInt8 EXC_TOKID_REF = 0x04; /// 2D cell reference. +const sal_uInt8 EXC_TOKID_AREA = 0x05; /// 2D area reference. +const sal_uInt8 EXC_TOKID_MEMAREA = 0x06; /// Constant reference subexpression. +const sal_uInt8 EXC_TOKID_MEMERR = 0x07; /// Deleted reference subexpression. +const sal_uInt8 EXC_TOKID_MEMNOMEM = 0x08; /// Constant reference subexpression without result. +const sal_uInt8 EXC_TOKID_MEMFUNC = 0x09; /// Variable reference subexpression. +const sal_uInt8 EXC_TOKID_REFERR = 0x0A; /// Deleted 2D cell reference. +const sal_uInt8 EXC_TOKID_AREAERR = 0x0B; /// Deleted 2D area reference. +const sal_uInt8 EXC_TOKID_REFN = 0x0C; /// Relative 2D cell reference (in names). +const sal_uInt8 EXC_TOKID_AREAN = 0x0D; /// Relative 2D area reference (in names). +const sal_uInt8 EXC_TOKID_MEMAREAN = 0x0E; /// Reference subexpression (in names). +const sal_uInt8 EXC_TOKID_MEMNOMEMN = 0x0F; /// Reference subexpression (in names) without result. +const sal_uInt8 EXC_TOKID_FUNCCE = 0x18; +const sal_uInt8 EXC_TOKID_NAMEX = 0x19; /// External reference. +const sal_uInt8 EXC_TOKID_REF3D = 0x1A; /// 3D cell reference. +const sal_uInt8 EXC_TOKID_AREA3D = 0x1B; /// 3D area reference. +const sal_uInt8 EXC_TOKID_REFERR3D = 0x1C; /// Deleted 3D cell reference. +const sal_uInt8 EXC_TOKID_AREAERR3D = 0x1D; /// Deleted 3D area reference + +// specific token constants --------------------------------------------------- + +const sal_uInt16 EXC_TOK_STR_MAXLEN = 255; /// Maximum string length of a tStr token. + +const sal_uInt8 EXC_TOK_BOOL_FALSE = 0; /// FALSE value of a tBool token. +const sal_uInt8 EXC_TOK_BOOL_TRUE = 1; /// TRUE value of a tBool token. + +const sal_uInt8 EXC_TOK_ATTR_VOLATILE = 0x01; /// Volatile function. +const sal_uInt8 EXC_TOK_ATTR_IF = 0x02; /// Start of true condition in IF function. +const sal_uInt8 EXC_TOK_ATTR_CHOOSE = 0x04; /// Jump array of CHOOSE function. +const sal_uInt8 EXC_TOK_ATTR_GOTO = 0x08; /// Jump to token. +const sal_uInt8 EXC_TOK_ATTR_SUM = 0x10; /// SUM function with one parameter. +const sal_uInt8 EXC_TOK_ATTR_ASSIGN = 0x20; /// BASIC style assignment. +const sal_uInt8 EXC_TOK_ATTR_SPACE = 0x40; /// Spaces in formula representation. + +const sal_uInt8 EXC_TOK_ATTR_SPACE_SP = 0x00; /// Spaces before next token. +const sal_uInt8 EXC_TOK_ATTR_SPACE_BR = 0x01; /// Line breaks before next token. +const sal_uInt8 EXC_TOK_ATTR_SPACE_SP_OPEN = 0x02; /// Spaces before opening parenthesis. +const sal_uInt8 EXC_TOK_ATTR_SPACE_BR_OPEN = 0x03; /// Line breaks before opening parenthesis. +const sal_uInt8 EXC_TOK_ATTR_SPACE_SP_CLOSE = 0x04; /// Spaces before closing parenthesis. +const sal_uInt8 EXC_TOK_ATTR_SPACE_BR_CLOSE = 0x05; /// Line breaks before closing parenthesis. +const sal_uInt8 EXC_TOK_ATTR_SPACE_SP_PRE = 0x06; /// Spaces before formula (BIFF3). + +const sal_uInt16 EXC_TOK_FUNCVAR_CMD = 0x8000; /// Macro command. +const sal_uInt16 EXC_TOK_FUNCVAR_INDEXMASK = 0x7FFF; /// Mask for function/command index. +const sal_uInt8 EXC_TOK_FUNCVAR_PROMPT = 0x80; /// User prompt for macro commands. +const sal_uInt8 EXC_TOK_FUNCVAR_COUNTMASK = 0x7F; /// Mask for parameter count. + +const sal_uInt16 EXC_TOK_REF_COLREL = 0x4000; /// True = Column is relative. +const sal_uInt16 EXC_TOK_REF_ROWREL = 0x8000; /// True = Row is relative. + +const sal_uInt8 EXC_TOK_NLR_ERR = 0x01; /// NLR: Invalid/deleted. +const sal_uInt8 EXC_TOK_NLR_ROWR = 0x02; /// NLR: Row index. +const sal_uInt8 EXC_TOK_NLR_COLR = 0x03; /// NLR: Column index. +const sal_uInt8 EXC_TOK_NLR_ROWV = 0x06; /// NLR: Value in row. +const sal_uInt8 EXC_TOK_NLR_COLV = 0x07; /// NLR: Value in column. +const sal_uInt8 EXC_TOK_NLR_RANGE = 0x0A; /// NLR: Range. +const sal_uInt8 EXC_TOK_NLR_SRANGE = 0x0B; /// Stacked NLR: Range. +const sal_uInt8 EXC_TOK_NLR_SROWR = 0x0C; /// Stacked NLR: Row index. +const sal_uInt8 EXC_TOK_NLR_SCOLR = 0x0D; /// Stacked NLR: Column index. +const sal_uInt8 EXC_TOK_NLR_SROWV = 0x0E; /// Stacked NLR: Value in row. +const sal_uInt8 EXC_TOK_NLR_SCOLV = 0x0F; /// Stacked NLR: Value in column. +const sal_uInt8 EXC_TOK_NLR_RANGEERR = 0x10; /// NLR: Invalid/deleted range. +const sal_uInt8 EXC_TOK_NLR_SXNAME = 0x1D; /// NLR: Pivot table name. +const sal_uInt16 EXC_TOK_NLR_REL = 0x8000; /// True = Natural language ref is relative. + +const sal_uInt32 EXC_TOK_NLR_ADDREL = 0x80000000; /// NLR relative (in appended data). +const sal_uInt32 EXC_TOK_NLR_ADDMASK = 0x3FFFFFFF; /// Mask for number of appended ranges. + +// ---------------------------------------------------------------------------- + +/** Type of a formula. */ +enum XclFormulaType +{ + EXC_FMLATYPE_CELL, /// Simple cell formula, also used in change tracking. + EXC_FMLATYPE_MATRIX, /// Matrix (array) formula. + EXC_FMLATYPE_SHARED, /// Shared formula. + EXC_FMLATYPE_CONDFMT, /// Conditional format. + EXC_FMLATYPE_DATAVAL, /// Data validation. + EXC_FMLATYPE_NAME, /// Defined name. + EXC_FMLATYPE_CHART, /// Chart source ranges. + EXC_FMLATYPE_CONTROL, /// Spreadsheet links in form controls. + EXC_FMLATYPE_WQUERY, /// Web query source range. + EXC_FMLATYPE_LISTVAL /// List (cell range) validation. +}; + +// Function data ============================================================== + +const sal_uInt8 EXC_FUNC_MAXPARAM = 30; /// Maximum parameter count. + +const sal_uInt8 EXC_FUNC_PAR_CALCONLY = 0xFD; /// Placeholder for a parameter existing in Calc, but not in Excel. +const sal_uInt8 EXC_FUNC_PAR_EXCELONLY = 0xFE; /// Placeholder for a parameter existing in Excel, but not in Calc. +const sal_uInt8 EXC_FUNC_PAR_INVALID = 0xFF; /// Placeholder for an invalid token class. + +const sal_uInt8 EXC_FUNCINFO_CLASSCOUNT = 5; /// Number of token class entries. + +const sal_uInt8 EXC_FUNCFLAG_VOLATILE = 0x01; /// Result is volatile (e.g. NOW() function). +const sal_uInt8 EXC_FUNCFLAG_IMPORTONLY = 0x02; /// Only used in import filter. +const sal_uInt8 EXC_FUNCFLAG_EXPORTONLY = 0x04; /// Only used in export filter. + +// selected function IDs +const sal_uInt16 EXC_FUNCID_IF = 1; +const sal_uInt16 EXC_FUNCID_SUM = 4; +const sal_uInt16 EXC_FUNCID_AND = 36; +const sal_uInt16 EXC_FUNCID_OR = 37; +const sal_uInt16 EXC_FUNCID_CHOOSE = 100; +const sal_uInt16 EXC_FUNCID_EXTERNCALL = 255; + +/** Represents information for a spreadsheet function for import and export. + + The member mpnParamClass contains an array of token classes for each + parameter of the function. The last existing (non-null) value in this array + is used for all following parameters used in a function. Additionally to + the three actual token classes, this array may contain the special values + EXC_FUNC_PAR_CALCONLY, EXC_FUNC_PAR_EXCELONLY, and EXC_FUNC_PAR_INVALID. + The former two specify parameters only existing in one of the applications. + EXC_FUNC_PAR_INVALID is simply a terminator for the array to prevent that + the last token class or special value is repeated for additional parameters. + */ +struct XclFunctionInfo +{ + OpCode meOpCode; /// Calc function opcode. + sal_uInt16 mnXclFunc; /// Excel function index. + sal_uInt8 mnMinParamCount; /// Minimum number of parameters. + sal_uInt8 mnMaxParamCount; /// Maximum number of parameters. + sal_uInt8 mnRetClass; /// Token class of the return value. + sal_uInt8 mpnParamClass[ EXC_FUNCINFO_CLASSCOUNT ]; /// Expected token classes of parameters. + sal_uInt8 mnFlags; /// Additional flags. + const sal_Char* mpcMacroName; /// Function name, if simulated by a macro call (UTF-8). + + /** Returns true, if the function is volatile. */ + inline bool IsVolatile() const { return ::get_flag( mnFlags, EXC_FUNCFLAG_VOLATILE ); } + /** Returns true, if the function is simulated by a macro call. */ + inline bool IsMacroFunc() const { return mpcMacroName != 0; } + /** Returns the name of the external function as string. */ + String GetMacroFuncName() const; +}; + +// ---------------------------------------------------------------------------- + +class XclRoot; + +/** Provides access to function info structs for all available functions. */ +class XclFunctionProvider +{ +public: + explicit XclFunctionProvider( const XclRoot& rRoot ); + + /** Returns the function data for an Excel function index, or 0 on error. */ + const XclFunctionInfo* GetFuncInfoFromXclFunc( sal_uInt16 nXclFunc ) const; + /** Returns the function data for an Excel function simulated by a macro call, or 0 on error. */ + const XclFunctionInfo* GetFuncInfoFromXclMacroName( const String& rXclMacroName ) const; + /** Returns the function data for a Calc opcode, or 0 on error. */ + const XclFunctionInfo* GetFuncInfoFromOpCode( OpCode eOpCode ) const; + +private: + void FillXclFuncMap( const XclFunctionInfo* pBeg, const XclFunctionInfo* pEnd ); + void FillScFuncMap( const XclFunctionInfo* pBeg, const XclFunctionInfo* pEnd ); + +private: + typedef ::std::map< sal_uInt16, const XclFunctionInfo* > XclFuncMap; + typedef ::std::map< String, const XclFunctionInfo* > XclMacroNameMap; + typedef ::std::map< OpCode, const XclFunctionInfo* > ScFuncMap; + + XclFuncMap maXclFuncMap; /// Maps Excel function indexes to function data. + XclMacroNameMap maXclMacroNameMap; /// Maps macro function names to function data. + ScFuncMap maScFuncMap; /// Maps Calc opcodes to function data. +}; + +// Token array ================================================================ + +class XclImpStream; +class XclExpStream; + +/** Binary representation of an Excel token array. */ +class XclTokenArray +{ +public: + /** Creates an empty token array. */ + explicit XclTokenArray( bool bVolatile = false ); + /** Creates a token array, swaps passed token vector into own data. */ + explicit XclTokenArray( ScfUInt8Vec& rTokVec, bool bVolatile = false, + ScfUInt8Vec* pExtensionTokens = NULL); + + /** Returns true, if the token array is empty. */ + inline bool Empty() const { return maTokVec.empty(); } + /** Returns the size of the token array in bytes. */ + sal_uInt16 GetSize() const; + /** Returns read-only access to the byte vector storing token data. */ + inline const sal_uInt8* GetData() const { return maTokVec.empty() ? 0 : &maTokVec.front(); } + /** Returns true, if the formula contains a volatile function. */ + inline bool IsVolatile() const { return mbVolatile; } + + /** Reads the size field of the token array. */ + void ReadSize( XclImpStream& rStrm ); + /** Reads the tokens of the token array (without size field). */ + void ReadArray( XclImpStream& rStrm ); + /** Reads size field and the tokens. */ + void Read( XclImpStream& rStrm ); + + /** Writes the size field of the token array. */ + void WriteSize( XclExpStream& rStrm ) const; + /** Writes the tokens of the token array (without size field). */ + void WriteArray( XclExpStream& rStrm ) const; + /** Writes size field and the tokens. */ + void Write( XclExpStream& rStrm ) const; + + /** Compares this token array with the passed. */ + bool operator==( const XclTokenArray& rTokArr ) const; + +private: + ScfUInt8Vec maTokVec; /// Byte vector containing token data. + ScfUInt8Vec maExtensions; /// Byte vector of extensions (eg inline arrays) + bool mbVolatile; /// True = Formula contains volatile function. +}; + +typedef ScfRef< XclTokenArray > XclTokenArrayRef; + +/** Calls the Read() function at the passed token array. */ +XclImpStream& operator>>( XclImpStream& rStrm, XclTokenArray& rTokArr ); +/** Calls the Read() function at the passed token array. */ +XclImpStream& operator>>( XclImpStream& rStrm, XclTokenArrayRef& rxTokArr ); +/** Calls the Write() function at the passed token array. */ +XclExpStream& operator<<( XclExpStream& rStrm, const XclTokenArray& rTokArr ); +/** Calls the Write() function at the passed token array. */ +XclExpStream& operator<<( XclExpStream& rStrm, const XclTokenArrayRef& rxTokArr ); + +// ---------------------------------------------------------------------------- + +namespace formula +{ + class FormulaToken; +} +class ScTokenArray; + +/** Special token array iterator for the Excel filters. + + Iterates over a Calc token array without modifying it (therefore the + iterator can be used with constant token arrays). + + Usage: Construct a new iterator object and pass a Calc token array, or use + the Init() function to assign another Calc token array. As long as the Is() + function returns true, the accessor functions can be used to get the + current Calc token. + */ +class XclTokenArrayIterator +{ +public: + explicit XclTokenArrayIterator(); + explicit XclTokenArrayIterator( const ScTokenArray& rScTokArr, bool bSkipSpaces ); + /** Copy constructor that allowa to change the skip-spaces mode. */ + explicit XclTokenArrayIterator( const XclTokenArrayIterator& rTokArrIt, bool bSkipSpaces ); + + void Init(); + void Init( const ScTokenArray& rScTokArr, bool bSkipSpaces ); + + inline bool Is() const { return mppScToken != 0; } + inline bool operator!() const { return !Is(); } + inline const formula::FormulaToken* Get() const { return mppScToken ? *mppScToken : 0; } + inline const formula::FormulaToken* operator->() const { return Get(); } + inline const formula::FormulaToken& operator*() const { return *Get(); } + + XclTokenArrayIterator& operator++(); + +private: + void NextRawToken(); + void SkipSpaces(); + +private: + const formula::FormulaToken*const* mppScTokenBeg; /// Pointer to first token pointer of token array. + const formula::FormulaToken*const* mppScTokenEnd; /// Pointer behind last token pointer of token array. + const formula::FormulaToken*const* mppScToken; /// Pointer to current token pointer of token array. + bool mbSkipSpaces; /// true = Skip whitespace tokens. +}; + +// ---------------------------------------------------------------------------- + +/** Contains all cell references that can be extracted from a multiple operations formula. */ +struct XclMultipleOpRefs +{ + ScAddress maFmlaScPos; /// Position of the (first) formula cell. + ScAddress maColFirstScPos; + ScAddress maColRelScPos; + ScAddress maRowFirstScPos; + ScAddress maRowRelScPos; + bool mbDblRefMode; /// true = One formula with row and column values. +}; + +// ---------------------------------------------------------------------------- + +/** A helper with Excel specific token array functions. + + The purpose to not add these functions to ScTokenArray is to prevent code + changes in low-level Calc headers and to keep the Excel specific source + code in the filter directory. Deriving from ScTokenArray is not viable + because that would need expensive copy-constructions of the token arrays. + */ +class XclTokenArrayHelper +{ +public: + // token identifiers ------------------------------------------------------ + + /** Returns the base token ID of the passed (classified) token ID. */ + inline static sal_uInt8 GetBaseTokenId( sal_uInt8 nTokenId ) { return nTokenId & EXC_TOKID_MASK; } + /** Returns the classified token ID from a base ID and the token class. */ + inline static sal_uInt8 GetTokenId( sal_uInt8 nBaseId, sal_uInt8 nTokenClass ); + + /** Returns the token class of the passed token ID. */ + inline static sal_uInt8 GetTokenClass( sal_uInt8 nTokenId ) { return nTokenId & EXC_TOKCLASS_MASK; } + /** Changes the token class in the passed classified token ID. */ + inline static void ChangeTokenClass( sal_uInt8& rnTokenId, sal_uInt8 nTokenClass ); + + // strings and string lists ----------------------------------------------- + + /** Tries to extract a string from the passed token. + @param rString (out-parameter) The string contained in the token. + @return true = Passed token is a string token, rString parameter is valid. */ + static bool GetTokenString( String& rString, const formula::FormulaToken& rScToken ); + + /** Parses the passed formula and tries to find a single string token, i.e. "abc". + @param rString (out-parameter) The string contained in the formula. + @return true = String token found, rString parameter is valid. */ + static bool GetString( String& rString, const ScTokenArray& rScTokArr ); + + /** Parses the passed formula and tries to find a string token list, i.e. "abc";"def";"ghi". + @descr Returns the unquoted (!) strings in a single string, separated with the + passed character. If a comma is specified, the function will return abc,def,ghi from + the example above. + @param rStringList (out-parameter) All strings contained in the formula as list. + @param cSep List separator character. + @return true = String token list found, rString parameter is valid. */ + static bool GetStringList( String& rStringList, const ScTokenArray& rScTokArr, sal_Unicode cSep ); + + /** Tries to convert a formula that consists of a single string token to a list of strings. + @descr Example: The formula ="abc\ndef\nghi" will be converted to the formula + ="abc";"def";"ghi", if the LF character is specified as separator. + @param rScTokArr (in/out-parameter) The token array to modify. + @param cStringSep The separator in the source string. + @param bTrimLeadingSpaces true = remove leading spaces from each token. */ + static void ConvertStringToList( ScTokenArray& rScTokArr, sal_Unicode cStringSep, bool bTrimLeadingSpaces ); + + // shared formulas -------------------------------------------------------- + + /** Tries to extract the definition of a shared formula from the passed token array. + @descr Shared formulas are stored as hidden defined names in Calc. This + function looks if the passed token array consists of the reference to + such a hidden defined name and returns its definition on success. */ + static const ScTokenArray* GetSharedFormula( const XclRoot& rRoot, const ScTokenArray& rScTokArr ); + + // multiple operations ---------------------------------------------------- + + /** Parses the passed formula and tries to extract references of a multiple operation. + @descr Requires that the formula contains a single MULTIPLE.OPERATION function call. + Spaces in the formula are silently ignored. + @return true = Multiple operation found, and all references successfully extracted. */ + static bool GetMultipleOpRefs( XclMultipleOpRefs& rRefs, const ScTokenArray& rScTokArr ); +}; + +// ---------------------------------------------------------------------------- + +inline sal_uInt8 XclTokenArrayHelper::GetTokenId( sal_uInt8 nBaseId, sal_uInt8 nTokenClass ) +{ + DBG_ASSERT( !::get_flag( nBaseId, static_cast< sal_uInt8 >( ~EXC_TOKID_MASK ) ), "XclTokenArrayHelper::GetTokenId - invalid token ID" ); + DBG_ASSERT( !::get_flag( nTokenClass, static_cast< sal_uInt8 >( ~EXC_TOKCLASS_MASK ) ), "XclTokenArrayHelper::GetTokenId - invalid token class" ); + return nBaseId | nTokenClass; +} + +inline void XclTokenArrayHelper::ChangeTokenClass( sal_uInt8& rnTokenId, sal_uInt8 nTokenClass ) +{ + DBG_ASSERT( !::get_flag( nTokenClass, static_cast< sal_uInt8 >( ~EXC_TOKCLASS_MASK ) ), "XclTokenArrayHelper::ChangeTokenClass - invalid token class" ); + ::set_flag( rnTokenId, EXC_TOKCLASS_MASK, false ); + ::set_flag( rnTokenId, nTokenClass ); +} + +// ============================================================================ + +#endif + diff --git a/sc/source/filter/xml/XMLStylesExportHelper.cxx b/sc/source/filter/xml/XMLStylesExportHelper.cxx index c38c01f7efec..bc607c0a2ab0 100644 --- a/sc/source/filter/xml/XMLStylesExportHelper.cxx +++ b/sc/source/filter/xml/XMLStylesExportHelper.cxx @@ -1,1245 +1,1245 @@ -/************************************************************************* - * - * 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: XMLStylesExportHelper.cxx,v $ - * $Revision: 1.52 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - -// INCLUDE --------------------------------------------------------------- -#include "XMLStylesExportHelper.hxx" -#include "global.hxx" -#include "unonames.hxx" -#include "XMLConverter.hxx" -#include "xmlexprt.hxx" -#include "document.hxx" -#include "rangeutl.hxx" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -using namespace com::sun::star; -using namespace xmloff::token; - -ScMyValidation::ScMyValidation() - : sName(), - sErrorMessage(), - sErrorTitle(), - sImputMessage(), - sImputTitle(), - sFormula1(), - sFormula2(), - bShowErrorMessage(sal_False), - bShowImputMessage(sal_False), - bIgnoreBlanks(sal_False) -{ -} - -ScMyValidation::~ScMyValidation() -{ -} - -sal_Bool ScMyValidation::IsEqual(const ScMyValidation& aVal) const -{ - if (aVal.bIgnoreBlanks == bIgnoreBlanks && - aVal.bShowImputMessage == bShowImputMessage && - aVal.bShowErrorMessage == bShowErrorMessage && - aVal.aBaseCell.Sheet == aBaseCell.Sheet && - aVal.aBaseCell.Column == aBaseCell.Column && - aVal.aBaseCell.Row == aBaseCell.Row && - aVal.aAlertStyle == aAlertStyle && - aVal.aValidationType == aValidationType && - aVal.aOperator == aOperator && - aVal.sErrorTitle == sErrorTitle && - aVal.sImputTitle == sImputTitle && - aVal.sErrorMessage == sErrorMessage && - aVal.sImputMessage == sImputMessage && - aVal.sFormula1 == sFormula1 && - aVal.sFormula2 == sFormula2) - return sal_True; - else - return sal_False; -} - -ScMyValidationsContainer::ScMyValidationsContainer() - : aValidationVec(), - sEmptyString(), - sERRALSTY(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRALSTY)), - sIGNOREBL(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_IGNOREBL)), - sSHOWLIST(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWLIST)), - sTYPE(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_TYPE)), - sSHOWINP(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWINP)), - sSHOWERR(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWERR)), - sINPTITLE(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_INPTITLE)), - sINPMESS(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_INPMESS)), - sERRTITLE(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRTITLE)), - sERRMESS(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRMESS)), - sOnError(RTL_CONSTASCII_USTRINGPARAM("OnError")), - sEventType(RTL_CONSTASCII_USTRINGPARAM("EventType")), - sStarBasic(RTL_CONSTASCII_USTRINGPARAM("StarBasic")), - sScript(RTL_CONSTASCII_USTRINGPARAM("Script")), - sLibrary(RTL_CONSTASCII_USTRINGPARAM("Library")), - sMacroName(RTL_CONSTASCII_USTRINGPARAM("MacroName")) -{ -} - -ScMyValidationsContainer::~ScMyValidationsContainer() -{ -} - -sal_Bool ScMyValidationsContainer::AddValidation(const uno::Any& aTempAny, - sal_Int32& nValidationIndex) -{ - sal_Bool bAdded(sal_False); - uno::Reference xPropertySet(aTempAny, uno::UNO_QUERY); - if (xPropertySet.is()) - { - rtl::OUString sErrorMessage; - xPropertySet->getPropertyValue(sERRMESS) >>= sErrorMessage; - rtl::OUString sErrorTitle; - xPropertySet->getPropertyValue(sERRTITLE) >>= sErrorTitle; - rtl::OUString sImputMessage; - xPropertySet->getPropertyValue(sINPMESS) >>= sImputMessage; - rtl::OUString sImputTitle; - xPropertySet->getPropertyValue(sINPTITLE) >>= sImputTitle; - sal_Bool bShowErrorMessage = ::cppu::any2bool(xPropertySet->getPropertyValue(sSHOWERR)); - sal_Bool bShowImputMessage = ::cppu::any2bool(xPropertySet->getPropertyValue(sSHOWINP)); - sheet::ValidationType aValidationType; - xPropertySet->getPropertyValue(sTYPE) >>= aValidationType; - if (bShowErrorMessage || bShowImputMessage || aValidationType != sheet::ValidationType_ANY || - sErrorMessage.getLength() || sErrorTitle.getLength() || sImputMessage.getLength() || sImputTitle.getLength()) - { - ScMyValidation aValidation; - aValidation.sErrorMessage = sErrorMessage; - aValidation.sErrorTitle = sErrorTitle; - aValidation.sImputMessage = sImputMessage; - aValidation.sImputTitle = sImputTitle; - aValidation.bShowErrorMessage = bShowErrorMessage; - aValidation.bShowImputMessage = bShowImputMessage; - aValidation.aValidationType = aValidationType; - aValidation.bIgnoreBlanks = ::cppu::any2bool(xPropertySet->getPropertyValue(sIGNOREBL)); - xPropertySet->getPropertyValue(sSHOWLIST) >>= aValidation.nShowList; - xPropertySet->getPropertyValue(sERRALSTY) >>= aValidation.aAlertStyle; - uno::Reference xCondition(xPropertySet, uno::UNO_QUERY); - if (xCondition.is()) - { - aValidation.sFormula1 = xCondition->getFormula1(); - aValidation.sFormula2 = xCondition->getFormula2(); - aValidation.aOperator = xCondition->getOperator(); - aValidation.aBaseCell = xCondition->getSourcePosition(); - } - //ScMyValidationRange aValidationRange; - sal_Bool bEqualFound(sal_False); - sal_Int32 i(0); - sal_Int32 nCount(aValidationVec.size()); - while (i < nCount && !bEqualFound) - { - bEqualFound = aValidationVec[i].IsEqual(aValidation); - if (!bEqualFound) - ++i; - } - if (bEqualFound) - nValidationIndex = i; - else - { - sal_Int32 nNameIndex(nCount + 1); - rtl::OUString sCount(rtl::OUString::valueOf(nNameIndex)); - rtl::OUString sPrefix(RTL_CONSTASCII_USTRINGPARAM("val")); - aValidation.sName += sPrefix; - aValidation.sName += sCount; - aValidationVec.push_back(aValidation); - nValidationIndex = nCount; - bAdded = sal_True; - } - } - } - return bAdded; -} - -rtl::OUString ScMyValidationsContainer::GetCondition(ScXMLExport& rExport, const ScMyValidation& aValidation) -{ - rtl::OUString sCondition; - if (aValidation.aValidationType != sheet::ValidationType_ANY) - { - switch (aValidation.aValidationType) - { - //case sheet::ValidationType_CUSTOM - case sheet::ValidationType_DATE : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-date()")); - break; - case sheet::ValidationType_DECIMAL : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-decimal-number()")); - break; - case sheet::ValidationType_LIST : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-in-list(")); - sCondition += aValidation.sFormula1; - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")); - break; - case sheet::ValidationType_TEXT_LEN : - if (aValidation.aOperator != sheet::ConditionOperator_BETWEEN && - aValidation.aOperator != sheet::ConditionOperator_NOT_BETWEEN) - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length()")); - break; - case sheet::ValidationType_TIME : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-time()")); - break; - case sheet::ValidationType_WHOLE : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-whole-number()")); - break; - default: - { - // added to avoid warnings - } - } - if (aValidation.aValidationType != sheet::ValidationType_LIST && - (aValidation.sFormula1.getLength() || - (aValidation.aOperator == sheet::ConditionOperator_BETWEEN && - aValidation.aOperator == sheet::ConditionOperator_NOT_BETWEEN && - aValidation.sFormula2.getLength()))) - { - if (aValidation.aValidationType != sheet::ValidationType_TEXT_LEN) - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" and ")); - if (aValidation.aOperator != sheet::ConditionOperator_BETWEEN && - aValidation.aOperator != sheet::ConditionOperator_NOT_BETWEEN) - { - if (aValidation.aValidationType != sheet::ValidationType_TEXT_LEN) - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content()")); - switch (aValidation.aOperator) - { - case sheet::ConditionOperator_EQUAL : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("=")); - break; - case sheet::ConditionOperator_GREATER : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">")); - break; - case sheet::ConditionOperator_GREATER_EQUAL : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">=")); - break; - case sheet::ConditionOperator_LESS : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<")); - break; - case sheet::ConditionOperator_LESS_EQUAL : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<=")); - break; - case sheet::ConditionOperator_NOT_EQUAL : - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("!=")); - break; - default: - { - // added to avoid warnings - } - } - sCondition += aValidation.sFormula1; - } - else - { - if (aValidation.aValidationType == sheet::ValidationType_TEXT_LEN) - { - if (aValidation.aOperator == sheet::ConditionOperator_BETWEEN) - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length-is-between(")); - else - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length-is-not-between(")); - } - else - { - if (aValidation.aOperator == sheet::ConditionOperator_BETWEEN) - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-between(")); - else - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-not-between(")); - } - sCondition += aValidation.sFormula1; - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(",")); - sCondition += aValidation.sFormula2; - sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")); - } - } - else - if (aValidation.aValidationType == sheet::ValidationType_TEXT_LEN) - sCondition = rtl::OUString(); - } - if (sCondition.getLength()) - { - const formula::FormulaGrammar::Grammar eGrammar = rExport.GetDocument()->GetStorageGrammar(); - sal_uInt16 nNamespacePrefix = (eGrammar == formula::FormulaGrammar::GRAM_ODFF ? XML_NAMESPACE_OF : XML_NAMESPACE_OOOC); - sCondition = rExport.GetNamespaceMap().GetQNameByKey( nNamespacePrefix, sCondition, sal_False ); - } - - return sCondition; -} - -rtl::OUString ScMyValidationsContainer::GetBaseCellAddress(ScDocument* pDoc, const table::CellAddress& aCell) -{ - rtl::OUString sAddress; - ScRangeStringConverter::GetStringFromAddress( sAddress, aCell, pDoc ); - return sAddress; -} - -void ScMyValidationsContainer::WriteMessage(ScXMLExport& rExport, - const rtl::OUString& sTitle, const rtl::OUString& sOUMessage, - const sal_Bool bShowMessage, const sal_Bool bIsHelpMessage) -{ - if (sTitle.getLength()) - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TITLE, sTitle); - if (bShowMessage) - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, XML_TRUE); - else - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, XML_FALSE); - SvXMLElementExport* pMessage(NULL); - if (bIsHelpMessage) - pMessage = new SvXMLElementExport(rExport, XML_NAMESPACE_TABLE, XML_HELP_MESSAGE, sal_True, sal_True); - else - pMessage = new SvXMLElementExport(rExport, XML_NAMESPACE_TABLE, XML_ERROR_MESSAGE, sal_True, sal_True); - if (sOUMessage.getLength()) - { - sal_Int32 i(0); - rtl::OUStringBuffer sTemp; - String sMessage(sOUMessage); - rtl::OUString sText (sMessage.ConvertLineEnd(LINEEND_LF)); - sal_Bool bPrevCharWasSpace(sal_True); - while(i < sText.getLength()) - { - if ((sText[i] == '\n')) - { - SvXMLElementExport aElemP(rExport, XML_NAMESPACE_TEXT, XML_P, sal_True, sal_False); - rExport.GetTextParagraphExport()->exportText(sTemp.makeStringAndClear(), bPrevCharWasSpace); - } - else - sTemp.append(sText[i]); - ++i; - } - if (sTemp.getLength()) - { - SvXMLElementExport aElemP(rExport, XML_NAMESPACE_TEXT, XML_P, sal_True, sal_False); - rExport.GetTextParagraphExport()->exportText(sTemp.makeStringAndClear(), bPrevCharWasSpace); - } - } - if (pMessage) - delete pMessage; -} - -void ScMyValidationsContainer::WriteValidations(ScXMLExport& rExport) -{ - if (aValidationVec.size()) - { - SvXMLElementExport aElemVs(rExport, XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATIONS, sal_True, sal_True); - ScMyValidationVec::iterator aItr(aValidationVec.begin()); - ScMyValidationVec::iterator aEndItr(aValidationVec.end()); - while (aItr != aEndItr) - { - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, aItr->sName); - rtl::OUString sCondition(GetCondition(rExport, *aItr)); - if (sCondition.getLength()) - { - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CONDITION, sCondition); - if (aItr->bIgnoreBlanks) - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ALLOW_EMPTY_CELL, XML_TRUE); - else - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ALLOW_EMPTY_CELL, XML_FALSE); - if (aItr->aValidationType == sheet::ValidationType_LIST) - { - switch (aItr->nShowList) - { - case sheet::TableValidationVisibility::INVISIBLE: - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_LIST, XML_NO); - break; - case sheet::TableValidationVisibility::UNSORTED: - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_LIST, XML_UNSORTED); - break; - case sheet::TableValidationVisibility::SORTEDASCENDING: - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_LIST, XML_SORTED_ASCENDING); - break; - default: - DBG_ERROR("unknown ListType"); - } - } - } - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_BASE_CELL_ADDRESS, GetBaseCellAddress(rExport.GetDocument(), aItr->aBaseCell)); - SvXMLElementExport aElemV(rExport, XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATION, sal_True, sal_True); - if (aItr->bShowImputMessage || aItr->sImputMessage.getLength() || aItr->sImputTitle.getLength()) - { - WriteMessage(rExport, aItr->sImputTitle, aItr->sImputMessage, aItr->bShowImputMessage, sal_True); - } - if (aItr->bShowErrorMessage || aItr->sErrorMessage.getLength() || aItr->sErrorTitle.getLength()) - { - switch (aItr->aAlertStyle) - { - case sheet::ValidationAlertStyle_INFO : - { - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MESSAGE_TYPE, XML_INFORMATION); - WriteMessage(rExport, aItr->sErrorTitle, aItr->sErrorMessage, aItr->bShowErrorMessage, sal_False); - } - break; - case sheet::ValidationAlertStyle_WARNING : - { - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MESSAGE_TYPE, XML_WARNING); - WriteMessage(rExport, aItr->sErrorTitle, aItr->sErrorMessage, aItr->bShowErrorMessage, sal_False); - } - break; - case sheet::ValidationAlertStyle_STOP : - { - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MESSAGE_TYPE, XML_STOP); - WriteMessage(rExport, aItr->sErrorTitle, aItr->sErrorMessage, aItr->bShowErrorMessage, sal_False); - } - break; - case sheet::ValidationAlertStyle_MACRO : - { - { - //rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, aItr->sErrorTitle); - if (aItr->bShowErrorMessage) - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_EXECUTE, XML_TRUE); - else - rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_EXECUTE, XML_FALSE); - SvXMLElementExport aEMElem(rExport, XML_NAMESPACE_TABLE, XML_ERROR_MACRO, sal_True, sal_True); - } - { - // #i47525# for a script URL the type and the property name for the URL - // are both "Script", for a simple macro name the type is "StarBasic" - // and the property name is "MacroName". - bool bScriptURL = SfxApplication::IsXScriptURL( aItr->sErrorTitle ); - - uno::Sequence aSeq(3); - beans::PropertyValue* pArr(aSeq.getArray()); - pArr[0].Name = sEventType; - pArr[0].Value <<= bScriptURL ? sScript : sStarBasic; - pArr[1].Name = sLibrary; - pArr[1].Value <<= sEmptyString; - pArr[2].Name = bScriptURL ? sScript : sMacroName; - pArr[2].Value <<= aItr->sErrorTitle; - - // 2) export the sequence - rExport.GetEventExport().ExportSingleEvent( aSeq, sOnError); - } - } - break; - default: - { - // added to avoid warnings - } - } - } - ++aItr; - } - } -} - -const rtl::OUString& ScMyValidationsContainer::GetValidationName(const sal_Int32 nIndex) -{ - DBG_ASSERT( static_cast(nIndex) < aValidationVec.size(), "out of range" ); - return aValidationVec[nIndex].sName; -} - -//============================================================================== - -sal_Int32 ScMyDefaultStyles::GetStyleNameIndex(const ScFormatRangeStyles* pCellStyles, - const sal_Int32 nTable, const sal_Int32 nPos, - const sal_Int32 i, const sal_Bool bRow, sal_Bool& bIsAutoStyle) -{ - if (bRow) - return pCellStyles->GetStyleNameIndex(nTable, nPos, i, - bIsAutoStyle); - else - return pCellStyles->GetStyleNameIndex(nTable, i, nPos, - bIsAutoStyle); -} - -void ScMyDefaultStyles::FillDefaultStyles(const sal_Int32 nTable, - const sal_Int32 nLastRow, const sal_Int32 nLastCol, - const ScFormatRangeStyles* pCellStyles, ScDocument* pDoc, - const sal_Bool bRow) -{ - if (pDoc) - { - SCTAB nTab = static_cast(nTable); - sal_Int32 nPos; - sal_Int32 nLast; - ScMyDefaultStyleList* pDefaults; - if (bRow) - { - pDefaults = pRowDefaults; - nLast = nLastRow; - } - else - { - pDefaults = pColDefaults; - nLast = nLastCol; - } - sal_Bool bPrevAutoStyle(sal_False); - sal_Bool bIsAutoStyle; - sal_Bool bResult; - sal_Int32 nPrevIndex(0); - sal_Int32 nIndex; - sal_Int32 nRepeat(0); - sal_Int32 nEmptyRepeat(0); - for (sal_Int32 i = nLast; i >= 0; --i) - { - if (bRow) - { - SCCOL nCol; - bResult = pDoc->GetRowDefault(nTab, - static_cast(i), static_cast(nLastCol), nCol); - nPos = static_cast(nCol); - } - else - { - SCROW nRow; - bResult = pDoc->GetColDefault(nTab, - static_cast(i), static_cast(nLastRow), nRow); - nPos = static_cast(nRow); - } - if (bResult) - { - nEmptyRepeat = 0; - if (!nRepeat) - { - nPrevIndex = GetStyleNameIndex(pCellStyles, nTab, nPos, i, - bRow, bPrevAutoStyle); - (*pDefaults)[i].nIndex = nPrevIndex; - (*pDefaults)[i].bIsAutoStyle = bPrevAutoStyle; - nRepeat = 1; - } - else - { - nIndex = GetStyleNameIndex(pCellStyles, nTab, nPos, i, - bRow, bIsAutoStyle); - if ((nIndex != nPrevIndex) || (bIsAutoStyle != bPrevAutoStyle)) - { - nRepeat = 1; - nPrevIndex = GetStyleNameIndex(pCellStyles, nTab, nPos, i, - bRow, bPrevAutoStyle); - (*pDefaults)[i].nIndex = nPrevIndex; - (*pDefaults)[i].bIsAutoStyle = bPrevAutoStyle; - } - else - { - (*pDefaults)[i].nIndex = nPrevIndex; - (*pDefaults)[i].bIsAutoStyle = bPrevAutoStyle; - ++nRepeat; - if (nRepeat > 1) - (*pDefaults)[i].nRepeat = nRepeat; - } - } - } - else - { - nRepeat = 0; - if (!nEmptyRepeat) - nEmptyRepeat = 1; - else - { - ++nEmptyRepeat; - if (nEmptyRepeat > 1) - (*pDefaults)[i].nRepeat = nEmptyRepeat; - } - } - } - } -} - -void ScMyDefaultStyles::FillDefaultStyles(const sal_Int32 nTable, - const sal_Int32 nLastRow, const sal_Int32 nLastCol, - const ScFormatRangeStyles* pCellStyles, ScDocument* pDoc) -{ - if (pRowDefaults) - delete pRowDefaults; - pRowDefaults = new ScMyDefaultStyleList(nLastRow + 1); - FillDefaultStyles(nTable, nLastRow, nLastCol, pCellStyles, pDoc, sal_True); - if (pColDefaults) - delete pColDefaults; - pColDefaults = new ScMyDefaultStyleList(nLastCol + 1); - FillDefaultStyles(nTable, nLastRow, nLastCol, pCellStyles, pDoc, sal_False); -} - -ScMyDefaultStyles::~ScMyDefaultStyles() -{ - if (pRowDefaults) - delete pRowDefaults; - if (pColDefaults) - delete pColDefaults; -} - -ScMyRowFormatRange::ScMyRowFormatRange() - : nStartColumn(0), - nRepeatColumns(0), - nRepeatRows(0), - nIndex(-1), - nValidationIndex(-1), - bIsAutoStyle(sal_True) -{ -} - -sal_Bool ScMyRowFormatRange::operator< (const ScMyRowFormatRange& rRange) const -{ - return (nStartColumn < rRange.nStartColumn); -} - -ScRowFormatRanges::ScRowFormatRanges() - : aRowFormatRanges(), - pRowDefaults(NULL), - pColDefaults(NULL), - nSize(0) -{ -} - -ScRowFormatRanges::ScRowFormatRanges(const ScRowFormatRanges* pRanges) - : aRowFormatRanges(pRanges->aRowFormatRanges), - pRowDefaults(pRanges->pRowDefaults), - pColDefaults(pRanges->pColDefaults), - nSize(pRanges->nSize) -{ -} - -ScRowFormatRanges::~ScRowFormatRanges() -{ -} - -void ScRowFormatRanges::Clear() -{ - aRowFormatRanges.clear(); - nSize = 0; -} - -void ScRowFormatRanges::AddRange(const sal_Int32 nPrevStartCol, const sal_Int32 nRepeat, const sal_Int32 nPrevIndex, - const sal_Bool bPrevAutoStyle, const ScMyRowFormatRange& rFormatRange) -{ - sal_Int32 nIndex(-1); - if ((nPrevIndex != rFormatRange.nIndex) || - (bPrevAutoStyle != rFormatRange.bIsAutoStyle)) - nIndex = rFormatRange.nIndex; - - sal_Bool bInserted(sal_False); - if (!aRowFormatRanges.empty()) - { - ScMyRowFormatRange* pRange(&aRowFormatRanges.back()); - if (pRange) - { - if ((nPrevStartCol == (pRange->nStartColumn + pRange->nRepeatColumns)) && - (pRange->bIsAutoStyle == rFormatRange.bIsAutoStyle) && - (pRange->nIndex == nIndex) && - (pRange->nValidationIndex == rFormatRange.nValidationIndex)) - { - if (rFormatRange.nRepeatRows < pRange->nRepeatRows) - pRange->nRepeatRows = rFormatRange.nRepeatRows; - pRange->nRepeatColumns += nRepeat; - bInserted = sal_True; - } - } - } - if (!bInserted) - { - ScMyRowFormatRange aRange; - aRange.nStartColumn = nPrevStartCol; - aRange.nRepeatColumns = nRepeat; - aRange.nRepeatRows = rFormatRange.nRepeatRows; - aRange.nValidationIndex = rFormatRange.nValidationIndex; - aRange.bIsAutoStyle = rFormatRange.bIsAutoStyle; - aRange.nIndex = nIndex; - aRowFormatRanges.push_back(aRange); - ++nSize; - } -} - -void ScRowFormatRanges::AddRange(ScMyRowFormatRange& rFormatRange, - const sal_Int32 nRow) -{ - DBG_ASSERT(pRowDefaults, "no row defaults"); - DBG_ASSERT(pColDefaults, "no column defaults"); - sal_uInt32 nEnd (rFormatRange.nRepeatRows + nRow - 1); - sal_Int32 nPrevIndex((*pRowDefaults)[nRow].nIndex); - sal_Bool bPrevAutoStyle((*pRowDefaults)[nRow].bIsAutoStyle); - sal_uInt32 i(nRow + 1); - sal_Bool bReady(sal_False); - while ((i < nEnd) && !bReady && (i < pRowDefaults->size())) - { - if ((nPrevIndex != (*pRowDefaults)[i].nIndex) || - (bPrevAutoStyle != (*pRowDefaults)[i].bIsAutoStyle)) - bReady = sal_True; - else - i += (*pRowDefaults)[i].nRepeat; - } - if (i > nEnd) - i = nEnd; - if (bReady) - rFormatRange.nRepeatRows = i - nRow + 1; - if (nPrevIndex == -1) - { - nPrevIndex = (*pColDefaults)[rFormatRange.nStartColumn].nIndex; - bPrevAutoStyle = (*pColDefaults)[rFormatRange.nStartColumn].bIsAutoStyle; - sal_uInt32 nPrevStartCol(rFormatRange.nStartColumn); - sal_uInt32 nRepeat((*pColDefaults)[rFormatRange.nStartColumn].nRepeat); - nEnd = rFormatRange.nStartColumn + rFormatRange.nRepeatColumns; - for(i = nPrevStartCol + nRepeat; i < nEnd; i += (*pColDefaults)[i].nRepeat) - { - DBG_ASSERT(sal_uInt32(nPrevStartCol + nRepeat) <= nEnd, "something wents wrong"); - if ((nPrevIndex != (*pColDefaults)[i].nIndex) || - (bPrevAutoStyle != (*pColDefaults)[i].bIsAutoStyle)) - { - AddRange(nPrevStartCol, nRepeat, nPrevIndex, bPrevAutoStyle, rFormatRange); - nPrevStartCol = i; - nRepeat = (*pColDefaults)[i].nRepeat; - nPrevIndex = (*pColDefaults)[i].nIndex; - bPrevAutoStyle = (*pColDefaults)[i].bIsAutoStyle; - } - else - nRepeat += (*pColDefaults)[i].nRepeat; - } - if (sal_uInt32(nPrevStartCol + nRepeat) > nEnd) - nRepeat = nEnd - nPrevStartCol; - AddRange(nPrevStartCol, nRepeat, nPrevIndex, bPrevAutoStyle, rFormatRange); - } - else if ((nPrevIndex == rFormatRange.nIndex) && - (bPrevAutoStyle == rFormatRange.bIsAutoStyle)) - { - rFormatRange.nIndex = -1; - aRowFormatRanges.push_back(rFormatRange); - ++nSize; - } -} - -sal_Bool ScRowFormatRanges::GetNext(ScMyRowFormatRange& aFormatRange) -{ - ScMyRowFormatRangesList::iterator aItr(aRowFormatRanges.begin()); - if (aItr != aRowFormatRanges.end()) - { - aFormatRange = (*aItr); - aRowFormatRanges.erase(aItr); - --nSize; - return sal_True; - } - return sal_False; -} - -sal_Int32 ScRowFormatRanges::GetMaxRows() -{ - ScMyRowFormatRangesList::iterator aItr(aRowFormatRanges.begin()); - ScMyRowFormatRangesList::iterator aEndItr(aRowFormatRanges.end()); - sal_Int32 nMaxRows = MAXROW + 1; - if (aItr != aEndItr) - while (aItr != aEndItr) - { - if ((*aItr).nRepeatRows < nMaxRows) - nMaxRows = (*aItr).nRepeatRows; - ++aItr; - } - else - { - DBG_ERROR("no ranges found"); - } - return nMaxRows; -} - -sal_Int32 ScRowFormatRanges::GetSize() -{ - return nSize; -} - -void ScRowFormatRanges::Sort() -{ - aRowFormatRanges.sort(); -} - -// ============================================================================ -ScMyFormatRange::ScMyFormatRange() - : nStyleNameIndex(-1), - nValidationIndex(-1), - bIsAutoStyle(sal_True) -{ -} - -sal_Bool ScMyFormatRange::operator<(const ScMyFormatRange& rRange) const -{ - if (aRangeAddress.StartRow < rRange.aRangeAddress.StartRow) - return sal_True; - else - if (aRangeAddress.StartRow == rRange.aRangeAddress.StartRow) - return (aRangeAddress.StartColumn < rRange.aRangeAddress.StartColumn); - else - return sal_False; -} - -ScFormatRangeStyles::ScFormatRangeStyles() - : aTables(), - aStyleNames(), - aAutoStyleNames() -{ -} - -ScFormatRangeStyles::~ScFormatRangeStyles() -{ - ScMyOUStringVec::iterator i(aStyleNames.begin()); - ScMyOUStringVec::iterator endi(aStyleNames.end()); - while (i != endi) - { - delete *i; - ++i; - } - i = aAutoStyleNames.begin(); - endi = aAutoStyleNames.end(); - while (i != endi) - { - delete *i; - ++i; - } - ScMyFormatRangeListVec::iterator j(aTables.begin()); - ScMyFormatRangeListVec::iterator endj(aTables.end()); - while (j != endj) - { - delete *j; - ++j; - } -} - -void ScFormatRangeStyles::AddNewTable(const sal_Int32 nTable) -{ - sal_Int32 nSize = aTables.size() - 1; - if (nTable > nSize) - for (sal_Int32 i = nSize; i < nTable; ++i) - { - ScMyFormatRangeAddresses* aRangeAddresses(new ScMyFormatRangeAddresses); - aTables.push_back(aRangeAddresses); - } -} - -sal_Bool ScFormatRangeStyles::AddStyleName(rtl::OUString* rpString, sal_Int32& rIndex, const sal_Bool bIsAutoStyle) -{ - if (bIsAutoStyle) - { - aAutoStyleNames.push_back(rpString); - rIndex = aAutoStyleNames.size() - 1; - return sal_True; - } - else - { - sal_Int32 nCount(aStyleNames.size()); - sal_Bool bFound(sal_False); - sal_Int32 i(nCount - 1); - while ((i >= 0) && (!bFound)) - { - if (aStyleNames.at(i)->equals(*rpString)) - bFound = sal_True; - else - i--; - } - if (bFound) - { - rIndex = i; - return sal_False; - } - else - { - aStyleNames.push_back(rpString); - rIndex = aStyleNames.size() - 1; - return sal_True; - } - } -} - -sal_Int32 ScFormatRangeStyles::GetIndexOfStyleName(const rtl::OUString& rString, const rtl::OUString& rPrefix, sal_Bool& bIsAutoStyle) -{ - sal_Int32 nPrefixLength(rPrefix.getLength()); - rtl::OUString sTemp(rString.copy(nPrefixLength)); - sal_Int32 nIndex(sTemp.toInt32()); - if (aAutoStyleNames.at(nIndex - 1)->equals(rString)) - { - bIsAutoStyle = sal_True; - return nIndex - 1; - } - else - { - sal_Int32 i(0); - sal_Bool bFound(sal_False); - while (!bFound && static_cast(i) < aStyleNames.size()) - { - if (aStyleNames[i]->equals(rString)) - bFound = sal_True; - else - ++i; - } - if (bFound) - { - bIsAutoStyle = sal_False; - return i; - } - else - { - i = 0; - while (!bFound && static_cast(i) < aAutoStyleNames.size()) - { - if (aAutoStyleNames[i]->equals(rString)) - bFound = sal_True; - else - ++i; - } - if (bFound) - { - bIsAutoStyle = sal_True; - return i; - } - else - return -1; - } - } -} - -sal_Int32 ScFormatRangeStyles::GetStyleNameIndex(const sal_Int32 nTable, - const sal_Int32 nColumn, const sal_Int32 nRow, sal_Bool& bIsAutoStyle) const -{ - DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); - ScMyFormatRangeAddresses* pFormatRanges(aTables[nTable]); - ScMyFormatRangeAddresses::iterator aItr(pFormatRanges->begin()); - ScMyFormatRangeAddresses::iterator aEndItr(pFormatRanges->end()); - while (aItr != aEndItr) - { - if (((*aItr).aRangeAddress.StartColumn <= nColumn) && - ((*aItr).aRangeAddress.EndColumn >= nColumn) && - ((*aItr).aRangeAddress.StartRow <= nRow) && - ((*aItr).aRangeAddress.EndRow >= nRow)) - { - bIsAutoStyle = aItr->bIsAutoStyle; - return (*aItr).nStyleNameIndex; - } - else - ++aItr; - } - return -1; -} - -sal_Int32 ScFormatRangeStyles::GetStyleNameIndex(const sal_Int32 nTable, const sal_Int32 nColumn, const sal_Int32 nRow, - sal_Bool& bIsAutoStyle, sal_Int32& nValidationIndex, sal_Int32& nNumberFormat, const sal_Bool bRemoveRange) -{ - DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); - ScMyFormatRangeAddresses* pFormatRanges(aTables[nTable]); - ScMyFormatRangeAddresses::iterator aItr(pFormatRanges->begin()); - ScMyFormatRangeAddresses::iterator aEndItr(pFormatRanges->end()); - while (aItr != aEndItr) - { - if (((*aItr).aRangeAddress.StartColumn <= nColumn) && - ((*aItr).aRangeAddress.EndColumn >= nColumn) && - ((*aItr).aRangeAddress.StartRow <= nRow) && - ((*aItr).aRangeAddress.EndRow >= nRow)) - { - bIsAutoStyle = aItr->bIsAutoStyle; - nValidationIndex = aItr->nValidationIndex; - nNumberFormat = aItr->nNumberFormat; - if (((*pRowDefaults)[nRow].nIndex != -1)) - { - if (((*pRowDefaults)[nRow].nIndex == (*aItr).nStyleNameIndex) && - ((*pRowDefaults)[nRow].bIsAutoStyle == (*aItr).bIsAutoStyle)) - return -1; - else - return (*aItr).nStyleNameIndex; - } - else if (((*pColDefaults)[nColumn].nIndex != -1) && - ((*pColDefaults)[nColumn].nIndex == (*aItr).nStyleNameIndex) && - ((*pColDefaults)[nColumn].bIsAutoStyle == (*aItr).bIsAutoStyle)) - return -1; - else - return (*aItr).nStyleNameIndex; - } - else - { - if (bRemoveRange && (*aItr).aRangeAddress.EndRow < nRow) - aItr = pFormatRanges->erase(aItr); - else - ++aItr; - } - } - return -1; -} - -void ScFormatRangeStyles::GetFormatRanges(const sal_Int32 nStartColumn, const sal_Int32 nEndColumn, const sal_Int32 nRow, - const sal_Int32 nTable, ScRowFormatRanges* pRowFormatRanges) -{ - sal_Int32 nTotalColumns(nEndColumn - nStartColumn + 1); - DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); - ScMyFormatRangeAddresses* pFormatRanges(aTables[nTable]); - ScMyFormatRangeAddresses::iterator aItr(pFormatRanges->begin()); - ScMyFormatRangeAddresses::iterator aEndItr(pFormatRanges->end()); - sal_Int32 nColumns = 0; - while (aItr != aEndItr && nColumns < nTotalColumns) - { -#if OSL_DEBUG_LEVEL > 1 - table::CellRangeAddress aTempRangeAddress((*aItr).aRangeAddress); -#endif - if (((*aItr).aRangeAddress.StartRow <= nRow) && - ((*aItr).aRangeAddress.EndRow >= nRow)) - { - if ((((*aItr).aRangeAddress.StartColumn <= nStartColumn) && - ((*aItr).aRangeAddress.EndColumn >= nStartColumn)) || - (((*aItr).aRangeAddress.StartColumn <= nEndColumn) && - ((*aItr).aRangeAddress.EndColumn >= nEndColumn)) || - (((*aItr).aRangeAddress.StartColumn >= nStartColumn) && - ((*aItr).aRangeAddress.EndColumn <= nEndColumn))) - { - ScMyRowFormatRange aRange; - aRange.nIndex = aItr->nStyleNameIndex; - aRange.nValidationIndex = aItr->nValidationIndex; - aRange.bIsAutoStyle = aItr->bIsAutoStyle; - if ((aItr->aRangeAddress.StartColumn < nStartColumn) && - (aItr->aRangeAddress.EndColumn >= nStartColumn)) - { - if (aItr->aRangeAddress.EndColumn >= nEndColumn) - aRange.nRepeatColumns = nTotalColumns; - else - aRange.nRepeatColumns = aItr->aRangeAddress.EndColumn - nStartColumn + 1; - aRange.nStartColumn = nStartColumn; - } - else if ((aItr->aRangeAddress.StartColumn >= nStartColumn) && - (aItr->aRangeAddress.EndColumn <= nEndColumn)) - { - aRange.nRepeatColumns = aItr->aRangeAddress.EndColumn - aItr->aRangeAddress.StartColumn + 1; - aRange.nStartColumn = aItr->aRangeAddress.StartColumn; - } - else if ((aItr->aRangeAddress.StartColumn >= nStartColumn) && - (aItr->aRangeAddress.StartColumn <= nEndColumn) && - (aItr->aRangeAddress.EndColumn > nEndColumn)) - { - aRange.nRepeatColumns = nEndColumn - aItr->aRangeAddress.StartColumn + 1; - aRange.nStartColumn = aItr->aRangeAddress.StartColumn; - } - aRange.nRepeatRows = aItr->aRangeAddress.EndRow - nRow + 1; - pRowFormatRanges->AddRange(aRange, nRow); - nColumns += aRange.nRepeatColumns; - } - ++aItr; - } - else - if(aItr->aRangeAddress.EndRow < nRow) - aItr = pFormatRanges->erase(aItr); - else - ++aItr; - } - pRowFormatRanges->Sort(); -} - -void ScFormatRangeStyles::AddRangeStyleName(const table::CellRangeAddress aCellRangeAddress, - const sal_Int32 nStringIndex, const sal_Bool bIsAutoStyle, const sal_Int32 nValidationIndex, - const sal_Int32 nNumberFormat) -{ - ScMyFormatRange aFormatRange; - aFormatRange.aRangeAddress = aCellRangeAddress; - aFormatRange.nStyleNameIndex = nStringIndex; - aFormatRange.nValidationIndex = nValidationIndex; - aFormatRange.nNumberFormat = nNumberFormat; - aFormatRange.bIsAutoStyle = bIsAutoStyle; - DBG_ASSERT(static_cast(aCellRangeAddress.Sheet) < aTables.size(), "wrong table"); - ScMyFormatRangeAddresses* pFormatRanges(aTables[aCellRangeAddress.Sheet]); - pFormatRanges->push_back(aFormatRange); -} - -rtl::OUString* ScFormatRangeStyles::GetStyleNameByIndex(const sal_Int32 nIndex, const sal_Bool bIsAutoStyle) -{ - if (bIsAutoStyle) - return aAutoStyleNames[nIndex]; - else - return aStyleNames[nIndex]; -} - -void ScFormatRangeStyles::Sort() -{ - sal_Int32 nTables = aTables.size(); - for (sal_Int16 i = 0; i < nTables; ++i) - if (!aTables[i]->empty()) - aTables[i]->sort(); -} - -//=========================================================================== - -ScColumnRowStylesBase::ScColumnRowStylesBase() - : aStyleNames() -{ -} - -ScColumnRowStylesBase::~ScColumnRowStylesBase() -{ - ScMyOUStringVec::iterator i(aStyleNames.begin()); - ScMyOUStringVec::iterator endi(aStyleNames.end()); - while (i != endi) - { - delete *i; - ++i; - } -} - -sal_Int32 ScColumnRowStylesBase::AddStyleName(rtl::OUString* pString) -{ - aStyleNames.push_back(pString); - return aStyleNames.size() - 1; -} - -sal_Int32 ScColumnRowStylesBase::GetIndexOfStyleName(const rtl::OUString& rString, const rtl::OUString& rPrefix) -{ - sal_Int32 nPrefixLength(rPrefix.getLength()); - rtl::OUString sTemp(rString.copy(nPrefixLength)); - sal_Int32 nIndex(sTemp.toInt32()); - if (aStyleNames.at(nIndex - 1)->equals(rString)) - return nIndex - 1; - else - { - sal_Int32 i(0); - sal_Bool bFound(sal_False); - while (!bFound && static_cast(i) < aStyleNames.size()) - { - if (aStyleNames.at(i)->equals(rString)) - bFound = sal_True; - else - ++i; - } - if (bFound) - return i; - else - return -1; - } -} - -rtl::OUString* ScColumnRowStylesBase::GetStyleNameByIndex(const sal_Int32 nIndex) -{ - if ( nIndex < 0 || nIndex >= sal::static_int_cast( aStyleNames.size() ) ) - { - // #123981# should no longer happen, use first style then - DBG_ERRORFILE("GetStyleNameByIndex: invalid index"); - return aStyleNames[0]; - } - - return aStyleNames[nIndex]; -} - -//=========================================================================== - -ScColumnStyles::ScColumnStyles() - : ScColumnRowStylesBase(), - aTables() -{ -} - -ScColumnStyles::~ScColumnStyles() -{ -} - -void ScColumnStyles::AddNewTable(const sal_Int32 nTable, const sal_Int32 nFields) -{ - sal_Int32 nSize(aTables.size() - 1); - if (nTable > nSize) - for (sal_Int32 i = nSize; i < nTable; ++i) - { - ScMyColumnStyleVec aFieldsVec(nFields + 1, ScColumnStyle()); - aTables.push_back(aFieldsVec); - } -} - -sal_Int32 ScColumnStyles::GetStyleNameIndex(const sal_Int32 nTable, const sal_Int32 nField, - sal_Bool& bIsVisible) -{ - DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); - if (static_cast(nField) < aTables[nTable].size()) - { - bIsVisible = aTables[nTable][nField].bIsVisible; - return aTables[nTable][nField].nIndex; - } - else - { - bIsVisible = aTables[nTable][aTables[nTable].size() - 1].bIsVisible; - return aTables[nTable][aTables[nTable].size() - 1].nIndex; - } -} - -void ScColumnStyles::AddFieldStyleName(const sal_Int32 nTable, const sal_Int32 nField, - const sal_Int32 nStringIndex, const sal_Bool bIsVisible) -{ - DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); - DBG_ASSERT(aTables[nTable].size() >= static_cast(nField), "wrong field"); - ScColumnStyle aStyle; - aStyle.nIndex = nStringIndex; - aStyle.bIsVisible = bIsVisible; - if (aTables[nTable].size() == static_cast(nField)) - aTables[nTable].push_back(aStyle); - aTables[nTable][nField] = aStyle; -} - -rtl::OUString* ScColumnStyles::GetStyleName(const sal_Int32 nTable, const sal_Int32 nField) -{ - sal_Bool bTemp; - return GetStyleNameByIndex(GetStyleNameIndex(nTable, nField, bTemp)); -} - -//=========================================================================== - -ScRowStyles::ScRowStyles() - : ScColumnRowStylesBase(), - aTables() -{ -} - -ScRowStyles::~ScRowStyles() -{ -} - -void ScRowStyles::AddNewTable(const sal_Int32 nTable, const sal_Int32 nFields) -{ - sal_Int32 nSize(aTables.size() - 1); - if (nTable > nSize) - for (sal_Int32 i = nSize; i < nTable; ++i) - { - ScMysalInt32Vec aFieldsVec(nFields + 1, -1); - aTables.push_back(aFieldsVec); - } -} - -sal_Int32 ScRowStyles::GetStyleNameIndex(const sal_Int32 nTable, const sal_Int32 nField) -{ - DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); - if (static_cast(nField) < aTables[nTable].size()) - return aTables[nTable][nField]; - else - return aTables[nTable][aTables[nTable].size() - 1]; -} - -void ScRowStyles::AddFieldStyleName(const sal_Int32 nTable, const sal_Int32 nField, - const sal_Int32 nStringIndex) -{ - DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); - DBG_ASSERT(aTables[nTable].size() >= static_cast(nField), "wrong field"); - if (aTables[nTable].size() == static_cast(nField)) - aTables[nTable].push_back(nStringIndex); - aTables[nTable][nField] = nStringIndex; -} - -rtl::OUString* ScRowStyles::GetStyleName(const sal_Int32 nTable, const sal_Int32 nField) -{ - return GetStyleNameByIndex(GetStyleNameIndex(nTable, nField)); -} +/************************************************************************* + * + * 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: XMLStylesExportHelper.cxx,v $ + * $Revision: 1.52 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + +// INCLUDE --------------------------------------------------------------- +#include "XMLStylesExportHelper.hxx" +#include "global.hxx" +#include "unonames.hxx" +#include "XMLConverter.hxx" +#include "xmlexprt.hxx" +#include "document.hxx" +#include "rangeutl.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace com::sun::star; +using namespace xmloff::token; + +ScMyValidation::ScMyValidation() + : sName(), + sErrorMessage(), + sErrorTitle(), + sImputMessage(), + sImputTitle(), + sFormula1(), + sFormula2(), + bShowErrorMessage(sal_False), + bShowImputMessage(sal_False), + bIgnoreBlanks(sal_False) +{ +} + +ScMyValidation::~ScMyValidation() +{ +} + +sal_Bool ScMyValidation::IsEqual(const ScMyValidation& aVal) const +{ + if (aVal.bIgnoreBlanks == bIgnoreBlanks && + aVal.bShowImputMessage == bShowImputMessage && + aVal.bShowErrorMessage == bShowErrorMessage && + aVal.aBaseCell.Sheet == aBaseCell.Sheet && + aVal.aBaseCell.Column == aBaseCell.Column && + aVal.aBaseCell.Row == aBaseCell.Row && + aVal.aAlertStyle == aAlertStyle && + aVal.aValidationType == aValidationType && + aVal.aOperator == aOperator && + aVal.sErrorTitle == sErrorTitle && + aVal.sImputTitle == sImputTitle && + aVal.sErrorMessage == sErrorMessage && + aVal.sImputMessage == sImputMessage && + aVal.sFormula1 == sFormula1 && + aVal.sFormula2 == sFormula2) + return sal_True; + else + return sal_False; +} + +ScMyValidationsContainer::ScMyValidationsContainer() + : aValidationVec(), + sEmptyString(), + sERRALSTY(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRALSTY)), + sIGNOREBL(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_IGNOREBL)), + sSHOWLIST(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWLIST)), + sTYPE(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_TYPE)), + sSHOWINP(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWINP)), + sSHOWERR(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWERR)), + sINPTITLE(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_INPTITLE)), + sINPMESS(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_INPMESS)), + sERRTITLE(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRTITLE)), + sERRMESS(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRMESS)), + sOnError(RTL_CONSTASCII_USTRINGPARAM("OnError")), + sEventType(RTL_CONSTASCII_USTRINGPARAM("EventType")), + sStarBasic(RTL_CONSTASCII_USTRINGPARAM("StarBasic")), + sScript(RTL_CONSTASCII_USTRINGPARAM("Script")), + sLibrary(RTL_CONSTASCII_USTRINGPARAM("Library")), + sMacroName(RTL_CONSTASCII_USTRINGPARAM("MacroName")) +{ +} + +ScMyValidationsContainer::~ScMyValidationsContainer() +{ +} + +sal_Bool ScMyValidationsContainer::AddValidation(const uno::Any& aTempAny, + sal_Int32& nValidationIndex) +{ + sal_Bool bAdded(sal_False); + uno::Reference xPropertySet(aTempAny, uno::UNO_QUERY); + if (xPropertySet.is()) + { + rtl::OUString sErrorMessage; + xPropertySet->getPropertyValue(sERRMESS) >>= sErrorMessage; + rtl::OUString sErrorTitle; + xPropertySet->getPropertyValue(sERRTITLE) >>= sErrorTitle; + rtl::OUString sImputMessage; + xPropertySet->getPropertyValue(sINPMESS) >>= sImputMessage; + rtl::OUString sImputTitle; + xPropertySet->getPropertyValue(sINPTITLE) >>= sImputTitle; + sal_Bool bShowErrorMessage = ::cppu::any2bool(xPropertySet->getPropertyValue(sSHOWERR)); + sal_Bool bShowImputMessage = ::cppu::any2bool(xPropertySet->getPropertyValue(sSHOWINP)); + sheet::ValidationType aValidationType; + xPropertySet->getPropertyValue(sTYPE) >>= aValidationType; + if (bShowErrorMessage || bShowImputMessage || aValidationType != sheet::ValidationType_ANY || + sErrorMessage.getLength() || sErrorTitle.getLength() || sImputMessage.getLength() || sImputTitle.getLength()) + { + ScMyValidation aValidation; + aValidation.sErrorMessage = sErrorMessage; + aValidation.sErrorTitle = sErrorTitle; + aValidation.sImputMessage = sImputMessage; + aValidation.sImputTitle = sImputTitle; + aValidation.bShowErrorMessage = bShowErrorMessage; + aValidation.bShowImputMessage = bShowImputMessage; + aValidation.aValidationType = aValidationType; + aValidation.bIgnoreBlanks = ::cppu::any2bool(xPropertySet->getPropertyValue(sIGNOREBL)); + xPropertySet->getPropertyValue(sSHOWLIST) >>= aValidation.nShowList; + xPropertySet->getPropertyValue(sERRALSTY) >>= aValidation.aAlertStyle; + uno::Reference xCondition(xPropertySet, uno::UNO_QUERY); + if (xCondition.is()) + { + aValidation.sFormula1 = xCondition->getFormula1(); + aValidation.sFormula2 = xCondition->getFormula2(); + aValidation.aOperator = xCondition->getOperator(); + aValidation.aBaseCell = xCondition->getSourcePosition(); + } + //ScMyValidationRange aValidationRange; + sal_Bool bEqualFound(sal_False); + sal_Int32 i(0); + sal_Int32 nCount(aValidationVec.size()); + while (i < nCount && !bEqualFound) + { + bEqualFound = aValidationVec[i].IsEqual(aValidation); + if (!bEqualFound) + ++i; + } + if (bEqualFound) + nValidationIndex = i; + else + { + sal_Int32 nNameIndex(nCount + 1); + rtl::OUString sCount(rtl::OUString::valueOf(nNameIndex)); + rtl::OUString sPrefix(RTL_CONSTASCII_USTRINGPARAM("val")); + aValidation.sName += sPrefix; + aValidation.sName += sCount; + aValidationVec.push_back(aValidation); + nValidationIndex = nCount; + bAdded = sal_True; + } + } + } + return bAdded; +} + +rtl::OUString ScMyValidationsContainer::GetCondition(ScXMLExport& rExport, const ScMyValidation& aValidation) +{ + rtl::OUString sCondition; + if (aValidation.aValidationType != sheet::ValidationType_ANY) + { + switch (aValidation.aValidationType) + { + //case sheet::ValidationType_CUSTOM + case sheet::ValidationType_DATE : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-date()")); + break; + case sheet::ValidationType_DECIMAL : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-decimal-number()")); + break; + case sheet::ValidationType_LIST : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-in-list(")); + sCondition += aValidation.sFormula1; + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")); + break; + case sheet::ValidationType_TEXT_LEN : + if (aValidation.aOperator != sheet::ConditionOperator_BETWEEN && + aValidation.aOperator != sheet::ConditionOperator_NOT_BETWEEN) + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length()")); + break; + case sheet::ValidationType_TIME : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-time()")); + break; + case sheet::ValidationType_WHOLE : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-whole-number()")); + break; + default: + { + // added to avoid warnings + } + } + if (aValidation.aValidationType != sheet::ValidationType_LIST && + (aValidation.sFormula1.getLength() || + (aValidation.aOperator == sheet::ConditionOperator_BETWEEN && + aValidation.aOperator == sheet::ConditionOperator_NOT_BETWEEN && + aValidation.sFormula2.getLength()))) + { + if (aValidation.aValidationType != sheet::ValidationType_TEXT_LEN) + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" and ")); + if (aValidation.aOperator != sheet::ConditionOperator_BETWEEN && + aValidation.aOperator != sheet::ConditionOperator_NOT_BETWEEN) + { + if (aValidation.aValidationType != sheet::ValidationType_TEXT_LEN) + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content()")); + switch (aValidation.aOperator) + { + case sheet::ConditionOperator_EQUAL : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("=")); + break; + case sheet::ConditionOperator_GREATER : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">")); + break; + case sheet::ConditionOperator_GREATER_EQUAL : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">=")); + break; + case sheet::ConditionOperator_LESS : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<")); + break; + case sheet::ConditionOperator_LESS_EQUAL : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<=")); + break; + case sheet::ConditionOperator_NOT_EQUAL : + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("!=")); + break; + default: + { + // added to avoid warnings + } + } + sCondition += aValidation.sFormula1; + } + else + { + if (aValidation.aValidationType == sheet::ValidationType_TEXT_LEN) + { + if (aValidation.aOperator == sheet::ConditionOperator_BETWEEN) + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length-is-between(")); + else + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length-is-not-between(")); + } + else + { + if (aValidation.aOperator == sheet::ConditionOperator_BETWEEN) + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-between(")); + else + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-not-between(")); + } + sCondition += aValidation.sFormula1; + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(",")); + sCondition += aValidation.sFormula2; + sCondition += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")); + } + } + else + if (aValidation.aValidationType == sheet::ValidationType_TEXT_LEN) + sCondition = rtl::OUString(); + } + if (sCondition.getLength()) + { + const formula::FormulaGrammar::Grammar eGrammar = rExport.GetDocument()->GetStorageGrammar(); + sal_uInt16 nNamespacePrefix = (eGrammar == formula::FormulaGrammar::GRAM_ODFF ? XML_NAMESPACE_OF : XML_NAMESPACE_OOOC); + sCondition = rExport.GetNamespaceMap().GetQNameByKey( nNamespacePrefix, sCondition, sal_False ); + } + + return sCondition; +} + +rtl::OUString ScMyValidationsContainer::GetBaseCellAddress(ScDocument* pDoc, const table::CellAddress& aCell) +{ + rtl::OUString sAddress; + ScRangeStringConverter::GetStringFromAddress( sAddress, aCell, pDoc ); + return sAddress; +} + +void ScMyValidationsContainer::WriteMessage(ScXMLExport& rExport, + const rtl::OUString& sTitle, const rtl::OUString& sOUMessage, + const sal_Bool bShowMessage, const sal_Bool bIsHelpMessage) +{ + if (sTitle.getLength()) + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TITLE, sTitle); + if (bShowMessage) + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, XML_TRUE); + else + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, XML_FALSE); + SvXMLElementExport* pMessage(NULL); + if (bIsHelpMessage) + pMessage = new SvXMLElementExport(rExport, XML_NAMESPACE_TABLE, XML_HELP_MESSAGE, sal_True, sal_True); + else + pMessage = new SvXMLElementExport(rExport, XML_NAMESPACE_TABLE, XML_ERROR_MESSAGE, sal_True, sal_True); + if (sOUMessage.getLength()) + { + sal_Int32 i(0); + rtl::OUStringBuffer sTemp; + String sMessage(sOUMessage); + rtl::OUString sText (sMessage.ConvertLineEnd(LINEEND_LF)); + sal_Bool bPrevCharWasSpace(sal_True); + while(i < sText.getLength()) + { + if ((sText[i] == '\n')) + { + SvXMLElementExport aElemP(rExport, XML_NAMESPACE_TEXT, XML_P, sal_True, sal_False); + rExport.GetTextParagraphExport()->exportText(sTemp.makeStringAndClear(), bPrevCharWasSpace); + } + else + sTemp.append(sText[i]); + ++i; + } + if (sTemp.getLength()) + { + SvXMLElementExport aElemP(rExport, XML_NAMESPACE_TEXT, XML_P, sal_True, sal_False); + rExport.GetTextParagraphExport()->exportText(sTemp.makeStringAndClear(), bPrevCharWasSpace); + } + } + if (pMessage) + delete pMessage; +} + +void ScMyValidationsContainer::WriteValidations(ScXMLExport& rExport) +{ + if (aValidationVec.size()) + { + SvXMLElementExport aElemVs(rExport, XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATIONS, sal_True, sal_True); + ScMyValidationVec::iterator aItr(aValidationVec.begin()); + ScMyValidationVec::iterator aEndItr(aValidationVec.end()); + while (aItr != aEndItr) + { + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, aItr->sName); + rtl::OUString sCondition(GetCondition(rExport, *aItr)); + if (sCondition.getLength()) + { + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CONDITION, sCondition); + if (aItr->bIgnoreBlanks) + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ALLOW_EMPTY_CELL, XML_TRUE); + else + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ALLOW_EMPTY_CELL, XML_FALSE); + if (aItr->aValidationType == sheet::ValidationType_LIST) + { + switch (aItr->nShowList) + { + case sheet::TableValidationVisibility::INVISIBLE: + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_LIST, XML_NO); + break; + case sheet::TableValidationVisibility::UNSORTED: + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_LIST, XML_UNSORTED); + break; + case sheet::TableValidationVisibility::SORTEDASCENDING: + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_LIST, XML_SORTED_ASCENDING); + break; + default: + DBG_ERROR("unknown ListType"); + } + } + } + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_BASE_CELL_ADDRESS, GetBaseCellAddress(rExport.GetDocument(), aItr->aBaseCell)); + SvXMLElementExport aElemV(rExport, XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATION, sal_True, sal_True); + if (aItr->bShowImputMessage || aItr->sImputMessage.getLength() || aItr->sImputTitle.getLength()) + { + WriteMessage(rExport, aItr->sImputTitle, aItr->sImputMessage, aItr->bShowImputMessage, sal_True); + } + if (aItr->bShowErrorMessage || aItr->sErrorMessage.getLength() || aItr->sErrorTitle.getLength()) + { + switch (aItr->aAlertStyle) + { + case sheet::ValidationAlertStyle_INFO : + { + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MESSAGE_TYPE, XML_INFORMATION); + WriteMessage(rExport, aItr->sErrorTitle, aItr->sErrorMessage, aItr->bShowErrorMessage, sal_False); + } + break; + case sheet::ValidationAlertStyle_WARNING : + { + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MESSAGE_TYPE, XML_WARNING); + WriteMessage(rExport, aItr->sErrorTitle, aItr->sErrorMessage, aItr->bShowErrorMessage, sal_False); + } + break; + case sheet::ValidationAlertStyle_STOP : + { + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MESSAGE_TYPE, XML_STOP); + WriteMessage(rExport, aItr->sErrorTitle, aItr->sErrorMessage, aItr->bShowErrorMessage, sal_False); + } + break; + case sheet::ValidationAlertStyle_MACRO : + { + { + //rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, aItr->sErrorTitle); + if (aItr->bShowErrorMessage) + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_EXECUTE, XML_TRUE); + else + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_EXECUTE, XML_FALSE); + SvXMLElementExport aEMElem(rExport, XML_NAMESPACE_TABLE, XML_ERROR_MACRO, sal_True, sal_True); + } + { + // #i47525# for a script URL the type and the property name for the URL + // are both "Script", for a simple macro name the type is "StarBasic" + // and the property name is "MacroName". + bool bScriptURL = SfxApplication::IsXScriptURL( aItr->sErrorTitle ); + + uno::Sequence aSeq(3); + beans::PropertyValue* pArr(aSeq.getArray()); + pArr[0].Name = sEventType; + pArr[0].Value <<= bScriptURL ? sScript : sStarBasic; + pArr[1].Name = sLibrary; + pArr[1].Value <<= sEmptyString; + pArr[2].Name = bScriptURL ? sScript : sMacroName; + pArr[2].Value <<= aItr->sErrorTitle; + + // 2) export the sequence + rExport.GetEventExport().ExportSingleEvent( aSeq, sOnError); + } + } + break; + default: + { + // added to avoid warnings + } + } + } + ++aItr; + } + } +} + +const rtl::OUString& ScMyValidationsContainer::GetValidationName(const sal_Int32 nIndex) +{ + DBG_ASSERT( static_cast(nIndex) < aValidationVec.size(), "out of range" ); + return aValidationVec[nIndex].sName; +} + +//============================================================================== + +sal_Int32 ScMyDefaultStyles::GetStyleNameIndex(const ScFormatRangeStyles* pCellStyles, + const sal_Int32 nTable, const sal_Int32 nPos, + const sal_Int32 i, const sal_Bool bRow, sal_Bool& bIsAutoStyle) +{ + if (bRow) + return pCellStyles->GetStyleNameIndex(nTable, nPos, i, + bIsAutoStyle); + else + return pCellStyles->GetStyleNameIndex(nTable, i, nPos, + bIsAutoStyle); +} + +void ScMyDefaultStyles::FillDefaultStyles(const sal_Int32 nTable, + const sal_Int32 nLastRow, const sal_Int32 nLastCol, + const ScFormatRangeStyles* pCellStyles, ScDocument* pDoc, + const sal_Bool bRow) +{ + if (pDoc) + { + SCTAB nTab = static_cast(nTable); + sal_Int32 nPos; + sal_Int32 nLast; + ScMyDefaultStyleList* pDefaults; + if (bRow) + { + pDefaults = pRowDefaults; + nLast = nLastRow; + } + else + { + pDefaults = pColDefaults; + nLast = nLastCol; + } + sal_Bool bPrevAutoStyle(sal_False); + sal_Bool bIsAutoStyle; + sal_Bool bResult; + sal_Int32 nPrevIndex(0); + sal_Int32 nIndex; + sal_Int32 nRepeat(0); + sal_Int32 nEmptyRepeat(0); + for (sal_Int32 i = nLast; i >= 0; --i) + { + if (bRow) + { + SCCOL nCol; + bResult = pDoc->GetRowDefault(nTab, + static_cast(i), static_cast(nLastCol), nCol); + nPos = static_cast(nCol); + } + else + { + SCROW nRow; + bResult = pDoc->GetColDefault(nTab, + static_cast(i), static_cast(nLastRow), nRow); + nPos = static_cast(nRow); + } + if (bResult) + { + nEmptyRepeat = 0; + if (!nRepeat) + { + nPrevIndex = GetStyleNameIndex(pCellStyles, nTab, nPos, i, + bRow, bPrevAutoStyle); + (*pDefaults)[i].nIndex = nPrevIndex; + (*pDefaults)[i].bIsAutoStyle = bPrevAutoStyle; + nRepeat = 1; + } + else + { + nIndex = GetStyleNameIndex(pCellStyles, nTab, nPos, i, + bRow, bIsAutoStyle); + if ((nIndex != nPrevIndex) || (bIsAutoStyle != bPrevAutoStyle)) + { + nRepeat = 1; + nPrevIndex = GetStyleNameIndex(pCellStyles, nTab, nPos, i, + bRow, bPrevAutoStyle); + (*pDefaults)[i].nIndex = nPrevIndex; + (*pDefaults)[i].bIsAutoStyle = bPrevAutoStyle; + } + else + { + (*pDefaults)[i].nIndex = nPrevIndex; + (*pDefaults)[i].bIsAutoStyle = bPrevAutoStyle; + ++nRepeat; + if (nRepeat > 1) + (*pDefaults)[i].nRepeat = nRepeat; + } + } + } + else + { + nRepeat = 0; + if (!nEmptyRepeat) + nEmptyRepeat = 1; + else + { + ++nEmptyRepeat; + if (nEmptyRepeat > 1) + (*pDefaults)[i].nRepeat = nEmptyRepeat; + } + } + } + } +} + +void ScMyDefaultStyles::FillDefaultStyles(const sal_Int32 nTable, + const sal_Int32 nLastRow, const sal_Int32 nLastCol, + const ScFormatRangeStyles* pCellStyles, ScDocument* pDoc) +{ + if (pRowDefaults) + delete pRowDefaults; + pRowDefaults = new ScMyDefaultStyleList(nLastRow + 1); + FillDefaultStyles(nTable, nLastRow, nLastCol, pCellStyles, pDoc, sal_True); + if (pColDefaults) + delete pColDefaults; + pColDefaults = new ScMyDefaultStyleList(nLastCol + 1); + FillDefaultStyles(nTable, nLastRow, nLastCol, pCellStyles, pDoc, sal_False); +} + +ScMyDefaultStyles::~ScMyDefaultStyles() +{ + if (pRowDefaults) + delete pRowDefaults; + if (pColDefaults) + delete pColDefaults; +} + +ScMyRowFormatRange::ScMyRowFormatRange() + : nStartColumn(0), + nRepeatColumns(0), + nRepeatRows(0), + nIndex(-1), + nValidationIndex(-1), + bIsAutoStyle(sal_True) +{ +} + +sal_Bool ScMyRowFormatRange::operator< (const ScMyRowFormatRange& rRange) const +{ + return (nStartColumn < rRange.nStartColumn); +} + +ScRowFormatRanges::ScRowFormatRanges() + : aRowFormatRanges(), + pRowDefaults(NULL), + pColDefaults(NULL), + nSize(0) +{ +} + +ScRowFormatRanges::ScRowFormatRanges(const ScRowFormatRanges* pRanges) + : aRowFormatRanges(pRanges->aRowFormatRanges), + pRowDefaults(pRanges->pRowDefaults), + pColDefaults(pRanges->pColDefaults), + nSize(pRanges->nSize) +{ +} + +ScRowFormatRanges::~ScRowFormatRanges() +{ +} + +void ScRowFormatRanges::Clear() +{ + aRowFormatRanges.clear(); + nSize = 0; +} + +void ScRowFormatRanges::AddRange(const sal_Int32 nPrevStartCol, const sal_Int32 nRepeat, const sal_Int32 nPrevIndex, + const sal_Bool bPrevAutoStyle, const ScMyRowFormatRange& rFormatRange) +{ + sal_Int32 nIndex(-1); + if ((nPrevIndex != rFormatRange.nIndex) || + (bPrevAutoStyle != rFormatRange.bIsAutoStyle)) + nIndex = rFormatRange.nIndex; + + sal_Bool bInserted(sal_False); + if (!aRowFormatRanges.empty()) + { + ScMyRowFormatRange* pRange(&aRowFormatRanges.back()); + if (pRange) + { + if ((nPrevStartCol == (pRange->nStartColumn + pRange->nRepeatColumns)) && + (pRange->bIsAutoStyle == rFormatRange.bIsAutoStyle) && + (pRange->nIndex == nIndex) && + (pRange->nValidationIndex == rFormatRange.nValidationIndex)) + { + if (rFormatRange.nRepeatRows < pRange->nRepeatRows) + pRange->nRepeatRows = rFormatRange.nRepeatRows; + pRange->nRepeatColumns += nRepeat; + bInserted = sal_True; + } + } + } + if (!bInserted) + { + ScMyRowFormatRange aRange; + aRange.nStartColumn = nPrevStartCol; + aRange.nRepeatColumns = nRepeat; + aRange.nRepeatRows = rFormatRange.nRepeatRows; + aRange.nValidationIndex = rFormatRange.nValidationIndex; + aRange.bIsAutoStyle = rFormatRange.bIsAutoStyle; + aRange.nIndex = nIndex; + aRowFormatRanges.push_back(aRange); + ++nSize; + } +} + +void ScRowFormatRanges::AddRange(ScMyRowFormatRange& rFormatRange, + const sal_Int32 nRow) +{ + DBG_ASSERT(pRowDefaults, "no row defaults"); + DBG_ASSERT(pColDefaults, "no column defaults"); + sal_uInt32 nEnd (rFormatRange.nRepeatRows + nRow - 1); + sal_Int32 nPrevIndex((*pRowDefaults)[nRow].nIndex); + sal_Bool bPrevAutoStyle((*pRowDefaults)[nRow].bIsAutoStyle); + sal_uInt32 i(nRow + 1); + sal_Bool bReady(sal_False); + while ((i < nEnd) && !bReady && (i < pRowDefaults->size())) + { + if ((nPrevIndex != (*pRowDefaults)[i].nIndex) || + (bPrevAutoStyle != (*pRowDefaults)[i].bIsAutoStyle)) + bReady = sal_True; + else + i += (*pRowDefaults)[i].nRepeat; + } + if (i > nEnd) + i = nEnd; + if (bReady) + rFormatRange.nRepeatRows = i - nRow + 1; + if (nPrevIndex == -1) + { + nPrevIndex = (*pColDefaults)[rFormatRange.nStartColumn].nIndex; + bPrevAutoStyle = (*pColDefaults)[rFormatRange.nStartColumn].bIsAutoStyle; + sal_uInt32 nPrevStartCol(rFormatRange.nStartColumn); + sal_uInt32 nRepeat((*pColDefaults)[rFormatRange.nStartColumn].nRepeat); + nEnd = rFormatRange.nStartColumn + rFormatRange.nRepeatColumns; + for(i = nPrevStartCol + nRepeat; i < nEnd; i += (*pColDefaults)[i].nRepeat) + { + DBG_ASSERT(sal_uInt32(nPrevStartCol + nRepeat) <= nEnd, "something wents wrong"); + if ((nPrevIndex != (*pColDefaults)[i].nIndex) || + (bPrevAutoStyle != (*pColDefaults)[i].bIsAutoStyle)) + { + AddRange(nPrevStartCol, nRepeat, nPrevIndex, bPrevAutoStyle, rFormatRange); + nPrevStartCol = i; + nRepeat = (*pColDefaults)[i].nRepeat; + nPrevIndex = (*pColDefaults)[i].nIndex; + bPrevAutoStyle = (*pColDefaults)[i].bIsAutoStyle; + } + else + nRepeat += (*pColDefaults)[i].nRepeat; + } + if (sal_uInt32(nPrevStartCol + nRepeat) > nEnd) + nRepeat = nEnd - nPrevStartCol; + AddRange(nPrevStartCol, nRepeat, nPrevIndex, bPrevAutoStyle, rFormatRange); + } + else if ((nPrevIndex == rFormatRange.nIndex) && + (bPrevAutoStyle == rFormatRange.bIsAutoStyle)) + { + rFormatRange.nIndex = -1; + aRowFormatRanges.push_back(rFormatRange); + ++nSize; + } +} + +sal_Bool ScRowFormatRanges::GetNext(ScMyRowFormatRange& aFormatRange) +{ + ScMyRowFormatRangesList::iterator aItr(aRowFormatRanges.begin()); + if (aItr != aRowFormatRanges.end()) + { + aFormatRange = (*aItr); + aRowFormatRanges.erase(aItr); + --nSize; + return sal_True; + } + return sal_False; +} + +sal_Int32 ScRowFormatRanges::GetMaxRows() +{ + ScMyRowFormatRangesList::iterator aItr(aRowFormatRanges.begin()); + ScMyRowFormatRangesList::iterator aEndItr(aRowFormatRanges.end()); + sal_Int32 nMaxRows = MAXROW + 1; + if (aItr != aEndItr) + while (aItr != aEndItr) + { + if ((*aItr).nRepeatRows < nMaxRows) + nMaxRows = (*aItr).nRepeatRows; + ++aItr; + } + else + { + DBG_ERROR("no ranges found"); + } + return nMaxRows; +} + +sal_Int32 ScRowFormatRanges::GetSize() +{ + return nSize; +} + +void ScRowFormatRanges::Sort() +{ + aRowFormatRanges.sort(); +} + +// ============================================================================ +ScMyFormatRange::ScMyFormatRange() + : nStyleNameIndex(-1), + nValidationIndex(-1), + bIsAutoStyle(sal_True) +{ +} + +sal_Bool ScMyFormatRange::operator<(const ScMyFormatRange& rRange) const +{ + if (aRangeAddress.StartRow < rRange.aRangeAddress.StartRow) + return sal_True; + else + if (aRangeAddress.StartRow == rRange.aRangeAddress.StartRow) + return (aRangeAddress.StartColumn < rRange.aRangeAddress.StartColumn); + else + return sal_False; +} + +ScFormatRangeStyles::ScFormatRangeStyles() + : aTables(), + aStyleNames(), + aAutoStyleNames() +{ +} + +ScFormatRangeStyles::~ScFormatRangeStyles() +{ + ScMyOUStringVec::iterator i(aStyleNames.begin()); + ScMyOUStringVec::iterator endi(aStyleNames.end()); + while (i != endi) + { + delete *i; + ++i; + } + i = aAutoStyleNames.begin(); + endi = aAutoStyleNames.end(); + while (i != endi) + { + delete *i; + ++i; + } + ScMyFormatRangeListVec::iterator j(aTables.begin()); + ScMyFormatRangeListVec::iterator endj(aTables.end()); + while (j != endj) + { + delete *j; + ++j; + } +} + +void ScFormatRangeStyles::AddNewTable(const sal_Int32 nTable) +{ + sal_Int32 nSize = aTables.size() - 1; + if (nTable > nSize) + for (sal_Int32 i = nSize; i < nTable; ++i) + { + ScMyFormatRangeAddresses* aRangeAddresses(new ScMyFormatRangeAddresses); + aTables.push_back(aRangeAddresses); + } +} + +sal_Bool ScFormatRangeStyles::AddStyleName(rtl::OUString* rpString, sal_Int32& rIndex, const sal_Bool bIsAutoStyle) +{ + if (bIsAutoStyle) + { + aAutoStyleNames.push_back(rpString); + rIndex = aAutoStyleNames.size() - 1; + return sal_True; + } + else + { + sal_Int32 nCount(aStyleNames.size()); + sal_Bool bFound(sal_False); + sal_Int32 i(nCount - 1); + while ((i >= 0) && (!bFound)) + { + if (aStyleNames.at(i)->equals(*rpString)) + bFound = sal_True; + else + i--; + } + if (bFound) + { + rIndex = i; + return sal_False; + } + else + { + aStyleNames.push_back(rpString); + rIndex = aStyleNames.size() - 1; + return sal_True; + } + } +} + +sal_Int32 ScFormatRangeStyles::GetIndexOfStyleName(const rtl::OUString& rString, const rtl::OUString& rPrefix, sal_Bool& bIsAutoStyle) +{ + sal_Int32 nPrefixLength(rPrefix.getLength()); + rtl::OUString sTemp(rString.copy(nPrefixLength)); + sal_Int32 nIndex(sTemp.toInt32()); + if (aAutoStyleNames.at(nIndex - 1)->equals(rString)) + { + bIsAutoStyle = sal_True; + return nIndex - 1; + } + else + { + sal_Int32 i(0); + sal_Bool bFound(sal_False); + while (!bFound && static_cast(i) < aStyleNames.size()) + { + if (aStyleNames[i]->equals(rString)) + bFound = sal_True; + else + ++i; + } + if (bFound) + { + bIsAutoStyle = sal_False; + return i; + } + else + { + i = 0; + while (!bFound && static_cast(i) < aAutoStyleNames.size()) + { + if (aAutoStyleNames[i]->equals(rString)) + bFound = sal_True; + else + ++i; + } + if (bFound) + { + bIsAutoStyle = sal_True; + return i; + } + else + return -1; + } + } +} + +sal_Int32 ScFormatRangeStyles::GetStyleNameIndex(const sal_Int32 nTable, + const sal_Int32 nColumn, const sal_Int32 nRow, sal_Bool& bIsAutoStyle) const +{ + DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); + ScMyFormatRangeAddresses* pFormatRanges(aTables[nTable]); + ScMyFormatRangeAddresses::iterator aItr(pFormatRanges->begin()); + ScMyFormatRangeAddresses::iterator aEndItr(pFormatRanges->end()); + while (aItr != aEndItr) + { + if (((*aItr).aRangeAddress.StartColumn <= nColumn) && + ((*aItr).aRangeAddress.EndColumn >= nColumn) && + ((*aItr).aRangeAddress.StartRow <= nRow) && + ((*aItr).aRangeAddress.EndRow >= nRow)) + { + bIsAutoStyle = aItr->bIsAutoStyle; + return (*aItr).nStyleNameIndex; + } + else + ++aItr; + } + return -1; +} + +sal_Int32 ScFormatRangeStyles::GetStyleNameIndex(const sal_Int32 nTable, const sal_Int32 nColumn, const sal_Int32 nRow, + sal_Bool& bIsAutoStyle, sal_Int32& nValidationIndex, sal_Int32& nNumberFormat, const sal_Bool bRemoveRange) +{ + DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); + ScMyFormatRangeAddresses* pFormatRanges(aTables[nTable]); + ScMyFormatRangeAddresses::iterator aItr(pFormatRanges->begin()); + ScMyFormatRangeAddresses::iterator aEndItr(pFormatRanges->end()); + while (aItr != aEndItr) + { + if (((*aItr).aRangeAddress.StartColumn <= nColumn) && + ((*aItr).aRangeAddress.EndColumn >= nColumn) && + ((*aItr).aRangeAddress.StartRow <= nRow) && + ((*aItr).aRangeAddress.EndRow >= nRow)) + { + bIsAutoStyle = aItr->bIsAutoStyle; + nValidationIndex = aItr->nValidationIndex; + nNumberFormat = aItr->nNumberFormat; + if (((*pRowDefaults)[nRow].nIndex != -1)) + { + if (((*pRowDefaults)[nRow].nIndex == (*aItr).nStyleNameIndex) && + ((*pRowDefaults)[nRow].bIsAutoStyle == (*aItr).bIsAutoStyle)) + return -1; + else + return (*aItr).nStyleNameIndex; + } + else if (((*pColDefaults)[nColumn].nIndex != -1) && + ((*pColDefaults)[nColumn].nIndex == (*aItr).nStyleNameIndex) && + ((*pColDefaults)[nColumn].bIsAutoStyle == (*aItr).bIsAutoStyle)) + return -1; + else + return (*aItr).nStyleNameIndex; + } + else + { + if (bRemoveRange && (*aItr).aRangeAddress.EndRow < nRow) + aItr = pFormatRanges->erase(aItr); + else + ++aItr; + } + } + return -1; +} + +void ScFormatRangeStyles::GetFormatRanges(const sal_Int32 nStartColumn, const sal_Int32 nEndColumn, const sal_Int32 nRow, + const sal_Int32 nTable, ScRowFormatRanges* pRowFormatRanges) +{ + sal_Int32 nTotalColumns(nEndColumn - nStartColumn + 1); + DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); + ScMyFormatRangeAddresses* pFormatRanges(aTables[nTable]); + ScMyFormatRangeAddresses::iterator aItr(pFormatRanges->begin()); + ScMyFormatRangeAddresses::iterator aEndItr(pFormatRanges->end()); + sal_Int32 nColumns = 0; + while (aItr != aEndItr && nColumns < nTotalColumns) + { +#if OSL_DEBUG_LEVEL > 1 + table::CellRangeAddress aTempRangeAddress((*aItr).aRangeAddress); +#endif + if (((*aItr).aRangeAddress.StartRow <= nRow) && + ((*aItr).aRangeAddress.EndRow >= nRow)) + { + if ((((*aItr).aRangeAddress.StartColumn <= nStartColumn) && + ((*aItr).aRangeAddress.EndColumn >= nStartColumn)) || + (((*aItr).aRangeAddress.StartColumn <= nEndColumn) && + ((*aItr).aRangeAddress.EndColumn >= nEndColumn)) || + (((*aItr).aRangeAddress.StartColumn >= nStartColumn) && + ((*aItr).aRangeAddress.EndColumn <= nEndColumn))) + { + ScMyRowFormatRange aRange; + aRange.nIndex = aItr->nStyleNameIndex; + aRange.nValidationIndex = aItr->nValidationIndex; + aRange.bIsAutoStyle = aItr->bIsAutoStyle; + if ((aItr->aRangeAddress.StartColumn < nStartColumn) && + (aItr->aRangeAddress.EndColumn >= nStartColumn)) + { + if (aItr->aRangeAddress.EndColumn >= nEndColumn) + aRange.nRepeatColumns = nTotalColumns; + else + aRange.nRepeatColumns = aItr->aRangeAddress.EndColumn - nStartColumn + 1; + aRange.nStartColumn = nStartColumn; + } + else if ((aItr->aRangeAddress.StartColumn >= nStartColumn) && + (aItr->aRangeAddress.EndColumn <= nEndColumn)) + { + aRange.nRepeatColumns = aItr->aRangeAddress.EndColumn - aItr->aRangeAddress.StartColumn + 1; + aRange.nStartColumn = aItr->aRangeAddress.StartColumn; + } + else if ((aItr->aRangeAddress.StartColumn >= nStartColumn) && + (aItr->aRangeAddress.StartColumn <= nEndColumn) && + (aItr->aRangeAddress.EndColumn > nEndColumn)) + { + aRange.nRepeatColumns = nEndColumn - aItr->aRangeAddress.StartColumn + 1; + aRange.nStartColumn = aItr->aRangeAddress.StartColumn; + } + aRange.nRepeatRows = aItr->aRangeAddress.EndRow - nRow + 1; + pRowFormatRanges->AddRange(aRange, nRow); + nColumns += aRange.nRepeatColumns; + } + ++aItr; + } + else + if(aItr->aRangeAddress.EndRow < nRow) + aItr = pFormatRanges->erase(aItr); + else + ++aItr; + } + pRowFormatRanges->Sort(); +} + +void ScFormatRangeStyles::AddRangeStyleName(const table::CellRangeAddress aCellRangeAddress, + const sal_Int32 nStringIndex, const sal_Bool bIsAutoStyle, const sal_Int32 nValidationIndex, + const sal_Int32 nNumberFormat) +{ + ScMyFormatRange aFormatRange; + aFormatRange.aRangeAddress = aCellRangeAddress; + aFormatRange.nStyleNameIndex = nStringIndex; + aFormatRange.nValidationIndex = nValidationIndex; + aFormatRange.nNumberFormat = nNumberFormat; + aFormatRange.bIsAutoStyle = bIsAutoStyle; + DBG_ASSERT(static_cast(aCellRangeAddress.Sheet) < aTables.size(), "wrong table"); + ScMyFormatRangeAddresses* pFormatRanges(aTables[aCellRangeAddress.Sheet]); + pFormatRanges->push_back(aFormatRange); +} + +rtl::OUString* ScFormatRangeStyles::GetStyleNameByIndex(const sal_Int32 nIndex, const sal_Bool bIsAutoStyle) +{ + if (bIsAutoStyle) + return aAutoStyleNames[nIndex]; + else + return aStyleNames[nIndex]; +} + +void ScFormatRangeStyles::Sort() +{ + sal_Int32 nTables = aTables.size(); + for (sal_Int16 i = 0; i < nTables; ++i) + if (!aTables[i]->empty()) + aTables[i]->sort(); +} + +//=========================================================================== + +ScColumnRowStylesBase::ScColumnRowStylesBase() + : aStyleNames() +{ +} + +ScColumnRowStylesBase::~ScColumnRowStylesBase() +{ + ScMyOUStringVec::iterator i(aStyleNames.begin()); + ScMyOUStringVec::iterator endi(aStyleNames.end()); + while (i != endi) + { + delete *i; + ++i; + } +} + +sal_Int32 ScColumnRowStylesBase::AddStyleName(rtl::OUString* pString) +{ + aStyleNames.push_back(pString); + return aStyleNames.size() - 1; +} + +sal_Int32 ScColumnRowStylesBase::GetIndexOfStyleName(const rtl::OUString& rString, const rtl::OUString& rPrefix) +{ + sal_Int32 nPrefixLength(rPrefix.getLength()); + rtl::OUString sTemp(rString.copy(nPrefixLength)); + sal_Int32 nIndex(sTemp.toInt32()); + if (aStyleNames.at(nIndex - 1)->equals(rString)) + return nIndex - 1; + else + { + sal_Int32 i(0); + sal_Bool bFound(sal_False); + while (!bFound && static_cast(i) < aStyleNames.size()) + { + if (aStyleNames.at(i)->equals(rString)) + bFound = sal_True; + else + ++i; + } + if (bFound) + return i; + else + return -1; + } +} + +rtl::OUString* ScColumnRowStylesBase::GetStyleNameByIndex(const sal_Int32 nIndex) +{ + if ( nIndex < 0 || nIndex >= sal::static_int_cast( aStyleNames.size() ) ) + { + // #123981# should no longer happen, use first style then + DBG_ERRORFILE("GetStyleNameByIndex: invalid index"); + return aStyleNames[0]; + } + + return aStyleNames[nIndex]; +} + +//=========================================================================== + +ScColumnStyles::ScColumnStyles() + : ScColumnRowStylesBase(), + aTables() +{ +} + +ScColumnStyles::~ScColumnStyles() +{ +} + +void ScColumnStyles::AddNewTable(const sal_Int32 nTable, const sal_Int32 nFields) +{ + sal_Int32 nSize(aTables.size() - 1); + if (nTable > nSize) + for (sal_Int32 i = nSize; i < nTable; ++i) + { + ScMyColumnStyleVec aFieldsVec(nFields + 1, ScColumnStyle()); + aTables.push_back(aFieldsVec); + } +} + +sal_Int32 ScColumnStyles::GetStyleNameIndex(const sal_Int32 nTable, const sal_Int32 nField, + sal_Bool& bIsVisible) +{ + DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); + if (static_cast(nField) < aTables[nTable].size()) + { + bIsVisible = aTables[nTable][nField].bIsVisible; + return aTables[nTable][nField].nIndex; + } + else + { + bIsVisible = aTables[nTable][aTables[nTable].size() - 1].bIsVisible; + return aTables[nTable][aTables[nTable].size() - 1].nIndex; + } +} + +void ScColumnStyles::AddFieldStyleName(const sal_Int32 nTable, const sal_Int32 nField, + const sal_Int32 nStringIndex, const sal_Bool bIsVisible) +{ + DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); + DBG_ASSERT(aTables[nTable].size() >= static_cast(nField), "wrong field"); + ScColumnStyle aStyle; + aStyle.nIndex = nStringIndex; + aStyle.bIsVisible = bIsVisible; + if (aTables[nTable].size() == static_cast(nField)) + aTables[nTable].push_back(aStyle); + aTables[nTable][nField] = aStyle; +} + +rtl::OUString* ScColumnStyles::GetStyleName(const sal_Int32 nTable, const sal_Int32 nField) +{ + sal_Bool bTemp; + return GetStyleNameByIndex(GetStyleNameIndex(nTable, nField, bTemp)); +} + +//=========================================================================== + +ScRowStyles::ScRowStyles() + : ScColumnRowStylesBase(), + aTables() +{ +} + +ScRowStyles::~ScRowStyles() +{ +} + +void ScRowStyles::AddNewTable(const sal_Int32 nTable, const sal_Int32 nFields) +{ + sal_Int32 nSize(aTables.size() - 1); + if (nTable > nSize) + for (sal_Int32 i = nSize; i < nTable; ++i) + { + ScMysalInt32Vec aFieldsVec(nFields + 1, -1); + aTables.push_back(aFieldsVec); + } +} + +sal_Int32 ScRowStyles::GetStyleNameIndex(const sal_Int32 nTable, const sal_Int32 nField) +{ + DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); + if (static_cast(nField) < aTables[nTable].size()) + return aTables[nTable][nField]; + else + return aTables[nTable][aTables[nTable].size() - 1]; +} + +void ScRowStyles::AddFieldStyleName(const sal_Int32 nTable, const sal_Int32 nField, + const sal_Int32 nStringIndex) +{ + DBG_ASSERT(static_cast(nTable) < aTables.size(), "wrong table"); + DBG_ASSERT(aTables[nTable].size() >= static_cast(nField), "wrong field"); + if (aTables[nTable].size() == static_cast(nField)) + aTables[nTable].push_back(nStringIndex); + aTables[nTable][nField] = nStringIndex; +} + +rtl::OUString* ScRowStyles::GetStyleName(const sal_Int32 nTable, const sal_Int32 nField) +{ + return GetStyleNameByIndex(GetStyleNameIndex(nTable, nField)); +} diff --git a/sc/source/filter/xml/xmlcvali.cxx b/sc/source/filter/xml/xmlcvali.cxx index 0d78a79a5eea..d8d8eb0d7cc2 100644 --- a/sc/source/filter/xml/xmlcvali.cxx +++ b/sc/source/filter/xml/xmlcvali.cxx @@ -1,788 +1,788 @@ -/************************************************************************* - * - * 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: xmlcvali.cxx,v $ - * $Revision: 1.27 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -// INCLUDE --------------------------------------------------------------- - -#include "xmlcvali.hxx" -#include "xmlimprt.hxx" -#include "xmlconti.hxx" -#include "document.hxx" -#include "XMLConverter.hxx" - -#include -#include -#include -#include -#include -#include -#include - -using namespace com::sun::star; -using namespace xmloff::token; - -class ScXMLContentValidationContext : public SvXMLImportContext -{ - rtl::OUString sName; - rtl::OUString sHelpTitle; - rtl::OUString sHelpMessage; - rtl::OUString sErrorTitle; - rtl::OUString sErrorMessage; - rtl::OUString sErrorMessageType; - rtl::OUString sBaseCellAddress; - rtl::OUString sCondition; - formula::FormulaGrammar::Grammar eGrammar; - sal_Int16 nShowList; - sal_Bool bAllowEmptyCell; - sal_Bool bDisplayHelp; - sal_Bool bDisplayError; - - SvXMLImportContextRef xEventContext; - - const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } - ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } - - void GetAlertStyle(const rtl::OUString& sMessageType, com::sun::star::sheet::ValidationAlertStyle& aAlertStyle); - void SetFormulas(const rtl::OUString& sFormulas, rtl::OUString& sFormula1, rtl::OUString& sFormula2) const; - void GetCondition(const rtl::OUString& sCondition, rtl::OUString& sFormula1, rtl::OUString& sFormula2, - com::sun::star::sheet::ValidationType& aValidationType, - com::sun::star::sheet::ConditionOperator& aOperator); - -public: - - ScXMLContentValidationContext( ScXMLImport& rImport, USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList); - - virtual ~ScXMLContentValidationContext(); - - virtual SvXMLImportContext *CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLocalName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); - - virtual void EndElement(); - - void SetHelpMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const sal_Bool bDisplay); - void SetErrorMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const rtl::OUString& sMessageType, const sal_Bool bDisplay); - void SetErrorMacro(const sal_Bool bExecute); -}; - -class ScXMLHelpMessageContext : public SvXMLImportContext -{ - rtl::OUString sTitle; - rtl::OUStringBuffer sMessage; - sal_Int32 nParagraphCount; - sal_Bool bDisplay; - - ScXMLContentValidationContext* pValidationContext; - - const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } - ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } - -public: - - ScXMLHelpMessageContext( ScXMLImport& rImport, USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList, - ScXMLContentValidationContext* pValidationContext); - - virtual ~ScXMLHelpMessageContext(); - - virtual SvXMLImportContext *CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLocalName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); - - virtual void EndElement(); -}; - -class ScXMLErrorMessageContext : public SvXMLImportContext -{ - rtl::OUString sTitle; - rtl::OUStringBuffer sMessage; - rtl::OUString sMessageType; - sal_Int32 nParagraphCount; - sal_Bool bDisplay; - - ScXMLContentValidationContext* pValidationContext; - - const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } - ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } - -public: - - ScXMLErrorMessageContext( ScXMLImport& rImport, USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList, - ScXMLContentValidationContext* pValidationContext); - - virtual ~ScXMLErrorMessageContext(); - - virtual SvXMLImportContext *CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLocalName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); - - virtual void EndElement(); -}; - -class ScXMLErrorMacroContext : public SvXMLImportContext -{ - rtl::OUString sName; - sal_Bool bExecute; - - ScXMLContentValidationContext* pValidationContext; - - const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } - ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } - -public: - - ScXMLErrorMacroContext( ScXMLImport& rImport, USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList, - ScXMLContentValidationContext* pValidationContext); - - virtual ~ScXMLErrorMacroContext(); - - virtual SvXMLImportContext *CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLocalName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); - virtual void EndElement(); -}; - -//------------------------------------------------------------------ - -ScXMLContentValidationsContext::ScXMLContentValidationsContext( ScXMLImport& rImport, - USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) : - SvXMLImportContext( rImport, nPrfx, rLName ) -{ - // here are no attributes -} - -ScXMLContentValidationsContext::~ScXMLContentValidationsContext() -{ -} - -SvXMLImportContext *ScXMLContentValidationsContext::CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) -{ - SvXMLImportContext *pContext = 0; - - const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationsElemTokenMap(); - switch( rTokenMap.Get( nPrefix, rLName ) ) - { - case XML_TOK_CONTENT_VALIDATION: - pContext = new ScXMLContentValidationContext( GetScImport(), nPrefix, rLName, xAttrList); - break; - } - - if( !pContext ) - pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); - - return pContext; -} - -void ScXMLContentValidationsContext::EndElement() -{ -} - -ScXMLContentValidationContext::ScXMLContentValidationContext( ScXMLImport& rImport, - USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList) : - SvXMLImportContext( rImport, nPrfx, rLName ), - sName(), - sHelpTitle(), - sHelpMessage(), - sErrorTitle(), - sErrorMessage(), - sErrorMessageType(), - sBaseCellAddress(), - sCondition(), - nShowList(sheet::TableValidationVisibility::UNSORTED), - bAllowEmptyCell(sal_True), - bDisplayHelp(sal_False), - bDisplayError(sal_False) -{ - const formula::FormulaGrammar::Grammar eStorageGrammar = eGrammar = GetScImport().GetDocument()->GetStorageGrammar(); - sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; - const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationAttrTokenMap(); - for( sal_Int16 i=0; i < nAttrCount; ++i ) - { - const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); - rtl::OUString aLocalName; - USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( - sAttrName, &aLocalName ); - const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); - - switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) - { - case XML_TOK_CONTENT_VALIDATION_NAME: - sName = sValue; - break; - case XML_TOK_CONTENT_VALIDATION_CONDITION: - { - sal_uInt16 nCondPrefix = GetImport().GetNamespaceMap(). - _GetKeyByAttrName( sValue, &sCondition, sal_False ); - - if (!ScXMLImport::IsAcceptedFormulaNamespace( nCondPrefix, - sValue, eGrammar, eStorageGrammar)) - sCondition = sValue; - } - break; - case XML_TOK_CONTENT_VALIDATION_BASE_CELL_ADDRESS: - sBaseCellAddress = sValue; - break; - case XML_TOK_CONTENT_VALIDATION_ALLOW_EMPTY_CELL: - if (IsXMLToken(sValue, XML_FALSE)) - bAllowEmptyCell = sal_False; - break; - case XML_TOK_CONTENT_VALIDATION_DISPLAY_LIST: - { - if (IsXMLToken(sValue, XML_NO)) - { - nShowList = sheet::TableValidationVisibility::INVISIBLE; - } - else if (IsXMLToken(sValue, XML_UNSORTED)) - { - nShowList = sheet::TableValidationVisibility::UNSORTED; - } - else if (IsXMLToken(sValue, XML_SORTED_ASCENDING)) - { - nShowList = sheet::TableValidationVisibility::SORTEDASCENDING; - } - } - break; - } - } -} - -ScXMLContentValidationContext::~ScXMLContentValidationContext() -{ -} - -SvXMLImportContext *ScXMLContentValidationContext::CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) -{ - SvXMLImportContext *pContext = 0; - - const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationElemTokenMap(); - switch( rTokenMap.Get( nPrefix, rLName ) ) - { - case XML_TOK_CONTENT_VALIDATION_ELEM_HELP_MESSAGE: - pContext = new ScXMLHelpMessageContext( GetScImport(), nPrefix, rLName, xAttrList, this); - break; - case XML_TOK_CONTENT_VALIDATION_ELEM_ERROR_MESSAGE: - pContext = new ScXMLErrorMessageContext( GetScImport(), nPrefix, rLName, xAttrList, this); - break; - case XML_TOK_CONTENT_VALIDATION_ELEM_ERROR_MACRO: - pContext = new ScXMLErrorMacroContext( GetScImport(), nPrefix, rLName, xAttrList, this); - break; - case XML_TOK_CONTENT_VALIDATION_ELEM_EVENT_LISTENERS: - pContext = new XMLEventsImportContext( GetImport(), nPrefix, rLName ); - xEventContext = pContext; - break; - } - - if( !pContext ) - pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); - - return pContext; -} - -void ScXMLContentValidationContext::GetAlertStyle(const rtl::OUString& sMessageType, com::sun::star::sheet::ValidationAlertStyle& aAlertStyle) -{ - if (IsXMLToken(sMessageType, XML_MACRO)) - aAlertStyle = sheet::ValidationAlertStyle_MACRO; - else if (IsXMLToken(sMessageType, XML_STOP)) - aAlertStyle = sheet::ValidationAlertStyle_STOP; - else if (IsXMLToken(sMessageType, XML_WARNING)) - aAlertStyle = sheet::ValidationAlertStyle_WARNING; - else if (IsXMLToken(sMessageType, XML_INFORMATION)) - aAlertStyle = sheet::ValidationAlertStyle_INFO; - else // don't leave uninitialized - aAlertStyle = sheet::ValidationAlertStyle_STOP; -} - -void ScXMLContentValidationContext::SetFormulas(const rtl::OUString& sFormulas, rtl::OUString& sFormula1, rtl::OUString& sFormula2) const -{ - sal_Int32 i = 0; - sal_Bool bString = sal_False; - sal_Int32 nBrakes = 0; - while ((sFormulas[i] != ',' || nBrakes > 0 || bString) && i < sFormulas.getLength()) - { - if (sFormulas[i] == '(') - ++nBrakes; - if (sFormulas[i] == ')') - --nBrakes; - if (sFormulas[i] == '"') - bString = !bString; - ++i; - } - if (sFormulas[i] == ',') - { - sFormula1 = sFormulas.copy(0, i); - sFormula2 = sFormulas.copy(i + 1); - } -} - -void ScXMLContentValidationContext::GetCondition(const rtl::OUString& sTempCondition, rtl::OUString& sFormula1, rtl::OUString& sFormula2, - com::sun::star::sheet::ValidationType& aValidationType, - com::sun::star::sheet::ConditionOperator& aOperator) -{ - aValidationType = sheet::ValidationType_ANY; // #b6343997# default if no condition is given - aOperator = sheet::ConditionOperator_NONE; - - rtl::OUString sLocalCondition(sTempCondition); - if (sLocalCondition.getLength()) - { - // ToDo: erase all blanks in the condition, but not in formulas or strings - rtl::OUString scell_content(RTL_CONSTASCII_USTRINGPARAM("cell_content")); - rtl::OUString scell_content_is_date(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-date")); - rtl::OUString scell_content_is_time(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-time")); - rtl::OUString scell_content_is_between(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-between")); - rtl::OUString scell_content_is_in_list(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-in-list")); - rtl::OUString scell_content_text_length(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length")); - rtl::OUString scell_content_is_not_between(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-not-between")); - rtl::OUString scell_content_is_whole_number(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-whole-number")); - rtl::OUString scell_content_is_decimal_number(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-decimal-number")); - rtl::OUString scell_content_text_length_is_between(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length-is-between")); - rtl::OUString scell_content_text_length_is_not_between(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length-is-not-between")); - sal_Int32 i = 0; - sal_Bool bAnd(sal_True); - while (sLocalCondition[i] != '(' && i < sLocalCondition.getLength()) - ++i; - if (sLocalCondition[i] == '(') - { - if (i != scell_content_text_length.getLength() && - i != scell_content_text_length_is_between.getLength() && - i != scell_content_text_length_is_not_between.getLength() && - i != scell_content_is_in_list.getLength()) - { - if (i == scell_content_is_time.getLength()) - { - rtl::OUString sTemp = sLocalCondition.copy(0, i); - if (sTemp == scell_content_is_time) - aValidationType = sheet::ValidationType_TIME; - else - aValidationType = sheet::ValidationType_DATE; - } - else if (i == scell_content_is_whole_number.getLength()) - aValidationType = sheet::ValidationType_WHOLE; - else if (i == scell_content_is_decimal_number.getLength()) - aValidationType = sheet::ValidationType_DECIMAL; - sLocalCondition = sLocalCondition.copy(i + 2); - rtl::OUString sTemp = sLocalCondition.copy(0, 5); - if (sTemp.compareToAscii(" and ") == 0) - sLocalCondition = sLocalCondition.copy(5); - else - bAnd = sal_False; - } - if (sLocalCondition.getLength() && bAnd) - { - i = 0; - while (sLocalCondition[i] != '(' && i < sLocalCondition.getLength()) - ++i; - if (sLocalCondition[i] == '(') - { - rtl::OUString sTemp = sLocalCondition.copy(0, i); - sLocalCondition = sLocalCondition.copy(i + 1); - if (i == scell_content_is_between.getLength() || - i == scell_content_text_length_is_between.getLength()) - { - if (sTemp == scell_content_is_in_list) - { - aValidationType = sheet::ValidationType_LIST; - sFormula1 = sLocalCondition.copy(0, sLocalCondition.getLength() - 1); - aOperator = sheet::ConditionOperator_EQUAL; - } - else - { - if (i == scell_content_text_length_is_between.getLength()) - aValidationType = sheet::ValidationType_TEXT_LEN; - aOperator = sheet::ConditionOperator_BETWEEN; - sLocalCondition = sLocalCondition.copy(0, sLocalCondition.getLength() - 1); - SetFormulas(sLocalCondition, sFormula1, sFormula2); - } - } - else if (i == scell_content_is_not_between.getLength() || - i == scell_content_text_length_is_not_between.getLength()) - { - if (i == scell_content_text_length_is_not_between.getLength()) - aValidationType = sheet::ValidationType_TEXT_LEN; - aOperator = sheet::ConditionOperator_NOT_BETWEEN; - sLocalCondition = sLocalCondition.copy(0, sLocalCondition.getLength() - 1); - SetFormulas(sLocalCondition, sFormula1, sFormula2); - } - else if (i == scell_content.getLength() || - i == scell_content_text_length.getLength()) - { - if (i == scell_content_text_length.getLength()) - aValidationType = sheet::ValidationType_TEXT_LEN; - sLocalCondition = sLocalCondition.copy(1); - switch (sLocalCondition[0]) - { - case '<' : - { - if (sLocalCondition[1] == '=') - { - aOperator = sheet::ConditionOperator_LESS_EQUAL; - sLocalCondition = sLocalCondition.copy(2); - } - else - { - aOperator = sheet::ConditionOperator_LESS; - sLocalCondition = sLocalCondition.copy(1); - } - } - break; - case '>' : - { - if (sLocalCondition[1] == '=') - { - aOperator = sheet::ConditionOperator_GREATER_EQUAL; - sLocalCondition = sLocalCondition.copy(2); - } - else - { - aOperator = sheet::ConditionOperator_GREATER; - sLocalCondition = sLocalCondition.copy(1); - } - } - break; - case '=' : - { - aOperator = sheet::ConditionOperator_EQUAL; - sLocalCondition = sLocalCondition.copy(1); - } - break; - case '!' : - { - aOperator = sheet::ConditionOperator_NOT_EQUAL; - sLocalCondition = sLocalCondition.copy(1); - } - break; - } - sFormula1 = sLocalCondition; - } - } - } - } - } - - // a validation type (date, integer) without a condition isn't possible - if ( aOperator == sheet::ConditionOperator_NONE ) - aValidationType = sheet::ValidationType_ANY; -} - -void ScXMLContentValidationContext::EndElement() -{ - // #i36650# event-listeners element moved up one level - if (xEventContext.Is()) - { - rtl::OUString sOnError(RTL_CONSTASCII_USTRINGPARAM("OnError")); - XMLEventsImportContext* pEvents = - (XMLEventsImportContext*)&xEventContext; - uno::Sequence aValues; - pEvents->GetEventSequence( sOnError, aValues ); - - sal_Int32 nLength = aValues.getLength(); - for( sal_Int32 i = 0; i < nLength; i++ ) - { - // #i47525# must allow "MacroName" or "Script" - if ( aValues[i].Name.equalsAsciiL( "MacroName", sizeof("MacroName")-1 ) || - aValues[i].Name.equalsAsciiL( "Script", sizeof("Script")-1 ) ) - { - aValues[i].Value >>= sErrorTitle; - break; - } - } - } - - ScMyImportValidation aValidation; - aValidation.eGrammar = eGrammar; - aValidation.sName = sName; - aValidation.sBaseCellAddress = sBaseCellAddress; - aValidation.sImputTitle = sHelpTitle; - aValidation.sImputMessage = sHelpMessage; - aValidation.sErrorTitle = sErrorTitle; - aValidation.sErrorMessage = sErrorMessage; - GetCondition(sCondition, aValidation.sFormula1, aValidation.sFormula2, aValidation.aValidationType, aValidation.aOperator); - GetAlertStyle(sErrorMessageType, aValidation.aAlertStyle); - aValidation.bShowErrorMessage = bDisplayError; - aValidation.bShowImputMessage = bDisplayHelp; - aValidation.bIgnoreBlanks = bAllowEmptyCell; - aValidation.nShowList = nShowList; - GetScImport().AddValidation(aValidation); -} - -void ScXMLContentValidationContext::SetHelpMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const sal_Bool bDisplay) -{ - sHelpTitle = sTitle; - sHelpMessage = sMessage; - bDisplayHelp = bDisplay; -} - -void ScXMLContentValidationContext::SetErrorMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, - const rtl::OUString& sMessageType, const sal_Bool bDisplay) -{ - sErrorTitle = sTitle; - sErrorMessage = sMessage; - sErrorMessageType = sMessageType; - bDisplayError = bDisplay; -} - -void ScXMLContentValidationContext::SetErrorMacro(const sal_Bool bExecute) -{ - sErrorMessageType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("macro")); - bDisplayError = bExecute; -} - -ScXMLHelpMessageContext::ScXMLHelpMessageContext( ScXMLImport& rImport, - USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList, - ScXMLContentValidationContext* pTempValidationContext) : - SvXMLImportContext( rImport, nPrfx, rLName ), - sTitle(), - sMessage(), - nParagraphCount(0), - bDisplay(sal_False) -{ - pValidationContext = pTempValidationContext; - sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; - const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationHelpMessageAttrTokenMap(); - for( sal_Int16 i=0; i < nAttrCount; ++i ) - { - const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); - rtl::OUString aLocalName; - USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( - sAttrName, &aLocalName ); - const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); - - switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) - { - case XML_TOK_HELP_MESSAGE_ATTR_TITLE: - sTitle = sValue; - break; - case XML_TOK_HELP_MESSAGE_ATTR_DISPLAY: - bDisplay = IsXMLToken(sValue, XML_TRUE); - break; - } - } -} - -ScXMLHelpMessageContext::~ScXMLHelpMessageContext() -{ -} - -SvXMLImportContext *ScXMLHelpMessageContext::CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) -{ - SvXMLImportContext *pContext = 0; - - const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationMessageElemTokenMap(); - switch( rTokenMap.Get( nPrefix, rLName ) ) - { - case XML_TOK_P: - { - if(nParagraphCount) - sMessage.append(static_cast('\n')); - ++nParagraphCount; - pContext = new ScXMLContentContext( GetScImport(), nPrefix, rLName, xAttrList, sMessage); - } - break; - } - - if( !pContext ) - pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); - - return pContext; -} - -void ScXMLHelpMessageContext::EndElement() -{ - pValidationContext->SetHelpMessage(sTitle, sMessage.makeStringAndClear(), bDisplay); -} - -ScXMLErrorMessageContext::ScXMLErrorMessageContext( ScXMLImport& rImport, - USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList, - ScXMLContentValidationContext* pTempValidationContext) : - SvXMLImportContext( rImport, nPrfx, rLName ), - sTitle(), - sMessage(), - sMessageType(), - nParagraphCount(0), - bDisplay(sal_False) -{ - pValidationContext = pTempValidationContext; - sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; - const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationErrorMessageAttrTokenMap(); - for( sal_Int16 i=0; i < nAttrCount; ++i ) - { - const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); - rtl::OUString aLocalName; - USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( - sAttrName, &aLocalName ); - const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); - - switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) - { - case XML_TOK_ERROR_MESSAGE_ATTR_TITLE: - sTitle = sValue; - break; - case XML_TOK_ERROR_MESSAGE_ATTR_MESSAGE_TYPE: - sMessageType = sValue; - break; - case XML_TOK_ERROR_MESSAGE_ATTR_DISPLAY: - bDisplay = IsXMLToken(sValue, XML_TRUE); - break; - } - } -} - -ScXMLErrorMessageContext::~ScXMLErrorMessageContext() -{ -} - -SvXMLImportContext *ScXMLErrorMessageContext::CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) -{ - SvXMLImportContext *pContext = 0; - - const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationMessageElemTokenMap(); - switch( rTokenMap.Get( nPrefix, rLName ) ) - { - case XML_TOK_P: - { - if(nParagraphCount) - sMessage.append(static_cast('\n')); - ++nParagraphCount; - pContext = new ScXMLContentContext( GetScImport(), nPrefix, rLName, xAttrList, sMessage); - } - break; - } - - if( !pContext ) - pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); - - return pContext; -} - -void ScXMLErrorMessageContext::EndElement() -{ - pValidationContext->SetErrorMessage(sTitle, sMessage.makeStringAndClear(), sMessageType, bDisplay); -} - -ScXMLErrorMacroContext::ScXMLErrorMacroContext( ScXMLImport& rImport, - USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList, - ScXMLContentValidationContext* pTempValidationContext) : - SvXMLImportContext( rImport, nPrfx, rLName ), - sName(), - bExecute(sal_False) -{ - pValidationContext = pTempValidationContext; - sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; - const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationErrorMacroAttrTokenMap(); - for( sal_Int16 i=0; i < nAttrCount; ++i ) - { - const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); - rtl::OUString aLocalName; - USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( - sAttrName, &aLocalName ); - const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); - - switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) - { - case XML_TOK_ERROR_MACRO_ATTR_NAME: - sName = sValue; - break; - case XML_TOK_ERROR_MACRO_ATTR_EXECUTE: - bExecute = IsXMLToken(sValue, XML_TRUE); - break; - } - } -} - -ScXMLErrorMacroContext::~ScXMLErrorMacroContext() -{ -} - -SvXMLImportContext *ScXMLErrorMacroContext::CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) -{ - SvXMLImportContext *pContext = NULL; - - if ((nPrefix == XML_NAMESPACE_SCRIPT) && IsXMLToken(rLName, XML_EVENTS)) - { - pContext = new XMLEventsImportContext(GetImport(), nPrefix, rLName); - } - if (!pContext) - pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); - - return pContext; -} - -void ScXMLErrorMacroContext::EndElement() -{ - pValidationContext->SetErrorMacro( bExecute ); -} +/************************************************************************* + * + * 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: xmlcvali.cxx,v $ + * $Revision: 1.27 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + + +// INCLUDE --------------------------------------------------------------- + +#include "xmlcvali.hxx" +#include "xmlimprt.hxx" +#include "xmlconti.hxx" +#include "document.hxx" +#include "XMLConverter.hxx" + +#include +#include +#include +#include +#include +#include +#include + +using namespace com::sun::star; +using namespace xmloff::token; + +class ScXMLContentValidationContext : public SvXMLImportContext +{ + rtl::OUString sName; + rtl::OUString sHelpTitle; + rtl::OUString sHelpMessage; + rtl::OUString sErrorTitle; + rtl::OUString sErrorMessage; + rtl::OUString sErrorMessageType; + rtl::OUString sBaseCellAddress; + rtl::OUString sCondition; + formula::FormulaGrammar::Grammar eGrammar; + sal_Int16 nShowList; + sal_Bool bAllowEmptyCell; + sal_Bool bDisplayHelp; + sal_Bool bDisplayError; + + SvXMLImportContextRef xEventContext; + + const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } + ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } + + void GetAlertStyle(const rtl::OUString& sMessageType, com::sun::star::sheet::ValidationAlertStyle& aAlertStyle); + void SetFormulas(const rtl::OUString& sFormulas, rtl::OUString& sFormula1, rtl::OUString& sFormula2) const; + void GetCondition(const rtl::OUString& sCondition, rtl::OUString& sFormula1, rtl::OUString& sFormula2, + com::sun::star::sheet::ValidationType& aValidationType, + com::sun::star::sheet::ConditionOperator& aOperator); + +public: + + ScXMLContentValidationContext( ScXMLImport& rImport, USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList); + + virtual ~ScXMLContentValidationContext(); + + virtual SvXMLImportContext *CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLocalName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); + + virtual void EndElement(); + + void SetHelpMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const sal_Bool bDisplay); + void SetErrorMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const rtl::OUString& sMessageType, const sal_Bool bDisplay); + void SetErrorMacro(const sal_Bool bExecute); +}; + +class ScXMLHelpMessageContext : public SvXMLImportContext +{ + rtl::OUString sTitle; + rtl::OUStringBuffer sMessage; + sal_Int32 nParagraphCount; + sal_Bool bDisplay; + + ScXMLContentValidationContext* pValidationContext; + + const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } + ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } + +public: + + ScXMLHelpMessageContext( ScXMLImport& rImport, USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLContentValidationContext* pValidationContext); + + virtual ~ScXMLHelpMessageContext(); + + virtual SvXMLImportContext *CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLocalName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); + + virtual void EndElement(); +}; + +class ScXMLErrorMessageContext : public SvXMLImportContext +{ + rtl::OUString sTitle; + rtl::OUStringBuffer sMessage; + rtl::OUString sMessageType; + sal_Int32 nParagraphCount; + sal_Bool bDisplay; + + ScXMLContentValidationContext* pValidationContext; + + const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } + ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } + +public: + + ScXMLErrorMessageContext( ScXMLImport& rImport, USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLContentValidationContext* pValidationContext); + + virtual ~ScXMLErrorMessageContext(); + + virtual SvXMLImportContext *CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLocalName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); + + virtual void EndElement(); +}; + +class ScXMLErrorMacroContext : public SvXMLImportContext +{ + rtl::OUString sName; + sal_Bool bExecute; + + ScXMLContentValidationContext* pValidationContext; + + const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } + ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } + +public: + + ScXMLErrorMacroContext( ScXMLImport& rImport, USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLContentValidationContext* pValidationContext); + + virtual ~ScXMLErrorMacroContext(); + + virtual SvXMLImportContext *CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLocalName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); + virtual void EndElement(); +}; + +//------------------------------------------------------------------ + +ScXMLContentValidationsContext::ScXMLContentValidationsContext( ScXMLImport& rImport, + USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) : + SvXMLImportContext( rImport, nPrfx, rLName ) +{ + // here are no attributes +} + +ScXMLContentValidationsContext::~ScXMLContentValidationsContext() +{ +} + +SvXMLImportContext *ScXMLContentValidationsContext::CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationsElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + case XML_TOK_CONTENT_VALIDATION: + pContext = new ScXMLContentValidationContext( GetScImport(), nPrefix, rLName, xAttrList); + break; + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLContentValidationsContext::EndElement() +{ +} + +ScXMLContentValidationContext::ScXMLContentValidationContext( ScXMLImport& rImport, + USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList) : + SvXMLImportContext( rImport, nPrfx, rLName ), + sName(), + sHelpTitle(), + sHelpMessage(), + sErrorTitle(), + sErrorMessage(), + sErrorMessageType(), + sBaseCellAddress(), + sCondition(), + nShowList(sheet::TableValidationVisibility::UNSORTED), + bAllowEmptyCell(sal_True), + bDisplayHelp(sal_False), + bDisplayError(sal_False) +{ + const formula::FormulaGrammar::Grammar eStorageGrammar = eGrammar = GetScImport().GetDocument()->GetStorageGrammar(); + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_CONTENT_VALIDATION_NAME: + sName = sValue; + break; + case XML_TOK_CONTENT_VALIDATION_CONDITION: + { + sal_uInt16 nCondPrefix = GetImport().GetNamespaceMap(). + _GetKeyByAttrName( sValue, &sCondition, sal_False ); + + if (!ScXMLImport::IsAcceptedFormulaNamespace( nCondPrefix, + sValue, eGrammar, eStorageGrammar)) + sCondition = sValue; + } + break; + case XML_TOK_CONTENT_VALIDATION_BASE_CELL_ADDRESS: + sBaseCellAddress = sValue; + break; + case XML_TOK_CONTENT_VALIDATION_ALLOW_EMPTY_CELL: + if (IsXMLToken(sValue, XML_FALSE)) + bAllowEmptyCell = sal_False; + break; + case XML_TOK_CONTENT_VALIDATION_DISPLAY_LIST: + { + if (IsXMLToken(sValue, XML_NO)) + { + nShowList = sheet::TableValidationVisibility::INVISIBLE; + } + else if (IsXMLToken(sValue, XML_UNSORTED)) + { + nShowList = sheet::TableValidationVisibility::UNSORTED; + } + else if (IsXMLToken(sValue, XML_SORTED_ASCENDING)) + { + nShowList = sheet::TableValidationVisibility::SORTEDASCENDING; + } + } + break; + } + } +} + +ScXMLContentValidationContext::~ScXMLContentValidationContext() +{ +} + +SvXMLImportContext *ScXMLContentValidationContext::CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + case XML_TOK_CONTENT_VALIDATION_ELEM_HELP_MESSAGE: + pContext = new ScXMLHelpMessageContext( GetScImport(), nPrefix, rLName, xAttrList, this); + break; + case XML_TOK_CONTENT_VALIDATION_ELEM_ERROR_MESSAGE: + pContext = new ScXMLErrorMessageContext( GetScImport(), nPrefix, rLName, xAttrList, this); + break; + case XML_TOK_CONTENT_VALIDATION_ELEM_ERROR_MACRO: + pContext = new ScXMLErrorMacroContext( GetScImport(), nPrefix, rLName, xAttrList, this); + break; + case XML_TOK_CONTENT_VALIDATION_ELEM_EVENT_LISTENERS: + pContext = new XMLEventsImportContext( GetImport(), nPrefix, rLName ); + xEventContext = pContext; + break; + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLContentValidationContext::GetAlertStyle(const rtl::OUString& sMessageType, com::sun::star::sheet::ValidationAlertStyle& aAlertStyle) +{ + if (IsXMLToken(sMessageType, XML_MACRO)) + aAlertStyle = sheet::ValidationAlertStyle_MACRO; + else if (IsXMLToken(sMessageType, XML_STOP)) + aAlertStyle = sheet::ValidationAlertStyle_STOP; + else if (IsXMLToken(sMessageType, XML_WARNING)) + aAlertStyle = sheet::ValidationAlertStyle_WARNING; + else if (IsXMLToken(sMessageType, XML_INFORMATION)) + aAlertStyle = sheet::ValidationAlertStyle_INFO; + else // don't leave uninitialized + aAlertStyle = sheet::ValidationAlertStyle_STOP; +} + +void ScXMLContentValidationContext::SetFormulas(const rtl::OUString& sFormulas, rtl::OUString& sFormula1, rtl::OUString& sFormula2) const +{ + sal_Int32 i = 0; + sal_Bool bString = sal_False; + sal_Int32 nBrakes = 0; + while ((sFormulas[i] != ',' || nBrakes > 0 || bString) && i < sFormulas.getLength()) + { + if (sFormulas[i] == '(') + ++nBrakes; + if (sFormulas[i] == ')') + --nBrakes; + if (sFormulas[i] == '"') + bString = !bString; + ++i; + } + if (sFormulas[i] == ',') + { + sFormula1 = sFormulas.copy(0, i); + sFormula2 = sFormulas.copy(i + 1); + } +} + +void ScXMLContentValidationContext::GetCondition(const rtl::OUString& sTempCondition, rtl::OUString& sFormula1, rtl::OUString& sFormula2, + com::sun::star::sheet::ValidationType& aValidationType, + com::sun::star::sheet::ConditionOperator& aOperator) +{ + aValidationType = sheet::ValidationType_ANY; // #b6343997# default if no condition is given + aOperator = sheet::ConditionOperator_NONE; + + rtl::OUString sLocalCondition(sTempCondition); + if (sLocalCondition.getLength()) + { + // ToDo: erase all blanks in the condition, but not in formulas or strings + rtl::OUString scell_content(RTL_CONSTASCII_USTRINGPARAM("cell_content")); + rtl::OUString scell_content_is_date(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-date")); + rtl::OUString scell_content_is_time(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-time")); + rtl::OUString scell_content_is_between(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-between")); + rtl::OUString scell_content_is_in_list(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-in-list")); + rtl::OUString scell_content_text_length(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length")); + rtl::OUString scell_content_is_not_between(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-not-between")); + rtl::OUString scell_content_is_whole_number(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-whole-number")); + rtl::OUString scell_content_is_decimal_number(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-decimal-number")); + rtl::OUString scell_content_text_length_is_between(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length-is-between")); + rtl::OUString scell_content_text_length_is_not_between(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length-is-not-between")); + sal_Int32 i = 0; + sal_Bool bAnd(sal_True); + while (sLocalCondition[i] != '(' && i < sLocalCondition.getLength()) + ++i; + if (sLocalCondition[i] == '(') + { + if (i != scell_content_text_length.getLength() && + i != scell_content_text_length_is_between.getLength() && + i != scell_content_text_length_is_not_between.getLength() && + i != scell_content_is_in_list.getLength()) + { + if (i == scell_content_is_time.getLength()) + { + rtl::OUString sTemp = sLocalCondition.copy(0, i); + if (sTemp == scell_content_is_time) + aValidationType = sheet::ValidationType_TIME; + else + aValidationType = sheet::ValidationType_DATE; + } + else if (i == scell_content_is_whole_number.getLength()) + aValidationType = sheet::ValidationType_WHOLE; + else if (i == scell_content_is_decimal_number.getLength()) + aValidationType = sheet::ValidationType_DECIMAL; + sLocalCondition = sLocalCondition.copy(i + 2); + rtl::OUString sTemp = sLocalCondition.copy(0, 5); + if (sTemp.compareToAscii(" and ") == 0) + sLocalCondition = sLocalCondition.copy(5); + else + bAnd = sal_False; + } + if (sLocalCondition.getLength() && bAnd) + { + i = 0; + while (sLocalCondition[i] != '(' && i < sLocalCondition.getLength()) + ++i; + if (sLocalCondition[i] == '(') + { + rtl::OUString sTemp = sLocalCondition.copy(0, i); + sLocalCondition = sLocalCondition.copy(i + 1); + if (i == scell_content_is_between.getLength() || + i == scell_content_text_length_is_between.getLength()) + { + if (sTemp == scell_content_is_in_list) + { + aValidationType = sheet::ValidationType_LIST; + sFormula1 = sLocalCondition.copy(0, sLocalCondition.getLength() - 1); + aOperator = sheet::ConditionOperator_EQUAL; + } + else + { + if (i == scell_content_text_length_is_between.getLength()) + aValidationType = sheet::ValidationType_TEXT_LEN; + aOperator = sheet::ConditionOperator_BETWEEN; + sLocalCondition = sLocalCondition.copy(0, sLocalCondition.getLength() - 1); + SetFormulas(sLocalCondition, sFormula1, sFormula2); + } + } + else if (i == scell_content_is_not_between.getLength() || + i == scell_content_text_length_is_not_between.getLength()) + { + if (i == scell_content_text_length_is_not_between.getLength()) + aValidationType = sheet::ValidationType_TEXT_LEN; + aOperator = sheet::ConditionOperator_NOT_BETWEEN; + sLocalCondition = sLocalCondition.copy(0, sLocalCondition.getLength() - 1); + SetFormulas(sLocalCondition, sFormula1, sFormula2); + } + else if (i == scell_content.getLength() || + i == scell_content_text_length.getLength()) + { + if (i == scell_content_text_length.getLength()) + aValidationType = sheet::ValidationType_TEXT_LEN; + sLocalCondition = sLocalCondition.copy(1); + switch (sLocalCondition[0]) + { + case '<' : + { + if (sLocalCondition[1] == '=') + { + aOperator = sheet::ConditionOperator_LESS_EQUAL; + sLocalCondition = sLocalCondition.copy(2); + } + else + { + aOperator = sheet::ConditionOperator_LESS; + sLocalCondition = sLocalCondition.copy(1); + } + } + break; + case '>' : + { + if (sLocalCondition[1] == '=') + { + aOperator = sheet::ConditionOperator_GREATER_EQUAL; + sLocalCondition = sLocalCondition.copy(2); + } + else + { + aOperator = sheet::ConditionOperator_GREATER; + sLocalCondition = sLocalCondition.copy(1); + } + } + break; + case '=' : + { + aOperator = sheet::ConditionOperator_EQUAL; + sLocalCondition = sLocalCondition.copy(1); + } + break; + case '!' : + { + aOperator = sheet::ConditionOperator_NOT_EQUAL; + sLocalCondition = sLocalCondition.copy(1); + } + break; + } + sFormula1 = sLocalCondition; + } + } + } + } + } + + // a validation type (date, integer) without a condition isn't possible + if ( aOperator == sheet::ConditionOperator_NONE ) + aValidationType = sheet::ValidationType_ANY; +} + +void ScXMLContentValidationContext::EndElement() +{ + // #i36650# event-listeners element moved up one level + if (xEventContext.Is()) + { + rtl::OUString sOnError(RTL_CONSTASCII_USTRINGPARAM("OnError")); + XMLEventsImportContext* pEvents = + (XMLEventsImportContext*)&xEventContext; + uno::Sequence aValues; + pEvents->GetEventSequence( sOnError, aValues ); + + sal_Int32 nLength = aValues.getLength(); + for( sal_Int32 i = 0; i < nLength; i++ ) + { + // #i47525# must allow "MacroName" or "Script" + if ( aValues[i].Name.equalsAsciiL( "MacroName", sizeof("MacroName")-1 ) || + aValues[i].Name.equalsAsciiL( "Script", sizeof("Script")-1 ) ) + { + aValues[i].Value >>= sErrorTitle; + break; + } + } + } + + ScMyImportValidation aValidation; + aValidation.eGrammar = eGrammar; + aValidation.sName = sName; + aValidation.sBaseCellAddress = sBaseCellAddress; + aValidation.sImputTitle = sHelpTitle; + aValidation.sImputMessage = sHelpMessage; + aValidation.sErrorTitle = sErrorTitle; + aValidation.sErrorMessage = sErrorMessage; + GetCondition(sCondition, aValidation.sFormula1, aValidation.sFormula2, aValidation.aValidationType, aValidation.aOperator); + GetAlertStyle(sErrorMessageType, aValidation.aAlertStyle); + aValidation.bShowErrorMessage = bDisplayError; + aValidation.bShowImputMessage = bDisplayHelp; + aValidation.bIgnoreBlanks = bAllowEmptyCell; + aValidation.nShowList = nShowList; + GetScImport().AddValidation(aValidation); +} + +void ScXMLContentValidationContext::SetHelpMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, const sal_Bool bDisplay) +{ + sHelpTitle = sTitle; + sHelpMessage = sMessage; + bDisplayHelp = bDisplay; +} + +void ScXMLContentValidationContext::SetErrorMessage(const rtl::OUString& sTitle, const rtl::OUString& sMessage, + const rtl::OUString& sMessageType, const sal_Bool bDisplay) +{ + sErrorTitle = sTitle; + sErrorMessage = sMessage; + sErrorMessageType = sMessageType; + bDisplayError = bDisplay; +} + +void ScXMLContentValidationContext::SetErrorMacro(const sal_Bool bExecute) +{ + sErrorMessageType = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("macro")); + bDisplayError = bExecute; +} + +ScXMLHelpMessageContext::ScXMLHelpMessageContext( ScXMLImport& rImport, + USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLContentValidationContext* pTempValidationContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + sTitle(), + sMessage(), + nParagraphCount(0), + bDisplay(sal_False) +{ + pValidationContext = pTempValidationContext; + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationHelpMessageAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_HELP_MESSAGE_ATTR_TITLE: + sTitle = sValue; + break; + case XML_TOK_HELP_MESSAGE_ATTR_DISPLAY: + bDisplay = IsXMLToken(sValue, XML_TRUE); + break; + } + } +} + +ScXMLHelpMessageContext::~ScXMLHelpMessageContext() +{ +} + +SvXMLImportContext *ScXMLHelpMessageContext::CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationMessageElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + case XML_TOK_P: + { + if(nParagraphCount) + sMessage.append(static_cast('\n')); + ++nParagraphCount; + pContext = new ScXMLContentContext( GetScImport(), nPrefix, rLName, xAttrList, sMessage); + } + break; + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLHelpMessageContext::EndElement() +{ + pValidationContext->SetHelpMessage(sTitle, sMessage.makeStringAndClear(), bDisplay); +} + +ScXMLErrorMessageContext::ScXMLErrorMessageContext( ScXMLImport& rImport, + USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLContentValidationContext* pTempValidationContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + sTitle(), + sMessage(), + sMessageType(), + nParagraphCount(0), + bDisplay(sal_False) +{ + pValidationContext = pTempValidationContext; + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationErrorMessageAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_ERROR_MESSAGE_ATTR_TITLE: + sTitle = sValue; + break; + case XML_TOK_ERROR_MESSAGE_ATTR_MESSAGE_TYPE: + sMessageType = sValue; + break; + case XML_TOK_ERROR_MESSAGE_ATTR_DISPLAY: + bDisplay = IsXMLToken(sValue, XML_TRUE); + break; + } + } +} + +ScXMLErrorMessageContext::~ScXMLErrorMessageContext() +{ +} + +SvXMLImportContext *ScXMLErrorMessageContext::CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + const SvXMLTokenMap& rTokenMap = GetScImport().GetContentValidationMessageElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + case XML_TOK_P: + { + if(nParagraphCount) + sMessage.append(static_cast('\n')); + ++nParagraphCount; + pContext = new ScXMLContentContext( GetScImport(), nPrefix, rLName, xAttrList, sMessage); + } + break; + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLErrorMessageContext::EndElement() +{ + pValidationContext->SetErrorMessage(sTitle, sMessage.makeStringAndClear(), sMessageType, bDisplay); +} + +ScXMLErrorMacroContext::ScXMLErrorMacroContext( ScXMLImport& rImport, + USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + ScXMLContentValidationContext* pTempValidationContext) : + SvXMLImportContext( rImport, nPrfx, rLName ), + sName(), + bExecute(sal_False) +{ + pValidationContext = pTempValidationContext; + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetContentValidationErrorMacroAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_ERROR_MACRO_ATTR_NAME: + sName = sValue; + break; + case XML_TOK_ERROR_MACRO_ATTR_EXECUTE: + bExecute = IsXMLToken(sValue, XML_TRUE); + break; + } + } +} + +ScXMLErrorMacroContext::~ScXMLErrorMacroContext() +{ +} + +SvXMLImportContext *ScXMLErrorMacroContext::CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) +{ + SvXMLImportContext *pContext = NULL; + + if ((nPrefix == XML_NAMESPACE_SCRIPT) && IsXMLToken(rLName, XML_EVENTS)) + { + pContext = new XMLEventsImportContext(GetImport(), nPrefix, rLName); + } + if (!pContext) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLErrorMacroContext::EndElement() +{ + pValidationContext->SetErrorMacro( bExecute ); +} diff --git a/sc/source/filter/xml/xmlnexpi.cxx b/sc/source/filter/xml/xmlnexpi.cxx index 249522c1a9bc..3f822d5274c6 100644 --- a/sc/source/filter/xml/xmlnexpi.cxx +++ b/sc/source/filter/xml/xmlnexpi.cxx @@ -1,262 +1,262 @@ -/************************************************************************* - * - * 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: xmlnexpi.cxx,v $ - * $Revision: 1.18 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -// INCLUDE --------------------------------------------------------------- -#include - -#include "xmlnexpi.hxx" -#include "xmlimprt.hxx" -#include "xmlcelli.hxx" -#include "docuno.hxx" -#include "global.hxx" -#include "document.hxx" -#include "XMLConverter.hxx" - -#include -#include - -using namespace com::sun::star; - -//------------------------------------------------------------------ - -ScXMLNamedExpressionsContext::ScXMLNamedExpressionsContext( ScXMLImport& rImport, - USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) : - SvXMLImportContext( rImport, nPrfx, rLName ) -{ -/* sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; - for( sal_Int16 i=0; i < nAttrCount; ++i ) - { - const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); - rtl::OUString aLocalName; - USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( - sAttrName, &aLocalName ); - const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); - - const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetNamedRangeAttrTokenMap(); - - switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) - { - } - }*/ - rImport.LockSolarMutex(); -} - -ScXMLNamedExpressionsContext::~ScXMLNamedExpressionsContext() -{ - GetScImport().UnlockSolarMutex(); -} - -SvXMLImportContext *ScXMLNamedExpressionsContext::CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) -{ - SvXMLImportContext *pContext(0); - - const SvXMLTokenMap& rTokenMap(GetScImport().GetNamedExpressionsElemTokenMap()); - switch( rTokenMap.Get( nPrefix, rLName ) ) - { - case XML_TOK_NAMED_EXPRESSIONS_NAMED_RANGE: - pContext = new ScXMLNamedRangeContext( GetScImport(), nPrefix, - rLName, xAttrList//, - //this - ); - break; - case XML_TOK_NAMED_EXPRESSIONS_NAMED_EXPRESSION: - pContext = new ScXMLNamedExpressionContext( GetScImport(), nPrefix, - rLName, xAttrList//, - //this - ); - break; - } - - if( !pContext ) - pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); - - return pContext; -} - -void ScXMLNamedExpressionsContext::EndElement() -{ - // happends in ScXMLImport::EndDocument() - // because it has to be set after the Database Ranges -} - -ScXMLNamedRangeContext::ScXMLNamedRangeContext( ScXMLImport& rImport, - USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList) : - SvXMLImportContext( rImport, nPrfx, rLName ) -{ - ScMyNamedExpression* pNamedExpression(new ScMyNamedExpression); - // A simple table:cell-range-address is not a formula expression, stored - // without [] brackets but with dot, .A1 - pNamedExpression->eGrammar = formula::FormulaGrammar::mergeToGrammar( - GetScImport().GetDocument()->GetStorageGrammar(), - formula::FormulaGrammar::CONV_OOO); - sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0); - const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetNamedRangeAttrTokenMap(); - for( sal_Int16 i=0; i < nAttrCount; ++i ) - { - const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); - rtl::OUString aLocalName; - USHORT nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName( - sAttrName, &aLocalName )); - const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); - - switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) - { - case XML_TOK_NAMED_RANGE_ATTR_NAME : - { - pNamedExpression->sName = sValue; - } - break; - case XML_TOK_NAMED_RANGE_ATTR_CELL_RANGE_ADDRESS : - { - pNamedExpression->sContent = sValue; - } - break; - case XML_TOK_NAMED_RANGE_ATTR_BASE_CELL_ADDRESS : - { - pNamedExpression->sBaseCellAddress = sValue; - } - break; - case XML_TOK_NAMED_RANGE_ATTR_RANGE_USABLE_AS : - { - pNamedExpression->sRangeType = sValue; - } - break; - } - } - pNamedExpression->bIsExpression = sal_False; - GetScImport().AddNamedExpression(pNamedExpression); -} - -ScXMLNamedRangeContext::~ScXMLNamedRangeContext() -{ -} - -SvXMLImportContext *ScXMLNamedRangeContext::CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) -{ -/* const SvXMLTokenMap& rTokenMap = GetScImport().GetTableElemTokenMap(); - switch( rTokenMap.Get( nPrefix, rLName ) ) - { - }*/ - return new SvXMLImportContext( GetImport(), nPrefix, rLName ); -} - -void ScXMLNamedRangeContext::EndElement() -{ -} - -ScXMLNamedExpressionContext::ScXMLNamedExpressionContext( ScXMLImport& rImport, - USHORT nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList) : - SvXMLImportContext( rImport, nPrfx, rLName ) -{ - ScMyNamedExpression* pNamedExpression(new ScMyNamedExpression); - const formula::FormulaGrammar::Grammar eStorageGrammar = pNamedExpression->eGrammar = - GetScImport().GetDocument()->GetStorageGrammar(); - sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0); - const SvXMLTokenMap& rAttrTokenMap(GetScImport().GetNamedExpressionAttrTokenMap()); - for( sal_Int16 i=0; i < nAttrCount; ++i ) - { - const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); - rtl::OUString aLocalName; - USHORT nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName( - sAttrName, &aLocalName )); - const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); - - switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) - { - case XML_TOK_NAMED_EXPRESSION_ATTR_NAME : - { - pNamedExpression->sName = sValue; - } - break; - case XML_TOK_NAMED_EXPRESSION_ATTR_EXPRESSION : - { - rtl::OUString sFormula; - sal_uInt16 nFormulaPrefix = GetImport().GetNamespaceMap(). - _GetKeyByAttrName( sValue, &sFormula, sal_False ); - - if (ScXMLImport::IsAcceptedFormulaNamespace( nFormulaPrefix, - sValue, pNamedExpression->eGrammar, - eStorageGrammar)) - pNamedExpression->sContent = sFormula; - else - pNamedExpression->sContent = sValue; - } - break; - case XML_TOK_NAMED_EXPRESSION_ATTR_BASE_CELL_ADDRESS : - { - pNamedExpression->sBaseCellAddress = sValue; - } - break; - } - } - pNamedExpression->bIsExpression = sal_True; - GetScImport().AddNamedExpression(pNamedExpression); -} - -ScXMLNamedExpressionContext::~ScXMLNamedExpressionContext() -{ -} - -SvXMLImportContext *ScXMLNamedExpressionContext::CreateChildContext( USHORT nPrefix, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) -{ -/* const SvXMLTokenMap& rTokenMap = GetScImport().GetTableElemTokenMap(); - switch( rTokenMap.Get( nPrefix, rLName ) ) - { - }*/ - return new SvXMLImportContext( GetImport(), nPrefix, rLName );; -} - -void ScXMLNamedExpressionContext::EndElement() -{ -} - +/************************************************************************* + * + * 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: xmlnexpi.cxx,v $ + * $Revision: 1.18 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + + +// INCLUDE --------------------------------------------------------------- +#include + +#include "xmlnexpi.hxx" +#include "xmlimprt.hxx" +#include "xmlcelli.hxx" +#include "docuno.hxx" +#include "global.hxx" +#include "document.hxx" +#include "XMLConverter.hxx" + +#include +#include + +using namespace com::sun::star; + +//------------------------------------------------------------------ + +ScXMLNamedExpressionsContext::ScXMLNamedExpressionsContext( ScXMLImport& rImport, + USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) : + SvXMLImportContext( rImport, nPrfx, rLName ) +{ +/* sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetNamedRangeAttrTokenMap(); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + } + }*/ + rImport.LockSolarMutex(); +} + +ScXMLNamedExpressionsContext::~ScXMLNamedExpressionsContext() +{ + GetScImport().UnlockSolarMutex(); +} + +SvXMLImportContext *ScXMLNamedExpressionsContext::CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext(0); + + const SvXMLTokenMap& rTokenMap(GetScImport().GetNamedExpressionsElemTokenMap()); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + case XML_TOK_NAMED_EXPRESSIONS_NAMED_RANGE: + pContext = new ScXMLNamedRangeContext( GetScImport(), nPrefix, + rLName, xAttrList//, + //this + ); + break; + case XML_TOK_NAMED_EXPRESSIONS_NAMED_EXPRESSION: + pContext = new ScXMLNamedExpressionContext( GetScImport(), nPrefix, + rLName, xAttrList//, + //this + ); + break; + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLNamedExpressionsContext::EndElement() +{ + // happends in ScXMLImport::EndDocument() + // because it has to be set after the Database Ranges +} + +ScXMLNamedRangeContext::ScXMLNamedRangeContext( ScXMLImport& rImport, + USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList) : + SvXMLImportContext( rImport, nPrfx, rLName ) +{ + ScMyNamedExpression* pNamedExpression(new ScMyNamedExpression); + // A simple table:cell-range-address is not a formula expression, stored + // without [] brackets but with dot, .A1 + pNamedExpression->eGrammar = formula::FormulaGrammar::mergeToGrammar( + GetScImport().GetDocument()->GetStorageGrammar(), + formula::FormulaGrammar::CONV_OOO); + sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0); + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetNamedRangeAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + USHORT nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName )); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_NAMED_RANGE_ATTR_NAME : + { + pNamedExpression->sName = sValue; + } + break; + case XML_TOK_NAMED_RANGE_ATTR_CELL_RANGE_ADDRESS : + { + pNamedExpression->sContent = sValue; + } + break; + case XML_TOK_NAMED_RANGE_ATTR_BASE_CELL_ADDRESS : + { + pNamedExpression->sBaseCellAddress = sValue; + } + break; + case XML_TOK_NAMED_RANGE_ATTR_RANGE_USABLE_AS : + { + pNamedExpression->sRangeType = sValue; + } + break; + } + } + pNamedExpression->bIsExpression = sal_False; + GetScImport().AddNamedExpression(pNamedExpression); +} + +ScXMLNamedRangeContext::~ScXMLNamedRangeContext() +{ +} + +SvXMLImportContext *ScXMLNamedRangeContext::CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) +{ +/* const SvXMLTokenMap& rTokenMap = GetScImport().GetTableElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + }*/ + return new SvXMLImportContext( GetImport(), nPrefix, rLName ); +} + +void ScXMLNamedRangeContext::EndElement() +{ +} + +ScXMLNamedExpressionContext::ScXMLNamedExpressionContext( ScXMLImport& rImport, + USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList) : + SvXMLImportContext( rImport, nPrfx, rLName ) +{ + ScMyNamedExpression* pNamedExpression(new ScMyNamedExpression); + const formula::FormulaGrammar::Grammar eStorageGrammar = pNamedExpression->eGrammar = + GetScImport().GetDocument()->GetStorageGrammar(); + sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0); + const SvXMLTokenMap& rAttrTokenMap(GetScImport().GetNamedExpressionAttrTokenMap()); + for( sal_Int16 i=0; i < nAttrCount; ++i ) + { + const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i )); + rtl::OUString aLocalName; + USHORT nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName )); + const rtl::OUString& sValue(xAttrList->getValueByIndex( i )); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_NAMED_EXPRESSION_ATTR_NAME : + { + pNamedExpression->sName = sValue; + } + break; + case XML_TOK_NAMED_EXPRESSION_ATTR_EXPRESSION : + { + rtl::OUString sFormula; + sal_uInt16 nFormulaPrefix = GetImport().GetNamespaceMap(). + _GetKeyByAttrName( sValue, &sFormula, sal_False ); + + if (ScXMLImport::IsAcceptedFormulaNamespace( nFormulaPrefix, + sValue, pNamedExpression->eGrammar, + eStorageGrammar)) + pNamedExpression->sContent = sFormula; + else + pNamedExpression->sContent = sValue; + } + break; + case XML_TOK_NAMED_EXPRESSION_ATTR_BASE_CELL_ADDRESS : + { + pNamedExpression->sBaseCellAddress = sValue; + } + break; + } + } + pNamedExpression->bIsExpression = sal_True; + GetScImport().AddNamedExpression(pNamedExpression); +} + +ScXMLNamedExpressionContext::~ScXMLNamedExpressionContext() +{ +} + +SvXMLImportContext *ScXMLNamedExpressionContext::CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ ) +{ +/* const SvXMLTokenMap& rTokenMap = GetScImport().GetTableElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + }*/ + return new SvXMLImportContext( GetImport(), nPrefix, rLName );; +} + +void ScXMLNamedExpressionContext::EndElement() +{ +} + diff --git a/sc/source/ui/formdlg/dwfunctr.cxx b/sc/source/ui/formdlg/dwfunctr.cxx index 787932f59c53..feda9d1657f1 100644 --- a/sc/source/ui/formdlg/dwfunctr.cxx +++ b/sc/source/ui/formdlg/dwfunctr.cxx @@ -1,1185 +1,1185 @@ -/************************************************************************* - * - * 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: dwfunctr.cxx,v $ - * $Revision: 1.15 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -// INCLUDE --------------------------------------------------------------- - -#include -#include -#include -#include -#include - -#include "sc.hrc" -#include "global.hxx" // ScAddress -#include "scresid.hxx" -#include "reffact.hxx" -#include "document.hxx" -#include "cell.hxx" -#include "scmod.hxx" -#include "inputhdl.hxx" -#include "tabvwsh.hxx" -#include "appoptio.hxx" -#include "compiler.hxx" - -#include "dwfunctr.hrc" -#include "dwfunctr.hxx" - -// ----------------------------------------------------------------------- - -#define ARG_SEPERATOR String("; ") -SFX_IMPL_DOCKINGWINDOW( ScFunctionChildWindow, FID_FUNCTION_BOX ) - -/************************************************************************* -#* Member: ScFunctionChildWindow Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionChildWindow -#* -#* Funktion: Konstruktor der Klasse ScFunctionChildWindow -#* Ableitung vom SfxChildWindow als "Behaelter" fuer -#* Funktions- Fenster in Clac -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -__EXPORT ScFunctionChildWindow::ScFunctionChildWindow( Window* pParentP, - USHORT nId, - SfxBindings* pBindings, - SfxChildWinInfo* pInfo ) : - SfxChildWindow( pParentP, nId ) -{ - ScFunctionDockWin* pWin = new ScFunctionDockWin( pBindings, this, - pParentP, ScResId( FID_FUNCTION_BOX ) ); - pWindow = pWin; - - eChildAlignment = SFX_ALIGN_RIGHT; - - pWin->Initialize( pInfo ); -} - -/************************************************************************* -#* Member: ScFunctionDockWin Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Konstruktor der Klasse ScFunctionDockWin -#* -#* Input: Sfx- Verknuepfungen, Fenster, Resource -#* -#* Output: --- -#* -#************************************************************************/ - -ScFunctionDockWin::ScFunctionDockWin( SfxBindings* pBindingsP, - SfxChildWindow *pCW, Window* pParent, const ResId& rResId ) : - - SfxDockingWindow( pBindingsP, pCW, pParent, rResId ), - aPrivatSplit ( this, ResId( FT_SPLIT, *rResId.GetResMgr() ),SC_SPLIT_VERT), - aCatBox ( this, ResId( CB_CAT, *rResId.GetResMgr() ) ), - aFuncList ( this, ResId( LB_FUNC, *rResId.GetResMgr() ) ), - aDDFuncList ( this, ResId( DDLB_FUNC, *rResId.GetResMgr() ) ), - aInsertButton ( this, ResId( IMB_INSERT, *rResId.GetResMgr() ) ), - aFiFuncDesc ( this, ResId( FI_FUNCDESC, *rResId.GetResMgr() ) ), - aOldSize (0,0) -{ - FreeResource(); - InitLRUList(); - SetStyle(GetStyle()|WB_CLIPCHILDREN); - - aTimer.SetTimeout(200); - aTimer.SetTimeoutHdl(LINK( this, ScFunctionDockWin, TimerHdl)); - - eSfxNewAlignment=GetAlignment(); - eSfxOldAlignment=eSfxNewAlignment; - aFiFuncDesc.SetUpdateMode(TRUE); - pAllFuncList=&aFuncList; - aDDFuncList.Disable(); - aDDFuncList.Hide(); - nArgs=0; - nDockMode=0; - bSizeFlag=FALSE; - aCatBox.SetDropDownLineCount(9); - Font aFont=aFiFuncDesc.GetFont(); - aFont.SetColor(Color(COL_BLACK)); - aFiFuncDesc.SetFont(aFont); - aFiFuncDesc.SetBackground( GetBackground() ); //! never transparent? -//? SetBackground(); - - Link aLink=LINK( this, ScFunctionDockWin, SelHdl); - aCatBox.SetSelectHdl(aLink); - aFuncList.SetSelectHdl(aLink); - aDDFuncList.SetSelectHdl(aLink); - - Link a2Link=LINK( this, ScFunctionDockWin, SetSelectionHdl); - aFuncList.SetDoubleClickHdl(a2Link); - aDDFuncList.SetSelectHdl(aLink); - aInsertButton.SetClickHdl(a2Link); - - Link a3Link=LINK( this, ScFunctionDockWin, SetSplitHdl); - aPrivatSplit.SetCtrModifiedHdl(a3Link); - StartListening( *pBindingsP, TRUE ); - - Point aTopLeft=aCatBox.GetPosPixel(); - //String aString=aCatBox.GetEntry( 0)+String("www"); - String aString=String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww")); - Size aTxtSize( aFiFuncDesc.GetTextWidth(aString), aFiFuncDesc.GetTextHeight() ); - nMinWidth=aTxtSize.Width()+aTopLeft.X() - +2*aFuncList.GetPosPixel().X(); - nMinHeight=19*aTxtSize.Height(); - aCatBox.SelectEntryPos(0); - - Range aYRange(3*aTxtSize.Height()+aFuncList.GetPosPixel().Y(), - GetOutputSizePixel().Height()-2*aTxtSize.Height()); - aPrivatSplit.SetYRange(aYRange); - SelHdl(&aCatBox); - bInit=TRUE; -} - -/************************************************************************* -#* Member: ScFunctionDockWin Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Destruktor der Klasse ScFunctionDockWin -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -__EXPORT ScFunctionDockWin::~ScFunctionDockWin() -{ - EndListening( GetBindings() ); -} - -/************************************************************************* -#* Member: UpdateFunctionList Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Aktualisiert die Liste der Funktionen ab- -#* haengig von der eingestellten Kategorie. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -void ScFunctionDockWin::InitLRUList() -{ - const ScAppOptions& rAppOpt = SC_MOD()->GetAppOptions(); - USHORT nLRUFuncCount = Min( rAppOpt.GetLRUFuncListCount(), (USHORT)LRU_MAX ); - USHORT* pLRUListIds = rAppOpt.GetLRUFuncList(); - - USHORT i; - for ( i=0; iGet( pLRUListIds[i] ); - } - - USHORT nSelPos = aCatBox.GetSelectEntryPos(); - - if(nSelPos == 0) - UpdateFunctionList(); -} - -/************************************************************************* -#* Member: UpdateFunctionList Datum:10.12.99 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Aktualisiert die Liste der zuletzt verwendeten Funktionen. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -void ScFunctionDockWin::UpdateLRUList() -{ - if (pFuncDesc && pFuncDesc->nFIndex!=0) - { - ScModule* pScMod = SC_MOD(); - pScMod->InsertEntryToLRUList(pFuncDesc->nFIndex); - } -} - - -/************************************************************************* -#* Member: SetSize Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Groesse fuer die einzelnen Controls einzustellen. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -void ScFunctionDockWin::SetSize() -{ - USHORT nSelEntry=0; - SfxChildAlignment aChildAlign=eSfxOldAlignment;//GetAlignment(); - short nNewDockMode; - switch(aChildAlign) - { - case SFX_ALIGN_HIGHESTTOP: - case SFX_ALIGN_TOP: - case SFX_ALIGN_LOWESTTOP: - case SFX_ALIGN_LOWESTBOTTOM: - case SFX_ALIGN_BOTTOM: - case SFX_ALIGN_TOOLBOXTOP: - case SFX_ALIGN_TOOLBOXBOTTOM: - - - nNewDockMode=1; - if(nDockMode!=nNewDockMode) - { - nDockMode=nNewDockMode; - nSelEntry=aFuncList.GetSelectEntryPos(); - aFuncList.Clear(); - aFiFuncDesc.SetPosPixel(aFuncList.GetPosPixel()); - aDDFuncList.Enable(); - aDDFuncList.Show(); - aPrivatSplit.Disable(); - aPrivatSplit.Hide(); - aFuncList.Disable(); - aFuncList.Hide(); - pAllFuncList=&aDDFuncList; - SelHdl(&aCatBox); - aDDFuncList.SelectEntryPos(nSelEntry); - } - break; - - default: nNewDockMode=0; - if(nDockMode!=nNewDockMode) - { - nDockMode=nNewDockMode; - nSelEntry=aDDFuncList.GetSelectEntryPos(); - aDDFuncList.Clear(); - aDDFuncList.Disable(); - aDDFuncList.Hide(); - aPrivatSplit.Enable(); - aPrivatSplit.Show(); - aFuncList.Enable(); - aFuncList.Show(); - pAllFuncList=&aFuncList; - SelHdl(&aCatBox); - aFuncList.SelectEntryPos(nSelEntry); - } - break; - } - - if(nDockMode==0) - { - SetLeftRightSize(); - } - else - { - SetTopBottonSize(); - } -} -/************************************************************************* -#* Member: SetLeftRightSize Datum:15.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Groesse fuer die einzelnen Controls einstellen, -#* wenn Links oder Rechts angedockt wird. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -void ScFunctionDockWin::SetLeftRightSize() -{ - if(bSizeFlag==FALSE) - { - bSizeFlag=TRUE; - - Size aDiffSize=GetSizePixel(); - Size aNewSize=GetOutputSizePixel(); - aDiffSize.Width()-=aNewSize.Width(); - aDiffSize.Height()-=aNewSize.Height(); - - //@ SetUpdateMode( FALSE); - - String aString = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww")); - - Size aTxtSize( aFuncList.GetTextWidth(aString), aFuncList.GetTextHeight() ); - - Range aYRange(3*aTxtSize.Height()+aFuncList.GetPosPixel().Y(), - GetOutputSizePixel().Height()-2*aTxtSize.Height()); - aPrivatSplit.SetYRange(aYRange); - - - if(aOldSize.Width()!=aNewSize.Width()) - SetMyWidthLeRi(aNewSize); - - if(aOldSize.Height()!=aNewSize.Height()) - SetMyHeightLeRi(aNewSize); - - aOldSize=aNewSize; - aNewSize.Width()+=aDiffSize.Width(); - aNewSize.Height()+=aDiffSize.Height(); - //SetSizePixel(aNewSize); - //@ SetUpdateMode( TRUE); - bSizeFlag=FALSE; - } - -} -/************************************************************************* -#* Member: SetTopBottonSize Datum:15.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Groesse fuer die einzelnen Controls einzustellen. -#* wenn oben oder unten angedockt wird. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -void ScFunctionDockWin::SetTopBottonSize() -{ - if(bSizeFlag==FALSE) - { - bSizeFlag=TRUE; - Size aDiffSize=GetSizePixel(); - Size aNewSize=GetOutputSizePixel(); - aDiffSize.Width()-=aNewSize.Width(); - aDiffSize.Height()-=aNewSize.Height(); - - SetMyWidthToBo(aNewSize); - SetMyHeightToBo(aNewSize); - - aNewSize.Width()+=aDiffSize.Width(); - aNewSize.Height()+=aDiffSize.Height(); - //SetSizePixel(aNewSize); - //@ SetUpdateMode( TRUE); - bSizeFlag=FALSE; - } -} - -/************************************************************************* -#* Member: SetMyWidthLeRi Datum:15.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Breite fuer die einzelnen Controls und -#* das Fenster einstellen,wenn Li oder Re -#* -#* Input: neue Fenstergroesse -#* -#* Output: --- -#* -#************************************************************************/ - -void ScFunctionDockWin::SetMyWidthLeRi(Size &aNewSize) -{ - if((ULONG)aNewSize.Width()aFDTopLeft.Y()) - { - aFDSize.Height()-=nY-aFDTopLeft.Y(); - aFDTopLeft.Y()=nY; - } - aSplitterTopLeft.Y()=aFDTopLeft.Y()-aSplitterSize.Height()-1; - aFLSize.Height()=aSplitterTopLeft.Y()-aFLTopLeft.Y()-1; - - aFuncList.SetSizePixel(aFLSize); - aPrivatSplit.SetPosPixel(aSplitterTopLeft); - aFiFuncDesc.SetPosPixel(aFDTopLeft); - aFiFuncDesc.SetSizePixel(aFDSize); - -} - -/************************************************************************* -#* Member: SetMyWidthToBo Datum:16.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Breite fuer die einzelnen Controls und -#* das Fenster einstellen, wenn oben oder -#* unten angedockt werden soll. -#* -#* Input: neue Fenstergroesse -#* -#* Output: --- -#* -#************************************************************************/ - -void ScFunctionDockWin::SetMyWidthToBo(Size &aNewSize) -{ - if((ULONG)aNewSize.Width()GetEntryData( - pAllFuncList->GetSelectEntryPos() ); - if (pDesc) - { - pDesc->initArgumentInfo(); // full argument info is needed - - String aString=pAllFuncList->GetSelectEntry(); - if(nDockMode==0) - { - aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ":\n\n" )); - } - else - { - aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ": " )); - } - - aString+=pDesc->GetParamList(); - - if(nDockMode==0) - { - aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "\n\n" )); - } - else - { - aString += '\n'; - } - - aString+=*(pDesc->pFuncDesc); - - aFiFuncDesc.SetText(aString); - aFiFuncDesc.StateChanged(STATE_CHANGE_TEXT); - aFiFuncDesc.Invalidate(); - aFiFuncDesc.Update(); - - } - } - -/************************************************************************* -#* Member: Resizing Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Ueberladene Funktion um die Groesse der -#* einzelnen Controls einzustellen. -#* -#* Input: neue Groesse -#* -#* Output: --- -#* -#************************************************************************/ - -void __EXPORT ScFunctionDockWin::Resizing( Size& rNewSize ) -{ - if((ULONG)rNewSize.Width()Execute( FID_FUNCTION_BOX, - SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, - &aItem, 0L ); - - SfxDockingWindow::Close(); - - return( TRUE ); -} - - -/************************************************************************* -#* Member: CheckAlignment Datum:16.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Ueberprueft den Andockmodus und stellt die -#* Groessen dementsprechend ein. -#* -#* Input: Das neue Alignment -#* -#* Output: Das uebergebene Alignment -#* -#************************************************************************/ -SfxChildAlignment __EXPORT ScFunctionDockWin::CheckAlignment(SfxChildAlignment /* abla */, - SfxChildAlignment aChildAlign) -{ - String aString = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww")); - Size aTxtSize( aFiFuncDesc.GetTextWidth(aString), aFiFuncDesc.GetTextHeight() ); - if(!bInit) - { - eSfxOldAlignment=eSfxNewAlignment; - eSfxNewAlignment=aChildAlign; - } - else - { - bInit=FALSE; - eSfxOldAlignment=aChildAlign; - eSfxNewAlignment=aChildAlign; - } - - switch(eSfxOldAlignment) - { - case SFX_ALIGN_HIGHESTTOP: - case SFX_ALIGN_TOP: - case SFX_ALIGN_LOWESTTOP: - case SFX_ALIGN_LOWESTBOTTOM: - case SFX_ALIGN_BOTTOM: - case SFX_ALIGN_TOOLBOXTOP: - case SFX_ALIGN_TOOLBOXBOTTOM: - - nMinWidth= 0;/*aDDFuncList.GetPosPixel().X()+ - 10*aTxtSize.Width()+ - aFuncList.GetPosPixel().X();*/ - nMinHeight=0; - - break; - - case SFX_ALIGN_NOALIGNMENT: - - aString = aCatBox.GetEntry(0); - aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM("www")); - aTxtSize = Size( aFiFuncDesc.GetTextWidth(aString), - aFiFuncDesc.GetTextHeight() ); - - default: Point aTopLeft=aCatBox.GetPosPixel(); - nMinWidth=aTxtSize.Width()+aTopLeft.X() - +2*aFuncList.GetPosPixel().X(); - nMinHeight=19*aTxtSize.Height(); - //aCatBox.SelectEntryPos(0); - - break; - } - - return aChildAlign; -} -/************************************************************************* -#* Member: Close Datum:07.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Aenderungen erkennen -#* -#* Input: --- -#* -#* Output: TRUE -#* -#************************************************************************/ -void ScFunctionDockWin::Notify( SfxBroadcaster&, const SfxHint& /* rHint */ ) -{ -// const SfxPoolItemHint *pPoolItemHint = PTR_CAST(SfxPoolItemHint, &rHint); - /* - if ( pPoolItemHint - && ( pPoolItemHint->GetObject()->ISA( SvxColorTableItem ) ) ) - { - // Die Liste der Farben hat sich geaendert - pColorTable = ( (SvxColorTableItem*) pPoolItemHint->GetObject() )->GetColorTable(); - FillValueSet(); - } - */ -} - - -/************************************************************************* -#* Member: Resize Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Ueberladene Funktion um die Groesse der -#* einzelnen Controls einzustellen. -#* -#* Input: neue Groesse -#* -#* Output: --- -#* -#************************************************************************/ - -void __EXPORT ScFunctionDockWin::Resize() -{ - if ( !IsFloatingMode() || - !GetFloatingWindow()->IsRollUp() ) - { - Size aQSize=GetOutputSizePixel(); - Resizing( aQSize); - SetSize(); - } - SfxDockingWindow::Resize(); -} - -/************************************************************************* -#* Member: UpdateFunctionList Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Aktualisiert die Liste der Funktionen ab- -#* haengig von der eingestellten Kategorie. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -void ScFunctionDockWin::UpdateFunctionList() -{ - USHORT nSelPos = aCatBox.GetSelectEntryPos(); - USHORT nCategory = ( LISTBOX_ENTRY_NOTFOUND != nSelPos ) - ? (nSelPos-1) : 0; - - pAllFuncList->Clear(); - pAllFuncList->SetUpdateMode( FALSE ); - - if ( nSelPos > 0 ) - { - ScFunctionMgr* pFuncMgr = ScGlobal::GetStarCalcFunctionMgr(); - - const ScFuncDesc* pDesc = pFuncMgr->First( nCategory ); - while ( pDesc ) - { - pAllFuncList->SetEntryData( - pAllFuncList->InsertEntry( *(pDesc->pFuncName) ), - (void*)pDesc ); - pDesc = pFuncMgr->Next(); - } - } - else // LRU-Liste - { - for ( USHORT i=0; iSetEntryData( - pAllFuncList->InsertEntry( *(pDesc->pFuncName) ), - (void*)pDesc ); - } - } - - - //------------------------------------------------------ - pAllFuncList->SetUpdateMode( TRUE ); - - if ( pAllFuncList->GetEntryCount() > 0 ) - { - pAllFuncList->Enable(); - pAllFuncList->SelectEntryPos( 0 ); - } - else - { - pAllFuncList->Disable(); - } -} - -/************************************************************************* -#* Member: DoEnter Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Eingabe ins Dokument uebernehmen. Wird aufgerufen -#* nach betaetigen der Uebernehmen- Schaltflaeche -#* oder einem Doppelklick in die Funktionsliste. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -void ScFunctionDockWin::DoEnter(BOOL /* bOk */) //@@ ??? -{ - String aFirstArgStr; - String aParaStr; - String aArgStr; - String aString=pAllFuncList->GetSelectEntry(); - SfxViewShell* pCurSh = SfxViewShell::Current(); - nArgs=0; - - if(aString.Len()>0) - { - - ScModule* pScMod = SC_MOD(); - ScTabViewShell* pViewSh = PTR_CAST( ScTabViewShell, pCurSh); - ScInputHandler* pHdl = pScMod->GetInputHdl( pViewSh ); - if(!pScMod->IsEditMode()) - { - pScMod->SetInputMode(SC_INPUT_TABLE); - aString = '='; - aString += pAllFuncList->GetSelectEntry(); - if (pHdl) - pHdl->ClearText(); - } - const ScFuncDesc* pDesc = - (const ScFuncDesc*)pAllFuncList->GetEntryData( - pAllFuncList->GetSelectEntryPos() ); - if (pDesc) - { - pFuncDesc=pDesc; - UpdateLRUList(); - nArgs = pDesc->nArgCount; - if(nArgs>0) - { - // NOTE: Theoretically the first parameter could have the - // suppress flag as well, but practically it doesn't. - aFirstArgStr = *(pDesc->ppDefArgNames[0]); - aFirstArgStr.EraseLeadingAndTrailingChars(); - aFirstArgStr.SearchAndReplaceAll(' ', '_'); - aArgStr = aFirstArgStr; - if ( nArgs != VAR_ARGS ) - { // no VarArgs or Fix plus VarArgs, but not VarArgs only - String aArgSep = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( "; " )); - USHORT nFix = ( nArgs < VAR_ARGS ? nArgs : nArgs - VAR_ARGS + 1 ); - for ( USHORT nArg = 1; - nArg < nFix && !pDesc->pDefArgFlags[nArg].bOptional; nArg++ ) - { - if (!pDesc->pDefArgFlags[nArg].bSuppress) - { - aArgStr += aArgSep; - String sTmp(*(pDesc->ppDefArgNames[nArg])); - sTmp.EraseLeadingAndTrailingChars(); - sTmp.SearchAndReplaceAll(' ', '_'); - aArgStr += sTmp; - } - } - } - } - } - if (pHdl) - { - if(pHdl->GetEditString().Len()==0) - { - aString = '='; - aString += pAllFuncList->GetSelectEntry(); - } - EditView *pEdView=pHdl->GetActiveView(); - if(pEdView!=NULL) // @ Wegen Absturz bei Namen festlegen - { - if(nArgs>0) - { - pHdl->InsertFunction(aString); - pEdView->InsertText(aArgStr,TRUE); - ESelection aESel=pEdView->GetSelection(); - aESel.nEndPos=aESel.nStartPos+aFirstArgStr.Len(); - pEdView->SetSelection(aESel); - pHdl->DataChanged(); - } - else - { - aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "()" )); - pEdView->InsertText(aString,FALSE); - pHdl->DataChanged(); - } - } - } - InitLRUList(); - } - if ( pCurSh ) - { - Window* pShellWnd = pCurSh->GetWindow(); - - if ( pShellWnd ) - pShellWnd->GrabFocus(); - } - - -} - - - -/************************************************************************* -#* Handle: SelHdl Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Bei einer Aenderung der Kategorie wird die -#* die Liste der Funktionen aktualisiert. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScFunctionDockWin, SelHdl, ListBox*, pLb ) -{ - if ( pLb == &aCatBox) - { - UpdateFunctionList(); - SetDescription(); - } - - if ( pLb == &aFuncList||pLb == &aDDFuncList) - { - SetDescription(); - } - - - //SetSize(); - return 0; -} - -/************************************************************************* -#* Handle: SelHdl Datum:06.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Bei einer Aenderung der Kategorie wird die -#* die Liste der Funktionen aktualisiert. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScFunctionDockWin, SetSelectionHdl, void*, pCtrl ) -{ - if ((ImageButton *)pCtrl == &aInsertButton || - (ListBox *)pCtrl == &aFuncList) - { - DoEnter(TRUE); // Uebernimmt die Eingabe - } - //... - - return 0; -} - -/************************************************************************* -#* Handle: SetSplitHdl Datum:13.10.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScFunctionDockWin -#* -#* Funktion: Bei einer Aenderung des Split- Controls werden die -#* einzelnen Controls an die neue Groesse angepasst. -#* -#* Input: Zeiger auf Control -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScFunctionDockWin, SetSplitHdl, ScPrivatSplit*, pCtrl ) -{ - if (pCtrl == &aPrivatSplit) - { - short nDeltaY=aPrivatSplit.GetDeltaY(); - Size aFLSize=aFuncList.GetSizePixel(); - Size aFDSize=aFiFuncDesc.GetSizePixel(); - Point aFDTopLeft=aFiFuncDesc.GetPosPixel(); - - aFLSize.Height()+=nDeltaY; - aFDSize.Height()-=nDeltaY; - aFDTopLeft.Y()+=nDeltaY; - aFuncList.SetSizePixel(aFLSize); - aFiFuncDesc.SetPosPixel(aFDTopLeft); - aFiFuncDesc.SetSizePixel(aFDSize); - /* - aFuncList.Invalidate(); - aFuncList.Update(); - aFiFuncDesc.Invalidate(); - aFiFuncDesc.Update(); - */ - } - //... - - return 0; -} - -void ScFunctionDockWin::ToggleFloatingMode() -{ - aSplitterInitPos = Point(); - SfxDockingWindow::ToggleFloatingMode(); - - eSfxNewAlignment=GetAlignment(); - eSfxOldAlignment=eSfxNewAlignment; - - aOldSize.Height()=0; - aOldSize.Width()=0; - aTimer.Start(); -} - -IMPL_LINK( ScFunctionDockWin, TimerHdl, Timer*, EMPTYARG ) -{ - CheckAlignment(eSfxOldAlignment,eSfxNewAlignment); - SetSize(); - return 0; -} - -void ScFunctionDockWin::Initialize(SfxChildWinInfo *pInfo) -{ - String aStr; - if(pInfo!=NULL) - { - if ( pInfo->aExtraString.Len() ) - { - xub_StrLen nPos = pInfo->aExtraString.Search( - String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ScFuncList:"))); - - // Versuche, den Alignment-String "ALIGN:(...)" einzulesen; wenn - // er nicht vorhanden ist, liegt eine "altere Version vor - if ( nPos != STRING_NOTFOUND ) - { - xub_StrLen n1 = pInfo->aExtraString.Search('(', nPos); - if ( n1 != STRING_NOTFOUND ) - { - xub_StrLen n2 = pInfo->aExtraString.Search(')', n1); - if ( n2 != STRING_NOTFOUND ) - { - // Alignment-String herausschneiden - aStr = pInfo->aExtraString.Copy(nPos, n2 - nPos + 1); - pInfo->aExtraString.Erase(nPos, n2 - nPos + 1); - aStr.Erase(0, n1-nPos+1); - } - } - } - } - } - SfxDockingWindow::Initialize(pInfo); - - if ( aStr.Len()) - { - aSplitterInitPos=aPrivatSplit.GetPosPixel(); - aSplitterInitPos.Y()=(USHORT) aStr.ToInt32(); - xub_StrLen n1 = aStr.Search(';'); - aStr.Erase(0, n1+1); - USHORT nSelPos=sal::static_int_cast( aStr.ToInt32() ); - aCatBox.SelectEntryPos(nSelPos); - SelHdl(&aCatBox); - - // if the window has already been shown (from SfxDockingWindow::Initialize if docked), - // set the splitter position now, otherwise it is set in StateChanged with type INITSHOW - - UseSplitterInitPos(); - } -} - -//------------------------------------------------------------------------- - -void ScFunctionDockWin::FillInfo(SfxChildWinInfo& rInfo) const -{ - SfxDockingWindow::FillInfo(rInfo); - Point aPoint=aPrivatSplit.GetPosPixel(); - rInfo.aExtraString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "ScFuncList:(" )); - rInfo.aExtraString += String::CreateFromInt32(aPoint.Y()); - rInfo.aExtraString += ';'; - rInfo.aExtraString += String::CreateFromInt32(aCatBox.GetSelectEntryPos()); - rInfo.aExtraString += ')'; -} - -void ScFunctionDockWin::UseSplitterInitPos() -{ - if ( IsVisible() && aPrivatSplit.IsEnabled() && aSplitterInitPos != Point() ) - { - aPrivatSplit.MoveSplitTo(aSplitterInitPos); - aSplitterInitPos = Point(); // use only once - } -} - -void ScFunctionDockWin::StateChanged( StateChangedType nStateChange ) -{ - SfxDockingWindow::StateChanged( nStateChange ); - - if (nStateChange == STATE_CHANGE_INITSHOW) - { - UseSplitterInitPos(); // set initial splitter position if necessary - } -} - - +/************************************************************************* + * + * 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: dwfunctr.cxx,v $ + * $Revision: 1.15 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + + +// INCLUDE --------------------------------------------------------------- + +#include +#include +#include +#include +#include + +#include "sc.hrc" +#include "global.hxx" // ScAddress +#include "scresid.hxx" +#include "reffact.hxx" +#include "document.hxx" +#include "cell.hxx" +#include "scmod.hxx" +#include "inputhdl.hxx" +#include "tabvwsh.hxx" +#include "appoptio.hxx" +#include "compiler.hxx" + +#include "dwfunctr.hrc" +#include "dwfunctr.hxx" + +// ----------------------------------------------------------------------- + +#define ARG_SEPERATOR String("; ") +SFX_IMPL_DOCKINGWINDOW( ScFunctionChildWindow, FID_FUNCTION_BOX ) + +/************************************************************************* +#* Member: ScFunctionChildWindow Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionChildWindow +#* +#* Funktion: Konstruktor der Klasse ScFunctionChildWindow +#* Ableitung vom SfxChildWindow als "Behaelter" fuer +#* Funktions- Fenster in Clac +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +__EXPORT ScFunctionChildWindow::ScFunctionChildWindow( Window* pParentP, + USHORT nId, + SfxBindings* pBindings, + SfxChildWinInfo* pInfo ) : + SfxChildWindow( pParentP, nId ) +{ + ScFunctionDockWin* pWin = new ScFunctionDockWin( pBindings, this, + pParentP, ScResId( FID_FUNCTION_BOX ) ); + pWindow = pWin; + + eChildAlignment = SFX_ALIGN_RIGHT; + + pWin->Initialize( pInfo ); +} + +/************************************************************************* +#* Member: ScFunctionDockWin Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Konstruktor der Klasse ScFunctionDockWin +#* +#* Input: Sfx- Verknuepfungen, Fenster, Resource +#* +#* Output: --- +#* +#************************************************************************/ + +ScFunctionDockWin::ScFunctionDockWin( SfxBindings* pBindingsP, + SfxChildWindow *pCW, Window* pParent, const ResId& rResId ) : + + SfxDockingWindow( pBindingsP, pCW, pParent, rResId ), + aPrivatSplit ( this, ResId( FT_SPLIT, *rResId.GetResMgr() ),SC_SPLIT_VERT), + aCatBox ( this, ResId( CB_CAT, *rResId.GetResMgr() ) ), + aFuncList ( this, ResId( LB_FUNC, *rResId.GetResMgr() ) ), + aDDFuncList ( this, ResId( DDLB_FUNC, *rResId.GetResMgr() ) ), + aInsertButton ( this, ResId( IMB_INSERT, *rResId.GetResMgr() ) ), + aFiFuncDesc ( this, ResId( FI_FUNCDESC, *rResId.GetResMgr() ) ), + aOldSize (0,0) +{ + FreeResource(); + InitLRUList(); + SetStyle(GetStyle()|WB_CLIPCHILDREN); + + aTimer.SetTimeout(200); + aTimer.SetTimeoutHdl(LINK( this, ScFunctionDockWin, TimerHdl)); + + eSfxNewAlignment=GetAlignment(); + eSfxOldAlignment=eSfxNewAlignment; + aFiFuncDesc.SetUpdateMode(TRUE); + pAllFuncList=&aFuncList; + aDDFuncList.Disable(); + aDDFuncList.Hide(); + nArgs=0; + nDockMode=0; + bSizeFlag=FALSE; + aCatBox.SetDropDownLineCount(9); + Font aFont=aFiFuncDesc.GetFont(); + aFont.SetColor(Color(COL_BLACK)); + aFiFuncDesc.SetFont(aFont); + aFiFuncDesc.SetBackground( GetBackground() ); //! never transparent? +//? SetBackground(); + + Link aLink=LINK( this, ScFunctionDockWin, SelHdl); + aCatBox.SetSelectHdl(aLink); + aFuncList.SetSelectHdl(aLink); + aDDFuncList.SetSelectHdl(aLink); + + Link a2Link=LINK( this, ScFunctionDockWin, SetSelectionHdl); + aFuncList.SetDoubleClickHdl(a2Link); + aDDFuncList.SetSelectHdl(aLink); + aInsertButton.SetClickHdl(a2Link); + + Link a3Link=LINK( this, ScFunctionDockWin, SetSplitHdl); + aPrivatSplit.SetCtrModifiedHdl(a3Link); + StartListening( *pBindingsP, TRUE ); + + Point aTopLeft=aCatBox.GetPosPixel(); + //String aString=aCatBox.GetEntry( 0)+String("www"); + String aString=String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww")); + Size aTxtSize( aFiFuncDesc.GetTextWidth(aString), aFiFuncDesc.GetTextHeight() ); + nMinWidth=aTxtSize.Width()+aTopLeft.X() + +2*aFuncList.GetPosPixel().X(); + nMinHeight=19*aTxtSize.Height(); + aCatBox.SelectEntryPos(0); + + Range aYRange(3*aTxtSize.Height()+aFuncList.GetPosPixel().Y(), + GetOutputSizePixel().Height()-2*aTxtSize.Height()); + aPrivatSplit.SetYRange(aYRange); + SelHdl(&aCatBox); + bInit=TRUE; +} + +/************************************************************************* +#* Member: ScFunctionDockWin Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Destruktor der Klasse ScFunctionDockWin +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +__EXPORT ScFunctionDockWin::~ScFunctionDockWin() +{ + EndListening( GetBindings() ); +} + +/************************************************************************* +#* Member: UpdateFunctionList Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Aktualisiert die Liste der Funktionen ab- +#* haengig von der eingestellten Kategorie. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +void ScFunctionDockWin::InitLRUList() +{ + const ScAppOptions& rAppOpt = SC_MOD()->GetAppOptions(); + USHORT nLRUFuncCount = Min( rAppOpt.GetLRUFuncListCount(), (USHORT)LRU_MAX ); + USHORT* pLRUListIds = rAppOpt.GetLRUFuncList(); + + USHORT i; + for ( i=0; iGet( pLRUListIds[i] ); + } + + USHORT nSelPos = aCatBox.GetSelectEntryPos(); + + if(nSelPos == 0) + UpdateFunctionList(); +} + +/************************************************************************* +#* Member: UpdateFunctionList Datum:10.12.99 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Aktualisiert die Liste der zuletzt verwendeten Funktionen. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +void ScFunctionDockWin::UpdateLRUList() +{ + if (pFuncDesc && pFuncDesc->nFIndex!=0) + { + ScModule* pScMod = SC_MOD(); + pScMod->InsertEntryToLRUList(pFuncDesc->nFIndex); + } +} + + +/************************************************************************* +#* Member: SetSize Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Groesse fuer die einzelnen Controls einzustellen. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +void ScFunctionDockWin::SetSize() +{ + USHORT nSelEntry=0; + SfxChildAlignment aChildAlign=eSfxOldAlignment;//GetAlignment(); + short nNewDockMode; + switch(aChildAlign) + { + case SFX_ALIGN_HIGHESTTOP: + case SFX_ALIGN_TOP: + case SFX_ALIGN_LOWESTTOP: + case SFX_ALIGN_LOWESTBOTTOM: + case SFX_ALIGN_BOTTOM: + case SFX_ALIGN_TOOLBOXTOP: + case SFX_ALIGN_TOOLBOXBOTTOM: + + + nNewDockMode=1; + if(nDockMode!=nNewDockMode) + { + nDockMode=nNewDockMode; + nSelEntry=aFuncList.GetSelectEntryPos(); + aFuncList.Clear(); + aFiFuncDesc.SetPosPixel(aFuncList.GetPosPixel()); + aDDFuncList.Enable(); + aDDFuncList.Show(); + aPrivatSplit.Disable(); + aPrivatSplit.Hide(); + aFuncList.Disable(); + aFuncList.Hide(); + pAllFuncList=&aDDFuncList; + SelHdl(&aCatBox); + aDDFuncList.SelectEntryPos(nSelEntry); + } + break; + + default: nNewDockMode=0; + if(nDockMode!=nNewDockMode) + { + nDockMode=nNewDockMode; + nSelEntry=aDDFuncList.GetSelectEntryPos(); + aDDFuncList.Clear(); + aDDFuncList.Disable(); + aDDFuncList.Hide(); + aPrivatSplit.Enable(); + aPrivatSplit.Show(); + aFuncList.Enable(); + aFuncList.Show(); + pAllFuncList=&aFuncList; + SelHdl(&aCatBox); + aFuncList.SelectEntryPos(nSelEntry); + } + break; + } + + if(nDockMode==0) + { + SetLeftRightSize(); + } + else + { + SetTopBottonSize(); + } +} +/************************************************************************* +#* Member: SetLeftRightSize Datum:15.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Groesse fuer die einzelnen Controls einstellen, +#* wenn Links oder Rechts angedockt wird. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +void ScFunctionDockWin::SetLeftRightSize() +{ + if(bSizeFlag==FALSE) + { + bSizeFlag=TRUE; + + Size aDiffSize=GetSizePixel(); + Size aNewSize=GetOutputSizePixel(); + aDiffSize.Width()-=aNewSize.Width(); + aDiffSize.Height()-=aNewSize.Height(); + + //@ SetUpdateMode( FALSE); + + String aString = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww")); + + Size aTxtSize( aFuncList.GetTextWidth(aString), aFuncList.GetTextHeight() ); + + Range aYRange(3*aTxtSize.Height()+aFuncList.GetPosPixel().Y(), + GetOutputSizePixel().Height()-2*aTxtSize.Height()); + aPrivatSplit.SetYRange(aYRange); + + + if(aOldSize.Width()!=aNewSize.Width()) + SetMyWidthLeRi(aNewSize); + + if(aOldSize.Height()!=aNewSize.Height()) + SetMyHeightLeRi(aNewSize); + + aOldSize=aNewSize; + aNewSize.Width()+=aDiffSize.Width(); + aNewSize.Height()+=aDiffSize.Height(); + //SetSizePixel(aNewSize); + //@ SetUpdateMode( TRUE); + bSizeFlag=FALSE; + } + +} +/************************************************************************* +#* Member: SetTopBottonSize Datum:15.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Groesse fuer die einzelnen Controls einzustellen. +#* wenn oben oder unten angedockt wird. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +void ScFunctionDockWin::SetTopBottonSize() +{ + if(bSizeFlag==FALSE) + { + bSizeFlag=TRUE; + Size aDiffSize=GetSizePixel(); + Size aNewSize=GetOutputSizePixel(); + aDiffSize.Width()-=aNewSize.Width(); + aDiffSize.Height()-=aNewSize.Height(); + + SetMyWidthToBo(aNewSize); + SetMyHeightToBo(aNewSize); + + aNewSize.Width()+=aDiffSize.Width(); + aNewSize.Height()+=aDiffSize.Height(); + //SetSizePixel(aNewSize); + //@ SetUpdateMode( TRUE); + bSizeFlag=FALSE; + } +} + +/************************************************************************* +#* Member: SetMyWidthLeRi Datum:15.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Breite fuer die einzelnen Controls und +#* das Fenster einstellen,wenn Li oder Re +#* +#* Input: neue Fenstergroesse +#* +#* Output: --- +#* +#************************************************************************/ + +void ScFunctionDockWin::SetMyWidthLeRi(Size &aNewSize) +{ + if((ULONG)aNewSize.Width()aFDTopLeft.Y()) + { + aFDSize.Height()-=nY-aFDTopLeft.Y(); + aFDTopLeft.Y()=nY; + } + aSplitterTopLeft.Y()=aFDTopLeft.Y()-aSplitterSize.Height()-1; + aFLSize.Height()=aSplitterTopLeft.Y()-aFLTopLeft.Y()-1; + + aFuncList.SetSizePixel(aFLSize); + aPrivatSplit.SetPosPixel(aSplitterTopLeft); + aFiFuncDesc.SetPosPixel(aFDTopLeft); + aFiFuncDesc.SetSizePixel(aFDSize); + +} + +/************************************************************************* +#* Member: SetMyWidthToBo Datum:16.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Breite fuer die einzelnen Controls und +#* das Fenster einstellen, wenn oben oder +#* unten angedockt werden soll. +#* +#* Input: neue Fenstergroesse +#* +#* Output: --- +#* +#************************************************************************/ + +void ScFunctionDockWin::SetMyWidthToBo(Size &aNewSize) +{ + if((ULONG)aNewSize.Width()GetEntryData( + pAllFuncList->GetSelectEntryPos() ); + if (pDesc) + { + pDesc->initArgumentInfo(); // full argument info is needed + + String aString=pAllFuncList->GetSelectEntry(); + if(nDockMode==0) + { + aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ":\n\n" )); + } + else + { + aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ": " )); + } + + aString+=pDesc->GetParamList(); + + if(nDockMode==0) + { + aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "\n\n" )); + } + else + { + aString += '\n'; + } + + aString+=*(pDesc->pFuncDesc); + + aFiFuncDesc.SetText(aString); + aFiFuncDesc.StateChanged(STATE_CHANGE_TEXT); + aFiFuncDesc.Invalidate(); + aFiFuncDesc.Update(); + + } + } + +/************************************************************************* +#* Member: Resizing Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Ueberladene Funktion um die Groesse der +#* einzelnen Controls einzustellen. +#* +#* Input: neue Groesse +#* +#* Output: --- +#* +#************************************************************************/ + +void __EXPORT ScFunctionDockWin::Resizing( Size& rNewSize ) +{ + if((ULONG)rNewSize.Width()Execute( FID_FUNCTION_BOX, + SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, + &aItem, 0L ); + + SfxDockingWindow::Close(); + + return( TRUE ); +} + + +/************************************************************************* +#* Member: CheckAlignment Datum:16.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Ueberprueft den Andockmodus und stellt die +#* Groessen dementsprechend ein. +#* +#* Input: Das neue Alignment +#* +#* Output: Das uebergebene Alignment +#* +#************************************************************************/ +SfxChildAlignment __EXPORT ScFunctionDockWin::CheckAlignment(SfxChildAlignment /* abla */, + SfxChildAlignment aChildAlign) +{ + String aString = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww")); + Size aTxtSize( aFiFuncDesc.GetTextWidth(aString), aFiFuncDesc.GetTextHeight() ); + if(!bInit) + { + eSfxOldAlignment=eSfxNewAlignment; + eSfxNewAlignment=aChildAlign; + } + else + { + bInit=FALSE; + eSfxOldAlignment=aChildAlign; + eSfxNewAlignment=aChildAlign; + } + + switch(eSfxOldAlignment) + { + case SFX_ALIGN_HIGHESTTOP: + case SFX_ALIGN_TOP: + case SFX_ALIGN_LOWESTTOP: + case SFX_ALIGN_LOWESTBOTTOM: + case SFX_ALIGN_BOTTOM: + case SFX_ALIGN_TOOLBOXTOP: + case SFX_ALIGN_TOOLBOXBOTTOM: + + nMinWidth= 0;/*aDDFuncList.GetPosPixel().X()+ + 10*aTxtSize.Width()+ + aFuncList.GetPosPixel().X();*/ + nMinHeight=0; + + break; + + case SFX_ALIGN_NOALIGNMENT: + + aString = aCatBox.GetEntry(0); + aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM("www")); + aTxtSize = Size( aFiFuncDesc.GetTextWidth(aString), + aFiFuncDesc.GetTextHeight() ); + + default: Point aTopLeft=aCatBox.GetPosPixel(); + nMinWidth=aTxtSize.Width()+aTopLeft.X() + +2*aFuncList.GetPosPixel().X(); + nMinHeight=19*aTxtSize.Height(); + //aCatBox.SelectEntryPos(0); + + break; + } + + return aChildAlign; +} +/************************************************************************* +#* Member: Close Datum:07.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Aenderungen erkennen +#* +#* Input: --- +#* +#* Output: TRUE +#* +#************************************************************************/ +void ScFunctionDockWin::Notify( SfxBroadcaster&, const SfxHint& /* rHint */ ) +{ +// const SfxPoolItemHint *pPoolItemHint = PTR_CAST(SfxPoolItemHint, &rHint); + /* + if ( pPoolItemHint + && ( pPoolItemHint->GetObject()->ISA( SvxColorTableItem ) ) ) + { + // Die Liste der Farben hat sich geaendert + pColorTable = ( (SvxColorTableItem*) pPoolItemHint->GetObject() )->GetColorTable(); + FillValueSet(); + } + */ +} + + +/************************************************************************* +#* Member: Resize Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Ueberladene Funktion um die Groesse der +#* einzelnen Controls einzustellen. +#* +#* Input: neue Groesse +#* +#* Output: --- +#* +#************************************************************************/ + +void __EXPORT ScFunctionDockWin::Resize() +{ + if ( !IsFloatingMode() || + !GetFloatingWindow()->IsRollUp() ) + { + Size aQSize=GetOutputSizePixel(); + Resizing( aQSize); + SetSize(); + } + SfxDockingWindow::Resize(); +} + +/************************************************************************* +#* Member: UpdateFunctionList Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Aktualisiert die Liste der Funktionen ab- +#* haengig von der eingestellten Kategorie. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +void ScFunctionDockWin::UpdateFunctionList() +{ + USHORT nSelPos = aCatBox.GetSelectEntryPos(); + USHORT nCategory = ( LISTBOX_ENTRY_NOTFOUND != nSelPos ) + ? (nSelPos-1) : 0; + + pAllFuncList->Clear(); + pAllFuncList->SetUpdateMode( FALSE ); + + if ( nSelPos > 0 ) + { + ScFunctionMgr* pFuncMgr = ScGlobal::GetStarCalcFunctionMgr(); + + const ScFuncDesc* pDesc = pFuncMgr->First( nCategory ); + while ( pDesc ) + { + pAllFuncList->SetEntryData( + pAllFuncList->InsertEntry( *(pDesc->pFuncName) ), + (void*)pDesc ); + pDesc = pFuncMgr->Next(); + } + } + else // LRU-Liste + { + for ( USHORT i=0; iSetEntryData( + pAllFuncList->InsertEntry( *(pDesc->pFuncName) ), + (void*)pDesc ); + } + } + + + //------------------------------------------------------ + pAllFuncList->SetUpdateMode( TRUE ); + + if ( pAllFuncList->GetEntryCount() > 0 ) + { + pAllFuncList->Enable(); + pAllFuncList->SelectEntryPos( 0 ); + } + else + { + pAllFuncList->Disable(); + } +} + +/************************************************************************* +#* Member: DoEnter Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Eingabe ins Dokument uebernehmen. Wird aufgerufen +#* nach betaetigen der Uebernehmen- Schaltflaeche +#* oder einem Doppelklick in die Funktionsliste. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +void ScFunctionDockWin::DoEnter(BOOL /* bOk */) //@@ ??? +{ + String aFirstArgStr; + String aParaStr; + String aArgStr; + String aString=pAllFuncList->GetSelectEntry(); + SfxViewShell* pCurSh = SfxViewShell::Current(); + nArgs=0; + + if(aString.Len()>0) + { + + ScModule* pScMod = SC_MOD(); + ScTabViewShell* pViewSh = PTR_CAST( ScTabViewShell, pCurSh); + ScInputHandler* pHdl = pScMod->GetInputHdl( pViewSh ); + if(!pScMod->IsEditMode()) + { + pScMod->SetInputMode(SC_INPUT_TABLE); + aString = '='; + aString += pAllFuncList->GetSelectEntry(); + if (pHdl) + pHdl->ClearText(); + } + const ScFuncDesc* pDesc = + (const ScFuncDesc*)pAllFuncList->GetEntryData( + pAllFuncList->GetSelectEntryPos() ); + if (pDesc) + { + pFuncDesc=pDesc; + UpdateLRUList(); + nArgs = pDesc->nArgCount; + if(nArgs>0) + { + // NOTE: Theoretically the first parameter could have the + // suppress flag as well, but practically it doesn't. + aFirstArgStr = *(pDesc->ppDefArgNames[0]); + aFirstArgStr.EraseLeadingAndTrailingChars(); + aFirstArgStr.SearchAndReplaceAll(' ', '_'); + aArgStr = aFirstArgStr; + if ( nArgs != VAR_ARGS ) + { // no VarArgs or Fix plus VarArgs, but not VarArgs only + String aArgSep = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( "; " )); + USHORT nFix = ( nArgs < VAR_ARGS ? nArgs : nArgs - VAR_ARGS + 1 ); + for ( USHORT nArg = 1; + nArg < nFix && !pDesc->pDefArgFlags[nArg].bOptional; nArg++ ) + { + if (!pDesc->pDefArgFlags[nArg].bSuppress) + { + aArgStr += aArgSep; + String sTmp(*(pDesc->ppDefArgNames[nArg])); + sTmp.EraseLeadingAndTrailingChars(); + sTmp.SearchAndReplaceAll(' ', '_'); + aArgStr += sTmp; + } + } + } + } + } + if (pHdl) + { + if(pHdl->GetEditString().Len()==0) + { + aString = '='; + aString += pAllFuncList->GetSelectEntry(); + } + EditView *pEdView=pHdl->GetActiveView(); + if(pEdView!=NULL) // @ Wegen Absturz bei Namen festlegen + { + if(nArgs>0) + { + pHdl->InsertFunction(aString); + pEdView->InsertText(aArgStr,TRUE); + ESelection aESel=pEdView->GetSelection(); + aESel.nEndPos=aESel.nStartPos+aFirstArgStr.Len(); + pEdView->SetSelection(aESel); + pHdl->DataChanged(); + } + else + { + aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "()" )); + pEdView->InsertText(aString,FALSE); + pHdl->DataChanged(); + } + } + } + InitLRUList(); + } + if ( pCurSh ) + { + Window* pShellWnd = pCurSh->GetWindow(); + + if ( pShellWnd ) + pShellWnd->GrabFocus(); + } + + +} + + + +/************************************************************************* +#* Handle: SelHdl Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Bei einer Aenderung der Kategorie wird die +#* die Liste der Funktionen aktualisiert. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScFunctionDockWin, SelHdl, ListBox*, pLb ) +{ + if ( pLb == &aCatBox) + { + UpdateFunctionList(); + SetDescription(); + } + + if ( pLb == &aFuncList||pLb == &aDDFuncList) + { + SetDescription(); + } + + + //SetSize(); + return 0; +} + +/************************************************************************* +#* Handle: SelHdl Datum:06.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Bei einer Aenderung der Kategorie wird die +#* die Liste der Funktionen aktualisiert. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScFunctionDockWin, SetSelectionHdl, void*, pCtrl ) +{ + if ((ImageButton *)pCtrl == &aInsertButton || + (ListBox *)pCtrl == &aFuncList) + { + DoEnter(TRUE); // Uebernimmt die Eingabe + } + //... + + return 0; +} + +/************************************************************************* +#* Handle: SetSplitHdl Datum:13.10.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScFunctionDockWin +#* +#* Funktion: Bei einer Aenderung des Split- Controls werden die +#* einzelnen Controls an die neue Groesse angepasst. +#* +#* Input: Zeiger auf Control +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScFunctionDockWin, SetSplitHdl, ScPrivatSplit*, pCtrl ) +{ + if (pCtrl == &aPrivatSplit) + { + short nDeltaY=aPrivatSplit.GetDeltaY(); + Size aFLSize=aFuncList.GetSizePixel(); + Size aFDSize=aFiFuncDesc.GetSizePixel(); + Point aFDTopLeft=aFiFuncDesc.GetPosPixel(); + + aFLSize.Height()+=nDeltaY; + aFDSize.Height()-=nDeltaY; + aFDTopLeft.Y()+=nDeltaY; + aFuncList.SetSizePixel(aFLSize); + aFiFuncDesc.SetPosPixel(aFDTopLeft); + aFiFuncDesc.SetSizePixel(aFDSize); + /* + aFuncList.Invalidate(); + aFuncList.Update(); + aFiFuncDesc.Invalidate(); + aFiFuncDesc.Update(); + */ + } + //... + + return 0; +} + +void ScFunctionDockWin::ToggleFloatingMode() +{ + aSplitterInitPos = Point(); + SfxDockingWindow::ToggleFloatingMode(); + + eSfxNewAlignment=GetAlignment(); + eSfxOldAlignment=eSfxNewAlignment; + + aOldSize.Height()=0; + aOldSize.Width()=0; + aTimer.Start(); +} + +IMPL_LINK( ScFunctionDockWin, TimerHdl, Timer*, EMPTYARG ) +{ + CheckAlignment(eSfxOldAlignment,eSfxNewAlignment); + SetSize(); + return 0; +} + +void ScFunctionDockWin::Initialize(SfxChildWinInfo *pInfo) +{ + String aStr; + if(pInfo!=NULL) + { + if ( pInfo->aExtraString.Len() ) + { + xub_StrLen nPos = pInfo->aExtraString.Search( + String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ScFuncList:"))); + + // Versuche, den Alignment-String "ALIGN:(...)" einzulesen; wenn + // er nicht vorhanden ist, liegt eine "altere Version vor + if ( nPos != STRING_NOTFOUND ) + { + xub_StrLen n1 = pInfo->aExtraString.Search('(', nPos); + if ( n1 != STRING_NOTFOUND ) + { + xub_StrLen n2 = pInfo->aExtraString.Search(')', n1); + if ( n2 != STRING_NOTFOUND ) + { + // Alignment-String herausschneiden + aStr = pInfo->aExtraString.Copy(nPos, n2 - nPos + 1); + pInfo->aExtraString.Erase(nPos, n2 - nPos + 1); + aStr.Erase(0, n1-nPos+1); + } + } + } + } + } + SfxDockingWindow::Initialize(pInfo); + + if ( aStr.Len()) + { + aSplitterInitPos=aPrivatSplit.GetPosPixel(); + aSplitterInitPos.Y()=(USHORT) aStr.ToInt32(); + xub_StrLen n1 = aStr.Search(';'); + aStr.Erase(0, n1+1); + USHORT nSelPos=sal::static_int_cast( aStr.ToInt32() ); + aCatBox.SelectEntryPos(nSelPos); + SelHdl(&aCatBox); + + // if the window has already been shown (from SfxDockingWindow::Initialize if docked), + // set the splitter position now, otherwise it is set in StateChanged with type INITSHOW + + UseSplitterInitPos(); + } +} + +//------------------------------------------------------------------------- + +void ScFunctionDockWin::FillInfo(SfxChildWinInfo& rInfo) const +{ + SfxDockingWindow::FillInfo(rInfo); + Point aPoint=aPrivatSplit.GetPosPixel(); + rInfo.aExtraString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "ScFuncList:(" )); + rInfo.aExtraString += String::CreateFromInt32(aPoint.Y()); + rInfo.aExtraString += ';'; + rInfo.aExtraString += String::CreateFromInt32(aCatBox.GetSelectEntryPos()); + rInfo.aExtraString += ')'; +} + +void ScFunctionDockWin::UseSplitterInitPos() +{ + if ( IsVisible() && aPrivatSplit.IsEnabled() && aSplitterInitPos != Point() ) + { + aPrivatSplit.MoveSplitTo(aSplitterInitPos); + aSplitterInitPos = Point(); // use only once + } +} + +void ScFunctionDockWin::StateChanged( StateChangedType nStateChange ) +{ + SfxDockingWindow::StateChanged( nStateChange ); + + if (nStateChange == STATE_CHANGE_INITSHOW) + { + UseSplitterInitPos(); // set initial splitter position if necessary + } +} + + diff --git a/sc/source/ui/formdlg/formdlgs.src b/sc/source/ui/formdlg/formdlgs.src index 2e9ceb6b1dd3..bc7a2fd573d3 100644 --- a/sc/source/ui/formdlg/formdlgs.src +++ b/sc/source/ui/formdlg/formdlgs.src @@ -1,32 +1,32 @@ -/************************************************************************* - * - * 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: formdlgs.src,v $ - * $Revision: 1.49 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "sc.hrc" - //--------------------------------------------------------------------------- +/************************************************************************* + * + * 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: formdlgs.src,v $ + * $Revision: 1.49 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "sc.hrc" + //--------------------------------------------------------------------------- diff --git a/sc/source/ui/miscdlgs/crnrdlg.cxx b/sc/source/ui/miscdlgs/crnrdlg.cxx index 8684ea3fa558..8ec33d49b874 100644 --- a/sc/source/ui/miscdlgs/crnrdlg.cxx +++ b/sc/source/ui/miscdlgs/crnrdlg.cxx @@ -1,1175 +1,1175 @@ -/************************************************************************* - * - * 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: crnrdlg.cxx,v $ - * $Revision: 1.11 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -// System - Includes --------------------------------------------------------- - - - -// INCLUDE ------------------------------------------------------------------- - -#include "reffact.hxx" -#include "document.hxx" -#include "scresid.hxx" -#include "globstr.hrc" -#include "crnrdlg.hrc" -#include "docsh.hxx" - -#define _CRNRDLG_CXX -#include "crnrdlg.hxx" -#undef _CRNRDLG_CXX -#include - - -//============================================================================ - -#define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute() -#define QUERYBOX(m) QueryBox(this,WinBits(WB_YES_NO|WB_DEF_YES),m).Execute() - -const ULONG nEntryDataCol = 0; -const ULONG nEntryDataRow = 1; -const ULONG nEntryDataDelim = 2; - - -//============================================================================ -// class ScColRowNameRangesDlg - - -/************************************************************************* -#* Member: ScColRowNameRangesDlg Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Konstruktor der Klasse ScColRowNameRangesDlg. -#* Initialisieren der Klassen- Mitglieder, -#* Uebernahme der Range- Angaben und Aufruf -#* der eigentlichen Initialisierungsroutine -#* -#* Input: Sfx- Verknuepfungen -#* Parent- Window -#* SCViewData -#* -#* Output: --- -#* -#************************************************************************/ - -ScColRowNameRangesDlg::ScColRowNameRangesDlg( SfxBindings* pB, - SfxChildWindow* pCW, - Window* pParent, - ScViewData* ptrViewData ) - - : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_COLROWNAMERANGES ), - // - aFlAssign ( this, ScResId( FL_ASSIGN ) ), - aLbRange ( this, ScResId( LB_RANGE ) ), - - aEdAssign ( this, ScResId( ED_AREA ) ), - aRbAssign ( this, ScResId( RB_AREA ), &aEdAssign, this ), - aBtnColHead ( this, ScResId( BTN_COLHEAD ) ), - aBtnRowHead ( this, ScResId( BTN_ROWHEAD ) ), - aFtAssign2 ( this, ScResId( FT_DATA_LABEL ) ), - aEdAssign2 ( this, ScResId( ED_DATA ) ), - aRbAssign2 ( this, ScResId( RB_DATA ), &aEdAssign2, this ), - - aBtnOk ( this, ScResId( BTN_OK ) ), - aBtnCancel ( this, ScResId( BTN_CANCEL ) ), - aBtnHelp ( this, ScResId( BTN_HELP ) ), - aBtnAdd ( this, ScResId( BTN_ADD ) ), - aBtnRemove ( this, ScResId( BTN_REMOVE ) ), - - pViewData ( ptrViewData ), - pDoc ( ptrViewData->GetDocument() ), - - pEdActive ( NULL ), - bDlgLostFocus ( FALSE ) -{ - xColNameRanges = pDoc->GetColNameRanges()->Clone(); - xRowNameRanges = pDoc->GetRowNameRanges()->Clone(); - Init(); - FreeResource(); -} - - -/************************************************************************* -#* Member: ~ScColRowNameRangesDlg Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Destruktor der Klasse -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -__EXPORT ScColRowNameRangesDlg::~ScColRowNameRangesDlg() -{ -} - - -/************************************************************************* -#* Member: Init Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Initialisierungs- Routine: -#* Umlenken der Event- Handler und einstellen der -#* Startparameter. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -void ScColRowNameRangesDlg::Init() -{ - SCCOL nStartCol = 0; - SCROW nStartRow = 0; - SCTAB nStartTab = 0; - SCCOL nEndCol = 0; - SCROW nEndRow = 0; - SCTAB nEndTab = 0; - - aBtnOk.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, OkBtnHdl ) ); - aBtnCancel.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, CancelBtnHdl ) ); - aBtnAdd.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, AddBtnHdl ) ); - aBtnRemove.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RemoveBtnHdl ) ); - aLbRange.SetSelectHdl ( LINK( this, ScColRowNameRangesDlg, Range1SelectHdl ) ); - aEdAssign.SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range1DataModifyHdl ) ); - aBtnColHead.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, ColClickHdl ) ); - aBtnRowHead.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RowClickHdl ) ); - aEdAssign2.SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range2DataModifyHdl ) ); - - Link aLink = LINK( this, ScColRowNameRangesDlg, GetFocusHdl ); - aEdAssign.SetGetFocusHdl( aLink ); - aRbAssign.SetGetFocusHdl( aLink ); - aEdAssign2.SetGetFocusHdl( aLink ); - aRbAssign2.SetGetFocusHdl( aLink ); - - aLink = LINK( this, ScColRowNameRangesDlg, LoseFocusHdl ); - aEdAssign.SetLoseFocusHdl( aLink ); - aRbAssign.SetLoseFocusHdl( aLink ); - aEdAssign2.SetLoseFocusHdl( aLink ); - aRbAssign2.SetLoseFocusHdl( aLink ); - - pEdActive = &aEdAssign; - - UpdateNames(); - - if ( pViewData && pDoc ) - { - pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab, - nEndCol, nEndRow, nEndTab ); - SetColRowData( ScRange( ScAddress( nStartCol, nStartRow, nStartTab ), - ScAddress( nEndCol, nEndRow, nEndTab ) ) ); - } - else - { - aBtnColHead.Check( TRUE ); - aBtnRowHead.Check( FALSE ); - aEdAssign.SetText( EMPTY_STRING ); - aEdAssign2.SetText( EMPTY_STRING ); - } - - aLbRange.SetBorderStyle( WINDOW_BORDER_MONO ); - aBtnColHead.Enable(); - aBtnRowHead.Enable(); - aEdAssign.Enable(); - aEdAssign.GrabFocus(); - aRbAssign.Enable(); - //@BugID 54702 Enablen/Disablen nur noch in Basisklasse - //SFX_APPWINDOW->Enable(); // Ref-Feld hat Focus - - Range1SelectHdl( 0 ); -} - - -/************************************************************************* -#* Member: SetColRowData Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches -#* auf default Werte setzen und beide Referenz-Edit-Felder -#* fuellen. -#* -#* Input: Einstellbereich fuer Labels -#* -#* Output: --- -#* -#************************************************************************/ - -void ScColRowNameRangesDlg::SetColRowData( const ScRange& rLabelRange,BOOL bRef) -{ - theCurData = theCurArea = rLabelRange; - BOOL bValid = TRUE; - SCCOL nCol1 = theCurArea.aStart.Col(); - SCCOL nCol2 = theCurArea.aEnd.Col(); - SCROW nRow1 = theCurArea.aStart.Row(); - SCROW nRow2 = theCurArea.aEnd.Row(); - if ( (static_cast(nCol2 - nCol1) >= nRow2 - nRow1) || (nCol1 == 0 && nCol2 == MAXCOL) ) - { // Spaltenkoepfe und Grenzfall gesamte Tabelle - aBtnColHead.Check( TRUE ); - aBtnRowHead.Check( FALSE ); - if ( nRow2 == MAXROW ) - { - if ( nRow1 == 0 ) - bValid = FALSE; // Grenzfall gesamte Tabelle - else - { // Head unten, Data oben - theCurData.aStart.SetRow( 0 ); - theCurData.aEnd.SetRow( nRow1 - 1 ); - } - } - else - { // Head oben, Data unten - theCurData.aStart.SetRow( nRow2 + 1 ); - theCurData.aEnd.SetRow( MAXROW ); - } - } - else - { // Zeilenkoepfe - aBtnRowHead.Check( TRUE ); - aBtnColHead.Check( FALSE ); - if ( nCol2 == MAXCOL ) - { // Head rechts, Data links - theCurData.aStart.SetCol( 0 ); - theCurData.aEnd.SetCol( nCol2 - 1 ); - } - else - { // Head links, Data rechts - theCurData.aStart.SetCol( nCol2 + 1 ); - theCurData.aEnd.SetCol( MAXCOL ); - } - } - if ( bValid ) - { - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - String aStr; - theCurArea.Format( aStr, SCR_ABS_3D, pDoc, eConv ); - - if(bRef) - aEdAssign.SetRefString( aStr ); - else - aEdAssign.SetText( aStr ); - - aEdAssign.SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) ); - theCurData.Format( aStr, SCR_ABS_3D, pDoc, eConv ); - - if(bRef) - aEdAssign2.SetRefString( aStr ); - else - aEdAssign2.SetText( aStr ); - } - else - { - theCurData = theCurArea = ScRange(); - - if(bRef) - { - aEdAssign.SetRefString( EMPTY_STRING ); - aEdAssign2.SetRefString( EMPTY_STRING ); - } - else - { - aEdAssign.SetText( EMPTY_STRING ); - aEdAssign2.SetText( EMPTY_STRING ); - } - - aBtnColHead.Disable(); - aBtnRowHead.Disable(); - aEdAssign2.Disable(); - aRbAssign2.Disable(); - } -} - - -/************************************************************************* -#* Member: AdjustColRowData Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches -#* anpassen und Data-Referenz-Edit-Feld fuellen. -#* -#* Input: Bereich fuer Labels -#* -#* Output: --- -#* -#************************************************************************/ - -void ScColRowNameRangesDlg::AdjustColRowData( const ScRange& rDataRange,BOOL bRef) -{ - theCurData = rDataRange; - if ( aBtnColHead.IsChecked() ) - { // Datenbereich gleiche Spalten wie Koepfe - theCurData.aStart.SetCol( theCurArea.aStart.Col() ); - theCurData.aEnd.SetCol( theCurArea.aEnd.Col() ); - if ( theCurData.Intersects( theCurArea ) ) - { - SCROW nRow1 = theCurArea.aStart.Row(); - SCROW nRow2 = theCurArea.aEnd.Row(); - if ( nRow1 > 0 - && (theCurData.aEnd.Row() < nRow2 || nRow2 == MAXROW) ) - { // Data oben - theCurData.aEnd.SetRow( nRow1 - 1 ); - if ( theCurData.aStart.Row() > theCurData.aEnd.Row() ) - theCurData.aStart.SetRow( theCurData.aEnd.Row() ); - } - else - { // Data unten - theCurData.aStart.SetRow( nRow2 + 1 ); - if ( theCurData.aStart.Row() > theCurData.aEnd.Row() ) - theCurData.aEnd.SetRow( theCurData.aStart.Row() ); - } - } - } - else - { // Datenbereich gleiche Zeilen wie Koepfe - theCurData.aStart.SetRow( theCurArea.aStart.Row() ); - theCurData.aEnd.SetRow( theCurArea.aEnd.Row() ); - if ( theCurData.Intersects( theCurArea ) ) - { - SCCOL nCol1 = theCurArea.aStart.Col(); - SCCOL nCol2 = theCurArea.aEnd.Col(); - if ( nCol1 > 0 - && (theCurData.aEnd.Col() < nCol2 || nCol2 == MAXCOL) ) - { // Data links - theCurData.aEnd.SetCol( nCol1 - 1 ); - if ( theCurData.aStart.Col() > theCurData.aEnd.Col() ) - theCurData.aStart.SetCol( theCurData.aEnd.Col() ); - } - else - { // Data rechts - theCurData.aStart.SetCol( nCol2 + 1 ); - if ( theCurData.aStart.Col() > theCurData.aEnd.Col() ) - theCurData.aEnd.SetCol( theCurData.aStart.Col() ); - } - } - } - String aStr; - theCurData.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() ); - - if(bRef) - aEdAssign2.SetRefString( aStr ); - else - aEdAssign2.SetText( aStr ); - - aEdAssign2.SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) ); -} - - -/************************************************************************* -#* Member: SetReference Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Uebergabe eines mit der Maus selektierten Tabellen- -#* bereiches, der dann als neue Selektion im Referenz- -#* Fenster angezeigt wird. -#* -#* Input: Bereich fuer Labels -#* Dokumentklasse -#* -#* Output: --- -#* -#************************************************************************/ - -void ScColRowNameRangesDlg::SetReference( const ScRange& rRef, ScDocument* /* pDoc */ ) -{ - if ( pEdActive ) - { - if ( rRef.aStart != rRef.aEnd ) - RefInputStart( pEdActive ); - - String aRefStr; - if ( pEdActive == &aEdAssign ) - SetColRowData( rRef, TRUE ); - else - AdjustColRowData( rRef, TRUE ); - aBtnColHead.Enable(); - aBtnRowHead.Enable(); - aBtnAdd.Enable(); - aBtnRemove.Disable(); - } -} - - -/************************************************************************* -#* Member: Close Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Schliessen des Fensters -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -BOOL __EXPORT ScColRowNameRangesDlg::Close() -{ - return DoClose( ScColRowNameRangesDlgWrapper::GetChildWindowId() ); -} - - -/************************************************************************* -#* Member: SetActive Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Aktivieren des Fensters -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -void ScColRowNameRangesDlg::SetActive() -{ - if ( bDlgLostFocus ) - { - bDlgLostFocus = FALSE; - if( pEdActive ) - pEdActive->GrabFocus(); - } - else - GrabFocus(); - - if( pEdActive == &aEdAssign ) - Range1DataModifyHdl( 0 ); - else if( pEdActive == &aEdAssign2 ) - Range2DataModifyHdl( 0 ); - - RefInputDone(); -} - - -/************************************************************************* -#* Member: UpdateNames Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Aktualisieren der Namen -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -void ScColRowNameRangesDlg::UpdateNames() -{ - aLbRange.SetUpdateMode( FALSE ); - //----------------------------------------------------------- - aLbRange.Clear(); - aRangeMap.clear(); - aEdAssign.SetText( EMPTY_STRING ); - - ULONG nCount, j; - USHORT nPos; //@008 Hilfsvariable q eingefuegt - - SCCOL nCol1; //@008 04.09.97 - SCROW nRow1; //Erweiterung fuer Bereichsnamen - SCTAB nTab1; - SCCOL nCol2; - SCROW nRow2; - SCTAB nTab2; - String rString; - String strShow; - const ScAddress::Details aDetails(pDoc->GetAddressConvention()); - - String aString; - String strDelim = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( " --- " )); - aString = strDelim; - aString += ScGlobal::GetRscString( STR_COLUMN ); - aString += strDelim; - nPos = aLbRange.InsertEntry( aString ); - aLbRange.SetEntryData( nPos, (void*)nEntryDataDelim ); - if ( (nCount = xColNameRanges->Count()) > 0 ) - { - ScRangePair** ppSortArray = xColNameRanges->CreateNameSortedArray( - nCount, pDoc ); - for ( j=0; j < nCount; j++ ) - { - const ScRange aRange(ppSortArray[j]->GetRange(0)); - aRange.Format( aString, SCR_ABS_3D, pDoc, aDetails ); - - //@008 Hole Bereichsparameter aus Dok - ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1, - nCol2, nRow2, nTab2 ); - SCCOL q=nCol1+3; - if(q>nCol2) q=nCol2; - //@008 Baue String zusammen - strShow.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" [")); - if(pDoc!=NULL) - { - pDoc->GetString(nCol1, nRow1, nTab1,rString); - strShow +=rString; - for(SCCOL i=nCol1+1;i<=q;i++) - { - strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ")); - pDoc->GetString(i, nRow1, nTab1,rString); - strShow += rString; - } - } - if(qCount()) > 0 ) - { - ScRangePair** ppSortArray = xRowNameRanges->CreateNameSortedArray( - nCount, pDoc ); - for ( j=0; j < nCount; j++ ) - { - const ScRange aRange(ppSortArray[j]->GetRange(0)); - aRange.Format( aString, SCR_ABS_3D, pDoc, aDetails ); - - //@008 Ab hier baue String fuer Zeilen - ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1, - nCol2, nRow2, nTab2 ); - SCROW q=nRow1+3; - if(q>nRow2) q=nRow2; - strShow.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" [")); - if(pDoc!=NULL) - { - pDoc->GetString(nCol1, nRow1, nTab1,rString); - strShow += rString; - for(SCROW i=nRow1+1;i<=q;i++) - { - strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ")); - pDoc->GetString(nCol1, i, nTab1,rString); - strShow += rString; - } - } - if(qFind( rRange )) != NULL ) - bFound = TRUE; - else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL ) - bFound = TRUE; - - if ( bFound ) - { - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - String aStr; - theCurArea = rRange; - theCurArea.Format( aStr, SCR_ABS_3D, pDoc, eConv ); - aEdAssign.SetText( aStr ); - aBtnAdd.Disable(); - aBtnRemove.Enable(); - aBtnColHead.Check( bColName ); - aBtnRowHead.Check( !bColName ); - theCurData = pPair->GetRange(1); - theCurData.Format( aStr, SCR_ABS_3D, pDoc, eConv ); - aEdAssign2.SetText( aStr ); - } - else - { - aBtnAdd.Enable(); - aBtnRemove.Disable(); - } - aBtnColHead.Enable(); - aBtnRowHead.Enable(); - aEdAssign2.Enable(); - aRbAssign2.Enable(); -} - - -/************************************************************************* -#* Member: IsRefInputMode Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Abfragefunktion fuer Referenz- Input- Mode. -#* -#* Input: Bereichs-String -#* Flag fuer Spalten -#* -#* Output: true, wenn Referenz- Input- Mode -#* -#************************************************************************/ - -BOOL ScColRowNameRangesDlg::IsRefInputMode() const -{ - return (pEdActive != NULL); -} - -//------------------------------------------------------------------------ -// Handler: -// ======== - -/************************************************************************* -#* Handler: OkBtnHdl Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Wird ausgeloest, wenn der OK- Button gedrueckt wurde. -#* Hinzufuegen- Button ausloesen, und die neu einge- -#* stellten Bereiche ans Dokument uebergeben. -#* Fensterschliessen- Anweisung ausloesen. -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScColRowNameRangesDlg, OkBtnHdl, void *, EMPTYARG ) -{ - AddBtnHdl( 0 ); - - // die RangeLists den Refs am Doc zuweisen - pDoc->GetColNameRangesRef() = xColNameRanges; - pDoc->GetRowNameRangesRef() = xRowNameRanges; - // geaenderte Datenbereiche muessen sich auswirken - pDoc->CompileColRowNameFormula(); - ScDocShell* pDocShell = pViewData->GetDocShell(); - pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID ); - pDocShell->SetDocumentModified(); - - Close(); - return 0; -} - - -/************************************************************************* -#* Handler: CancelBtnHdl Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Fensterschliessen- Anweisung ausloesen. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK_INLINE_START( ScColRowNameRangesDlg, CancelBtnHdl, void *, EMPTYARG ) -{ - Close(); - return 0; -} -IMPL_LINK_INLINE_END( ScColRowNameRangesDlg, CancelBtnHdl, void *, EMPTYARG ) - - -/************************************************************************* -#* Handler: AddBtnHdl Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Nach betaetigen des Hinzufuegen- Buttons, werden -#* die Bereichsangaben eingestellt und in der -#* Listbox dargestellt. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScColRowNameRangesDlg, AddBtnHdl, void *, EMPTYARG ) -{ - String aNewArea( aEdAssign.GetText() ); - String aNewData( aEdAssign2.GetText() ); - - if ( aNewArea.Len() > 0 && aNewData.Len() > 0 ) - { - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - ScRange aRange1, aRange2; - BOOL bOk1; - if ( (bOk1 = ((aRange1.ParseAny( aNewArea, pDoc, eConv ) & SCA_VALID) == SCA_VALID)) != FALSE - && ((aRange2.ParseAny( aNewData, pDoc, eConv ) & SCA_VALID) == SCA_VALID) ) - { - theCurArea = aRange1; - AdjustColRowData( aRange2 ); - ScRangePair* pPair; - if ( ( pPair = xColNameRanges->Find( theCurArea ) ) != NULL ) - { - xColNameRanges->Remove( pPair ); - delete pPair; - } - if ( ( pPair = xRowNameRanges->Find( theCurArea ) ) != NULL ) - { - xRowNameRanges->Remove( pPair ); - delete pPair; - } - if ( aBtnColHead.IsChecked() ) - xColNameRanges->Join( ScRangePair( theCurArea, theCurData ) ); - else - xRowNameRanges->Join( ScRangePair( theCurArea, theCurData ) ); - - UpdateNames(); - - aEdAssign.GrabFocus(); - aBtnAdd.Disable(); - aBtnRemove.Disable(); - aEdAssign.SetText( EMPTY_STRING ); - aBtnColHead.Check( TRUE ); - aBtnRowHead.Check( FALSE ); - aEdAssign2.SetText( EMPTY_STRING ); - theCurArea = ScRange(); - theCurData = theCurArea; - Range1SelectHdl( 0 ); - } - else - { - ERRORBOX( ScGlobal::GetRscString(STR_INVALIDTABNAME) ); - if ( !bOk1 ) - aEdAssign.GrabFocus(); - else - aEdAssign2.GrabFocus(); - } - } - return 0; -} - - -/************************************************************************* -#* Handler: RemoveBtnHdl Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Nach betaetigen des Loeschen- Buttons, wird -#* die markierte Bereichsangabe geloescht. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScColRowNameRangesDlg, RemoveBtnHdl, void *, EMPTYARG ) -{ - String aRangeStr = aLbRange.GetSelectEntry(); - USHORT nSelectPos = aLbRange.GetSelectEntryPos(); - BOOL bColName = - ((ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataCol); - NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr); - if (itr == aRangeMap.end()) - return 0; - const ScRange& rRange = itr->second; - - ScRangePair* pPair = NULL; - BOOL bFound = FALSE; - if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL ) - bFound = TRUE; - else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL ) - bFound = TRUE; - if ( bFound ) - { - String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY ); - String aMsg = aStrDelMsg.GetToken( 0, '#' ); - - aMsg += aRangeStr; - aMsg += aStrDelMsg.GetToken( 1, '#' ); - - if ( RET_YES == QUERYBOX(aMsg) ) - { - if ( bColName ) - xColNameRanges->Remove( pPair ); - else - xRowNameRanges->Remove( pPair ); - delete pPair; - - UpdateNames(); - USHORT nCnt = aLbRange.GetEntryCount(); - if ( nSelectPos >= nCnt ) - { - if ( nCnt ) - nSelectPos = nCnt - 1; - else - nSelectPos = 0; - } - aLbRange.SelectEntryPos( nSelectPos ); - if ( nSelectPos && - (ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataDelim ) - aLbRange.SelectEntryPos( --nSelectPos ); // ---Zeile--- - - aLbRange.GrabFocus(); - aBtnAdd.Disable(); - aBtnRemove.Disable(); - aEdAssign.SetText( EMPTY_STRING ); - theCurArea = theCurData = ScRange(); - aBtnColHead.Check( TRUE ); - aBtnRowHead.Check( FALSE ); - aEdAssign2.SetText( EMPTY_STRING ); - Range1SelectHdl( 0 ); - } - } - return 0; -} - - -/************************************************************************* -#* Handler: Range1SelectHdl Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Wenn Zeile in Listbox ausgewaehlt wird, -#* werden die Eingabefelder entsprechend -#* eingestellt. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScColRowNameRangesDlg, Range1SelectHdl, void *, EMPTYARG ) -{ - USHORT nSelectPos = aLbRange.GetSelectEntryPos(); - USHORT nCnt = aLbRange.GetEntryCount(); - USHORT nMoves = 0; - while ( nSelectPos < nCnt - && (ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataDelim ) - { // skip Delimiter - ++nMoves; - aLbRange.SelectEntryPos( ++nSelectPos ); - } - String aRangeStr = aLbRange.GetSelectEntry(); - if ( nMoves ) - { - if ( nSelectPos > 1 && nSelectPos >= nCnt ) - { // am Ende nicht auf dem " --- Zeile --- " Delimiter stehenbleiben - // wenn davor Eintraege existieren - nSelectPos = nCnt - 2; - aLbRange.SelectEntryPos( nSelectPos ); - aRangeStr = aLbRange.GetSelectEntry(); - } - else if ( nSelectPos > 2 && nSelectPos < nCnt && aRangeStr.Len() - && aRangeStr == aEdAssign.GetText() ) - { // nach oben wandern statt nach unten auf die vorherige Position - nSelectPos -= 2; - aLbRange.SelectEntryPos( nSelectPos ); - aRangeStr = aLbRange.GetSelectEntry(); - } - } - NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr); - if ( itr != aRangeMap.end() ) - { - BOOL bColName = - ((ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataCol); - UpdateRangeData( itr->second, bColName ); - aBtnAdd.Disable(); - aBtnRemove.Enable(); - } - else - { - if ( aEdAssign.GetText().Len() > 0 ) - { - if ( aEdAssign2.GetText().Len() > 0 ) - aBtnAdd.Enable(); - else - aBtnAdd.Disable(); - aBtnColHead.Enable(); - aBtnRowHead.Enable(); - aEdAssign2.Enable(); - aRbAssign2.Enable(); - } - else - { - aBtnAdd.Disable(); - aBtnColHead.Disable(); - aBtnRowHead.Disable(); - aEdAssign2.Disable(); - aRbAssign2.Disable(); - } - aBtnRemove.Disable(); - aEdAssign.GrabFocus(); - } - - aEdAssign.Enable(); - aRbAssign.Enable(); - - //@BugID 54702 Enablen/Disablen nur noch in Basisklasse - //SFX_APPWINDOW->Enable(); - return 0; -} - - -/************************************************************************* -#* Handler: Range1DataModifyHdl Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Wird ausgeloest, wenn in der Tabelle, der Label- -#* Bereich geaendert wurde. -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScColRowNameRangesDlg, Range1DataModifyHdl, void *, EMPTYARG ) -{ - String aNewArea( aEdAssign.GetText() ); - BOOL bValid = FALSE; - if ( aNewArea.Len() > 0 ) - { - ScRange aRange; - if ( (aRange.ParseAny( aNewArea, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID ) - { - SetColRowData( aRange ); - bValid = TRUE; - } - } - if ( bValid ) - { - aBtnAdd.Enable(); - aBtnColHead.Enable(); - aBtnRowHead.Enable(); - aEdAssign2.Enable(); - aRbAssign2.Enable(); - } - else - { - aBtnAdd.Disable(); - aBtnColHead.Disable(); - aBtnRowHead.Disable(); - aEdAssign2.Disable(); - aRbAssign2.Disable(); - } - aBtnRemove.Disable(); - return 0; -} - - -/************************************************************************* -#* Handler: Range2DataModifyHdl Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Wird ausgeloest, wenn in der Tabelle, der Daten- -#* Bereich geaendert wurde -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScColRowNameRangesDlg, Range2DataModifyHdl, void *, EMPTYARG ) -{ - String aNewData( aEdAssign2.GetText() ); - if ( aNewData.Len() > 0 ) - { - ScRange aRange; - if ( (aRange.ParseAny( aNewData, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID ) - { - AdjustColRowData( aRange ); - aBtnAdd.Enable(); - } - else - aBtnAdd.Disable(); - } - else - { - aBtnAdd.Disable(); - } - return 0; -} - - -/************************************************************************* -#* Handler: ColClickHdl Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Radiobutton fuer Spalten wurde betaetigt, -#* die entsprechenden Einstellungen werden -#* vorgenommen -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScColRowNameRangesDlg, ColClickHdl, void *, EMPTYARG ) -{ - if ( !aBtnColHead.GetSavedValue() ) - { - aBtnColHead.Check( TRUE ); - aBtnRowHead.Check( FALSE ); - if ( theCurArea.aStart.Row() == 0 && theCurArea.aEnd.Row() == MAXROW ) - { - theCurArea.aEnd.SetRow( MAXROW - 1 ); - String aStr; - theCurArea.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() ); - aEdAssign.SetText( aStr ); - } - ScRange aRange( theCurData ); - aRange.aStart.SetRow( Min( (long)(theCurArea.aEnd.Row() + 1), (long)MAXROW ) ); - aRange.aEnd.SetRow( MAXROW ); - AdjustColRowData( aRange ); - } - return 0; -} - - -/************************************************************************* -#* Handler: RowClickHdl Datum:04.09.97 -#*------------------------------------------------------------------------ -#* -#* Klasse: ScColRowNameRangesDlg -#* -#* Funktion: Radiobutton fuer Zeilen wurde betaetigt, -#* die entsprechenden Einstellungen werden -#* vorgenommen -#* -#* Input: --- -#* -#* Output: --- -#* -#************************************************************************/ - -IMPL_LINK( ScColRowNameRangesDlg, RowClickHdl, void *, EMPTYARG ) -{ - if ( !aBtnRowHead.GetSavedValue() ) - { - aBtnRowHead.Check( TRUE ); - aBtnColHead.Check( FALSE ); - if ( theCurArea.aStart.Col() == 0 && theCurArea.aEnd.Col() == MAXCOL ) - { - theCurArea.aEnd.SetCol( MAXCOL - 1 ); - String aStr; - theCurArea.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() ); - aEdAssign.SetText( aStr ); - } - ScRange aRange( theCurData ); - aRange.aStart.SetCol( static_cast(Min( (long)(theCurArea.aEnd.Col() + 1), (long)MAXCOL )) ); - aRange.aEnd.SetCol( MAXCOL ); - AdjustColRowData( aRange ); - } - return 0; -} - - -IMPL_LINK( ScColRowNameRangesDlg, GetFocusHdl, Control*, pCtrl ) -{ - if( (pCtrl == (Control*)&aEdAssign) || (pCtrl == (Control*)&aRbAssign) ) - pEdActive = &aEdAssign; - else if( (pCtrl == (Control*)&aEdAssign2) || (pCtrl == (Control*)&aRbAssign2) ) - pEdActive = &aEdAssign2; - else - pEdActive = NULL; - - if( pEdActive ) - pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); - - return 0; -} - - -IMPL_LINK( ScColRowNameRangesDlg, LoseFocusHdl, Control*, EMPTYARG ) -{ - bDlgLostFocus = !IsActive(); - return 0; -} +/************************************************************************* + * + * 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: crnrdlg.cxx,v $ + * $Revision: 1.11 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + +// System - Includes --------------------------------------------------------- + + + +// INCLUDE ------------------------------------------------------------------- + +#include "reffact.hxx" +#include "document.hxx" +#include "scresid.hxx" +#include "globstr.hrc" +#include "crnrdlg.hrc" +#include "docsh.hxx" + +#define _CRNRDLG_CXX +#include "crnrdlg.hxx" +#undef _CRNRDLG_CXX +#include + + +//============================================================================ + +#define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute() +#define QUERYBOX(m) QueryBox(this,WinBits(WB_YES_NO|WB_DEF_YES),m).Execute() + +const ULONG nEntryDataCol = 0; +const ULONG nEntryDataRow = 1; +const ULONG nEntryDataDelim = 2; + + +//============================================================================ +// class ScColRowNameRangesDlg + + +/************************************************************************* +#* Member: ScColRowNameRangesDlg Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Konstruktor der Klasse ScColRowNameRangesDlg. +#* Initialisieren der Klassen- Mitglieder, +#* Uebernahme der Range- Angaben und Aufruf +#* der eigentlichen Initialisierungsroutine +#* +#* Input: Sfx- Verknuepfungen +#* Parent- Window +#* SCViewData +#* +#* Output: --- +#* +#************************************************************************/ + +ScColRowNameRangesDlg::ScColRowNameRangesDlg( SfxBindings* pB, + SfxChildWindow* pCW, + Window* pParent, + ScViewData* ptrViewData ) + + : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_COLROWNAMERANGES ), + // + aFlAssign ( this, ScResId( FL_ASSIGN ) ), + aLbRange ( this, ScResId( LB_RANGE ) ), + + aEdAssign ( this, ScResId( ED_AREA ) ), + aRbAssign ( this, ScResId( RB_AREA ), &aEdAssign, this ), + aBtnColHead ( this, ScResId( BTN_COLHEAD ) ), + aBtnRowHead ( this, ScResId( BTN_ROWHEAD ) ), + aFtAssign2 ( this, ScResId( FT_DATA_LABEL ) ), + aEdAssign2 ( this, ScResId( ED_DATA ) ), + aRbAssign2 ( this, ScResId( RB_DATA ), &aEdAssign2, this ), + + aBtnOk ( this, ScResId( BTN_OK ) ), + aBtnCancel ( this, ScResId( BTN_CANCEL ) ), + aBtnHelp ( this, ScResId( BTN_HELP ) ), + aBtnAdd ( this, ScResId( BTN_ADD ) ), + aBtnRemove ( this, ScResId( BTN_REMOVE ) ), + + pViewData ( ptrViewData ), + pDoc ( ptrViewData->GetDocument() ), + + pEdActive ( NULL ), + bDlgLostFocus ( FALSE ) +{ + xColNameRanges = pDoc->GetColNameRanges()->Clone(); + xRowNameRanges = pDoc->GetRowNameRanges()->Clone(); + Init(); + FreeResource(); +} + + +/************************************************************************* +#* Member: ~ScColRowNameRangesDlg Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Destruktor der Klasse +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +__EXPORT ScColRowNameRangesDlg::~ScColRowNameRangesDlg() +{ +} + + +/************************************************************************* +#* Member: Init Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Initialisierungs- Routine: +#* Umlenken der Event- Handler und einstellen der +#* Startparameter. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +void ScColRowNameRangesDlg::Init() +{ + SCCOL nStartCol = 0; + SCROW nStartRow = 0; + SCTAB nStartTab = 0; + SCCOL nEndCol = 0; + SCROW nEndRow = 0; + SCTAB nEndTab = 0; + + aBtnOk.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, OkBtnHdl ) ); + aBtnCancel.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, CancelBtnHdl ) ); + aBtnAdd.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, AddBtnHdl ) ); + aBtnRemove.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RemoveBtnHdl ) ); + aLbRange.SetSelectHdl ( LINK( this, ScColRowNameRangesDlg, Range1SelectHdl ) ); + aEdAssign.SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range1DataModifyHdl ) ); + aBtnColHead.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, ColClickHdl ) ); + aBtnRowHead.SetClickHdl ( LINK( this, ScColRowNameRangesDlg, RowClickHdl ) ); + aEdAssign2.SetModifyHdl ( LINK( this, ScColRowNameRangesDlg, Range2DataModifyHdl ) ); + + Link aLink = LINK( this, ScColRowNameRangesDlg, GetFocusHdl ); + aEdAssign.SetGetFocusHdl( aLink ); + aRbAssign.SetGetFocusHdl( aLink ); + aEdAssign2.SetGetFocusHdl( aLink ); + aRbAssign2.SetGetFocusHdl( aLink ); + + aLink = LINK( this, ScColRowNameRangesDlg, LoseFocusHdl ); + aEdAssign.SetLoseFocusHdl( aLink ); + aRbAssign.SetLoseFocusHdl( aLink ); + aEdAssign2.SetLoseFocusHdl( aLink ); + aRbAssign2.SetLoseFocusHdl( aLink ); + + pEdActive = &aEdAssign; + + UpdateNames(); + + if ( pViewData && pDoc ) + { + pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab, + nEndCol, nEndRow, nEndTab ); + SetColRowData( ScRange( ScAddress( nStartCol, nStartRow, nStartTab ), + ScAddress( nEndCol, nEndRow, nEndTab ) ) ); + } + else + { + aBtnColHead.Check( TRUE ); + aBtnRowHead.Check( FALSE ); + aEdAssign.SetText( EMPTY_STRING ); + aEdAssign2.SetText( EMPTY_STRING ); + } + + aLbRange.SetBorderStyle( WINDOW_BORDER_MONO ); + aBtnColHead.Enable(); + aBtnRowHead.Enable(); + aEdAssign.Enable(); + aEdAssign.GrabFocus(); + aRbAssign.Enable(); + //@BugID 54702 Enablen/Disablen nur noch in Basisklasse + //SFX_APPWINDOW->Enable(); // Ref-Feld hat Focus + + Range1SelectHdl( 0 ); +} + + +/************************************************************************* +#* Member: SetColRowData Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches +#* auf default Werte setzen und beide Referenz-Edit-Felder +#* fuellen. +#* +#* Input: Einstellbereich fuer Labels +#* +#* Output: --- +#* +#************************************************************************/ + +void ScColRowNameRangesDlg::SetColRowData( const ScRange& rLabelRange,BOOL bRef) +{ + theCurData = theCurArea = rLabelRange; + BOOL bValid = TRUE; + SCCOL nCol1 = theCurArea.aStart.Col(); + SCCOL nCol2 = theCurArea.aEnd.Col(); + SCROW nRow1 = theCurArea.aStart.Row(); + SCROW nRow2 = theCurArea.aEnd.Row(); + if ( (static_cast(nCol2 - nCol1) >= nRow2 - nRow1) || (nCol1 == 0 && nCol2 == MAXCOL) ) + { // Spaltenkoepfe und Grenzfall gesamte Tabelle + aBtnColHead.Check( TRUE ); + aBtnRowHead.Check( FALSE ); + if ( nRow2 == MAXROW ) + { + if ( nRow1 == 0 ) + bValid = FALSE; // Grenzfall gesamte Tabelle + else + { // Head unten, Data oben + theCurData.aStart.SetRow( 0 ); + theCurData.aEnd.SetRow( nRow1 - 1 ); + } + } + else + { // Head oben, Data unten + theCurData.aStart.SetRow( nRow2 + 1 ); + theCurData.aEnd.SetRow( MAXROW ); + } + } + else + { // Zeilenkoepfe + aBtnRowHead.Check( TRUE ); + aBtnColHead.Check( FALSE ); + if ( nCol2 == MAXCOL ) + { // Head rechts, Data links + theCurData.aStart.SetCol( 0 ); + theCurData.aEnd.SetCol( nCol2 - 1 ); + } + else + { // Head links, Data rechts + theCurData.aStart.SetCol( nCol2 + 1 ); + theCurData.aEnd.SetCol( MAXCOL ); + } + } + if ( bValid ) + { + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + String aStr; + theCurArea.Format( aStr, SCR_ABS_3D, pDoc, eConv ); + + if(bRef) + aEdAssign.SetRefString( aStr ); + else + aEdAssign.SetText( aStr ); + + aEdAssign.SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) ); + theCurData.Format( aStr, SCR_ABS_3D, pDoc, eConv ); + + if(bRef) + aEdAssign2.SetRefString( aStr ); + else + aEdAssign2.SetText( aStr ); + } + else + { + theCurData = theCurArea = ScRange(); + + if(bRef) + { + aEdAssign.SetRefString( EMPTY_STRING ); + aEdAssign2.SetRefString( EMPTY_STRING ); + } + else + { + aEdAssign.SetText( EMPTY_STRING ); + aEdAssign2.SetText( EMPTY_STRING ); + } + + aBtnColHead.Disable(); + aBtnRowHead.Disable(); + aEdAssign2.Disable(); + aRbAssign2.Disable(); + } +} + + +/************************************************************************* +#* Member: AdjustColRowData Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: zugehoerigen Datenbereich eines Beschriftungsbereiches +#* anpassen und Data-Referenz-Edit-Feld fuellen. +#* +#* Input: Bereich fuer Labels +#* +#* Output: --- +#* +#************************************************************************/ + +void ScColRowNameRangesDlg::AdjustColRowData( const ScRange& rDataRange,BOOL bRef) +{ + theCurData = rDataRange; + if ( aBtnColHead.IsChecked() ) + { // Datenbereich gleiche Spalten wie Koepfe + theCurData.aStart.SetCol( theCurArea.aStart.Col() ); + theCurData.aEnd.SetCol( theCurArea.aEnd.Col() ); + if ( theCurData.Intersects( theCurArea ) ) + { + SCROW nRow1 = theCurArea.aStart.Row(); + SCROW nRow2 = theCurArea.aEnd.Row(); + if ( nRow1 > 0 + && (theCurData.aEnd.Row() < nRow2 || nRow2 == MAXROW) ) + { // Data oben + theCurData.aEnd.SetRow( nRow1 - 1 ); + if ( theCurData.aStart.Row() > theCurData.aEnd.Row() ) + theCurData.aStart.SetRow( theCurData.aEnd.Row() ); + } + else + { // Data unten + theCurData.aStart.SetRow( nRow2 + 1 ); + if ( theCurData.aStart.Row() > theCurData.aEnd.Row() ) + theCurData.aEnd.SetRow( theCurData.aStart.Row() ); + } + } + } + else + { // Datenbereich gleiche Zeilen wie Koepfe + theCurData.aStart.SetRow( theCurArea.aStart.Row() ); + theCurData.aEnd.SetRow( theCurArea.aEnd.Row() ); + if ( theCurData.Intersects( theCurArea ) ) + { + SCCOL nCol1 = theCurArea.aStart.Col(); + SCCOL nCol2 = theCurArea.aEnd.Col(); + if ( nCol1 > 0 + && (theCurData.aEnd.Col() < nCol2 || nCol2 == MAXCOL) ) + { // Data links + theCurData.aEnd.SetCol( nCol1 - 1 ); + if ( theCurData.aStart.Col() > theCurData.aEnd.Col() ) + theCurData.aStart.SetCol( theCurData.aEnd.Col() ); + } + else + { // Data rechts + theCurData.aStart.SetCol( nCol2 + 1 ); + if ( theCurData.aStart.Col() > theCurData.aEnd.Col() ) + theCurData.aEnd.SetCol( theCurData.aStart.Col() ); + } + } + } + String aStr; + theCurData.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() ); + + if(bRef) + aEdAssign2.SetRefString( aStr ); + else + aEdAssign2.SetText( aStr ); + + aEdAssign2.SetSelection( Selection( SELECTION_MAX, SELECTION_MAX ) ); +} + + +/************************************************************************* +#* Member: SetReference Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Uebergabe eines mit der Maus selektierten Tabellen- +#* bereiches, der dann als neue Selektion im Referenz- +#* Fenster angezeigt wird. +#* +#* Input: Bereich fuer Labels +#* Dokumentklasse +#* +#* Output: --- +#* +#************************************************************************/ + +void ScColRowNameRangesDlg::SetReference( const ScRange& rRef, ScDocument* /* pDoc */ ) +{ + if ( pEdActive ) + { + if ( rRef.aStart != rRef.aEnd ) + RefInputStart( pEdActive ); + + String aRefStr; + if ( pEdActive == &aEdAssign ) + SetColRowData( rRef, TRUE ); + else + AdjustColRowData( rRef, TRUE ); + aBtnColHead.Enable(); + aBtnRowHead.Enable(); + aBtnAdd.Enable(); + aBtnRemove.Disable(); + } +} + + +/************************************************************************* +#* Member: Close Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Schliessen des Fensters +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +BOOL __EXPORT ScColRowNameRangesDlg::Close() +{ + return DoClose( ScColRowNameRangesDlgWrapper::GetChildWindowId() ); +} + + +/************************************************************************* +#* Member: SetActive Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Aktivieren des Fensters +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +void ScColRowNameRangesDlg::SetActive() +{ + if ( bDlgLostFocus ) + { + bDlgLostFocus = FALSE; + if( pEdActive ) + pEdActive->GrabFocus(); + } + else + GrabFocus(); + + if( pEdActive == &aEdAssign ) + Range1DataModifyHdl( 0 ); + else if( pEdActive == &aEdAssign2 ) + Range2DataModifyHdl( 0 ); + + RefInputDone(); +} + + +/************************************************************************* +#* Member: UpdateNames Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Aktualisieren der Namen +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +void ScColRowNameRangesDlg::UpdateNames() +{ + aLbRange.SetUpdateMode( FALSE ); + //----------------------------------------------------------- + aLbRange.Clear(); + aRangeMap.clear(); + aEdAssign.SetText( EMPTY_STRING ); + + ULONG nCount, j; + USHORT nPos; //@008 Hilfsvariable q eingefuegt + + SCCOL nCol1; //@008 04.09.97 + SCROW nRow1; //Erweiterung fuer Bereichsnamen + SCTAB nTab1; + SCCOL nCol2; + SCROW nRow2; + SCTAB nTab2; + String rString; + String strShow; + const ScAddress::Details aDetails(pDoc->GetAddressConvention()); + + String aString; + String strDelim = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( " --- " )); + aString = strDelim; + aString += ScGlobal::GetRscString( STR_COLUMN ); + aString += strDelim; + nPos = aLbRange.InsertEntry( aString ); + aLbRange.SetEntryData( nPos, (void*)nEntryDataDelim ); + if ( (nCount = xColNameRanges->Count()) > 0 ) + { + ScRangePair** ppSortArray = xColNameRanges->CreateNameSortedArray( + nCount, pDoc ); + for ( j=0; j < nCount; j++ ) + { + const ScRange aRange(ppSortArray[j]->GetRange(0)); + aRange.Format( aString, SCR_ABS_3D, pDoc, aDetails ); + + //@008 Hole Bereichsparameter aus Dok + ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1, + nCol2, nRow2, nTab2 ); + SCCOL q=nCol1+3; + if(q>nCol2) q=nCol2; + //@008 Baue String zusammen + strShow.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" [")); + if(pDoc!=NULL) + { + pDoc->GetString(nCol1, nRow1, nTab1,rString); + strShow +=rString; + for(SCCOL i=nCol1+1;i<=q;i++) + { + strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ")); + pDoc->GetString(i, nRow1, nTab1,rString); + strShow += rString; + } + } + if(qCount()) > 0 ) + { + ScRangePair** ppSortArray = xRowNameRanges->CreateNameSortedArray( + nCount, pDoc ); + for ( j=0; j < nCount; j++ ) + { + const ScRange aRange(ppSortArray[j]->GetRange(0)); + aRange.Format( aString, SCR_ABS_3D, pDoc, aDetails ); + + //@008 Ab hier baue String fuer Zeilen + ppSortArray[j]->GetRange(0).GetVars( nCol1, nRow1, nTab1, + nCol2, nRow2, nTab2 ); + SCROW q=nRow1+3; + if(q>nRow2) q=nRow2; + strShow.AssignAscii(RTL_CONSTASCII_STRINGPARAM(" [")); + if(pDoc!=NULL) + { + pDoc->GetString(nCol1, nRow1, nTab1,rString); + strShow += rString; + for(SCROW i=nRow1+1;i<=q;i++) + { + strShow.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ")); + pDoc->GetString(nCol1, i, nTab1,rString); + strShow += rString; + } + } + if(qFind( rRange )) != NULL ) + bFound = TRUE; + else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL ) + bFound = TRUE; + + if ( bFound ) + { + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + String aStr; + theCurArea = rRange; + theCurArea.Format( aStr, SCR_ABS_3D, pDoc, eConv ); + aEdAssign.SetText( aStr ); + aBtnAdd.Disable(); + aBtnRemove.Enable(); + aBtnColHead.Check( bColName ); + aBtnRowHead.Check( !bColName ); + theCurData = pPair->GetRange(1); + theCurData.Format( aStr, SCR_ABS_3D, pDoc, eConv ); + aEdAssign2.SetText( aStr ); + } + else + { + aBtnAdd.Enable(); + aBtnRemove.Disable(); + } + aBtnColHead.Enable(); + aBtnRowHead.Enable(); + aEdAssign2.Enable(); + aRbAssign2.Enable(); +} + + +/************************************************************************* +#* Member: IsRefInputMode Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Abfragefunktion fuer Referenz- Input- Mode. +#* +#* Input: Bereichs-String +#* Flag fuer Spalten +#* +#* Output: true, wenn Referenz- Input- Mode +#* +#************************************************************************/ + +BOOL ScColRowNameRangesDlg::IsRefInputMode() const +{ + return (pEdActive != NULL); +} + +//------------------------------------------------------------------------ +// Handler: +// ======== + +/************************************************************************* +#* Handler: OkBtnHdl Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Wird ausgeloest, wenn der OK- Button gedrueckt wurde. +#* Hinzufuegen- Button ausloesen, und die neu einge- +#* stellten Bereiche ans Dokument uebergeben. +#* Fensterschliessen- Anweisung ausloesen. +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScColRowNameRangesDlg, OkBtnHdl, void *, EMPTYARG ) +{ + AddBtnHdl( 0 ); + + // die RangeLists den Refs am Doc zuweisen + pDoc->GetColNameRangesRef() = xColNameRanges; + pDoc->GetRowNameRangesRef() = xRowNameRanges; + // geaenderte Datenbereiche muessen sich auswirken + pDoc->CompileColRowNameFormula(); + ScDocShell* pDocShell = pViewData->GetDocShell(); + pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID ); + pDocShell->SetDocumentModified(); + + Close(); + return 0; +} + + +/************************************************************************* +#* Handler: CancelBtnHdl Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Fensterschliessen- Anweisung ausloesen. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK_INLINE_START( ScColRowNameRangesDlg, CancelBtnHdl, void *, EMPTYARG ) +{ + Close(); + return 0; +} +IMPL_LINK_INLINE_END( ScColRowNameRangesDlg, CancelBtnHdl, void *, EMPTYARG ) + + +/************************************************************************* +#* Handler: AddBtnHdl Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Nach betaetigen des Hinzufuegen- Buttons, werden +#* die Bereichsangaben eingestellt und in der +#* Listbox dargestellt. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScColRowNameRangesDlg, AddBtnHdl, void *, EMPTYARG ) +{ + String aNewArea( aEdAssign.GetText() ); + String aNewData( aEdAssign2.GetText() ); + + if ( aNewArea.Len() > 0 && aNewData.Len() > 0 ) + { + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + ScRange aRange1, aRange2; + BOOL bOk1; + if ( (bOk1 = ((aRange1.ParseAny( aNewArea, pDoc, eConv ) & SCA_VALID) == SCA_VALID)) != FALSE + && ((aRange2.ParseAny( aNewData, pDoc, eConv ) & SCA_VALID) == SCA_VALID) ) + { + theCurArea = aRange1; + AdjustColRowData( aRange2 ); + ScRangePair* pPair; + if ( ( pPair = xColNameRanges->Find( theCurArea ) ) != NULL ) + { + xColNameRanges->Remove( pPair ); + delete pPair; + } + if ( ( pPair = xRowNameRanges->Find( theCurArea ) ) != NULL ) + { + xRowNameRanges->Remove( pPair ); + delete pPair; + } + if ( aBtnColHead.IsChecked() ) + xColNameRanges->Join( ScRangePair( theCurArea, theCurData ) ); + else + xRowNameRanges->Join( ScRangePair( theCurArea, theCurData ) ); + + UpdateNames(); + + aEdAssign.GrabFocus(); + aBtnAdd.Disable(); + aBtnRemove.Disable(); + aEdAssign.SetText( EMPTY_STRING ); + aBtnColHead.Check( TRUE ); + aBtnRowHead.Check( FALSE ); + aEdAssign2.SetText( EMPTY_STRING ); + theCurArea = ScRange(); + theCurData = theCurArea; + Range1SelectHdl( 0 ); + } + else + { + ERRORBOX( ScGlobal::GetRscString(STR_INVALIDTABNAME) ); + if ( !bOk1 ) + aEdAssign.GrabFocus(); + else + aEdAssign2.GrabFocus(); + } + } + return 0; +} + + +/************************************************************************* +#* Handler: RemoveBtnHdl Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Nach betaetigen des Loeschen- Buttons, wird +#* die markierte Bereichsangabe geloescht. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScColRowNameRangesDlg, RemoveBtnHdl, void *, EMPTYARG ) +{ + String aRangeStr = aLbRange.GetSelectEntry(); + USHORT nSelectPos = aLbRange.GetSelectEntryPos(); + BOOL bColName = + ((ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataCol); + NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr); + if (itr == aRangeMap.end()) + return 0; + const ScRange& rRange = itr->second; + + ScRangePair* pPair = NULL; + BOOL bFound = FALSE; + if ( bColName && (pPair = xColNameRanges->Find( rRange )) != NULL ) + bFound = TRUE; + else if ( !bColName && (pPair = xRowNameRanges->Find( rRange )) != NULL ) + bFound = TRUE; + if ( bFound ) + { + String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY ); + String aMsg = aStrDelMsg.GetToken( 0, '#' ); + + aMsg += aRangeStr; + aMsg += aStrDelMsg.GetToken( 1, '#' ); + + if ( RET_YES == QUERYBOX(aMsg) ) + { + if ( bColName ) + xColNameRanges->Remove( pPair ); + else + xRowNameRanges->Remove( pPair ); + delete pPair; + + UpdateNames(); + USHORT nCnt = aLbRange.GetEntryCount(); + if ( nSelectPos >= nCnt ) + { + if ( nCnt ) + nSelectPos = nCnt - 1; + else + nSelectPos = 0; + } + aLbRange.SelectEntryPos( nSelectPos ); + if ( nSelectPos && + (ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataDelim ) + aLbRange.SelectEntryPos( --nSelectPos ); // ---Zeile--- + + aLbRange.GrabFocus(); + aBtnAdd.Disable(); + aBtnRemove.Disable(); + aEdAssign.SetText( EMPTY_STRING ); + theCurArea = theCurData = ScRange(); + aBtnColHead.Check( TRUE ); + aBtnRowHead.Check( FALSE ); + aEdAssign2.SetText( EMPTY_STRING ); + Range1SelectHdl( 0 ); + } + } + return 0; +} + + +/************************************************************************* +#* Handler: Range1SelectHdl Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Wenn Zeile in Listbox ausgewaehlt wird, +#* werden die Eingabefelder entsprechend +#* eingestellt. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScColRowNameRangesDlg, Range1SelectHdl, void *, EMPTYARG ) +{ + USHORT nSelectPos = aLbRange.GetSelectEntryPos(); + USHORT nCnt = aLbRange.GetEntryCount(); + USHORT nMoves = 0; + while ( nSelectPos < nCnt + && (ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataDelim ) + { // skip Delimiter + ++nMoves; + aLbRange.SelectEntryPos( ++nSelectPos ); + } + String aRangeStr = aLbRange.GetSelectEntry(); + if ( nMoves ) + { + if ( nSelectPos > 1 && nSelectPos >= nCnt ) + { // am Ende nicht auf dem " --- Zeile --- " Delimiter stehenbleiben + // wenn davor Eintraege existieren + nSelectPos = nCnt - 2; + aLbRange.SelectEntryPos( nSelectPos ); + aRangeStr = aLbRange.GetSelectEntry(); + } + else if ( nSelectPos > 2 && nSelectPos < nCnt && aRangeStr.Len() + && aRangeStr == aEdAssign.GetText() ) + { // nach oben wandern statt nach unten auf die vorherige Position + nSelectPos -= 2; + aLbRange.SelectEntryPos( nSelectPos ); + aRangeStr = aLbRange.GetSelectEntry(); + } + } + NameRangeMap::const_iterator itr = aRangeMap.find(aRangeStr); + if ( itr != aRangeMap.end() ) + { + BOOL bColName = + ((ULONG)aLbRange.GetEntryData( nSelectPos ) == nEntryDataCol); + UpdateRangeData( itr->second, bColName ); + aBtnAdd.Disable(); + aBtnRemove.Enable(); + } + else + { + if ( aEdAssign.GetText().Len() > 0 ) + { + if ( aEdAssign2.GetText().Len() > 0 ) + aBtnAdd.Enable(); + else + aBtnAdd.Disable(); + aBtnColHead.Enable(); + aBtnRowHead.Enable(); + aEdAssign2.Enable(); + aRbAssign2.Enable(); + } + else + { + aBtnAdd.Disable(); + aBtnColHead.Disable(); + aBtnRowHead.Disable(); + aEdAssign2.Disable(); + aRbAssign2.Disable(); + } + aBtnRemove.Disable(); + aEdAssign.GrabFocus(); + } + + aEdAssign.Enable(); + aRbAssign.Enable(); + + //@BugID 54702 Enablen/Disablen nur noch in Basisklasse + //SFX_APPWINDOW->Enable(); + return 0; +} + + +/************************************************************************* +#* Handler: Range1DataModifyHdl Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Wird ausgeloest, wenn in der Tabelle, der Label- +#* Bereich geaendert wurde. +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScColRowNameRangesDlg, Range1DataModifyHdl, void *, EMPTYARG ) +{ + String aNewArea( aEdAssign.GetText() ); + BOOL bValid = FALSE; + if ( aNewArea.Len() > 0 ) + { + ScRange aRange; + if ( (aRange.ParseAny( aNewArea, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID ) + { + SetColRowData( aRange ); + bValid = TRUE; + } + } + if ( bValid ) + { + aBtnAdd.Enable(); + aBtnColHead.Enable(); + aBtnRowHead.Enable(); + aEdAssign2.Enable(); + aRbAssign2.Enable(); + } + else + { + aBtnAdd.Disable(); + aBtnColHead.Disable(); + aBtnRowHead.Disable(); + aEdAssign2.Disable(); + aRbAssign2.Disable(); + } + aBtnRemove.Disable(); + return 0; +} + + +/************************************************************************* +#* Handler: Range2DataModifyHdl Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Wird ausgeloest, wenn in der Tabelle, der Daten- +#* Bereich geaendert wurde +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScColRowNameRangesDlg, Range2DataModifyHdl, void *, EMPTYARG ) +{ + String aNewData( aEdAssign2.GetText() ); + if ( aNewData.Len() > 0 ) + { + ScRange aRange; + if ( (aRange.ParseAny( aNewData, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID) == SCA_VALID ) + { + AdjustColRowData( aRange ); + aBtnAdd.Enable(); + } + else + aBtnAdd.Disable(); + } + else + { + aBtnAdd.Disable(); + } + return 0; +} + + +/************************************************************************* +#* Handler: ColClickHdl Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Radiobutton fuer Spalten wurde betaetigt, +#* die entsprechenden Einstellungen werden +#* vorgenommen +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScColRowNameRangesDlg, ColClickHdl, void *, EMPTYARG ) +{ + if ( !aBtnColHead.GetSavedValue() ) + { + aBtnColHead.Check( TRUE ); + aBtnRowHead.Check( FALSE ); + if ( theCurArea.aStart.Row() == 0 && theCurArea.aEnd.Row() == MAXROW ) + { + theCurArea.aEnd.SetRow( MAXROW - 1 ); + String aStr; + theCurArea.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() ); + aEdAssign.SetText( aStr ); + } + ScRange aRange( theCurData ); + aRange.aStart.SetRow( Min( (long)(theCurArea.aEnd.Row() + 1), (long)MAXROW ) ); + aRange.aEnd.SetRow( MAXROW ); + AdjustColRowData( aRange ); + } + return 0; +} + + +/************************************************************************* +#* Handler: RowClickHdl Datum:04.09.97 +#*------------------------------------------------------------------------ +#* +#* Klasse: ScColRowNameRangesDlg +#* +#* Funktion: Radiobutton fuer Zeilen wurde betaetigt, +#* die entsprechenden Einstellungen werden +#* vorgenommen +#* +#* Input: --- +#* +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( ScColRowNameRangesDlg, RowClickHdl, void *, EMPTYARG ) +{ + if ( !aBtnRowHead.GetSavedValue() ) + { + aBtnRowHead.Check( TRUE ); + aBtnColHead.Check( FALSE ); + if ( theCurArea.aStart.Col() == 0 && theCurArea.aEnd.Col() == MAXCOL ) + { + theCurArea.aEnd.SetCol( MAXCOL - 1 ); + String aStr; + theCurArea.Format( aStr, SCR_ABS_3D, pDoc, pDoc->GetAddressConvention() ); + aEdAssign.SetText( aStr ); + } + ScRange aRange( theCurData ); + aRange.aStart.SetCol( static_cast(Min( (long)(theCurArea.aEnd.Col() + 1), (long)MAXCOL )) ); + aRange.aEnd.SetCol( MAXCOL ); + AdjustColRowData( aRange ); + } + return 0; +} + + +IMPL_LINK( ScColRowNameRangesDlg, GetFocusHdl, Control*, pCtrl ) +{ + if( (pCtrl == (Control*)&aEdAssign) || (pCtrl == (Control*)&aRbAssign) ) + pEdActive = &aEdAssign; + else if( (pCtrl == (Control*)&aEdAssign2) || (pCtrl == (Control*)&aRbAssign2) ) + pEdActive = &aEdAssign2; + else + pEdActive = NULL; + + if( pEdActive ) + pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); + + return 0; +} + + +IMPL_LINK( ScColRowNameRangesDlg, LoseFocusHdl, Control*, EMPTYARG ) +{ + bDlgLostFocus = !IsActive(); + return 0; +} diff --git a/sc/source/ui/miscdlgs/optsolver.cxx b/sc/source/ui/miscdlgs/optsolver.cxx index e7e902caecd6..6fa5ba1d7098 100644 --- a/sc/source/ui/miscdlgs/optsolver.cxx +++ b/sc/source/ui/miscdlgs/optsolver.cxx @@ -1,1069 +1,1069 @@ -/************************************************************************* - * - * 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: optsolver.cxx,v $ - * $Revision: 1.5 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -//---------------------------------------------------------------------------- - -#include "rangelst.hxx" -#include "scitems.hxx" -#include -#include -#include -#include -#include - -#include "uiitems.hxx" -#include "reffact.hxx" -#include "docsh.hxx" -#include "docfunc.hxx" -#include "cell.hxx" -#include "rangeutl.hxx" -#include "scresid.hxx" -#include "convuno.hxx" -#include "unonames.hxx" -#include "solveroptions.hxx" -#include "solverutil.hxx" -#include "optsolver.hrc" - -#include "optsolver.hxx" - -#include -#include - -using namespace com::sun::star; - -//---------------------------------------------------------------------------- - -ScSolverProgressDialog::ScSolverProgressDialog( Window* pParent ) - : ModelessDialog( pParent, ScResId( RID_SCDLG_SOLVER_PROGRESS ) ), - maFtProgress ( this, ScResId( FT_PROGRESS ) ), - maFtTime ( this, ScResId( FT_TIMELIMIT ) ), - maFlButtons ( this, ScResId( FL_BUTTONS ) ), - maBtnOk ( this, ScResId( BTN_OK ) ) -{ - maBtnOk.Enable(FALSE); - FreeResource(); -} - -ScSolverProgressDialog::~ScSolverProgressDialog() -{ -} - -void ScSolverProgressDialog::HideTimeLimit() -{ - maFtTime.Hide(); -} - -void ScSolverProgressDialog::SetTimeLimit( sal_Int32 nSeconds ) -{ - String aOld = maFtTime.GetText(); - String aNew = aOld.GetToken(0,'#'); - aNew += String::CreateFromInt32( nSeconds ); - aNew += aOld.GetToken(1,'#'); - maFtTime.SetText( aNew ); -} - -//---------------------------------------------------------------------------- - -ScSolverNoSolutionDialog::ScSolverNoSolutionDialog( Window* pParent, const String& rErrorText ) - : ModalDialog( pParent, ScResId( RID_SCDLG_SOLVER_NOSOLUTION ) ), - maFtNoSolution ( this, ScResId( FT_NOSOLUTION ) ), - maFtErrorText ( this, ScResId( FT_ERRORTEXT ) ), - maFlButtons ( this, ScResId( FL_BUTTONS ) ), - maBtnOk ( this, ScResId( BTN_OK ) ) -{ - maFtErrorText.SetText( rErrorText ); - FreeResource(); -} - -ScSolverNoSolutionDialog::~ScSolverNoSolutionDialog() -{ -} - -//---------------------------------------------------------------------------- - -ScSolverSuccessDialog::ScSolverSuccessDialog( Window* pParent, const String& rSolution ) - : ModalDialog( pParent, ScResId( RID_SCDLG_SOLVER_SUCCESS ) ), - maFtSuccess ( this, ScResId( FT_SUCCESS ) ), - maFtResult ( this, ScResId( FT_RESULT ) ), - maFtQuestion ( this, ScResId( FT_QUESTION ) ), - maFlButtons ( this, ScResId( FL_BUTTONS ) ), - maBtnOk ( this, ScResId( BTN_OK ) ), - maBtnCancel ( this, ScResId( BTN_CANCEL ) ) -{ - String aMessage = maFtResult.GetText(); - aMessage.Append( (sal_Char) ' ' ); - aMessage.Append( rSolution ); - maFtResult.SetText( aMessage ); - FreeResource(); -} - -ScSolverSuccessDialog::~ScSolverSuccessDialog() -{ -} - -//---------------------------------------------------------------------------- - -ScCursorRefEdit::ScCursorRefEdit( ScAnyRefDlg* pParent, const ResId& rResId ) : - formula::RefEdit( pParent, rResId ) -{ -} - -void ScCursorRefEdit::SetCursorLinks( const Link& rUp, const Link& rDown ) -{ - maCursorUpLink = rUp; - maCursorDownLink = rDown; -} - -void ScCursorRefEdit::KeyInput( const KeyEvent& rKEvt ) -{ - KeyCode aCode = rKEvt.GetKeyCode(); - bool bUp = (aCode.GetCode() == KEY_UP); - bool bDown = (aCode.GetCode() == KEY_DOWN); - if ( !aCode.IsShift() && !aCode.IsMod1() && !aCode.IsMod2() && ( bUp || bDown ) ) - { - if ( bUp ) - maCursorUpLink.Call( this ); - else - maCursorDownLink.Call( this ); - } - else - formula::RefEdit::KeyInput( rKEvt ); -} - -//---------------------------------------------------------------------------- - -ScOptSolverSave::ScOptSolverSave( const String& rObjective, BOOL bMax, BOOL bMin, BOOL bValue, - const String& rTarget, const String& rVariable, - const std::vector& rConditions, - const String& rEngine, - const uno::Sequence& rProperties ) : - maObjective( rObjective ), - mbMax( bMax ), - mbMin( bMin ), - mbValue( bValue ), - maTarget( rTarget ), - maVariable( rVariable ), - maConditions( rConditions ), - maEngine( rEngine ), - maProperties( rProperties ) -{ -} - -//============================================================================ -// class ScOptSolverDlg -//---------------------------------------------------------------------------- - -ScOptSolverDlg::ScOptSolverDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, - ScDocShell* pDocSh, ScAddress aCursorPos ) - - : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_OPTSOLVER ), - // - maFtObjectiveCell ( this, ScResId( FT_OBJECTIVECELL ) ), - maEdObjectiveCell ( this, ScResId( ED_OBJECTIVECELL ) ), - maRBObjectiveCell ( this, ScResId( IB_OBJECTIVECELL ), &maEdObjectiveCell, this ), - maFtDirection ( this, ScResId( FT_DIRECTION ) ), - maRbMax ( this, ScResId( RB_MAX ) ), - maRbMin ( this, ScResId( RB_MIN ) ), - maRbValue ( this, ScResId( RB_VALUE ) ), - maEdTargetValue ( this, ScResId( ED_TARGET ) ), - maRBTargetValue ( this, ScResId( IB_TARGET ), &maEdTargetValue, this ), - maFtVariableCells ( this, ScResId( FT_VARIABLECELLS ) ), - maEdVariableCells ( this, ScResId( ED_VARIABLECELLS ) ), - maRBVariableCells ( this, ScResId( IB_VARIABLECELLS ), &maEdVariableCells, this), - maFlConditions ( this, ScResId( FL_CONDITIONS ) ), - maFtCellRef ( this, ScResId( FT_CELLREF ) ), - maEdLeft1 ( this, ScResId( ED_LEFT1 ) ), - maRBLeft1 ( this, ScResId( IB_LEFT1 ), &maEdLeft1, this ), - maFtOperator ( this, ScResId( FT_OPERATOR ) ), - maLbOp1 ( this, ScResId( LB_OP1 ) ), - maFtConstraint ( this, ScResId( FT_CONSTRAINT ) ), - maEdRight1 ( this, ScResId( ED_RIGHT1 ) ), - maRBRight1 ( this, ScResId( IB_RIGHT1 ), &maEdRight1, this ), - maBtnDel1 ( this, ScResId( IB_DELETE1 ) ), - maEdLeft2 ( this, ScResId( ED_LEFT2 ) ), - maRBLeft2 ( this, ScResId( IB_LEFT2 ), &maEdLeft2, this ), - maLbOp2 ( this, ScResId( LB_OP2 ) ), - maEdRight2 ( this, ScResId( ED_RIGHT2 ) ), - maRBRight2 ( this, ScResId( IB_RIGHT2 ), &maEdRight2, this ), - maBtnDel2 ( this, ScResId( IB_DELETE2 ) ), - maEdLeft3 ( this, ScResId( ED_LEFT3 ) ), - maRBLeft3 ( this, ScResId( IB_LEFT3 ), &maEdLeft3, this ), - maLbOp3 ( this, ScResId( LB_OP3 ) ), - maEdRight3 ( this, ScResId( ED_RIGHT3 ) ), - maRBRight3 ( this, ScResId( IB_RIGHT3 ), &maEdRight3, this ), - maBtnDel3 ( this, ScResId( IB_DELETE3 ) ), - maEdLeft4 ( this, ScResId( ED_LEFT4 ) ), - maRBLeft4 ( this, ScResId( IB_LEFT4 ), &maEdLeft4, this ), - maLbOp4 ( this, ScResId( LB_OP4 ) ), - maEdRight4 ( this, ScResId( ED_RIGHT4 ) ), - maRBRight4 ( this, ScResId( IB_RIGHT4 ), &maEdRight4, this ), - maBtnDel4 ( this, ScResId( IB_DELETE4 ) ), - maScrollBar ( this, ScResId( SB_SCROLL ) ), - maFlButtons ( this, ScResId( FL_BUTTONS ) ), - maBtnOpt ( this, ScResId( BTN_OPTIONS ) ), - maBtnHelp ( this, ScResId( BTN_HELP ) ), - maBtnCancel ( this, ScResId( BTN_CLOSE ) ), - maBtnSolve ( this, ScResId( BTN_SOLVE ) ), - maInputError ( ScResId( STR_INVALIDINPUT ) ), - maConditionError ( ScResId( STR_INVALIDCONDITION ) ), - // - mpDocShell ( pDocSh ), - mpDoc ( pDocSh->GetDocument() ), - mnCurTab ( aCursorPos.Tab() ), - mpEdActive ( NULL ), - mbDlgLostFocus ( false ), - nScrollPos ( 0 ) -{ - mpLeftEdit[0] = &maEdLeft1; - mpLeftButton[0] = &maRBLeft1; - mpRightEdit[0] = &maEdRight1; - mpRightButton[0] = &maRBRight1; - mpOperator[0] = &maLbOp1; - mpDelButton[0] = &maBtnDel1; - - mpLeftEdit[1] = &maEdLeft2; - mpLeftButton[1] = &maRBLeft2; - mpRightEdit[1] = &maEdRight2; - mpRightButton[1] = &maRBRight2; - mpOperator[1] = &maLbOp2; - mpDelButton[1] = &maBtnDel2; - - mpLeftEdit[2] = &maEdLeft3; - mpLeftButton[2] = &maRBLeft3; - mpRightEdit[2] = &maEdRight3; - mpRightButton[2] = &maRBRight3; - mpOperator[2] = &maLbOp3; - mpDelButton[2] = &maBtnDel3; - - mpLeftEdit[3] = &maEdLeft4; - mpLeftButton[3] = &maRBLeft4; - mpRightEdit[3] = &maEdRight4; - mpRightButton[3] = &maRBRight4; - mpOperator[3] = &maLbOp4; - mpDelButton[3] = &maBtnDel4; - - Init( aCursorPos ); - FreeResource(); -} - -//---------------------------------------------------------------------------- - -ScOptSolverDlg::~ScOptSolverDlg() -{ -} - -//---------------------------------------------------------------------------- - -void ScOptSolverDlg::Init(const ScAddress& rCursorPos) -{ - // Get the "Delete Rows" commandimagelist images from sfx instead of - // adding a second copy to sc (see ScTbxInsertCtrl::StateChanged) - - rtl::OUString aSlotURL( RTL_CONSTASCII_USTRINGPARAM( "slot:" )); - aSlotURL += rtl::OUString::valueOf( sal_Int32( SID_DEL_ROWS ) ); - uno::Reference xFrame = GetBindings().GetActiveFrame(); - Image aDelNm = ::GetImage( xFrame, aSlotURL, FALSE, FALSE ); - Image aDelHC = ::GetImage( xFrame, aSlotURL, FALSE, TRUE ); // high contrast - - for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) - { - mpDelButton[nRow]->SetModeImage( aDelNm, BMP_COLOR_NORMAL ); - mpDelButton[nRow]->SetModeImage( aDelHC, BMP_COLOR_HIGHCONTRAST ); - } - - maBtnOpt.SetClickHdl( LINK( this, ScOptSolverDlg, BtnHdl ) ); - maBtnCancel.SetClickHdl( LINK( this, ScOptSolverDlg, BtnHdl ) ); - maBtnSolve.SetClickHdl( LINK( this, ScOptSolverDlg, BtnHdl ) ); - - Link aLink = LINK( this, ScOptSolverDlg, GetFocusHdl ); - maEdObjectiveCell.SetGetFocusHdl( aLink ); - maRBObjectiveCell.SetGetFocusHdl( aLink ); - maEdTargetValue.SetGetFocusHdl( aLink ); - maRBTargetValue.SetGetFocusHdl( aLink ); - maEdVariableCells.SetGetFocusHdl( aLink ); - maRBVariableCells.SetGetFocusHdl( aLink ); - maRbValue.SetGetFocusHdl( aLink ); - for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) - { - mpLeftEdit[nRow]->SetGetFocusHdl( aLink ); - mpLeftButton[nRow]->SetGetFocusHdl( aLink ); - mpRightEdit[nRow]->SetGetFocusHdl( aLink ); - mpRightButton[nRow]->SetGetFocusHdl( aLink ); - mpOperator[nRow]->SetGetFocusHdl( aLink ); - } - - aLink = LINK( this, ScOptSolverDlg, LoseFocusHdl ); - maEdObjectiveCell.SetLoseFocusHdl( aLink ); - maRBObjectiveCell.SetLoseFocusHdl( aLink ); - maEdTargetValue. SetLoseFocusHdl( aLink ); - maRBTargetValue. SetLoseFocusHdl( aLink ); - maEdVariableCells.SetLoseFocusHdl( aLink ); - maRBVariableCells.SetLoseFocusHdl( aLink ); - for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) - { - mpLeftEdit[nRow]->SetLoseFocusHdl( aLink ); - mpLeftButton[nRow]->SetLoseFocusHdl( aLink ); - mpRightEdit[nRow]->SetLoseFocusHdl( aLink ); - mpRightButton[nRow]->SetLoseFocusHdl( aLink ); - } - - Link aCursorUp = LINK( this, ScOptSolverDlg, CursorUpHdl ); - Link aCursorDown = LINK( this, ScOptSolverDlg, CursorDownHdl ); - Link aCondModify = LINK( this, ScOptSolverDlg, CondModifyHdl ); - for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) - { - mpLeftEdit[nRow]->SetCursorLinks( aCursorUp, aCursorDown ); - mpRightEdit[nRow]->SetCursorLinks( aCursorUp, aCursorDown ); - mpLeftEdit[nRow]->SetModifyHdl( aCondModify ); - mpRightEdit[nRow]->SetModifyHdl( aCondModify ); - mpDelButton[nRow]->SetClickHdl( LINK( this, ScOptSolverDlg, DelBtnHdl ) ); - mpOperator[nRow]->SetSelectHdl( LINK( this, ScOptSolverDlg, SelectHdl ) ); - } - maEdTargetValue.SetModifyHdl( LINK( this, ScOptSolverDlg, TargetModifyHdl ) ); - - maScrollBar.SetEndScrollHdl( LINK( this, ScOptSolverDlg, ScrollHdl ) ); - maScrollBar.SetScrollHdl( LINK( this, ScOptSolverDlg, ScrollHdl ) ); - - maScrollBar.SetPageSize( EDIT_ROW_COUNT ); - maScrollBar.SetVisibleSize( EDIT_ROW_COUNT ); - maScrollBar.SetLineSize( 1 ); - // Range is set in ShowConditions - - // get available solver implementations - //! sort by descriptions? - ScSolverUtil::GetImplementations( maImplNames, maDescriptions ); - sal_Int32 nImplCount = maImplNames.getLength(); - - const ScOptSolverSave* pOldData = mpDocShell->GetSolverSaveData(); - if ( pOldData ) - { - maEdObjectiveCell.SetRefString( pOldData->GetObjective() ); - maRbMax.Check( pOldData->GetMax() ); - maRbMin.Check( pOldData->GetMin() ); - maRbValue.Check( pOldData->GetValue() ); - maEdTargetValue.SetRefString( pOldData->GetTarget() ); - maEdVariableCells.SetRefString( pOldData->GetVariable() ); - maConditions = pOldData->GetConditions(); - maEngine = pOldData->GetEngine(); - maProperties = pOldData->GetProperties(); - } - else - { - maRbMax.Check(); - String aCursorStr; - if ( !mpDoc->GetRangeAtBlock( ScRange(rCursorPos), &aCursorStr ) ) - rCursorPos.Format( aCursorStr, SCA_ABS, NULL, mpDoc->GetAddressConvention() ); - maEdObjectiveCell.SetRefString( aCursorStr ); - if ( nImplCount > 0 ) - maEngine = maImplNames[0]; // use first implementation - } - ShowConditions(); - - maEdObjectiveCell.GrabFocus(); - mpEdActive = &maEdObjectiveCell; -} - -//---------------------------------------------------------------------------- - -void ScOptSolverDlg::ReadConditions() -{ - for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) - { - ScOptConditionRow aRowEntry; - aRowEntry.aLeftStr = mpLeftEdit[nRow]->GetText(); - aRowEntry.aRightStr = mpRightEdit[nRow]->GetText(); - aRowEntry.nOperator = mpOperator[nRow]->GetSelectEntryPos(); - - long nVecPos = nScrollPos + nRow; - if ( nVecPos >= (long)maConditions.size() && !aRowEntry.IsDefault() ) - maConditions.resize( nVecPos + 1 ); - - if ( nVecPos < (long)maConditions.size() ) - maConditions[nVecPos] = aRowEntry; - - // remove default entries at the end - size_t nSize = maConditions.size(); - while ( nSize > 0 && maConditions[ nSize-1 ].IsDefault() ) - --nSize; - maConditions.resize( nSize ); - } -} - -void ScOptSolverDlg::ShowConditions() -{ - for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) - { - ScOptConditionRow aRowEntry; - - long nVecPos = nScrollPos + nRow; - if ( nVecPos < (long)maConditions.size() ) - aRowEntry = maConditions[nVecPos]; - - mpLeftEdit[nRow]->SetRefString( aRowEntry.aLeftStr ); - mpRightEdit[nRow]->SetRefString( aRowEntry.aRightStr ); - mpOperator[nRow]->SelectEntryPos( aRowEntry.nOperator ); - } - - // allow to scroll one page behind the visible or stored rows - long nVisible = nScrollPos + EDIT_ROW_COUNT; - long nMax = std::max( nVisible, (long) maConditions.size() ); - maScrollBar.SetRange( Range( 0, nMax + EDIT_ROW_COUNT ) ); - maScrollBar.SetThumbPos( nScrollPos ); - - EnableButtons(); -} - -void ScOptSolverDlg::EnableButtons() -{ - for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) - { - long nVecPos = nScrollPos + nRow; - mpDelButton[nRow]->Enable( nVecPos < (long)maConditions.size() ); - } -} - -//---------------------------------------------------------------------------- - -BOOL ScOptSolverDlg::Close() -{ - return DoClose( ScOptSolverDlgWrapper::GetChildWindowId() ); -} - -//---------------------------------------------------------------------------- - -void ScOptSolverDlg::SetActive() -{ - if ( mbDlgLostFocus ) - { - mbDlgLostFocus = false; - if( mpEdActive ) - mpEdActive->GrabFocus(); - } - else - { - GrabFocus(); - } - RefInputDone(); -} - -//---------------------------------------------------------------------------- - -void ScOptSolverDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) -{ - if( mpEdActive ) - { - if ( rRef.aStart != rRef.aEnd ) - RefInputStart(mpEdActive); - - // "target"/"value": single cell - bool bSingle = ( mpEdActive == &maEdObjectiveCell || mpEdActive == &maEdTargetValue ); - - String aStr; - ScAddress aAdr = rRef.aStart; - ScRange aNewRef( rRef ); - if ( bSingle ) - aNewRef.aEnd = aAdr; - - String aName; - if ( pDocP->GetRangeAtBlock( aNewRef, &aName ) ) // named range: show name - aStr = aName; - else // format cell/range reference - { - USHORT nFmt = ( aAdr.Tab() == mnCurTab ) ? SCA_ABS : SCA_ABS_3D; - if ( bSingle ) - aAdr.Format( aStr, nFmt, pDocP, pDocP->GetAddressConvention() ); - else - rRef.Format( aStr, nFmt | SCR_ABS, pDocP, pDocP->GetAddressConvention() ); - } - - // variable cells can be several ranges, so only the selection is replaced - if ( mpEdActive == &maEdVariableCells ) - { - String aVal = mpEdActive->GetText(); - Selection aSel = mpEdActive->GetSelection(); - aSel.Justify(); - aVal.Erase( (xub_StrLen)aSel.Min(), (xub_StrLen)aSel.Len() ); - aVal.Insert( aStr, (xub_StrLen)aSel.Min() ); - Selection aNewSel( aSel.Min(), aSel.Min()+aStr.Len() ); - mpEdActive->SetRefString( aVal ); - mpEdActive->SetSelection( aNewSel ); - } - else - mpEdActive->SetRefString( aStr ); - - ReadConditions(); - EnableButtons(); - - // select "Value of" if a ref is input into "target" edit - if ( mpEdActive == &maEdTargetValue ) - maRbValue.Check(); - } -} - -//---------------------------------------------------------------------------- - -BOOL ScOptSolverDlg::IsRefInputMode() const -{ - return mpEdActive != NULL; -} - -//---------------------------------------------------------------------------- -// Handler: - -IMPL_LINK( ScOptSolverDlg, BtnHdl, PushButton*, pBtn ) -{ - if ( pBtn == &maBtnSolve || pBtn == &maBtnCancel ) - { - bool bSolve = ( pBtn == &maBtnSolve ); - - SetDispatcherLock( FALSE ); - SwitchToDocument(); - - bool bClose = true; - if ( bSolve ) - bClose = CallSolver(); - - if ( bClose ) - { - // Close: write dialog settings to DocShell for subsequent calls - ReadConditions(); - ScOptSolverSave aSave( - maEdObjectiveCell.GetText(), maRbMax.IsChecked(), maRbMin.IsChecked(), maRbValue.IsChecked(), - maEdTargetValue.GetText(), maEdVariableCells.GetText(), maConditions, maEngine, maProperties ); - mpDocShell->SetSolverSaveData( aSave ); - Close(); - } - else - { - // no solution -> dialog is kept open - SetDispatcherLock( TRUE ); - } - } - else if ( pBtn == &maBtnOpt ) - { - //! move options dialog to UI lib? - ScSolverOptionsDialog* pOptDlg = - new ScSolverOptionsDialog( this, maImplNames, maDescriptions, maEngine, maProperties ); - if ( pOptDlg->Execute() == RET_OK ) - { - maEngine = pOptDlg->GetEngine(); - maProperties = pOptDlg->GetProperties(); - } - delete pOptDlg; - } - - return 0; -} - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScOptSolverDlg, GetFocusHdl, Control*, pCtrl ) -{ - Edit* pEdit = NULL; - mpEdActive = NULL; - - if( pCtrl == &maEdObjectiveCell || pCtrl == &maRBObjectiveCell ) - pEdit = mpEdActive = &maEdObjectiveCell; - else if( pCtrl == &maEdTargetValue || pCtrl == &maRBTargetValue ) - pEdit = mpEdActive = &maEdTargetValue; - else if( pCtrl == &maEdVariableCells || pCtrl == &maRBVariableCells ) - pEdit = mpEdActive = &maEdVariableCells; - for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) - { - if( pCtrl == mpLeftEdit[nRow] || pCtrl == mpLeftButton[nRow] ) - pEdit = mpEdActive = mpLeftEdit[nRow]; - else if( pCtrl == mpRightEdit[nRow] || pCtrl == mpRightButton[nRow] ) - pEdit = mpEdActive = mpRightEdit[nRow]; - else if( pCtrl == mpOperator[nRow] ) // focus on "operator" list box - mpEdActive = mpRightEdit[nRow]; // use right edit for ref input, but don't change selection - } - if( pCtrl == &maRbValue ) // focus on "Value of" radio button - mpEdActive = &maEdTargetValue; // use value edit for ref input, but don't change selection - - if( pEdit ) - pEdit->SetSelection( Selection( 0, SELECTION_MAX ) ); - - return 0; -} - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScOptSolverDlg, LoseFocusHdl, Control*, EMPTYARG ) -{ - mbDlgLostFocus = !IsActive(); - return 0; -} - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScOptSolverDlg, DelBtnHdl, PushButton*, pBtn ) -{ - for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) - if( pBtn == mpDelButton[nRow] ) - { - BOOL bHadFocus = pBtn->HasFocus(); - - ReadConditions(); - long nVecPos = nScrollPos + nRow; - if ( nVecPos < (long)maConditions.size() ) - { - maConditions.erase( maConditions.begin() + nVecPos ); - ShowConditions(); - - if ( bHadFocus && !pBtn->IsEnabled() ) - { - // If the button is disabled, focus would normally move to the next control, - // (left edit of the next row). Move it to left edit of this row instead. - - mpEdActive = mpLeftEdit[nRow]; - mpEdActive->GrabFocus(); - } - } - } - - return 0; -} - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScOptSolverDlg, TargetModifyHdl, Edit*, EMPTYARG ) -{ - // modify handler for the target edit: - // select "Value of" if something is input into the edit - if ( maEdTargetValue.GetText().Len() ) - maRbValue.Check(); - return 0; -} - -IMPL_LINK( ScOptSolverDlg, CondModifyHdl, Edit*, EMPTYARG ) -{ - // modify handler for the condition edits, just to enable/disable "delete" buttons - ReadConditions(); - EnableButtons(); - return 0; -} - -IMPL_LINK( ScOptSolverDlg, SelectHdl, ListBox*, EMPTYARG ) -{ - // select handler for operator list boxes, just to enable/disable "delete" buttons - ReadConditions(); - EnableButtons(); - return 0; -} - -IMPL_LINK( ScOptSolverDlg, ScrollHdl, ScrollBar*, EMPTYARG ) -{ - ReadConditions(); - nScrollPos = maScrollBar.GetThumbPos(); - ShowConditions(); - if( mpEdActive ) - mpEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); - return 0; -} - -IMPL_LINK( ScOptSolverDlg, CursorUpHdl, ScCursorRefEdit*, pEdit ) -{ - if ( pEdit == mpLeftEdit[0] || pEdit == mpRightEdit[0] ) - { - if ( nScrollPos > 0 ) - { - ReadConditions(); - --nScrollPos; - ShowConditions(); - if( mpEdActive ) - mpEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); - } - } - else - { - formula::RefEdit* pFocus = NULL; - for ( sal_uInt16 nRow = 1; nRow < EDIT_ROW_COUNT; ++nRow ) // second row or below: move focus - { - if ( pEdit == mpLeftEdit[nRow] ) - pFocus = mpLeftEdit[nRow-1]; - else if ( pEdit == mpRightEdit[nRow] ) - pFocus = mpRightEdit[nRow-1]; - } - if (pFocus) - { - mpEdActive = pFocus; - pFocus->GrabFocus(); - } - } - - return 0; -} - -IMPL_LINK( ScOptSolverDlg, CursorDownHdl, ScCursorRefEdit*, pEdit ) -{ - if ( pEdit == mpLeftEdit[EDIT_ROW_COUNT-1] || pEdit == mpRightEdit[EDIT_ROW_COUNT-1] ) - { - //! limit scroll position? - ReadConditions(); - ++nScrollPos; - ShowConditions(); - if( mpEdActive ) - mpEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); - } - else - { - formula::RefEdit* pFocus = NULL; - for ( sal_uInt16 nRow = 0; nRow+1 < EDIT_ROW_COUNT; ++nRow ) // before last row: move focus - { - if ( pEdit == mpLeftEdit[nRow] ) - pFocus = mpLeftEdit[nRow+1]; - else if ( pEdit == mpRightEdit[nRow] ) - pFocus = mpRightEdit[nRow+1]; - } - if (pFocus) - { - mpEdActive = pFocus; - pFocus->GrabFocus(); - } - } - - return 0; -} - -//---------------------------------------------------------------------------- - -void ScOptSolverDlg::ShowError( bool bCondition, formula::RefEdit* pFocus ) -{ - String aMessage = bCondition ? maConditionError : maInputError; - ErrorBox( this, WinBits( WB_OK | WB_DEF_OK ), aMessage ).Execute(); - if (pFocus) - { - mpEdActive = pFocus; - pFocus->GrabFocus(); - } -} - -//---------------------------------------------------------------------------- - -bool ScOptSolverDlg::ParseRef( ScRange& rRange, const String& rInput, bool bAllowRange ) -{ - ScRangeUtil aRangeUtil; - ScAddress::Details aDetails(mpDoc->GetAddressConvention(), 0, 0); - USHORT nFlags = rRange.ParseAny( rInput, mpDoc, aDetails ); - if ( nFlags & SCA_VALID ) - { - if ( (nFlags & SCA_TAB_3D) == 0 ) - rRange.aStart.SetTab( mnCurTab ); - if ( (nFlags & SCA_TAB2_3D) == 0 ) - rRange.aEnd.SetTab( rRange.aStart.Tab() ); - return ( bAllowRange || rRange.aStart == rRange.aEnd ); - } - else if ( aRangeUtil.MakeRangeFromName( rInput, mpDoc, mnCurTab, rRange, RUTL_NAMES, aDetails ) ) - return ( bAllowRange || rRange.aStart == rRange.aEnd ); - - return false; // not recognized -} - -bool ScOptSolverDlg::FindTimeout( sal_Int32& rTimeout ) -{ - bool bFound = false; - - if ( !maProperties.getLength() ) - maProperties = ScSolverUtil::GetDefaults( maEngine ); // get property defaults from component - - sal_Int32 nPropCount = maProperties.getLength(); - for (sal_Int32 nProp=0; nProp>= rTimeout ); - } - return bFound; -} - -bool ScOptSolverDlg::CallSolver() // return true -> close dialog after calling -{ - // show progress dialog - - ScSolverProgressDialog aProgress( this ); - sal_Int32 nTimeout = 0; - if ( FindTimeout( nTimeout ) ) - aProgress.SetTimeLimit( nTimeout ); - else - aProgress.HideTimeLimit(); - aProgress.Show(); - aProgress.Update(); - aProgress.Sync(); - // try to make sure the progress dialog is painted before continuing - Application::Reschedule(true); - - // collect solver parameters - - ReadConditions(); - - uno::Reference xDocument( mpDocShell->GetModel(), uno::UNO_QUERY ); - - ScRange aObjRange; - if ( !ParseRef( aObjRange, maEdObjectiveCell.GetText(), false ) ) - { - ShowError( false, &maEdObjectiveCell ); - return false; - } - table::CellAddress aObjective( aObjRange.aStart.Tab(), aObjRange.aStart.Col(), aObjRange.aStart.Row() ); - - // "changing cells" can be several ranges - ScRangeList aVarRanges; - if ( !ParseWithNames( aVarRanges, maEdVariableCells.GetText(), mpDoc ) ) - { - ShowError( false, &maEdVariableCells ); - return false; - } - uno::Sequence aVariables; - sal_Int32 nVarPos = 0; - ULONG nRangeCount = aVarRanges.Count(); - for (ULONG nRangePos=0; nRangePos aConstraints; - sal_Int32 nConstrPos = 0; - for ( std::vector::const_iterator aConstrIter = maConditions.begin(); - aConstrIter != maConditions.end(); ++aConstrIter ) - { - if ( aConstrIter->aLeftStr.Len() ) - { - sheet::SolverConstraint aConstraint; - // order of list box entries must match enum values - aConstraint.Operator = static_cast(aConstrIter->nOperator); - - ScRange aLeftRange; - if ( !ParseRef( aLeftRange, aConstrIter->aLeftStr, true ) ) - { - ShowError( true, NULL ); - return false; - } - - bool bIsRange = false; - ScRange aRightRange; - if ( ParseRef( aRightRange, aConstrIter->aRightStr, true ) ) - { - if ( aRightRange.aStart == aRightRange.aEnd ) - aConstraint.Right <<= table::CellAddress( aRightRange.aStart.Tab(), - aRightRange.aStart.Col(), aRightRange.aStart.Row() ); - else if ( aRightRange.aEnd.Col()-aRightRange.aStart.Col() == aLeftRange.aEnd.Col()-aLeftRange.aStart.Col() && - aRightRange.aEnd.Row()-aRightRange.aStart.Row() == aLeftRange.aEnd.Row()-aLeftRange.aStart.Row() ) - bIsRange = true; // same size as "left" range, resolve into single cells - else - { - ShowError( true, NULL ); - return false; - } - } - else - { - sal_uInt32 nFormat = 0; //! explicit language? - double fValue = 0.0; - if ( mpDoc->GetFormatTable()->IsNumberFormat( aConstrIter->aRightStr, nFormat, fValue ) ) - aConstraint.Right <<= fValue; - else if ( aConstraint.Operator != sheet::SolverConstraintOperator_INTEGER && - aConstraint.Operator != sheet::SolverConstraintOperator_BINARY ) - { - ShowError( true, NULL ); - return false; - } - } - - // resolve into single cells - - sal_Int32 nAdd = ( aLeftRange.aEnd.Col() - aLeftRange.aStart.Col() + 1 ) * - ( aLeftRange.aEnd.Row() - aLeftRange.aStart.Row() + 1 ); - aConstraints.realloc( nConstrPos + nAdd ); - - for (SCROW nRow = aLeftRange.aStart.Row(); nRow <= aLeftRange.aEnd.Row(); ++nRow) - for (SCCOL nCol = aLeftRange.aStart.Col(); nCol <= aLeftRange.aEnd.Col(); ++nCol) - { - aConstraint.Left = table::CellAddress( aLeftRange.aStart.Tab(), nCol, nRow ); - if ( bIsRange ) - aConstraint.Right <<= table::CellAddress( aRightRange.aStart.Tab(), - aRightRange.aStart.Col() + ( nCol - aLeftRange.aStart.Col() ), - aRightRange.aStart.Row() + ( nRow - aLeftRange.aStart.Row() ) ); - - aConstraints[nConstrPos++] = aConstraint; - } - } - } - - sal_Bool bMaximize = maRbMax.IsChecked(); - if ( maRbValue.IsChecked() ) - { - // handle "value of" with an additional constraint (and then minimize) - - sheet::SolverConstraint aConstraint; - aConstraint.Left = aObjective; - aConstraint.Operator = sheet::SolverConstraintOperator_EQUAL; - - String aValStr = maEdTargetValue.GetText(); - ScRange aRightRange; - if ( ParseRef( aRightRange, aValStr, false ) ) - aConstraint.Right <<= table::CellAddress( aRightRange.aStart.Tab(), - aRightRange.aStart.Col(), aRightRange.aStart.Row() ); - else - { - sal_uInt32 nFormat = 0; //! explicit language? - double fValue = 0.0; - if ( mpDoc->GetFormatTable()->IsNumberFormat( aValStr, nFormat, fValue ) ) - aConstraint.Right <<= fValue; - else - { - ShowError( false, &maEdTargetValue ); - return false; - } - } - - aConstraints.realloc( nConstrPos + 1 ); - aConstraints[nConstrPos++] = aConstraint; - } - - // copy old document values - - sal_Int32 nVarCount = aVariables.getLength(); - uno::Sequence aOldValues; - aOldValues.realloc( nVarCount ); - for (nVarPos=0; nVarPosGetValue( aCellPos ); - } - - // create and initialize solver - - uno::Reference xSolver = ScSolverUtil::GetSolver( maEngine ); - DBG_ASSERT( xSolver.is(), "can't get solver component" ); - if ( !xSolver.is() ) - return false; - - xSolver->setDocument( xDocument ); - xSolver->setObjective( aObjective ); - xSolver->setVariables( aVariables ); - xSolver->setConstraints( aConstraints ); - xSolver->setMaximize( bMaximize ); - - // set options - uno::Reference xOptProp(xSolver, uno::UNO_QUERY); - if ( xOptProp.is() ) - { - sal_Int32 nPropCount = maProperties.getLength(); - for (sal_Int32 nProp=0; nPropsetPropertyValue( rValue.Name, rValue.Value ); - } - catch ( uno::Exception & ) - { - DBG_ERRORFILE("Exception in solver option property"); - } - } - } - - xSolver->solve(); - sal_Bool bSuccess = xSolver->getSuccess(); - - aProgress.Hide(); - bool bClose = false; - bool bRestore = true; // restore old values unless a solution is accepted - if ( bSuccess ) - { - // put solution into document so it is visible when asking - uno::Sequence aSolution = xSolver->getSolution(); - if ( aSolution.getLength() == nVarCount ) - { - mpDocShell->LockPaint(); - ScDocFunc aFunc(*mpDocShell); - for (nVarPos=0; nVarPosUnlockPaint(); - } - //! else error? - - // take formatted result from document (result value from component is ignored) - String aResultStr; - mpDoc->GetString( (SCCOL)aObjective.Column, (SCROW)aObjective.Row, (SCTAB)aObjective.Sheet, aResultStr ); - ScSolverSuccessDialog aDialog( this, aResultStr ); - if ( aDialog.Execute() == RET_OK ) - { - // keep results and close dialog - bRestore = false; - bClose = true; - } - } - else - { - rtl::OUString aError; - uno::Reference xDesc( xSolver, uno::UNO_QUERY ); - if ( xDesc.is() ) - aError = xDesc->getStatusDescription(); // error description from component - ScSolverNoSolutionDialog aDialog( this, aError ); - aDialog.Execute(); - } - - if ( bRestore ) // restore old values - { - mpDocShell->LockPaint(); - ScDocFunc aFunc(*mpDocShell); - for (nVarPos=0; nVarPosUnlockPaint(); - } - - return bClose; -} - +/************************************************************************* + * + * 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: optsolver.cxx,v $ + * $Revision: 1.5 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + +//---------------------------------------------------------------------------- + +#include "rangelst.hxx" +#include "scitems.hxx" +#include +#include +#include +#include +#include + +#include "uiitems.hxx" +#include "reffact.hxx" +#include "docsh.hxx" +#include "docfunc.hxx" +#include "cell.hxx" +#include "rangeutl.hxx" +#include "scresid.hxx" +#include "convuno.hxx" +#include "unonames.hxx" +#include "solveroptions.hxx" +#include "solverutil.hxx" +#include "optsolver.hrc" + +#include "optsolver.hxx" + +#include +#include + +using namespace com::sun::star; + +//---------------------------------------------------------------------------- + +ScSolverProgressDialog::ScSolverProgressDialog( Window* pParent ) + : ModelessDialog( pParent, ScResId( RID_SCDLG_SOLVER_PROGRESS ) ), + maFtProgress ( this, ScResId( FT_PROGRESS ) ), + maFtTime ( this, ScResId( FT_TIMELIMIT ) ), + maFlButtons ( this, ScResId( FL_BUTTONS ) ), + maBtnOk ( this, ScResId( BTN_OK ) ) +{ + maBtnOk.Enable(FALSE); + FreeResource(); +} + +ScSolverProgressDialog::~ScSolverProgressDialog() +{ +} + +void ScSolverProgressDialog::HideTimeLimit() +{ + maFtTime.Hide(); +} + +void ScSolverProgressDialog::SetTimeLimit( sal_Int32 nSeconds ) +{ + String aOld = maFtTime.GetText(); + String aNew = aOld.GetToken(0,'#'); + aNew += String::CreateFromInt32( nSeconds ); + aNew += aOld.GetToken(1,'#'); + maFtTime.SetText( aNew ); +} + +//---------------------------------------------------------------------------- + +ScSolverNoSolutionDialog::ScSolverNoSolutionDialog( Window* pParent, const String& rErrorText ) + : ModalDialog( pParent, ScResId( RID_SCDLG_SOLVER_NOSOLUTION ) ), + maFtNoSolution ( this, ScResId( FT_NOSOLUTION ) ), + maFtErrorText ( this, ScResId( FT_ERRORTEXT ) ), + maFlButtons ( this, ScResId( FL_BUTTONS ) ), + maBtnOk ( this, ScResId( BTN_OK ) ) +{ + maFtErrorText.SetText( rErrorText ); + FreeResource(); +} + +ScSolverNoSolutionDialog::~ScSolverNoSolutionDialog() +{ +} + +//---------------------------------------------------------------------------- + +ScSolverSuccessDialog::ScSolverSuccessDialog( Window* pParent, const String& rSolution ) + : ModalDialog( pParent, ScResId( RID_SCDLG_SOLVER_SUCCESS ) ), + maFtSuccess ( this, ScResId( FT_SUCCESS ) ), + maFtResult ( this, ScResId( FT_RESULT ) ), + maFtQuestion ( this, ScResId( FT_QUESTION ) ), + maFlButtons ( this, ScResId( FL_BUTTONS ) ), + maBtnOk ( this, ScResId( BTN_OK ) ), + maBtnCancel ( this, ScResId( BTN_CANCEL ) ) +{ + String aMessage = maFtResult.GetText(); + aMessage.Append( (sal_Char) ' ' ); + aMessage.Append( rSolution ); + maFtResult.SetText( aMessage ); + FreeResource(); +} + +ScSolverSuccessDialog::~ScSolverSuccessDialog() +{ +} + +//---------------------------------------------------------------------------- + +ScCursorRefEdit::ScCursorRefEdit( ScAnyRefDlg* pParent, const ResId& rResId ) : + formula::RefEdit( pParent, rResId ) +{ +} + +void ScCursorRefEdit::SetCursorLinks( const Link& rUp, const Link& rDown ) +{ + maCursorUpLink = rUp; + maCursorDownLink = rDown; +} + +void ScCursorRefEdit::KeyInput( const KeyEvent& rKEvt ) +{ + KeyCode aCode = rKEvt.GetKeyCode(); + bool bUp = (aCode.GetCode() == KEY_UP); + bool bDown = (aCode.GetCode() == KEY_DOWN); + if ( !aCode.IsShift() && !aCode.IsMod1() && !aCode.IsMod2() && ( bUp || bDown ) ) + { + if ( bUp ) + maCursorUpLink.Call( this ); + else + maCursorDownLink.Call( this ); + } + else + formula::RefEdit::KeyInput( rKEvt ); +} + +//---------------------------------------------------------------------------- + +ScOptSolverSave::ScOptSolverSave( const String& rObjective, BOOL bMax, BOOL bMin, BOOL bValue, + const String& rTarget, const String& rVariable, + const std::vector& rConditions, + const String& rEngine, + const uno::Sequence& rProperties ) : + maObjective( rObjective ), + mbMax( bMax ), + mbMin( bMin ), + mbValue( bValue ), + maTarget( rTarget ), + maVariable( rVariable ), + maConditions( rConditions ), + maEngine( rEngine ), + maProperties( rProperties ) +{ +} + +//============================================================================ +// class ScOptSolverDlg +//---------------------------------------------------------------------------- + +ScOptSolverDlg::ScOptSolverDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, + ScDocShell* pDocSh, ScAddress aCursorPos ) + + : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_OPTSOLVER ), + // + maFtObjectiveCell ( this, ScResId( FT_OBJECTIVECELL ) ), + maEdObjectiveCell ( this, ScResId( ED_OBJECTIVECELL ) ), + maRBObjectiveCell ( this, ScResId( IB_OBJECTIVECELL ), &maEdObjectiveCell, this ), + maFtDirection ( this, ScResId( FT_DIRECTION ) ), + maRbMax ( this, ScResId( RB_MAX ) ), + maRbMin ( this, ScResId( RB_MIN ) ), + maRbValue ( this, ScResId( RB_VALUE ) ), + maEdTargetValue ( this, ScResId( ED_TARGET ) ), + maRBTargetValue ( this, ScResId( IB_TARGET ), &maEdTargetValue, this ), + maFtVariableCells ( this, ScResId( FT_VARIABLECELLS ) ), + maEdVariableCells ( this, ScResId( ED_VARIABLECELLS ) ), + maRBVariableCells ( this, ScResId( IB_VARIABLECELLS ), &maEdVariableCells, this), + maFlConditions ( this, ScResId( FL_CONDITIONS ) ), + maFtCellRef ( this, ScResId( FT_CELLREF ) ), + maEdLeft1 ( this, ScResId( ED_LEFT1 ) ), + maRBLeft1 ( this, ScResId( IB_LEFT1 ), &maEdLeft1, this ), + maFtOperator ( this, ScResId( FT_OPERATOR ) ), + maLbOp1 ( this, ScResId( LB_OP1 ) ), + maFtConstraint ( this, ScResId( FT_CONSTRAINT ) ), + maEdRight1 ( this, ScResId( ED_RIGHT1 ) ), + maRBRight1 ( this, ScResId( IB_RIGHT1 ), &maEdRight1, this ), + maBtnDel1 ( this, ScResId( IB_DELETE1 ) ), + maEdLeft2 ( this, ScResId( ED_LEFT2 ) ), + maRBLeft2 ( this, ScResId( IB_LEFT2 ), &maEdLeft2, this ), + maLbOp2 ( this, ScResId( LB_OP2 ) ), + maEdRight2 ( this, ScResId( ED_RIGHT2 ) ), + maRBRight2 ( this, ScResId( IB_RIGHT2 ), &maEdRight2, this ), + maBtnDel2 ( this, ScResId( IB_DELETE2 ) ), + maEdLeft3 ( this, ScResId( ED_LEFT3 ) ), + maRBLeft3 ( this, ScResId( IB_LEFT3 ), &maEdLeft3, this ), + maLbOp3 ( this, ScResId( LB_OP3 ) ), + maEdRight3 ( this, ScResId( ED_RIGHT3 ) ), + maRBRight3 ( this, ScResId( IB_RIGHT3 ), &maEdRight3, this ), + maBtnDel3 ( this, ScResId( IB_DELETE3 ) ), + maEdLeft4 ( this, ScResId( ED_LEFT4 ) ), + maRBLeft4 ( this, ScResId( IB_LEFT4 ), &maEdLeft4, this ), + maLbOp4 ( this, ScResId( LB_OP4 ) ), + maEdRight4 ( this, ScResId( ED_RIGHT4 ) ), + maRBRight4 ( this, ScResId( IB_RIGHT4 ), &maEdRight4, this ), + maBtnDel4 ( this, ScResId( IB_DELETE4 ) ), + maScrollBar ( this, ScResId( SB_SCROLL ) ), + maFlButtons ( this, ScResId( FL_BUTTONS ) ), + maBtnOpt ( this, ScResId( BTN_OPTIONS ) ), + maBtnHelp ( this, ScResId( BTN_HELP ) ), + maBtnCancel ( this, ScResId( BTN_CLOSE ) ), + maBtnSolve ( this, ScResId( BTN_SOLVE ) ), + maInputError ( ScResId( STR_INVALIDINPUT ) ), + maConditionError ( ScResId( STR_INVALIDCONDITION ) ), + // + mpDocShell ( pDocSh ), + mpDoc ( pDocSh->GetDocument() ), + mnCurTab ( aCursorPos.Tab() ), + mpEdActive ( NULL ), + mbDlgLostFocus ( false ), + nScrollPos ( 0 ) +{ + mpLeftEdit[0] = &maEdLeft1; + mpLeftButton[0] = &maRBLeft1; + mpRightEdit[0] = &maEdRight1; + mpRightButton[0] = &maRBRight1; + mpOperator[0] = &maLbOp1; + mpDelButton[0] = &maBtnDel1; + + mpLeftEdit[1] = &maEdLeft2; + mpLeftButton[1] = &maRBLeft2; + mpRightEdit[1] = &maEdRight2; + mpRightButton[1] = &maRBRight2; + mpOperator[1] = &maLbOp2; + mpDelButton[1] = &maBtnDel2; + + mpLeftEdit[2] = &maEdLeft3; + mpLeftButton[2] = &maRBLeft3; + mpRightEdit[2] = &maEdRight3; + mpRightButton[2] = &maRBRight3; + mpOperator[2] = &maLbOp3; + mpDelButton[2] = &maBtnDel3; + + mpLeftEdit[3] = &maEdLeft4; + mpLeftButton[3] = &maRBLeft4; + mpRightEdit[3] = &maEdRight4; + mpRightButton[3] = &maRBRight4; + mpOperator[3] = &maLbOp4; + mpDelButton[3] = &maBtnDel4; + + Init( aCursorPos ); + FreeResource(); +} + +//---------------------------------------------------------------------------- + +ScOptSolverDlg::~ScOptSolverDlg() +{ +} + +//---------------------------------------------------------------------------- + +void ScOptSolverDlg::Init(const ScAddress& rCursorPos) +{ + // Get the "Delete Rows" commandimagelist images from sfx instead of + // adding a second copy to sc (see ScTbxInsertCtrl::StateChanged) + + rtl::OUString aSlotURL( RTL_CONSTASCII_USTRINGPARAM( "slot:" )); + aSlotURL += rtl::OUString::valueOf( sal_Int32( SID_DEL_ROWS ) ); + uno::Reference xFrame = GetBindings().GetActiveFrame(); + Image aDelNm = ::GetImage( xFrame, aSlotURL, FALSE, FALSE ); + Image aDelHC = ::GetImage( xFrame, aSlotURL, FALSE, TRUE ); // high contrast + + for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) + { + mpDelButton[nRow]->SetModeImage( aDelNm, BMP_COLOR_NORMAL ); + mpDelButton[nRow]->SetModeImage( aDelHC, BMP_COLOR_HIGHCONTRAST ); + } + + maBtnOpt.SetClickHdl( LINK( this, ScOptSolverDlg, BtnHdl ) ); + maBtnCancel.SetClickHdl( LINK( this, ScOptSolverDlg, BtnHdl ) ); + maBtnSolve.SetClickHdl( LINK( this, ScOptSolverDlg, BtnHdl ) ); + + Link aLink = LINK( this, ScOptSolverDlg, GetFocusHdl ); + maEdObjectiveCell.SetGetFocusHdl( aLink ); + maRBObjectiveCell.SetGetFocusHdl( aLink ); + maEdTargetValue.SetGetFocusHdl( aLink ); + maRBTargetValue.SetGetFocusHdl( aLink ); + maEdVariableCells.SetGetFocusHdl( aLink ); + maRBVariableCells.SetGetFocusHdl( aLink ); + maRbValue.SetGetFocusHdl( aLink ); + for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) + { + mpLeftEdit[nRow]->SetGetFocusHdl( aLink ); + mpLeftButton[nRow]->SetGetFocusHdl( aLink ); + mpRightEdit[nRow]->SetGetFocusHdl( aLink ); + mpRightButton[nRow]->SetGetFocusHdl( aLink ); + mpOperator[nRow]->SetGetFocusHdl( aLink ); + } + + aLink = LINK( this, ScOptSolverDlg, LoseFocusHdl ); + maEdObjectiveCell.SetLoseFocusHdl( aLink ); + maRBObjectiveCell.SetLoseFocusHdl( aLink ); + maEdTargetValue. SetLoseFocusHdl( aLink ); + maRBTargetValue. SetLoseFocusHdl( aLink ); + maEdVariableCells.SetLoseFocusHdl( aLink ); + maRBVariableCells.SetLoseFocusHdl( aLink ); + for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) + { + mpLeftEdit[nRow]->SetLoseFocusHdl( aLink ); + mpLeftButton[nRow]->SetLoseFocusHdl( aLink ); + mpRightEdit[nRow]->SetLoseFocusHdl( aLink ); + mpRightButton[nRow]->SetLoseFocusHdl( aLink ); + } + + Link aCursorUp = LINK( this, ScOptSolverDlg, CursorUpHdl ); + Link aCursorDown = LINK( this, ScOptSolverDlg, CursorDownHdl ); + Link aCondModify = LINK( this, ScOptSolverDlg, CondModifyHdl ); + for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) + { + mpLeftEdit[nRow]->SetCursorLinks( aCursorUp, aCursorDown ); + mpRightEdit[nRow]->SetCursorLinks( aCursorUp, aCursorDown ); + mpLeftEdit[nRow]->SetModifyHdl( aCondModify ); + mpRightEdit[nRow]->SetModifyHdl( aCondModify ); + mpDelButton[nRow]->SetClickHdl( LINK( this, ScOptSolverDlg, DelBtnHdl ) ); + mpOperator[nRow]->SetSelectHdl( LINK( this, ScOptSolverDlg, SelectHdl ) ); + } + maEdTargetValue.SetModifyHdl( LINK( this, ScOptSolverDlg, TargetModifyHdl ) ); + + maScrollBar.SetEndScrollHdl( LINK( this, ScOptSolverDlg, ScrollHdl ) ); + maScrollBar.SetScrollHdl( LINK( this, ScOptSolverDlg, ScrollHdl ) ); + + maScrollBar.SetPageSize( EDIT_ROW_COUNT ); + maScrollBar.SetVisibleSize( EDIT_ROW_COUNT ); + maScrollBar.SetLineSize( 1 ); + // Range is set in ShowConditions + + // get available solver implementations + //! sort by descriptions? + ScSolverUtil::GetImplementations( maImplNames, maDescriptions ); + sal_Int32 nImplCount = maImplNames.getLength(); + + const ScOptSolverSave* pOldData = mpDocShell->GetSolverSaveData(); + if ( pOldData ) + { + maEdObjectiveCell.SetRefString( pOldData->GetObjective() ); + maRbMax.Check( pOldData->GetMax() ); + maRbMin.Check( pOldData->GetMin() ); + maRbValue.Check( pOldData->GetValue() ); + maEdTargetValue.SetRefString( pOldData->GetTarget() ); + maEdVariableCells.SetRefString( pOldData->GetVariable() ); + maConditions = pOldData->GetConditions(); + maEngine = pOldData->GetEngine(); + maProperties = pOldData->GetProperties(); + } + else + { + maRbMax.Check(); + String aCursorStr; + if ( !mpDoc->GetRangeAtBlock( ScRange(rCursorPos), &aCursorStr ) ) + rCursorPos.Format( aCursorStr, SCA_ABS, NULL, mpDoc->GetAddressConvention() ); + maEdObjectiveCell.SetRefString( aCursorStr ); + if ( nImplCount > 0 ) + maEngine = maImplNames[0]; // use first implementation + } + ShowConditions(); + + maEdObjectiveCell.GrabFocus(); + mpEdActive = &maEdObjectiveCell; +} + +//---------------------------------------------------------------------------- + +void ScOptSolverDlg::ReadConditions() +{ + for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) + { + ScOptConditionRow aRowEntry; + aRowEntry.aLeftStr = mpLeftEdit[nRow]->GetText(); + aRowEntry.aRightStr = mpRightEdit[nRow]->GetText(); + aRowEntry.nOperator = mpOperator[nRow]->GetSelectEntryPos(); + + long nVecPos = nScrollPos + nRow; + if ( nVecPos >= (long)maConditions.size() && !aRowEntry.IsDefault() ) + maConditions.resize( nVecPos + 1 ); + + if ( nVecPos < (long)maConditions.size() ) + maConditions[nVecPos] = aRowEntry; + + // remove default entries at the end + size_t nSize = maConditions.size(); + while ( nSize > 0 && maConditions[ nSize-1 ].IsDefault() ) + --nSize; + maConditions.resize( nSize ); + } +} + +void ScOptSolverDlg::ShowConditions() +{ + for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) + { + ScOptConditionRow aRowEntry; + + long nVecPos = nScrollPos + nRow; + if ( nVecPos < (long)maConditions.size() ) + aRowEntry = maConditions[nVecPos]; + + mpLeftEdit[nRow]->SetRefString( aRowEntry.aLeftStr ); + mpRightEdit[nRow]->SetRefString( aRowEntry.aRightStr ); + mpOperator[nRow]->SelectEntryPos( aRowEntry.nOperator ); + } + + // allow to scroll one page behind the visible or stored rows + long nVisible = nScrollPos + EDIT_ROW_COUNT; + long nMax = std::max( nVisible, (long) maConditions.size() ); + maScrollBar.SetRange( Range( 0, nMax + EDIT_ROW_COUNT ) ); + maScrollBar.SetThumbPos( nScrollPos ); + + EnableButtons(); +} + +void ScOptSolverDlg::EnableButtons() +{ + for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) + { + long nVecPos = nScrollPos + nRow; + mpDelButton[nRow]->Enable( nVecPos < (long)maConditions.size() ); + } +} + +//---------------------------------------------------------------------------- + +BOOL ScOptSolverDlg::Close() +{ + return DoClose( ScOptSolverDlgWrapper::GetChildWindowId() ); +} + +//---------------------------------------------------------------------------- + +void ScOptSolverDlg::SetActive() +{ + if ( mbDlgLostFocus ) + { + mbDlgLostFocus = false; + if( mpEdActive ) + mpEdActive->GrabFocus(); + } + else + { + GrabFocus(); + } + RefInputDone(); +} + +//---------------------------------------------------------------------------- + +void ScOptSolverDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) +{ + if( mpEdActive ) + { + if ( rRef.aStart != rRef.aEnd ) + RefInputStart(mpEdActive); + + // "target"/"value": single cell + bool bSingle = ( mpEdActive == &maEdObjectiveCell || mpEdActive == &maEdTargetValue ); + + String aStr; + ScAddress aAdr = rRef.aStart; + ScRange aNewRef( rRef ); + if ( bSingle ) + aNewRef.aEnd = aAdr; + + String aName; + if ( pDocP->GetRangeAtBlock( aNewRef, &aName ) ) // named range: show name + aStr = aName; + else // format cell/range reference + { + USHORT nFmt = ( aAdr.Tab() == mnCurTab ) ? SCA_ABS : SCA_ABS_3D; + if ( bSingle ) + aAdr.Format( aStr, nFmt, pDocP, pDocP->GetAddressConvention() ); + else + rRef.Format( aStr, nFmt | SCR_ABS, pDocP, pDocP->GetAddressConvention() ); + } + + // variable cells can be several ranges, so only the selection is replaced + if ( mpEdActive == &maEdVariableCells ) + { + String aVal = mpEdActive->GetText(); + Selection aSel = mpEdActive->GetSelection(); + aSel.Justify(); + aVal.Erase( (xub_StrLen)aSel.Min(), (xub_StrLen)aSel.Len() ); + aVal.Insert( aStr, (xub_StrLen)aSel.Min() ); + Selection aNewSel( aSel.Min(), aSel.Min()+aStr.Len() ); + mpEdActive->SetRefString( aVal ); + mpEdActive->SetSelection( aNewSel ); + } + else + mpEdActive->SetRefString( aStr ); + + ReadConditions(); + EnableButtons(); + + // select "Value of" if a ref is input into "target" edit + if ( mpEdActive == &maEdTargetValue ) + maRbValue.Check(); + } +} + +//---------------------------------------------------------------------------- + +BOOL ScOptSolverDlg::IsRefInputMode() const +{ + return mpEdActive != NULL; +} + +//---------------------------------------------------------------------------- +// Handler: + +IMPL_LINK( ScOptSolverDlg, BtnHdl, PushButton*, pBtn ) +{ + if ( pBtn == &maBtnSolve || pBtn == &maBtnCancel ) + { + bool bSolve = ( pBtn == &maBtnSolve ); + + SetDispatcherLock( FALSE ); + SwitchToDocument(); + + bool bClose = true; + if ( bSolve ) + bClose = CallSolver(); + + if ( bClose ) + { + // Close: write dialog settings to DocShell for subsequent calls + ReadConditions(); + ScOptSolverSave aSave( + maEdObjectiveCell.GetText(), maRbMax.IsChecked(), maRbMin.IsChecked(), maRbValue.IsChecked(), + maEdTargetValue.GetText(), maEdVariableCells.GetText(), maConditions, maEngine, maProperties ); + mpDocShell->SetSolverSaveData( aSave ); + Close(); + } + else + { + // no solution -> dialog is kept open + SetDispatcherLock( TRUE ); + } + } + else if ( pBtn == &maBtnOpt ) + { + //! move options dialog to UI lib? + ScSolverOptionsDialog* pOptDlg = + new ScSolverOptionsDialog( this, maImplNames, maDescriptions, maEngine, maProperties ); + if ( pOptDlg->Execute() == RET_OK ) + { + maEngine = pOptDlg->GetEngine(); + maProperties = pOptDlg->GetProperties(); + } + delete pOptDlg; + } + + return 0; +} + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScOptSolverDlg, GetFocusHdl, Control*, pCtrl ) +{ + Edit* pEdit = NULL; + mpEdActive = NULL; + + if( pCtrl == &maEdObjectiveCell || pCtrl == &maRBObjectiveCell ) + pEdit = mpEdActive = &maEdObjectiveCell; + else if( pCtrl == &maEdTargetValue || pCtrl == &maRBTargetValue ) + pEdit = mpEdActive = &maEdTargetValue; + else if( pCtrl == &maEdVariableCells || pCtrl == &maRBVariableCells ) + pEdit = mpEdActive = &maEdVariableCells; + for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) + { + if( pCtrl == mpLeftEdit[nRow] || pCtrl == mpLeftButton[nRow] ) + pEdit = mpEdActive = mpLeftEdit[nRow]; + else if( pCtrl == mpRightEdit[nRow] || pCtrl == mpRightButton[nRow] ) + pEdit = mpEdActive = mpRightEdit[nRow]; + else if( pCtrl == mpOperator[nRow] ) // focus on "operator" list box + mpEdActive = mpRightEdit[nRow]; // use right edit for ref input, but don't change selection + } + if( pCtrl == &maRbValue ) // focus on "Value of" radio button + mpEdActive = &maEdTargetValue; // use value edit for ref input, but don't change selection + + if( pEdit ) + pEdit->SetSelection( Selection( 0, SELECTION_MAX ) ); + + return 0; +} + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScOptSolverDlg, LoseFocusHdl, Control*, EMPTYARG ) +{ + mbDlgLostFocus = !IsActive(); + return 0; +} + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScOptSolverDlg, DelBtnHdl, PushButton*, pBtn ) +{ + for ( sal_uInt16 nRow = 0; nRow < EDIT_ROW_COUNT; ++nRow ) + if( pBtn == mpDelButton[nRow] ) + { + BOOL bHadFocus = pBtn->HasFocus(); + + ReadConditions(); + long nVecPos = nScrollPos + nRow; + if ( nVecPos < (long)maConditions.size() ) + { + maConditions.erase( maConditions.begin() + nVecPos ); + ShowConditions(); + + if ( bHadFocus && !pBtn->IsEnabled() ) + { + // If the button is disabled, focus would normally move to the next control, + // (left edit of the next row). Move it to left edit of this row instead. + + mpEdActive = mpLeftEdit[nRow]; + mpEdActive->GrabFocus(); + } + } + } + + return 0; +} + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScOptSolverDlg, TargetModifyHdl, Edit*, EMPTYARG ) +{ + // modify handler for the target edit: + // select "Value of" if something is input into the edit + if ( maEdTargetValue.GetText().Len() ) + maRbValue.Check(); + return 0; +} + +IMPL_LINK( ScOptSolverDlg, CondModifyHdl, Edit*, EMPTYARG ) +{ + // modify handler for the condition edits, just to enable/disable "delete" buttons + ReadConditions(); + EnableButtons(); + return 0; +} + +IMPL_LINK( ScOptSolverDlg, SelectHdl, ListBox*, EMPTYARG ) +{ + // select handler for operator list boxes, just to enable/disable "delete" buttons + ReadConditions(); + EnableButtons(); + return 0; +} + +IMPL_LINK( ScOptSolverDlg, ScrollHdl, ScrollBar*, EMPTYARG ) +{ + ReadConditions(); + nScrollPos = maScrollBar.GetThumbPos(); + ShowConditions(); + if( mpEdActive ) + mpEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); + return 0; +} + +IMPL_LINK( ScOptSolverDlg, CursorUpHdl, ScCursorRefEdit*, pEdit ) +{ + if ( pEdit == mpLeftEdit[0] || pEdit == mpRightEdit[0] ) + { + if ( nScrollPos > 0 ) + { + ReadConditions(); + --nScrollPos; + ShowConditions(); + if( mpEdActive ) + mpEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); + } + } + else + { + formula::RefEdit* pFocus = NULL; + for ( sal_uInt16 nRow = 1; nRow < EDIT_ROW_COUNT; ++nRow ) // second row or below: move focus + { + if ( pEdit == mpLeftEdit[nRow] ) + pFocus = mpLeftEdit[nRow-1]; + else if ( pEdit == mpRightEdit[nRow] ) + pFocus = mpRightEdit[nRow-1]; + } + if (pFocus) + { + mpEdActive = pFocus; + pFocus->GrabFocus(); + } + } + + return 0; +} + +IMPL_LINK( ScOptSolverDlg, CursorDownHdl, ScCursorRefEdit*, pEdit ) +{ + if ( pEdit == mpLeftEdit[EDIT_ROW_COUNT-1] || pEdit == mpRightEdit[EDIT_ROW_COUNT-1] ) + { + //! limit scroll position? + ReadConditions(); + ++nScrollPos; + ShowConditions(); + if( mpEdActive ) + mpEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); + } + else + { + formula::RefEdit* pFocus = NULL; + for ( sal_uInt16 nRow = 0; nRow+1 < EDIT_ROW_COUNT; ++nRow ) // before last row: move focus + { + if ( pEdit == mpLeftEdit[nRow] ) + pFocus = mpLeftEdit[nRow+1]; + else if ( pEdit == mpRightEdit[nRow] ) + pFocus = mpRightEdit[nRow+1]; + } + if (pFocus) + { + mpEdActive = pFocus; + pFocus->GrabFocus(); + } + } + + return 0; +} + +//---------------------------------------------------------------------------- + +void ScOptSolverDlg::ShowError( bool bCondition, formula::RefEdit* pFocus ) +{ + String aMessage = bCondition ? maConditionError : maInputError; + ErrorBox( this, WinBits( WB_OK | WB_DEF_OK ), aMessage ).Execute(); + if (pFocus) + { + mpEdActive = pFocus; + pFocus->GrabFocus(); + } +} + +//---------------------------------------------------------------------------- + +bool ScOptSolverDlg::ParseRef( ScRange& rRange, const String& rInput, bool bAllowRange ) +{ + ScRangeUtil aRangeUtil; + ScAddress::Details aDetails(mpDoc->GetAddressConvention(), 0, 0); + USHORT nFlags = rRange.ParseAny( rInput, mpDoc, aDetails ); + if ( nFlags & SCA_VALID ) + { + if ( (nFlags & SCA_TAB_3D) == 0 ) + rRange.aStart.SetTab( mnCurTab ); + if ( (nFlags & SCA_TAB2_3D) == 0 ) + rRange.aEnd.SetTab( rRange.aStart.Tab() ); + return ( bAllowRange || rRange.aStart == rRange.aEnd ); + } + else if ( aRangeUtil.MakeRangeFromName( rInput, mpDoc, mnCurTab, rRange, RUTL_NAMES, aDetails ) ) + return ( bAllowRange || rRange.aStart == rRange.aEnd ); + + return false; // not recognized +} + +bool ScOptSolverDlg::FindTimeout( sal_Int32& rTimeout ) +{ + bool bFound = false; + + if ( !maProperties.getLength() ) + maProperties = ScSolverUtil::GetDefaults( maEngine ); // get property defaults from component + + sal_Int32 nPropCount = maProperties.getLength(); + for (sal_Int32 nProp=0; nProp>= rTimeout ); + } + return bFound; +} + +bool ScOptSolverDlg::CallSolver() // return true -> close dialog after calling +{ + // show progress dialog + + ScSolverProgressDialog aProgress( this ); + sal_Int32 nTimeout = 0; + if ( FindTimeout( nTimeout ) ) + aProgress.SetTimeLimit( nTimeout ); + else + aProgress.HideTimeLimit(); + aProgress.Show(); + aProgress.Update(); + aProgress.Sync(); + // try to make sure the progress dialog is painted before continuing + Application::Reschedule(true); + + // collect solver parameters + + ReadConditions(); + + uno::Reference xDocument( mpDocShell->GetModel(), uno::UNO_QUERY ); + + ScRange aObjRange; + if ( !ParseRef( aObjRange, maEdObjectiveCell.GetText(), false ) ) + { + ShowError( false, &maEdObjectiveCell ); + return false; + } + table::CellAddress aObjective( aObjRange.aStart.Tab(), aObjRange.aStart.Col(), aObjRange.aStart.Row() ); + + // "changing cells" can be several ranges + ScRangeList aVarRanges; + if ( !ParseWithNames( aVarRanges, maEdVariableCells.GetText(), mpDoc ) ) + { + ShowError( false, &maEdVariableCells ); + return false; + } + uno::Sequence aVariables; + sal_Int32 nVarPos = 0; + ULONG nRangeCount = aVarRanges.Count(); + for (ULONG nRangePos=0; nRangePos aConstraints; + sal_Int32 nConstrPos = 0; + for ( std::vector::const_iterator aConstrIter = maConditions.begin(); + aConstrIter != maConditions.end(); ++aConstrIter ) + { + if ( aConstrIter->aLeftStr.Len() ) + { + sheet::SolverConstraint aConstraint; + // order of list box entries must match enum values + aConstraint.Operator = static_cast(aConstrIter->nOperator); + + ScRange aLeftRange; + if ( !ParseRef( aLeftRange, aConstrIter->aLeftStr, true ) ) + { + ShowError( true, NULL ); + return false; + } + + bool bIsRange = false; + ScRange aRightRange; + if ( ParseRef( aRightRange, aConstrIter->aRightStr, true ) ) + { + if ( aRightRange.aStart == aRightRange.aEnd ) + aConstraint.Right <<= table::CellAddress( aRightRange.aStart.Tab(), + aRightRange.aStart.Col(), aRightRange.aStart.Row() ); + else if ( aRightRange.aEnd.Col()-aRightRange.aStart.Col() == aLeftRange.aEnd.Col()-aLeftRange.aStart.Col() && + aRightRange.aEnd.Row()-aRightRange.aStart.Row() == aLeftRange.aEnd.Row()-aLeftRange.aStart.Row() ) + bIsRange = true; // same size as "left" range, resolve into single cells + else + { + ShowError( true, NULL ); + return false; + } + } + else + { + sal_uInt32 nFormat = 0; //! explicit language? + double fValue = 0.0; + if ( mpDoc->GetFormatTable()->IsNumberFormat( aConstrIter->aRightStr, nFormat, fValue ) ) + aConstraint.Right <<= fValue; + else if ( aConstraint.Operator != sheet::SolverConstraintOperator_INTEGER && + aConstraint.Operator != sheet::SolverConstraintOperator_BINARY ) + { + ShowError( true, NULL ); + return false; + } + } + + // resolve into single cells + + sal_Int32 nAdd = ( aLeftRange.aEnd.Col() - aLeftRange.aStart.Col() + 1 ) * + ( aLeftRange.aEnd.Row() - aLeftRange.aStart.Row() + 1 ); + aConstraints.realloc( nConstrPos + nAdd ); + + for (SCROW nRow = aLeftRange.aStart.Row(); nRow <= aLeftRange.aEnd.Row(); ++nRow) + for (SCCOL nCol = aLeftRange.aStart.Col(); nCol <= aLeftRange.aEnd.Col(); ++nCol) + { + aConstraint.Left = table::CellAddress( aLeftRange.aStart.Tab(), nCol, nRow ); + if ( bIsRange ) + aConstraint.Right <<= table::CellAddress( aRightRange.aStart.Tab(), + aRightRange.aStart.Col() + ( nCol - aLeftRange.aStart.Col() ), + aRightRange.aStart.Row() + ( nRow - aLeftRange.aStart.Row() ) ); + + aConstraints[nConstrPos++] = aConstraint; + } + } + } + + sal_Bool bMaximize = maRbMax.IsChecked(); + if ( maRbValue.IsChecked() ) + { + // handle "value of" with an additional constraint (and then minimize) + + sheet::SolverConstraint aConstraint; + aConstraint.Left = aObjective; + aConstraint.Operator = sheet::SolverConstraintOperator_EQUAL; + + String aValStr = maEdTargetValue.GetText(); + ScRange aRightRange; + if ( ParseRef( aRightRange, aValStr, false ) ) + aConstraint.Right <<= table::CellAddress( aRightRange.aStart.Tab(), + aRightRange.aStart.Col(), aRightRange.aStart.Row() ); + else + { + sal_uInt32 nFormat = 0; //! explicit language? + double fValue = 0.0; + if ( mpDoc->GetFormatTable()->IsNumberFormat( aValStr, nFormat, fValue ) ) + aConstraint.Right <<= fValue; + else + { + ShowError( false, &maEdTargetValue ); + return false; + } + } + + aConstraints.realloc( nConstrPos + 1 ); + aConstraints[nConstrPos++] = aConstraint; + } + + // copy old document values + + sal_Int32 nVarCount = aVariables.getLength(); + uno::Sequence aOldValues; + aOldValues.realloc( nVarCount ); + for (nVarPos=0; nVarPosGetValue( aCellPos ); + } + + // create and initialize solver + + uno::Reference xSolver = ScSolverUtil::GetSolver( maEngine ); + DBG_ASSERT( xSolver.is(), "can't get solver component" ); + if ( !xSolver.is() ) + return false; + + xSolver->setDocument( xDocument ); + xSolver->setObjective( aObjective ); + xSolver->setVariables( aVariables ); + xSolver->setConstraints( aConstraints ); + xSolver->setMaximize( bMaximize ); + + // set options + uno::Reference xOptProp(xSolver, uno::UNO_QUERY); + if ( xOptProp.is() ) + { + sal_Int32 nPropCount = maProperties.getLength(); + for (sal_Int32 nProp=0; nPropsetPropertyValue( rValue.Name, rValue.Value ); + } + catch ( uno::Exception & ) + { + DBG_ERRORFILE("Exception in solver option property"); + } + } + } + + xSolver->solve(); + sal_Bool bSuccess = xSolver->getSuccess(); + + aProgress.Hide(); + bool bClose = false; + bool bRestore = true; // restore old values unless a solution is accepted + if ( bSuccess ) + { + // put solution into document so it is visible when asking + uno::Sequence aSolution = xSolver->getSolution(); + if ( aSolution.getLength() == nVarCount ) + { + mpDocShell->LockPaint(); + ScDocFunc aFunc(*mpDocShell); + for (nVarPos=0; nVarPosUnlockPaint(); + } + //! else error? + + // take formatted result from document (result value from component is ignored) + String aResultStr; + mpDoc->GetString( (SCCOL)aObjective.Column, (SCROW)aObjective.Row, (SCTAB)aObjective.Sheet, aResultStr ); + ScSolverSuccessDialog aDialog( this, aResultStr ); + if ( aDialog.Execute() == RET_OK ) + { + // keep results and close dialog + bRestore = false; + bClose = true; + } + } + else + { + rtl::OUString aError; + uno::Reference xDesc( xSolver, uno::UNO_QUERY ); + if ( xDesc.is() ) + aError = xDesc->getStatusDescription(); // error description from component + ScSolverNoSolutionDialog aDialog( this, aError ); + aDialog.Execute(); + } + + if ( bRestore ) // restore old values + { + mpDocShell->LockPaint(); + ScDocFunc aFunc(*mpDocShell); + for (nVarPos=0; nVarPosUnlockPaint(); + } + + return bClose; +} + diff --git a/sc/source/ui/miscdlgs/solvrdlg.cxx b/sc/source/ui/miscdlgs/solvrdlg.cxx index 7b81004dc43c..8e3803623972 100644 --- a/sc/source/ui/miscdlgs/solvrdlg.cxx +++ b/sc/source/ui/miscdlgs/solvrdlg.cxx @@ -1,316 +1,316 @@ -/************************************************************************* - * - * 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: solvrdlg.cxx,v $ - * $Revision: 1.13 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -//---------------------------------------------------------------------------- - -#include "rangelst.hxx" -#include "scitems.hxx" -#include -#include -#include - -#include "uiitems.hxx" -#include "reffact.hxx" -#include "document.hxx" -#include "scresid.hxx" -#include "solvrdlg.hrc" - -#define _SOLVRDLG_CXX -#include "solvrdlg.hxx" -#undef _SOLVERDLG_CXX - - -#define ERRORBOX(s) ErrorBox( this, WinBits( WB_OK | WB_DEF_OK), s ).Execute() - - -//============================================================================ -// class ScSolverDlg -//---------------------------------------------------------------------------- - -ScSolverDlg::ScSolverDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, - ScDocument* pDocument, - ScAddress aCursorPos ) - - : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_SOLVER ), - // - aFlVariables ( this, ScResId( FL_VARIABLES ) ), - aFtFormulaCell ( this, ScResId( FT_FORMULACELL ) ), - aEdFormulaCell ( this, ScResId( ED_FORMULACELL ) ), - aRBFormulaCell ( this, ScResId( RB_FORMULACELL ), &aEdFormulaCell, this ), - aFtTargetVal ( this, ScResId( FT_TARGETVAL ) ), - aEdTargetVal ( this, ScResId( ED_TARGETVAL ) ), - aFtVariableCell ( this, ScResId( FT_VARCELL ) ), - aEdVariableCell ( this, ScResId( ED_VARCELL ) ), - aRBVariableCell ( this, ScResId( RB_VARCELL ), &aEdVariableCell, this ), - aBtnOk ( this, ScResId( BTN_OK ) ), - aBtnCancel ( this, ScResId( BTN_CANCEL ) ), - aBtnHelp ( this, ScResId( BTN_HELP ) ), - // - theFormulaCell ( aCursorPos ), - theVariableCell ( aCursorPos ), - pDoc ( pDocument ), - nCurTab ( aCursorPos.Tab() ), - pEdActive ( NULL ), - bDlgLostFocus ( FALSE ), - errMsgInvalidVar ( ScResId( STR_INVALIDVAR ) ), - errMsgInvalidForm ( ScResId( STR_INVALIDFORM ) ), - errMsgNoFormula ( ScResId( STR_NOFORMULA ) ), - errMsgInvalidVal ( ScResId( STR_INVALIDVAL ) ) -{ - Init(); - FreeResource(); -} - -//---------------------------------------------------------------------------- - -__EXPORT ScSolverDlg::~ScSolverDlg() -{ -} - -//---------------------------------------------------------------------------- - -void __EXPORT ScSolverDlg::Init() -{ - String aStr; - - aBtnOk. SetClickHdl ( LINK( this, ScSolverDlg, BtnHdl ) ); - aBtnCancel. SetClickHdl ( LINK( this, ScSolverDlg, BtnHdl ) ); - - Link aLink = LINK( this, ScSolverDlg, GetFocusHdl ); - aEdFormulaCell. SetGetFocusHdl ( aLink ); - aRBFormulaCell. SetGetFocusHdl ( aLink ); - aEdVariableCell.SetGetFocusHdl ( aLink ); - aRBVariableCell.SetGetFocusHdl ( aLink ); - aEdTargetVal. SetGetFocusHdl ( aLink ); - - aLink = LINK( this, ScSolverDlg, LoseFocusHdl ); - aEdFormulaCell. SetLoseFocusHdl ( aLink ); - aRBFormulaCell. SetLoseFocusHdl ( aLink ); - aEdVariableCell.SetLoseFocusHdl ( aLink ); - aRBVariableCell.SetLoseFocusHdl ( aLink ); - - theFormulaCell.Format( aStr, SCA_ABS, NULL, pDoc->GetAddressConvention() ); - - aEdFormulaCell.SetText( aStr ); - aEdFormulaCell.GrabFocus(); - pEdActive = &aEdFormulaCell; -} - -//---------------------------------------------------------------------------- - -BOOL __EXPORT ScSolverDlg::Close() -{ - return DoClose( ScSolverDlgWrapper::GetChildWindowId() ); -} - -//---------------------------------------------------------------------------- - -void ScSolverDlg::SetActive() -{ - if ( bDlgLostFocus ) - { - bDlgLostFocus = FALSE; - if( pEdActive ) - pEdActive->GrabFocus(); - } - else - { - GrabFocus(); - } - RefInputDone(); -} - -//---------------------------------------------------------------------------- - -void ScSolverDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) -{ - if( pEdActive ) - { - if ( rRef.aStart != rRef.aEnd ) - RefInputStart(pEdActive); - - String aStr; - ScAddress aAdr = rRef.aStart; - USHORT nFmt = ( aAdr.Tab() == nCurTab ) - ? SCA_ABS - : SCA_ABS_3D; - - aAdr.Format( aStr, nFmt, pDocP, pDocP->GetAddressConvention() ); - pEdActive->SetRefString( aStr ); - - if ( pEdActive == &aEdFormulaCell ) - theFormulaCell = aAdr; - else if ( pEdActive == &aEdVariableCell ) - theVariableCell = aAdr; - } -} - -//---------------------------------------------------------------------------- - -void ScSolverDlg::RaiseError( ScSolverErr eError ) -{ - switch ( eError ) - { - case SOLVERR_NOFORMULA: - ERRORBOX( errMsgNoFormula ); - aEdFormulaCell.GrabFocus(); - break; - - case SOLVERR_INVALID_FORMULA: - ERRORBOX( errMsgInvalidForm ); - aEdFormulaCell.GrabFocus(); - break; - - case SOLVERR_INVALID_VARIABLE: - ERRORBOX( errMsgInvalidVar ); - aEdVariableCell.GrabFocus(); - break; - - case SOLVERR_INVALID_TARGETVALUE: - ERRORBOX( errMsgInvalidVal ); - aEdTargetVal.GrabFocus(); - break; - } -} - -//---------------------------------------------------------------------------- - -BOOL ScSolverDlg::IsRefInputMode() const -{ - return pEdActive != NULL; -} - -//---------------------------------------------------------------------------- - -BOOL __EXPORT ScSolverDlg::CheckTargetValue( String& rStrVal ) -{ - sal_uInt32 n1 = 0; - double n2; - - return pDoc->GetFormatTable()->IsNumberFormat( rStrVal, n1, n2 ); -} - -//---------------------------------------------------------------------------- -// Handler: - -IMPL_LINK( ScSolverDlg, BtnHdl, PushButton*, pBtn ) -{ - if ( pBtn == &aBtnOk ) - { - theTargetValStr = aEdTargetVal.GetText(); - - // Zu ueberpruefen: - // 1. enthalten die Strings korrekte Tabellenkoordinaten/def.Namen? - // 2. verweist die Formel-Koordinate wirklich auf eine Formelzelle? - // 3. wurde ein korrekter Zielwert eingegeben - - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - USHORT nRes1 = theFormulaCell .Parse( aEdFormulaCell.GetText(), pDoc, eConv ); - USHORT nRes2 = theVariableCell.Parse( aEdVariableCell.GetText(), pDoc, eConv ); - - if ( SCA_VALID == ( nRes1 & SCA_VALID ) ) - { - if ( SCA_VALID == ( nRes2 & SCA_VALID ) ) - { - if ( CheckTargetValue( theTargetValStr ) ) - { - CellType eType; - pDoc->GetCellType( theFormulaCell.Col(), - theFormulaCell.Row(), - theFormulaCell.Tab(), - eType ); - - if ( CELLTYPE_FORMULA == eType ) - { - ScSolveParam aOutParam( theFormulaCell, - theVariableCell, - theTargetValStr ); - ScSolveItem aOutItem( SCITEM_SOLVEDATA, &aOutParam ); - - SetDispatcherLock( FALSE ); - - SwitchToDocument(); - GetBindings().GetDispatcher()->Execute( SID_SOLVE, - SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, - &aOutItem, 0L, 0L ); - Close(); - } - else RaiseError( SOLVERR_NOFORMULA ); - } - else RaiseError( SOLVERR_INVALID_TARGETVALUE ); - } - else RaiseError( SOLVERR_INVALID_VARIABLE ); - } - else RaiseError( SOLVERR_INVALID_FORMULA ); - } - else if ( pBtn == &aBtnCancel ) - { - Close(); - } - - return 0; -} - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScSolverDlg, GetFocusHdl, Control*, pCtrl ) -{ - Edit* pEdit = NULL; - pEdActive = NULL; - - if( (pCtrl == (Control*)&aEdFormulaCell) || (pCtrl == (Control*)&aRBFormulaCell) ) - pEdit = pEdActive = &aEdFormulaCell; - else if( (pCtrl == (Control*)&aEdVariableCell) || (pCtrl == (Control*)&aRBVariableCell) ) - pEdit = pEdActive = &aEdVariableCell; - else if( pCtrl == (Control*)&aEdTargetVal ) - pEdit = &aEdTargetVal; - - if( pEdit ) - pEdit->SetSelection( Selection( 0, SELECTION_MAX ) ); - - return 0; -} - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScSolverDlg, LoseFocusHdl, Control*, EMPTYARG ) -{ - bDlgLostFocus = !IsActive(); - return 0; -} - - - - +/************************************************************************* + * + * 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: solvrdlg.cxx,v $ + * $Revision: 1.13 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + + +//---------------------------------------------------------------------------- + +#include "rangelst.hxx" +#include "scitems.hxx" +#include +#include +#include + +#include "uiitems.hxx" +#include "reffact.hxx" +#include "document.hxx" +#include "scresid.hxx" +#include "solvrdlg.hrc" + +#define _SOLVRDLG_CXX +#include "solvrdlg.hxx" +#undef _SOLVERDLG_CXX + + +#define ERRORBOX(s) ErrorBox( this, WinBits( WB_OK | WB_DEF_OK), s ).Execute() + + +//============================================================================ +// class ScSolverDlg +//---------------------------------------------------------------------------- + +ScSolverDlg::ScSolverDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, + ScDocument* pDocument, + ScAddress aCursorPos ) + + : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_SOLVER ), + // + aFlVariables ( this, ScResId( FL_VARIABLES ) ), + aFtFormulaCell ( this, ScResId( FT_FORMULACELL ) ), + aEdFormulaCell ( this, ScResId( ED_FORMULACELL ) ), + aRBFormulaCell ( this, ScResId( RB_FORMULACELL ), &aEdFormulaCell, this ), + aFtTargetVal ( this, ScResId( FT_TARGETVAL ) ), + aEdTargetVal ( this, ScResId( ED_TARGETVAL ) ), + aFtVariableCell ( this, ScResId( FT_VARCELL ) ), + aEdVariableCell ( this, ScResId( ED_VARCELL ) ), + aRBVariableCell ( this, ScResId( RB_VARCELL ), &aEdVariableCell, this ), + aBtnOk ( this, ScResId( BTN_OK ) ), + aBtnCancel ( this, ScResId( BTN_CANCEL ) ), + aBtnHelp ( this, ScResId( BTN_HELP ) ), + // + theFormulaCell ( aCursorPos ), + theVariableCell ( aCursorPos ), + pDoc ( pDocument ), + nCurTab ( aCursorPos.Tab() ), + pEdActive ( NULL ), + bDlgLostFocus ( FALSE ), + errMsgInvalidVar ( ScResId( STR_INVALIDVAR ) ), + errMsgInvalidForm ( ScResId( STR_INVALIDFORM ) ), + errMsgNoFormula ( ScResId( STR_NOFORMULA ) ), + errMsgInvalidVal ( ScResId( STR_INVALIDVAL ) ) +{ + Init(); + FreeResource(); +} + +//---------------------------------------------------------------------------- + +__EXPORT ScSolverDlg::~ScSolverDlg() +{ +} + +//---------------------------------------------------------------------------- + +void __EXPORT ScSolverDlg::Init() +{ + String aStr; + + aBtnOk. SetClickHdl ( LINK( this, ScSolverDlg, BtnHdl ) ); + aBtnCancel. SetClickHdl ( LINK( this, ScSolverDlg, BtnHdl ) ); + + Link aLink = LINK( this, ScSolverDlg, GetFocusHdl ); + aEdFormulaCell. SetGetFocusHdl ( aLink ); + aRBFormulaCell. SetGetFocusHdl ( aLink ); + aEdVariableCell.SetGetFocusHdl ( aLink ); + aRBVariableCell.SetGetFocusHdl ( aLink ); + aEdTargetVal. SetGetFocusHdl ( aLink ); + + aLink = LINK( this, ScSolverDlg, LoseFocusHdl ); + aEdFormulaCell. SetLoseFocusHdl ( aLink ); + aRBFormulaCell. SetLoseFocusHdl ( aLink ); + aEdVariableCell.SetLoseFocusHdl ( aLink ); + aRBVariableCell.SetLoseFocusHdl ( aLink ); + + theFormulaCell.Format( aStr, SCA_ABS, NULL, pDoc->GetAddressConvention() ); + + aEdFormulaCell.SetText( aStr ); + aEdFormulaCell.GrabFocus(); + pEdActive = &aEdFormulaCell; +} + +//---------------------------------------------------------------------------- + +BOOL __EXPORT ScSolverDlg::Close() +{ + return DoClose( ScSolverDlgWrapper::GetChildWindowId() ); +} + +//---------------------------------------------------------------------------- + +void ScSolverDlg::SetActive() +{ + if ( bDlgLostFocus ) + { + bDlgLostFocus = FALSE; + if( pEdActive ) + pEdActive->GrabFocus(); + } + else + { + GrabFocus(); + } + RefInputDone(); +} + +//---------------------------------------------------------------------------- + +void ScSolverDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) +{ + if( pEdActive ) + { + if ( rRef.aStart != rRef.aEnd ) + RefInputStart(pEdActive); + + String aStr; + ScAddress aAdr = rRef.aStart; + USHORT nFmt = ( aAdr.Tab() == nCurTab ) + ? SCA_ABS + : SCA_ABS_3D; + + aAdr.Format( aStr, nFmt, pDocP, pDocP->GetAddressConvention() ); + pEdActive->SetRefString( aStr ); + + if ( pEdActive == &aEdFormulaCell ) + theFormulaCell = aAdr; + else if ( pEdActive == &aEdVariableCell ) + theVariableCell = aAdr; + } +} + +//---------------------------------------------------------------------------- + +void ScSolverDlg::RaiseError( ScSolverErr eError ) +{ + switch ( eError ) + { + case SOLVERR_NOFORMULA: + ERRORBOX( errMsgNoFormula ); + aEdFormulaCell.GrabFocus(); + break; + + case SOLVERR_INVALID_FORMULA: + ERRORBOX( errMsgInvalidForm ); + aEdFormulaCell.GrabFocus(); + break; + + case SOLVERR_INVALID_VARIABLE: + ERRORBOX( errMsgInvalidVar ); + aEdVariableCell.GrabFocus(); + break; + + case SOLVERR_INVALID_TARGETVALUE: + ERRORBOX( errMsgInvalidVal ); + aEdTargetVal.GrabFocus(); + break; + } +} + +//---------------------------------------------------------------------------- + +BOOL ScSolverDlg::IsRefInputMode() const +{ + return pEdActive != NULL; +} + +//---------------------------------------------------------------------------- + +BOOL __EXPORT ScSolverDlg::CheckTargetValue( String& rStrVal ) +{ + sal_uInt32 n1 = 0; + double n2; + + return pDoc->GetFormatTable()->IsNumberFormat( rStrVal, n1, n2 ); +} + +//---------------------------------------------------------------------------- +// Handler: + +IMPL_LINK( ScSolverDlg, BtnHdl, PushButton*, pBtn ) +{ + if ( pBtn == &aBtnOk ) + { + theTargetValStr = aEdTargetVal.GetText(); + + // Zu ueberpruefen: + // 1. enthalten die Strings korrekte Tabellenkoordinaten/def.Namen? + // 2. verweist die Formel-Koordinate wirklich auf eine Formelzelle? + // 3. wurde ein korrekter Zielwert eingegeben + + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + USHORT nRes1 = theFormulaCell .Parse( aEdFormulaCell.GetText(), pDoc, eConv ); + USHORT nRes2 = theVariableCell.Parse( aEdVariableCell.GetText(), pDoc, eConv ); + + if ( SCA_VALID == ( nRes1 & SCA_VALID ) ) + { + if ( SCA_VALID == ( nRes2 & SCA_VALID ) ) + { + if ( CheckTargetValue( theTargetValStr ) ) + { + CellType eType; + pDoc->GetCellType( theFormulaCell.Col(), + theFormulaCell.Row(), + theFormulaCell.Tab(), + eType ); + + if ( CELLTYPE_FORMULA == eType ) + { + ScSolveParam aOutParam( theFormulaCell, + theVariableCell, + theTargetValStr ); + ScSolveItem aOutItem( SCITEM_SOLVEDATA, &aOutParam ); + + SetDispatcherLock( FALSE ); + + SwitchToDocument(); + GetBindings().GetDispatcher()->Execute( SID_SOLVE, + SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, + &aOutItem, 0L, 0L ); + Close(); + } + else RaiseError( SOLVERR_NOFORMULA ); + } + else RaiseError( SOLVERR_INVALID_TARGETVALUE ); + } + else RaiseError( SOLVERR_INVALID_VARIABLE ); + } + else RaiseError( SOLVERR_INVALID_FORMULA ); + } + else if ( pBtn == &aBtnCancel ) + { + Close(); + } + + return 0; +} + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScSolverDlg, GetFocusHdl, Control*, pCtrl ) +{ + Edit* pEdit = NULL; + pEdActive = NULL; + + if( (pCtrl == (Control*)&aEdFormulaCell) || (pCtrl == (Control*)&aRBFormulaCell) ) + pEdit = pEdActive = &aEdFormulaCell; + else if( (pCtrl == (Control*)&aEdVariableCell) || (pCtrl == (Control*)&aRBVariableCell) ) + pEdit = pEdActive = &aEdVariableCell; + else if( pCtrl == (Control*)&aEdTargetVal ) + pEdit = &aEdTargetVal; + + if( pEdit ) + pEdit->SetSelection( Selection( 0, SELECTION_MAX ) ); + + return 0; +} + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScSolverDlg, LoseFocusHdl, Control*, EMPTYARG ) +{ + bDlgLostFocus = !IsActive(); + return 0; +} + + + + diff --git a/sc/source/ui/miscdlgs/tabopdlg.cxx b/sc/source/ui/miscdlgs/tabopdlg.cxx index f819579b7601..0409f94c3d35 100644 --- a/sc/source/ui/miscdlgs/tabopdlg.cxx +++ b/sc/source/ui/miscdlgs/tabopdlg.cxx @@ -1,374 +1,374 @@ -/************************************************************************* - * - * 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: tabopdlg.cxx,v $ - * $Revision: 1.12 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -//---------------------------------------------------------------------------- - -#include "scitems.hxx" -#include -#include - -#include "uiitems.hxx" -#include "global.hxx" -#include "document.hxx" -#include "scresid.hxx" -#include "sc.hrc" -#include "reffact.hxx" -#include "tabopdlg.hrc" - -#define _TABOPDLG_CXX -#include "tabopdlg.hxx" - - -//============================================================================ -// class ScTabOpDlg -//---------------------------------------------------------------------------- - -ScTabOpDlg::ScTabOpDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, - ScDocument* pDocument, - const ScRefAddress& rCursorPos ) - - : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_TABOP ), - // - aFlVariables ( this, ScResId( FL_VARIABLES ) ), - aFtFormulaRange ( this, ScResId( FT_FORMULARANGE ) ), - aEdFormulaRange ( this, ScResId( ED_FORMULARANGE ) ), - aRBFormulaRange ( this, ScResId( RB_FORMULARANGE ), &aEdFormulaRange, this ), - aFtRowCell ( this, ScResId( FT_ROWCELL ) ), - aEdRowCell ( this, ScResId( ED_ROWCELL ) ), - aRBRowCell ( this, ScResId( RB_ROWCELL ), &aEdRowCell, this ), - aFtColCell ( this, ScResId( FT_COLCELL ) ), - aEdColCell ( this, ScResId( ED_COLCELL ) ), - aRBColCell ( this, ScResId( RB_COLCELL ), &aEdColCell, this ), - aBtnOk ( this, ScResId( BTN_OK ) ), - aBtnCancel ( this, ScResId( BTN_CANCEL ) ), - aBtnHelp ( this, ScResId( BTN_HELP ) ), - // - theFormulaCell ( rCursorPos ), - pDoc ( pDocument ), - nCurTab ( theFormulaCell.Tab() ), - pEdActive ( NULL ), - bDlgLostFocus ( FALSE ), - errMsgNoFormula ( ScResId( STR_NOFORMULA ) ), - errMsgNoColRow ( ScResId( STR_NOCOLROW ) ), - errMsgWrongFormula ( ScResId( STR_WRONGFORMULA ) ), - errMsgWrongRowCol ( ScResId( STR_WRONGROWCOL ) ), - errMsgNoColFormula ( ScResId( STR_NOCOLFORMULA ) ), - errMsgNoRowFormula ( ScResId( STR_NOROWFORMULA ) ) -{ - Init(); - FreeResource(); -} - -//---------------------------------------------------------------------------- - -__EXPORT ScTabOpDlg::~ScTabOpDlg() -{ - Hide(); -} - -//---------------------------------------------------------------------------- - -void __EXPORT ScTabOpDlg::Init() -{ - aBtnOk. SetClickHdl ( LINK( this, ScTabOpDlg, BtnHdl ) ); - aBtnCancel. SetClickHdl ( LINK( this, ScTabOpDlg, BtnHdl ) ); - - Link aLink = LINK( this, ScTabOpDlg, GetFocusHdl ); - aEdFormulaRange.SetGetFocusHdl( aLink ); - aRBFormulaRange.SetGetFocusHdl( aLink ); - aEdRowCell. SetGetFocusHdl( aLink ); - aRBRowCell. SetGetFocusHdl( aLink ); - aEdColCell. SetGetFocusHdl( aLink ); - aRBColCell. SetGetFocusHdl( aLink ); - - aLink = LINK( this, ScTabOpDlg, LoseFocusHdl ); - aEdFormulaRange.SetLoseFocusHdl( aLink ); - aRBFormulaRange.SetLoseFocusHdl( aLink ); - aEdRowCell. SetLoseFocusHdl( aLink ); - aRBRowCell. SetLoseFocusHdl( aLink ); - aEdColCell. SetLoseFocusHdl( aLink ); - aRBColCell. SetLoseFocusHdl( aLink ); - - aEdFormulaRange.GrabFocus(); - pEdActive = &aEdFormulaRange; - - //@BugID 54702 Enablen/Disablen nur noch in Basisklasse - //SFX_APPWINDOW->Enable(); -} - -//---------------------------------------------------------------------------- - -BOOL __EXPORT ScTabOpDlg::Close() -{ - return DoClose( ScTabOpDlgWrapper::GetChildWindowId() ); -} - -//---------------------------------------------------------------------------- - -void ScTabOpDlg::SetActive() -{ - if ( bDlgLostFocus ) - { - bDlgLostFocus = FALSE; - if( pEdActive ) - pEdActive->GrabFocus(); - } - else - GrabFocus(); - - RefInputDone(); -} - -//---------------------------------------------------------------------------- - -void ScTabOpDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) -{ - if ( pEdActive ) - { - ScAddress::Details aDetails(pDocP->GetAddressConvention(), 0, 0); - - if ( rRef.aStart != rRef.aEnd ) - RefInputStart(pEdActive); - - String aStr; - USHORT nFmt = ( rRef.aStart.Tab() == nCurTab ) - ? SCR_ABS - : SCR_ABS_3D; - - if ( pEdActive == &aEdFormulaRange ) - { - theFormulaCell.Set( rRef.aStart, false, false, false); - theFormulaEnd.Set( rRef.aEnd, false, false, false); - rRef.Format( aStr, nFmt, pDocP, aDetails ); - } - else if ( pEdActive == &aEdRowCell ) - { - theRowCell.Set( rRef.aStart, false, false, false); - rRef.aStart.Format( aStr, nFmt, pDocP, aDetails ); - } - else if ( pEdActive == &aEdColCell ) - { - theColCell.Set( rRef.aStart, false, false, false); - rRef.aStart.Format( aStr, nFmt, pDocP, aDetails ); - } - - pEdActive->SetRefString( aStr ); - } -} - -//---------------------------------------------------------------------------- - -void ScTabOpDlg::RaiseError( ScTabOpErr eError ) -{ - const String* pMsg = &errMsgNoFormula; - Edit* pEd = &aEdFormulaRange; - - switch ( eError ) - { - case TABOPERR_NOFORMULA: - pMsg = &errMsgNoFormula; - pEd = &aEdFormulaRange; - break; - - case TABOPERR_NOCOLROW: - pMsg = &errMsgNoColRow; - pEd = &aEdRowCell; - break; - - case TABOPERR_WRONGFORMULA: - pMsg = &errMsgWrongFormula; - pEd = &aEdFormulaRange; - break; - - case TABOPERR_WRONGROW: - pMsg = &errMsgWrongRowCol; - pEd = &aEdRowCell; - break; - - case TABOPERR_NOCOLFORMULA: - pMsg = &errMsgNoColFormula; - pEd = &aEdFormulaRange; - break; - - case TABOPERR_WRONGCOL: - pMsg = &errMsgWrongRowCol; - pEd = &aEdColCell; - break; - - case TABOPERR_NOROWFORMULA: - pMsg = &errMsgNoRowFormula; - pEd = &aEdFormulaRange; - break; - } - - ErrorBox( this, WinBits( WB_OK_CANCEL | WB_DEF_OK), *pMsg ).Execute(); - pEd->GrabFocus(); -} - -//---------------------------------------------------------------------------- - -BOOL lcl_Parse( const String& rString, ScDocument* pDoc, SCTAB nCurTab, - ScRefAddress& rStart, ScRefAddress& rEnd ) -{ - BOOL bRet = FALSE; - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - if ( rString.Search(':') != STRING_NOTFOUND ) - bRet = ConvertDoubleRef( pDoc, rString, nCurTab, rStart, rEnd, eConv ); - else - { - bRet = ConvertSingleRef( pDoc, rString, nCurTab, rStart, eConv ); - rEnd = rStart; - } - return bRet; -} - -//---------------------------------------------------------------------------- -// Handler: - -IMPL_LINK( ScTabOpDlg, BtnHdl, PushButton*, pBtn ) -{ - if ( pBtn == &aBtnOk ) - { - BYTE nMode = 3; - USHORT nError = 0; - - // Zu ueberpruefen: - // 1. enthalten die Strings korrekte Tabellenkoordinaten/def.Namen? - // 2. IstFormelRang Zeile bei leerer Zeile bzw. Spalte bei leerer Spalte - // bzw. Einfachreferenz bei beidem? - // 3. Ist mindestens Zeile oder Spalte und Formel voll? - - if (aEdFormulaRange.GetText().Len() == 0) - nError = TABOPERR_NOFORMULA; - else if (aEdRowCell.GetText().Len() == 0 && - aEdColCell.GetText().Len() == 0) - nError = TABOPERR_NOCOLROW; - else if ( !lcl_Parse( aEdFormulaRange.GetText(), pDoc, nCurTab, - theFormulaCell, theFormulaEnd ) ) - nError = TABOPERR_WRONGFORMULA; - else - { - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - if (aEdRowCell.GetText().Len() > 0) - { - if (!ConvertSingleRef( pDoc, aEdRowCell.GetText(), nCurTab, - theRowCell, eConv )) - nError = TABOPERR_WRONGROW; - else - { - if (aEdColCell.GetText().Len() == 0 && - theFormulaCell.Col() != theFormulaEnd.Col()) - nError = TABOPERR_NOCOLFORMULA; - else - nMode = 1; - } - } - if (aEdColCell.GetText().Len() > 0) - { - if (!ConvertSingleRef( pDoc, aEdColCell.GetText(), nCurTab, - theColCell, eConv )) - nError = TABOPERR_WRONGCOL; - else - { - if (nMode == 1) // beides - { - nMode = 2; - ConvertSingleRef( pDoc, aEdFormulaRange.GetText(), nCurTab, - theFormulaCell, eConv ); - } - else if (theFormulaCell.Row() != theFormulaEnd.Row()) - nError = TABOPERR_NOROWFORMULA; - else - nMode = 0; - } - } - } - - if (nError) - RaiseError( (ScTabOpErr) nError ); - else - { - ScTabOpParam aOutParam( theFormulaCell, - theFormulaEnd, - theRowCell, - theColCell, - nMode ); - ScTabOpItem aOutItem( SID_TABOP, &aOutParam ); - - SetDispatcherLock( FALSE ); - SwitchToDocument(); - GetBindings().GetDispatcher()->Execute( SID_TABOP, - SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, - &aOutItem, 0L, 0L ); - Close(); - } - } - else if ( pBtn == &aBtnCancel ) - Close(); - - return 0; -} - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScTabOpDlg, GetFocusHdl, Control*, pCtrl ) -{ - if( (pCtrl == (Control*)&aEdFormulaRange) || (pCtrl == (Control*)&aRBFormulaRange) ) - pEdActive = &aEdFormulaRange; - else if( (pCtrl == (Control*)&aEdRowCell) || (pCtrl == (Control*)&aRBRowCell) ) - pEdActive = &aEdRowCell; - else if( (pCtrl == (Control*)&aEdColCell) || (pCtrl == (Control*)&aRBColCell) ) - pEdActive = &aEdColCell; - else - pEdActive = NULL; - - if( pEdActive ) - pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); - - return 0; -} - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScTabOpDlg, LoseFocusHdl, Control*, EMPTYARG ) -{ - bDlgLostFocus = !IsActive(); - return 0; -} - - - - - +/************************************************************************* + * + * 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: tabopdlg.cxx,v $ + * $Revision: 1.12 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + + +//---------------------------------------------------------------------------- + +#include "scitems.hxx" +#include +#include + +#include "uiitems.hxx" +#include "global.hxx" +#include "document.hxx" +#include "scresid.hxx" +#include "sc.hrc" +#include "reffact.hxx" +#include "tabopdlg.hrc" + +#define _TABOPDLG_CXX +#include "tabopdlg.hxx" + + +//============================================================================ +// class ScTabOpDlg +//---------------------------------------------------------------------------- + +ScTabOpDlg::ScTabOpDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, + ScDocument* pDocument, + const ScRefAddress& rCursorPos ) + + : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_TABOP ), + // + aFlVariables ( this, ScResId( FL_VARIABLES ) ), + aFtFormulaRange ( this, ScResId( FT_FORMULARANGE ) ), + aEdFormulaRange ( this, ScResId( ED_FORMULARANGE ) ), + aRBFormulaRange ( this, ScResId( RB_FORMULARANGE ), &aEdFormulaRange, this ), + aFtRowCell ( this, ScResId( FT_ROWCELL ) ), + aEdRowCell ( this, ScResId( ED_ROWCELL ) ), + aRBRowCell ( this, ScResId( RB_ROWCELL ), &aEdRowCell, this ), + aFtColCell ( this, ScResId( FT_COLCELL ) ), + aEdColCell ( this, ScResId( ED_COLCELL ) ), + aRBColCell ( this, ScResId( RB_COLCELL ), &aEdColCell, this ), + aBtnOk ( this, ScResId( BTN_OK ) ), + aBtnCancel ( this, ScResId( BTN_CANCEL ) ), + aBtnHelp ( this, ScResId( BTN_HELP ) ), + // + theFormulaCell ( rCursorPos ), + pDoc ( pDocument ), + nCurTab ( theFormulaCell.Tab() ), + pEdActive ( NULL ), + bDlgLostFocus ( FALSE ), + errMsgNoFormula ( ScResId( STR_NOFORMULA ) ), + errMsgNoColRow ( ScResId( STR_NOCOLROW ) ), + errMsgWrongFormula ( ScResId( STR_WRONGFORMULA ) ), + errMsgWrongRowCol ( ScResId( STR_WRONGROWCOL ) ), + errMsgNoColFormula ( ScResId( STR_NOCOLFORMULA ) ), + errMsgNoRowFormula ( ScResId( STR_NOROWFORMULA ) ) +{ + Init(); + FreeResource(); +} + +//---------------------------------------------------------------------------- + +__EXPORT ScTabOpDlg::~ScTabOpDlg() +{ + Hide(); +} + +//---------------------------------------------------------------------------- + +void __EXPORT ScTabOpDlg::Init() +{ + aBtnOk. SetClickHdl ( LINK( this, ScTabOpDlg, BtnHdl ) ); + aBtnCancel. SetClickHdl ( LINK( this, ScTabOpDlg, BtnHdl ) ); + + Link aLink = LINK( this, ScTabOpDlg, GetFocusHdl ); + aEdFormulaRange.SetGetFocusHdl( aLink ); + aRBFormulaRange.SetGetFocusHdl( aLink ); + aEdRowCell. SetGetFocusHdl( aLink ); + aRBRowCell. SetGetFocusHdl( aLink ); + aEdColCell. SetGetFocusHdl( aLink ); + aRBColCell. SetGetFocusHdl( aLink ); + + aLink = LINK( this, ScTabOpDlg, LoseFocusHdl ); + aEdFormulaRange.SetLoseFocusHdl( aLink ); + aRBFormulaRange.SetLoseFocusHdl( aLink ); + aEdRowCell. SetLoseFocusHdl( aLink ); + aRBRowCell. SetLoseFocusHdl( aLink ); + aEdColCell. SetLoseFocusHdl( aLink ); + aRBColCell. SetLoseFocusHdl( aLink ); + + aEdFormulaRange.GrabFocus(); + pEdActive = &aEdFormulaRange; + + //@BugID 54702 Enablen/Disablen nur noch in Basisklasse + //SFX_APPWINDOW->Enable(); +} + +//---------------------------------------------------------------------------- + +BOOL __EXPORT ScTabOpDlg::Close() +{ + return DoClose( ScTabOpDlgWrapper::GetChildWindowId() ); +} + +//---------------------------------------------------------------------------- + +void ScTabOpDlg::SetActive() +{ + if ( bDlgLostFocus ) + { + bDlgLostFocus = FALSE; + if( pEdActive ) + pEdActive->GrabFocus(); + } + else + GrabFocus(); + + RefInputDone(); +} + +//---------------------------------------------------------------------------- + +void ScTabOpDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) +{ + if ( pEdActive ) + { + ScAddress::Details aDetails(pDocP->GetAddressConvention(), 0, 0); + + if ( rRef.aStart != rRef.aEnd ) + RefInputStart(pEdActive); + + String aStr; + USHORT nFmt = ( rRef.aStart.Tab() == nCurTab ) + ? SCR_ABS + : SCR_ABS_3D; + + if ( pEdActive == &aEdFormulaRange ) + { + theFormulaCell.Set( rRef.aStart, false, false, false); + theFormulaEnd.Set( rRef.aEnd, false, false, false); + rRef.Format( aStr, nFmt, pDocP, aDetails ); + } + else if ( pEdActive == &aEdRowCell ) + { + theRowCell.Set( rRef.aStart, false, false, false); + rRef.aStart.Format( aStr, nFmt, pDocP, aDetails ); + } + else if ( pEdActive == &aEdColCell ) + { + theColCell.Set( rRef.aStart, false, false, false); + rRef.aStart.Format( aStr, nFmt, pDocP, aDetails ); + } + + pEdActive->SetRefString( aStr ); + } +} + +//---------------------------------------------------------------------------- + +void ScTabOpDlg::RaiseError( ScTabOpErr eError ) +{ + const String* pMsg = &errMsgNoFormula; + Edit* pEd = &aEdFormulaRange; + + switch ( eError ) + { + case TABOPERR_NOFORMULA: + pMsg = &errMsgNoFormula; + pEd = &aEdFormulaRange; + break; + + case TABOPERR_NOCOLROW: + pMsg = &errMsgNoColRow; + pEd = &aEdRowCell; + break; + + case TABOPERR_WRONGFORMULA: + pMsg = &errMsgWrongFormula; + pEd = &aEdFormulaRange; + break; + + case TABOPERR_WRONGROW: + pMsg = &errMsgWrongRowCol; + pEd = &aEdRowCell; + break; + + case TABOPERR_NOCOLFORMULA: + pMsg = &errMsgNoColFormula; + pEd = &aEdFormulaRange; + break; + + case TABOPERR_WRONGCOL: + pMsg = &errMsgWrongRowCol; + pEd = &aEdColCell; + break; + + case TABOPERR_NOROWFORMULA: + pMsg = &errMsgNoRowFormula; + pEd = &aEdFormulaRange; + break; + } + + ErrorBox( this, WinBits( WB_OK_CANCEL | WB_DEF_OK), *pMsg ).Execute(); + pEd->GrabFocus(); +} + +//---------------------------------------------------------------------------- + +BOOL lcl_Parse( const String& rString, ScDocument* pDoc, SCTAB nCurTab, + ScRefAddress& rStart, ScRefAddress& rEnd ) +{ + BOOL bRet = FALSE; + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + if ( rString.Search(':') != STRING_NOTFOUND ) + bRet = ConvertDoubleRef( pDoc, rString, nCurTab, rStart, rEnd, eConv ); + else + { + bRet = ConvertSingleRef( pDoc, rString, nCurTab, rStart, eConv ); + rEnd = rStart; + } + return bRet; +} + +//---------------------------------------------------------------------------- +// Handler: + +IMPL_LINK( ScTabOpDlg, BtnHdl, PushButton*, pBtn ) +{ + if ( pBtn == &aBtnOk ) + { + BYTE nMode = 3; + USHORT nError = 0; + + // Zu ueberpruefen: + // 1. enthalten die Strings korrekte Tabellenkoordinaten/def.Namen? + // 2. IstFormelRang Zeile bei leerer Zeile bzw. Spalte bei leerer Spalte + // bzw. Einfachreferenz bei beidem? + // 3. Ist mindestens Zeile oder Spalte und Formel voll? + + if (aEdFormulaRange.GetText().Len() == 0) + nError = TABOPERR_NOFORMULA; + else if (aEdRowCell.GetText().Len() == 0 && + aEdColCell.GetText().Len() == 0) + nError = TABOPERR_NOCOLROW; + else if ( !lcl_Parse( aEdFormulaRange.GetText(), pDoc, nCurTab, + theFormulaCell, theFormulaEnd ) ) + nError = TABOPERR_WRONGFORMULA; + else + { + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + if (aEdRowCell.GetText().Len() > 0) + { + if (!ConvertSingleRef( pDoc, aEdRowCell.GetText(), nCurTab, + theRowCell, eConv )) + nError = TABOPERR_WRONGROW; + else + { + if (aEdColCell.GetText().Len() == 0 && + theFormulaCell.Col() != theFormulaEnd.Col()) + nError = TABOPERR_NOCOLFORMULA; + else + nMode = 1; + } + } + if (aEdColCell.GetText().Len() > 0) + { + if (!ConvertSingleRef( pDoc, aEdColCell.GetText(), nCurTab, + theColCell, eConv )) + nError = TABOPERR_WRONGCOL; + else + { + if (nMode == 1) // beides + { + nMode = 2; + ConvertSingleRef( pDoc, aEdFormulaRange.GetText(), nCurTab, + theFormulaCell, eConv ); + } + else if (theFormulaCell.Row() != theFormulaEnd.Row()) + nError = TABOPERR_NOROWFORMULA; + else + nMode = 0; + } + } + } + + if (nError) + RaiseError( (ScTabOpErr) nError ); + else + { + ScTabOpParam aOutParam( theFormulaCell, + theFormulaEnd, + theRowCell, + theColCell, + nMode ); + ScTabOpItem aOutItem( SID_TABOP, &aOutParam ); + + SetDispatcherLock( FALSE ); + SwitchToDocument(); + GetBindings().GetDispatcher()->Execute( SID_TABOP, + SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, + &aOutItem, 0L, 0L ); + Close(); + } + } + else if ( pBtn == &aBtnCancel ) + Close(); + + return 0; +} + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScTabOpDlg, GetFocusHdl, Control*, pCtrl ) +{ + if( (pCtrl == (Control*)&aEdFormulaRange) || (pCtrl == (Control*)&aRBFormulaRange) ) + pEdActive = &aEdFormulaRange; + else if( (pCtrl == (Control*)&aEdRowCell) || (pCtrl == (Control*)&aRBRowCell) ) + pEdActive = &aEdRowCell; + else if( (pCtrl == (Control*)&aEdColCell) || (pCtrl == (Control*)&aRBColCell) ) + pEdActive = &aEdColCell; + else + pEdActive = NULL; + + if( pEdActive ) + pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) ); + + return 0; +} + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScTabOpDlg, LoseFocusHdl, Control*, EMPTYARG ) +{ + bDlgLostFocus = !IsActive(); + return 0; +} + + + + + diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx index 0709a84ad085..dabc36222df1 100644 --- a/sc/source/ui/namedlg/namedlg.cxx +++ b/sc/source/ui/namedlg/namedlg.cxx @@ -1,652 +1,652 @@ -/************************************************************************* - * - * 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: namedlg.cxx,v $ - * $Revision: 1.11 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -// System - Includes --------------------------------------------------------- - - - -// INCLUDE ------------------------------------------------------------------- - -#include "global.hxx" -#include "reffact.hxx" -#include "document.hxx" -#include "docfunc.hxx" -#include "scresid.hxx" -#include "globstr.hrc" -#include "namedlg.hrc" - -#define _NAMEDLG_CXX -#include "namedlg.hxx" -#undef _NAMEDLG_CXX -#include - - - -// defines ------------------------------------------------------------------- - -#define ABS_SREF SCA_VALID \ - | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE -#define ABS_DREF ABS_SREF \ - | SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE -#define ABS_SREF3D ABS_SREF | SCA_TAB_3D -#define ABS_DREF3D ABS_DREF | SCA_TAB_3D - - -//============================================================================ -// Hilfsklasse: Merken der aktuellen Bereichsoptionen, -// wenn ein Name in der ComboBox gefunden wird. - -struct SaveData -{ - SaveData() - : bCriteria(FALSE),bPrintArea(FALSE), - bColHeader(FALSE),bRowHeader(FALSE), - bDirty(FALSE) {} - - void Clear() - { - aStrSymbol.Erase(); - bCriteria = bPrintArea = - bColHeader = bRowHeader = FALSE; - bDirty = TRUE; - } - - String aStrSymbol; - BOOL bCriteria:1; - BOOL bPrintArea:1; - BOOL bColHeader:1; - BOOL bRowHeader:1; - BOOL bDirty:1; -}; - -static SaveData* pSaveObj = NULL; - -#define SAVE_DATA() \ - pSaveObj->aStrSymbol = aEdAssign.GetText(); \ - pSaveObj->bCriteria = aBtnCriteria.IsChecked(); \ - pSaveObj->bPrintArea = aBtnPrintArea.IsChecked(); \ - pSaveObj->bColHeader = aBtnColHeader.IsChecked(); \ - pSaveObj->bRowHeader = aBtnRowHeader.IsChecked(); \ - pSaveObj->bDirty = TRUE; - -#define RESTORE_DATA() \ - if ( pSaveObj->bDirty ) \ - { \ - aEdAssign.SetText( pSaveObj->aStrSymbol ); \ - aBtnCriteria.Check( pSaveObj->bCriteria ); \ - aBtnPrintArea.Check( pSaveObj->bPrintArea ); \ - aBtnColHeader.Check( pSaveObj->bColHeader ); \ - aBtnRowHeader.Check( pSaveObj->bRowHeader ); \ - pSaveObj->bDirty = FALSE; \ - } - -#define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute(); - - -//============================================================================ -// class ScNameDlg - -//---------------------------------------------------------------------------- - -ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, - ScViewData* ptrViewData, - const ScAddress& aCursorPos ) - - : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_NAMES ), - // - aFlName ( this, ScResId( FL_NAME ) ), - aEdName ( this, ScResId( ED_NAME ) ), - // - aFlAssign ( this, ScResId( FL_ASSIGN ) ), - aEdAssign ( this, ScResId( ED_ASSIGN ) ), - aRbAssign ( this, ScResId( RB_ASSIGN ), &aEdAssign, this ), - // - aFlType ( this, ScResId( FL_TYPE ) ), - aBtnPrintArea ( this, ScResId( BTN_PRINTAREA ) ), - aBtnColHeader ( this, ScResId( BTN_COLHEADER ) ), - aBtnCriteria ( this, ScResId( BTN_CRITERIA ) ), - aBtnRowHeader ( this, ScResId( BTN_ROWHEADER ) ), - // - aBtnOk ( this, ScResId( BTN_OK ) ), - aBtnCancel ( this, ScResId( BTN_CANCEL ) ), - aBtnHelp ( this, ScResId( BTN_HELP ) ), - aBtnAdd ( this, ScResId( BTN_ADD ) ), - aBtnRemove ( this, ScResId( BTN_REMOVE ) ), - aBtnMore ( this, ScResId( BTN_MORE ) ), - // - bSaved (FALSE), - aStrAdd ( ScResId( STR_ADD ) ), - aStrModify ( ScResId( STR_MODIFY ) ), - errMsgInvalidSym( ScResId( STR_INVALIDSYMBOL ) ), - // - pViewData ( ptrViewData ), - pDoc ( ptrViewData->GetDocument() ), - aLocalRangeName ( *(pDoc->GetRangeName()) ), - theCursorPos ( aCursorPos ) // zum Berechnen der Referenzen -{ - pSaveObj = new SaveData; - Init(); - FreeResource(); -} - - -//---------------------------------------------------------------------------- - -__EXPORT ScNameDlg::~ScNameDlg() -{ - DELETEZ( pSaveObj ); -} - - -//---------------------------------------------------------------------------- - -void __EXPORT ScNameDlg::Init() -{ - String aAreaStr; - ScRange aRange; - - DBG_ASSERT( pViewData && pDoc, "ViewData oder Document nicht gefunden!" ); - - aBtnOk.SetClickHdl ( LINK( this, ScNameDlg, OkBtnHdl ) ); - aBtnCancel.SetClickHdl ( LINK( this, ScNameDlg, CancelBtnHdl ) ); - aBtnAdd.SetClickHdl ( LINK( this, ScNameDlg, AddBtnHdl ) ); - aBtnRemove.SetClickHdl ( LINK( this, ScNameDlg, RemoveBtnHdl ) ); - aEdAssign.SetGetFocusHdl( LINK( this, ScNameDlg, AssignGetFocusHdl ) ); - aEdAssign.SetModifyHdl ( LINK( this, ScNameDlg, EdModifyHdl ) ); - aEdName.SetModifyHdl ( LINK( this, ScNameDlg, EdModifyHdl ) ); - aEdName.SetSelectHdl ( LINK( this, ScNameDlg, NameSelectHdl ) ); - - aBtnCriteria .Hide(); - aBtnPrintArea.Hide(); - aBtnColHeader.Hide(); - aBtnRowHeader.Hide(); - - aBtnMore.AddWindow( &aFlType ); - aBtnMore.AddWindow( &aBtnCriteria ); - aBtnMore.AddWindow( &aBtnPrintArea ); - aBtnMore.AddWindow( &aBtnColHeader ); - aBtnMore.AddWindow( &aBtnRowHeader ); - - UpdateNames(); - - pViewData->GetSimpleArea( aRange ); - aRange.Format( aAreaStr, ABS_DREF3D, pDoc, - ScAddress::Details(pDoc->GetAddressConvention(), 0, 0) ); - - theCurSel = Selection( 0, SELECTION_MAX ); - aEdAssign.GrabFocus(); - aEdAssign.SetText( aAreaStr ); - aEdAssign.SetSelection( theCurSel ); - aEdName.GrabFocus(); - - aBtnAdd.Disable(); - aBtnRemove.Disable(); - if ( aEdName.GetEntryCount() > 0 ) - aBtnAdd.SetText( aStrAdd ); - UpdateChecks(); - EdModifyHdl( 0 ); - - bSaved=TRUE; - SAVE_DATA() - - //@BugID 54702 - //SFX_APPWINDOW->Disable(FALSE); //! allgemeine Methode im ScAnyRefDlg -} - -//---------------------------------------------------------------------------- -BOOL ScNameDlg::IsRefInputMode() const -{ - return aEdAssign.IsEnabled(); -} - -void ScNameDlg::RefInputDone( BOOL bForced) -{ - ScAnyRefDlg::RefInputDone(bForced); - EdModifyHdl(&aEdAssign); -} -//---------------------------------------------------------------------------- -// Uebergabe eines mit der Maus selektierten Tabellenbereiches, der dann als -// neue Selektion im Referenz-Edit angezeigt wird. - - -void ScNameDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) -{ - if ( aEdAssign.IsEnabled() ) - { - if ( rRef.aStart != rRef.aEnd ) - RefInputStart(&aEdAssign); - String aRefStr; - rRef.Format( aRefStr, ABS_DREF3D, pDocP, - ScAddress::Details(pDocP->GetAddressConvention(), 0, 0) ); - aEdAssign.SetRefString( aRefStr ); - } -} - - -//---------------------------------------------------------------------------- -BOOL __EXPORT ScNameDlg::Close() -{ - return DoClose( ScNameDlgWrapper::GetChildWindowId() ); -} - - -//---------------------------------------------------------------------------- - -void ScNameDlg::SetActive() -{ - aEdAssign.GrabFocus(); - RefInputDone(); -} - - -//---------------------------------------------------------------------------- - -void __EXPORT ScNameDlg::UpdateChecks() -{ - USHORT nCurPos=0; - - if(aLocalRangeName.SearchName( aEdName.GetText(), nCurPos)) - { - ScRangeData* pData=(ScRangeData*)(aLocalRangeName.At( nCurPos )); - aBtnCriteria .Check( pData->HasType( RT_CRITERIA ) ); - aBtnPrintArea.Check( pData->HasType( RT_PRINTAREA ) ); - aBtnColHeader.Check( pData->HasType( RT_COLHEADER ) ); - aBtnRowHeader.Check( pData->HasType( RT_ROWHEADER ) ); - } - - // Falls Edit-Feld leer ist: Typ-CheckBoxen deaktivieren: - - if ( aEdName.GetText().Len() != 0 ) - { - if ( !aFlType.IsEnabled() ) - { - aFlType .Enable(); - aBtnCriteria .Enable(); - aBtnPrintArea.Enable(); - aBtnColHeader.Enable(); - aBtnRowHeader.Enable(); - aFlAssign .Enable(); - aEdAssign .Enable(); - aRbAssign .Enable(); - } - } - else if ( aFlType.IsEnabled() ) - { - aFlType .Disable(); - aBtnCriteria .Disable(); - aBtnPrintArea.Disable(); - aBtnColHeader.Disable(); - aBtnRowHeader.Disable(); - aFlAssign .Disable(); - aEdAssign .Disable(); - aRbAssign .Disable(); - } -} - - -//---------------------------------------------------------------------------- - -void __EXPORT ScNameDlg::UpdateNames() -{ - USHORT nRangeCount = aLocalRangeName.GetCount(); - - aEdName.SetUpdateMode( FALSE ); - //----------------------------------------------------------- - USHORT nNamePos = aEdName.GetTopEntry(); - aEdName.Clear(); - - aEdAssign.SetText( EMPTY_STRING ); - - if ( nRangeCount > 0 ) - { - ScRangeData* pRangeData = NULL; - String aString; - - for ( USHORT i=0; iHasType( RT_DATABASE ) - && !pRangeData->HasType( RT_SHARED ) ) - { - pRangeData->GetName( aString ); - aEdName.InsertEntry( aString ); - } - } - } - } - else - { - aBtnAdd.SetText( aStrAdd ); - aBtnAdd.Disable(); - aBtnRemove.Disable(); - } - //----------------------------------------------------------- - aEdName.SetUpdateMode( TRUE ); - aEdName.SetTopEntry(nNamePos); - aEdName.Invalidate(); -} - - -//---------------------------------------------------------------------------- - -void __EXPORT ScNameDlg::CalcCurTableAssign( String& aAssign, USHORT nCurPos ) -{ - ScRangeData* pRangeData = (ScRangeData*)(aLocalRangeName.At( nCurPos )); - - if ( pRangeData ) - { - rtl::OUStringBuffer sBuffer; - pRangeData->UpdateSymbol( sBuffer, theCursorPos ); - aAssign = sBuffer; - } - else - { - aAssign.Erase(); - } -} - - -//---------------------------------------------------------------------------- -// Handler: -// ======== - -IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG ) -{ - if ( aBtnAdd.IsEnabled() ) - AddBtnHdl( 0 ); - - if ( !aBtnAdd.IsEnabled() && !aBtnRemove.IsEnabled() ) - { - ScDocShell* pDocSh = pViewData->GetDocShell(); - ScDocFunc aFunc(*pDocSh); - aFunc.ModifyRangeNames( aLocalRangeName, FALSE ); - Close(); - } - return 0; -} - - -//---------------------------------------------------------------------------- - -IMPL_LINK_INLINE_START( ScNameDlg, CancelBtnHdl, void *, EMPTYARG ) -{ - Close(); - return 0; -} -IMPL_LINK_INLINE_END( ScNameDlg, CancelBtnHdl, void *, EMPTYARG ) - - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG ) -{ - BOOL bAdded = FALSE; - String aNewEntry = aEdName.GetText(); - USHORT nNamePos = aEdName.GetTopEntry(); - aNewEntry.EraseLeadingChars( ' ' ); - aNewEntry.EraseTrailingChars( ' ' ); - - if ( aNewEntry.Len() > 0 ) - { - if ( ScRangeData::IsNameValid( aNewEntry, pDoc ) ) - { - if ( pDoc ) - { - ScRangeData* pNewEntry = NULL; - RangeType nType = RT_NAME; - USHORT nFoundAt = 0; - String theSymbol = aEdAssign.GetText(); - String aStrPos; - String aStrArea; - - pNewEntry = new ScRangeData( pDoc, - aNewEntry, - theSymbol, - theCursorPos, - nType ); - if (pNewEntry) - { - nType = nType - | (aBtnRowHeader .IsChecked() ? RT_ROWHEADER : RangeType(0)) - | (aBtnColHeader .IsChecked() ? RT_COLHEADER : RangeType(0)) - | (aBtnPrintArea .IsChecked() ? RT_PRINTAREA : RangeType(0)) - | (aBtnCriteria .IsChecked() ? RT_CRITERIA : RangeType(0)); - pNewEntry->AddType(nType); - } - - // theSymbol gueltig? - // (= konnte theSymbol im ScRangeData-Ctor - // in ein Token-Array uebersetzt werden?) - if ( 0 == pNewEntry->GetErrCode() ) - { - // Eintrag bereits vorhanden? Dann vorher entfernen (=Aendern) - if ( aLocalRangeName.SearchName( aNewEntry, nFoundAt ) ) - { // alten Index uebernehmen - pNewEntry->SetIndex( - ((ScRangeData*)(aLocalRangeName.At(nFoundAt)))->GetIndex() ); - aLocalRangeName.AtFree( nFoundAt ); - } - else - pSaveObj->Clear(); - - if ( !aLocalRangeName.Insert( pNewEntry ) ) - delete pNewEntry; - - UpdateNames(); - bSaved=FALSE; - RESTORE_DATA() - aEdName.SetText(EMPTY_STRING); - aEdName.GrabFocus(); - UpdateChecks(); - aBtnAdd.SetText( aStrAdd ); - aBtnAdd.Disable(); - aBtnRemove.Disable(); - - //@BugID 54702 raus mit dem Sch. - //SFX_APPWINDOW->Disable(FALSE); //! allgemeine Methode im ScAnyRefDlg - - bAdded = TRUE; - } - else // theSymbol ungueltig - { - delete pNewEntry; - ERRORBOX( errMsgInvalidSym ); - theCurSel = Selection( 0, SELECTION_MAX ); - aEdAssign.GrabFocus(); - } - } - } - else - { - ERRORBOX( ScGlobal::GetRscString(STR_INVALIDNAME) ); - aEdName.SetSelection( Selection( 0, SELECTION_MAX ) ); - aEdName.GrabFocus(); - } - } - - aEdName.SetTopEntry(nNamePos); - return bAdded; -} - - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG ) -{ - USHORT nRemoveAt = 0; - const String aStrEntry = aEdName.GetText(); - - if ( aLocalRangeName.SearchName( aStrEntry, nRemoveAt ) ) - { - String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY ); - String aMsg = aStrDelMsg.GetToken( 0, '#' ); - - aMsg += aStrEntry; - aMsg += aStrDelMsg.GetToken( 1, '#' ); - - if ( RET_YES == - QueryBox( this, WinBits( WB_YES_NO | WB_DEF_YES ), aMsg ).Execute() ) - { - aLocalRangeName.AtFree( nRemoveAt ); - UpdateNames(); - UpdateChecks(); - bSaved=FALSE; - RESTORE_DATA() - theCurSel = Selection( 0, SELECTION_MAX ); - aBtnAdd.SetText( aStrAdd ); - aBtnAdd.Disable(); - aBtnRemove.Disable(); - } - } - return 0; -} - - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG ) -{ - USHORT nAtPos; - - if ( aLocalRangeName.SearchName( aEdName.GetText(), nAtPos ) ) - { - String aSymbol; - ScRangeData* pData = (ScRangeData*)(aLocalRangeName.At( nAtPos )); - - if ( pData ) - { - pData->GetSymbol( aSymbol ); - CalcCurTableAssign( aSymbol, nAtPos ); - aEdAssign.SetText( aSymbol ); - aBtnAdd.SetText( aStrModify ); - theCurSel = Selection( 0, SELECTION_MAX ); - } - } - UpdateChecks(); - return 0; -} - - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd ) -{ - String theName = aEdName.GetText(); - String theSymbol = aEdAssign.GetText(); - BOOL bNameFound = (COMBOBOX_ENTRY_NOTFOUND - != aEdName.GetEntryPos( theName )); - - if ( pEd == &aEdName ) - { - if ( theName.Len() == 0 ) - { - if ( aBtnAdd.GetText() != aStrAdd ) - aBtnAdd.SetText( aStrAdd ); - aBtnAdd.Disable(); - aBtnRemove.Disable(); - aFlAssign.Disable(); - aEdAssign.Disable(); - aRbAssign.Disable(); - //@BugID 54702 raus mit dem Sch. - //SFX_APPWINDOW->Disable(FALSE); //! allgemeine Methode im ScAnyRefDlg - } - else - { - if ( bNameFound ) - { - if ( aBtnAdd.GetText() != aStrModify ) - aBtnAdd.SetText( aStrModify ); - - aBtnRemove.Enable(); - - if(!bSaved) - { - bSaved=TRUE; - SAVE_DATA() - } - NameSelectHdl( 0 ); - } - else - { - if ( aBtnAdd.GetText() != aStrAdd ) - aBtnAdd.SetText( aStrAdd ); - aBtnRemove.Disable(); - - bSaved=FALSE; - RESTORE_DATA() - } - theSymbol = aEdAssign.GetText(); - - if ( theSymbol.Len() > 0 ) - aBtnAdd.Enable(); - else - aBtnAdd.Disable(); - - aFlAssign.Enable(); - aEdAssign.Enable(); - aRbAssign.Enable(); - //@BugID 54702 raus mit dem Sch. - //SFX_APPWINDOW->Enable(); - } - UpdateChecks(); - theCurSel = Selection( 0, SELECTION_MAX ); - } - else if ( pEd == &aEdAssign ) - { - if ( (theName.Len()>0) && (theSymbol.Len()>0) ) - { - aBtnAdd.Enable(); - if ( bNameFound ) - aBtnRemove.Enable(); - } - else - { - aBtnAdd.Disable(); - aBtnRemove.Disable(); - } - } - return 0; -} - -//------------------------------------------------------------------------ - -IMPL_LINK_INLINE_START( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG ) -{ - EdModifyHdl( &aEdAssign ); - return 0; -} -IMPL_LINK_INLINE_END( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG ) - - +/************************************************************************* + * + * 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: namedlg.cxx,v $ + * $Revision: 1.11 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + +// System - Includes --------------------------------------------------------- + + + +// INCLUDE ------------------------------------------------------------------- + +#include "global.hxx" +#include "reffact.hxx" +#include "document.hxx" +#include "docfunc.hxx" +#include "scresid.hxx" +#include "globstr.hrc" +#include "namedlg.hrc" + +#define _NAMEDLG_CXX +#include "namedlg.hxx" +#undef _NAMEDLG_CXX +#include + + + +// defines ------------------------------------------------------------------- + +#define ABS_SREF SCA_VALID \ + | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE +#define ABS_DREF ABS_SREF \ + | SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE +#define ABS_SREF3D ABS_SREF | SCA_TAB_3D +#define ABS_DREF3D ABS_DREF | SCA_TAB_3D + + +//============================================================================ +// Hilfsklasse: Merken der aktuellen Bereichsoptionen, +// wenn ein Name in der ComboBox gefunden wird. + +struct SaveData +{ + SaveData() + : bCriteria(FALSE),bPrintArea(FALSE), + bColHeader(FALSE),bRowHeader(FALSE), + bDirty(FALSE) {} + + void Clear() + { + aStrSymbol.Erase(); + bCriteria = bPrintArea = + bColHeader = bRowHeader = FALSE; + bDirty = TRUE; + } + + String aStrSymbol; + BOOL bCriteria:1; + BOOL bPrintArea:1; + BOOL bColHeader:1; + BOOL bRowHeader:1; + BOOL bDirty:1; +}; + +static SaveData* pSaveObj = NULL; + +#define SAVE_DATA() \ + pSaveObj->aStrSymbol = aEdAssign.GetText(); \ + pSaveObj->bCriteria = aBtnCriteria.IsChecked(); \ + pSaveObj->bPrintArea = aBtnPrintArea.IsChecked(); \ + pSaveObj->bColHeader = aBtnColHeader.IsChecked(); \ + pSaveObj->bRowHeader = aBtnRowHeader.IsChecked(); \ + pSaveObj->bDirty = TRUE; + +#define RESTORE_DATA() \ + if ( pSaveObj->bDirty ) \ + { \ + aEdAssign.SetText( pSaveObj->aStrSymbol ); \ + aBtnCriteria.Check( pSaveObj->bCriteria ); \ + aBtnPrintArea.Check( pSaveObj->bPrintArea ); \ + aBtnColHeader.Check( pSaveObj->bColHeader ); \ + aBtnRowHeader.Check( pSaveObj->bRowHeader ); \ + pSaveObj->bDirty = FALSE; \ + } + +#define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute(); + + +//============================================================================ +// class ScNameDlg + +//---------------------------------------------------------------------------- + +ScNameDlg::ScNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, + ScViewData* ptrViewData, + const ScAddress& aCursorPos ) + + : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_NAMES ), + // + aFlName ( this, ScResId( FL_NAME ) ), + aEdName ( this, ScResId( ED_NAME ) ), + // + aFlAssign ( this, ScResId( FL_ASSIGN ) ), + aEdAssign ( this, ScResId( ED_ASSIGN ) ), + aRbAssign ( this, ScResId( RB_ASSIGN ), &aEdAssign, this ), + // + aFlType ( this, ScResId( FL_TYPE ) ), + aBtnPrintArea ( this, ScResId( BTN_PRINTAREA ) ), + aBtnColHeader ( this, ScResId( BTN_COLHEADER ) ), + aBtnCriteria ( this, ScResId( BTN_CRITERIA ) ), + aBtnRowHeader ( this, ScResId( BTN_ROWHEADER ) ), + // + aBtnOk ( this, ScResId( BTN_OK ) ), + aBtnCancel ( this, ScResId( BTN_CANCEL ) ), + aBtnHelp ( this, ScResId( BTN_HELP ) ), + aBtnAdd ( this, ScResId( BTN_ADD ) ), + aBtnRemove ( this, ScResId( BTN_REMOVE ) ), + aBtnMore ( this, ScResId( BTN_MORE ) ), + // + bSaved (FALSE), + aStrAdd ( ScResId( STR_ADD ) ), + aStrModify ( ScResId( STR_MODIFY ) ), + errMsgInvalidSym( ScResId( STR_INVALIDSYMBOL ) ), + // + pViewData ( ptrViewData ), + pDoc ( ptrViewData->GetDocument() ), + aLocalRangeName ( *(pDoc->GetRangeName()) ), + theCursorPos ( aCursorPos ) // zum Berechnen der Referenzen +{ + pSaveObj = new SaveData; + Init(); + FreeResource(); +} + + +//---------------------------------------------------------------------------- + +__EXPORT ScNameDlg::~ScNameDlg() +{ + DELETEZ( pSaveObj ); +} + + +//---------------------------------------------------------------------------- + +void __EXPORT ScNameDlg::Init() +{ + String aAreaStr; + ScRange aRange; + + DBG_ASSERT( pViewData && pDoc, "ViewData oder Document nicht gefunden!" ); + + aBtnOk.SetClickHdl ( LINK( this, ScNameDlg, OkBtnHdl ) ); + aBtnCancel.SetClickHdl ( LINK( this, ScNameDlg, CancelBtnHdl ) ); + aBtnAdd.SetClickHdl ( LINK( this, ScNameDlg, AddBtnHdl ) ); + aBtnRemove.SetClickHdl ( LINK( this, ScNameDlg, RemoveBtnHdl ) ); + aEdAssign.SetGetFocusHdl( LINK( this, ScNameDlg, AssignGetFocusHdl ) ); + aEdAssign.SetModifyHdl ( LINK( this, ScNameDlg, EdModifyHdl ) ); + aEdName.SetModifyHdl ( LINK( this, ScNameDlg, EdModifyHdl ) ); + aEdName.SetSelectHdl ( LINK( this, ScNameDlg, NameSelectHdl ) ); + + aBtnCriteria .Hide(); + aBtnPrintArea.Hide(); + aBtnColHeader.Hide(); + aBtnRowHeader.Hide(); + + aBtnMore.AddWindow( &aFlType ); + aBtnMore.AddWindow( &aBtnCriteria ); + aBtnMore.AddWindow( &aBtnPrintArea ); + aBtnMore.AddWindow( &aBtnColHeader ); + aBtnMore.AddWindow( &aBtnRowHeader ); + + UpdateNames(); + + pViewData->GetSimpleArea( aRange ); + aRange.Format( aAreaStr, ABS_DREF3D, pDoc, + ScAddress::Details(pDoc->GetAddressConvention(), 0, 0) ); + + theCurSel = Selection( 0, SELECTION_MAX ); + aEdAssign.GrabFocus(); + aEdAssign.SetText( aAreaStr ); + aEdAssign.SetSelection( theCurSel ); + aEdName.GrabFocus(); + + aBtnAdd.Disable(); + aBtnRemove.Disable(); + if ( aEdName.GetEntryCount() > 0 ) + aBtnAdd.SetText( aStrAdd ); + UpdateChecks(); + EdModifyHdl( 0 ); + + bSaved=TRUE; + SAVE_DATA() + + //@BugID 54702 + //SFX_APPWINDOW->Disable(FALSE); //! allgemeine Methode im ScAnyRefDlg +} + +//---------------------------------------------------------------------------- +BOOL ScNameDlg::IsRefInputMode() const +{ + return aEdAssign.IsEnabled(); +} + +void ScNameDlg::RefInputDone( BOOL bForced) +{ + ScAnyRefDlg::RefInputDone(bForced); + EdModifyHdl(&aEdAssign); +} +//---------------------------------------------------------------------------- +// Uebergabe eines mit der Maus selektierten Tabellenbereiches, der dann als +// neue Selektion im Referenz-Edit angezeigt wird. + + +void ScNameDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) +{ + if ( aEdAssign.IsEnabled() ) + { + if ( rRef.aStart != rRef.aEnd ) + RefInputStart(&aEdAssign); + String aRefStr; + rRef.Format( aRefStr, ABS_DREF3D, pDocP, + ScAddress::Details(pDocP->GetAddressConvention(), 0, 0) ); + aEdAssign.SetRefString( aRefStr ); + } +} + + +//---------------------------------------------------------------------------- +BOOL __EXPORT ScNameDlg::Close() +{ + return DoClose( ScNameDlgWrapper::GetChildWindowId() ); +} + + +//---------------------------------------------------------------------------- + +void ScNameDlg::SetActive() +{ + aEdAssign.GrabFocus(); + RefInputDone(); +} + + +//---------------------------------------------------------------------------- + +void __EXPORT ScNameDlg::UpdateChecks() +{ + USHORT nCurPos=0; + + if(aLocalRangeName.SearchName( aEdName.GetText(), nCurPos)) + { + ScRangeData* pData=(ScRangeData*)(aLocalRangeName.At( nCurPos )); + aBtnCriteria .Check( pData->HasType( RT_CRITERIA ) ); + aBtnPrintArea.Check( pData->HasType( RT_PRINTAREA ) ); + aBtnColHeader.Check( pData->HasType( RT_COLHEADER ) ); + aBtnRowHeader.Check( pData->HasType( RT_ROWHEADER ) ); + } + + // Falls Edit-Feld leer ist: Typ-CheckBoxen deaktivieren: + + if ( aEdName.GetText().Len() != 0 ) + { + if ( !aFlType.IsEnabled() ) + { + aFlType .Enable(); + aBtnCriteria .Enable(); + aBtnPrintArea.Enable(); + aBtnColHeader.Enable(); + aBtnRowHeader.Enable(); + aFlAssign .Enable(); + aEdAssign .Enable(); + aRbAssign .Enable(); + } + } + else if ( aFlType.IsEnabled() ) + { + aFlType .Disable(); + aBtnCriteria .Disable(); + aBtnPrintArea.Disable(); + aBtnColHeader.Disable(); + aBtnRowHeader.Disable(); + aFlAssign .Disable(); + aEdAssign .Disable(); + aRbAssign .Disable(); + } +} + + +//---------------------------------------------------------------------------- + +void __EXPORT ScNameDlg::UpdateNames() +{ + USHORT nRangeCount = aLocalRangeName.GetCount(); + + aEdName.SetUpdateMode( FALSE ); + //----------------------------------------------------------- + USHORT nNamePos = aEdName.GetTopEntry(); + aEdName.Clear(); + + aEdAssign.SetText( EMPTY_STRING ); + + if ( nRangeCount > 0 ) + { + ScRangeData* pRangeData = NULL; + String aString; + + for ( USHORT i=0; iHasType( RT_DATABASE ) + && !pRangeData->HasType( RT_SHARED ) ) + { + pRangeData->GetName( aString ); + aEdName.InsertEntry( aString ); + } + } + } + } + else + { + aBtnAdd.SetText( aStrAdd ); + aBtnAdd.Disable(); + aBtnRemove.Disable(); + } + //----------------------------------------------------------- + aEdName.SetUpdateMode( TRUE ); + aEdName.SetTopEntry(nNamePos); + aEdName.Invalidate(); +} + + +//---------------------------------------------------------------------------- + +void __EXPORT ScNameDlg::CalcCurTableAssign( String& aAssign, USHORT nCurPos ) +{ + ScRangeData* pRangeData = (ScRangeData*)(aLocalRangeName.At( nCurPos )); + + if ( pRangeData ) + { + rtl::OUStringBuffer sBuffer; + pRangeData->UpdateSymbol( sBuffer, theCursorPos ); + aAssign = sBuffer; + } + else + { + aAssign.Erase(); + } +} + + +//---------------------------------------------------------------------------- +// Handler: +// ======== + +IMPL_LINK( ScNameDlg, OkBtnHdl, void *, EMPTYARG ) +{ + if ( aBtnAdd.IsEnabled() ) + AddBtnHdl( 0 ); + + if ( !aBtnAdd.IsEnabled() && !aBtnRemove.IsEnabled() ) + { + ScDocShell* pDocSh = pViewData->GetDocShell(); + ScDocFunc aFunc(*pDocSh); + aFunc.ModifyRangeNames( aLocalRangeName, FALSE ); + Close(); + } + return 0; +} + + +//---------------------------------------------------------------------------- + +IMPL_LINK_INLINE_START( ScNameDlg, CancelBtnHdl, void *, EMPTYARG ) +{ + Close(); + return 0; +} +IMPL_LINK_INLINE_END( ScNameDlg, CancelBtnHdl, void *, EMPTYARG ) + + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScNameDlg, AddBtnHdl, void *, EMPTYARG ) +{ + BOOL bAdded = FALSE; + String aNewEntry = aEdName.GetText(); + USHORT nNamePos = aEdName.GetTopEntry(); + aNewEntry.EraseLeadingChars( ' ' ); + aNewEntry.EraseTrailingChars( ' ' ); + + if ( aNewEntry.Len() > 0 ) + { + if ( ScRangeData::IsNameValid( aNewEntry, pDoc ) ) + { + if ( pDoc ) + { + ScRangeData* pNewEntry = NULL; + RangeType nType = RT_NAME; + USHORT nFoundAt = 0; + String theSymbol = aEdAssign.GetText(); + String aStrPos; + String aStrArea; + + pNewEntry = new ScRangeData( pDoc, + aNewEntry, + theSymbol, + theCursorPos, + nType ); + if (pNewEntry) + { + nType = nType + | (aBtnRowHeader .IsChecked() ? RT_ROWHEADER : RangeType(0)) + | (aBtnColHeader .IsChecked() ? RT_COLHEADER : RangeType(0)) + | (aBtnPrintArea .IsChecked() ? RT_PRINTAREA : RangeType(0)) + | (aBtnCriteria .IsChecked() ? RT_CRITERIA : RangeType(0)); + pNewEntry->AddType(nType); + } + + // theSymbol gueltig? + // (= konnte theSymbol im ScRangeData-Ctor + // in ein Token-Array uebersetzt werden?) + if ( 0 == pNewEntry->GetErrCode() ) + { + // Eintrag bereits vorhanden? Dann vorher entfernen (=Aendern) + if ( aLocalRangeName.SearchName( aNewEntry, nFoundAt ) ) + { // alten Index uebernehmen + pNewEntry->SetIndex( + ((ScRangeData*)(aLocalRangeName.At(nFoundAt)))->GetIndex() ); + aLocalRangeName.AtFree( nFoundAt ); + } + else + pSaveObj->Clear(); + + if ( !aLocalRangeName.Insert( pNewEntry ) ) + delete pNewEntry; + + UpdateNames(); + bSaved=FALSE; + RESTORE_DATA() + aEdName.SetText(EMPTY_STRING); + aEdName.GrabFocus(); + UpdateChecks(); + aBtnAdd.SetText( aStrAdd ); + aBtnAdd.Disable(); + aBtnRemove.Disable(); + + //@BugID 54702 raus mit dem Sch. + //SFX_APPWINDOW->Disable(FALSE); //! allgemeine Methode im ScAnyRefDlg + + bAdded = TRUE; + } + else // theSymbol ungueltig + { + delete pNewEntry; + ERRORBOX( errMsgInvalidSym ); + theCurSel = Selection( 0, SELECTION_MAX ); + aEdAssign.GrabFocus(); + } + } + } + else + { + ERRORBOX( ScGlobal::GetRscString(STR_INVALIDNAME) ); + aEdName.SetSelection( Selection( 0, SELECTION_MAX ) ); + aEdName.GrabFocus(); + } + } + + aEdName.SetTopEntry(nNamePos); + return bAdded; +} + + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScNameDlg, RemoveBtnHdl, void *, EMPTYARG ) +{ + USHORT nRemoveAt = 0; + const String aStrEntry = aEdName.GetText(); + + if ( aLocalRangeName.SearchName( aStrEntry, nRemoveAt ) ) + { + String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY ); + String aMsg = aStrDelMsg.GetToken( 0, '#' ); + + aMsg += aStrEntry; + aMsg += aStrDelMsg.GetToken( 1, '#' ); + + if ( RET_YES == + QueryBox( this, WinBits( WB_YES_NO | WB_DEF_YES ), aMsg ).Execute() ) + { + aLocalRangeName.AtFree( nRemoveAt ); + UpdateNames(); + UpdateChecks(); + bSaved=FALSE; + RESTORE_DATA() + theCurSel = Selection( 0, SELECTION_MAX ); + aBtnAdd.SetText( aStrAdd ); + aBtnAdd.Disable(); + aBtnRemove.Disable(); + } + } + return 0; +} + + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScNameDlg, NameSelectHdl, void *, EMPTYARG ) +{ + USHORT nAtPos; + + if ( aLocalRangeName.SearchName( aEdName.GetText(), nAtPos ) ) + { + String aSymbol; + ScRangeData* pData = (ScRangeData*)(aLocalRangeName.At( nAtPos )); + + if ( pData ) + { + pData->GetSymbol( aSymbol ); + CalcCurTableAssign( aSymbol, nAtPos ); + aEdAssign.SetText( aSymbol ); + aBtnAdd.SetText( aStrModify ); + theCurSel = Selection( 0, SELECTION_MAX ); + } + } + UpdateChecks(); + return 0; +} + + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScNameDlg, EdModifyHdl, Edit *, pEd ) +{ + String theName = aEdName.GetText(); + String theSymbol = aEdAssign.GetText(); + BOOL bNameFound = (COMBOBOX_ENTRY_NOTFOUND + != aEdName.GetEntryPos( theName )); + + if ( pEd == &aEdName ) + { + if ( theName.Len() == 0 ) + { + if ( aBtnAdd.GetText() != aStrAdd ) + aBtnAdd.SetText( aStrAdd ); + aBtnAdd.Disable(); + aBtnRemove.Disable(); + aFlAssign.Disable(); + aEdAssign.Disable(); + aRbAssign.Disable(); + //@BugID 54702 raus mit dem Sch. + //SFX_APPWINDOW->Disable(FALSE); //! allgemeine Methode im ScAnyRefDlg + } + else + { + if ( bNameFound ) + { + if ( aBtnAdd.GetText() != aStrModify ) + aBtnAdd.SetText( aStrModify ); + + aBtnRemove.Enable(); + + if(!bSaved) + { + bSaved=TRUE; + SAVE_DATA() + } + NameSelectHdl( 0 ); + } + else + { + if ( aBtnAdd.GetText() != aStrAdd ) + aBtnAdd.SetText( aStrAdd ); + aBtnRemove.Disable(); + + bSaved=FALSE; + RESTORE_DATA() + } + theSymbol = aEdAssign.GetText(); + + if ( theSymbol.Len() > 0 ) + aBtnAdd.Enable(); + else + aBtnAdd.Disable(); + + aFlAssign.Enable(); + aEdAssign.Enable(); + aRbAssign.Enable(); + //@BugID 54702 raus mit dem Sch. + //SFX_APPWINDOW->Enable(); + } + UpdateChecks(); + theCurSel = Selection( 0, SELECTION_MAX ); + } + else if ( pEd == &aEdAssign ) + { + if ( (theName.Len()>0) && (theSymbol.Len()>0) ) + { + aBtnAdd.Enable(); + if ( bNameFound ) + aBtnRemove.Enable(); + } + else + { + aBtnAdd.Disable(); + aBtnRemove.Disable(); + } + } + return 0; +} + +//------------------------------------------------------------------------ + +IMPL_LINK_INLINE_START( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG ) +{ + EdModifyHdl( &aEdAssign ); + return 0; +} +IMPL_LINK_INLINE_END( ScNameDlg, AssignGetFocusHdl, void *, EMPTYARG ) + + diff --git a/sc/source/ui/pagedlg/areasdlg.cxx b/sc/source/ui/pagedlg/areasdlg.cxx index bce864c71b11..2f7ac75019e0 100644 --- a/sc/source/ui/pagedlg/areasdlg.cxx +++ b/sc/source/ui/pagedlg/areasdlg.cxx @@ -1,909 +1,909 @@ -/************************************************************************* - * - * 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: areasdlg.cxx,v $ - * $Revision: 1.18 $ - * - * 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 - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -//---------------------------------------------------------------------------- -#include - -#include -#include -#include -#include -#include - -#define _AREASDLG_CXX -#include "areasdlg.hxx" -#undef _AREASDLG_CXX - -#include "scresid.hxx" -#include "rangenam.hxx" -#include "reffact.hxx" -#include "tabvwsh.hxx" -#include "docsh.hxx" -#include "globstr.hrc" -#include "pagedlg.hrc" -#include "compiler.hxx" - -// STATIC DATA --------------------------------------------------------------- - -// List box positions for print range (PR) -const USHORT SC_AREASDLG_PR_NONE = 0; -const USHORT SC_AREASDLG_PR_ENTIRE = 1; -const USHORT SC_AREASDLG_PR_USER = 2; -const USHORT SC_AREASDLG_PR_SELECT = 3; -const USHORT SC_AREASDLG_PR_OFFSET = 4; - -// List box positions for repeat ranges (RR) -const USHORT SC_AREASDLG_RR_NONE = 0; -const USHORT SC_AREASDLG_RR_USER = 1; -const USHORT SC_AREASDLG_RR_OFFSET = 2; - -//============================================================================ - -#define HDL(hdl) LINK( this, ScPrintAreasDlg, hdl ) -#define ERRORBOX(nId) ErrorBox( this, WinBits(WB_OK|WB_DEF_OK), \ - ScGlobal::GetRscString( nId ) ).Execute() -#define SWAP(x1,x2) { int n=x1; x1=x2; x2=n; } - -// globale Funktionen (->am Ende der Datei): - -bool lcl_CheckRepeatString( const String& rStr, ScDocument* pDoc, bool bIsRow, ScRange* pRange ); -void lcl_GetRepeatRangeString( const ScRange* pRange, ScDocument* pDoc, bool bIsRow, String& rStr ); - -#if 0 -static void printAddressFlags(USHORT nFlag) -{ - if ((nFlag & SCA_COL_ABSOLUTE ) == SCA_COL_ABSOLUTE ) printf("SCA_COL_ABSOLUTE \n"); - if ((nFlag & SCA_ROW_ABSOLUTE ) == SCA_ROW_ABSOLUTE ) printf("SCA_ROW_ABSOLUTE \n"); - if ((nFlag & SCA_TAB_ABSOLUTE ) == SCA_TAB_ABSOLUTE ) printf("SCA_TAB_ABSOLUTE \n"); - if ((nFlag & SCA_TAB_3D ) == SCA_TAB_3D ) printf("SCA_TAB_3D \n"); - if ((nFlag & SCA_COL2_ABSOLUTE ) == SCA_COL2_ABSOLUTE ) printf("SCA_COL2_ABSOLUTE\n"); - if ((nFlag & SCA_ROW2_ABSOLUTE ) == SCA_ROW2_ABSOLUTE ) printf("SCA_ROW2_ABSOLUTE\n"); - if ((nFlag & SCA_TAB2_ABSOLUTE ) == SCA_TAB2_ABSOLUTE ) printf("SCA_TAB2_ABSOLUTE\n"); - if ((nFlag & SCA_TAB2_3D ) == SCA_TAB2_3D ) printf("SCA_TAB2_3D \n"); - if ((nFlag & SCA_VALID_ROW ) == SCA_VALID_ROW ) printf("SCA_VALID_ROW \n"); - if ((nFlag & SCA_VALID_COL ) == SCA_VALID_COL ) printf("SCA_VALID_COL \n"); - if ((nFlag & SCA_VALID_TAB ) == SCA_VALID_TAB ) printf("SCA_VALID_TAB \n"); - if ((nFlag & SCA_FORCE_DOC ) == SCA_FORCE_DOC ) printf("SCA_FORCE_DOC \n"); - if ((nFlag & SCA_VALID_ROW2 ) == SCA_VALID_ROW2 ) printf("SCA_VALID_ROW2 \n"); - if ((nFlag & SCA_VALID_COL2 ) == SCA_VALID_COL2 ) printf("SCA_VALID_COL2 \n"); - if ((nFlag & SCA_VALID_TAB2 ) == SCA_VALID_TAB2 ) printf("SCA_VALID_TAB2 \n"); - if ((nFlag & SCA_VALID ) == SCA_VALID ) printf("SCA_VALID \n"); - if ((nFlag & SCA_ABS ) == SCA_ABS ) printf("SCA_ABS \n"); - if ((nFlag & SCR_ABS ) == SCR_ABS ) printf("SCR_ABS \n"); - if ((nFlag & SCA_ABS_3D ) == SCA_ABS_3D ) printf("SCA_ABS_3D \n"); - if ((nFlag & SCR_ABS_3D ) == SCR_ABS_3D ) printf("SCR_ABS_3D \n"); -} -#endif - -//============================================================================ -// class ScPrintAreasDlg - -//---------------------------------------------------------------------------- - -ScPrintAreasDlg::ScPrintAreasDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent ) - : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_AREAS), - // - aLbPrintArea ( this, ScResId( LB_PRINTAREA ) ), - aFlPrintArea ( this, ScResId( FL_PRINTAREA ) ), - aEdPrintArea ( this, ScResId( ED_PRINTAREA ) ), - aRbPrintArea ( this, ScResId( RB_PRINTAREA ), &aEdPrintArea, this ), - // - aLbRepeatRow ( this, ScResId( LB_REPEATROW ) ), - aFlRepeatRow ( this, ScResId( FL_REPEATROW ) ), - aEdRepeatRow ( this, ScResId( ED_REPEATROW ) ), - aRbRepeatRow ( this, ScResId( RB_REPEATROW ), &aEdRepeatRow, this ), - // - aLbRepeatCol ( this, ScResId( LB_REPEATCOL ) ), - aFlRepeatCol ( this, ScResId( FL_REPEATCOL ) ), - aEdRepeatCol ( this, ScResId( ED_REPEATCOL ) ), - aRbRepeatCol ( this, ScResId( RB_REPEATCOL ), &aEdRepeatCol, this ), - // - aBtnOk ( this, ScResId( BTN_OK ) ), - aBtnCancel ( this, ScResId( BTN_CANCEL ) ), - aBtnHelp ( this, ScResId( BTN_HELP ) ), - // - bDlgLostFocus ( FALSE ), - pRefInputEdit ( &aEdPrintArea ), - pDoc ( NULL ), - pViewData ( NULL ), - nCurTab ( 0 ) -{ - ScTabViewShell* pScViewSh = PTR_CAST( ScTabViewShell, SfxViewShell::Current() ); - ScDocShell* pScDocSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() ); - - DBG_ASSERT( pScDocSh, "Current DocumentShell not found :-(" ); - - pDoc = pScDocSh->GetDocument(); - - if ( pScViewSh ) - { - pViewData = pScViewSh->GetViewData(); - nCurTab = pViewData->GetTabNo(); - } - - Impl_Reset(); - - //@BugID 54702 Enablen/Disablen nur noch in Basisklasse - //SFX_APPWINDOW->Enable(); - - FreeResource(); -} - - -//---------------------------------------------------------------------------- - -ScPrintAreasDlg::~ScPrintAreasDlg() -{ - // Extra-Data an ListBox-Entries abraeumen - ListBox* pLb[3] = { &aLbPrintArea, &aLbRepeatRow, &aLbRepeatCol }; - - for ( USHORT i=0; i<3; i++ ) - { - USHORT nCount = pLb[i]->GetEntryCount(); - for ( USHORT j=0; jGetEntryData(j); - } -} - - -//---------------------------------------------------------------------------- - -BOOL ScPrintAreasDlg::Close() -{ - return DoClose( ScPrintAreasDlgWrapper::GetChildWindowId() ); -} - - -//---------------------------------------------------------------------------- - -BOOL ScPrintAreasDlg::IsTableLocked() const -{ - // Druckbereiche gelten pro Tabelle, darum macht es keinen Sinn, - // bei der Eingabe die Tabelle umzuschalten - - return TRUE; -} - - -//---------------------------------------------------------------------------- - -void ScPrintAreasDlg::SetReference( const ScRange& rRef, ScDocument* /* pDoc */ ) -{ - if ( pRefInputEdit ) - { - if ( rRef.aStart != rRef.aEnd ) - RefInputStart( pRefInputEdit ); - - String aStr; - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - - if ( &aEdPrintArea == pRefInputEdit ) - { - rRef.Format( aStr, SCR_ABS, pDoc, eConv ); - -// aEdPrintArea.ReplaceSelected( aStr ); - - String aVal = aEdPrintArea.GetText(); - Selection aSel = aEdPrintArea.GetSelection(); - aSel.Justify(); - aVal.Erase( (xub_StrLen)aSel.Min(), (xub_StrLen)aSel.Len() ); - aVal.Insert( aStr, (xub_StrLen)aSel.Min() ); - Selection aNewSel( aSel.Min(), aSel.Min()+aStr.Len() ); - aEdPrintArea.SetRefString( aVal ); - aEdPrintArea.SetSelection( aNewSel ); - } - else - { - BOOL bRow = ( &aEdRepeatRow == pRefInputEdit ); - lcl_GetRepeatRangeString(&rRef, pDoc, bRow, aStr); - pRefInputEdit->SetRefString( aStr ); - } - } - - Impl_ModifyHdl( pRefInputEdit ); -} - - -//---------------------------------------------------------------------------- - -void ScPrintAreasDlg::AddRefEntry() -{ - if ( pRefInputEdit == &aEdPrintArea ) - { - const sal_Unicode sep = ScCompiler::GetNativeSymbol(ocSep).GetChar(0); - String aVal = aEdPrintArea.GetText(); - aVal += sep; - aEdPrintArea.SetText(aVal); - - xub_StrLen nLen = aVal.Len(); - aEdPrintArea.SetSelection( Selection( nLen, nLen ) ); - - Impl_ModifyHdl( &aEdPrintArea ); - } -} - - -//---------------------------------------------------------------------------- - -void ScPrintAreasDlg::Deactivate() -{ - bDlgLostFocus = TRUE; -} - - -//---------------------------------------------------------------------------- - -void ScPrintAreasDlg::SetActive() -{ - if ( bDlgLostFocus ) - { - bDlgLostFocus = FALSE; - - if ( pRefInputEdit ) - { - pRefInputEdit->GrabFocus(); - Impl_ModifyHdl( pRefInputEdit ); - } - } - else - GrabFocus(); - - RefInputDone(); -} - - -//---------------------------------------------------------------------------- - -void ScPrintAreasDlg::Impl_Reset() -{ - String aStrRange; - const ScRange* pRepeatColRange = pDoc->GetRepeatColRange( nCurTab ); - const ScRange* pRepeatRowRange = pDoc->GetRepeatRowRange( nCurTab ); - - aEdPrintArea.SetModifyHdl ( HDL(Impl_ModifyHdl) ); - aEdRepeatRow.SetModifyHdl ( HDL(Impl_ModifyHdl) ); - aEdRepeatCol.SetModifyHdl ( HDL(Impl_ModifyHdl) ); - aEdPrintArea.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); - aEdRepeatRow.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); - aEdRepeatCol.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); - aLbPrintArea.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); - aLbRepeatRow.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); - aLbRepeatCol.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); - aLbPrintArea.SetSelectHdl ( HDL(Impl_SelectHdl) ); - aLbRepeatRow.SetSelectHdl ( HDL(Impl_SelectHdl) ); - aLbRepeatCol.SetSelectHdl ( HDL(Impl_SelectHdl) ); - aBtnOk .SetClickHdl ( HDL(Impl_BtnHdl) ); - aBtnCancel .SetClickHdl ( HDL(Impl_BtnHdl) ); - - Impl_FillLists(); - - //------------------------- - // Druckbereich - //------------------------- - aStrRange.Erase(); - String aOne; - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - const sal_Unicode sep = ScCompiler::GetNativeSymbol(ocSep).GetChar(0); - USHORT nRangeCount = pDoc->GetPrintRangeCount( nCurTab ); - for (USHORT i=0; iGetPrintRange( nCurTab, i ); - if (pPrintRange) - { - if ( aStrRange.Len() ) - aStrRange += sep; - pPrintRange->Format( aOne, SCR_ABS, pDoc, eConv ); - aStrRange += aOne; - } - } - aEdPrintArea.SetText( aStrRange ); - - //------------------------------- - // Wiederholungszeile - //------------------------------- - lcl_GetRepeatRangeString(pRepeatRowRange, pDoc, true, aStrRange); - aEdRepeatRow.SetText( aStrRange ); - - //-------------------------------- - // Wiederholungsspalte - //-------------------------------- - lcl_GetRepeatRangeString(pRepeatColRange, pDoc, false, aStrRange); - aEdRepeatCol.SetText( aStrRange ); - - Impl_ModifyHdl( &aEdPrintArea ); - Impl_ModifyHdl( &aEdRepeatRow ); - Impl_ModifyHdl( &aEdRepeatCol ); - if( pDoc->IsPrintEntireSheet( nCurTab ) ) - aLbPrintArea.SelectEntryPos( SC_AREASDLG_PR_ENTIRE ); - - aEdPrintArea.SaveValue(); // fuer FillItemSet() merken: - aEdRepeatRow.SaveValue(); - aEdRepeatCol.SaveValue(); -} - - -//---------------------------------------------------------------------------- - -BOOL ScPrintAreasDlg::Impl_GetItem( Edit* pEd, SfxStringItem& rItem ) -{ - String aRangeStr = pEd->GetText(); - BOOL bDataChanged = (pEd->GetSavedValue() != aRangeStr); - - if ( (aRangeStr.Len() > 0) && &aEdPrintArea != pEd ) - { - ScRange aRange; - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - lcl_CheckRepeatString(aRangeStr, pDoc, &aEdRepeatRow == pEd, &aRange); - aRange.Format(aRangeStr, SCR_ABS, pDoc, eConv); - } - - rItem.SetValue( aRangeStr ); - - return bDataChanged; -} - - -//---------------------------------------------------------------------------- - -BOOL ScPrintAreasDlg::Impl_CheckRefStrings() -{ - BOOL bOk = FALSE; - String aStrPrintArea = aEdPrintArea.GetText(); - String aStrRepeatRow = aEdRepeatRow.GetText(); - String aStrRepeatCol = aEdRepeatCol.GetText(); - - BOOL bPrintAreaOk = TRUE; - if ( aStrPrintArea.Len() ) - { - const USHORT nValidAddr = SCA_VALID | SCA_VALID_ROW | SCA_VALID_COL; - const USHORT nValidRange = nValidAddr | SCA_VALID_ROW2 | SCA_VALID_COL2; - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - const sal_Unicode sep = ScCompiler::GetNativeSymbol(ocSep).GetChar(0); - // const sal_Unicode rsep = ScCompiler::GetNativeSymbol(ocRange).GetChar(0); - - ScAddress aAddr; - ScRange aRange; - xub_StrLen nSepCount = aStrPrintArea.GetTokenCount(sep); - for ( xub_StrLen i = 0; i < nSepCount && bPrintAreaOk; ++i ) - { - String aOne = aStrPrintArea.GetToken(i, sep); - USHORT nResult = aRange.Parse( aOne, pDoc, eConv ); - if ((nResult & nValidRange) != nValidRange) - { - USHORT nAddrResult = aAddr.Parse( aOne, pDoc, eConv ); - if ((nAddrResult & nValidAddr) != nValidAddr) - bPrintAreaOk = FALSE; - } - } - } - - BOOL bRepeatRowOk = (aStrRepeatRow.Len() == 0); - if ( !bRepeatRowOk ) - bRepeatRowOk = lcl_CheckRepeatString(aStrRepeatRow, pDoc, true, NULL); - - BOOL bRepeatColOk = (aStrRepeatCol.Len() == 0); - if ( !bRepeatColOk ) - bRepeatColOk = lcl_CheckRepeatString(aStrRepeatCol, pDoc, false, NULL); - - // Fehlermeldungen - - bOk = (bPrintAreaOk && bRepeatRowOk && bRepeatColOk); - - if ( !bOk ) - { - Edit* pEd = NULL; - - if ( !bPrintAreaOk ) pEd = &aEdPrintArea; - else if ( !bRepeatRowOk ) pEd = &aEdRepeatRow; - else if ( !bRepeatColOk ) pEd = &aEdRepeatCol; - - ERRORBOX( STR_INVALID_TABREF ); - pEd->GrabFocus(); - } - - return bOk; -} - - -//---------------------------------------------------------------------------- - -void ScPrintAreasDlg::Impl_FillLists() -{ - //------------------------------------------------------ - // Selektion holen und String in PrintArea-ListBox merken - //------------------------------------------------------ - ScRange aRange; - String aStrRange; - BOOL bSimple = TRUE; - - if ( pViewData ) - bSimple = (pViewData->GetSimpleArea( aRange ) == SC_MARK_SIMPLE); - - formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - - if ( bSimple ) - aRange.Format( aStrRange, SCR_ABS, pDoc, eConv ); - else - { - ScRangeListRef aList( new ScRangeList ); - pViewData->GetMarkData().FillRangeListWithMarks( aList, FALSE ); - aList->Format( aStrRange, SCR_ABS, pDoc, eConv ); - } - - aLbPrintArea.SetEntryData( SC_AREASDLG_PR_SELECT, new String( aStrRange ) ); - - //------------------------------------------------------ - // Ranges holen und in ListBoxen merken - //------------------------------------------------------ - ScRangeName* pRangeNames = pDoc->GetRangeName(); - const USHORT nCount = pRangeNames ? pRangeNames->GetCount() : 0; - - if ( nCount > 0 ) - { - String aName; - String aSymbol; -// ScRange aRange; - ScRangeData* pData = NULL; - - for ( USHORT i=0; iAt( i )); - if ( pData ) - { - if ( pData->HasType( RT_ABSAREA ) - || pData->HasType( RT_REFAREA ) - || pData->HasType( RT_ABSPOS ) ) - { - pData->GetName( aName ); - pData->GetSymbol( aSymbol ); - if ( aRange.ParseAny( aSymbol, pDoc, eConv ) & SCA_VALID ) - { - if ( pData->HasType( RT_PRINTAREA ) ) - { - aRange.Format( aSymbol, SCR_ABS, pDoc, eConv ); - aLbPrintArea.SetEntryData( - aLbPrintArea.InsertEntry( aName ), - new String( aSymbol ) ); - } - - if ( pData->HasType( RT_ROWHEADER ) ) - { - lcl_GetRepeatRangeString(&aRange, pDoc, true, aSymbol); - aLbRepeatRow.SetEntryData( - aLbRepeatRow.InsertEntry( aName ), - new String( aSymbol ) ); - } - - if ( pData->HasType( RT_COLHEADER ) ) - { - lcl_GetRepeatRangeString(&aRange, pDoc, false, aSymbol); - aLbRepeatCol.SetEntryData( - aLbRepeatCol.InsertEntry( aName ), - new String( aSymbol ) ); - } - } - } - } - } - } -} - - -//---------------------------------------------------------------------------- -// Handler: -//---------------------------------------------------------------------------- - -IMPL_LINK( ScPrintAreasDlg, Impl_BtnHdl, PushButton*, pBtn ) -{ - if ( &aBtnOk == pBtn ) - { - if ( Impl_CheckRefStrings() ) - { - BOOL bDataChanged = FALSE; - String aStr; - SfxStringItem aPrintArea( SID_CHANGE_PRINTAREA, aStr ); - SfxStringItem aRepeatRow( FN_PARAM_2, aStr ); - SfxStringItem aRepeatCol( FN_PARAM_3, aStr ); - - //------------------------- - // Druckbereich veraendert? - //------------------------- - - // first try the list box, if "Entite sheet" is selected - BOOL bEntireSheet = (aLbPrintArea.GetSelectEntryPos() == SC_AREASDLG_PR_ENTIRE); - SfxBoolItem aEntireSheet( FN_PARAM_4, bEntireSheet ); - - bDataChanged = bEntireSheet != pDoc->IsPrintEntireSheet( nCurTab ); - if( !bEntireSheet ) - { - // if new list box selection is not "Entire sheet", get the edit field contents - bDataChanged |= Impl_GetItem( &aEdPrintArea, aPrintArea ); - } - - //------------------------------- - // Wiederholungszeile veraendert? - //------------------------------- - bDataChanged |= Impl_GetItem( &aEdRepeatRow, aRepeatRow ); - - //-------------------------------- - // Wiederholungsspalte veraendert? - //-------------------------------- - bDataChanged |= Impl_GetItem( &aEdRepeatCol, aRepeatCol ); - - if ( bDataChanged ) - { - SetDispatcherLock( FALSE ); - SwitchToDocument(); - GetBindings().GetDispatcher()->Execute( SID_CHANGE_PRINTAREA, - SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, - &aPrintArea, &aRepeatRow, &aRepeatCol, &aEntireSheet, 0L ); - } - - Close(); - } - } - else if ( &aBtnCancel == pBtn ) - Close(); - - return 0; -} - - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScPrintAreasDlg, Impl_GetFocusHdl, Control*, pCtr ) -{ - if ( pCtr ==(Control *) &aEdPrintArea || - pCtr ==(Control *) &aEdRepeatRow || - pCtr ==(Control *) &aEdRepeatCol) - { - pRefInputEdit = (formula::RefEdit*) pCtr; - } - else if ( pCtr ==(Control *) &aLbPrintArea) - { - pRefInputEdit = &aEdPrintArea; - } - else if ( pCtr ==(Control *) &aLbRepeatRow) - { - pRefInputEdit = &aEdRepeatRow; - } - else if ( pCtr ==(Control *) &aLbRepeatCol) - { - pRefInputEdit = &aEdRepeatCol; - } - - return 0; -} - - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScPrintAreasDlg, Impl_SelectHdl, ListBox*, pLb ) -{ - USHORT nSelPos = pLb->GetSelectEntryPos(); - Edit* pEd = NULL; - - // list box positions of specific entries, default to "repeat row/column" list boxes - USHORT nAllSheetPos = SC_AREASDLG_RR_NONE; - USHORT nUserDefPos = SC_AREASDLG_RR_USER; - USHORT nFirstCustomPos = SC_AREASDLG_RR_OFFSET; - - // find edit field for list box, and list box positions - if( pLb == &aLbPrintArea ) - { - pEd = &aEdPrintArea; - nAllSheetPos = SC_AREASDLG_PR_ENTIRE; - nUserDefPos = SC_AREASDLG_PR_USER; - nFirstCustomPos = SC_AREASDLG_PR_SELECT; // "Selection" and following - } - else if( pLb == &aLbRepeatCol ) - pEd = &aEdRepeatCol; - else if( pLb == &aLbRepeatRow ) - pEd = &aEdRepeatRow; - else - return 0; - - // fill edit field according to list box selection - if( (nSelPos == 0) || (nSelPos == nAllSheetPos) ) - pEd->SetText( EMPTY_STRING ); - else if( nSelPos == nUserDefPos && !pLb->IsTravelSelect() && pEd->GetText().Len() == 0 ) - pLb->SelectEntryPos( 0 ); - else if( nSelPos >= nFirstCustomPos ) - pEd->SetText( *static_cast< String* >( pLb->GetEntryData( nSelPos ) ) ); - - return 0; -} - - -//---------------------------------------------------------------------------- - -IMPL_LINK( ScPrintAreasDlg, Impl_ModifyHdl, formula::RefEdit*, pEd ) -{ - ListBox* pLb = NULL; - - // list box positions of specific entries, default to "repeat row/column" list boxes - USHORT nUserDefPos = SC_AREASDLG_RR_USER; - USHORT nFirstCustomPos = SC_AREASDLG_RR_OFFSET; - - if( pEd == &aEdPrintArea ) - { - pLb = &aLbPrintArea; - nUserDefPos = SC_AREASDLG_PR_USER; - nFirstCustomPos = SC_AREASDLG_PR_SELECT; // "Selection" and following - } - else if( pEd == &aEdRepeatCol ) - pLb = &aLbRepeatCol; - else if( pEd == &aEdRepeatRow ) - pLb = &aLbRepeatRow; - else - return 0; - - // set list box selection according to edit field - USHORT nEntryCount = pLb->GetEntryCount(); - String aStrEd( pEd->GetText() ); - String aEdUpper = aStrEd; - aEdUpper.ToUpperAscii(); - - if ( (nEntryCount > nFirstCustomPos) && aStrEd.Len() > 0 ) - { - BOOL bFound = FALSE; - String* pSymbol = NULL; - USHORT i; - - for ( i=nFirstCustomPos; iGetEntryData( i ); - bFound = ( (*pSymbol == aStrEd) || (*pSymbol == aEdUpper) ); - } - - pLb->SelectEntryPos( bFound ? i-1 : nUserDefPos ); - } - else - pLb->SelectEntryPos( aStrEd.Len() ? nUserDefPos : 0 ); - - return 0; -} - - -//============================================================================ -// globale Funktionen: - -// ---------------------------------------------------------------------------- - -// TODO: It might make sense to move these functions to address.?xx. -kohei - -bool lcl_CheckOne_OOO( const String& rStr, bool bIsRow, SCCOLROW& rVal ) -{ - // Zulaessige Syntax fuer rStr: - // Row: [$]1-MAXTAB - // Col: [$]A-IV - - String aStr = rStr; - xub_StrLen nLen = aStr.Len(); - SCCOLROW nNum = 0; - BOOL bStrOk = ( nLen > 0 ) && ( bIsRow ? ( nLen < 6 ) : ( nLen < 4 ) ); - - if ( bStrOk ) - { - if ( '$' == aStr.GetChar(0) ) - aStr.Erase( 0, 1 ); - - if ( bIsRow ) - { - bStrOk = CharClass::isAsciiNumeric(aStr); - - if ( bStrOk ) - { - sal_Int32 n = aStr.ToInt32(); - - if ( ( bStrOk = (n > 0) && ( n <= MAXROWCOUNT ) ) != FALSE ) - nNum = static_cast(n - 1); - } - } - else - { - SCCOL nCol = 0; - bStrOk = ::AlphaToCol( nCol, aStr); - nNum = nCol; - } - } - - if ( bStrOk ) - rVal = nNum; - - return bStrOk; -} - -bool lcl_CheckOne_XL_A1( const String& rStr, bool bIsRow, SCCOLROW& rVal ) -{ - // XL A1 style is identical to OOO one for print range formats. - return lcl_CheckOne_OOO(rStr, bIsRow, rVal); -} - -bool lcl_CheckOne_XL_R1C1( const String& rStr, bool bIsRow, SCCOLROW& rVal ) -{ - xub_StrLen nLen = rStr.Len(); - if (nLen <= 1) - // There must be at least two characters. - return false; - - const sal_Unicode preUpper = bIsRow ? 'R' : 'C'; - const sal_Unicode preLower = bIsRow ? 'r' : 'c'; - if (rStr.GetChar(0) != preUpper && rStr.GetChar(0) != preLower) - return false; - - String aNumStr = rStr.Copy(1); - if (!CharClass::isAsciiNumeric(aNumStr)) - return false; - - sal_Int32 nNum = aNumStr.ToInt32(); - - if (nNum <= 0) - return false; - - if ((bIsRow && nNum > MAXROWCOUNT) || (!bIsRow && nNum > MAXCOLCOUNT)) - return false; - - rVal = static_cast(nNum-1); - return true; -} - -bool lcl_CheckRepeatOne( const String& rStr, formula::FormulaGrammar::AddressConvention eConv, bool bIsRow, SCCOLROW& rVal ) -{ - switch (eConv) - { - case formula::FormulaGrammar::CONV_OOO: - return lcl_CheckOne_OOO(rStr, bIsRow, rVal); - case formula::FormulaGrammar::CONV_XL_A1: - return lcl_CheckOne_XL_A1(rStr, bIsRow, rVal); - case formula::FormulaGrammar::CONV_XL_R1C1: - return lcl_CheckOne_XL_R1C1(rStr, bIsRow, rVal); - default: - { - // added to avoid warnings - } - } - return false; -} - -bool lcl_CheckRepeatString( const String& rStr, ScDocument* pDoc, bool bIsRow, ScRange* pRange ) -{ - // Row: [valid row] rsep [valid row] - // Col: [valid col] rsep [valid col] - - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - const sal_Unicode rsep = ScCompiler::GetNativeSymbol(ocRange).GetChar(0); - - if (pRange) - { - // initialize the range value. - pRange->aStart.SetCol(0); - pRange->aStart.SetRow(0); - pRange->aEnd.SetCol(0); - pRange->aEnd.SetRow(0); - } - - String aBuf; - SCCOLROW nVal = 0; - xub_StrLen nLen = rStr.Len(); - bool bEndPos = false; - for (xub_StrLen i = 0; i < nLen; ++i) - { - const sal_Unicode c = rStr.GetChar(i); - if (c == rsep) - { - if (bEndPos) - // We aren't supposed to have more than one range separator. - return false; - - // range separator - if (aBuf.Len() == 0) - return false; - - bool bRes = lcl_CheckRepeatOne(aBuf, eConv, bIsRow, nVal); - if (!bRes) - return false; - - if (pRange) - { - if (bIsRow) - { - pRange->aStart.SetRow(static_cast(nVal)); - pRange->aEnd.SetRow(static_cast(nVal)); - } - else - { - pRange->aStart.SetCol(static_cast(nVal)); - pRange->aEnd.SetCol(static_cast(nVal)); - } - } - - aBuf.Erase(); - bEndPos = true; - } - else - aBuf.Append(c); - } - - if (aBuf.Len() > 0) - { - bool bRes = lcl_CheckRepeatOne(aBuf, eConv, bIsRow, nVal); - if (!bRes) - return false; - - if (pRange) - { - if (bIsRow) - { - if (!bEndPos) - pRange->aStart.SetRow(static_cast(nVal)); - pRange->aEnd.SetRow(static_cast(nVal)); - } - else - { - if (!bEndPos) - pRange->aStart.SetCol(static_cast(nVal)); - pRange->aEnd.SetCol(static_cast(nVal)); - } - } - } - - return true; -} - -// ---------------------------------------------------------------------------- - -void lcl_GetRepeatRangeString( const ScRange* pRange, ScDocument* pDoc, bool bIsRow, String& rStr ) -{ - rStr.Erase(); - if (!pRange) - return; - - const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); - const ScAddress& rStart = pRange->aStart; - const ScAddress& rEnd = pRange->aEnd; - - const USHORT nFmt = bIsRow ? (SCA_VALID_ROW | SCA_ROW_ABSOLUTE) : (SCA_VALID_COL | SCA_COL_ABSOLUTE); - String aTmpStr; - rStart.Format(aTmpStr, nFmt, pDoc, eConv); - rStr += aTmpStr; - if ((bIsRow && rStart.Row() != rEnd.Row()) || (!bIsRow && rStart.Col() != rEnd.Col())) - { - rStr += ScCompiler::GetNativeSymbol(ocRange); - rEnd.Format(aTmpStr, nFmt, pDoc, eConv); - rStr += aTmpStr; - } -} - +/************************************************************************* + * + * 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: areasdlg.cxx,v $ + * $Revision: 1.18 $ + * + * 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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + + +//---------------------------------------------------------------------------- +#include + +#include +#include +#include +#include +#include + +#define _AREASDLG_CXX +#include "areasdlg.hxx" +#undef _AREASDLG_CXX + +#include "scresid.hxx" +#include "rangenam.hxx" +#include "reffact.hxx" +#include "tabvwsh.hxx" +#include "docsh.hxx" +#include "globstr.hrc" +#include "pagedlg.hrc" +#include "compiler.hxx" + +// STATIC DATA --------------------------------------------------------------- + +// List box positions for print range (PR) +const USHORT SC_AREASDLG_PR_NONE = 0; +const USHORT SC_AREASDLG_PR_ENTIRE = 1; +const USHORT SC_AREASDLG_PR_USER = 2; +const USHORT SC_AREASDLG_PR_SELECT = 3; +const USHORT SC_AREASDLG_PR_OFFSET = 4; + +// List box positions for repeat ranges (RR) +const USHORT SC_AREASDLG_RR_NONE = 0; +const USHORT SC_AREASDLG_RR_USER = 1; +const USHORT SC_AREASDLG_RR_OFFSET = 2; + +//============================================================================ + +#define HDL(hdl) LINK( this, ScPrintAreasDlg, hdl ) +#define ERRORBOX(nId) ErrorBox( this, WinBits(WB_OK|WB_DEF_OK), \ + ScGlobal::GetRscString( nId ) ).Execute() +#define SWAP(x1,x2) { int n=x1; x1=x2; x2=n; } + +// globale Funktionen (->am Ende der Datei): + +bool lcl_CheckRepeatString( const String& rStr, ScDocument* pDoc, bool bIsRow, ScRange* pRange ); +void lcl_GetRepeatRangeString( const ScRange* pRange, ScDocument* pDoc, bool bIsRow, String& rStr ); + +#if 0 +static void printAddressFlags(USHORT nFlag) +{ + if ((nFlag & SCA_COL_ABSOLUTE ) == SCA_COL_ABSOLUTE ) printf("SCA_COL_ABSOLUTE \n"); + if ((nFlag & SCA_ROW_ABSOLUTE ) == SCA_ROW_ABSOLUTE ) printf("SCA_ROW_ABSOLUTE \n"); + if ((nFlag & SCA_TAB_ABSOLUTE ) == SCA_TAB_ABSOLUTE ) printf("SCA_TAB_ABSOLUTE \n"); + if ((nFlag & SCA_TAB_3D ) == SCA_TAB_3D ) printf("SCA_TAB_3D \n"); + if ((nFlag & SCA_COL2_ABSOLUTE ) == SCA_COL2_ABSOLUTE ) printf("SCA_COL2_ABSOLUTE\n"); + if ((nFlag & SCA_ROW2_ABSOLUTE ) == SCA_ROW2_ABSOLUTE ) printf("SCA_ROW2_ABSOLUTE\n"); + if ((nFlag & SCA_TAB2_ABSOLUTE ) == SCA_TAB2_ABSOLUTE ) printf("SCA_TAB2_ABSOLUTE\n"); + if ((nFlag & SCA_TAB2_3D ) == SCA_TAB2_3D ) printf("SCA_TAB2_3D \n"); + if ((nFlag & SCA_VALID_ROW ) == SCA_VALID_ROW ) printf("SCA_VALID_ROW \n"); + if ((nFlag & SCA_VALID_COL ) == SCA_VALID_COL ) printf("SCA_VALID_COL \n"); + if ((nFlag & SCA_VALID_TAB ) == SCA_VALID_TAB ) printf("SCA_VALID_TAB \n"); + if ((nFlag & SCA_FORCE_DOC ) == SCA_FORCE_DOC ) printf("SCA_FORCE_DOC \n"); + if ((nFlag & SCA_VALID_ROW2 ) == SCA_VALID_ROW2 ) printf("SCA_VALID_ROW2 \n"); + if ((nFlag & SCA_VALID_COL2 ) == SCA_VALID_COL2 ) printf("SCA_VALID_COL2 \n"); + if ((nFlag & SCA_VALID_TAB2 ) == SCA_VALID_TAB2 ) printf("SCA_VALID_TAB2 \n"); + if ((nFlag & SCA_VALID ) == SCA_VALID ) printf("SCA_VALID \n"); + if ((nFlag & SCA_ABS ) == SCA_ABS ) printf("SCA_ABS \n"); + if ((nFlag & SCR_ABS ) == SCR_ABS ) printf("SCR_ABS \n"); + if ((nFlag & SCA_ABS_3D ) == SCA_ABS_3D ) printf("SCA_ABS_3D \n"); + if ((nFlag & SCR_ABS_3D ) == SCR_ABS_3D ) printf("SCR_ABS_3D \n"); +} +#endif + +//============================================================================ +// class ScPrintAreasDlg + +//---------------------------------------------------------------------------- + +ScPrintAreasDlg::ScPrintAreasDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent ) + : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_AREAS), + // + aLbPrintArea ( this, ScResId( LB_PRINTAREA ) ), + aFlPrintArea ( this, ScResId( FL_PRINTAREA ) ), + aEdPrintArea ( this, ScResId( ED_PRINTAREA ) ), + aRbPrintArea ( this, ScResId( RB_PRINTAREA ), &aEdPrintArea, this ), + // + aLbRepeatRow ( this, ScResId( LB_REPEATROW ) ), + aFlRepeatRow ( this, ScResId( FL_REPEATROW ) ), + aEdRepeatRow ( this, ScResId( ED_REPEATROW ) ), + aRbRepeatRow ( this, ScResId( RB_REPEATROW ), &aEdRepeatRow, this ), + // + aLbRepeatCol ( this, ScResId( LB_REPEATCOL ) ), + aFlRepeatCol ( this, ScResId( FL_REPEATCOL ) ), + aEdRepeatCol ( this, ScResId( ED_REPEATCOL ) ), + aRbRepeatCol ( this, ScResId( RB_REPEATCOL ), &aEdRepeatCol, this ), + // + aBtnOk ( this, ScResId( BTN_OK ) ), + aBtnCancel ( this, ScResId( BTN_CANCEL ) ), + aBtnHelp ( this, ScResId( BTN_HELP ) ), + // + bDlgLostFocus ( FALSE ), + pRefInputEdit ( &aEdPrintArea ), + pDoc ( NULL ), + pViewData ( NULL ), + nCurTab ( 0 ) +{ + ScTabViewShell* pScViewSh = PTR_CAST( ScTabViewShell, SfxViewShell::Current() ); + ScDocShell* pScDocSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() ); + + DBG_ASSERT( pScDocSh, "Current DocumentShell not found :-(" ); + + pDoc = pScDocSh->GetDocument(); + + if ( pScViewSh ) + { + pViewData = pScViewSh->GetViewData(); + nCurTab = pViewData->GetTabNo(); + } + + Impl_Reset(); + + //@BugID 54702 Enablen/Disablen nur noch in Basisklasse + //SFX_APPWINDOW->Enable(); + + FreeResource(); +} + + +//---------------------------------------------------------------------------- + +ScPrintAreasDlg::~ScPrintAreasDlg() +{ + // Extra-Data an ListBox-Entries abraeumen + ListBox* pLb[3] = { &aLbPrintArea, &aLbRepeatRow, &aLbRepeatCol }; + + for ( USHORT i=0; i<3; i++ ) + { + USHORT nCount = pLb[i]->GetEntryCount(); + for ( USHORT j=0; jGetEntryData(j); + } +} + + +//---------------------------------------------------------------------------- + +BOOL ScPrintAreasDlg::Close() +{ + return DoClose( ScPrintAreasDlgWrapper::GetChildWindowId() ); +} + + +//---------------------------------------------------------------------------- + +BOOL ScPrintAreasDlg::IsTableLocked() const +{ + // Druckbereiche gelten pro Tabelle, darum macht es keinen Sinn, + // bei der Eingabe die Tabelle umzuschalten + + return TRUE; +} + + +//---------------------------------------------------------------------------- + +void ScPrintAreasDlg::SetReference( const ScRange& rRef, ScDocument* /* pDoc */ ) +{ + if ( pRefInputEdit ) + { + if ( rRef.aStart != rRef.aEnd ) + RefInputStart( pRefInputEdit ); + + String aStr; + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + + if ( &aEdPrintArea == pRefInputEdit ) + { + rRef.Format( aStr, SCR_ABS, pDoc, eConv ); + +// aEdPrintArea.ReplaceSelected( aStr ); + + String aVal = aEdPrintArea.GetText(); + Selection aSel = aEdPrintArea.GetSelection(); + aSel.Justify(); + aVal.Erase( (xub_StrLen)aSel.Min(), (xub_StrLen)aSel.Len() ); + aVal.Insert( aStr, (xub_StrLen)aSel.Min() ); + Selection aNewSel( aSel.Min(), aSel.Min()+aStr.Len() ); + aEdPrintArea.SetRefString( aVal ); + aEdPrintArea.SetSelection( aNewSel ); + } + else + { + BOOL bRow = ( &aEdRepeatRow == pRefInputEdit ); + lcl_GetRepeatRangeString(&rRef, pDoc, bRow, aStr); + pRefInputEdit->SetRefString( aStr ); + } + } + + Impl_ModifyHdl( pRefInputEdit ); +} + + +//---------------------------------------------------------------------------- + +void ScPrintAreasDlg::AddRefEntry() +{ + if ( pRefInputEdit == &aEdPrintArea ) + { + const sal_Unicode sep = ScCompiler::GetNativeSymbol(ocSep).GetChar(0); + String aVal = aEdPrintArea.GetText(); + aVal += sep; + aEdPrintArea.SetText(aVal); + + xub_StrLen nLen = aVal.Len(); + aEdPrintArea.SetSelection( Selection( nLen, nLen ) ); + + Impl_ModifyHdl( &aEdPrintArea ); + } +} + + +//---------------------------------------------------------------------------- + +void ScPrintAreasDlg::Deactivate() +{ + bDlgLostFocus = TRUE; +} + + +//---------------------------------------------------------------------------- + +void ScPrintAreasDlg::SetActive() +{ + if ( bDlgLostFocus ) + { + bDlgLostFocus = FALSE; + + if ( pRefInputEdit ) + { + pRefInputEdit->GrabFocus(); + Impl_ModifyHdl( pRefInputEdit ); + } + } + else + GrabFocus(); + + RefInputDone(); +} + + +//---------------------------------------------------------------------------- + +void ScPrintAreasDlg::Impl_Reset() +{ + String aStrRange; + const ScRange* pRepeatColRange = pDoc->GetRepeatColRange( nCurTab ); + const ScRange* pRepeatRowRange = pDoc->GetRepeatRowRange( nCurTab ); + + aEdPrintArea.SetModifyHdl ( HDL(Impl_ModifyHdl) ); + aEdRepeatRow.SetModifyHdl ( HDL(Impl_ModifyHdl) ); + aEdRepeatCol.SetModifyHdl ( HDL(Impl_ModifyHdl) ); + aEdPrintArea.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); + aEdRepeatRow.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); + aEdRepeatCol.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); + aLbPrintArea.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); + aLbRepeatRow.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); + aLbRepeatCol.SetGetFocusHdl( HDL(Impl_GetFocusHdl) ); + aLbPrintArea.SetSelectHdl ( HDL(Impl_SelectHdl) ); + aLbRepeatRow.SetSelectHdl ( HDL(Impl_SelectHdl) ); + aLbRepeatCol.SetSelectHdl ( HDL(Impl_SelectHdl) ); + aBtnOk .SetClickHdl ( HDL(Impl_BtnHdl) ); + aBtnCancel .SetClickHdl ( HDL(Impl_BtnHdl) ); + + Impl_FillLists(); + + //------------------------- + // Druckbereich + //------------------------- + aStrRange.Erase(); + String aOne; + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + const sal_Unicode sep = ScCompiler::GetNativeSymbol(ocSep).GetChar(0); + USHORT nRangeCount = pDoc->GetPrintRangeCount( nCurTab ); + for (USHORT i=0; iGetPrintRange( nCurTab, i ); + if (pPrintRange) + { + if ( aStrRange.Len() ) + aStrRange += sep; + pPrintRange->Format( aOne, SCR_ABS, pDoc, eConv ); + aStrRange += aOne; + } + } + aEdPrintArea.SetText( aStrRange ); + + //------------------------------- + // Wiederholungszeile + //------------------------------- + lcl_GetRepeatRangeString(pRepeatRowRange, pDoc, true, aStrRange); + aEdRepeatRow.SetText( aStrRange ); + + //-------------------------------- + // Wiederholungsspalte + //-------------------------------- + lcl_GetRepeatRangeString(pRepeatColRange, pDoc, false, aStrRange); + aEdRepeatCol.SetText( aStrRange ); + + Impl_ModifyHdl( &aEdPrintArea ); + Impl_ModifyHdl( &aEdRepeatRow ); + Impl_ModifyHdl( &aEdRepeatCol ); + if( pDoc->IsPrintEntireSheet( nCurTab ) ) + aLbPrintArea.SelectEntryPos( SC_AREASDLG_PR_ENTIRE ); + + aEdPrintArea.SaveValue(); // fuer FillItemSet() merken: + aEdRepeatRow.SaveValue(); + aEdRepeatCol.SaveValue(); +} + + +//---------------------------------------------------------------------------- + +BOOL ScPrintAreasDlg::Impl_GetItem( Edit* pEd, SfxStringItem& rItem ) +{ + String aRangeStr = pEd->GetText(); + BOOL bDataChanged = (pEd->GetSavedValue() != aRangeStr); + + if ( (aRangeStr.Len() > 0) && &aEdPrintArea != pEd ) + { + ScRange aRange; + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + lcl_CheckRepeatString(aRangeStr, pDoc, &aEdRepeatRow == pEd, &aRange); + aRange.Format(aRangeStr, SCR_ABS, pDoc, eConv); + } + + rItem.SetValue( aRangeStr ); + + return bDataChanged; +} + + +//---------------------------------------------------------------------------- + +BOOL ScPrintAreasDlg::Impl_CheckRefStrings() +{ + BOOL bOk = FALSE; + String aStrPrintArea = aEdPrintArea.GetText(); + String aStrRepeatRow = aEdRepeatRow.GetText(); + String aStrRepeatCol = aEdRepeatCol.GetText(); + + BOOL bPrintAreaOk = TRUE; + if ( aStrPrintArea.Len() ) + { + const USHORT nValidAddr = SCA_VALID | SCA_VALID_ROW | SCA_VALID_COL; + const USHORT nValidRange = nValidAddr | SCA_VALID_ROW2 | SCA_VALID_COL2; + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + const sal_Unicode sep = ScCompiler::GetNativeSymbol(ocSep).GetChar(0); + // const sal_Unicode rsep = ScCompiler::GetNativeSymbol(ocRange).GetChar(0); + + ScAddress aAddr; + ScRange aRange; + xub_StrLen nSepCount = aStrPrintArea.GetTokenCount(sep); + for ( xub_StrLen i = 0; i < nSepCount && bPrintAreaOk; ++i ) + { + String aOne = aStrPrintArea.GetToken(i, sep); + USHORT nResult = aRange.Parse( aOne, pDoc, eConv ); + if ((nResult & nValidRange) != nValidRange) + { + USHORT nAddrResult = aAddr.Parse( aOne, pDoc, eConv ); + if ((nAddrResult & nValidAddr) != nValidAddr) + bPrintAreaOk = FALSE; + } + } + } + + BOOL bRepeatRowOk = (aStrRepeatRow.Len() == 0); + if ( !bRepeatRowOk ) + bRepeatRowOk = lcl_CheckRepeatString(aStrRepeatRow, pDoc, true, NULL); + + BOOL bRepeatColOk = (aStrRepeatCol.Len() == 0); + if ( !bRepeatColOk ) + bRepeatColOk = lcl_CheckRepeatString(aStrRepeatCol, pDoc, false, NULL); + + // Fehlermeldungen + + bOk = (bPrintAreaOk && bRepeatRowOk && bRepeatColOk); + + if ( !bOk ) + { + Edit* pEd = NULL; + + if ( !bPrintAreaOk ) pEd = &aEdPrintArea; + else if ( !bRepeatRowOk ) pEd = &aEdRepeatRow; + else if ( !bRepeatColOk ) pEd = &aEdRepeatCol; + + ERRORBOX( STR_INVALID_TABREF ); + pEd->GrabFocus(); + } + + return bOk; +} + + +//---------------------------------------------------------------------------- + +void ScPrintAreasDlg::Impl_FillLists() +{ + //------------------------------------------------------ + // Selektion holen und String in PrintArea-ListBox merken + //------------------------------------------------------ + ScRange aRange; + String aStrRange; + BOOL bSimple = TRUE; + + if ( pViewData ) + bSimple = (pViewData->GetSimpleArea( aRange ) == SC_MARK_SIMPLE); + + formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + + if ( bSimple ) + aRange.Format( aStrRange, SCR_ABS, pDoc, eConv ); + else + { + ScRangeListRef aList( new ScRangeList ); + pViewData->GetMarkData().FillRangeListWithMarks( aList, FALSE ); + aList->Format( aStrRange, SCR_ABS, pDoc, eConv ); + } + + aLbPrintArea.SetEntryData( SC_AREASDLG_PR_SELECT, new String( aStrRange ) ); + + //------------------------------------------------------ + // Ranges holen und in ListBoxen merken + //------------------------------------------------------ + ScRangeName* pRangeNames = pDoc->GetRangeName(); + const USHORT nCount = pRangeNames ? pRangeNames->GetCount() : 0; + + if ( nCount > 0 ) + { + String aName; + String aSymbol; +// ScRange aRange; + ScRangeData* pData = NULL; + + for ( USHORT i=0; iAt( i )); + if ( pData ) + { + if ( pData->HasType( RT_ABSAREA ) + || pData->HasType( RT_REFAREA ) + || pData->HasType( RT_ABSPOS ) ) + { + pData->GetName( aName ); + pData->GetSymbol( aSymbol ); + if ( aRange.ParseAny( aSymbol, pDoc, eConv ) & SCA_VALID ) + { + if ( pData->HasType( RT_PRINTAREA ) ) + { + aRange.Format( aSymbol, SCR_ABS, pDoc, eConv ); + aLbPrintArea.SetEntryData( + aLbPrintArea.InsertEntry( aName ), + new String( aSymbol ) ); + } + + if ( pData->HasType( RT_ROWHEADER ) ) + { + lcl_GetRepeatRangeString(&aRange, pDoc, true, aSymbol); + aLbRepeatRow.SetEntryData( + aLbRepeatRow.InsertEntry( aName ), + new String( aSymbol ) ); + } + + if ( pData->HasType( RT_COLHEADER ) ) + { + lcl_GetRepeatRangeString(&aRange, pDoc, false, aSymbol); + aLbRepeatCol.SetEntryData( + aLbRepeatCol.InsertEntry( aName ), + new String( aSymbol ) ); + } + } + } + } + } + } +} + + +//---------------------------------------------------------------------------- +// Handler: +//---------------------------------------------------------------------------- + +IMPL_LINK( ScPrintAreasDlg, Impl_BtnHdl, PushButton*, pBtn ) +{ + if ( &aBtnOk == pBtn ) + { + if ( Impl_CheckRefStrings() ) + { + BOOL bDataChanged = FALSE; + String aStr; + SfxStringItem aPrintArea( SID_CHANGE_PRINTAREA, aStr ); + SfxStringItem aRepeatRow( FN_PARAM_2, aStr ); + SfxStringItem aRepeatCol( FN_PARAM_3, aStr ); + + //------------------------- + // Druckbereich veraendert? + //------------------------- + + // first try the list box, if "Entite sheet" is selected + BOOL bEntireSheet = (aLbPrintArea.GetSelectEntryPos() == SC_AREASDLG_PR_ENTIRE); + SfxBoolItem aEntireSheet( FN_PARAM_4, bEntireSheet ); + + bDataChanged = bEntireSheet != pDoc->IsPrintEntireSheet( nCurTab ); + if( !bEntireSheet ) + { + // if new list box selection is not "Entire sheet", get the edit field contents + bDataChanged |= Impl_GetItem( &aEdPrintArea, aPrintArea ); + } + + //------------------------------- + // Wiederholungszeile veraendert? + //------------------------------- + bDataChanged |= Impl_GetItem( &aEdRepeatRow, aRepeatRow ); + + //-------------------------------- + // Wiederholungsspalte veraendert? + //-------------------------------- + bDataChanged |= Impl_GetItem( &aEdRepeatCol, aRepeatCol ); + + if ( bDataChanged ) + { + SetDispatcherLock( FALSE ); + SwitchToDocument(); + GetBindings().GetDispatcher()->Execute( SID_CHANGE_PRINTAREA, + SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, + &aPrintArea, &aRepeatRow, &aRepeatCol, &aEntireSheet, 0L ); + } + + Close(); + } + } + else if ( &aBtnCancel == pBtn ) + Close(); + + return 0; +} + + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScPrintAreasDlg, Impl_GetFocusHdl, Control*, pCtr ) +{ + if ( pCtr ==(Control *) &aEdPrintArea || + pCtr ==(Control *) &aEdRepeatRow || + pCtr ==(Control *) &aEdRepeatCol) + { + pRefInputEdit = (formula::RefEdit*) pCtr; + } + else if ( pCtr ==(Control *) &aLbPrintArea) + { + pRefInputEdit = &aEdPrintArea; + } + else if ( pCtr ==(Control *) &aLbRepeatRow) + { + pRefInputEdit = &aEdRepeatRow; + } + else if ( pCtr ==(Control *) &aLbRepeatCol) + { + pRefInputEdit = &aEdRepeatCol; + } + + return 0; +} + + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScPrintAreasDlg, Impl_SelectHdl, ListBox*, pLb ) +{ + USHORT nSelPos = pLb->GetSelectEntryPos(); + Edit* pEd = NULL; + + // list box positions of specific entries, default to "repeat row/column" list boxes + USHORT nAllSheetPos = SC_AREASDLG_RR_NONE; + USHORT nUserDefPos = SC_AREASDLG_RR_USER; + USHORT nFirstCustomPos = SC_AREASDLG_RR_OFFSET; + + // find edit field for list box, and list box positions + if( pLb == &aLbPrintArea ) + { + pEd = &aEdPrintArea; + nAllSheetPos = SC_AREASDLG_PR_ENTIRE; + nUserDefPos = SC_AREASDLG_PR_USER; + nFirstCustomPos = SC_AREASDLG_PR_SELECT; // "Selection" and following + } + else if( pLb == &aLbRepeatCol ) + pEd = &aEdRepeatCol; + else if( pLb == &aLbRepeatRow ) + pEd = &aEdRepeatRow; + else + return 0; + + // fill edit field according to list box selection + if( (nSelPos == 0) || (nSelPos == nAllSheetPos) ) + pEd->SetText( EMPTY_STRING ); + else if( nSelPos == nUserDefPos && !pLb->IsTravelSelect() && pEd->GetText().Len() == 0 ) + pLb->SelectEntryPos( 0 ); + else if( nSelPos >= nFirstCustomPos ) + pEd->SetText( *static_cast< String* >( pLb->GetEntryData( nSelPos ) ) ); + + return 0; +} + + +//---------------------------------------------------------------------------- + +IMPL_LINK( ScPrintAreasDlg, Impl_ModifyHdl, formula::RefEdit*, pEd ) +{ + ListBox* pLb = NULL; + + // list box positions of specific entries, default to "repeat row/column" list boxes + USHORT nUserDefPos = SC_AREASDLG_RR_USER; + USHORT nFirstCustomPos = SC_AREASDLG_RR_OFFSET; + + if( pEd == &aEdPrintArea ) + { + pLb = &aLbPrintArea; + nUserDefPos = SC_AREASDLG_PR_USER; + nFirstCustomPos = SC_AREASDLG_PR_SELECT; // "Selection" and following + } + else if( pEd == &aEdRepeatCol ) + pLb = &aLbRepeatCol; + else if( pEd == &aEdRepeatRow ) + pLb = &aLbRepeatRow; + else + return 0; + + // set list box selection according to edit field + USHORT nEntryCount = pLb->GetEntryCount(); + String aStrEd( pEd->GetText() ); + String aEdUpper = aStrEd; + aEdUpper.ToUpperAscii(); + + if ( (nEntryCount > nFirstCustomPos) && aStrEd.Len() > 0 ) + { + BOOL bFound = FALSE; + String* pSymbol = NULL; + USHORT i; + + for ( i=nFirstCustomPos; iGetEntryData( i ); + bFound = ( (*pSymbol == aStrEd) || (*pSymbol == aEdUpper) ); + } + + pLb->SelectEntryPos( bFound ? i-1 : nUserDefPos ); + } + else + pLb->SelectEntryPos( aStrEd.Len() ? nUserDefPos : 0 ); + + return 0; +} + + +//============================================================================ +// globale Funktionen: + +// ---------------------------------------------------------------------------- + +// TODO: It might make sense to move these functions to address.?xx. -kohei + +bool lcl_CheckOne_OOO( const String& rStr, bool bIsRow, SCCOLROW& rVal ) +{ + // Zulaessige Syntax fuer rStr: + // Row: [$]1-MAXTAB + // Col: [$]A-IV + + String aStr = rStr; + xub_StrLen nLen = aStr.Len(); + SCCOLROW nNum = 0; + BOOL bStrOk = ( nLen > 0 ) && ( bIsRow ? ( nLen < 6 ) : ( nLen < 4 ) ); + + if ( bStrOk ) + { + if ( '$' == aStr.GetChar(0) ) + aStr.Erase( 0, 1 ); + + if ( bIsRow ) + { + bStrOk = CharClass::isAsciiNumeric(aStr); + + if ( bStrOk ) + { + sal_Int32 n = aStr.ToInt32(); + + if ( ( bStrOk = (n > 0) && ( n <= MAXROWCOUNT ) ) != FALSE ) + nNum = static_cast(n - 1); + } + } + else + { + SCCOL nCol = 0; + bStrOk = ::AlphaToCol( nCol, aStr); + nNum = nCol; + } + } + + if ( bStrOk ) + rVal = nNum; + + return bStrOk; +} + +bool lcl_CheckOne_XL_A1( const String& rStr, bool bIsRow, SCCOLROW& rVal ) +{ + // XL A1 style is identical to OOO one for print range formats. + return lcl_CheckOne_OOO(rStr, bIsRow, rVal); +} + +bool lcl_CheckOne_XL_R1C1( const String& rStr, bool bIsRow, SCCOLROW& rVal ) +{ + xub_StrLen nLen = rStr.Len(); + if (nLen <= 1) + // There must be at least two characters. + return false; + + const sal_Unicode preUpper = bIsRow ? 'R' : 'C'; + const sal_Unicode preLower = bIsRow ? 'r' : 'c'; + if (rStr.GetChar(0) != preUpper && rStr.GetChar(0) != preLower) + return false; + + String aNumStr = rStr.Copy(1); + if (!CharClass::isAsciiNumeric(aNumStr)) + return false; + + sal_Int32 nNum = aNumStr.ToInt32(); + + if (nNum <= 0) + return false; + + if ((bIsRow && nNum > MAXROWCOUNT) || (!bIsRow && nNum > MAXCOLCOUNT)) + return false; + + rVal = static_cast(nNum-1); + return true; +} + +bool lcl_CheckRepeatOne( const String& rStr, formula::FormulaGrammar::AddressConvention eConv, bool bIsRow, SCCOLROW& rVal ) +{ + switch (eConv) + { + case formula::FormulaGrammar::CONV_OOO: + return lcl_CheckOne_OOO(rStr, bIsRow, rVal); + case formula::FormulaGrammar::CONV_XL_A1: + return lcl_CheckOne_XL_A1(rStr, bIsRow, rVal); + case formula::FormulaGrammar::CONV_XL_R1C1: + return lcl_CheckOne_XL_R1C1(rStr, bIsRow, rVal); + default: + { + // added to avoid warnings + } + } + return false; +} + +bool lcl_CheckRepeatString( const String& rStr, ScDocument* pDoc, bool bIsRow, ScRange* pRange ) +{ + // Row: [valid row] rsep [valid row] + // Col: [valid col] rsep [valid col] + + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + const sal_Unicode rsep = ScCompiler::GetNativeSymbol(ocRange).GetChar(0); + + if (pRange) + { + // initialize the range value. + pRange->aStart.SetCol(0); + pRange->aStart.SetRow(0); + pRange->aEnd.SetCol(0); + pRange->aEnd.SetRow(0); + } + + String aBuf; + SCCOLROW nVal = 0; + xub_StrLen nLen = rStr.Len(); + bool bEndPos = false; + for (xub_StrLen i = 0; i < nLen; ++i) + { + const sal_Unicode c = rStr.GetChar(i); + if (c == rsep) + { + if (bEndPos) + // We aren't supposed to have more than one range separator. + return false; + + // range separator + if (aBuf.Len() == 0) + return false; + + bool bRes = lcl_CheckRepeatOne(aBuf, eConv, bIsRow, nVal); + if (!bRes) + return false; + + if (pRange) + { + if (bIsRow) + { + pRange->aStart.SetRow(static_cast(nVal)); + pRange->aEnd.SetRow(static_cast(nVal)); + } + else + { + pRange->aStart.SetCol(static_cast(nVal)); + pRange->aEnd.SetCol(static_cast(nVal)); + } + } + + aBuf.Erase(); + bEndPos = true; + } + else + aBuf.Append(c); + } + + if (aBuf.Len() > 0) + { + bool bRes = lcl_CheckRepeatOne(aBuf, eConv, bIsRow, nVal); + if (!bRes) + return false; + + if (pRange) + { + if (bIsRow) + { + if (!bEndPos) + pRange->aStart.SetRow(static_cast(nVal)); + pRange->aEnd.SetRow(static_cast(nVal)); + } + else + { + if (!bEndPos) + pRange->aStart.SetCol(static_cast(nVal)); + pRange->aEnd.SetCol(static_cast(nVal)); + } + } + } + + return true; +} + +// ---------------------------------------------------------------------------- + +void lcl_GetRepeatRangeString( const ScRange* pRange, ScDocument* pDoc, bool bIsRow, String& rStr ) +{ + rStr.Erase(); + if (!pRange) + return; + + const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention(); + const ScAddress& rStart = pRange->aStart; + const ScAddress& rEnd = pRange->aEnd; + + const USHORT nFmt = bIsRow ? (SCA_VALID_ROW | SCA_ROW_ABSOLUTE) : (SCA_VALID_COL | SCA_COL_ABSOLUTE); + String aTmpStr; + rStart.Format(aTmpStr, nFmt, pDoc, eConv); + rStr += aTmpStr; + if ((bIsRow && rStart.Row() != rEnd.Row()) || (!bIsRow && rStart.Col() != rEnd.Col())) + { + rStr += ScCompiler::GetNativeSymbol(ocRange); + rEnd.Format(aTmpStr, nFmt, pDoc, eConv); + rStr += aTmpStr; + } +} + -- cgit