Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <osl/mutex.hxx>
21 : #include <sfx2/printer.hxx>
22 : #include <vcl/svapp.hxx>
23 : #include <svtools/ctrltool.hxx>
24 : #include <svl/itemprop.hxx>
25 : #include <unotools/localedatawrapper.hxx>
26 : #include <comphelper/processfactory.hxx>
27 : #include <editeng/paperinf.hxx>
28 : #include <vcl/settings.hxx>
29 : #include <vcl/print.hxx>
30 : #include <toolkit/awt/vclxdevice.hxx>
31 : #include <com/sun/star/beans/PropertyState.hpp>
32 : #include <com/sun/star/beans/PropertyAttribute.hpp>
33 : #include <com/sun/star/formula/SymbolDescriptor.hpp>
34 : #include <com/sun/star/awt/Size.hpp>
35 : #include <com/sun/star/script/XLibraryContainer.hpp>
36 : #include <xmloff/xmluconv.hxx>
37 : #include <rtl/ustrbuf.hxx>
38 : #include <comphelper/propertysetinfo.hxx>
39 : #include <comphelper/servicehelper.hxx>
40 : #include <unotools/moduleoptions.hxx>
41 :
42 : #include <unomodel.hxx>
43 : #include <document.hxx>
44 : #include <view.hxx>
45 : #include <symbol.hxx>
46 : #include <starmath.hrc>
47 : #include <config.hxx>
48 : #include <smdll.hxx>
49 :
50 : using namespace ::cppu;
51 : using namespace ::std;
52 : using namespace ::comphelper;
53 : using namespace ::com::sun::star;
54 : using namespace ::com::sun::star::uno;
55 : using namespace ::com::sun::star::beans;
56 : using namespace ::com::sun::star::lang;
57 : using namespace ::com::sun::star::formula;
58 : using namespace ::com::sun::star::view;
59 : using namespace ::com::sun::star::script;
60 :
61 : #define TWIP_TO_MM100(TWIP) ((TWIP) >= 0 ? (((TWIP)*127L+36L)/72L) : (((TWIP)*127L-36L)/72L))
62 : #define MM100_TO_TWIP(MM100) ((MM100) >= 0 ? (((MM100)*72L+63L)/127L) : (((MM100)*72L-63L)/127L))
63 :
64 : ////////////////////////////////////////////////////////////
65 :
66 0 : SmPrintUIOptions::SmPrintUIOptions()
67 : {
68 0 : ResStringArray aLocalizedStrings( SmResId( RID_PRINTUIOPTIONS ) );
69 : OSL_ENSURE( aLocalizedStrings.Count() >= 18, "resource incomplete" );
70 0 : if( aLocalizedStrings.Count() < 9 ) // bad resource ?
71 0 : return;
72 :
73 0 : SmModule *pp = SM_MOD();
74 0 : SmConfig *pConfig = pp->GetConfig();
75 : OSL_ENSURE( pConfig, "SmConfig not found" );
76 0 : if (!pConfig)
77 0 : return;
78 :
79 0 : sal_Int32 nNumProps = 10, nIdx=0;
80 :
81 : // create sequence of print UI options
82 : // (Actually IsIgnoreSpacesRight is a parser option. Without it we need only 8 properties here.)
83 0 : m_aUIProperties.realloc( nNumProps );
84 :
85 : // load the math PrinterOptions into the custom tab
86 0 : m_aUIProperties[nIdx].Name = OUString("OptionsUIFile");
87 0 : m_aUIProperties[nIdx++].Value <<= OUString("modules/smath/ui/printeroptions.ui");
88 :
89 : // create Section for formula (results in an extra tab page in dialog)
90 0 : SvtModuleOptions aOpt;
91 : OUString aAppGroupname(
92 : aLocalizedStrings.GetString( 0 ).
93 0 : replaceFirst( "%s", aOpt.GetModuleName( SvtModuleOptions::E_SMATH ) ) );
94 0 : m_aUIProperties[nIdx++].Value = setGroupControlOpt("tabcontrol-page2", aAppGroupname, ".HelpID:vcl:PrintDialog:TabPage:AppPage");
95 :
96 : // create subgroup for print options
97 0 : m_aUIProperties[nIdx++].Value = setSubgroupControlOpt("contents", aLocalizedStrings.GetString(1), OUString());
98 :
99 : // create a bool option for title row (matches to SID_PRINTTITLE)
100 0 : m_aUIProperties[nIdx++].Value = setBoolControlOpt("title", aLocalizedStrings.GetString( 2 ),
101 : ".HelpID:vcl:PrintDialog:TitleRow:CheckBox",
102 : PRTUIOPT_TITLE_ROW,
103 0 : pConfig->IsPrintTitle());
104 : // create a bool option for formula text (matches to SID_PRINTTEXT)
105 0 : m_aUIProperties[nIdx++].Value = setBoolControlOpt("formulatext", aLocalizedStrings.GetString( 3 ),
106 : ".HelpID:vcl:PrintDialog:FormulaText:CheckBox",
107 : PRTUIOPT_FORMULA_TEXT,
108 0 : pConfig->IsPrintFormulaText());
109 : // create a bool option for border (matches to SID_PRINTFRAME)
110 0 : m_aUIProperties[nIdx++].Value = setBoolControlOpt("borders", aLocalizedStrings.GetString( 4 ),
111 : ".HelpID:vcl:PrintDialog:Border:CheckBox",
112 : PRTUIOPT_BORDER,
113 0 : pConfig->IsPrintFrame());
114 :
115 : // create subgroup for print format
116 0 : m_aUIProperties[nIdx++].Value = setSubgroupControlOpt("size", aLocalizedStrings.GetString(5), OUString());
117 :
118 : // create a radio button group for print format (matches to SID_PRINTSIZE)
119 0 : Sequence< OUString > aChoices( 3 );
120 0 : aChoices[0] = aLocalizedStrings.GetString( 6 );
121 0 : aChoices[1] = aLocalizedStrings.GetString( 7 );
122 0 : aChoices[2] = aLocalizedStrings.GetString( 8 );
123 0 : Sequence< OUString > aHelpIds( 3 );
124 0 : aHelpIds[0] = ".HelpID:vcl:PrintDialog:PrintFormat:RadioButton:0";
125 0 : aHelpIds[1] = ".HelpID:vcl:PrintDialog:PrintFormat:RadioButton:1";
126 0 : aHelpIds[2] = ".HelpID:vcl:PrintDialog:PrintFormat:RadioButton:2";
127 0 : Sequence< OUString > aWidgetIds( 3 );
128 0 : aWidgetIds[0] = "originalsize";
129 0 : aWidgetIds[1] = "fittopage";
130 0 : aWidgetIds[2] = "scaling";
131 0 : OUString aPrintFormatProp( PRTUIOPT_PRINT_FORMAT );
132 0 : m_aUIProperties[nIdx++].Value = setChoiceRadiosControlOpt(aWidgetIds, OUString(),
133 : aHelpIds,
134 : aPrintFormatProp,
135 0 : aChoices, static_cast< sal_Int32 >(pConfig->GetPrintSize())
136 0 : );
137 :
138 : // create a numeric box for scale dependent on PrintFormat = "Scaling" (matches to SID_PRINTZOOM)
139 0 : vcl::PrinterOptionsHelper::UIControlOptions aRangeOpt( aPrintFormatProp, 2, sal_True );
140 0 : m_aUIProperties[nIdx++].Value = setRangeControlOpt("scalingspin", OUString(),
141 : ".HelpID:vcl:PrintDialog:PrintScale:NumericField",
142 : PRTUIOPT_PRINT_SCALE,
143 0 : pConfig->GetPrintZoomFactor(), // initial value
144 : 10, // min value
145 : 1000, // max value
146 0 : aRangeOpt);
147 :
148 0 : Sequence< PropertyValue > aHintNoLayoutPage( 1 );
149 0 : aHintNoLayoutPage[0].Name = "HintNoLayoutPage";
150 0 : aHintNoLayoutPage[0].Value = makeAny( sal_True );
151 0 : m_aUIProperties[nIdx++].Value <<= aHintNoLayoutPage;
152 :
153 0 : assert(nIdx == nNumProps);
154 : }
155 :
156 :
157 : ////////////////////////////////////////////////////////////
158 : //
159 : // class SmModel
160 : //
161 :
162 : // values from com/sun/star/beans/PropertyAttribute
163 : #define PROPERTY_NONE 0
164 :
165 : enum SmModelPropertyHandles
166 : {
167 : HANDLE_FORMULA,
168 : HANDLE_FONT_NAME_VARIABLES,
169 : HANDLE_FONT_NAME_FUNCTIONS,
170 : HANDLE_FONT_NAME_NUMBERS,
171 : HANDLE_FONT_NAME_TEXT,
172 : HANDLE_CUSTOM_FONT_NAME_SERIF,
173 : HANDLE_CUSTOM_FONT_NAME_SANS,
174 : HANDLE_CUSTOM_FONT_NAME_FIXED,
175 : HANDLE_CUSTOM_FONT_FIXED_POSTURE,
176 : HANDLE_CUSTOM_FONT_FIXED_WEIGHT,
177 : HANDLE_CUSTOM_FONT_SANS_POSTURE,
178 : HANDLE_CUSTOM_FONT_SANS_WEIGHT,
179 : HANDLE_CUSTOM_FONT_SERIF_POSTURE,
180 : HANDLE_CUSTOM_FONT_SERIF_WEIGHT,
181 : HANDLE_FONT_VARIABLES_POSTURE,
182 : HANDLE_FONT_VARIABLES_WEIGHT,
183 : HANDLE_FONT_FUNCTIONS_POSTURE,
184 : HANDLE_FONT_FUNCTIONS_WEIGHT,
185 : HANDLE_FONT_NUMBERS_POSTURE,
186 : HANDLE_FONT_NUMBERS_WEIGHT,
187 : HANDLE_FONT_TEXT_POSTURE,
188 : HANDLE_FONT_TEXT_WEIGHT,
189 : HANDLE_BASE_FONT_HEIGHT,
190 : HANDLE_RELATIVE_FONT_HEIGHT_TEXT,
191 : HANDLE_RELATIVE_FONT_HEIGHT_INDICES,
192 : HANDLE_RELATIVE_FONT_HEIGHT_FUNCTIONS,
193 : HANDLE_RELATIVE_FONT_HEIGHT_OPERATORS,
194 : HANDLE_RELATIVE_FONT_HEIGHT_LIMITS,
195 : HANDLE_IS_TEXT_MODE,
196 : HANDLE_GREEK_CHAR_STYLE,
197 : HANDLE_ALIGNMENT,
198 : HANDLE_RELATIVE_SPACING,
199 : HANDLE_RELATIVE_LINE_SPACING,
200 : HANDLE_RELATIVE_ROOT_SPACING,
201 : HANDLE_RELATIVE_INDEX_SUPERSCRIPT,
202 : HANDLE_RELATIVE_INDEX_SUBSCRIPT,
203 : HANDLE_RELATIVE_FRACTION_NUMERATOR_HEIGHT,
204 : HANDLE_RELATIVE_FRACTION_DENOMINATOR_DEPTH,
205 : HANDLE_RELATIVE_FRACTION_BAR_EXCESS_LENGTH,
206 : HANDLE_RELATIVE_FRACTION_BAR_LINE_WEIGHT,
207 : HANDLE_RELATIVE_UPPER_LIMIT_DISTANCE,
208 : HANDLE_RELATIVE_LOWER_LIMIT_DISTANCE,
209 : HANDLE_RELATIVE_BRACKET_EXCESS_SIZE,
210 : HANDLE_RELATIVE_BRACKET_DISTANCE,
211 : HANDLE_IS_SCALE_ALL_BRACKETS,
212 : HANDLE_RELATIVE_SCALE_BRACKET_EXCESS_SIZE,
213 : HANDLE_RELATIVE_MATRIX_LINE_SPACING,
214 : HANDLE_RELATIVE_MATRIX_COLUMN_SPACING,
215 : HANDLE_RELATIVE_SYMBOL_PRIMARY_HEIGHT,
216 : HANDLE_RELATIVE_SYMBOL_MINIMUM_HEIGHT,
217 : HANDLE_RELATIVE_OPERATOR_EXCESS_SIZE,
218 : HANDLE_RELATIVE_OPERATOR_SPACING,
219 : HANDLE_LEFT_MARGIN,
220 : HANDLE_RIGHT_MARGIN,
221 : HANDLE_TOP_MARGIN,
222 : HANDLE_BOTTOM_MARGIN,
223 : HANDLE_PRINTER_NAME,
224 : HANDLE_PRINTER_SETUP,
225 : HANDLE_SYMBOLS,
226 : HANDLE_USED_SYMBOLS,
227 : HANDLE_BASIC_LIBRARIES,
228 : HANDLE_RUNTIME_UID,
229 : HANDLE_LOAD_READONLY, // Security Options
230 : HANDLE_DIALOG_LIBRARIES, // #i73329#
231 : HANDLE_BASELINE
232 : };
233 :
234 202 : static PropertySetInfo * lcl_createModelPropertyInfo ()
235 : {
236 : static PropertyMapEntry aModelPropertyInfoMap[] =
237 : {
238 7 : { RTL_CONSTASCII_STRINGPARAM( "Alignment" ), HANDLE_ALIGNMENT , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, 0},
239 7 : { RTL_CONSTASCII_STRINGPARAM( "BaseFontHeight" ), HANDLE_BASE_FONT_HEIGHT , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, 0},
240 7 : { RTL_CONSTASCII_STRINGPARAM( "BasicLibraries" ), HANDLE_BASIC_LIBRARIES , &::getCppuType((const uno::Reference< script::XLibraryContainer > *)0), PropertyAttribute::READONLY, 0},
241 7 : { RTL_CONSTASCII_STRINGPARAM( "BottomMargin" ), HANDLE_BOTTOM_MARGIN , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_BOTTOMSPACE },
242 7 : { RTL_CONSTASCII_STRINGPARAM( "CustomFontNameFixed" ), HANDLE_CUSTOM_FONT_NAME_FIXED , &::getCppuType((const OUString*)0), PROPERTY_NONE, FNT_FIXED },
243 7 : { RTL_CONSTASCII_STRINGPARAM( "CustomFontNameSans" ), HANDLE_CUSTOM_FONT_NAME_SANS , &::getCppuType((const OUString*)0), PROPERTY_NONE, FNT_SANS },
244 7 : { RTL_CONSTASCII_STRINGPARAM( "CustomFontNameSerif" ), HANDLE_CUSTOM_FONT_NAME_SERIF , &::getCppuType((const OUString*)0), PROPERTY_NONE, FNT_SERIF },
245 7 : { RTL_CONSTASCII_STRINGPARAM( "DialogLibraries" ), HANDLE_DIALOG_LIBRARIES , &::getCppuType((const uno::Reference< script::XLibraryContainer > *)0), PropertyAttribute::READONLY, 0},
246 7 : { RTL_CONSTASCII_STRINGPARAM( "FontFixedIsBold"), HANDLE_CUSTOM_FONT_FIXED_WEIGHT , &::getBooleanCppuType(), PROPERTY_NONE, FNT_FIXED},
247 7 : { RTL_CONSTASCII_STRINGPARAM( "FontFixedIsItalic"), HANDLE_CUSTOM_FONT_FIXED_POSTURE , &::getBooleanCppuType(), PROPERTY_NONE, FNT_FIXED},
248 7 : { RTL_CONSTASCII_STRINGPARAM( "FontFunctionsIsBold"), HANDLE_FONT_FUNCTIONS_WEIGHT , &::getBooleanCppuType(), PROPERTY_NONE, FNT_FUNCTION},
249 7 : { RTL_CONSTASCII_STRINGPARAM( "FontFunctionsIsItalic"), HANDLE_FONT_FUNCTIONS_POSTURE , &::getBooleanCppuType(), PROPERTY_NONE, FNT_FUNCTION},
250 7 : { RTL_CONSTASCII_STRINGPARAM( "FontNameFunctions" ), HANDLE_FONT_NAME_FUNCTIONS , &::getCppuType((const OUString*)0), PROPERTY_NONE, FNT_FUNCTION },
251 7 : { RTL_CONSTASCII_STRINGPARAM( "FontNameNumbers" ), HANDLE_FONT_NAME_NUMBERS , &::getCppuType((const OUString*)0), PROPERTY_NONE, FNT_NUMBER },
252 7 : { RTL_CONSTASCII_STRINGPARAM( "FontNameText" ), HANDLE_FONT_NAME_TEXT , &::getCppuType((const OUString*)0), PROPERTY_NONE, FNT_TEXT },
253 7 : { RTL_CONSTASCII_STRINGPARAM( "FontNameVariables" ), HANDLE_FONT_NAME_VARIABLES , &::getCppuType((const OUString*)0), PROPERTY_NONE, FNT_VARIABLE },
254 7 : { RTL_CONSTASCII_STRINGPARAM( "FontNumbersIsBold"), HANDLE_FONT_NUMBERS_WEIGHT , &::getBooleanCppuType(), PROPERTY_NONE, FNT_NUMBER},
255 7 : { RTL_CONSTASCII_STRINGPARAM( "FontNumbersIsItalic"), HANDLE_FONT_NUMBERS_POSTURE , &::getBooleanCppuType(), PROPERTY_NONE, FNT_NUMBER},
256 7 : { RTL_CONSTASCII_STRINGPARAM( "FontSansIsBold"), HANDLE_CUSTOM_FONT_SANS_WEIGHT , &::getBooleanCppuType(), PROPERTY_NONE, FNT_SANS},
257 7 : { RTL_CONSTASCII_STRINGPARAM( "FontSansIsItalic"), HANDLE_CUSTOM_FONT_SANS_POSTURE , &::getBooleanCppuType(), PROPERTY_NONE, FNT_SANS},
258 7 : { RTL_CONSTASCII_STRINGPARAM( "FontSerifIsBold"), HANDLE_CUSTOM_FONT_SERIF_WEIGHT , &::getBooleanCppuType(), PROPERTY_NONE, FNT_SERIF},
259 7 : { RTL_CONSTASCII_STRINGPARAM( "FontSerifIsItalic"), HANDLE_CUSTOM_FONT_SERIF_POSTURE , &::getBooleanCppuType(), PROPERTY_NONE, FNT_SERIF},
260 7 : { RTL_CONSTASCII_STRINGPARAM( "FontTextIsBold"), HANDLE_FONT_TEXT_WEIGHT , &::getBooleanCppuType(), PROPERTY_NONE, FNT_TEXT},
261 7 : { RTL_CONSTASCII_STRINGPARAM( "FontTextIsItalic"), HANDLE_FONT_TEXT_POSTURE , &::getBooleanCppuType(), PROPERTY_NONE, FNT_TEXT},
262 7 : { RTL_CONSTASCII_STRINGPARAM( "FontVariablesIsBold"), HANDLE_FONT_VARIABLES_WEIGHT , &::getBooleanCppuType(), PROPERTY_NONE, FNT_VARIABLE},
263 7 : { RTL_CONSTASCII_STRINGPARAM( "FontVariablesIsItalic"), HANDLE_FONT_VARIABLES_POSTURE, &::getBooleanCppuType(), PROPERTY_NONE, FNT_VARIABLE},
264 7 : { RTL_CONSTASCII_STRINGPARAM( "Formula" ), HANDLE_FORMULA , &::getCppuType((const OUString*)0), PROPERTY_NONE, 0},
265 7 : { RTL_CONSTASCII_STRINGPARAM( "IsScaleAllBrackets" ), HANDLE_IS_SCALE_ALL_BRACKETS , &::getBooleanCppuType(), PROPERTY_NONE, 0},
266 7 : { RTL_CONSTASCII_STRINGPARAM( "IsTextMode" ), HANDLE_IS_TEXT_MODE , &::getBooleanCppuType(), PROPERTY_NONE, 0},
267 7 : { RTL_CONSTASCII_STRINGPARAM( "GreekCharStyle" ), HANDLE_GREEK_CHAR_STYLE, &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, 0},
268 7 : { RTL_CONSTASCII_STRINGPARAM( "LeftMargin" ), HANDLE_LEFT_MARGIN , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_LEFTSPACE },
269 7 : { RTL_CONSTASCII_STRINGPARAM( "PrinterName" ), HANDLE_PRINTER_NAME , &::getCppuType((const OUString*)0), PROPERTY_NONE, 0 },
270 7 : { RTL_CONSTASCII_STRINGPARAM( "PrinterSetup" ), HANDLE_PRINTER_SETUP , &::getCppuType((const Sequence < sal_Int8 >*)0), PROPERTY_NONE, 0 },
271 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeBracketDistance" ), HANDLE_RELATIVE_BRACKET_DISTANCE , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_BRACKETSPACE },
272 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeBracketExcessSize" ), HANDLE_RELATIVE_BRACKET_EXCESS_SIZE , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_BRACKETSIZE },
273 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeFontHeightFunctions" ), HANDLE_RELATIVE_FONT_HEIGHT_FUNCTIONS , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, SIZ_FUNCTION},
274 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeFontHeightIndices" ), HANDLE_RELATIVE_FONT_HEIGHT_INDICES , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, SIZ_INDEX },
275 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeFontHeightLimits" ), HANDLE_RELATIVE_FONT_HEIGHT_LIMITS , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, SIZ_LIMITS },
276 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeFontHeightOperators" ), HANDLE_RELATIVE_FONT_HEIGHT_OPERATORS , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, SIZ_OPERATOR},
277 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeFontHeightText" ), HANDLE_RELATIVE_FONT_HEIGHT_TEXT , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, SIZ_TEXT },
278 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeFractionBarExcessLength"), HANDLE_RELATIVE_FRACTION_BAR_EXCESS_LENGTH, &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_FRACTION },
279 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeFractionBarLineWeight" ), HANDLE_RELATIVE_FRACTION_BAR_LINE_WEIGHT , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_STROKEWIDTH },
280 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeFractionDenominatorDepth"), HANDLE_RELATIVE_FRACTION_DENOMINATOR_DEPTH, &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_DENOMINATOR },
281 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeFractionNumeratorHeight" ), HANDLE_RELATIVE_FRACTION_NUMERATOR_HEIGHT , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_NUMERATOR },
282 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeIndexSubscript" ), HANDLE_RELATIVE_INDEX_SUBSCRIPT , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_SUBSCRIPT },
283 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeIndexSuperscript" ), HANDLE_RELATIVE_INDEX_SUPERSCRIPT , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_SUPERSCRIPT },
284 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeLineSpacing" ), HANDLE_RELATIVE_LINE_SPACING , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_VERTICAL },
285 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeLowerLimitDistance" ), HANDLE_RELATIVE_LOWER_LIMIT_DISTANCE , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_LOWERLIMIT },
286 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeMatrixColumnSpacing" ), HANDLE_RELATIVE_MATRIX_COLUMN_SPACING , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_MATRIXCOL},
287 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeMatrixLineSpacing" ), HANDLE_RELATIVE_MATRIX_LINE_SPACING , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_MATRIXROW},
288 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeOperatorExcessSize" ), HANDLE_RELATIVE_OPERATOR_EXCESS_SIZE , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_OPERATORSIZE },
289 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeOperatorSpacing" ), HANDLE_RELATIVE_OPERATOR_SPACING , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_OPERATORSPACE},
290 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeRootSpacing" ), HANDLE_RELATIVE_ROOT_SPACING , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_ROOT },
291 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeScaleBracketExcessSize" ), HANDLE_RELATIVE_SCALE_BRACKET_EXCESS_SIZE , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_NORMALBRACKETSIZE},
292 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeSpacing" ), HANDLE_RELATIVE_SPACING , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_HORIZONTAL },
293 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeSymbolMinimumHeight" ), HANDLE_RELATIVE_SYMBOL_MINIMUM_HEIGHT , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_ORNAMENTSPACE },
294 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeSymbolPrimaryHeight" ), HANDLE_RELATIVE_SYMBOL_PRIMARY_HEIGHT , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_ORNAMENTSIZE },
295 7 : { RTL_CONSTASCII_STRINGPARAM( "RelativeUpperLimitDistance" ), HANDLE_RELATIVE_UPPER_LIMIT_DISTANCE , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_UPPERLIMIT },
296 7 : { RTL_CONSTASCII_STRINGPARAM( "RightMargin" ), HANDLE_RIGHT_MARGIN , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_RIGHTSPACE },
297 7 : { RTL_CONSTASCII_STRINGPARAM( "RuntimeUID" ), HANDLE_RUNTIME_UID , &::getCppuType(static_cast< const OUString * >(0)), PropertyAttribute::READONLY, 0 },
298 7 : { RTL_CONSTASCII_STRINGPARAM( "Symbols" ), HANDLE_SYMBOLS , &::getCppuType((const Sequence < SymbolDescriptor > *)0), PROPERTY_NONE, 0 },
299 7 : { RTL_CONSTASCII_STRINGPARAM( "UserDefinedSymbolsInUse" ), HANDLE_USED_SYMBOLS , &::getCppuType((const Sequence < SymbolDescriptor > *)0), PropertyAttribute::READONLY, 0 },
300 7 : { RTL_CONSTASCII_STRINGPARAM( "TopMargin" ), HANDLE_TOP_MARGIN , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_TOPSPACE },
301 : // #i33095# Security Options
302 7 : { RTL_CONSTASCII_STRINGPARAM( "LoadReadonly" ), HANDLE_LOAD_READONLY, &::getBooleanCppuType(), PROPERTY_NONE, 0 },
303 : // #i972#
304 7 : { RTL_CONSTASCII_STRINGPARAM( "BaseLine"), HANDLE_BASELINE, &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, 0},
305 : { NULL, 0, 0, NULL, 0, 0 }
306 657 : };
307 202 : PropertySetInfo *pInfo = new PropertySetInfo ( aModelPropertyInfoMap );
308 202 : return pInfo;
309 : }
310 :
311 202 : SmModel::SmModel( SfxObjectShell *pObjSh )
312 : : SfxBaseModel(pObjSh)
313 : , PropertySetHelper ( lcl_createModelPropertyInfo () )
314 202 : , m_pPrintUIOptions( NULL )
315 :
316 : {
317 202 : }
318 :
319 48 : SmModel::~SmModel() throw ()
320 : {
321 16 : delete m_pPrintUIOptions;
322 32 : }
323 :
324 58999 : uno::Any SAL_CALL SmModel::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException)
325 : {
326 : uno::Any aRet = ::cppu::queryInterface ( rType,
327 : // OWeakObject interfaces
328 : dynamic_cast< XInterface* > ( static_cast< XUnoTunnel* > ( this )),
329 : static_cast< XWeak* > ( this ),
330 : // PropertySetHelper interfaces
331 : static_cast< XPropertySet* > ( this ),
332 : static_cast< XMultiPropertySet* > ( this ),
333 : //static_cast< XPropertyState* > ( this ),
334 : // my own interfaces
335 : static_cast< XServiceInfo* > ( this ),
336 58999 : static_cast< XRenderable* > ( this ) );
337 58999 : if (!aRet.hasValue())
338 45226 : aRet = SfxBaseModel::queryInterface ( rType );
339 58999 : return aRet;
340 : }
341 :
342 144789 : void SAL_CALL SmModel::acquire() throw()
343 : {
344 144789 : OWeakObject::acquire();
345 144789 : }
346 :
347 144449 : void SAL_CALL SmModel::release() throw()
348 : {
349 144449 : OWeakObject::release();
350 144449 : }
351 :
352 18 : uno::Sequence< uno::Type > SAL_CALL SmModel::getTypes( ) throw(uno::RuntimeException)
353 : {
354 18 : SolarMutexGuard aGuard;
355 18 : uno::Sequence< uno::Type > aTypes = SfxBaseModel::getTypes();
356 18 : sal_Int32 nLen = aTypes.getLength();
357 18 : aTypes.realloc(nLen + 4);
358 18 : uno::Type* pTypes = aTypes.getArray();
359 18 : pTypes[nLen++] = ::getCppuType((Reference<XServiceInfo>*)0);
360 18 : pTypes[nLen++] = ::getCppuType((Reference<XPropertySet>*)0);
361 18 : pTypes[nLen++] = ::getCppuType((Reference<XMultiPropertySet>*)0);
362 18 : pTypes[nLen++] = ::getCppuType((Reference<XRenderable>*)0);
363 :
364 18 : return aTypes;
365 : }
366 :
367 : namespace
368 : {
369 : class theSmModelUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSmModelUnoTunnelId> {};
370 : }
371 :
372 3021 : const uno::Sequence< sal_Int8 > & SmModel::getUnoTunnelId()
373 : {
374 3021 : return theSmModelUnoTunnelId::get().getSeq();
375 : }
376 :
377 1833 : sal_Int64 SAL_CALL SmModel::getSomething( const uno::Sequence< sal_Int8 >& rId )
378 : throw(uno::RuntimeException)
379 : {
380 3666 : if( rId.getLength() == 16
381 5499 : && 0 == memcmp( getUnoTunnelId().getConstArray(),
382 3666 : rId.getConstArray(), 16 ) )
383 : {
384 1188 : return sal::static_int_cast< sal_Int64 >(reinterpret_cast< sal_uIntPtr >(this));
385 : }
386 :
387 645 : return SfxBaseModel::getSomething( rId );
388 : }
389 :
390 1 : static sal_Int16 lcl_AnyToINT16(const uno::Any& rAny)
391 : {
392 1 : uno::TypeClass eType = rAny.getValueType().getTypeClass();
393 :
394 1 : sal_Int16 nRet = 0;
395 1 : if( eType == uno::TypeClass_DOUBLE )
396 0 : nRet = (sal_Int16)*(double*)rAny.getValue();
397 1 : else if( eType == uno::TypeClass_FLOAT )
398 0 : nRet = (sal_Int16)*(float*)rAny.getValue();
399 : else
400 1 : rAny >>= nRet;
401 1 : return nRet;
402 : }
403 :
404 1 : OUString SmModel::getImplementationName(void) throw( uno::RuntimeException )
405 : {
406 1 : return getImplementationName_Static();
407 : }
408 :
409 :
410 1 : OUString SmModel::getImplementationName_Static()
411 : {
412 1 : return OUString("com.sun.star.comp.math.FormulaDocument");
413 : }
414 :
415 314 : sal_Bool SmModel::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
416 : {
417 : return (
418 315 : rServiceName == "com.sun.star.document.OfficeDocument" ||
419 1 : rServiceName == "com.sun.star.formula.FormulaProperties"
420 314 : );
421 : }
422 :
423 624 : uno::Sequence< OUString > SmModel::getSupportedServiceNames(void) throw( uno::RuntimeException )
424 : {
425 624 : return getSupportedServiceNames_Static();
426 : }
427 :
428 624 : uno::Sequence< OUString > SmModel::getSupportedServiceNames_Static(void)
429 : {
430 624 : SolarMutexGuard aGuard;
431 :
432 624 : uno::Sequence< OUString > aRet(2);
433 624 : OUString* pArray = aRet.getArray();
434 624 : pArray[0] = "com.sun.star.document.OfficeDocument";
435 624 : pArray[1] = "com.sun.star.formula.FormulaProperties";
436 624 : return aRet;
437 : }
438 :
439 62 : void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any* pValues)
440 : throw( UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException)
441 : {
442 62 : SolarMutexGuard aGuard;
443 :
444 62 : SmDocShell *pDocSh = static_cast < SmDocShell * > (GetObjectShell());
445 :
446 62 : if ( NULL == pDocSh )
447 0 : throw UnknownPropertyException();
448 :
449 124 : SmFormat aFormat = pDocSh->GetFormat();
450 :
451 124 : for (; *ppEntries; ppEntries++, pValues++ )
452 : {
453 62 : if ((*ppEntries)->mnAttributes & PropertyAttribute::READONLY)
454 0 : throw PropertyVetoException();
455 :
456 62 : switch ( (*ppEntries)->mnHandle )
457 : {
458 : case HANDLE_FORMULA:
459 : {
460 6 : OUString aText;
461 6 : *pValues >>= aText;
462 6 : pDocSh->SetText(aText);
463 : }
464 6 : break;
465 : case HANDLE_FONT_NAME_VARIABLES :
466 : case HANDLE_FONT_NAME_FUNCTIONS :
467 : case HANDLE_FONT_NAME_NUMBERS :
468 : case HANDLE_FONT_NAME_TEXT :
469 : case HANDLE_CUSTOM_FONT_NAME_SERIF :
470 : case HANDLE_CUSTOM_FONT_NAME_SANS :
471 : case HANDLE_CUSTOM_FONT_NAME_FIXED :
472 : {
473 7 : OUString sFontName;
474 7 : *pValues >>= sFontName;
475 7 : if(sFontName.isEmpty())
476 0 : throw IllegalArgumentException();
477 :
478 7 : if(OUString(aFormat.GetFont((*ppEntries)->mnMemberId).GetName()) != sFontName)
479 : {
480 7 : const SmFace rOld = aFormat.GetFont((*ppEntries)->mnMemberId);
481 :
482 14 : SmFace aSet( sFontName, rOld.GetSize() );
483 7 : aSet.SetBorderWidth( rOld.GetBorderWidth() );
484 7 : aSet.SetAlign( ALIGN_BASELINE );
485 14 : aFormat.SetFont( (*ppEntries)->mnMemberId, aSet );
486 7 : }
487 : }
488 7 : break;
489 : case HANDLE_CUSTOM_FONT_FIXED_POSTURE:
490 : case HANDLE_CUSTOM_FONT_SANS_POSTURE :
491 : case HANDLE_CUSTOM_FONT_SERIF_POSTURE:
492 : case HANDLE_FONT_VARIABLES_POSTURE :
493 : case HANDLE_FONT_FUNCTIONS_POSTURE :
494 : case HANDLE_FONT_NUMBERS_POSTURE :
495 : case HANDLE_FONT_TEXT_POSTURE :
496 : {
497 7 : if((*pValues).getValueType() != ::getBooleanCppuType())
498 0 : throw IllegalArgumentException();
499 7 : bool bVal = *(sal_Bool*)(*pValues).getValue();
500 7 : Font aNewFont(aFormat.GetFont((*ppEntries)->mnMemberId));
501 7 : aNewFont.SetItalic((bVal) ? ITALIC_NORMAL : ITALIC_NONE);
502 7 : aFormat.SetFont((*ppEntries)->mnMemberId, aNewFont);
503 : }
504 7 : break;
505 : case HANDLE_CUSTOM_FONT_FIXED_WEIGHT :
506 : case HANDLE_CUSTOM_FONT_SANS_WEIGHT :
507 : case HANDLE_CUSTOM_FONT_SERIF_WEIGHT :
508 : case HANDLE_FONT_VARIABLES_WEIGHT :
509 : case HANDLE_FONT_FUNCTIONS_WEIGHT :
510 : case HANDLE_FONT_NUMBERS_WEIGHT :
511 : case HANDLE_FONT_TEXT_WEIGHT :
512 : {
513 7 : if((*pValues).getValueType() != ::getBooleanCppuType())
514 0 : throw IllegalArgumentException();
515 7 : bool bVal = *(sal_Bool*)(*pValues).getValue();
516 7 : Font aNewFont(aFormat.GetFont((*ppEntries)->mnMemberId));
517 7 : aNewFont.SetWeight((bVal) ? WEIGHT_BOLD : WEIGHT_NORMAL);
518 7 : aFormat.SetFont((*ppEntries)->mnMemberId, aNewFont);
519 : }
520 7 : break;
521 : case HANDLE_BASE_FONT_HEIGHT :
522 : {
523 : // Point!
524 1 : sal_Int16 nVal = lcl_AnyToINT16(*pValues);
525 1 : if(nVal < 1)
526 0 : throw IllegalArgumentException();
527 1 : Size aSize = aFormat.GetBaseSize();
528 1 : nVal *= 20;
529 1 : nVal = static_cast < sal_Int16 > ( TWIP_TO_MM100(nVal) );
530 1 : aSize.Height() = nVal;
531 1 : aFormat.SetBaseSize(aSize);
532 :
533 : // apply base size to fonts
534 1 : const Size aTmp( aFormat.GetBaseSize() );
535 9 : for (sal_uInt16 i = FNT_BEGIN; i <= FNT_END; i++)
536 8 : aFormat.SetFontSize(i, aTmp);
537 : }
538 1 : break;
539 : case HANDLE_RELATIVE_FONT_HEIGHT_TEXT :
540 : case HANDLE_RELATIVE_FONT_HEIGHT_INDICES :
541 : case HANDLE_RELATIVE_FONT_HEIGHT_FUNCTIONS :
542 : case HANDLE_RELATIVE_FONT_HEIGHT_OPERATORS :
543 : case HANDLE_RELATIVE_FONT_HEIGHT_LIMITS :
544 : {
545 5 : sal_Int16 nVal = 0;
546 5 : *pValues >>= nVal;
547 5 : if(nVal < 1)
548 0 : throw IllegalArgumentException();
549 5 : aFormat.SetRelSize((*ppEntries)->mnMemberId, nVal);
550 : }
551 5 : break;
552 :
553 : case HANDLE_IS_TEXT_MODE :
554 : {
555 1 : aFormat.SetTextmode(*(sal_Bool*)(*pValues).getValue());
556 : }
557 1 : break;
558 :
559 : case HANDLE_GREEK_CHAR_STYLE :
560 : {
561 0 : sal_Int16 nVal = 0;
562 0 : *pValues >>= nVal;
563 0 : if (nVal < 0 || nVal > 2)
564 0 : throw IllegalArgumentException();
565 0 : aFormat.SetGreekCharStyle( nVal );
566 : }
567 0 : break;
568 :
569 : case HANDLE_ALIGNMENT :
570 : {
571 : // SmHorAlign uses the same values as HorizontalAlignment
572 1 : sal_Int16 nVal = 0;
573 1 : *pValues >>= nVal;
574 1 : if(nVal < 0 || nVal > 2)
575 0 : throw IllegalArgumentException();
576 1 : aFormat.SetHorAlign((SmHorAlign)nVal);
577 : }
578 1 : break;
579 :
580 : case HANDLE_RELATIVE_SPACING :
581 : case HANDLE_RELATIVE_LINE_SPACING :
582 : case HANDLE_RELATIVE_ROOT_SPACING :
583 : case HANDLE_RELATIVE_INDEX_SUPERSCRIPT :
584 : case HANDLE_RELATIVE_INDEX_SUBSCRIPT :
585 : case HANDLE_RELATIVE_FRACTION_NUMERATOR_HEIGHT :
586 : case HANDLE_RELATIVE_FRACTION_DENOMINATOR_DEPTH:
587 : case HANDLE_RELATIVE_FRACTION_BAR_EXCESS_LENGTH:
588 : case HANDLE_RELATIVE_FRACTION_BAR_LINE_WEIGHT :
589 : case HANDLE_RELATIVE_UPPER_LIMIT_DISTANCE :
590 : case HANDLE_RELATIVE_LOWER_LIMIT_DISTANCE :
591 : case HANDLE_RELATIVE_BRACKET_EXCESS_SIZE :
592 : case HANDLE_RELATIVE_BRACKET_DISTANCE :
593 : case HANDLE_RELATIVE_SCALE_BRACKET_EXCESS_SIZE :
594 : case HANDLE_RELATIVE_MATRIX_LINE_SPACING :
595 : case HANDLE_RELATIVE_MATRIX_COLUMN_SPACING :
596 : case HANDLE_RELATIVE_SYMBOL_PRIMARY_HEIGHT :
597 : case HANDLE_RELATIVE_SYMBOL_MINIMUM_HEIGHT :
598 : case HANDLE_RELATIVE_OPERATOR_EXCESS_SIZE :
599 : case HANDLE_RELATIVE_OPERATOR_SPACING :
600 : case HANDLE_LEFT_MARGIN :
601 : case HANDLE_RIGHT_MARGIN :
602 : case HANDLE_TOP_MARGIN :
603 : case HANDLE_BOTTOM_MARGIN :
604 : {
605 26 : sal_Int16 nVal = 0;
606 26 : *pValues >>= nVal;
607 26 : if(nVal < 0)
608 0 : throw IllegalArgumentException();
609 26 : aFormat.SetDistance((*ppEntries)->mnMemberId, nVal);
610 : }
611 26 : break;
612 : case HANDLE_IS_SCALE_ALL_BRACKETS :
613 1 : aFormat.SetScaleNormalBrackets(*(sal_Bool*)(*pValues).getValue());
614 1 : break;
615 : case HANDLE_PRINTER_NAME:
616 : {
617 : // embedded documents just ignore this property for now
618 0 : if ( pDocSh->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED )
619 : {
620 0 : SfxPrinter *pPrinter = pDocSh->GetPrinter ( );
621 0 : if (pPrinter)
622 : {
623 0 : OUString sPrinterName;
624 0 : if (*pValues >>= sPrinterName )
625 : {
626 0 : if ( !sPrinterName.isEmpty() )
627 : {
628 0 : SfxPrinter *pNewPrinter = new SfxPrinter ( pPrinter->GetOptions().Clone(), sPrinterName );
629 0 : if (pNewPrinter->IsKnown())
630 0 : pDocSh->SetPrinter ( pNewPrinter );
631 : else
632 0 : delete pNewPrinter;
633 : }
634 : }
635 : else
636 0 : throw IllegalArgumentException();
637 : }
638 : }
639 : }
640 0 : break;
641 : case HANDLE_PRINTER_SETUP:
642 : {
643 0 : Sequence < sal_Int8 > aSequence;
644 0 : if ( *pValues >>= aSequence )
645 : {
646 0 : sal_uInt32 nSize = aSequence.getLength();
647 0 : SvMemoryStream aStream ( aSequence.getArray(), nSize, STREAM_READ );
648 0 : aStream.Seek ( STREAM_SEEK_TO_BEGIN );
649 : static sal_uInt16 const nRange[] =
650 : {
651 : SID_PRINTSIZE, SID_PRINTSIZE,
652 : SID_PRINTZOOM, SID_PRINTZOOM,
653 : SID_PRINTTITLE, SID_PRINTTITLE,
654 : SID_PRINTTEXT, SID_PRINTTEXT,
655 : SID_PRINTFRAME, SID_PRINTFRAME,
656 : SID_NO_RIGHT_SPACES, SID_NO_RIGHT_SPACES,
657 : 0
658 : };
659 0 : SfxItemSet *pItemSet = new SfxItemSet( pDocSh->GetPool(), nRange );
660 0 : SmModule *pp = SM_MOD();
661 0 : pp->GetConfig()->ConfigToItemSet(*pItemSet);
662 0 : SfxPrinter *pPrinter = SfxPrinter::Create ( aStream, pItemSet );
663 :
664 0 : pDocSh->SetPrinter( pPrinter );
665 : }
666 : else
667 0 : throw IllegalArgumentException();
668 : }
669 0 : break;
670 : case HANDLE_SYMBOLS:
671 : {
672 : // this is set
673 0 : Sequence < SymbolDescriptor > aSequence;
674 0 : if ( *pValues >>= aSequence )
675 : {
676 0 : sal_uInt32 nSize = aSequence.getLength();
677 0 : SmModule *pp = SM_MOD();
678 0 : SmSymbolManager &rManager = pp->GetSymbolManager();
679 0 : SymbolDescriptor *pDescriptor = aSequence.getArray();
680 0 : for (sal_uInt32 i = 0; i < nSize ; i++, pDescriptor++)
681 : {
682 0 : Font aFont;
683 0 : aFont.SetName ( pDescriptor->sFontName );
684 0 : aFont.SetCharSet ( static_cast < rtl_TextEncoding > (pDescriptor->nCharSet) );
685 0 : aFont.SetFamily ( static_cast < FontFamily > (pDescriptor->nFamily ) );
686 0 : aFont.SetPitch ( static_cast < FontPitch > (pDescriptor->nPitch ) );
687 0 : aFont.SetWeight ( static_cast < FontWeight > (pDescriptor->nWeight ) );
688 0 : aFont.SetItalic ( static_cast < FontItalic > (pDescriptor->nItalic ) );
689 : SmSym aSymbol ( pDescriptor->sName, aFont, static_cast < sal_Unicode > (pDescriptor->nCharacter),
690 0 : pDescriptor->sSymbolSet );
691 0 : aSymbol.SetExportName ( pDescriptor->sExportName );
692 0 : aSymbol.SetDocSymbol( sal_True );
693 0 : rManager.AddOrReplaceSymbol ( aSymbol );
694 0 : }
695 : }
696 : else
697 0 : throw IllegalArgumentException();
698 : }
699 0 : break;
700 : // #i33095# Security Options
701 : case HANDLE_LOAD_READONLY :
702 : {
703 0 : if ( (*pValues).getValueType() != ::getBooleanCppuType() )
704 0 : throw IllegalArgumentException();
705 0 : sal_Bool bReadonly = sal_False;
706 0 : if ( *pValues >>= bReadonly )
707 0 : pDocSh->SetLoadReadonly( bReadonly );
708 0 : break;
709 : }
710 : }
711 : }
712 :
713 62 : pDocSh->SetFormat( aFormat );
714 :
715 : // #i67283# since about all of the above changes are likely to change
716 : // the formula size we have to recalculate the vis-area now
717 124 : pDocSh->SetVisArea( Rectangle( Point(0, 0), pDocSh->GetSize() ) );
718 62 : }
719 :
720 18343 : void SmModel::_getPropertyValues( const PropertyMapEntry **ppEntries, Any *pValue )
721 : throw( UnknownPropertyException, WrappedTargetException )
722 : {
723 18343 : SmDocShell *pDocSh = static_cast < SmDocShell * > (GetObjectShell());
724 :
725 18343 : if ( NULL == pDocSh )
726 0 : throw UnknownPropertyException();
727 :
728 18343 : const SmFormat & aFormat = pDocSh->GetFormat();
729 :
730 36686 : for (; *ppEntries; ppEntries++, pValue++ )
731 : {
732 18343 : switch ( (*ppEntries)->mnHandle )
733 : {
734 : case HANDLE_FORMULA:
735 116 : *pValue <<= OUString(pDocSh->GetText());
736 116 : break;
737 : case HANDLE_FONT_NAME_VARIABLES :
738 : case HANDLE_FONT_NAME_FUNCTIONS :
739 : case HANDLE_FONT_NAME_NUMBERS :
740 : case HANDLE_FONT_NAME_TEXT :
741 : case HANDLE_CUSTOM_FONT_NAME_SERIF :
742 : case HANDLE_CUSTOM_FONT_NAME_SANS :
743 : case HANDLE_CUSTOM_FONT_NAME_FIXED :
744 : {
745 2093 : const SmFace & rFace = aFormat.GetFont((*ppEntries)->mnMemberId);
746 2093 : *pValue <<= OUString(rFace.GetName());
747 : }
748 2093 : break;
749 : case HANDLE_CUSTOM_FONT_FIXED_POSTURE:
750 : case HANDLE_CUSTOM_FONT_SANS_POSTURE :
751 : case HANDLE_CUSTOM_FONT_SERIF_POSTURE:
752 : case HANDLE_FONT_VARIABLES_POSTURE :
753 : case HANDLE_FONT_FUNCTIONS_POSTURE :
754 : case HANDLE_FONT_NUMBERS_POSTURE :
755 : case HANDLE_FONT_TEXT_POSTURE :
756 : {
757 2093 : const SmFace & rFace = aFormat.GetFont((*ppEntries)->mnMemberId);
758 2093 : bool bVal = IsItalic( rFace );
759 2093 : (*pValue).setValue(&bVal, *(*ppEntries)->mpType);
760 : }
761 2093 : break;
762 : case HANDLE_CUSTOM_FONT_FIXED_WEIGHT :
763 : case HANDLE_CUSTOM_FONT_SANS_WEIGHT :
764 : case HANDLE_CUSTOM_FONT_SERIF_WEIGHT :
765 : case HANDLE_FONT_VARIABLES_WEIGHT :
766 : case HANDLE_FONT_FUNCTIONS_WEIGHT :
767 : case HANDLE_FONT_NUMBERS_WEIGHT :
768 : case HANDLE_FONT_TEXT_WEIGHT :
769 : {
770 2093 : const SmFace & rFace = aFormat.GetFont((*ppEntries)->mnMemberId);
771 2093 : bool bVal = IsBold( rFace ); // bold?
772 2093 : (*pValue).setValue(&bVal, *(*ppEntries)->mpType);
773 : }
774 2093 : break;
775 : case HANDLE_BASE_FONT_HEIGHT :
776 : {
777 : // Point!
778 299 : sal_Int16 nVal = static_cast < sal_Int16 > (aFormat.GetBaseSize().Height());
779 299 : nVal = static_cast < sal_Int16 > (MM100_TO_TWIP(nVal));
780 299 : nVal = (nVal + 10) / 20;
781 299 : *pValue <<= nVal;
782 : }
783 299 : break;
784 : case HANDLE_RELATIVE_FONT_HEIGHT_TEXT :
785 : case HANDLE_RELATIVE_FONT_HEIGHT_INDICES :
786 : case HANDLE_RELATIVE_FONT_HEIGHT_FUNCTIONS :
787 : case HANDLE_RELATIVE_FONT_HEIGHT_OPERATORS :
788 : case HANDLE_RELATIVE_FONT_HEIGHT_LIMITS :
789 1495 : *pValue <<= (sal_Int16) aFormat.GetRelSize((*ppEntries)->mnMemberId);
790 1495 : break;
791 :
792 : case HANDLE_IS_TEXT_MODE :
793 : {
794 299 : sal_Bool bVal = aFormat.IsTextmode();
795 299 : (*pValue).setValue(&bVal, ::getBooleanCppuType());
796 : }
797 299 : break;
798 :
799 : case HANDLE_GREEK_CHAR_STYLE :
800 297 : *pValue <<= (sal_Int16)aFormat.GetGreekCharStyle();
801 297 : break;
802 :
803 : case HANDLE_ALIGNMENT :
804 : // SmHorAlign uses the same values as HorizontalAlignment
805 299 : *pValue <<= (sal_Int16)aFormat.GetHorAlign();
806 299 : break;
807 :
808 : case HANDLE_RELATIVE_SPACING :
809 : case HANDLE_RELATIVE_LINE_SPACING :
810 : case HANDLE_RELATIVE_ROOT_SPACING :
811 : case HANDLE_RELATIVE_INDEX_SUPERSCRIPT :
812 : case HANDLE_RELATIVE_INDEX_SUBSCRIPT :
813 : case HANDLE_RELATIVE_FRACTION_NUMERATOR_HEIGHT :
814 : case HANDLE_RELATIVE_FRACTION_DENOMINATOR_DEPTH:
815 : case HANDLE_RELATIVE_FRACTION_BAR_EXCESS_LENGTH:
816 : case HANDLE_RELATIVE_FRACTION_BAR_LINE_WEIGHT :
817 : case HANDLE_RELATIVE_UPPER_LIMIT_DISTANCE :
818 : case HANDLE_RELATIVE_LOWER_LIMIT_DISTANCE :
819 : case HANDLE_RELATIVE_BRACKET_EXCESS_SIZE :
820 : case HANDLE_RELATIVE_BRACKET_DISTANCE :
821 : case HANDLE_RELATIVE_SCALE_BRACKET_EXCESS_SIZE :
822 : case HANDLE_RELATIVE_MATRIX_LINE_SPACING :
823 : case HANDLE_RELATIVE_MATRIX_COLUMN_SPACING :
824 : case HANDLE_RELATIVE_SYMBOL_PRIMARY_HEIGHT :
825 : case HANDLE_RELATIVE_SYMBOL_MINIMUM_HEIGHT :
826 : case HANDLE_RELATIVE_OPERATOR_EXCESS_SIZE :
827 : case HANDLE_RELATIVE_OPERATOR_SPACING :
828 : case HANDLE_LEFT_MARGIN :
829 : case HANDLE_RIGHT_MARGIN :
830 : case HANDLE_TOP_MARGIN :
831 : case HANDLE_BOTTOM_MARGIN :
832 7176 : *pValue <<= (sal_Int16)aFormat.GetDistance((*ppEntries)->mnMemberId);
833 7176 : break;
834 : case HANDLE_IS_SCALE_ALL_BRACKETS :
835 : {
836 299 : sal_Bool bVal = aFormat.IsScaleNormalBrackets();
837 299 : (*pValue).setValue(&bVal, ::getBooleanCppuType());
838 : }
839 299 : break;
840 : case HANDLE_PRINTER_NAME:
841 : {
842 297 : SfxPrinter *pPrinter = pDocSh->GetPrinter ( );
843 297 : *pValue <<= pPrinter ? OUString ( pPrinter->GetName()) : OUString();
844 : }
845 297 : break;
846 : case HANDLE_PRINTER_SETUP:
847 : {
848 297 : SfxPrinter *pPrinter = pDocSh->GetPrinter ();
849 297 : if (pPrinter)
850 : {
851 0 : SvMemoryStream aStream;
852 0 : pPrinter->Store( aStream );
853 0 : aStream.Seek ( STREAM_SEEK_TO_END );
854 0 : sal_uInt32 nSize = aStream.Tell();
855 0 : aStream.Seek ( STREAM_SEEK_TO_BEGIN );
856 0 : Sequence < sal_Int8 > aSequence ( nSize );
857 0 : aStream.Read ( aSequence.getArray(), nSize );
858 0 : *pValue <<= aSequence;
859 : }
860 : }
861 297 : break;
862 : case HANDLE_SYMBOLS:
863 : case HANDLE_USED_SYMBOLS:
864 : {
865 594 : const bool bUsedSymbolsOnly = (*ppEntries)->mnHandle == HANDLE_USED_SYMBOLS;
866 594 : const std::set< OUString > &rUsedSymbols = pDocSh->GetUsedSymbols();
867 :
868 : // this is get
869 594 : SmModule *pp = SM_MOD();
870 594 : const SmSymbolManager &rManager = pp->GetSymbolManager();
871 594 : vector < const SmSym * > aVector;
872 :
873 1188 : const SymbolPtrVec_t aSymbols( rManager.GetSymbols() );
874 594 : size_t nCount = 0;
875 71874 : for (size_t i = 0; i < aSymbols.size(); ++i)
876 : {
877 71280 : const SmSym * pSymbol = aSymbols[ i ];
878 213840 : if (pSymbol && !pSymbol->IsPredefined() &&
879 0 : (!bUsedSymbolsOnly ||
880 71280 : rUsedSymbols.find( pSymbol->GetName() ) != rUsedSymbols.end()))
881 : {
882 0 : aVector.push_back ( pSymbol );
883 0 : nCount++;
884 : }
885 : }
886 1188 : Sequence < SymbolDescriptor > aSequence ( nCount );
887 594 : SymbolDescriptor * pDescriptor = aSequence.getArray();
888 :
889 594 : vector < const SmSym * >::const_iterator aIter = aVector.begin(), aEnd = aVector.end();
890 594 : for(; aIter != aEnd; pDescriptor++, ++aIter)
891 : {
892 0 : pDescriptor->sName = (*aIter)->GetName();
893 0 : pDescriptor->sExportName = (*aIter)->GetExportName();
894 0 : pDescriptor->sSymbolSet = (*aIter)->GetSymbolSetName();
895 0 : pDescriptor->nCharacter = static_cast < sal_Int32 > ((*aIter)->GetCharacter());
896 :
897 0 : Font rFont = (*aIter)->GetFace();
898 0 : pDescriptor->sFontName = rFont.GetName();
899 0 : pDescriptor->nCharSet = sal::static_int_cast< sal_Int16 >(rFont.GetCharSet());
900 0 : pDescriptor->nFamily = sal::static_int_cast< sal_Int16 >(rFont.GetFamily());
901 0 : pDescriptor->nPitch = sal::static_int_cast< sal_Int16 >(rFont.GetPitch());
902 0 : pDescriptor->nWeight = sal::static_int_cast< sal_Int16 >(rFont.GetWeight());
903 0 : pDescriptor->nItalic = sal::static_int_cast< sal_Int16 >(rFont.GetItalic());
904 0 : }
905 1188 : *pValue <<= aSequence;
906 : }
907 594 : break;
908 : case HANDLE_BASIC_LIBRARIES:
909 0 : *pValue <<= pDocSh->GetBasicContainer();
910 0 : break;
911 : case HANDLE_DIALOG_LIBRARIES:
912 0 : *pValue <<= pDocSh->GetDialogContainer();
913 0 : break;
914 : case HANDLE_RUNTIME_UID:
915 2 : *pValue <<= getRuntimeUID();
916 2 : break;
917 : // #i33095# Security Options
918 : case HANDLE_LOAD_READONLY :
919 : {
920 297 : *pValue <<= pDocSh->IsLoadReadonly();
921 297 : break;
922 : }
923 : // #i972#
924 : case HANDLE_BASELINE:
925 : {
926 297 : if ( !pDocSh->pTree )
927 0 : pDocSh->Parse();
928 297 : if ( pDocSh->pTree )
929 : {
930 297 : if ( !pDocSh->IsFormulaArranged() )
931 0 : pDocSh->ArrangeFormula();
932 :
933 297 : *pValue <<= static_cast<sal_Int32>( pDocSh->pTree->GetFormulaBaseline() );
934 : }
935 : }
936 297 : break;
937 : }
938 : }
939 18343 : }
940 :
941 : //////////////////////////////////////////////////////////////////////
942 :
943 0 : sal_Int32 SAL_CALL SmModel::getRendererCount(
944 : const uno::Any& /*rSelection*/,
945 : const uno::Sequence< beans::PropertyValue >& /*xOptions*/ )
946 : throw (IllegalArgumentException, RuntimeException)
947 : {
948 0 : SolarMutexGuard aGuard;
949 0 : return 1;
950 : }
951 :
952 :
953 0 : static Size lcl_GuessPaperSize()
954 : {
955 0 : Size aRes;
956 0 : const LocaleDataWrapper& rLocWrp( AllSettings().GetLocaleDataWrapper() );
957 0 : if( MEASURE_METRIC == rLocWrp.getMeasurementSystemEnum() )
958 : {
959 : // in 100th mm
960 0 : PaperInfo aInfo( PAPER_A4 );
961 0 : aRes.Width() = aInfo.getWidth();
962 0 : aRes.Height() = aInfo.getHeight();
963 : }
964 : else
965 : {
966 : // in 100th mm
967 0 : PaperInfo aInfo( PAPER_LETTER );
968 0 : aRes.Width() = aInfo.getWidth();
969 0 : aRes.Height() = aInfo.getHeight();
970 : }
971 0 : return aRes;
972 : }
973 :
974 0 : uno::Sequence< beans::PropertyValue > SAL_CALL SmModel::getRenderer(
975 : sal_Int32 nRenderer,
976 : const uno::Any& /*rSelection*/,
977 : const uno::Sequence< beans::PropertyValue >& /*rxOptions*/ )
978 : throw (IllegalArgumentException, RuntimeException)
979 : {
980 0 : SolarMutexGuard aGuard;
981 :
982 0 : if (0 != nRenderer)
983 0 : throw IllegalArgumentException();
984 :
985 0 : SmDocShell *pDocSh = static_cast < SmDocShell * >( GetObjectShell() );
986 0 : if (!pDocSh)
987 0 : throw RuntimeException();
988 :
989 0 : SmPrinterAccess aPrinterAccess( *pDocSh );
990 0 : Printer *pPrinter = aPrinterAccess.GetPrinter();
991 0 : Size aPrtPaperSize ( pPrinter->GetPaperSize() );
992 :
993 : // if paper size is 0 (usually if no 'real' printer is found),
994 : // guess the paper size
995 0 : if (aPrtPaperSize.Height() == 0 || aPrtPaperSize.Width() == 0)
996 0 : aPrtPaperSize = lcl_GuessPaperSize();
997 0 : awt::Size aPageSize( aPrtPaperSize.Width(), aPrtPaperSize.Height() );
998 :
999 0 : uno::Sequence< beans::PropertyValue > aRenderer(1);
1000 0 : PropertyValue &rValue = aRenderer.getArray()[0];
1001 0 : rValue.Name = "PageSize";
1002 0 : rValue.Value <<= aPageSize;
1003 :
1004 0 : if (!m_pPrintUIOptions)
1005 0 : m_pPrintUIOptions = new SmPrintUIOptions();
1006 0 : m_pPrintUIOptions->appendPrintUIOptions( aRenderer );
1007 :
1008 0 : return aRenderer;
1009 : }
1010 :
1011 0 : void SAL_CALL SmModel::render(
1012 : sal_Int32 nRenderer,
1013 : const uno::Any& rSelection,
1014 : const uno::Sequence< beans::PropertyValue >& rxOptions )
1015 : throw (IllegalArgumentException, RuntimeException)
1016 : {
1017 0 : SolarMutexGuard aGuard;
1018 :
1019 0 : if (0 != nRenderer)
1020 0 : throw IllegalArgumentException();
1021 :
1022 0 : SmDocShell *pDocSh = static_cast < SmDocShell * >( GetObjectShell() );
1023 0 : if (!pDocSh)
1024 0 : throw RuntimeException();
1025 :
1026 : // get device to be rendered in
1027 0 : uno::Reference< awt::XDevice > xRenderDevice;
1028 0 : for (sal_Int32 i = 0, nCount = rxOptions.getLength(); i < nCount; ++i)
1029 : {
1030 0 : if( rxOptions[i].Name == "RenderDevice" )
1031 0 : rxOptions[i].Value >>= xRenderDevice;
1032 : }
1033 :
1034 0 : if (xRenderDevice.is())
1035 : {
1036 0 : VCLXDevice* pDevice = VCLXDevice::GetImplementation( xRenderDevice );
1037 0 : OutputDevice* pOut = pDevice ? pDevice->GetOutputDevice() : NULL;
1038 :
1039 0 : if (!pOut)
1040 0 : throw RuntimeException();
1041 :
1042 0 : pOut->SetMapMode( MAP_100TH_MM );
1043 :
1044 0 : uno::Reference< frame::XModel > xModel;
1045 0 : rSelection >>= xModel;
1046 0 : if (xModel == pDocSh->GetModel())
1047 : {
1048 : //!! when called via API we may not have an active view
1049 : //!! thus we go and look for a view that can be used.
1050 0 : const TypeId aTypeId = TYPE( SmViewShell );
1051 0 : SfxViewShell* pViewSh = SfxViewShell::GetFirst( &aTypeId, sal_False /* search non-visible views as well*/ );
1052 0 : while (pViewSh && pViewSh->GetObjectShell() != pDocSh)
1053 0 : pViewSh = SfxViewShell::GetNext( *pViewSh, &aTypeId, sal_False /* search non-visible views as well*/ );
1054 0 : SmViewShell *pView = PTR_CAST( SmViewShell, pViewSh );
1055 : OSL_ENSURE( pView, "SmModel::render : no SmViewShell found" );
1056 :
1057 0 : if (pView)
1058 : {
1059 0 : SmPrinterAccess aPrinterAccess( *pDocSh );
1060 0 : Printer *pPrinter = aPrinterAccess.GetPrinter();
1061 :
1062 0 : Size aPrtPaperSize ( pPrinter->GetPaperSize() );
1063 0 : Size aOutputSize ( pPrinter->GetOutputSize() );
1064 0 : Point aPrtPageOffset( pPrinter->GetPageOffset() );
1065 :
1066 : // no real printer ??
1067 0 : if (aPrtPaperSize.Height() == 0 || aPrtPaperSize.Width() == 0)
1068 : {
1069 0 : aPrtPaperSize = lcl_GuessPaperSize();
1070 : // factors from Windows DIN A4
1071 0 : aOutputSize = Size( (long)(aPrtPaperSize.Width() * 0.941),
1072 0 : (long)(aPrtPaperSize.Height() * 0.961));
1073 0 : aPrtPageOffset = Point( (long)(aPrtPaperSize.Width() * 0.0250),
1074 0 : (long)(aPrtPaperSize.Height() * 0.0214));
1075 : }
1076 0 : Point aZeroPoint;
1077 0 : Rectangle OutputRect( aZeroPoint, aOutputSize );
1078 :
1079 :
1080 : // set minimum top and bottom border
1081 0 : if (aPrtPageOffset.Y() < 2000)
1082 0 : OutputRect.Top() += 2000 - aPrtPageOffset.Y();
1083 0 : if ((aPrtPaperSize.Height() - (aPrtPageOffset.Y() + OutputRect.Bottom())) < 2000)
1084 0 : OutputRect.Bottom() -= 2000 - (aPrtPaperSize.Height() -
1085 0 : (aPrtPageOffset.Y() + OutputRect.Bottom()));
1086 :
1087 : // set minimum left and right border
1088 0 : if (aPrtPageOffset.X() < 2500)
1089 0 : OutputRect.Left() += 2500 - aPrtPageOffset.X();
1090 0 : if ((aPrtPaperSize.Width() - (aPrtPageOffset.X() + OutputRect.Right())) < 1500)
1091 0 : OutputRect.Right() -= 1500 - (aPrtPaperSize.Width() -
1092 0 : (aPrtPageOffset.X() + OutputRect.Right()));
1093 :
1094 0 : if (!m_pPrintUIOptions)
1095 0 : m_pPrintUIOptions = new SmPrintUIOptions();
1096 0 : m_pPrintUIOptions->processProperties( rxOptions );
1097 :
1098 0 : pView->Impl_Print( *pOut, *m_pPrintUIOptions, Rectangle( OutputRect ), Point() );
1099 :
1100 : // release SmPrintUIOptions when everything is done.
1101 : // That way, when SmPrintUIOptions is needed again it will read the latest configuration settings in its c-tor.
1102 0 : if (m_pPrintUIOptions->getBoolValue( "IsLastPage", sal_False ))
1103 : {
1104 0 : delete m_pPrintUIOptions; m_pPrintUIOptions = 0;
1105 0 : }
1106 : }
1107 0 : }
1108 0 : }
1109 0 : }
1110 :
1111 444 : void SAL_CALL SmModel::setParent( const uno::Reference< uno::XInterface >& xParent)
1112 : throw( lang::NoSupportException, uno::RuntimeException )
1113 : {
1114 444 : SolarMutexGuard aGuard;
1115 444 : SfxBaseModel::setParent( xParent );
1116 888 : uno::Reference< lang::XUnoTunnel > xParentTunnel( xParent, uno::UNO_QUERY );
1117 444 : if ( xParentTunnel.is() )
1118 : {
1119 296 : SvGlobalName aSfxIdent( SFX_GLOBAL_CLASSID );
1120 296 : SfxObjectShell* pDoc = reinterpret_cast<SfxObjectShell *>(xParentTunnel->getSomething(
1121 296 : uno::Sequence< sal_Int8 >( aSfxIdent.GetByteSequence() ) ) );
1122 296 : if ( pDoc )
1123 296 : GetObjectShell()->OnDocumentPrinterChanged( pDoc->GetDocumentPrinter() );
1124 444 : }
1125 444 : }
1126 :
1127 43 : void SmModel::writeFormulaOoxml( ::sax_fastparser::FSHelperPtr m_pSerializer, oox::core::OoxmlVersion version )
1128 : {
1129 43 : static_cast< SmDocShell* >( GetObjectShell())->writeFormulaOoxml( m_pSerializer, version );
1130 43 : }
1131 :
1132 30 : void SmModel::writeFormulaRtf(OStringBuffer& rBuffer, rtl_TextEncoding nEncoding)
1133 : {
1134 30 : static_cast<SmDocShell*>(GetObjectShell())->writeFormulaRtf(rBuffer, nEncoding);
1135 30 : }
1136 :
1137 148 : void SmModel::readFormulaOoxml( oox::formulaimport::XmlStream& stream )
1138 : {
1139 148 : static_cast< SmDocShell* >( GetObjectShell())->readFormulaOoxml( stream );
1140 148 : }
1141 :
1142 148 : Size SmModel::getFormulaSize() const
1143 : {
1144 148 : return static_cast< SmDocShell* >( GetObjectShell())->GetSize();
1145 21 : }
1146 :
1147 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|