ooo-build r12777 - trunk/patches/dev300
- From: jiaojh svn gnome org
- To: svn-commits-list gnome org
- Subject: ooo-build r12777 - trunk/patches/dev300
- Date: Wed, 4 Jun 2008 04:19:32 +0000 (UTC)
Author: jiaojh
Date: Wed Jun 4 04:19:32 2008
New Revision: 12777
URL: http://svn.gnome.org/viewvc/ooo-build?rev=12777&view=rev
Log:
include something that should not be included in this patch,
removed it.
Modified:
trunk/patches/dev300/form-control-visibility.diff
Modified: trunk/patches/dev300/form-control-visibility.diff
==============================================================================
--- trunk/patches/dev300/form-control-visibility.diff (original)
+++ trunk/patches/dev300/form-control-visibility.diff Wed Jun 4 04:19:32 2008
@@ -1,67 +1,3440 @@
---- xmloff/source/forms/strings.hxx.orig 2008-06-04 11:59:12.000000000 +0800
-+++ xmloff/source/forms/strings.hxx 2008-06-04 11:59:18.000000000 +0800
-@@ -114,6 +114,7 @@ namespace xmloff
- XMLFORM_CONSTASCII_STRING( PROPERTY_TABSTOP, "Tabstop" );
- XMLFORM_CONSTASCII_STRING( PROPERTY_STATE, "State" );
- XMLFORM_CONSTASCII_STRING( PROPERTY_ENABLED, "Enabled" );
+--- xmloff/source/forms/strings.hxx.orig 1970-01-01 08:00:00.000000000 +0800
++++ xmloff/source/forms/strings.hxx 2008-06-04 12:38:12.000000000 +0800
+@@ -0,0 +1,283 @@
++/*************************************************************************
++ *
++ * 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: strings.hxx,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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _XMLOFF_FORMS_STRINGS_HXX_
++#define _XMLOFF_FORMS_STRINGS_HXX_
++
++#include <sal/types.h>
++#include <rtl/ustring.hxx>
++
++//.........................................................................
++namespace xmloff
++{
++//.........................................................................
++
++ //============================================================
++ //= a helper for static ascii pseudo-unicode strings
++ //============================================================
++ struct ConstAsciiString
++ {
++ const sal_Char* ascii;
++ sal_Int32 length;
++
++ inline const ::rtl::OUString* operator& () const;
++ inline operator const ::rtl::OUString& () const { return *(&(*this)); }
++ inline operator const sal_Char* () const { return ascii; }
++
++ inline ConstAsciiString(const sal_Char* _pAsciiZeroTerminated, const sal_Int32 _nLength);
++ inline ~ConstAsciiString();
++
++ private:
++ mutable ::rtl::OUString* m_pString;
++
++ private:
++ ConstAsciiString(); // never implemented
++ };
++
++ //------------------------------------------------------------
++ inline ConstAsciiString::ConstAsciiString(const sal_Char* _pAsciiZeroTerminated, const sal_Int32 _nLength)
++ :ascii( _pAsciiZeroTerminated )
++ ,length( _nLength )
++ ,m_pString( NULL )
++ {
++ }
++
++ //------------------------------------------------------------
++ inline ConstAsciiString::~ConstAsciiString()
++ {
++ if ( m_pString )
++ {
++ delete m_pString;
++ m_pString = NULL;
++ }
++ }
++
++ //------------------------------------------------------------
++ inline const ::rtl::OUString* ConstAsciiString::operator& () const
++ {
++ if ( !m_pString )
++ m_pString = new ::rtl::OUString( ascii, length, RTL_TEXTENCODING_ASCII_US );
++ return m_pString;
++ }
++
++#ifndef XMLFORM_IMPLEMENT_STRINGS
++ #define XMLFORM_CONSTASCII_STRING(ident, string) extern const ConstAsciiString ident
++#else
++ #define XMLFORM_CONSTASCII_STRING(ident, string) extern const ConstAsciiString ident(string, sizeof(string)-1)
++#endif
++
++ //============================================================
++ //= string constants
++ //============================================================
++
++ // properties
++ XMLFORM_CONSTASCII_STRING( PROPERTY_CLASSID, "ClassId" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ECHOCHAR, "EchoChar" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_MULTILINE, "MultiLine" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_NAME, "Name" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_IMAGEURL, "ImageURL" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_LABEL, "Label" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TARGETFRAME, "TargetFrame" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TARGETURL, "TargetURL" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TITLE, "Tag" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DROPDOWN, "Dropdown" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_PRINTABLE, "Printable" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_READONLY, "ReadOnly" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DEFAULT_STATE, "DefaultState" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TABSTOP, "Tabstop" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_STATE, "State" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ENABLED, "Enabled" );
+ XMLFORM_CONSTASCII_STRING( PROPERTY_ENABLEVISIBLE, "EnableVisible" );
- XMLFORM_CONSTASCII_STRING( PROPERTY_MAXTEXTLENGTH, "MaxTextLen" );
- XMLFORM_CONSTASCII_STRING( PROPERTY_LINECOUNT, "LineCount" );
- XMLFORM_CONSTASCII_STRING( PROPERTY_TABINDEX, "TabIndex" );
---- xmloff/source/forms/formattributes.hxx.orig 2008-06-04 11:59:12.000000000 +0800
-+++ xmloff/source/forms/formattributes.hxx 2008-06-04 11:59:19.000000000 +0800
-@@ -69,6 +69,7 @@ namespace xmloff
- #define CCA_VALUE 0x00200000
- #define CCA_ORIENTATION 0x00400000
- #define CCA_VISUAL_EFFECT 0x00800000
++ XMLFORM_CONSTASCII_STRING( PROPERTY_MAXTEXTLENGTH, "MaxTextLen" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_LINECOUNT, "LineCount" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TABINDEX, "TabIndex" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_COMMAND, "Command" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DATASOURCENAME, "DataSourceName" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_FILTER, "Filter" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ORDER, "Order" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ALLOWDELETES, "AllowDeletes" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ALLOWINSERTS, "AllowInserts" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ALLOWUPDATES, "AllowUpdates" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_APPLYFILTER, "ApplyFilter" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ESCAPEPROCESSING, "EscapeProcessing" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_IGNORERESULT, "IgnoreResult" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SUBMIT_ENCODING, "SubmitEncoding" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SUBMIT_METHOD, "SubmitMethod" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_COMMAND_TYPE, "CommandType" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_NAVIGATION, "NavigationBarMode" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_CYCLE, "Cycle" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_BUTTONTYPE, "ButtonType" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DATAFIELD, "DataField" );
++ XMLFORM_CONSTASCII_STRING( PROPERTY_BOUNDCOLUMN, "BoundColumn");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_EMPTY_IS_NULL, "ConvertEmptyToNull");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_LISTSOURCE, "ListSource");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_LISTSOURCETYPE, "ListSourceType");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ECHO_CHAR, "EchoChar");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_STRICTFORMAT, "StrictFormat");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_AUTOCOMPLETE, "Autocomplete");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_MULTISELECTION, "MultiSelection");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DEFAULTBUTTON, "DefaultButton");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TRISTATE, "TriState");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_CONTROLLABEL, "LabelControl");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_STRING_ITEM_LIST, "StringItemList");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_VALUE_SEQ, "ValueItemList");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DEFAULT_SELECT_SEQ, "DefaultSelection");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SELECT_SEQ, "SelectedItems");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DATE_MIN, "DateMin");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DATE_MAX, "DateMax");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TIME_MIN, "TimeMin");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TIME_MAX, "TimeMax");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_VALUE_MIN, "ValueMin");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_VALUE_MAX, "ValueMax");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_EFFECTIVE_MIN, "EffectiveMin");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_EFFECTIVE_MAX, "EffectiveMax");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DEFAULT_DATE, "DefaultDate");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DATE, "Date");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DEFAULT_TIME, "DefaultTime");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TIME, "Time");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DEFAULT_VALUE, "DefaultValue");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_VALUE, "Value");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_HIDDEN_VALUE, "HiddenValue");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DEFAULT_TEXT, "DefaultText");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TEXT, "Text");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_EFFECTIVE_VALUE, "EffectiveValue");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_EFFECTIVE_DEFAULT, "EffectiveDefault");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_REFVALUE, "RefValue");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_URL, "URL");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_FONT, "FontDescriptor");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_BACKGROUNDCOLOR, "BackgroundColor");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_MASTERFIELDS, "MasterFields");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DETAILFIELDS, "DetailFields");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_COLUMNSERVICENAME, "ColumnServiceName");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_FORMATKEY, "FormatKey");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ALIGN, "Align");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_BORDER, "Border");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_AUTOCONTROLFOCUS, "AutomaticControlFocus");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_APPLYDESIGNMODE, "ApplyFormDesignMode");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_FORMATSSUPPLIER, "FormatsSupplier");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_LOCALE, "Locale");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_FORMATSTRING, "FormatString");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DATEFORMAT, "DateFormat");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TIMEFORMAT, "TimeFormat");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_PERSISTENCE_MAXTEXTLENGTH, "PersistenceMaxTextLength");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SCROLLVALUE_MIN, "ScrollValueMin");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SCROLLVALUE_MAX, "ScrollValueMax");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SCROLLVALUE, "ScrollValue");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SCROLLVALUE_DEFAULT,"DefaultScrollValue");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_LINE_INCREMENT, "LineIncrement");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_BLOCK_INCREMENT, "BlockIncrement");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_REPEAT_DELAY, "RepeatDelay");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SPINVALUE, "SpinValue");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SPINVALUE_MIN, "SpinValueMin");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SPINVALUE_MAX, "SpinValueMax");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_DEFAULT_SPINVALUE, "DefaultSpinValue");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_SPIN_INCREMENT, "SpinIncrement");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ORIENTATION, "Orientation");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_TOGGLE, "Toggle");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_FOCUS_ON_CLICK, "FocusOnClick");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_VISUAL_EFFECT, "VisualEffect");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_IMAGE_POSITION, "ImagePosition");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_IMAGE_ALIGN, "ImageAlign");
++
++ XMLFORM_CONSTASCII_STRING( PROPERTY_BOUND_CELL, "BoundCell");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_LIST_CELL_RANGE, "CellRange");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_ADDRESS, "Address");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_FILE_REPRESENTATION,"PersistentRepresentation");
++ XMLFORM_CONSTASCII_STRING( PROPERTY_RICH_TEXT, "RichText");
++
++ // services
++ XMLFORM_CONSTASCII_STRING( SERVICE_FORMSCOLLECTION, "com.sun.star.form.Forms" );
++ XMLFORM_CONSTASCII_STRING( SERVICE_NUMBERFORMATSSUPPLIER, "com.sun.star.util.NumberFormatsSupplier" );
++ XMLFORM_CONSTASCII_STRING( SERVICE_SPREADSHEET_DOCUMENT, "com.sun.star.sheet.SpreadsheetDocument");
++ XMLFORM_CONSTASCII_STRING( SERVICE_CELLVALUEBINDING, "com.sun.star.table.CellValueBinding" );
++ XMLFORM_CONSTASCII_STRING( SERVICE_LISTINDEXCELLBINDING, "com.sun.star.table.ListPositionCellBinding" );
++ XMLFORM_CONSTASCII_STRING( SERVICE_CELLRANGELISTSOURCE, "com.sun.star.table.CellRangeListSource" );
++ XMLFORM_CONSTASCII_STRING( SERVICE_ADDRESS_CONVERSION, "com.sun.star.table.CellAddressConversion");
++ XMLFORM_CONSTASCII_STRING( SERVICE_RANGEADDRESS_CONVERSION, "com.sun.star.table.CellRangeAddressConversion");
++
++ // old service names (compatibility)
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_FORM, "stardiv.one.form.component.Form");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_EDIT, "stardiv.one.form.component.Edit");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_LISTBOX, "stardiv.one.form.component.ListBox");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_COMBOBOX, "stardiv.one.form.component.ComboBox");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_RADIOBUTTON, "stardiv.one.form.component.RadioButton");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_GROUPBOX, "stardiv.one.form.component.GroupBox");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_FIXEDTEXT, "stardiv.one.form.component.FixedText");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_COMMANDBUTTON, "stardiv.one.form.component.CommandButton");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_CHECKBOX, "stardiv.one.form.component.CheckBox");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_GRID, "stardiv.one.form.component.Grid");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_IMAGEBUTTON, "stardiv.one.form.component.ImageButton");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_FILECONTROL, "stardiv.one.form.component.FileControl");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_TIMEFIELD, "stardiv.one.form.component.TimeField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_DATEFIELD, "stardiv.one.form.component.DateField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_NUMERICFIELD, "stardiv.one.form.component.NumericField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_CURRENCYFIELD, "stardiv.one.form.component.CurrencyField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_PATTERNFIELD, "stardiv.one.form.component.PatternField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_HIDDENCONTROL, "stardiv.one.form.component.Hidden");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_IMAGECONTROL, "stardiv.one.form.component.ImageControl");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PERSISTENT_COMPONENT_FORMATTEDFIELD, "stardiv.one.form.component.FormattedField");
++
++ // new service names, the old ones are translated into this new ones
++ XMLFORM_CONSTASCII_STRING( SERVICE_FORM, "com.sun.star.form.component.Form");
++ XMLFORM_CONSTASCII_STRING( SERVICE_EDIT, "com.sun.star.form.component.TextField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_LISTBOX, "com.sun.star.form.component.ListBox");
++ XMLFORM_CONSTASCII_STRING( SERVICE_COMBOBOX, "com.sun.star.form.component.ComboBox");
++ XMLFORM_CONSTASCII_STRING( SERVICE_RADIOBUTTON, "com.sun.star.form.component.RadioButton");
++ XMLFORM_CONSTASCII_STRING( SERVICE_GROUPBOX, "com.sun.star.form.component.GroupBox");
++ XMLFORM_CONSTASCII_STRING( SERVICE_FIXEDTEXT, "com.sun.star.form.component.FixedText");
++ XMLFORM_CONSTASCII_STRING( SERVICE_COMMANDBUTTON, "com.sun.star.form.component.CommandButton");
++ XMLFORM_CONSTASCII_STRING( SERVICE_CHECKBOX, "com.sun.star.form.component.CheckBox");
++ XMLFORM_CONSTASCII_STRING( SERVICE_GRID, "com.sun.star.form.component.GridControl");
++ XMLFORM_CONSTASCII_STRING( SERVICE_IMAGEBUTTON, "com.sun.star.form.component.ImageButton");
++ XMLFORM_CONSTASCII_STRING( SERVICE_FILECONTROL, "com.sun.star.form.component.FileControl");
++ XMLFORM_CONSTASCII_STRING( SERVICE_TIMEFIELD, "com.sun.star.form.component.TimeField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_DATEFIELD, "com.sun.star.form.component.DateField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_NUMERICFIELD, "com.sun.star.form.component.NumericField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_CURRENCYFIELD, "com.sun.star.form.component.CurrencyField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_PATTERNFIELD, "com.sun.star.form.component.PatternField");
++ XMLFORM_CONSTASCII_STRING( SERVICE_HIDDENCONTROL, "com.sun.star.form.component.HiddenControl");
++ XMLFORM_CONSTASCII_STRING( SERVICE_IMAGECONTROL, "com.sun.star.form.component.DatabaseImageControl");
++ XMLFORM_CONSTASCII_STRING( SERVICE_FORMATTEDFIELD, "com.sun.star.form.component.FormattedField" );
++
++ // various strings
++ XMLFORM_CONSTASCII_STRING( EVENT_NAME_SEPARATOR, "::" );
++ XMLFORM_CONSTASCII_STRING( EVENT_TYPE, "EventType" );
++ XMLFORM_CONSTASCII_STRING( EVENT_LIBRARY, "Library" );
++ XMLFORM_CONSTASCII_STRING( EVENT_LOCALMACRONAME, "MacroName" );
++ XMLFORM_CONSTASCII_STRING( EVENT_SCRIPTURL, "Script" );
++ XMLFORM_CONSTASCII_STRING( EVENT_STAROFFICE, "StarOffice" );
++ XMLFORM_CONSTASCII_STRING( EVENT_STARBASIC, "StarBasic" );
++ XMLFORM_CONSTASCII_STRING( EVENT_APPLICATION, "application" );
++
++//.........................................................................
++} // namespace xmloff
++//.........................................................................
++
++#endif // _XMLOFF_FORMS_STRINGS_HXX_
+--- xmloff/source/forms/formattributes.hxx.orig 1970-01-01 08:00:00.000000000 +0800
++++ xmloff/source/forms/formattributes.hxx 2008-06-04 12:38:12.000000000 +0800
+@@ -0,0 +1,365 @@
++/*************************************************************************
++ *
++ * 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: formattributes.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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _XMLOFF_FORMATTRIBUTES_HXX_
++#define _XMLOFF_FORMATTRIBUTES_HXX_
++
++#include <com/sun/star/beans/XPropertySet.hpp>
++#include <sal/types.h>
++#include <vos/refernce.hxx>
++#include <comphelper/stl_types.hxx>
++
++class SvXMLExport;
++struct SvXMLEnumMapEntry;
++
++//.........................................................................
++namespace xmloff
++{
++//.........................................................................
++
++ // flags for common control attributes
++ #define CCA_NAME 0x00000001
++ #define CCA_SERVICE_NAME 0x00000002
++ #define CCA_BUTTON_TYPE 0x00000004
++ #define CCA_CONTROL_ID 0x00000008
++ #define CCA_CURRENT_SELECTED 0x00000010
++ #define CCA_CURRENT_VALUE 0x00000020
++ #define CCA_DISABLED 0x00000040
++ #define CCA_DROPDOWN 0x00000080
++ #define CCA_FOR 0x00000100
++ #define CCA_IMAGE_DATA 0x00000200
++ #define CCA_LABEL 0x00000400
++ #define CCA_MAX_LENGTH 0x00000800
++ #define CCA_PRINTABLE 0x00001000
++ #define CCA_READONLY 0x00002000
++ #define CCA_SELECTED 0x00004000
++ #define CCA_SIZE 0x00008000
++ #define CCA_TAB_INDEX 0x00010000
++ #define CCA_TARGET_FRAME 0x00020000
++ #define CCA_TARGET_LOCATION 0x00040000
++ #define CCA_TAB_STOP 0x00080000
++ #define CCA_TITLE 0x00100000
++ #define CCA_VALUE 0x00200000
++ #define CCA_ORIENTATION 0x00400000
++ #define CCA_VISUAL_EFFECT 0x00800000
+ #define CCA_ENABLEVISIBLE 0x01000000
-
- // flags for database control atttributes
- #define DA_BOUND_COLUMN 0x00000001
---- xmloff/source/forms/formattributes.cxx.orig 2008-06-04 11:59:12.000000000 +0800
-+++ xmloff/source/forms/formattributes.cxx 2008-06-04 11:59:19.000000000 +0800
-@@ -60,6 +60,7 @@ namespace xmloff
- case CCA_CURRENT_SELECTED: return "current-selected";
- case CCA_CURRENT_VALUE: return "current-value";
- case CCA_DISABLED: return "disabled";
++
++ // flags for database control atttributes
++ #define DA_BOUND_COLUMN 0x00000001
++ #define DA_CONVERT_EMPTY 0x00000002
++ #define DA_DATA_FIELD 0x00000004
++ #define DA_LIST_SOURCE 0x00000008
++ #define DA_LIST_SOURCE_TYPE 0x00000010
++
++ // flags for binding related control attributes
++ #define BA_LINKED_CELL 0x00000001
++ #define BA_LIST_LINKING_TYPE 0x00000002
++ #define BA_LIST_CELL_RANGE 0x00000004
++ #define BA_XFORMS_BIND 0x00000008
++ #define BA_XFORMS_LISTBIND 0x00000010
++ #define BA_XFORMS_SUBMISSION 0x00000020
++
++ // flags for event attributes
++ #define EA_CONTROL_EVENTS 0x00000001
++ #define EA_ON_CHANGE 0x00000002
++ #define EA_ON_CLICK 0x00000004
++ #define EA_ON_DBLCLICK 0x00000008
++ #define EA_ON_SELECT 0x00000010
++
++ /// attributes in the xml tag representing a form
++ enum FormAttributes
++ {
++ faName,
++ faServiceName,
++ faAction,
++ faEnctype,
++ faMethod,
++ faTargetFrame,
++ faAllowDeletes,
++ faAllowInserts,
++ faAllowUpdates,
++ faApplyFilter,
++ faCommand,
++ faCommandType,
++ faEscapeProcessing,
++ faDatasource,
++ faConnectionResource,
++ faDetailFiels,
++ faFilter,
++ faIgnoreResult,
++ faMasterFields,
++ faNavigationMode,
++ faOrder,
++ faTabbingCycle
++ };
++
++ // any other attributes, which are special to some control types
++ #define SCA_ECHO_CHAR 0x00000001
++ #define SCA_MAX_VALUE 0x00000002
++ #define SCA_MIN_VALUE 0x00000004
++ #define SCA_VALIDATION 0x00000008
++ #define SCA_MULTI_LINE 0x00000020
++ #define SCA_AUTOMATIC_COMPLETION 0x00000080
++ #define SCA_MULTIPLE 0x00000100
++ #define SCA_DEFAULT_BUTTON 0x00000200
++ #define SCA_CURRENT_STATE 0x00000400
++ #define SCA_IS_TRISTATE 0x00000800
++ #define SCA_STATE 0x00001000
++ #define SCA_COLUMN_STYLE_NAME 0x00002000
++ #define SCA_STEP_SIZE 0x00004000
++ #define SCA_PAGE_STEP_SIZE 0x00008000
++ #define SCA_REPEAT_DELAY 0x00010000
++ #define SCA_TOGGLE 0x00020000
++ #define SCA_FOCUS_ON_CLICK 0x00040000
++ #define SCA_IMAGE_POSITION 0x00080000
++
++ // attributes of the office:forms element
++ enum OfficeFormsAttributes
++ {
++ ofaAutomaticFocus,
++ ofaApplyDesignMode
++ };
++
++ //=====================================================================
++ //= OAttributeMetaData
++ //=====================================================================
++ /** allows the translation of attribute ids into strings.
++
++ <p>This class does not allow to connect xml attributes to property names or
++ something like that, it only deals with the xml side</p>
++ */
++ class OAttributeMetaData
++ {
++ public:
++ /** calculates the xml attribute representation of a common control attribute.
++ @param _nId
++ the id of the attribute. Has to be one of the CCA_* constants.
++ */
++ static const sal_Char* getCommonControlAttributeName(sal_Int32 _nId);
++
++ /** calculates the xml namespace key to use for a common control attribute
++ @param _nId
++ the id of the attribute. Has to be one of the CCA_* constants.
++ */
++ static sal_uInt16 getCommonControlAttributeNamespace(sal_Int32 _nId);
++
++ /** retrieves the name of an attribute of a form xml representation
++ @param _eAttrib
++ enum value specifying the attribute
++ */
++ static const sal_Char* getFormAttributeName(FormAttributes _eAttrib);
++
++ /** calculates the xml namespace key to use for a attribute of a form xml representation
++ @param _eAttrib
++ enum value specifying the attribute
++ */
++ static sal_uInt16 getFormAttributeNamespace(FormAttributes _eAttrib);
++
++ /** calculates the xml attribute representation of a database attribute.
++ @param _nId
++ the id of the attribute. Has to be one of the DA_* constants.
++ */
++ static const sal_Char* getDatabaseAttributeName(sal_Int32 _nId);
++
++ /** calculates the xml namespace key to use for a database attribute.
++ @param _nId
++ the id of the attribute. Has to be one of the DA_* constants.
++ */
++ static sal_uInt16 getDatabaseAttributeNamespace(sal_Int32 _nId);
++
++ /** calculates the xml attribute representation of a special attribute.
++ @param _nId
++ the id of the attribute. Has to be one of the SCA_* constants.
++ */
++ static const sal_Char* getSpecialAttributeName(sal_Int32 _nId);
++
++ /** calculates the xml attribute representation of a binding attribute.
++ @param _nId
++ the id of the attribute. Has to be one of the BA_* constants.
++ */
++ static const sal_Char* getBindingAttributeName(sal_Int32 _nId);
++
++ /** calculates the xml namespace key to use for a binding attribute.
++ @param _nId
++ the id of the attribute. Has to be one of the BA_* constants.
++ */
++ static sal_uInt16 getBindingAttributeNamespace(sal_Int32 _nId);
++
++ /** calculates the xml namespace key to use for a special attribute.
++ @param _nId
++ the id of the attribute. Has to be one of the SCA_* constants.
++ */
++ static sal_uInt16 getSpecialAttributeNamespace(sal_Int32 _nId);
++
++ /** calculates the xml attribute representation of a attribute of the office:forms element
++ @param _nId
++ the id of the attribute
++ */
++ static const sal_Char* getOfficeFormsAttributeName(OfficeFormsAttributes _eAttrib);
++
++ /** calculates the xml namedspace key of a attribute of the office:forms element
++ @param _nId
++ the id of the attribute
++ */
++ static sal_uInt16 getOfficeFormsAttributeNamespace(OfficeFormsAttributes _eAttrib);
++ };
++
++ //=====================================================================
++ //= OAttribute2Property
++ //=====================================================================
++ /** some kind of opposite to the OAttributeMetaData class. Able to translate
++ attributes into property names/types
++
++ <p>The construction of this class is rather expensive (or at least it's initialization from outside),
++ so it should be shared</p>
++ */
++ class OAttribute2Property
++ {
++ public:
++ // TODO: maybe the following struct should be used for exports, too. In this case we would not need to
++ // store it's instances in a map, but in a vector for faster access.
++ struct AttributeAssignment
++ {
++ ::rtl::OUString sAttributeName; // the attribute name
++ ::rtl::OUString sPropertyName; // the property name
++ ::com::sun::star::uno::Type aPropertyType; // the property type
++ ::rtl::OUString sAttributeDefault; // the default if the attribute is not present
++
++ // entries which are special to some value types
++ const SvXMLEnumMapEntry* pEnumMap; // the enum map, if appliable
++ sal_Bool bInverseSemantics; // for booleanss: attribute and property value have the same or an inverse semantics?
++
++ AttributeAssignment() : pEnumMap(NULL), bInverseSemantics(sal_False) { }
++ };
++
++ protected:
++ DECLARE_STL_USTRINGACCESS_MAP( AttributeAssignment, AttributeAssignments );
++ AttributeAssignments m_aKnownProperties;
++
++ public:
++ OAttribute2Property();
++ virtual ~OAttribute2Property();
++
++ /** return the AttributeAssignment which corresponds to the given attribute
++
++ @param _rAttribName
++ the name of the attrribute
++ @return
++ a pointer to the <type>AttributeAssignment</type> structure as requested, NULL if the attribute
++ does not represent a property.
++ */
++ const AttributeAssignment* getAttributeTranslation(
++ const ::rtl::OUString& _rAttribName);
++
++ /** add a attribute assignment referring to a string property to the map
++ @param _pAttributeName
++ the name of the attrribute
++ @param _rPropertyName
++ the name of the property assigned to the attribute
++ @param _pAttributeDefault
++ the default value for the attribute, if any. May be NULL, in this case the default is assumed to be
++ an empty string.
++ */
++ void addStringProperty(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const sal_Char* _pAttributeDefault = NULL);
++
++ /** add a attribute assignment referring to a boolean property to the map
++
++ @param _pAttributeName
++ the name of the attrribute
++ @param _rPropertyName
++ the name of the property assigned to the attribute
++ @param _bAttributeDefault
++ the default value for the attribute.
++ @param _bInverseSemantics
++ if <TRUE/>, a attribute value of <TRUE/> means a property value of <FALSE/> and vice verse.<br/>
++ if <FALSE/>, the attribute value is used as property value directly
++ */
++ void addBooleanProperty(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const sal_Bool _bAttributeDefault, const sal_Bool _bInverseSemantics = sal_False);
++
++ /** add a attribute assignment referring to an int16 property to the map
++
++ @param _pAttributeName
++ the name of the attrribute
++ @param _rPropertyName
++ the name of the property assigned to the attribute
++ @param _nAttributeDefault
++ the default value for the attribute.
++ */
++ void addInt16Property(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const sal_Int16 _nAttributeDefault);
++
++ /** add a attribute assignment referring to an int32 property to the map
++
++ @param _pAttributeName
++ the name of the attrribute
++ @param _rPropertyName
++ the name of the property assigned to the attribute
++ @param _nAttributeDefault
++ the default value for the attribute.
++ */
++ void addInt32Property(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const sal_Int32 _nAttributeDefault );
++
++ /** add a attribute assignment referring to an enum property to the map
++
++ @param _pAttributeName
++ the name of the attrribute
++ @param _rPropertyName
++ the name of the property assigned to the attribute
++ @param _nAttributeDefault
++ the default value for the attribute, as (32bit) integer
++ @param _pValueMap
++ the map to translate strings into enum values
++ @param _pType
++ the type of the property. May be NULL, in this case 32bit integer is assumed.
++ */
++ void addEnumProperty(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const sal_uInt16 _nAttributeDefault, const SvXMLEnumMapEntry* _pValueMap,
++ const ::com::sun::star::uno::Type* _pType = NULL);
++
++ protected:
++ /// some common code for the various add*Property methods
++ AttributeAssignment& implAdd(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const ::com::sun::star::uno::Type& _rType, const ::rtl::OUString& _rDefaultString);
++ };
++//.........................................................................
++} // namespace xmloff
++//.........................................................................
++
++#endif // _XMLOFF_FORMATTRIBUTES_HXX_
++
+--- xmloff/source/forms/formattributes.cxx.orig 1970-01-01 08:00:00.000000000 +0800
++++ xmloff/source/forms/formattributes.cxx 2008-06-04 12:38:12.000000000 +0800
+@@ -0,0 +1,343 @@
++/*************************************************************************
++ *
++ * 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: formattributes.cxx,v $
++ * $Revision: 1.21 $
++ *
++ * This file is part of OpenOffice.org.
++ *
++ * OpenOffice.org is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 3
++ * only, as published by the Free Software Foundation.
++ *
++ * OpenOffice.org is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Lesser General Public License version 3 for more details
++ * (a copy is included in the LICENSE file that accompanied this code).
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * version 3 along with OpenOffice.org. If not, see
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_xmloff.hxx"
++#include "formattributes.hxx"
++#include "xmlnmspe.hxx"
++#include <xmloff/xmluconv.hxx>
++#include <rtl/ustrbuf.hxx>
++
++//.........................................................................
++namespace xmloff
++{
++//.........................................................................
++
++ using namespace ::com::sun::star::uno;
++ using namespace ::com::sun::star::lang;
++ using namespace ::com::sun::star::beans;
++
++
++ //=====================================================================
++ //= OAttributeMetaData
++ //=====================================================================
++ //---------------------------------------------------------------------
++ const sal_Char* OAttributeMetaData::getCommonControlAttributeName(sal_Int32 _nId)
++ {
++ switch (_nId)
++ {
++ case CCA_NAME: return "name";
++ case CCA_SERVICE_NAME: return "control-implementation";
++ case CCA_BUTTON_TYPE: return "button-type";
++ case CCA_CONTROL_ID: return "id";
++ case CCA_CURRENT_SELECTED: return "current-selected";
++ case CCA_CURRENT_VALUE: return "current-value";
++ case CCA_DISABLED: return "disabled";
+ case CCA_ENABLEVISIBLE: return "enablevisible";
- case CCA_DROPDOWN: return "dropdown";
- case CCA_FOR: return "for";
- case CCA_IMAGE_DATA: return "image-data";
---- xmloff/source/forms/elementexport.cxx.orig 2008-06-04 11:59:12.000000000 +0800
-+++ xmloff/source/forms/elementexport.cxx 2008-06-04 11:59:19.000000000 +0800
-@@ -523,15 +523,15 @@ namespace xmloff
- {
- static sal_Int32 nBooleanPropertyAttributeIds[] =
- { // attribute flags
-- CCA_CURRENT_SELECTED, CCA_DISABLED, CCA_DROPDOWN, CCA_PRINTABLE, CCA_READONLY, CCA_SELECTED, CCA_TAB_STOP
++ case CCA_DROPDOWN: return "dropdown";
++ case CCA_FOR: return "for";
++ case CCA_IMAGE_DATA: return "image-data";
++ case CCA_LABEL: return "label";
++ case CCA_MAX_LENGTH: return "max-length";
++ case CCA_PRINTABLE: return "printable";
++ case CCA_READONLY: return "readonly";
++ case CCA_SELECTED: return "selected";
++ case CCA_SIZE: return "size";
++ case CCA_TAB_INDEX: return "tab-index";
++ case CCA_TARGET_FRAME: return "target-frame";
++ case CCA_TARGET_LOCATION: return "href"; // the only special thing here: TargetLocation is represented by an xlink:href attribute
++ case CCA_TAB_STOP: return "tab-stop";
++ case CCA_TITLE: return "title";
++ case CCA_VALUE: return "value";
++ case CCA_ORIENTATION: return "orientation";
++ case CCA_VISUAL_EFFECT: return "visual-effect";
++ default:
++ OSL_ENSURE(sal_False, "OAttributeMetaData::getCommonControlAttributeName: invalid id (maybe you or-ed two flags?)!");
++ }
++ return "";
++ }
++
++ //---------------------------------------------------------------------
++ sal_uInt16 OAttributeMetaData::getCommonControlAttributeNamespace(sal_Int32 _nId)
++ {
++ if (CCA_TARGET_LOCATION == _nId)
++ return XML_NAMESPACE_XLINK;
++
++ if (CCA_TARGET_FRAME == _nId)
++ return XML_NAMESPACE_OFFICE;
++
++ return XML_NAMESPACE_FORM;
++ }
++
++ //---------------------------------------------------------------------
++ const sal_Char* OAttributeMetaData::getFormAttributeName(FormAttributes _eAttrib)
++ {
++ switch (_eAttrib)
++ {
++ case faName: return "name";
++ case faServiceName: return "service-name";
++ case faAction: return "href"; // the only special thing here: Action is represented by an xlink:href attribute
++ case faEnctype: return "enctype";
++ case faMethod: return "method";
++ case faTargetFrame: return "target-frame";
++ case faAllowDeletes: return "allow-deletes";
++ case faAllowInserts: return "allow-inserts";
++ case faAllowUpdates: return "allow-updates";
++ case faApplyFilter: return "apply-filter";
++ case faCommand: return "command";
++ case faCommandType: return "command-type";
++ case faEscapeProcessing: return "escape-processing";
++ case faDatasource: return "datasource";
++ case faConnectionResource: return "connection-resource";
++ case faDetailFiels: return "detail-fields";
++ case faFilter: return "filter";
++ case faIgnoreResult: return "ignore-result";
++ case faMasterFields: return "master-fields";
++ case faNavigationMode: return "navigation-mode";
++ case faOrder: return "order";
++ case faTabbingCycle: return "tab-cycle";
++ default:
++ OSL_ENSURE(sal_False, "OAttributeMetaData::getFormAttributeName: invalid id!");
++ }
++ return "";
++ }
++
++ //---------------------------------------------------------------------
++ sal_uInt16 OAttributeMetaData::getFormAttributeNamespace(FormAttributes _eAttrib)
++ {
++ if (faAction == _eAttrib)
++ return XML_NAMESPACE_XLINK;
++
++ if (faTargetFrame == _eAttrib)
++ return XML_NAMESPACE_OFFICE;
++
++ return XML_NAMESPACE_FORM;
++ }
++
++ //---------------------------------------------------------------------
++ const sal_Char* OAttributeMetaData::getDatabaseAttributeName(sal_Int32 _nId)
++ {
++ switch (_nId)
++ {
++ case DA_BOUND_COLUMN: return "bound-column";
++ case DA_CONVERT_EMPTY: return "convert-empty-to-null";
++ case DA_DATA_FIELD: return "data-field";
++ case DA_LIST_SOURCE: return "list-source";
++ case DA_LIST_SOURCE_TYPE: return "list-source-type";
++ default:
++ OSL_ENSURE(sal_False, "OAttributeMetaData::getDatabaseAttributeName: invalid id (maybe you or-ed two flags?)!");
++ }
++ return "";
++ }
++
++ //---------------------------------------------------------------------
++ sal_uInt16 OAttributeMetaData::getDatabaseAttributeNamespace(sal_Int32 /*_nId*/)
++ {
++ // nothing special here
++ return XML_NAMESPACE_FORM;
++ }
++
++ //---------------------------------------------------------------------
++ const sal_Char* OAttributeMetaData::getBindingAttributeName(sal_Int32 _nId)
++ {
++ switch (_nId)
++ {
++ case BA_LINKED_CELL: return "linked-cell";
++ case BA_LIST_LINKING_TYPE: return "list-linkage-type";
++ case BA_LIST_CELL_RANGE: return "source-cell-range";
++ default:
++ OSL_ENSURE(sal_False, "OAttributeMetaData::getBindingAttributeName: invalid id (maybe you or-ed two flags?)!");
++ }
++ return "";
++ }
++
++ //---------------------------------------------------------------------
++ sal_uInt16 OAttributeMetaData::getBindingAttributeNamespace(sal_Int32)
++ {
++ // nothing special here
++ return XML_NAMESPACE_FORM;
++ }
++
++ //---------------------------------------------------------------------
++ const sal_Char* OAttributeMetaData::getSpecialAttributeName(sal_Int32 _nId)
++ {
++ switch (_nId)
++ {
++ case SCA_ECHO_CHAR: return "echo-char";
++ case SCA_MAX_VALUE: return "max-value";
++ case SCA_MIN_VALUE: return "min-value";
++ case SCA_VALIDATION: return "validation";
++ case SCA_MULTI_LINE: return "multi-line";
++ case SCA_AUTOMATIC_COMPLETION: return "auto-complete";
++ case SCA_MULTIPLE: return "multiple";
++ case SCA_DEFAULT_BUTTON: return "default-button";
++ case SCA_CURRENT_STATE: return "current-state";
++ case SCA_IS_TRISTATE: return "is-tristate";
++ case SCA_STATE: return "state";
++ case SCA_COLUMN_STYLE_NAME: return "text-style-name";
++ case SCA_STEP_SIZE: return "step-size";
++ case SCA_PAGE_STEP_SIZE: return "page-step-size";
++ case SCA_REPEAT_DELAY: return "delay-for-repeat";
++ case SCA_TOGGLE: return "toggle";
++ case SCA_FOCUS_ON_CLICK: return "focus-on-click";
++ default:
++ OSL_ENSURE(sal_False, "OAttributeMetaData::getSpecialAttributeName: invalid id (maybe you or-ed two flags?)!");
++ }
++ return "";
++ }
++
++ //---------------------------------------------------------------------
++ sal_uInt16 OAttributeMetaData::getSpecialAttributeNamespace(sal_Int32 /*_nId*/)
++ {
++ // nothing special here
++ return XML_NAMESPACE_FORM;
++ }
++
++ //---------------------------------------------------------------------
++ const sal_Char* OAttributeMetaData::getOfficeFormsAttributeName(OfficeFormsAttributes _eAttrib)
++ {
++ switch (_eAttrib)
++ {
++ case ofaAutomaticFocus: return "automatic-focus";
++ case ofaApplyDesignMode: return "apply-design-mode";
++ default:
++ OSL_ENSURE(sal_False, "OAttributeMetaData::getOfficeFormsAttributeName: invalid id!");
++ }
++ return "";
++ }
++
++ //---------------------------------------------------------------------
++ sal_uInt16 OAttributeMetaData::getOfficeFormsAttributeNamespace(OfficeFormsAttributes /* _eAttrib */)
++ {
++ // nothing special here
++ return XML_NAMESPACE_FORM;
++ }
++
++ //=====================================================================
++ //= OAttribute2Property
++ //=====================================================================
++ //---------------------------------------------------------------------
++ OAttribute2Property::OAttribute2Property()
++ {
++ }
++
++ //---------------------------------------------------------------------
++ OAttribute2Property::~OAttribute2Property()
++ {
++ }
++
++ //---------------------------------------------------------------------
++ const OAttribute2Property::AttributeAssignment* OAttribute2Property::getAttributeTranslation(
++ const ::rtl::OUString& _rAttribName)
++ {
++ ConstAttributeAssignmentsIterator aPos = m_aKnownProperties.find(_rAttribName);
++ if (m_aKnownProperties.end() != aPos)
++ return &aPos->second;
++ return NULL;
++ }
++
++ //---------------------------------------------------------------------
++ void OAttribute2Property::addStringProperty(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const sal_Char* _pAttributeDefault)
++ {
++ implAdd(_pAttributeName, _rPropertyName, ::getCppuType( static_cast< ::rtl::OUString* >(NULL) ),
++ _pAttributeDefault ? ::rtl::OUString::createFromAscii(_pAttributeDefault) : ::rtl::OUString());
++ }
++
++ //---------------------------------------------------------------------
++ void OAttribute2Property::addBooleanProperty(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const sal_Bool _bAttributeDefault, const sal_Bool _bInverseSemantics)
++ {
++ ::rtl::OUStringBuffer aDefault;
++ SvXMLUnitConverter::convertBool(aDefault, _bAttributeDefault);
++ AttributeAssignment& aAssignment = implAdd(_pAttributeName, _rPropertyName, ::getBooleanCppuType(), aDefault.makeStringAndClear());
++ aAssignment.bInverseSemantics = _bInverseSemantics;
++ }
++
++ //---------------------------------------------------------------------
++ void OAttribute2Property::addInt16Property(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const sal_Int16 _nAttributeDefault)
++ {
++ ::rtl::OUStringBuffer aDefault;
++ SvXMLUnitConverter::convertNumber(aDefault, (sal_Int32)_nAttributeDefault);
++ implAdd(_pAttributeName, _rPropertyName, ::getCppuType( static_cast< sal_Int16* >(NULL) ), aDefault.makeStringAndClear());
++ }
++
++ //---------------------------------------------------------------------
++ void OAttribute2Property::addInt32Property(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const sal_Int32 _nAttributeDefault)
++ {
++ ::rtl::OUStringBuffer aDefault;
++ SvXMLUnitConverter::convertNumber( aDefault, _nAttributeDefault );
++ implAdd( _pAttributeName, _rPropertyName, ::getCppuType( static_cast< sal_Int32* >(NULL) ), aDefault.makeStringAndClear() );
++ }
++
++ //---------------------------------------------------------------------
++ void OAttribute2Property::addEnumProperty(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const sal_uInt16 _nAttributeDefault, const SvXMLEnumMapEntry* _pValueMap,
++ const ::com::sun::star::uno::Type* _pType)
++ {
++ ::rtl::OUStringBuffer aDefault;
++ SvXMLUnitConverter::convertEnum(aDefault, _nAttributeDefault, _pValueMap);
++ AttributeAssignment& aAssignment = implAdd(_pAttributeName, _rPropertyName,
++ _pType ? *_pType : ::getCppuType( static_cast< sal_Int32* >(NULL) ),
++ // this assumes that the setPropertyValue for enums can handle int32's ....
++ aDefault.makeStringAndClear());
++ aAssignment.pEnumMap = _pValueMap;
++ }
++
++ //---------------------------------------------------------------------
++ OAttribute2Property::AttributeAssignment& OAttribute2Property::implAdd(
++ const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
++ const ::com::sun::star::uno::Type& _rType, const ::rtl::OUString& /*_rDefaultString*/)
++ {
++ OSL_ENSURE(m_aKnownProperties.end() == m_aKnownProperties.find(::rtl::OUString::createFromAscii(_pAttributeName)),
++ "OAttribute2Property::implAdd: already have this attribute!");
++
++ ::rtl::OUString sAttributeName = ::rtl::OUString::createFromAscii(_pAttributeName);
++
++ AttributeAssignment aAssignment;
++ aAssignment.sAttributeName = sAttributeName;
++ aAssignment.sPropertyName = _rPropertyName;
++ aAssignment.aPropertyType = _rType;
++
++ // redundance, the accessor is stored in aAssignment.sAttributeName, too
++ return m_aKnownProperties[sAttributeName] = aAssignment;
++ }
++
++//.........................................................................
++} // namespace xmloff
++//.........................................................................
++
+--- xmloff/source/forms/elementexport.cxx.orig 1970-01-01 08:00:00.000000000 +0800
++++ xmloff/source/forms/elementexport.cxx 2008-06-04 12:38:12.000000000 +0800
+@@ -0,0 +1,2155 @@
++/*************************************************************************
++ *
++ * 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: elementexport.cxx,v $
++ * $Revision: 1.48 $
++ *
++ * This file is part of OpenOffice.org.
++ *
++ * OpenOffice.org is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 3
++ * only, as published by the Free Software Foundation.
++ *
++ * OpenOffice.org is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Lesser General Public License version 3 for more details
++ * (a copy is included in the LICENSE file that accompanied this code).
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * version 3 along with OpenOffice.org. If not, see
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_xmloff.hxx"
++
++#include <stdio.h>
++#include "elementexport.hxx"
++#include "strings.hxx"
++#include <xmloff/xmlexp.hxx>
++#include <xmloff/nmspmap.hxx>
++#include "xmlnmspe.hxx"
++#include <xmloff/xmluconv.hxx>
++#include <xmloff/xmltoken.hxx>
++#include <tools/time.hxx>
++#include <tools/diagnose_ex.h>
++#include <comphelper/extract.hxx>
++#include "eventexport.hxx"
++#include "formenums.hxx"
++#include <vcl/wintypes.hxx> // for check states
++#include <xmloff/XMLEventExport.hxx>
++#include "formcellbinding.hxx"
++
++#include <algorithm>
++
++/** === begin UNO includes === **/
++#include <com/sun/star/text/XText.hpp>
++#include <com/sun/star/lang/XServiceInfo.hpp>
++#include <com/sun/star/io/XPersistObject.hpp>
++#include <com/sun/star/form/FormComponentType.hpp>
++#include <com/sun/star/beans/PropertyAttribute.hpp>
++#include <com/sun/star/form/FormSubmitEncoding.hpp>
++#include <com/sun/star/form/FormSubmitMethod.hpp>
++#include <com/sun/star/sdb/CommandType.hpp>
++#include <com/sun/star/form/NavigationBarMode.hpp>
++#include <com/sun/star/form/TabulatorCycle.hpp>
++#include <com/sun/star/form/FormButtonType.hpp>
++#include <com/sun/star/awt/ScrollBarOrientation.hpp>
++#include <com/sun/star/awt/VisualEffect.hpp>
++#include <com/sun/star/form/ListSourceType.hpp>
++#include <com/sun/star/awt/ImagePosition.hpp>
++/** === end UNO includes === **/
++#include <vcl/wintypes.hxx> // for check states
++#include <xmloff/txtprmap.hxx>
++#include "formcellbinding.hxx"
++#include "xformsexport.hxx"
++#include <com/sun/star/form/binding/XBindableValue.hpp>
++#include <com/sun/star/form/binding/XListEntrySink.hpp>
++#include <tools/urlobj.hxx>
++#include <algorithm>
++
++
++//.........................................................................
++namespace xmloff
++{
++//.........................................................................
++
++ using namespace ::xmloff::token;
++ using namespace ::com::sun::star::uno;
++ using namespace ::com::sun::star::sdb;
++ using namespace ::com::sun::star::awt;
++ using namespace ::com::sun::star::form;
++ using namespace ::com::sun::star::lang;
++ using namespace ::com::sun::star::lang;
++ using namespace ::com::sun::star::beans;
++ using namespace ::com::sun::star::container;
++ using namespace ::com::sun::star::script;
++ using namespace ::com::sun::star::io;
++ using namespace ::com::sun::star::table;
++ using namespace ::com::sun::star::text;
++ using namespace ::com::sun::star::form::binding;
++
++ //=====================================================================
++ //= OElementExport
++ //=====================================================================
++ OElementExport::OElementExport(IFormsExportContext& _rContext, const Reference< XPropertySet >& _rxProps,
++ const Sequence< ScriptEventDescriptor >& _rEvents)
++ :OPropertyExport(_rContext, _rxProps)
++ ,m_aEvents(_rEvents)
++ ,m_pXMLElement(NULL)
++ {
++ }
++
++ //---------------------------------------------------------------------
++ OElementExport::~OElementExport()
++ {
++ implEndElement();
++ }
++
++ //---------------------------------------------------------------------
++ void OElementExport::doExport()
++ {
++ // collect some general information about the element
++ examine();
++
++ // first add the attributes necessary for the element
++ m_rContext.getGlobalContext().ClearAttrList();
++
++ // add the attributes
++ exportAttributes();
++
++ // start the XML element
++ implStartElement(getXMLElementName());
++
++ // the sub elements (mostly control type dependent)
++ exportSubTags();
++
++ implEndElement();
++ }
++
++ //---------------------------------------------------------------------
++ void OElementExport::examine()
++ {
++ // nothing to do here
++ }
++
++ //---------------------------------------------------------------------
++ void OElementExport::exportAttributes()
++ {
++ // nothing to do here
++ }
++
++ //---------------------------------------------------------------------
++ void OElementExport::exportSubTags()
++ {
++ // the properties which where not exported 'til now
++ exportRemainingProperties();
++
++ // the script:events sub tags
++ exportEvents();
++ }
++
++ //---------------------------------------------------------------------
++ void OElementExport::implStartElement(const sal_Char* _pName)
++ {
++ m_pXMLElement = new SvXMLElementExport(m_rContext.getGlobalContext(), XML_NAMESPACE_FORM, _pName, sal_True, sal_True);
++ }
++
++ //---------------------------------------------------------------------
++ void OElementExport::implEndElement()
++ {
++ delete m_pXMLElement;
++ m_pXMLElement = NULL;
++ }
++
++ //---------------------------------------------------------------------
++ void OElementExport::exportServiceNameAttribute()
++ {
++ Reference< XPersistObject > xPersistence(m_xProps, UNO_QUERY);
++ if (!xPersistence.is())
++ {
++ OSL_ENSURE(sal_False, "OElementExport::exportServiceNameAttribute: no XPersistObject!");
++ return;
++ }
++
++ ::rtl::OUString sServiceName = xPersistence->getServiceName();
++ // we don't want to write the old service name directly: it's a name used for compatibility reasons, but
++ // as we start some kind of new file format here (with this xml export), we don't care about
++ // compatibility ...
++ // So we translate the old persistence service name into new ones, if possible
++
++ ::rtl::OUString sToWriteServiceName = sServiceName;
++#define CHECK_N_TRANSLATE( name ) \
++ else if (0 == sServiceName.compareToAscii(SERVICE_PERSISTENT_COMPONENT_##name)) \
++ sToWriteServiceName = SERVICE_##name
++
++ if (sal_False)
++ ;
++ CHECK_N_TRANSLATE( FORM );
++ CHECK_N_TRANSLATE( FORM );
++ CHECK_N_TRANSLATE( LISTBOX );
++ CHECK_N_TRANSLATE( COMBOBOX );
++ CHECK_N_TRANSLATE( RADIOBUTTON );
++ CHECK_N_TRANSLATE( GROUPBOX );
++ CHECK_N_TRANSLATE( FIXEDTEXT );
++ CHECK_N_TRANSLATE( COMMANDBUTTON );
++ CHECK_N_TRANSLATE( CHECKBOX );
++ CHECK_N_TRANSLATE( GRID );
++ CHECK_N_TRANSLATE( IMAGEBUTTON );
++ CHECK_N_TRANSLATE( FILECONTROL );
++ CHECK_N_TRANSLATE( TIMEFIELD );
++ CHECK_N_TRANSLATE( DATEFIELD );
++ CHECK_N_TRANSLATE( NUMERICFIELD );
++ CHECK_N_TRANSLATE( CURRENCYFIELD );
++ CHECK_N_TRANSLATE( PATTERNFIELD );
++ CHECK_N_TRANSLATE( HIDDENCONTROL );
++ CHECK_N_TRANSLATE( IMAGECONTROL );
++ CHECK_N_TRANSLATE( FORMATTEDFIELD );
++ else if (0 == sServiceName.compareToAscii(SERVICE_PERSISTENT_COMPONENT_EDIT))
++ { // special handling for the edit field: we have two controls using this as persistence service name
++ sToWriteServiceName = SERVICE_EDIT;
++ Reference< XServiceInfo > xSI(m_xProps, UNO_QUERY);
++ if (xSI.is() && xSI->supportsService(SERVICE_FORMATTEDFIELD))
++ sToWriteServiceName = SERVICE_FORMATTEDFIELD;
++ }
++#if OSL_DEBUG_LEVEL > 0
++ Reference< XServiceInfo > xSI(m_xProps, UNO_QUERY);
++ OSL_ENSURE(xSI.is() && xSI->supportsService(sToWriteServiceName),
++ "OElementExport::exportServiceNameAttribute: wrong service name translation!");
++
++#endif
++ sToWriteServiceName =
++ m_rContext.getGlobalContext().GetNamespaceMap().GetQNameByKey(
++ XML_NAMESPACE_OOO, sToWriteServiceName );
++
++ // now write this
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_SERVICE_NAME),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_SERVICE_NAME),
++ sToWriteServiceName);
++ }
++
++ //---------------------------------------------------------------------
++ void OElementExport::exportEvents()
++ {
++ if (!m_aEvents.getLength())
++ // nothing to do
++ return;
++
++ Reference< XNameReplace > xWrapper = new OEventDescriptorMapper(m_aEvents);
++ m_rContext.getGlobalContext().GetEventExport().Export(xWrapper);
++ }
++
++ //=====================================================================
++ //= OControlExport
++ //=====================================================================
++ //---------------------------------------------------------------------
++ OControlExport::OControlExport(IFormsExportContext& _rContext, const Reference< XPropertySet >& _rxControl,
++ const ::rtl::OUString& _rControlId, const ::rtl::OUString& _rReferringControls,
++ const Sequence< ScriptEventDescriptor >& _rEvents)
++ :OElementExport(_rContext, _rxControl, _rEvents)
++ ,m_sControlId(_rControlId)
++ ,m_sReferringControls(_rReferringControls)
++ ,m_nClassId(FormComponentType::CONTROL)
++ ,m_eType( UNKNOWN )
++ ,m_nIncludeCommon(0)
++ ,m_nIncludeDatabase(0)
++ ,m_nIncludeSpecial(0)
++ ,m_nIncludeEvents(0)
++ ,m_nIncludeBindings(0)
++ ,m_pOuterElement(NULL)
++ {
++ OSL_ENSURE(m_xProps.is(), "OControlExport::OControlExport: invalid arguments!");
++ }
++
++ //---------------------------------------------------------------------
++ OControlExport::~OControlExport()
++ {
++ implEndElement();
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportOuterAttributes()
++ {
++ // the control id
++ if (CCA_NAME & m_nIncludeCommon)
++ {
++ exportStringPropertyAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_NAME),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_NAME),
++ PROPERTY_NAME
++ );
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_NAME;
++ #endif
++ }
++
++ // the service name
++ if (m_nIncludeCommon & CCA_SERVICE_NAME)
++ {
++ exportServiceNameAttribute();
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_SERVICE_NAME;
++ #endif
++ }
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportInnerAttributes()
++ {
++ // the control id
++ if (CCA_CONTROL_ID & m_nIncludeCommon)
++ {
++ OSL_ENSURE(m_sControlId.getLength(), "OControlExport::exportOuterAttributes: have no control id for the control!");
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_CONTROL_ID),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_CONTROL_ID),
++ m_sControlId);
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_CONTROL_ID;
++ #endif
++ }
++
++ // common control attributes
++ exportCommonControlAttributes();
++
++ // common database attributes
++ exportDatabaseAttributes();
++
++ // attributes related to external bindings
++ exportBindingAtributes();
++
++ // attributes special to the respective control type
++ exportSpecialAttributes();
++
++ // add the style references to the attributes
++ flagStyleProperties();
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportAttributes()
++ {
++ exportOuterAttributes();
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportSubTags() throw (Exception)
++ {
++ // for the upcoming exportRemainingProperties:
++ // if a control has the LabelControl property, this is not stored with the control itself, but instead with
++ // the control which is referenced by this property. As the base class' exportRemainingProperties doesn't
++ // know anything about this, we need to prevent that it tries to export this property
++ exportedProperty(PROPERTY_CONTROLLABEL);
++
++ // if it's a control supporting XText, then we need to declare all text-related properties
++ // as "already exported". This prevents them from being exported as generic "form:property"-tags.
++ // *If* we would export them this way, they would be completely superfluous, and sometimes even
++ // disastrous, since they may, at import time, override paragraph properties which already have
++ // been set before
++ Reference< XText > xControlText( m_xProps, UNO_QUERY );
++ if ( xControlText.is() )
++ {
++ const XMLPropertyMapEntry* pCharAttributeProperties = XMLTextPropertySetMapper::getPropertyMapForType( TEXT_PROP_MAP_TEXT );
++ while ( pCharAttributeProperties->msApiName )
++ {
++ exportedProperty( ::rtl::OUString::createFromAscii( pCharAttributeProperties->msApiName ) );
++ ++pCharAttributeProperties;
++ }
++
++ const XMLPropertyMapEntry* pParaAttributeProperties = XMLTextPropertySetMapper::getPropertyMapForType( TEXT_PROP_MAP_SHAPE_PARA );
++ while ( pParaAttributeProperties->msApiName )
++ {
++ exportedProperty( ::rtl::OUString::createFromAscii( pParaAttributeProperties->msApiName ) );
++ ++pParaAttributeProperties;
++ }
++
++ // the RichText property is not exported. The presence of the text:p element
++ // will be used - upon reading - as indicator for the value of the RichText property
++ exportedProperty( PROPERTY_RICH_TEXT );
++
++ // strange thing: paragraphs support both a CharStrikeout and a CharCrossedOut property
++ // The former is a short/enum value, the latter a boolean. The former has a real meaning
++ // (the strikeout type), the latter hasn't. But, when the CharCrossedOut is exported and
++ // later on imported, it overwrites anything which has previously been imported for
++ // CharStrikeout.
++ // 2004-04-14 - #i27729# - fs openoffice org
++ exportedProperty( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CharCrossedOut" ) ) );
++ }
++
++ if ( m_eType == LISTBOX )
++ {
++ // will be exported in exportListSourceAsElements:
++ if ( controlHasUserSuppliedListEntries() )
++ exportedProperty( PROPERTY_DEFAULT_SELECT_SEQ );
++
++ // will not be exported in a generic way. Either exportListSourceAsElements cares
++ // for them, or we don't need them
++ exportedProperty( PROPERTY_STRING_ITEM_LIST );
++ exportedProperty( PROPERTY_VALUE_SEQ );
++ exportedProperty( PROPERTY_SELECT_SEQ );
++ exportedProperty( PROPERTY_LISTSOURCE );
++ }
++ if ( m_eType == COMBOBOX )
++ exportedProperty( PROPERTY_STRING_ITEM_LIST );
++
++ // let the base class export the remaining properties and the events
++ OElementExport::exportSubTags();
++
++ // special sub tags for some controls
++ switch (m_eType)
++ {
++ case LISTBOX:
++ // don't export the list entries if the are not provided by the user, but obtained implicitly
++ // from other sources
++ // #i26944# - 2004-05-17 - fs openoffice org
++ if ( controlHasUserSuppliedListEntries() )
++ exportListSourceAsElements();
++ break;
++ case GRID:
++ { // a grid control requires us to store all columns as sub elements
++ Reference< XIndexAccess > xColumnContainer(m_xProps, UNO_QUERY);
++ OSL_ENSURE(xColumnContainer.is(), "OControlExport::exportSubTags: a grid control which is no IndexAccess?!!");
++ if (xColumnContainer.is())
++ m_rContext.exportCollectionElements(xColumnContainer);
++ }
++ break;
++ case COMBOBOX:
++ { // a combox box description has sub elements: the items
++ DBG_CHECK_PROPERTY( PROPERTY_STRING_ITEM_LIST, Sequence< ::rtl::OUString > );
++
++ // don't export the list entries if the are not provided by the user, but obtained implicitly
++ // from other sources
++ // #i26944# - 2004-05-17 - fs openoffice org
++ if ( controlHasUserSuppliedListEntries() )
++ {
++ // get the item list
++ Sequence< ::rtl::OUString > aListItems;
++ m_xProps->getPropertyValue(PROPERTY_STRING_ITEM_LIST) >>= aListItems;
++ // loop through it and write the sub elements
++ const ::rtl::OUString* pListItems = aListItems.getConstArray();
++ for (sal_Int32 i=0; i<aListItems.getLength(); ++i, ++pListItems)
++ {
++ m_rContext.getGlobalContext().ClearAttrList();
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_LABEL),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_LABEL),
++ *pListItems);
++ SvXMLElementExport aFormElement(m_rContext.getGlobalContext(), XML_NAMESPACE_FORM, "item", sal_True, sal_True);
++ }
++ }
++ }
++ break;
++
++ case TEXT_AREA:
++ {
++ // if we act as rich text control, we need to export some text:p elements
++ if ( xControlText.is() )
++ {
++ sal_Bool bActingAsRichText = sal_False;
++ if ( m_xPropertyInfo->hasPropertyByName( PROPERTY_RICH_TEXT ) )
++ {
++ OSL_VERIFY(m_xProps->getPropertyValue( PROPERTY_RICH_TEXT ) >>= bActingAsRichText );
++ }
++
++ if ( bActingAsRichText )
++ m_rContext.getGlobalContext().GetTextParagraphExport()->exportText( xControlText );
++ }
++ }
++ break;
++ default:
++ // nothing do to
++ break;
++ }
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportCommonControlAttributes()
++ {
++ size_t i=0;
++
++ // I decided to handle all the properties here with some static arrays describing the property-attribute
++ // relations. This leads to somewhat ugly code :), but the only alternative I can think of right now
++ // would require maps and O(log n) searches, which seems somewhat expensive as this code is used
++ // very frequently.
++
++ // the extra indents for the respective blocks are to ensure that there is no copy'n'paste error, using
++ // map identifiers from the wrong block
++
++ // --------------------------------------------------------------------
++ // some string properties
++ {
++ // the attribute ids of all properties which are expected to be of type string
++ static sal_Int32 nStringPropertyAttributeIds[] =
++ {
++ CCA_LABEL, CCA_TITLE
++ };
++ // the names of all properties which are expected to be of type string
++ static ::rtl::OUString aStringPropertyNames[] =
++ {
++ PROPERTY_LABEL, PROPERTY_TITLE
++ };
++ OSL_ENSURE( sizeof(aStringPropertyNames)/sizeof(aStringPropertyNames[0]) ==
++ sizeof(nStringPropertyAttributeIds)/sizeof(nStringPropertyAttributeIds[0]),
++ "OControlExport::exportCommonControlAttributes: somebody tampered with the maps (1)!");
++
++ for (i=0; i<sizeof(nStringPropertyAttributeIds)/sizeof(nStringPropertyAttributeIds[0]); ++i)
++ if (nStringPropertyAttributeIds[i] & m_nIncludeCommon)
++ {
++ exportStringPropertyAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(nStringPropertyAttributeIds[i]),
++ OAttributeMetaData::getCommonControlAttributeName(nStringPropertyAttributeIds[i]),
++ aStringPropertyNames[i]
++ );
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~nStringPropertyAttributeIds[i];
++ #endif
++ }
++ }
++
++ // --------------------------------------------------------------------
++ // some boolean properties
++ {
++ static sal_Int32 nBooleanPropertyAttributeIds[] =
++ { // attribute flags
+ CCA_CURRENT_SELECTED, CCA_DISABLED, CCA_DROPDOWN, CCA_PRINTABLE, CCA_READONLY, CCA_SELECTED, CCA_TAB_STOP, CCA_ENABLEVISIBLE
- };
- static const ::rtl::OUString* pBooleanPropertyNames[] =
- { // property names
-- &PROPERTY_STATE, &PROPERTY_ENABLED, &PROPERTY_DROPDOWN, &PROPERTY_PRINTABLE, &PROPERTY_READONLY, &PROPERTY_DEFAULT_STATE, &PROPERTY_TABSTOP
++ };
++ static const ::rtl::OUString* pBooleanPropertyNames[] =
++ { // property names
+ &PROPERTY_STATE, &PROPERTY_ENABLED, &PROPERTY_DROPDOWN, &PROPERTY_PRINTABLE, &PROPERTY_READONLY, &PROPERTY_DEFAULT_STATE, &PROPERTY_TABSTOP, &PROPERTY_ENABLEVISIBLE
- };
- static sal_Bool nBooleanPropertyAttrFlags[] =
- { // attribute defaults
-- BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_FALSE | BOOLATTR_INVERSE_SEMANTICS, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_VOID
++ };
++ static sal_Bool nBooleanPropertyAttrFlags[] =
++ { // attribute defaults
+ BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_FALSE | BOOLATTR_INVERSE_SEMANTICS, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_VOID, BOOLATTR_DEFAULT_FALSE
- };
- #if OSL_DEBUG_LEVEL > 0
- sal_Int32 nIdCount = sizeof(nBooleanPropertyAttributeIds) / sizeof(nBooleanPropertyAttributeIds[0]);
---- toolkit/inc/toolkit/helper/property.hxx.orig 2008-06-04 11:58:16.000000000 +0800
-+++ toolkit/inc/toolkit/helper/property.hxx 2008-06-04 11:59:31.000000000 +0800
++ };
++ #if OSL_DEBUG_LEVEL > 0
++ sal_Int32 nIdCount = sizeof(nBooleanPropertyAttributeIds) / sizeof(nBooleanPropertyAttributeIds[0]);
++ sal_Int32 nNameCount = sizeof(pBooleanPropertyNames) / sizeof(pBooleanPropertyNames[0]);
++ sal_Int32 nFlagsCount = sizeof(nBooleanPropertyAttrFlags) / sizeof(nBooleanPropertyAttrFlags[0]);
++ OSL_ENSURE((nIdCount == nNameCount) && (nNameCount == nFlagsCount),
++ "OControlExport::exportCommonControlAttributes: somebody tampered with the maps (2)!");
++ #endif
++ for (i=0; i<sizeof(nBooleanPropertyAttributeIds)/sizeof(nBooleanPropertyAttributeIds[0]); ++i)
++ if (nBooleanPropertyAttributeIds[i] & m_nIncludeCommon)
++ {
++ exportBooleanPropertyAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(nBooleanPropertyAttributeIds[i]),
++ OAttributeMetaData::getCommonControlAttributeName(nBooleanPropertyAttributeIds[i]),
++ *(pBooleanPropertyNames[i]),
++ nBooleanPropertyAttrFlags[i]);
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~nBooleanPropertyAttributeIds[i];
++ #endif
++ }
++ }
++
++
++ // --------------------------------------------------------------------
++ // some integer properties
++ {
++ // now the common handling
++ static sal_Int32 nIntegerPropertyAttributeIds[] =
++ { // attribute flags
++ CCA_SIZE, CCA_TAB_INDEX
++ };
++ static const ::rtl::OUString* pIntegerPropertyNames[] =
++ { // property names
++ &PROPERTY_LINECOUNT, &PROPERTY_TABINDEX
++ };
++ static const sal_Int16 nIntegerPropertyAttrDefaults[] =
++ { // attribute defaults
++ 5, 0
++ };
++
++ if ( m_nIncludeCommon & CCA_MAX_LENGTH )
++ exportedProperty(PROPERTY_MAXTEXTLENGTH);
++
++ #if OSL_DEBUG_LEVEL > 0
++ sal_Int32 nIdCount = sizeof(nIntegerPropertyAttributeIds) / sizeof(nIntegerPropertyAttributeIds[0]);
++ sal_Int32 nNameCount = sizeof(pIntegerPropertyNames) / sizeof(pIntegerPropertyNames[0]);
++ sal_Int32 nDefaultCount = sizeof(nIntegerPropertyAttrDefaults) / sizeof(nIntegerPropertyAttrDefaults[0]);
++ OSL_ENSURE((nIdCount == nNameCount) && (nNameCount == nDefaultCount),
++ "OControlExport::exportCommonControlAttributes: somebody tampered with the maps (3)!");
++ #endif
++ for (i=0; i<sizeof(nIntegerPropertyAttributeIds)/sizeof(nIntegerPropertyAttributeIds[0]); ++i)
++ if (nIntegerPropertyAttributeIds[i] & m_nIncludeCommon)
++ {
++ exportInt16PropertyAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(nIntegerPropertyAttributeIds[i]),
++ OAttributeMetaData::getCommonControlAttributeName(nIntegerPropertyAttributeIds[i]),
++ *(pIntegerPropertyNames[i]),
++ nIntegerPropertyAttrDefaults[i]);
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~nIntegerPropertyAttributeIds[i];
++ #endif
++ }
++
++
++ }
++
++ // --------------------------------------------------------------------
++ // some enum properties
++ {
++ if (m_nIncludeCommon & CCA_BUTTON_TYPE)
++ {
++ exportEnumPropertyAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_BUTTON_TYPE),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_BUTTON_TYPE),
++ PROPERTY_BUTTONTYPE,
++ OEnumMapper::getEnumMap(OEnumMapper::epButtonType),
++ FormButtonType_PUSH);
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_BUTTON_TYPE;
++ #endif
++ }
++ if ( m_nIncludeCommon & CCA_ORIENTATION )
++ {
++ exportEnumPropertyAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace( CCA_ORIENTATION ),
++ OAttributeMetaData::getCommonControlAttributeName( CCA_ORIENTATION ),
++ PROPERTY_ORIENTATION,
++ OEnumMapper::getEnumMap( OEnumMapper::epOrientation ),
++ ScrollBarOrientation::HORIZONTAL
++ );
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_ORIENTATION;
++ #endif
++ }
++
++ if ( m_nIncludeCommon & CCA_VISUAL_EFFECT )
++ {
++ exportEnumPropertyAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace( CCA_VISUAL_EFFECT ),
++ OAttributeMetaData::getCommonControlAttributeName( CCA_VISUAL_EFFECT ),
++ PROPERTY_VISUAL_EFFECT,
++ OEnumMapper::getEnumMap( OEnumMapper::epVisualEffect ),
++ VisualEffect::LOOK3D
++ );
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_VISUAL_EFFECT;
++ #endif
++ }
++ }
++
++ // --------------------------------------------------------------------
++ // some properties which require a special handling
++
++ // the target frame
++ if (m_nIncludeCommon & CCA_TARGET_FRAME)
++ {
++ exportTargetFrameAttribute();
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_TARGET_FRAME;
++ #endif
++ }
++
++ // max text length
++ if ( m_nIncludeCommon & CCA_MAX_LENGTH )
++ {
++ // normally, the respective property would be "MaxTextLen"
++ // However, if the model has a property "PersistenceMaxTextLength", then we prefer this
++
++ // determine the name of the property to export
++ ::rtl::OUString sTextLenPropertyName( PROPERTY_MAXTEXTLENGTH );
++ if ( m_xPropertyInfo->hasPropertyByName( PROPERTY_PERSISTENCE_MAXTEXTLENGTH ) )
++ sTextLenPropertyName = PROPERTY_PERSISTENCE_MAXTEXTLENGTH;
++
++ // export it
++ exportInt16PropertyAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace( CCA_MAX_LENGTH ),
++ OAttributeMetaData::getCommonControlAttributeName( CCA_MAX_LENGTH ),
++ sTextLenPropertyName,
++ 0
++ );
++
++ // in either way, both properties count as "exported"
++ exportedProperty( PROPERTY_MAXTEXTLENGTH );
++ exportedProperty( PROPERTY_PERSISTENCE_MAXTEXTLENGTH );
++
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_MAX_LENGTH;
++ #endif
++ }
++
++ if (m_nIncludeCommon & CCA_TARGET_LOCATION)
++ {
++ exportTargetLocationAttribute();
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_TARGET_LOCATION;
++ #endif
++ }
++
++ // OJ #99721#
++ if (m_nIncludeCommon & CCA_IMAGE_DATA)
++ {
++ exportImageDataAttribute();
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_IMAGE_DATA;
++ #endif
++ }
++
++ // the for attribute
++ // the target frame
++ if (m_nIncludeCommon & CCA_FOR)
++ {
++ if (m_sReferringControls.getLength())
++ { // there is at least one control referring to the one we're handling currently
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_FOR),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_FOR),
++ m_sReferringControls);
++ }
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~CCA_FOR;
++ #endif
++ }
++
++ if ((CCA_CURRENT_VALUE | CCA_VALUE) & m_nIncludeCommon)
++ {
++ const sal_Char* pCurrentValuePropertyName = NULL;
++ const sal_Char* pValuePropertyName = NULL;
++
++ // get the property names
++ getValuePropertyNames(m_eType, m_nClassId, pCurrentValuePropertyName, pValuePropertyName);
++
++ static const sal_Char* pCurrentValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_VALUE);
++ static const sal_Char* pValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_VALUE);
++ static const sal_uInt16 nCurrentValueAttributeNamespaceKey = OAttributeMetaData::getCommonControlAttributeNamespace(CCA_CURRENT_VALUE);
++ static const sal_uInt16 nValueAttributeNamespaceKey = OAttributeMetaData::getCommonControlAttributeNamespace(CCA_VALUE);
++
++ // add the atrtributes if necessary and possible
++ if (pCurrentValuePropertyName && (CCA_CURRENT_VALUE & m_nIncludeCommon))
++ {
++ // don't export the current-value if this value originates from a data binding
++ // #i26944# - 2004-05-17 - fs openoffice org
++ if ( controlHasActiveDataBinding() )
++ exportedProperty( ::rtl::OUString::createFromAscii( pCurrentValuePropertyName ) );
++ else
++ exportGenericPropertyAttribute(
++ nCurrentValueAttributeNamespaceKey,
++ pCurrentValueAttributeName,
++ pCurrentValuePropertyName
++ );
++ }
++
++ if (pValuePropertyName && (CCA_VALUE & m_nIncludeCommon))
++ exportGenericPropertyAttribute(
++ nValueAttributeNamespaceKey,
++ pValueAttributeName,
++ pValuePropertyName);
++
++ OSL_ENSURE((NULL == pValuePropertyName) == (0 == (CCA_VALUE & m_nIncludeCommon)),
++ "OControlExport::exportCommonControlAttributes: no property found for the value attribute!");
++ OSL_ENSURE((NULL == pCurrentValuePropertyName ) == (0 == (CCA_CURRENT_VALUE & m_nIncludeCommon)),
++ "OControlExport::exportCommonControlAttributes: no property found for the current-value attribute!");
++
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeCommon = m_nIncludeCommon & ~(CCA_CURRENT_VALUE | CCA_VALUE);
++ #endif
++ }
++
++ OSL_ENSURE(0 == m_nIncludeCommon,
++ "OControlExport::exportCommonControlAttributes: forgot some flags!");
++ // in the dbg_util version, we should have removed every bit we handled from the mask, so it should
++ // be 0 now ...
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportDatabaseAttributes()
++ {
++#if OSL_DEBUG_LEVEL > 0
++ sal_Int32 nIncludeDatabase = m_nIncludeDatabase;
++#endif
++ // the only string property: DataField
++ if (DA_DATA_FIELD & m_nIncludeDatabase)
++ {
++ exportStringPropertyAttribute(
++ OAttributeMetaData::getDatabaseAttributeNamespace(DA_DATA_FIELD),
++ OAttributeMetaData::getDatabaseAttributeName(DA_DATA_FIELD),
++ PROPERTY_DATAFIELD);
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ nIncludeDatabase = nIncludeDatabase & ~DA_DATA_FIELD;
++ #endif
++ }
++
++ // the only int16 property: BoundColumn
++ if (DA_BOUND_COLUMN & m_nIncludeDatabase)
++ {
++ exportInt16PropertyAttribute(
++ OAttributeMetaData::getDatabaseAttributeNamespace(DA_BOUND_COLUMN),
++ OAttributeMetaData::getDatabaseAttributeName(DA_BOUND_COLUMN),
++ PROPERTY_BOUNDCOLUMN,
++ 0);
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ nIncludeDatabase = nIncludeDatabase & ~DA_BOUND_COLUMN;
++ #endif
++ }
++
++ // the only boolean property: ConvertEmptyToNull
++ if (DA_CONVERT_EMPTY & m_nIncludeDatabase)
++ {
++ exportBooleanPropertyAttribute(
++ OAttributeMetaData::getDatabaseAttributeNamespace(DA_CONVERT_EMPTY),
++ OAttributeMetaData::getDatabaseAttributeName(DA_CONVERT_EMPTY),
++ PROPERTY_EMPTY_IS_NULL,
++ BOOLATTR_DEFAULT_FALSE
++ );
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ nIncludeDatabase = nIncludeDatabase & ~DA_CONVERT_EMPTY;
++ #endif
++ }
++
++ // the only enum property: ListSourceType
++ if (DA_LIST_SOURCE_TYPE & m_nIncludeDatabase)
++ {
++ exportEnumPropertyAttribute(
++ OAttributeMetaData::getDatabaseAttributeNamespace(DA_LIST_SOURCE_TYPE),
++ OAttributeMetaData::getDatabaseAttributeName(DA_LIST_SOURCE_TYPE),
++ PROPERTY_LISTSOURCETYPE,
++ OEnumMapper::getEnumMap(OEnumMapper::epListSourceType),
++ ListSourceType_VALUELIST
++ );
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ nIncludeDatabase = nIncludeDatabase & ~DA_LIST_SOURCE_TYPE;
++ #endif
++ }
++
++ if (m_nIncludeDatabase & DA_LIST_SOURCE)
++ {
++ exportListSourceAsAttribute();
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ nIncludeDatabase = nIncludeDatabase & ~DA_LIST_SOURCE;
++ #endif
++ }
++
++#if OSL_DEBUG_LEVEL > 0
++ OSL_ENSURE(0 == nIncludeDatabase,
++ "OControlExport::exportDatabaseAttributes: forgot some flags!");
++ // in the dbg_util version, we should have removed every bit we handled from the mask, so it should
++ // be 0 now ...
++#endif
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportBindingAtributes()
++ {
++#if OSL_DEBUG_LEVEL > 0
++ sal_Int32 nIncludeBinding = m_nIncludeBindings;
++#endif
++
++ // ....................................................
++ if ( m_nIncludeBindings & BA_LINKED_CELL )
++ {
++ exportCellBindingAttributes( ( m_nIncludeBindings & BA_LIST_LINKING_TYPE ) != 0 );
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ nIncludeBinding = nIncludeBinding & ~( BA_LINKED_CELL | BA_LIST_LINKING_TYPE );
++ #endif
++ }
++
++ // ....................................................
++ if ( m_nIncludeBindings & BA_LIST_CELL_RANGE )
++ {
++ exportCellListSourceRange();
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ nIncludeBinding = nIncludeBinding & ~BA_LIST_CELL_RANGE;
++ #endif
++ }
++
++ if ( m_nIncludeBindings & BA_XFORMS_BIND )
++ {
++ exportXFormsBindAttributes();
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ nIncludeBinding = nIncludeBinding & ~BA_XFORMS_BIND;
++ #endif
++ }
++
++ if ( m_nIncludeBindings & BA_XFORMS_LISTBIND )
++ {
++ exportXFormsListAttributes();
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ nIncludeBinding = nIncludeBinding & ~BA_XFORMS_LISTBIND;
++ #endif
++ }
++
++ if ( m_nIncludeBindings & BA_XFORMS_SUBMISSION )
++ {
++ exportXFormsSubmissionAttributes();
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ nIncludeBinding = nIncludeBinding & ~BA_XFORMS_SUBMISSION;
++ #endif
++ }
++
++ OSL_ENSURE( 0 == nIncludeBinding,
++ "OControlExport::exportBindingAtributes: forgot some flags!");
++ // in the debug version, we should have removed every bit we handled from the mask, so it should
++ // be 0 now ...
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportSpecialAttributes()
++ {
++ sal_Int32 i=0;
++
++ // ----------------------
++ // the boolean properties
++ {
++ static const sal_Int32 nBooleanPropertyAttributeIds[] =
++ { // attribute flags
++ SCA_VALIDATION, SCA_MULTI_LINE, SCA_AUTOMATIC_COMPLETION, SCA_MULTIPLE, SCA_DEFAULT_BUTTON, SCA_IS_TRISTATE,
++ SCA_TOGGLE, SCA_FOCUS_ON_CLICK
++ };
++ static const ::rtl::OUString* pBooleanPropertyNames[] =
++ { // property names
++ &PROPERTY_STRICTFORMAT, &PROPERTY_MULTILINE, &PROPERTY_AUTOCOMPLETE, &PROPERTY_MULTISELECTION, &PROPERTY_DEFAULTBUTTON, &PROPERTY_TRISTATE,
++ &PROPERTY_TOGGLE, &PROPERTY_FOCUS_ON_CLICK
++ };
++ sal_Int32 nIdCount = sizeof(nBooleanPropertyAttributeIds) / sizeof(nBooleanPropertyAttributeIds[0]);
++ #if OSL_DEBUG_LEVEL > 0
++ sal_Int32 nNameCount = sizeof(pBooleanPropertyNames) / sizeof(pBooleanPropertyNames[0]);
++ OSL_ENSURE((nIdCount == nNameCount),
++ "OControlExport::exportSpecialAttributes: somebody tampered with the maps (1)!");
++ #endif
++ const sal_Int32* pAttributeId = nBooleanPropertyAttributeIds;
++ const ::rtl::OUString** pPropertyName = pBooleanPropertyNames;
++ for ( i = 0; i < nIdCount; ++i, ++pAttributeId, ++pPropertyName )
++ {
++ if ( *pAttributeId& m_nIncludeSpecial)
++ {
++ exportBooleanPropertyAttribute(
++ OAttributeMetaData::getSpecialAttributeNamespace( *pAttributeId ),
++ OAttributeMetaData::getSpecialAttributeName( *pAttributeId ),
++ *(*pPropertyName),
++ ( *pAttributeId == SCA_FOCUS_ON_CLICK ) ? BOOLATTR_DEFAULT_TRUE : BOOLATTR_DEFAULT_FALSE
++ );
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeSpecial = m_nIncludeSpecial & ~*pAttributeId;
++ #endif
++ }
++ }
++ }
++
++ // ----------------------
++ // the integer properties
++ {
++ static sal_Int32 nIntegerPropertyAttributeIds[] =
++ { // attribute flags
++ SCA_PAGE_STEP_SIZE
++ };
++ static const ::rtl::OUString* pIntegerPropertyNames[] =
++ { // property names
++ &PROPERTY_BLOCK_INCREMENT
++ };
++ static const sal_Int32 nIntegerPropertyAttrDefaults[] =
++ { // attribute defaults (XML defaults, not runtime defaults!)
++ 10
++ };
++
++ sal_Int32 nIdCount = sizeof( nIntegerPropertyAttributeIds ) / sizeof( nIntegerPropertyAttributeIds[0] );
++ #if OSL_DEBUG_LEVEL > 0
++ sal_Int32 nNameCount = sizeof( pIntegerPropertyNames ) / sizeof( pIntegerPropertyNames[0] );
++ OSL_ENSURE( ( nIdCount == nNameCount ),
++ "OControlExport::exportSpecialAttributes: somebody tampered with the maps (2)!" );
++ sal_Int32 nDefaultCount = sizeof( nIntegerPropertyAttrDefaults ) / sizeof( nIntegerPropertyAttrDefaults[0] );
++ OSL_ENSURE( ( nIdCount == nDefaultCount ),
++ "OControlExport::exportSpecialAttributes: somebody tampered with the maps (3)!" );
++ #endif
++ for ( i = 0; i < nIdCount; ++i )
++ if ( nIntegerPropertyAttributeIds[i] & m_nIncludeSpecial )
++ {
++ exportInt32PropertyAttribute(
++ OAttributeMetaData::getSpecialAttributeNamespace( nIntegerPropertyAttributeIds[i] ),
++ OAttributeMetaData::getSpecialAttributeName( nIntegerPropertyAttributeIds[i] ),
++ *( pIntegerPropertyNames[i] ),
++ nIntegerPropertyAttrDefaults[i]
++ );
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeSpecial = m_nIncludeSpecial & ~nIntegerPropertyAttributeIds[i];
++ #endif
++ }
++
++ if ( SCA_STEP_SIZE & m_nIncludeSpecial )
++ {
++ ::rtl::OUString sPropertyName;
++ if ( m_xPropertyInfo->hasPropertyByName( PROPERTY_LINE_INCREMENT ) )
++ sPropertyName = PROPERTY_LINE_INCREMENT;
++ else if ( m_xPropertyInfo->hasPropertyByName( PROPERTY_SPIN_INCREMENT ) )
++ sPropertyName = PROPERTY_SPIN_INCREMENT;
++ else
++ OSL_ENSURE( sal_False, "OControlExport::exportSpecialAttributes: not property which can be mapped to step-size attribute!" );
++
++ if ( sPropertyName.getLength() )
++ exportInt32PropertyAttribute(
++ OAttributeMetaData::getSpecialAttributeNamespace( SCA_STEP_SIZE ),
++ OAttributeMetaData::getSpecialAttributeName( SCA_STEP_SIZE ),
++ sPropertyName,
++ 1
++ );
++
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_STEP_SIZE;
++ #endif
++ }
++
++ }
++
++ // -------------------
++ // the enum properties
++ {
++ if (SCA_STATE & m_nIncludeSpecial)
++ {
++ exportEnumPropertyAttribute(
++ OAttributeMetaData::getSpecialAttributeNamespace(SCA_STATE),
++ OAttributeMetaData::getSpecialAttributeName(SCA_STATE),
++ PROPERTY_DEFAULT_STATE,
++ OEnumMapper::getEnumMap(OEnumMapper::epCheckState),
++ STATE_NOCHECK);
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_STATE;
++ #endif
++ }
++
++ if (SCA_CURRENT_STATE & m_nIncludeSpecial)
++ {
++ exportEnumPropertyAttribute(
++ OAttributeMetaData::getSpecialAttributeNamespace(SCA_CURRENT_STATE),
++ OAttributeMetaData::getSpecialAttributeName(SCA_CURRENT_STATE),
++ PROPERTY_STATE,
++ OEnumMapper::getEnumMap(OEnumMapper::epCheckState),
++ STATE_NOCHECK);
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_CURRENT_STATE;
++ #endif
++ }
++ }
++
++ // --------------------------------------------------------------------
++ // some properties which require a special handling
++ // the repeat delay
++ {
++ if ( m_nIncludeSpecial & SCA_REPEAT_DELAY )
++ {
++ DBG_CHECK_PROPERTY( PROPERTY_REPEAT_DELAY, sal_Int32 );
++
++ sal_Int32 nRepeatDelay = 0;
++ m_xProps->getPropertyValue( PROPERTY_REPEAT_DELAY ) >>= nRepeatDelay;
++ Time aTime;
++ aTime.MakeTimeFromMS( nRepeatDelay );
++
++ AddAttribute(OAttributeMetaData::getSpecialAttributeNamespace( SCA_REPEAT_DELAY )
++ ,OAttributeMetaData::getSpecialAttributeName( SCA_REPEAT_DELAY )
++ ,SvXMLUnitConverter::convertTimeDuration( aTime, nRepeatDelay % 1000 ) );
++
++ exportedProperty( PROPERTY_REPEAT_DELAY );
++
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_REPEAT_DELAY;
++ #endif
++ }
++ }
++
++ // ----------------------------------
++ // the EchoChar property needs special handling, cause it's a Int16, but must be stored as one-character-string
++ {
++ if (SCA_ECHO_CHAR & m_nIncludeSpecial)
++ {
++ DBG_CHECK_PROPERTY( PROPERTY_ECHO_CHAR, sal_Int16 );
++ sal_Int16 nValue(0);
++ m_xProps->getPropertyValue(PROPERTY_ECHO_CHAR) >>= nValue;
++ if (nValue)
++ {
++ ::rtl::OUString sCharacter(reinterpret_cast<const sal_Unicode*>(&nValue), 1);
++ AddAttribute(
++ OAttributeMetaData::getSpecialAttributeNamespace(SCA_ECHO_CHAR),
++ OAttributeMetaData::getSpecialAttributeName(SCA_ECHO_CHAR),
++ sCharacter);
++ }
++ exportedProperty(PROPERTY_ECHO_CHAR);
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_ECHO_CHAR;
++ #endif
++ }
++ }
++
++ // ----------------------------------
++ if ((SCA_MIN_VALUE | SCA_MAX_VALUE) & m_nIncludeSpecial)
++ {
++ // need to export the min value and the max value as attributes
++ // It depends on the real type (FormComponentType) of the control, which properties hold these
++ // values
++ const sal_Char* pMinValuePropertyName = NULL;
++ const sal_Char* pMaxValuePropertyName = NULL;
++ getValueLimitPropertyNames(m_nClassId, pMinValuePropertyName, pMaxValuePropertyName);
++
++ OSL_ENSURE((NULL == pMinValuePropertyName) == (0 == (SCA_MIN_VALUE & m_nIncludeSpecial)),
++ "OControlExport::exportCommonControlAttributes: no property found for the min value attribute!");
++ OSL_ENSURE((NULL == pMaxValuePropertyName) == (0 == (SCA_MAX_VALUE & m_nIncludeSpecial)),
++ "OControlExport::exportCommonControlAttributes: no property found for the max value attribute!");
++
++ // add the two attributes
++ static const sal_Char* pMinValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCA_MIN_VALUE);
++ static const sal_Char* pMaxValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCA_MAX_VALUE);
++ static const sal_uInt16 nMinValueNamespaceKey = OAttributeMetaData::getSpecialAttributeNamespace(SCA_MIN_VALUE);
++ static const sal_uInt16 nMaxValueNamespaceKey = OAttributeMetaData::getSpecialAttributeNamespace(SCA_MAX_VALUE);
++
++ if (pMinValuePropertyName && (SCA_MIN_VALUE & m_nIncludeSpecial))
++ exportGenericPropertyAttribute(
++ nMinValueNamespaceKey,
++ pMinValueAttributeName,
++ pMinValuePropertyName);
++
++ if (pMaxValuePropertyName && (SCA_MAX_VALUE & m_nIncludeSpecial))
++ exportGenericPropertyAttribute(
++ nMaxValueNamespaceKey,
++ pMaxValueAttributeName,
++ pMaxValuePropertyName);
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeSpecial = m_nIncludeSpecial & ~(SCA_MIN_VALUE | SCA_MAX_VALUE);
++ #endif
++ }
++
++ // ----------------------------------
++ if ( SCA_IMAGE_POSITION & m_nIncludeSpecial )
++ {
++ exportImagePositionAttributes();
++
++ #if OSL_DEBUG_LEVEL > 0
++ // reset the bit for later checking
++ m_nIncludeSpecial = m_nIncludeSpecial & ~SCA_IMAGE_POSITION;
++ #endif
++ }
++
++ OSL_ENSURE(0 == m_nIncludeSpecial,
++ "OControlExport::exportSpecialAttributes: forgot some flags!");
++ // in the dbg_util version, we should have removed every bit we handled from the mask, so it should
++ // be 0 now ...
++ }
++
++ //---------------------------------------------------------------------
++ ::rtl::OUString OControlExport::getScalarListSourceValue() const
++ {
++ ::rtl::OUString sListSource;
++ Any aListSource = m_xProps->getPropertyValue( PROPERTY_LISTSOURCE );
++ if ( !( aListSource >>= sListSource ) )
++ {
++ Sequence< ::rtl::OUString > aListSourceSequence;
++ aListSource >>= aListSourceSequence;
++ if ( aListSourceSequence.getLength() )
++ sListSource = aListSourceSequence[ 0 ];
++ }
++ return sListSource;
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportListSourceAsAttribute()
++ {
++ // DA_LIST_SOURCE needs some special handling
++ DBG_CHECK_PROPERTY_NO_TYPE( PROPERTY_LISTSOURCE );
++
++ ::rtl::OUString sListSource = getScalarListSourceValue();
++ if ( sListSource.getLength() )
++ { // the ListSource property needs to be exported as attribute, and it is not empty
++ AddAttribute(
++ OAttributeMetaData::getDatabaseAttributeNamespace(DA_LIST_SOURCE),
++ OAttributeMetaData::getDatabaseAttributeName(DA_LIST_SOURCE),
++ sListSource);
++ }
++
++ exportedProperty( PROPERTY_LISTSOURCE );
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::getSequenceInt16PropertyAsSet(const ::rtl::OUString& _rPropertyName, Int16Set& _rOut)
++ {
++ Sequence< sal_Int16 > aValueSequence;
++ DBG_CHECK_PROPERTY(_rPropertyName, Sequence< sal_Int16 >);
++ m_xProps->getPropertyValue(_rPropertyName) >>= aValueSequence;
++
++ const sal_Int16* pValues = aValueSequence.getConstArray();
++ for (sal_Int32 i=0; i<aValueSequence.getLength(); ++i, ++pValues)
++ _rOut.insert(*pValues);
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportListSourceAsElements()
++ {
++ // the string lists
++ Sequence< ::rtl::OUString > aItems, aValues;
++ DBG_CHECK_PROPERTY( PROPERTY_STRING_ITEM_LIST, Sequence< ::rtl::OUString > );
++ m_xProps->getPropertyValue(PROPERTY_STRING_ITEM_LIST) >>= aItems;
++
++ DBG_CHECK_PROPERTY( PROPERTY_LISTSOURCE, Sequence< ::rtl::OUString > );
++ if ( 0 == ( m_nIncludeDatabase & DA_LIST_SOURCE ) )
++ m_xProps->getPropertyValue(PROPERTY_LISTSOURCE) >>= aValues;
++ // if we exported the list source as attribute, we do not repeat it as sub elements
++
++ // the selection lists
++ Int16Set aSelection, aDefaultSelection;
++ getSequenceInt16PropertyAsSet(PROPERTY_SELECT_SEQ, aSelection);
++ getSequenceInt16PropertyAsSet(PROPERTY_DEFAULT_SELECT_SEQ, aDefaultSelection);
++
++ // the string for "true"
++ ::rtl::OUString sTrue;
++ ::rtl::OUStringBuffer sBuffer;
++ m_rContext.getGlobalContext().GetMM100UnitConverter().convertBool(sBuffer, sal_True);
++ sTrue = sBuffer.makeStringAndClear();
++
++ // loop through both lists ('til the maximum of both lengths)
++ const ::rtl::OUString* pItems = aItems.getConstArray();
++ const ::rtl::OUString* pValues = aValues.getConstArray();
++
++ sal_Int32 nItems = aItems.getLength();
++ sal_Int32 nValues = aValues.getLength();
++
++ sal_Int16 nMaxLen = (sal_Int16)std::max(nItems, nValues);
++
++ for (sal_Int16 i=0; i<nMaxLen; ++i )
++ {
++ m_rContext.getGlobalContext().ClearAttrList();
++ if (i < nItems)
++ {
++ // there is an item at this position
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_LABEL),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_LABEL),
++ *pItems);
++ ++pItems;
++ }
++ if (i < nValues)
++ {
++ // there is an value at this position
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_VALUE),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_VALUE),
++ *pValues);
++ ++pValues;
++ }
++
++ Int16SetIterator aSelectedPos = aSelection.find(i);
++ if (aSelection.end() != aSelectedPos)
++ { // the item at this position is selected
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_CURRENT_SELECTED),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_SELECTED),
++ sTrue
++ );
++ aSelection.erase(aSelectedPos);
++ }
++
++ Int16SetIterator aDefaultSelectedPos = aDefaultSelection.find(i);
++ if (aDefaultSelection.end() != aDefaultSelectedPos)
++ { // the item at this position is selected as default
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_SELECTED),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_SELECTED),
++ sTrue
++ );
++ aDefaultSelection.erase(aDefaultSelectedPos);
++ }
++ SvXMLElementExport aFormElement(m_rContext.getGlobalContext(), XML_NAMESPACE_FORM, "option", sal_True, sal_True);
++ }
++
++ // There may be more "selected" or "default-selected" items than there are in the lists in real,
++ // so we need to store some additional "form:option" items which have no name and no label, but
++ // one or both of the selected flags.
++ // 21.05.2001 - 85388 - frank schoenheit germany sun com
++
++ if (aSelection.size() || aDefaultSelection.size())
++ {
++ sal_Int16 nLastSelected = -1;
++ if (aSelection.size())
++ nLastSelected = *(--aSelection.end());
++
++ sal_Int16 nLastDefaultSelected = -1;
++ if (aDefaultSelection.size())
++ nLastDefaultSelected = *(--aDefaultSelection.end());
++
++ // the maximum element in both sets
++ sal_Int16 nLastReferredEntry = std::max(nLastSelected, nLastDefaultSelected);
++ OSL_ENSURE(nLastReferredEntry >= nMaxLen, "OControlExport::exportListSourceAsElements: inconsistence!");
++ // if the maximum (selected or default selected) entry number is less than the maximum item count
++ // in both lists, the entry number should have been removed from the set
++
++ for (sal_Int16 i=nMaxLen; i<=nLastReferredEntry; ++i)
++ {
++ if (aSelection.end() != aSelection.find(i))
++ { // the (not existent) item at this position is selected
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_CURRENT_SELECTED),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_SELECTED),
++ sTrue
++ );
++ }
++
++ if (aDefaultSelection.end() != aDefaultSelection.find(i))
++ { // the (not existent) item at this position is selected as default
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_SELECTED),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_SELECTED),
++ sTrue
++ );
++ }
++ SvXMLElementExport aFormElement(m_rContext.getGlobalContext(), XML_NAMESPACE_FORM, "option", sal_True, sal_True);
++ }
++ }
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::implStartElement(const sal_Char* _pName)
++ {
++ // before we let the base class start it's outer element, we add a wrapper element
++ const sal_Char *pOuterElementName = getOuterXMLElementName();
++ m_pOuterElement = pOuterElementName
++ ? new SvXMLElementExport(
++ m_rContext.getGlobalContext(),
++ XML_NAMESPACE_FORM,
++ pOuterElementName, sal_True,
++ sal_True)
++ : 0;
++
++ // add the attributes for the inner element
++ exportInnerAttributes();
++
++ // and start the inner element
++ OElementExport::implStartElement(_pName);
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::implEndElement()
++ {
++ // end the inner element
++ OElementExport::implEndElement();
++
++ // end the outer element if it exists
++ delete m_pOuterElement;
++ m_pOuterElement = NULL;
++ }
++
++ //---------------------------------------------------------------------
++ const sal_Char* OControlExport::getOuterXMLElementName() const
++ {
++ return 0;
++ }
++
++ //---------------------------------------------------------------------
++ const sal_Char* OControlExport::getXMLElementName() const
++ {
++ return getElementName(m_eType);
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::examine()
++ {
++ OSL_ENSURE( ( m_nIncludeCommon == 0 ) && ( m_nIncludeSpecial == 0 ) && ( m_nIncludeDatabase == 0 )
++ && ( m_nIncludeEvents == 0 ) && ( m_nIncludeBindings == 0),
++ "OControlExport::examine: called me twice? Not initialized?" );
++
++ // get the class id to decide which kind of element we need in the XML stream
++ m_nClassId = FormComponentType::CONTROL;
++ DBG_CHECK_PROPERTY( PROPERTY_CLASSID, sal_Int16 );
++ m_xProps->getPropertyValue(PROPERTY_CLASSID) >>= m_nClassId;
++ switch (m_nClassId)
++ {
++ case FormComponentType::DATEFIELD:
++ case FormComponentType::TIMEFIELD:
++ case FormComponentType::NUMERICFIELD:
++ case FormComponentType::CURRENCYFIELD:
++ case FormComponentType::PATTERNFIELD:
++ m_eType = FORMATTED_TEXT;
++ // NO BREAK
++ case FormComponentType::TEXTFIELD:
++ { // it's some kind of edit. To know which type we need further investigation
++
++ if (FORMATTED_TEXT != m_eType)
++ { // not coming from the previous cases which had a class id .ne. TEXTFIELD
++
++ // check if it's a formatted field
++ if (m_xPropertyInfo->hasPropertyByName(PROPERTY_FORMATKEY))
++ {
++ m_eType = FORMATTED_TEXT;
++ }
++ else
++ {
++ // all other controls are represented by an ordinary edit control, but which XML control type
++ // it is depends on the current values of some properties
++
++ // if the EchoChar string is not empty, it is a password field
++ sal_Int16 nEchoChar = 0;
++ if (m_xPropertyInfo->hasPropertyByName(PROPERTY_ECHOCHAR))
++ // grid columns do not have this property ....
++ m_xProps->getPropertyValue(PROPERTY_ECHOCHAR) >>= nEchoChar;
++ if (nEchoChar)
++ {
++ m_eType = PASSWORD;
++ m_nIncludeSpecial |= SCA_ECHO_CHAR;
++ }
++ else
++ {
++ // if the MultiLine property is sal_True, it is a TextArea
++ sal_Bool bMultiLine = sal_False;
++ if (m_xPropertyInfo->hasPropertyByName(PROPERTY_MULTILINE))
++ // grid columns do not have this property ....
++ bMultiLine = ::cppu::any2bool(m_xProps->getPropertyValue(PROPERTY_MULTILINE));
++
++ if ( bMultiLine )
++ m_eType = TEXT_AREA;
++ else
++ // the only case left is represented by a Text element
++ m_eType = TEXT;
++ }
++ }
++ }
++
++ // attributes which are common to all the four types:
++ // common attributes
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_VALUE |
++ CCA_PRINTABLE | CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE;
++
++ // database attributes
++ m_nIncludeDatabase = DA_DATA_FIELD;
++
++ // event attributes
++ m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CHANGE | EA_ON_SELECT;
++
++ // only text and pattern fields have a ConvertEmptyToNull property
++ if ( ( m_nClassId == FormComponentType::TEXTFIELD )
++ || ( m_nClassId == FormComponentType::PATTERNFIELD )
++ )
++ m_nIncludeDatabase |= DA_CONVERT_EMPTY;
++
++ // all controls but the file control fields have a readonly property
++ if ( m_nClassId != FormComponentType::FILECONTROL )
++ m_nIncludeCommon |= CCA_READONLY;
++
++ // a text field has a max text len
++ if ( m_nClassId == FormComponentType::TEXTFIELD )
++ m_nIncludeCommon |= CCA_MAX_LENGTH;
++
++ // max and min values and validation:
++ if (FORMATTED_TEXT == m_eType)
++ { // in general all controls represented as formatted-text have these props
++ if (FormComponentType::PATTERNFIELD != m_nClassId)
++ // but the PatternField does not have value limits
++ m_nIncludeSpecial |= SCA_MAX_VALUE | SCA_MIN_VALUE;
++
++ if (FormComponentType::TEXTFIELD != m_nClassId)
++ // and the FormattedField does not have a validation flag
++ m_nIncludeSpecial |= SCA_VALIDATION;
++ }
++
++ // if it's not a password field or rich text control, the CurrentValue needs to be stored, too
++ if ( PASSWORD != m_eType )
++ m_nIncludeCommon |= CCA_CURRENT_VALUE;
++ }
++ break;
++
++ case FormComponentType::FILECONTROL:
++ m_eType = FILE;
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_CURRENT_VALUE | CCA_DISABLED |
++ CCA_PRINTABLE | CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE |
++ CCA_VALUE;
++ m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CHANGE | EA_ON_SELECT;
++ break;
++
++ case FormComponentType::FIXEDTEXT:
++ m_eType = FIXED_TEXT;
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_LABEL |
++ CCA_PRINTABLE | CCA_TITLE | CCA_FOR;
++ m_nIncludeSpecial = SCA_MULTI_LINE;
++ m_nIncludeEvents = EA_CONTROL_EVENTS;
++ break;
++
++ case FormComponentType::COMBOBOX:
++ m_eType = COMBOBOX;
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_CURRENT_VALUE |
++ CCA_DISABLED | CCA_DROPDOWN | CCA_MAX_LENGTH | CCA_PRINTABLE | CCA_READONLY | CCA_SIZE |
++ CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE | CCA_VALUE;
++ m_nIncludeSpecial = SCA_AUTOMATIC_COMPLETION;
++ m_nIncludeDatabase = DA_CONVERT_EMPTY | DA_DATA_FIELD | DA_LIST_SOURCE | DA_LIST_SOURCE_TYPE;
++ m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CHANGE | EA_ON_SELECT;
++ break;
++
++ case FormComponentType::LISTBOX:
++ m_eType = LISTBOX;
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_DROPDOWN |
++ CCA_PRINTABLE | CCA_SIZE | CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE;
++ m_nIncludeSpecial = SCA_MULTIPLE;
++ m_nIncludeDatabase = DA_BOUND_COLUMN | DA_DATA_FIELD | DA_LIST_SOURCE_TYPE;
++ m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CHANGE | EA_ON_CLICK | EA_ON_DBLCLICK;
++ // check if we need to export the ListSource as attribute
++ {
++ // for a list box, if the ListSourceType is VALUE_LIST, no ListSource is stored, but instead
++ // a sequence of pairs which is build from the StringItemList and the ValueList
++ ListSourceType eListSourceType = ListSourceType_VALUELIST;
++ #if OSL_DEBUG_LEVEL > 0
++ sal_Bool bSuccess =
++ #endif
++ m_xProps->getPropertyValue(PROPERTY_LISTSOURCETYPE) >>= eListSourceType;
++ OSL_ENSURE(bSuccess, "OControlExport::examineControl: could not retrieve the ListSourceType!");
++ if (ListSourceType_VALUELIST != eListSourceType)
++ {
++ m_nIncludeDatabase |= DA_LIST_SOURCE;
++ }
++ }
++
++ break;
++
++ case FormComponentType::COMMANDBUTTON:
++ m_eType = BUTTON;
++ m_nIncludeCommon |= CCA_TAB_STOP | CCA_LABEL;
++ m_nIncludeSpecial = SCA_DEFAULT_BUTTON | SCA_TOGGLE | SCA_FOCUS_ON_CLICK | SCA_IMAGE_POSITION | SCA_REPEAT_DELAY;
++ // NO BREAK !
++ case FormComponentType::IMAGEBUTTON:
++ if (BUTTON != m_eType)
++ // not coming from the previous case
++ m_eType = IMAGE;
++ m_nIncludeCommon |=
++ CCA_NAME | CCA_SERVICE_NAME | CCA_BUTTON_TYPE | CCA_DISABLED |
++ CCA_IMAGE_DATA | CCA_PRINTABLE | CCA_TAB_INDEX | CCA_TARGET_FRAME |
++ CCA_TARGET_LOCATION | CCA_TITLE;
++ m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CLICK | EA_ON_DBLCLICK;
++ break;
++
++ case FormComponentType::CHECKBOX:
++ m_eType = CHECKBOX;
++ m_nIncludeSpecial = SCA_CURRENT_STATE | SCA_IS_TRISTATE | SCA_STATE;
++ // NO BREAK !
++ case FormComponentType::RADIOBUTTON:
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_LABEL | CCA_PRINTABLE |
++ CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE | CCA_VALUE | CCA_VISUAL_EFFECT;
++ if (CHECKBOX != m_eType)
++ { // not coming from the previous case
++ m_eType = RADIO;
++ m_nIncludeCommon |= CCA_CURRENT_SELECTED | CCA_SELECTED;
++ }
++ if ( m_xPropertyInfo->hasPropertyByName( PROPERTY_IMAGE_POSITION ) )
++ m_nIncludeSpecial |= SCA_IMAGE_POSITION;
++ m_nIncludeDatabase = DA_DATA_FIELD;
++ m_nIncludeEvents = EA_CONTROL_EVENTS | EA_ON_CHANGE;
++ break;
++
++ case FormComponentType::GROUPBOX:
++ m_eType = FRAME;
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_LABEL |
++ CCA_PRINTABLE | CCA_TITLE | CCA_FOR;
++ m_nIncludeEvents = EA_CONTROL_EVENTS;
++ break;
++
++ case FormComponentType::IMAGECONTROL:
++ m_eType = IMAGE_FRAME;
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_IMAGE_DATA |
++ CCA_PRINTABLE | CCA_READONLY | CCA_TITLE;
++ m_nIncludeDatabase = DA_DATA_FIELD;
++ m_nIncludeEvents = EA_CONTROL_EVENTS;
++ break;
++
++ case FormComponentType::HIDDENCONTROL:
++ m_eType = HIDDEN;
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_VALUE;
++ break;
++
++ case FormComponentType::GRIDCONTROL:
++ m_eType = GRID;
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_PRINTABLE |
++ CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE;
++ m_nIncludeEvents = EA_CONTROL_EVENTS;
++ break;
++
++ case FormComponentType::SCROLLBAR:
++ case FormComponentType::SPINBUTTON:
++ m_eType = VALUERANGE;
++ m_nIncludeCommon =
++ CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_PRINTABLE |
++ CCA_TITLE | CCA_CURRENT_VALUE | CCA_VALUE | CCA_ORIENTATION;
++ m_nIncludeSpecial = SCA_MAX_VALUE | SCA_STEP_SIZE | SCA_MIN_VALUE | SCA_REPEAT_DELAY;
++
++ if ( m_nClassId == FormComponentType::SCROLLBAR )
++ m_nIncludeSpecial |= SCA_PAGE_STEP_SIZE ;
++
++ m_nIncludeEvents = EA_CONTROL_EVENTS;
++ break;
++
++ default:
++ OSL_ENSURE(sal_False, "OControlExport::examineControl: unknown control type (class id)!");
++ // NO break!
++
++ case FormComponentType::NAVIGATIONBAR:
++ // TODO: should we have an own file format for this?
++ // NO break
++
++ case FormComponentType::CONTROL:
++ m_eType = GENERIC_CONTROL;
++ // unknown control type
++ m_nIncludeCommon = CCA_NAME | CCA_SERVICE_NAME;
++ // at least a name should be there, 'cause without a name the control could never have been
++ // inserted into it's parent container
++ // In addition, the service name is absolutely necessary to create the control upon reading.
++ m_nIncludeEvents = EA_CONTROL_EVENTS;
++ // we always should be able to export events - this is not control type dependent
++ break;
++ }
++
++ // in general, all control types need to export the control id
++ m_nIncludeCommon |= CCA_CONTROL_ID;
++
++ // is is a control bound to a calc cell?
++ if ( FormCellBindingHelper::livesInSpreadsheetDocument( m_xProps ) )
++ {
++ FormCellBindingHelper aHelper( m_xProps, NULL );
++ {
++ if ( aHelper.isCellBinding( aHelper.getCurrentBinding( ) ) )
++ {
++ m_nIncludeBindings |= BA_LINKED_CELL;
++ if ( m_nClassId == FormComponentType::LISTBOX )
++ m_nIncludeBindings |= BA_LIST_LINKING_TYPE;
++ }
++ }
++
++ // is it a list-like control which uses a calc cell range as list source?
++ {
++ if ( aHelper.isCellRangeListSource( aHelper.getCurrentListSource( ) ) )
++ m_nIncludeBindings |= BA_LIST_CELL_RANGE;
++ }
++ }
++
++ // is control bound to XForms?
++ if( getXFormsBindName( m_xProps ).getLength() > 0 )
++ {
++ m_nIncludeBindings |= BA_XFORMS_BIND;
++ }
++
++ // is (list-)control bound to XForms list?
++ if( getXFormsListBindName( m_xProps ).getLength() > 0 )
++ {
++ m_nIncludeBindings |= BA_XFORMS_LISTBIND;
++ }
++
++ // does the control have an XForms submission?
++ if( getXFormsSubmissionName( m_xProps ).getLength() > 0 )
++ {
++ m_nIncludeBindings |= BA_XFORMS_SUBMISSION;
++ }
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportCellBindingAttributes( bool _bIncludeListLinkageType )
++ {
++ try
++ {
++ FormCellBindingHelper aHelper( m_xProps, NULL );
++ Reference< XValueBinding > xBinding( aHelper.getCurrentBinding() );
++ OSL_ENSURE( xBinding.is(), "OControlExport::exportCellBindingAttributes: invalid bindable or invalid binding!" );
++ if ( xBinding.is() )
++ {
++ // ....................................................
++ AddAttribute(
++ OAttributeMetaData::getBindingAttributeNamespace( BA_LINKED_CELL ),
++ OAttributeMetaData::getBindingAttributeName( BA_LINKED_CELL ),
++ aHelper.getStringAddressFromCellBinding( xBinding )
++ );
++
++ // ....................................................
++ if ( _bIncludeListLinkageType )
++ {
++ sal_Int16 nLinkageType = aHelper.isCellIntegerBinding( xBinding ) ? 1 : 0;
++
++ ::rtl::OUStringBuffer sBuffer;
++ m_rContext.getGlobalContext().GetMM100UnitConverter().convertEnum(
++ sBuffer,
++ (sal_uInt16)nLinkageType,
++ OEnumMapper::getEnumMap( OEnumMapper::epListLinkageType )
++ );
++
++ AddAttribute(
++ OAttributeMetaData::getBindingAttributeNamespace( BA_LIST_LINKING_TYPE ),
++ OAttributeMetaData::getBindingAttributeName( BA_LIST_LINKING_TYPE ),
++ sBuffer.makeStringAndClear()
++ );
++ }
++
++ }
++ }
++ catch( const Exception& )
++ {
++ OSL_ENSURE( sal_False, "OControlExport::exportCellBindingAttributes: caught an exception!" );
++ }
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportXFormsBindAttributes()
++ {
++ rtl::OUString sBindName = getXFormsBindName( m_xProps );
++ AddAttribute( XML_NAMESPACE_XFORMS, XML_BIND, sBindName );
++ }
++ //---------------------------------------------------------------------
++ void OControlExport::exportXFormsListAttributes()
++ {
++ rtl::OUString sBindName = getXFormsListBindName( m_xProps );
++ AddAttribute( XML_NAMESPACE_FORM, XML_XFORMS_LIST_SOURCE, sBindName );
++ }
++ //---------------------------------------------------------------------
++ void OControlExport::exportXFormsSubmissionAttributes()
++ {
++ rtl::OUString sSubmission = getXFormsSubmissionName( m_xProps );
++ AddAttribute( XML_NAMESPACE_FORM, XML_XFORMS_SUBMISSION, sSubmission );
++ }
++ //---------------------------------------------------------------------
++ void OControlExport::exportCellListSourceRange( )
++ {
++ try
++ {
++ Reference< XListEntrySink > xSink( m_xProps, UNO_QUERY );
++ Reference< XListEntrySource > xSource;
++ if ( xSink.is() )
++ xSource = xSource.query( xSink->getListEntrySource() );
++ OSL_ENSURE( xSource.is(), "OControlExport::exportCellListSourceRange: list source or sink!" );
++ if ( xSource.is() )
++ {
++ FormCellBindingHelper aHelper( m_xProps, NULL );
++
++ AddAttribute(
++ OAttributeMetaData::getBindingAttributeNamespace( BA_LIST_CELL_RANGE ),
++ OAttributeMetaData::getBindingAttributeName( BA_LIST_CELL_RANGE ),
++ aHelper.getStringAddressFromCellListSource( xSource )
++ );
++ }
++ }
++ catch( const Exception& )
++ {
++ OSL_ENSURE( sal_False, "OControlExport::exportCellListSourceRange: caught an exception!" );
++ }
++ }
++
++ //---------------------------------------------------------------------
++ void OControlExport::exportImagePositionAttributes()
++ {
++ try
++ {
++ sal_Int16 nImagePosition = ImagePosition::Centered;
++ OSL_VERIFY( m_xProps->getPropertyValue( PROPERTY_IMAGE_POSITION ) >>= nImagePosition );
++ OSL_ENSURE( ( nImagePosition >= ImagePosition::LeftTop ) && ( nImagePosition <= ImagePosition::Centered ),
++ "OControlExport::exportImagePositionAttributes: don't know this image position!" );
++
++ if ( ( nImagePosition < ImagePosition::LeftTop ) || ( nImagePosition > ImagePosition::Centered ) )
++ // this is important to prevent potential buffer overflows below, so don't optimize
++ nImagePosition = ImagePosition::Centered;
++
++ if ( nImagePosition == ImagePosition::Centered )
++ {
++ AddAttribute( XML_NAMESPACE_FORM, GetXMLToken( XML_IMAGE_POSITION ), GetXMLToken( XML_CENTER ) );
++ }
++ else
++ {
++ XMLTokenEnum eXmlImagePositions[] =
++ {
++ XML_START, XML_END, XML_TOP, XML_BOTTOM
++ };
++ XMLTokenEnum eXmlImageAligns[] =
++ {
++ XML_START, XML_CENTER, XML_END
++ };
++
++ XMLTokenEnum eXmlImagePosition = eXmlImagePositions[ nImagePosition / 3 ];
++ XMLTokenEnum eXmlImageAlign = eXmlImageAligns [ nImagePosition % 3 ];
++
++ AddAttribute( XML_NAMESPACE_FORM, GetXMLToken( XML_IMAGE_POSITION ), GetXMLToken( eXmlImagePosition ) );
++ AddAttribute( XML_NAMESPACE_FORM, GetXMLToken( XML_IMAGE_ALIGN ), GetXMLToken( eXmlImageAlign ) );
++ }
++
++ exportedProperty( PROPERTY_IMAGE_POSITION );
++ // some of the controls which have an ImagePosition also have an ImageAlign for compatibility
++ // reasons. Since the ImageAlign values simply represent a sub set of the ImagePosition values,
++ // we don't need to export ImageAlign anymore
++ exportedProperty( PROPERTY_IMAGE_ALIGN );
++ }
++ catch( const Exception& )
++ {
++ DBG_UNHANDLED_EXCEPTION();
++ }
++ }
++
++ //---------------------------------------------------------------------
++ bool OControlExport::controlHasActiveDataBinding() const
++ {
++ try
++ {
++ // currently exchanging the data with a database column?
++ ::rtl::OUString sBoundFieldPropertyName( RTL_CONSTASCII_USTRINGPARAM( "BoundField" ) );
++ if ( m_xPropertyInfo.is() && m_xPropertyInfo->hasPropertyByName( sBoundFieldPropertyName ) )
++ {
++ Reference< XPropertySet > xBoundField;
++ m_xProps->getPropertyValue( sBoundFieldPropertyName ) >>= xBoundField;
++ if ( xBoundField.is() )
++ return true;
++ }
++
++ // currently exchanging data with an external binding?
++ Reference< XBindableValue > xBindable( m_xProps, UNO_QUERY );
++ if ( xBindable.is() && xBindable->getValueBinding().is() )
++ return true;
++ }
++ catch( const Exception& )
++ {
++ OSL_ENSURE( sal_False, "OColumnExport::controlHasActiveDataBinding: caught an exception!" );
++ }
++
++ return false;
++ }
++
++ //---------------------------------------------------------------------
++ bool OControlExport::controlHasUserSuppliedListEntries() const
++ {
++ try
++ {
++ // an external list source?
++ Reference< XListEntrySink > xEntrySink( m_xProps, UNO_QUERY );
++ if ( xEntrySink.is() && xEntrySink->getListEntrySource().is() )
++ return false;
++
++ if ( m_xPropertyInfo.is() && m_xPropertyInfo->hasPropertyByName( PROPERTY_LISTSOURCETYPE ) )
++ {
++ ListSourceType eListSourceType = ListSourceType_VALUELIST;
++ OSL_VERIFY( m_xProps->getPropertyValue( PROPERTY_LISTSOURCETYPE ) >>= eListSourceType );
++ if ( eListSourceType == ListSourceType_VALUELIST )
++ // for value lists, the list entries as entered by the user are used
++ return true;
++
++ // for every other type, the list entries are filled with some data obtained
++ // from a database - if and only if the ListSource property is not empty
++ return ( 0 == getScalarListSourceValue().getLength() );
++ }
++ }
++ catch( const Exception& )
++ {
++ OSL_ENSURE( sal_False, "OControlExport::controlHasUserSuppliedListEntries: caught an exception!" );
++ }
++
++ OSL_ENSURE( sal_False, "OControlExport::controlHasUserSuppliedListEntries: unreachable code!" );
++ // this method should be called for list and combo boxes only
++ return true;
++ }
++
++ //=====================================================================
++ //= OColumnExport
++ //=====================================================================
++ //---------------------------------------------------------------------
++ OColumnExport::OColumnExport(IFormsExportContext& _rContext, const Reference< XPropertySet >& _rxControl, const ::rtl::OUString& _rControlId,
++ const Sequence< ScriptEventDescriptor >& _rEvents)
++ :OControlExport(_rContext, _rxControl, _rControlId, ::rtl::OUString(), _rEvents)
++ {
++ }
++
++ //---------------------------------------------------------------------
++ OColumnExport::~OColumnExport()
++ {
++ implEndElement();
++ }
++
++ //---------------------------------------------------------------------
++ void OColumnExport::exportServiceNameAttribute()
++ {
++ // the attribute "service name" (which has a slightly different meaning for columns
++ DBG_CHECK_PROPERTY( PROPERTY_COLUMNSERVICENAME, ::rtl::OUString );
++ ::rtl::OUString sColumnServiceName;
++ m_xProps->getPropertyValue(PROPERTY_COLUMNSERVICENAME) >>= sColumnServiceName;
++ // the service name is a full qualified one (i.e. com.sun.star.form.TextField), but the
++ // real service name for the column (for use with the XGridColumnFactory) is only the last
++ // token of this complete name.
++ sal_Int32 nLastSep = sColumnServiceName.lastIndexOf('.');
++ OSL_ENSURE(-1 != nLastSep, "OColumnExport::startExportElement: invalid service name!");
++ sColumnServiceName = sColumnServiceName.copy(nLastSep + 1);
++ sColumnServiceName =
++ m_rContext.getGlobalContext().GetNamespaceMap().GetQNameByKey(
++ XML_NAMESPACE_OOO, sColumnServiceName );
++ // add the attribute
++ AddAttribute( OAttributeMetaData::getCommonControlAttributeNamespace(CCA_SERVICE_NAME)
++ , OAttributeMetaData::getCommonControlAttributeName(CCA_SERVICE_NAME)
++ , sColumnServiceName);
++ // flag the property as "handled"
++ exportedProperty(PROPERTY_COLUMNSERVICENAME);
++
++ }
++
++ //---------------------------------------------------------------------
++ const sal_Char* OColumnExport::getOuterXMLElementName() const
++ {
++ return "column";
++ }
++
++ //---------------------------------------------------------------------
++ void OColumnExport::exportAttributes()
++ {
++ OControlExport::exportAttributes();
++
++ // the attribute "label"
++ exportStringPropertyAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_LABEL),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_LABEL),
++ PROPERTY_LABEL);
++
++ // the style attribute
++ ::rtl::OUString sStyleName = m_rContext.getObjectStyleName( m_xProps );
++ if ( sStyleName.getLength() )
++ {
++ AddAttribute(
++ OAttributeMetaData::getSpecialAttributeNamespace( SCA_COLUMN_STYLE_NAME ),
++ OAttributeMetaData::getSpecialAttributeName( SCA_COLUMN_STYLE_NAME ),
++ sStyleName
++ );
++ }
++ }
++
++ //---------------------------------------------------------------------
++ void OColumnExport::examine()
++ {
++ OControlExport::examine();
++
++ // grid columns miss some properties of the controls they're representing
++ m_nIncludeCommon &= ~(CCA_FOR | CCA_PRINTABLE | CCA_TAB_INDEX | CCA_TAB_STOP | CCA_LABEL);
++ m_nIncludeSpecial &= ~(SCA_ECHO_CHAR | SCA_AUTOMATIC_COMPLETION | SCA_MULTIPLE | SCA_MULTI_LINE | SCA_IS_TRISTATE);
++
++ if (FormComponentType::DATEFIELD != m_nClassId)
++ // except date fields, no column has the DropDown property
++ m_nIncludeCommon &= ~CCA_DROPDOWN;
++ }
++
++ //=====================================================================
++ //= OFormExport
++ //=====================================================================
++ //---------------------------------------------------------------------
++ OFormExport::OFormExport(IFormsExportContext& _rContext, const Reference< XPropertySet >& _rxForm,
++ const Sequence< ScriptEventDescriptor >& _rEvents)
++ :OElementExport(_rContext, _rxForm, _rEvents)
++ ,m_bCreateConnectionResourceElement(sal_False)
++ {
++ OSL_ENSURE(m_xProps.is(), "OFormExport::OFormExport: invalid arguments!");
++ }
++
++ //---------------------------------------------------------------------
++ const sal_Char* OFormExport::getXMLElementName() const
++ {
++ return "form";
++ }
++
++ //---------------------------------------------------------------------
++ void OFormExport::exportSubTags()
++ {
++ if ( m_bCreateConnectionResourceElement && m_xProps.is() )
++ {
++ m_rContext.getGlobalContext().ClearAttrList();
++ ::rtl::OUString sPropValue;
++ m_xProps->getPropertyValue( PROPERTY_DATASOURCENAME ) >>= sPropValue; // if set it is a file url
++ if ( !sPropValue.getLength() )
++ m_xProps->getPropertyValue( PROPERTY_URL ) >>= sPropValue;
++ if ( sPropValue.getLength() )
++ AddAttribute(
++ OAttributeMetaData::getCommonControlAttributeNamespace(CCA_TARGET_LOCATION),
++ OAttributeMetaData::getCommonControlAttributeName(CCA_TARGET_LOCATION),
++ sPropValue);
++ if ( m_rContext.getGlobalContext().GetAttrList().getLength() )
++ {
++ SvXMLElementExport aFormElement(m_rContext.getGlobalContext(), XML_NAMESPACE_FORM, xmloff::token::XML_CONNECTION_RESOURCE, sal_True, sal_True);
++ }
++ }
++
++ // let the base class export the remaining properties and the events
++ OElementExport::exportSubTags();
++ // loop through all children
++ Reference< XIndexAccess > xCollection(m_xProps, UNO_QUERY);
++ OSL_ENSURE(xCollection.is(), "OFormLayerXMLExport::implExportForm: a form which is not an index access? Suspicïous!");
++
++ if (xCollection.is())
++ m_rContext.exportCollectionElements(xCollection);
++ }
++
++ //---------------------------------------------------------------------
++ void OFormExport::exportAttributes()
++ {
++ sal_Int32 i=0;
++
++ // ---------------------
++ // the string properties
++ {
++ static FormAttributes eStringPropertyIds[] =
++ {
++ faName, /*faAction,*/ faCommand, faFilter, faOrder
++ };
++ static ::rtl::OUString aStringPropertyNames[] =
++ {
++ PROPERTY_NAME, /*PROPERTY_TARGETURL,*/ PROPERTY_COMMAND, PROPERTY_FILTER, PROPERTY_ORDER
++ };
++ sal_Int32 nIdCount = sizeof(eStringPropertyIds) / sizeof(eStringPropertyIds[0]);
++ #if OSL_DEBUG_LEVEL > 0
++ sal_Int32 nNameCount = sizeof(aStringPropertyNames) / sizeof(aStringPropertyNames[0]);
++ OSL_ENSURE((nIdCount == nNameCount),
++ "OFormExport::exportAttributes: somebody tampered with the maps (1)!");
++ #endif
++ for (i=0; i<nIdCount; ++i)
++ exportStringPropertyAttribute(
++ OAttributeMetaData::getFormAttributeNamespace(eStringPropertyIds[i]),
++ OAttributeMetaData::getFormAttributeName(eStringPropertyIds[i]),
++ aStringPropertyNames[i]);
++ // now export the data source name or databaselocation or connection resource
++ ::rtl::OUString sPropValue;
++ m_xProps->getPropertyValue( PROPERTY_DATASOURCENAME ) >>= sPropValue;
++ m_bCreateConnectionResourceElement = !sPropValue.getLength();
++ if ( !m_bCreateConnectionResourceElement )
++ {
++ INetURLObject aURL(sPropValue);
++ m_bCreateConnectionResourceElement = ( aURL.GetProtocol() == INET_PROT_FILE );
++ if ( !m_bCreateConnectionResourceElement )
++ exportStringPropertyAttribute(
++ OAttributeMetaData::getFormAttributeNamespace(faDatasource),
++ OAttributeMetaData::getFormAttributeName(faDatasource),
++ PROPERTY_DATASOURCENAME);
++ }
++ else
++ exportedProperty(PROPERTY_URL);
++ if ( m_bCreateConnectionResourceElement )
++ exportedProperty(PROPERTY_DATASOURCENAME);
++ }
++
++ // ----------------------
++ // the boolean properties
++ {
++ static FormAttributes eBooleanPropertyIds[] =
++ {
++ faAllowDeletes, faAllowInserts, faAllowUpdates, faApplyFilter, faEscapeProcessing, faIgnoreResult
++ };
++ static const ::rtl::OUString* pBooleanPropertyNames[] =
++ {
++ &PROPERTY_ALLOWDELETES, &PROPERTY_ALLOWINSERTS, &PROPERTY_ALLOWUPDATES, &PROPERTY_APPLYFILTER, &PROPERTY_ESCAPEPROCESSING, &PROPERTY_IGNORERESULT
++ };
++ static sal_Int8 nBooleanPropertyAttrFlags[] =
++ {
++ BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_FALSE, BOOLATTR_DEFAULT_TRUE, BOOLATTR_DEFAULT_FALSE
++ };
++ sal_Int32 nIdCount = sizeof(eBooleanPropertyIds) / sizeof(eBooleanPropertyIds[0]);
++ #if OSL_DEBUG_LEVEL > 0
++ sal_Int32 nNameCount = sizeof(pBooleanPropertyNames) / sizeof(pBooleanPropertyNames[0]);
++ sal_Int32 nFlagsCount = sizeof(nBooleanPropertyAttrFlags) / sizeof(nBooleanPropertyAttrFlags[0]);
++ OSL_ENSURE((nIdCount == nNameCount) && (nNameCount == nFlagsCount),
++ "OFormExport::exportAttributes: somebody tampered with the maps (2)!");
++ #endif
++ for (i=0; i<nIdCount; ++i)
++ exportBooleanPropertyAttribute(
++ OAttributeMetaData::getFormAttributeNamespace(eBooleanPropertyIds[i]),
++ OAttributeMetaData::getFormAttributeName(eBooleanPropertyIds[i]),
++ *(pBooleanPropertyNames[i]),
++ nBooleanPropertyAttrFlags[i]
++ );
++ }
++
++ // -------------------
++ // the enum properties
++ {
++ static FormAttributes eEnumPropertyIds[] =
++ {
++ faEnctype, faMethod, faCommandType, faNavigationMode, faTabbingCycle
++ };
++ static const sal_Char* pEnumPropertyNames[] =
++ {
++ PROPERTY_SUBMIT_ENCODING, PROPERTY_SUBMIT_METHOD, PROPERTY_COMMAND_TYPE, PROPERTY_NAVIGATION, PROPERTY_CYCLE
++ };
++ static OEnumMapper::EnumProperties eEnumPropertyMaps[] =
++ {
++ OEnumMapper::epSubmitEncoding, OEnumMapper::epSubmitMethod, OEnumMapper::epCommandType, OEnumMapper::epNavigationType, OEnumMapper::epTabCyle
++ };
++ static sal_Int32 nEnumPropertyAttrDefaults[] =
++ {
++ FormSubmitEncoding_URL, FormSubmitMethod_GET, CommandType::COMMAND, NavigationBarMode_CURRENT, TabulatorCycle_RECORDS
++ };
++ static sal_Bool nEnumPropertyAttrDefaultFlags[] =
++ {
++ sal_False, sal_False, sal_False, sal_False, sal_True
++ };
++ sal_Int32 nIdCount = sizeof(eEnumPropertyIds) / sizeof(eEnumPropertyIds[0]);
++ #if OSL_DEBUG_LEVEL > 0
++ sal_Int32 nNameCount = sizeof(pEnumPropertyNames) / sizeof(pEnumPropertyNames[0]);
++ sal_Int32 nDefaultCount = sizeof(nEnumPropertyAttrDefaults) / sizeof(nEnumPropertyAttrDefaults[0]);
++ sal_Int32 nDefaultFlagCount = sizeof(nEnumPropertyAttrDefaultFlags) / sizeof(nEnumPropertyAttrDefaultFlags[0]);
++ sal_Int32 nMapCount = sizeof(eEnumPropertyMaps) / sizeof(eEnumPropertyMaps[0]);
++ OSL_ENSURE((nIdCount == nNameCount) && (nNameCount == nDefaultCount) && (nDefaultCount == nDefaultFlagCount) && (nDefaultFlagCount == nMapCount),
++ "OFormExport::exportAttributes: somebody tampered with the maps (3)!");
++ #endif
++ for (i=0; i<nIdCount; ++i)
++ exportEnumPropertyAttribute(
++ OAttributeMetaData::getFormAttributeNamespace(eEnumPropertyIds[i]),
++ OAttributeMetaData::getFormAttributeName(eEnumPropertyIds[i]),
++ pEnumPropertyNames[i],
++ OEnumMapper::getEnumMap(eEnumPropertyMaps[i]),
++ nEnumPropertyAttrDefaults[i],
++ nEnumPropertyAttrDefaultFlags[i]
++ );
++ }
++
++ // the service name
++ exportServiceNameAttribute();
++ // the target frame
++ exportTargetFrameAttribute();
++ // the target URL
++ exportTargetLocationAttribute();
++
++ // master fields
++ exportStringSequenceAttribute(
++ OAttributeMetaData::getFormAttributeNamespace(faMasterFields),
++ OAttributeMetaData::getFormAttributeName(faMasterFields),
++ PROPERTY_MASTERFIELDS);
++ // detail fields
++ exportStringSequenceAttribute(
++ OAttributeMetaData::getFormAttributeNamespace(faDetailFiels),
++ OAttributeMetaData::getFormAttributeName(faDetailFiels),
++ PROPERTY_DETAILFIELDS);
++ }
++//.........................................................................
++} // namespace xmloff
++//.........................................................................
+--- toolkit/inc/toolkit/awt/vclxwindow.hxx.orig 1970-01-01 08:00:00.000000000 +0800
++++ toolkit/inc/toolkit/awt/vclxwindow.hxx 2008-04-11 16:49:35.000000000 +0800
+@@ -0,0 +1,263 @@
++/*************************************************************************
++ *
++ * 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: vclxwindow.hxx,v $
++ * $Revision: 1.28 $
++ *
++ * This file is part of OpenOffice.org.
++ *
++ * OpenOffice.org is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 3
++ * only, as published by the Free Software Foundation.
++ *
++ * OpenOffice.org is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Lesser General Public License version 3 for more details
++ * (a copy is included in the LICENSE file that accompanied this code).
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * version 3 along with OpenOffice.org. If not, see
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef _TOOLKIT_AWT_VCLXWINDOW_HXX_
++#define _TOOLKIT_AWT_VCLXWINDOW_HXX_
++
++#include <toolkit/dllapi.h>
++#include <com/sun/star/awt/XWindow.hpp>
++#include <com/sun/star/awt/XWindow2.hpp>
++#include <com/sun/star/awt/XVclWindowPeer.hpp>
++#include <com/sun/star/awt/XLayoutConstrains.hpp>
++#include <com/sun/star/awt/XView.hpp>
++#include <com/sun/star/awt/XPointer.hpp>
++#include <com/sun/star/awt/XGraphics.hpp>
++#include <com/sun/star/beans/XPropertyChangeListener.hpp>
++#include <com/sun/star/beans/XPropertySetInfo.hpp>
++#include <com/sun/star/accessibility/XAccessible.hpp>
++#include <com/sun/star/accessibility/XAccessibleContext.hpp>
++#include <com/sun/star/awt/XDockableWindow.hpp>
++#include <cppuhelper/weak.hxx>
++#include <osl/mutex.hxx>
++
++#include <toolkit/awt/vclxdevice.hxx>
++#include <toolkit/helper/listenermultiplexer.hxx>
++
++#include <tools/gen.hxx> // Size
++#include <tools/link.hxx>
++
++#include <stdarg.h>
++#include <list>
++
++class Window;
++class VclSimpleEvent;
++class VclWindowEvent;
++struct AccessibilityInfos;
++struct SystemParentData;
++
++namespace toolkit
++{
++ class IAccessibleFactory;
++}
++
++
++// ----------------------------------------------------
++// class VCLXWINDOW
++// ----------------------------------------------------
++
++class UnoPropertyArrayHelper;
++class VCLXWindowImpl;
++class TOOLKIT_DLLPUBLIC VCLXWindow : public ::com::sun::star::awt::XWindow2,
++ public ::com::sun::star::awt::XVclWindowPeer,
++ public ::com::sun::star::awt::XLayoutConstrains,
++ public ::com::sun::star::awt::XView,
++ public ::com::sun::star::awt::XDockableWindow,
++ public ::com::sun::star::accessibility::XAccessible,
++ public ::com::sun::star::lang::XEventListener,
++ public ::com::sun::star::beans::XPropertySetInfo,
++ public VCLXDevice
++{
++private:
++ EventListenerMultiplexer maEventListeners;
++ FocusListenerMultiplexer maFocusListeners;
++ WindowListenerMultiplexer maWindowListeners;
++ KeyListenerMultiplexer maKeyListeners;
++ MouseListenerMultiplexer maMouseListeners;
++ MouseMotionListenerMultiplexer maMouseMotionListeners;
++ PaintListenerMultiplexer maPaintListeners;
++ VclContainerListenerMultiplexer maContainerListeners;
++ TopWindowListenerMultiplexer maTopWindowListeners;
++
++ ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPointer> mxPointer;
++ ::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics> mxViewGraphics;
++
++ ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > mxAccessibleContext;
++ ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDockableWindowListener> mxDockableWindowListener;
++
++ ULONG mnListenerLockLevel;
++ ULONG nDummy2;
++ VCLXWindowImpl* mpImpl;
++ UnoPropertyArrayHelper *mpPropHelper;
++
++
++ sal_Bool mbDisposing : 1;
++ sal_Bool mbDesignMode : 1;
++ sal_Bool mbSynthesizingVCLEvent : 1;
++ sal_Bool mbWithDefaultProps : 1;
++ sal_Bool mbDrawingOntoParent;
++
++ UnoPropertyArrayHelper *GetPropHelper();
++
++protected:
++ Size ImplCalcWindowSize( const Size& rOutSz ) const;
++ DECL_LINK( WindowEventListener, VclSimpleEvent* );
++
++ virtual void ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent );
++ virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >
++ CreateAccessibleContext();
++
++ void SetSynthesizingVCLEvent( sal_Bool b ) { mbSynthesizingVCLEvent = b; }
++ BOOL IsSynthesizingVCLEvent() const { return mbSynthesizingVCLEvent; }
++ void SetSystemParent_Impl( const com::sun::star::uno::Any& rHandle );
++
++ ::toolkit::IAccessibleFactory& getAccessibleFactory();
++
++ // helper ...
++ static void PushPropertyIds( std::list< sal_uInt16 > &aIds, int nFirstId, ...);
++ // for use in controls/
++ static void ImplGetPropertyIds( std::list< sal_uInt16 > &aIds,
++ bool bWithDefaults = false );
++ virtual void GetPropertyIds( std::list< sal_uInt16 > &aIds )
++ { return ImplGetPropertyIds( aIds, mbWithDefaultProps ); }
++
++public:
++ VCLXWindow( bool bWithDefaultProps = false );
++ ~VCLXWindow();
++
++ virtual void SetWindow( Window* pWindow );
++ Window* GetWindow() const { return (Window*)GetOutputDevice(); }
++ ::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics> GetViewGraphics() const { return mxViewGraphics; }
++
++ void suspendVclEventListening( );
++ void resumeVclEventListening( );
++
++ EventListenerMultiplexer& GetEventListeners() { return maEventListeners; }
++ FocusListenerMultiplexer& GetFocusListeners() { return maFocusListeners; }
++ WindowListenerMultiplexer& GetWindowListeners() { return maWindowListeners; }
++ KeyListenerMultiplexer& GetKeyListeners() { return maKeyListeners; }
++ MouseListenerMultiplexer& GetMouseListeners() { return maMouseListeners; }
++ MouseMotionListenerMultiplexer& GetMouseMotionListeners() { return maMouseMotionListeners; }
++ PaintListenerMultiplexer& GetPaintListeners() { return maPaintListeners; }
++ VclContainerListenerMultiplexer& GetContainerListeners() { return maContainerListeners; }
++ TopWindowListenerMultiplexer& GetTopWindowListeners() { return maTopWindowListeners; }
++
++ // ::com::sun::star::uno::XInterface
++ ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL acquire() throw() { OWeakObject::acquire(); }
++ void SAL_CALL release() throw() { OWeakObject::release(); }
++
++ // ::com::sun::star::lang::XUnoTunnel
++ static const ::com::sun::star::uno::Sequence< sal_Int8 >& GetUnoTunnelId() throw();
++ static VCLXWindow* GetImplementation( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxIFace ) throw();
++ sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rIdentifier ) throw(::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::lang::XTypeProvider
++ ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() throw(::com::sun::star::uno::RuntimeException);
++ ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException);
++
++
++ // ::com::sun::star::lang::XEventListener
++ virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::lang::XComponent
++ void SAL_CALL dispose( ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::awt::XWindow
++ void SAL_CALL setPosSize( sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height, sal_Int16 Flags ) throw(::com::sun::star::uno::RuntimeException);
++ ::com::sun::star::awt::Rectangle SAL_CALL getPosSize( ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setVisible( sal_Bool Visible ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setEnable( sal_Bool Enable ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setFocus( ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL addWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL removeWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL addFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL removeFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL addKeyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XKeyListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL removeKeyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XKeyListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL addMouseListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL removeMouseListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL addMouseMotionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseMotionListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL removeMouseMotionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseMotionListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL addPaintListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPaintListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL removePaintListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPaintListener >& rrxListener ) throw(::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::awt::XWindowPeer
++ ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > SAL_CALL getToolkit( ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setPointer( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPointer >& Pointer ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setBackground( sal_Int32 Color ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL invalidate( sal_Int16 Flags ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL invalidateRect( const ::com::sun::star::awt::Rectangle& Rect, sal_Int16 Flags ) throw(::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::awt::XVclWindowPeer
++ sal_Bool SAL_CALL isChild( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >& Peer ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setDesignMode( sal_Bool bOn ) throw(::com::sun::star::uno::RuntimeException);
++ sal_Bool SAL_CALL isDesignMode( ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL enableClipSiblings( sal_Bool bClip ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setForeground( sal_Int32 Color ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setControlFont( const ::com::sun::star::awt::FontDescriptor& aFont ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL getStyles( sal_Int16 nType, ::com::sun::star::awt::FontDescriptor& Font, sal_Int32& ForegroundColor, sal_Int32& BackgroundColor ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value ) throw(::com::sun::star::uno::RuntimeException);
++ ::com::sun::star::uno::Any SAL_CALL getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::awt::XLayoutConstrains
++ ::com::sun::star::awt::Size SAL_CALL getMinimumSize( ) throw(::com::sun::star::uno::RuntimeException);
++ ::com::sun::star::awt::Size SAL_CALL getPreferredSize( ) throw(::com::sun::star::uno::RuntimeException);
++ ::com::sun::star::awt::Size SAL_CALL calcAdjustedSize( const ::com::sun::star::awt::Size& aNewSize ) throw(::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::awt::XView
++ sal_Bool SAL_CALL setGraphics( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics >& aDevice ) throw(::com::sun::star::uno::RuntimeException);
++ ::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics > SAL_CALL getGraphics( ) throw(::com::sun::star::uno::RuntimeException);
++ ::com::sun::star::awt::Size SAL_CALL getSize( ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL draw( sal_Int32 nX, sal_Int32 nY ) throw(::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setZoom( float fZoomX, float fZoomY ) throw(::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::accessibility::XAccessible
++ ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) throw (::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::awt::XDockableWindow
++ void SAL_CALL addDockableWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDockableWindowListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
++ void SAL_CALL removeDockableWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDockableWindowListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
++ void SAL_CALL enableDocking( sal_Bool bEnable ) throw (::com::sun::star::uno::RuntimeException);
++ sal_Bool SAL_CALL isFloating( ) throw (::com::sun::star::uno::RuntimeException);
++ void SAL_CALL setFloatingMode( sal_Bool bFloating ) throw (::com::sun::star::uno::RuntimeException);
++ void SAL_CALL lock( ) throw (::com::sun::star::uno::RuntimeException);
++ void SAL_CALL unlock( ) throw (::com::sun::star::uno::RuntimeException);
++ sal_Bool SAL_CALL isLocked( ) throw (::com::sun::star::uno::RuntimeException);
++ void SAL_CALL startPopupMode( const ::com::sun::star::awt::Rectangle& WindowRect ) throw (::com::sun::star::uno::RuntimeException);
++ sal_Bool SAL_CALL isInPopupMode( ) throw (::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::awt::XWindow2
++ void SAL_CALL setOutputSize( const ::com::sun::star::awt::Size& aSize ) throw (::com::sun::star::uno::RuntimeException);
++ ::com::sun::star::awt::Size SAL_CALL getOutputSize( ) throw (::com::sun::star::uno::RuntimeException);
++ sal_Bool SAL_CALL isVisible( ) throw (::com::sun::star::uno::RuntimeException);
++ sal_Bool SAL_CALL isActive( ) throw (::com::sun::star::uno::RuntimeException);
++ sal_Bool SAL_CALL isEnabled( ) throw (::com::sun::star::uno::RuntimeException);
++ sal_Bool SAL_CALL hasFocus( ) throw (::com::sun::star::uno::RuntimeException);
++
++ // ::com::sun::star::beans::XPropertySetInfo
++ ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > SAL_CALL getProperties( ) throw (::com::sun::star::uno::RuntimeException);
++ ::com::sun::star::beans::Property SAL_CALL getPropertyByName( const ::rtl::OUString& aName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
++ ::sal_Bool SAL_CALL hasPropertyByName( const ::rtl::OUString& Name ) throw (::com::sun::star::uno::RuntimeException);
++};
++
++#endif // _TOOLKIT_AWT_VCLXWINDOW_HXX_
++
+--- toolkit/inc/toolkit/helper/property.hxx.orig 2008-05-20 22:32:24.000000000 +0800
++++ toolkit/inc/toolkit/helper/property.hxx 2008-06-04 12:39:56.000000000 +0800
@@ -188,6 +188,7 @@ namespace rtl {
#define BASEPROPERTY_URL 134 // ::rtl::OUString
#define BASEPROPERTY_UNIT 135 // ::awt::FieldUnit
#define BASEPROPERTY_CUSTOMUNITTEXT 136 // ::rtl::OUString
+#define BASEPROPERTY_VISIBLE 137 // sal_Bool
- #define BASEPROPERTY_GROUPNAME 138 // ::rtl::OUString
// Keine gebundenen Properties, werden immer aus der Property BASEPROPERTY_FONTDESCRIPTOR entnommen.
---- toolkit/source/helper/property.cxx.orig 2008-06-04 11:59:12.000000000 +0800
-+++ toolkit/source/helper/property.cxx 2008-06-04 11:59:19.000000000 +0800
-@@ -270,7 +270,8 @@ ImplPropertyInfo* ImplGetPropertyInfos(
+ #define BASEPROPERTY_FONTDESCRIPTORPART_START 1000
+--- toolkit/source/helper/property.cxx.orig 2008-04-11 17:36:59.000000000 +0800
++++ toolkit/source/helper/property.cxx 2008-06-04 12:38:12.000000000 +0800
+@@ -269,7 +269,8 @@ ImplPropertyInfo* ImplGetPropertyInfos(
DECL_PROP_3 ( "RowHeight", TREE_ROWHEIGHT, sal_Int32, BOUND, MAYBEDEFAULT, MAYBEVOID ),
DECL_PROP_2 ( "InvokesStopNodeEditing", TREE_INVOKESSTOPNODEEDITING, sal_Bool, BOUND, MAYBEDEFAULT ),
DECL_PROP_2 ( "DialogSourceURL", DIALOGSOURCEURL, ::rtl::OUString, BOUND, MAYBEDEFAULT ),
@@ -71,9 +3444,9 @@
};
pPropertyInfos = aImplPropertyInfos;
nElements = sizeof( aImplPropertyInfos ) / sizeof( ImplPropertyInfo );
---- toolkit/source/awt/vclxwindow.cxx.orig 2008-06-04 11:58:09.000000000 +0800
-+++ toolkit/source/awt/vclxwindow.cxx 2008-06-04 11:59:19.000000000 +0800
-@@ -208,6 +208,8 @@ private:
+--- toolkit/source/awt/vclxwindow.cxx.orig 2008-05-14 17:47:01.000000000 +0800
++++ toolkit/source/awt/vclxwindow.cxx 2008-06-04 12:38:12.000000000 +0800
+@@ -207,6 +207,8 @@ private:
::vos::IMutex& mrMutex;
::toolkit::AccessibilityClient maAccFactory;
bool mbDisposed;
@@ -82,7 +3455,7 @@
::osl::Mutex maListenerContainerMutex;
::cppu::OInterfaceContainerHelper maWindow2Listeners;
-@@ -229,6 +231,15 @@ public:
+@@ -228,6 +230,15 @@ public:
*/
VCLXWindowImpl( VCLXWindow& _rAntiImpl, ::vos::IMutex& _rMutex );
@@ -95,116 +3468,1401 @@
+ void setDirectVisible( sal_Bool bDirectVisible ) { mbDirectVisible = bDirectVisible; }
+ sal_Bool isDirectVisible() { return mbDirectVisible; }
+
- /** asynchronously notifies a mouse event to the VCLXWindow's XMouseListeners
- */
- void notifyMouseEvent( const awt::MouseEvent& _rMouseEvent, MouseEventType _nType );
-@@ -299,6 +310,8 @@ VCLXWindowImpl::VCLXWindowImpl( VCLXWind
- ,mrAntiImpl( _rAntiImpl )
- ,mrMutex( _rMutex )
- ,mbDisposed( false )
-+ ,mbEnableVisible(sal_True)
-+ ,mbDirectVisible(sal_True)
- ,maListenerContainerMutex( )
- ,maWindow2Listeners( maListenerContainerMutex )
- #ifdef THREADED_NOTIFICATION
-@@ -601,7 +614,12 @@ void VCLXWindow::SetWindow( Window* pWin
- SetOutputDevice( pWindow );
-
- if ( GetWindow() )
+ /** asynchronously notifies a mouse event to the VCLXWindow's XMouseListeners
+ */
+ void notifyMouseEvent( const awt::MouseEvent& _rMouseEvent, MouseEventType _nType );
+@@ -298,6 +309,8 @@ VCLXWindowImpl::VCLXWindowImpl( VCLXWind
+ ,mrAntiImpl( _rAntiImpl )
+ ,mrMutex( _rMutex )
+ ,mbDisposed( false )
++ ,mbEnableVisible(sal_True)
++ ,mbDirectVisible(sal_True)
+ ,maListenerContainerMutex( )
+ ,maWindow2Listeners( maListenerContainerMutex )
+ #ifdef THREADED_NOTIFICATION
+@@ -600,7 +613,12 @@ void VCLXWindow::SetWindow( Window* pWin
+ SetOutputDevice( pWindow );
+
+ if ( GetWindow() )
++ {
+ GetWindow()->AddEventListener( LINK( this, VCLXWindow, WindowEventListener ) );
++ sal_Bool bDirectVisible = pWindow ? pWindow->IsVisible() : sal_False;
++ mpImpl->setDirectVisible( bDirectVisible );
++ }
++
+ }
+
+ void VCLXWindow::suspendVclEventListening( )
+@@ -1223,7 +1241,13 @@ void VCLXWindow::setVisible( sal_Bool bV
+ }
+ }
+ */
+- pWindow->Show( bVisible );
++ if( mpImpl->isEnableVisible() )
++ {
++ mpImpl->setDirectVisible( bVisible );
++ pWindow->Show( bVisible );
++ }
++ else
++ pWindow->Show( sal_False );
+ }
+ }
+
+@@ -1537,6 +1561,7 @@ void VCLXWindow::ImplGetPropertyIds( std
+ BASEPROPERTY_HELPURL,
+ BASEPROPERTY_TEXT,
+ BASEPROPERTY_PRINTABLE,
++ BASEPROPERTY_ENABLEVISIBLE, // for visibility
+ BASEPROPERTY_TABSTOP,
+ 0);
+
+@@ -1610,6 +1635,23 @@ void VCLXWindow::setProperty( const ::rt
+ setEnable( b );
+ }
+ break;
++ case BASEPROPERTY_ENABLEVISIBLE:
++ {
++ sal_Bool b = sal_Bool();
++ if ( Value >>= b )
++ {
++ if( b != mpImpl->isEnableVisible() )
++ {
++ mpImpl->setEnableVisible( b );
++ // if mbEnableVisible change from false to true.
++ // it will ignore the mbDirectVisible, setVisilbe
++ // and set mbDirectVisible as true.
++ if( mpImpl->isDirectVisible() || b )
++ setVisible( b );
++ }
++ }
++ }
++ break;
+ case BASEPROPERTY_TEXT:
+ case BASEPROPERTY_LABEL:
+ case BASEPROPERTY_TITLE:
+@@ -2068,6 +2110,10 @@ void VCLXWindow::setProperty( const ::rt
+ aProp <<= (sal_Bool) GetWindow()->IsEnabled();
+ break;
+
++ case BASEPROPERTY_ENABLEVISIBLE:
++ aProp <<= (sal_Bool) GetWindow()->IsVisible();
++ break;
++
+ case BASEPROPERTY_TEXT:
+ case BASEPROPERTY_LABEL:
+ case BASEPROPERTY_TITLE:
+@@ -2374,8 +2420,8 @@ void VCLXWindow::draw( sal_Int32 nX, sal
+ Window* pWindow = GetWindow();
+ if ( !pWindow )
+ return;
+-
+- if ( pWindow )
++
++ if ( pWindow && mpImpl->isEnableVisible() )
+ {
+ TabPage* pTabPage = dynamic_cast< TabPage* >( pWindow );
+ if ( pTabPage )
+--- toolkit/source/controls/unocontrolmodel.cxx.orig 2008-04-11 17:32:33.000000000 +0800
++++ toolkit/source/controls/unocontrolmodel.cxx 2008-06-04 12:38:12.000000000 +0800
+@@ -338,6 +338,7 @@ void UnoControlModel::ImplPropertyChange
+ case BASEPROPERTY_SCALEIMAGE:
+ case BASEPROPERTY_ENABLED:
+ case BASEPROPERTY_PRINTABLE:
++ case BASEPROPERTY_ENABLEVISIBLE:
+ case BASEPROPERTY_DECORATION: aDefault <<= (sal_Bool) sal_True; break;
+
+ case BASEPROPERTY_HELPTEXT:
+--- toolkit/source/controls/unocontrol.cxx.orig 1970-01-01 08:00:00.000000000 +0800
++++ toolkit/source/controls/unocontrol.cxx 2008-06-04 12:38:12.000000000 +0800
+@@ -0,0 +1,1534 @@
++/*************************************************************************
++ *
++ * 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: unocontrol.cxx,v $
++ * $Revision: 1.54 $
++ *
++ * This file is part of OpenOffice.org.
++ *
++ * OpenOffice.org is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 3
++ * only, as published by the Free Software Foundation.
++ *
++ * OpenOffice.org is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Lesser General Public License version 3 for more details
++ * (a copy is included in the LICENSE file that accompanied this code).
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * version 3 along with OpenOffice.org. If not, see
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// MARKER(update_precomp.py): autogen include statement, do not remove
++#include "precompiled_toolkit.hxx"
++#include <com/sun/star/awt/XControlContainer.hpp>
++#include <com/sun/star/awt/WindowAttribute.hpp>
++#include <com/sun/star/awt/VclWindowPeerAttribute.hpp>
++#include <com/sun/star/awt/PosSize.hpp>
++#ifndef _COM_SUN_STAR_LAN_XMULTISERVICEFACTORY_HPP_
++#include <com/sun/star/lang/XMultiServiceFactory.hpp>
++#endif
++#include <com/sun/star/beans/PropertyValue.hpp>
++#include <com/sun/star/resource/XStringResourceResolver.hpp>
++#include <toolkit/controls/unocontrol.hxx>
++#include <toolkit/helper/vclunohelper.hxx>
++#include <cppuhelper/typeprovider.hxx>
++#include <rtl/memory.h>
++#include <rtl/uuid.h>
++#include <vos/mutex.hxx>
++#include <tools/string.hxx>
++#include <tools/table.hxx>
++#include <tools/date.hxx>
++#include <tools/time.hxx>
++#include <tools/urlobj.hxx>
++#include <tools/debug.hxx>
++#include <vcl/svapp.hxx>
++#include <vcl/wrkwin.hxx>
++#include <comphelper/stl_types.hxx>
++#include <toolkit/helper/property.hxx>
++#include <toolkit/helper/servicenames.hxx>
++#include <toolkit/helper/vclunohelper.hxx>
++#include <toolkit/awt/vclxwindow.hxx>
++#include <vcl/svapp.hxx>
++#include <vos/mutex.hxx>
++#include <toolkit/controls/accessiblecontrolcontext.hxx>
++#include <comphelper/container.hxx>
++
++#include <algorithm>
++#include <set>
++
++using namespace ::com::sun::star;
++using namespace ::com::sun::star::uno;
++using namespace ::com::sun::star::awt;
++using namespace ::com::sun::star::beans;
++using namespace ::com::sun::star::lang;
++using namespace ::com::sun::star::util;
++
++using ::com::sun::star::accessibility::XAccessibleContext;
++using ::com::sun::star::accessibility::XAccessible;
++
++struct LanguageDependentProp
++{
++ const char* pPropName;
++ sal_Int32 nPropNameLength;
++};
++
++static const LanguageDependentProp aLanguageDependentProp[] =
++{
++ { "Text", 4 },
++ { "Label", 5 },
++ { "Title", 5 },
++ { "HelpText", 8 },
++ { "CurrencySymbol", 14 },
++ { "StringItemList", 14 },
++ { 0, 0 }
++};
++
++WorkWindow* lcl_GetDefaultWindow()
++{
++ static WorkWindow* pW = NULL;
++ if ( !pW )
++ {
++ pW = new WorkWindow( NULL, 0 );
++ pW->EnableChildTransparentMode();
++ }
++ return pW;
++}
++
++static Sequence< ::rtl::OUString> lcl_ImplGetPropertyNames( const Reference< XMultiPropertySet > & rxModel )
++{
++ Sequence< ::rtl::OUString> aNames;
++ Reference< XPropertySetInfo > xPSInf = rxModel->getPropertySetInfo();
++ DBG_ASSERT( xPSInf.is(), "UpdateFromModel: No PropertySetInfo!" );
++ if ( xPSInf.is() )
++ {
++ Sequence< Property> aProps = xPSInf->getProperties();
++ sal_Int32 nLen = aProps.getLength();
++ aNames = Sequence< ::rtl::OUString>( nLen );
++ ::rtl::OUString* pNames = aNames.getArray();
++ const Property* pProps = aProps.getConstArray();
++ for ( sal_Int32 n = 0; n < nLen; ++n, ++pProps, ++pNames)
++ *pNames = pProps->Name;
++ }
++ return aNames;
++}
++
++// ====================================================
++class VclListenerLock
++{
++private:
++ VCLXWindow* m_pLockWindow;
++
++public:
++ inline VclListenerLock( VCLXWindow* _pLockWindow )
++ :m_pLockWindow( _pLockWindow )
++ {
++// DBG_ASSERT( m_pLockWindow, "VclListenerLock::VclListenerLock: invalid window!" );
++ if ( m_pLockWindow )
++ m_pLockWindow->suspendVclEventListening( );
++ }
++ inline ~VclListenerLock( )
++ {
++ if ( m_pLockWindow )
++ m_pLockWindow->resumeVclEventListening( );
++ }
++
++private:
++ VclListenerLock(); // never implemented
++ VclListenerLock( const VclListenerLock& ); // never implemented
++ VclListenerLock& operator=( const VclListenerLock& ); // never implemented
++};
++
++struct UnoControl_Data
++{
++ ::std::set< ::rtl::OUString > aPropertyNotificationFilter;
++};
++
++// ----------------------------------------------------
++// class UnoControl
++// ----------------------------------------------------
++DBG_NAME( UnoControl )
++UnoControl::UnoControl()
++ : maDisposeListeners( *this )
++ , maWindowListeners( *this )
++ , maFocusListeners( *this )
++ , maKeyListeners( *this )
++ , maMouseListeners( *this )
++ , maMouseMotionListeners( *this )
++ , maPaintListeners( *this )
++ , maModeChangeListeners( GetMutex() )
++ , mpData( new UnoControl_Data )
++{
++ DBG_CTOR( UnoControl, NULL );
++ mbDisposePeer = sal_True;
++ mbRefeshingPeer = sal_False;
++ mbCreatingPeer = sal_False;
++ mbCreatingCompatiblePeer = sal_False;
++ mbDesignMode = sal_False;
++}
++
++UnoControl::~UnoControl()
++{
++ DELETEZ( mpData );
++ DBG_DTOR( UnoControl, NULL );
++}
++
++::rtl::OUString UnoControl::GetComponentServiceName()
++{
++ return ::rtl::OUString();
++}
++
++Reference< XWindowPeer > UnoControl::ImplGetCompatiblePeer( sal_Bool bAcceptExistingPeer )
++{
++ DBG_ASSERT( !mbCreatingCompatiblePeer, "ImplGetCompatiblePeer - rekursive?" );
++
++ mbCreatingCompatiblePeer = sal_True;
++
++ Reference< XWindowPeer > xCompatiblePeer;
++
++ if ( bAcceptExistingPeer )
++ xCompatiblePeer = getPeer();
++
++ if ( !xCompatiblePeer.is() )
++ {
++ // Peer unsichtbar erzeugen...
++ sal_Bool bVis = maComponentInfos.bVisible;
++ if( bVis )
++ maComponentInfos.bVisible = sal_False;
++
++ Reference< XWindowPeer > xCurrentPeer = getPeer();
++ setPeer( NULL );
++
++ // queryInterface ourself, to allow aggregation
++ Reference< XControl > xMe;
++ OWeakAggObject::queryInterface( ::getCppuType( &xMe ) ) >>= xMe;
++
++ WorkWindow* pWW;
++ {
++ osl::Guard< vos::IMutex > aGuard( Application::GetSolarMutex() );
++ pWW = lcl_GetDefaultWindow();
++ }
++ try
++ {
++ xMe->createPeer( NULL, pWW->GetComponentInterface( sal_True ) );
++ }
++ catch( const Exception& )
++ {
++ mbCreatingCompatiblePeer = sal_False;
++ throw;
++ }
++ xCompatiblePeer = getPeer();
++ setPeer( xCurrentPeer );
++
++ if ( xCompatiblePeer.is() && mxGraphics.is() )
++ {
++ Reference< XView > xPeerView( xCompatiblePeer, UNO_QUERY );
++ if ( xPeerView.is() )
++ xPeerView->setGraphics( mxGraphics );
++ }
++
++ if( bVis )
++ maComponentInfos.bVisible = sal_True;
++ }
++
++ mbCreatingCompatiblePeer = sal_False;
++
++ return xCompatiblePeer;
++}
++
++bool UnoControl::ImplMapPlaceHolder( ::rtl::OUString& rPlaceHolder )
++{
++ rtl::OUString aMappedValue;
++
++ Reference< XPropertySet > xPropSet( mxModel, UNO_QUERY );
++ if ( xPropSet.is() )
++ {
++ Any a;
++ Reference< resource::XStringResourceResolver > xStringResourceResolver;
++ a = xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ResourceResolver" )));
++ if ( a >>= xStringResourceResolver )
++ {
++ if ( xStringResourceResolver.is() )
++ {
++ try
++ {
++ rPlaceHolder = xStringResourceResolver->resolveString( rPlaceHolder );
++ return true;
++ }
++ catch ( resource::MissingResourceException& )
++ {
++ return false;
++ }
++ }
++ }
++ }
++
++ return false;
++}
++
++void UnoControl::ImplSetPeerProperty( const ::rtl::OUString& rPropName, const Any& rVal )
++{
++ // since a change made in propertiesChange, we can't be sure that this is called with an valid getPeer(),
++ // this assumption may be false in some (seldom) multi-threading scenarios (cause propertiesChange
++ // releases our mutex before calling here in)
++ // That's why this additional check
++
++ if ( mxVclWindowPeer.is() )
++ {
++ Any aVal( rVal );
++
++ // We now support a mapping for language dependent properties. This is the
++ // central method to implement it.
++ if (( rPropName.equalsAsciiL( "Text", 4 )) ||
++ ( rPropName.equalsAsciiL( "Label", 5 )) ||
++ ( rPropName.equalsAsciiL( "Title", 5 )) ||
++ ( rPropName.equalsAsciiL( "HelpText", 8 )) ||
++ ( rPropName.equalsAsciiL( "CurrencySymbol", 14 )) ||
++ ( rPropName.equalsAsciiL( "StringItemList", 14 )) )
++ {
++ rtl::OUString aValue;
++ uno::Sequence< rtl::OUString > aSeqValue;
++
++ if ( aVal >>= aValue )
++ {
++ // Map single string value
++ if (( aValue.getLength() > 0 ) &&
++ ( aValue.compareToAscii( "&", 1 ) == 0 ))
++ {
++ // Magic symbol '&' found at first place. Interpret as a place
++ // holder identifier. Now try to map it to the real value. The
++ // magic symbol must be removed.
++ rtl::OUString aKeyValue( aValue.copy( 1 ));
++ if ( ImplMapPlaceHolder( aKeyValue ))
++ aVal <<= aKeyValue;
++ }
++ }
++ else if ( aVal >>= aSeqValue )
++ {
++ // Map sequence strings
++ for ( sal_Int32 i = 0; i < aSeqValue.getLength(); i++ )
++ {
++ aValue = aSeqValue[i];
++ if (( aValue.getLength() > 0 ) &&
++ ( aValue.compareToAscii( "&", 1 ) == 0 ))
++ {
++ // Magic symbol '&' found at first place. Interpret as a place
++ // holder identifier. Now try to map it to the real value. The
++ // magic symbol must be removed.
++ rtl::OUString aKeyValue( aValue.copy( 1 ));
++ if ( ImplMapPlaceHolder( aKeyValue ))
++ aSeqValue[i] = aKeyValue;
++ }
++ }
++ aVal <<= aSeqValue;
++ }
++ }
++
++ mxVclWindowPeer->setProperty( rPropName, aVal );
++ }
++}
++
++void UnoControl::PrepareWindowDescriptor( WindowDescriptor& )
++{
++}
++
++Reference< XWindow > UnoControl::getParentPeer() const
++{
++ Reference< XWindow > xPeer;
++ if( mxContext.is() )
++ {
++ Reference< XControl > xContComp( mxContext, UNO_QUERY );
++ if ( xContComp.is() )
++ {
++ Reference< XWindowPeer > xP = xContComp->getPeer();
++ if ( xP.is() )
++ xP->queryInterface( ::getCppuType((const Reference< XWindow >*)0) ) >>= xPeer;
++ }
++ }
++ return xPeer;
++}
++
++void UnoControl::updateFromModel()
++{
++ // Alle standard Properties werden ausgelesen und in das Peer uebertragen
++ if( getPeer().is() )
++ {
++ Reference< XMultiPropertySet > xPropSet( mxModel, UNO_QUERY );
++ if( xPropSet.is() )
++ {
++ Sequence< ::rtl::OUString> aNames = lcl_ImplGetPropertyNames( xPropSet );
++ xPropSet->firePropertiesChangeEvent( aNames, this );
++ }
++ }
++}
++
++
++// XTypeProvider
++IMPL_IMPLEMENTATION_ID( UnoControl )
++
++void UnoControl::disposeAccessibleContext()
++{
++ Reference< XComponent > xContextComp( maAccessibleContext.get(), UNO_QUERY );
++ if ( xContextComp.is() )
++ {
++ maAccessibleContext = NULL;
++ try
++ {
++ xContextComp->removeEventListener( this );
++ xContextComp->dispose();
++ }
++ catch( const Exception& )
++ {
++ DBG_ERROR( "UnoControl::disposeAccessibleContext: could not dispose my AccessibleContext!" );
++ }
++ }
++}
++
++void UnoControl::dispose( ) throw(RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ if( getPeer().is() && mbDisposePeer )
++ {
++ getPeer()->dispose();
++ setPeer( NULL);
++ }
++
++ // dispose and release our AccessibleContext
++ disposeAccessibleContext();
++
++ EventObject aDisposeEvent;
++ aDisposeEvent.Source = static_cast< XAggregation* >( this );
++
++ maDisposeListeners.disposeAndClear( aDisposeEvent );
++ maWindowListeners.disposeAndClear( aDisposeEvent );
++ maFocusListeners.disposeAndClear( aDisposeEvent );
++ maKeyListeners.disposeAndClear( aDisposeEvent );
++ maMouseListeners.disposeAndClear( aDisposeEvent );
++ maMouseMotionListeners.disposeAndClear( aDisposeEvent );
++ maPaintListeners.disposeAndClear( aDisposeEvent );
++ maModeChangeListeners.disposeAndClear( aDisposeEvent );
++
++ // Model wieder freigeben
++ setModel( Reference< XControlModel > () );
++ setContext( Reference< XInterface > () );
++}
++
++void UnoControl::addEventListener( const Reference< XEventListener >& rxListener ) throw(RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ maDisposeListeners.addInterface( rxListener );
++}
++
++void UnoControl::removeEventListener( const Reference< XEventListener >& rxListener ) throw(RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ maDisposeListeners.removeInterface( rxListener );
++}
++
++sal_Bool UnoControl::requiresNewPeer( const ::rtl::OUString& /* _rPropertyName */ ) const
++{
++ return sal_False;
++}
++
++// XPropertiesChangeListener
++void UnoControl::propertiesChange( const Sequence< PropertyChangeEvent >& rEvents ) throw(RuntimeException)
++{
++ Sequence< PropertyChangeEvent > aEvents( rEvents );
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ if ( !mpData->aPropertyNotificationFilter.empty() )
++ {
++ // strip the property which we are currently updating (somewhere up the stack)
++ PropertyChangeEvent* pEvents = aEvents.getArray();
++ PropertyChangeEvent* pEventsEnd = pEvents + aEvents.getLength();
++ for ( ; pEvents < pEventsEnd; )
++ if ( mpData->aPropertyNotificationFilter.find( pEvents->PropertyName ) != mpData->aPropertyNotificationFilter.end() )
++ {
++ if ( pEvents != pEventsEnd )
++ ::std::copy( pEvents + 1, pEventsEnd, pEvents );
++ --pEventsEnd;
++ }
++ else
++ ++pEvents;
++ aEvents.realloc( pEventsEnd - aEvents.getConstArray() );
++
++ if ( !aEvents.getLength() )
++ return;
++ }
++ }
++
++ ImplModelPropertiesChanged( aEvents );
++}
++
++void UnoControl::ImplLockPropertyChangeNotification( const ::rtl::OUString& rPropertyName, bool bLock )
++{
++ if ( bLock )
+ {
- GetWindow()->AddEventListener( LINK( this, VCLXWindow, WindowEventListener ) );
-+ sal_Bool bDirectVisible = pWindow ? pWindow->IsVisible() : sal_False;
-+ mpImpl->setDirectVisible( bDirectVisible );
++ OSL_PRECOND( mpData->aPropertyNotificationFilter.find( rPropertyName ) == mpData->aPropertyNotificationFilter.end(),
++ "UnoControl::ImplLockPropertyChangeNotification: already locked!" );
++ mpData->aPropertyNotificationFilter.insert( rPropertyName );
+ }
-+
- }
-
- void VCLXWindow::suspendVclEventListening( )
-@@ -1224,7 +1242,13 @@ void VCLXWindow::setVisible( sal_Bool bV
- }
- }
- */
-- pWindow->Show( bVisible );
-+ if( mpImpl->isEnableVisible() )
++ else
++ {
++ OSL_PRECOND( mpData->aPropertyNotificationFilter.find( rPropertyName ) != mpData->aPropertyNotificationFilter.end(),
++ "UnoControl::ImplLockPropertyChangeNotification: not locked!" );
++ mpData->aPropertyNotificationFilter.erase( rPropertyName );
++ }
++}
++
++void UnoControl::ImplLockPropertyChangeNotifications( const Sequence< ::rtl::OUString >& rPropertyNames, bool bLock )
++{
++ for ( const ::rtl::OUString* pPropertyName = rPropertyNames.getConstArray();
++ pPropertyName != rPropertyNames.getConstArray() + rPropertyNames.getLength();
++ ++pPropertyName
++ )
++ ImplLockPropertyChangeNotification( *pPropertyName, bLock );
++}
++
++void UnoControl::ImplModelPropertiesChanged( const Sequence< PropertyChangeEvent >& rEvents )
++{
++ ::osl::ClearableGuard< ::osl::Mutex > aGuard( GetMutex() );
++
++ if( getPeer().is() )
++ {
++ DECLARE_STL_VECTOR( PropertyValue, PropertyValueVector);
++ PropertyValueVector aPeerPropertiesToSet;
++ sal_Int32 nIndependentPos = 0;
++ bool bResourceResolverSet( false );
++ // position where to insert the independent properties into aPeerPropertiesToSet,
++ // dependent ones are inserted at the end of the vector
++
++ sal_Bool bNeedNewPeer = sal_False;
++ // some properties require a re-creation of the peer, 'cause they can't be changed on the fly
++
++ Reference< XControlModel > xOwnModel( getModel(), UNO_QUERY );
++ // our own model for comparison
++ Reference< XPropertySet > xPS( xOwnModel, UNO_QUERY );
++ Reference< XPropertySetInfo > xPSI( xPS->getPropertySetInfo(), UNO_QUERY );
++ OSL_ENSURE( xPSI.is(), "UnoControl::ImplModelPropertiesChanged: should have property set meta data!" );
++
++ const PropertyChangeEvent* pEvents = rEvents.getConstArray();
++
++ sal_Int32 nLen = rEvents.getLength();
++ aPeerPropertiesToSet.reserve(nLen);
++
++ for( sal_Int32 i = 0; i < nLen; ++i, ++pEvents )
++ {
++ Reference< XControlModel > xModel( pEvents->Source, UNO_QUERY );
++ sal_Bool bOwnModel = xModel.get() == xOwnModel.get();
++ if ( !bOwnModel )
++ continue;
++
++ // Detect changes on our resource resolver which invalidates
++ // automatically some language dependent properties.
++ if ( pEvents->PropertyName.equalsAsciiL( "ResourceResolver", 16 ))
++ {
++ Reference< resource::XStringResourceResolver > xStrResolver;
++ if ( pEvents->NewValue >>= xStrResolver )
++ bResourceResolverSet = xStrResolver.is();
++ }
++
++ sal_uInt16 nPType = GetPropertyId( pEvents->PropertyName );
++ if ( mbDesignMode && mbDisposePeer && !mbRefeshingPeer && !mbCreatingPeer )
++ {
++ // if we're in design mode, then some properties can change which
++ // require creating a *new* peer (since these properties cannot
++ // be switched at existing peers)
++ if ( nPType )
++ bNeedNewPeer = ( nPType == BASEPROPERTY_BORDER )
++ || ( nPType == BASEPROPERTY_MULTILINE )
++ || ( nPType == BASEPROPERTY_DROPDOWN )
++ || ( nPType == BASEPROPERTY_HSCROLL )
++ || ( nPType == BASEPROPERTY_VSCROLL )
++ || ( nPType == BASEPROPERTY_AUTOHSCROLL )
++ || ( nPType == BASEPROPERTY_AUTOVSCROLL )
++ || ( nPType == BASEPROPERTY_ORIENTATION )
++ || ( nPType == BASEPROPERTY_SPIN )
++ || ( nPType == BASEPROPERTY_ALIGN )
++ || ( nPType == BASEPROPERTY_PAINTTRANSPARENT );
++ else
++ bNeedNewPeer = requiresNewPeer( pEvents->PropertyName );
++
++ if ( bNeedNewPeer )
++ break;
++ }
++
++ if ( nPType && ( nLen > 1 ) && DoesDependOnOthers( nPType ) )
++ {
++ // Properties die von anderen abhaengen erst hinterher einstellen,
++ // weil sie von anderen Properties abhaengig sind, die aber erst spaeter
++ // eingestellt werden, z.B. VALUE nach VALUEMIN/MAX.
++ aPeerPropertiesToSet.push_back(PropertyValue(pEvents->PropertyName, 0, pEvents->NewValue, PropertyState_DIRECT_VALUE));
++ }
++ else
++ {
++ if ( bResourceResolverSet )
++ {
++ // The resource resolver property change should be one of the first ones.
++ // All language dependent properties are dependent on this property.
++ // As BASEPROPERTY_NATIVE_WIDGET_LOOK is not dependent on resource
++ // resolver. We don't need to handle a special order for these two props.
++ aPeerPropertiesToSet.insert(
++ aPeerPropertiesToSet.begin(),
++ PropertyValue( pEvents->PropertyName, 0, pEvents->NewValue, PropertyState_DIRECT_VALUE ) );
++ ++nIndependentPos;
++ }
++ else if ( nPType == BASEPROPERTY_NATIVE_WIDGET_LOOK )
++ {
++ // since *a lot* of other properties might be overruled by this one, we need
++ // a special handling:
++ // NativeWidgetLook needs to be set first: If it is set to ON, all other
++ // properties describing the look (e.g. BackgroundColor) are ignored, anyway.
++ // If it is switched OFF, then we need to do it first because else it will
++ // overrule other look-related properties, and re-initialize them from system
++ // defaults.
++ aPeerPropertiesToSet.insert(
++ aPeerPropertiesToSet.begin(),
++ PropertyValue( pEvents->PropertyName, 0, pEvents->NewValue, PropertyState_DIRECT_VALUE ) );
++ ++nIndependentPos;
++ }
++ else
++ {
++ aPeerPropertiesToSet.insert(aPeerPropertiesToSet.begin() + nIndependentPos,
++ PropertyValue(pEvents->PropertyName, 0, pEvents->NewValue, PropertyState_DIRECT_VALUE));
++ ++nIndependentPos;
++ }
++ }
++ }
++
++ Reference< XWindow > xParent = getParentPeer();
++ Reference< XControl > xThis( (XAggregation*)(::cppu::OWeakAggObject*)this, UNO_QUERY );
++ // call createPeer via a interface got from queryInterface, so the aggregating class can intercept it
++
++ DBG_ASSERT( !bNeedNewPeer || xParent.is(), "Need new peer, but don't have a parent!" );
++
++ // Check if we have to update language dependent properties
++ if ( !bNeedNewPeer && bResourceResolverSet )
+ {
-+ mpImpl->setDirectVisible( bVisible );
-+ pWindow->Show( bVisible );
-+ }
-+ else
-+ pWindow->Show( sal_False );
- }
- }
-
-@@ -1538,6 +1562,7 @@ void VCLXWindow::ImplGetPropertyIds( std
- BASEPROPERTY_HELPURL,
- BASEPROPERTY_TEXT,
- BASEPROPERTY_PRINTABLE,
-+ BASEPROPERTY_ENABLEVISIBLE, // for visibility
- BASEPROPERTY_TABSTOP,
- 0);
-
-@@ -1611,6 +1636,23 @@ void VCLXWindow::setProperty( const ::rt
- setEnable( b );
- }
- break;
-+ case BASEPROPERTY_ENABLEVISIBLE:
++ // Add language dependent properties into the peer property set.
++ // Our resource resolver has been changed and we must be sure
++ // that language dependent props use the new resolver.
++ const LanguageDependentProp* pLangDepProp = aLanguageDependentProp;
++ while ( pLangDepProp->pPropName != 0 )
+ {
-+ sal_Bool b = sal_Bool();
-+ if ( Value >>= b )
++ bool bMustBeInserted( true );
++ for ( sal_uInt32 i = 0; i < aPeerPropertiesToSet.size(); i++ )
+ {
-+ if( b != mpImpl->isEnableVisible() )
++ if ( aPeerPropertiesToSet[i].Name.equalsAsciiL(
++ pLangDepProp->pPropName, pLangDepProp->nPropNameLength ))
+ {
-+ mpImpl->setEnableVisible( b );
-+ // if mbEnableVisible change from false to true.
-+ // it will ignore the mbDirectVisible, setVisilbe
-+ // and set mbDirectVisible as true.
-+ if( mpImpl->isDirectVisible() || b )
-+ setVisible( b );
++ bMustBeInserted = false;
++ break;
++ }
++ }
++
++ if ( bMustBeInserted )
++ {
++ // Add language dependent props at the end
++ ::rtl::OUString aPropName( ::rtl::OUString::createFromAscii( pLangDepProp->pPropName ));
++ if ( xPSI.is() && xPSI->hasPropertyByName( aPropName ) )
++ {
++ aPeerPropertiesToSet.push_back(
++ PropertyValue( aPropName, 0, xPS->getPropertyValue( aPropName ), PropertyState_DIRECT_VALUE ) );
+ }
+ }
++
++ ++pLangDepProp;
+ }
-+ break;
- case BASEPROPERTY_TEXT:
- case BASEPROPERTY_LABEL:
- case BASEPROPERTY_TITLE:
-@@ -2069,6 +2111,10 @@ void VCLXWindow::setProperty( const ::rt
- aProp <<= (sal_Bool) GetWindow()->IsEnabled();
- break;
-
-+ case BASEPROPERTY_ENABLEVISIBLE:
-+ aProp <<= (sal_Bool) GetWindow()->IsVisible();
-+ break;
++ }
++ aGuard.clear();
++
++ // clear the guard before creating a new peer - as usual, our peer implementations use the SolarMutex
++ // #82300# - 2000-12-21 - fs openoffice org
++ if (bNeedNewPeer && xParent.is())
++ {
++ NAMESPACE_VOS(OGuard) aVclGuard( Application::GetSolarMutex() );
++ // and now this is the final withdrawal:
++ // With 83561, I have no other idea than locking the SolarMutex here ....
++ // I really hate the fact that VCL is not theadsafe ....
++ // #83561# - 2001-03-01 - fs openoffice org
++
++ // Funktioniert beim Container nicht!
++ getPeer()->dispose();
++ mxPeer.clear();
++ mxVclWindowPeer = NULL;
++ mbRefeshingPeer = sal_True;
++ Reference< XWindowPeer > xP( xParent, UNO_QUERY );
++ xThis->createPeer( Reference< XToolkit > (), xP );
++ mbRefeshingPeer = sal_False;
++ aPeerPropertiesToSet.clear();
++ }
++
++ // lock the multiplexing of VCL events to our UNO listeners
++ // this is for compatibility reasons: in OOo 1.0.x, changes which were done at the
++ // model did not cause the listeners of the controls/peers to be called
++ // Since the implementations for the listeners changed a lot towards 1.1, this
++ // would not be the case anymore, if we would not do this listener-lock below
++ // #i14703# - 2003-05-23 - fs openoffice org
++ Window* pVclPeer = VCLUnoHelper::GetWindow( getPeer() );
++ VCLXWindow* pPeer = pVclPeer ? pVclPeer->GetWindowPeer() : NULL;
++ VclListenerLock aNoVclEventMultiplexing( pPeer );
++
++ // setting peer properties may result in an attemp to acquire the solar mutex, 'cause the peers
++ // usually don't have an own mutex but use the SolarMutex instead.
++ // To prevent deadlocks resulting from this, we do this without our own mutex locked
++ // 2000-11-03 - fs openoffice org
++ PropertyValueVectorIterator aEnd = aPeerPropertiesToSet.end();
++ for ( PropertyValueVectorIterator aLoop = aPeerPropertiesToSet.begin();
++ aLoop != aEnd;
++ ++aLoop
++ )
++ {
++ ImplSetPeerProperty( aLoop->Name, aLoop->Value );
++ }
++ }
++}
++
++void UnoControl::disposing( const EventObject& rEvt ) throw(RuntimeException)
++{
++ ::osl::ClearableMutexGuard aGuard( GetMutex() );
++ // bei "Multible Inheritance" nicht unterschiedliche Typen vergleichen.
++
++ if ( maAccessibleContext.get() == rEvt.Source )
++ {
++ // just in case the context is disposed, but not released - ensure that we do not re-use it in the future
++ maAccessibleContext = NULL;
++ }
++ else if( mxModel.get() == Reference< XControlModel >(rEvt.Source,UNO_QUERY).get() )
++ {
++ // #62337# if the model dies, it does not make sense for us to live ...
++ Reference< XControl > xThis = this;
++
++ aGuard.clear();
++ xThis->dispose();
++
++ DBG_ASSERT( !mxModel.is(), "UnoControl::disposing: invalid dispose behaviour!" );
++ mxModel.clear();
++ }
++}
++
++
++void SAL_CALL UnoControl::setOutputSize( const awt::Size& aSize ) throw (RuntimeException)
++{
++ Reference< XWindow2 > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ }
++
++ if ( xPeerWindow.is() )
++ xPeerWindow->setOutputSize( aSize );
++}
++
++namespace
++{
++ template < typename RETVALTYPE >
++ RETVALTYPE lcl_askPeer( const uno::Reference< awt::XWindowPeer >& _rxPeer, RETVALTYPE (SAL_CALL XWindow2::*_pMethod)(), RETVALTYPE _aDefault )
++ {
++ RETVALTYPE aReturn( _aDefault );
++
++ Reference< XWindow2 > xPeerWindow( _rxPeer, UNO_QUERY );
++ if ( xPeerWindow.is() )
++ aReturn = (xPeerWindow.get()->*_pMethod)();
++
++ return aReturn;
++ }
++}
++
++awt::Size SAL_CALL UnoControl::getOutputSize( ) throw (RuntimeException)
++{
++ return lcl_askPeer( getPeer(), &XWindow2::getOutputSize, awt::Size() );
++}
++
++::sal_Bool SAL_CALL UnoControl::isVisible( ) throw (RuntimeException)
++{
++ return lcl_askPeer( getPeer(), &XWindow2::isVisible, maComponentInfos.bVisible );
++}
++
++::sal_Bool SAL_CALL UnoControl::isActive( ) throw (RuntimeException)
++{
++ return lcl_askPeer( getPeer(), &XWindow2::isActive, sal_False );
++}
++
++::sal_Bool SAL_CALL UnoControl::isEnabled( ) throw (RuntimeException)
++{
++ return lcl_askPeer( getPeer(), &XWindow2::isEnabled, maComponentInfos.bEnable );
++}
++
++::sal_Bool SAL_CALL UnoControl::hasFocus( ) throw (RuntimeException)
++{
++ return lcl_askPeer( getPeer(), &XWindow2::hasFocus, sal_False );
++}
++
++// XWindow
++void UnoControl::setPosSize( sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height, sal_Int16 Flags ) throw(RuntimeException)
++{
++ Reference< XWindow > xWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ if ( Flags & awt::PosSize::X )
++ maComponentInfos.nX = X;
++ if ( Flags & awt::PosSize::Y )
++ maComponentInfos.nY = Y;
++ if ( Flags & awt::PosSize::WIDTH )
++ maComponentInfos.nWidth = Width;
++ if ( Flags & awt::PosSize::HEIGHT )
++ maComponentInfos.nHeight = Height;
++ maComponentInfos.nFlags |= Flags;
++
++ xWindow = xWindow.query( getPeer() );
++ }
++
++ if( xWindow.is() )
++ xWindow->setPosSize( X, Y, Width, Height, Flags );
++}
++
++awt::Rectangle UnoControl::getPosSize( ) throw(RuntimeException)
++{
++ awt::Rectangle aRect( maComponentInfos.nX, maComponentInfos.nY, maComponentInfos.nWidth, maComponentInfos.nHeight);
++ Reference< XWindow > xWindow;
++
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ xWindow = xWindow.query( getPeer() );
++ }
++
++ if( xWindow.is() )
++ aRect = xWindow->getPosSize();
++ return aRect;
++}
++
++void UnoControl::setVisible( sal_Bool bVisible ) throw(RuntimeException)
++{
++ Reference< XWindow > xWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ // Visible status ist Sache der View
++ maComponentInfos.bVisible = bVisible;
++ xWindow = xWindow.query( getPeer() );
++ }
++ if ( xWindow.is() )
++ xWindow->setVisible( bVisible );
++}
++
++void UnoControl::setEnable( sal_Bool bEnable ) throw(RuntimeException)
++{
++ Reference< XWindow > xWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ // Enable status ist Sache der View
++ maComponentInfos.bEnable = bEnable;
++ xWindow = xWindow.query( getPeer() );
++ }
++ if ( xWindow.is() )
++ xWindow->setEnable( bEnable );
++}
++
++void UnoControl::setFocus( ) throw(RuntimeException)
++{
++ Reference< XWindow > xWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ xWindow = xWindow.query( getPeer() );
++ }
++ if ( xWindow.is() )
++ xWindow->setFocus();
++}
++
++void UnoControl::addWindowListener( const Reference< XWindowListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ maWindowListeners.addInterface( rxListener );
++ if ( maWindowListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->addWindowListener( &maWindowListeners );
++}
++
++void UnoControl::removeWindowListener( const Reference< XWindowListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ if ( maWindowListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ maWindowListeners.removeInterface( rxListener );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->removeWindowListener( &maWindowListeners );
++}
++
++void UnoControl::addFocusListener( const Reference< XFocusListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ maFocusListeners.addInterface( rxListener );
++ if ( maFocusListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->addFocusListener( &maFocusListeners );
++}
++
++void UnoControl::removeFocusListener( const Reference< XFocusListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ if ( maFocusListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ maFocusListeners.removeInterface( rxListener );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->removeFocusListener( &maFocusListeners );
++}
++
++void UnoControl::addKeyListener( const Reference< XKeyListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ maKeyListeners.addInterface( rxListener );
++ if ( maKeyListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->addKeyListener( &maKeyListeners);
++}
++
++void UnoControl::removeKeyListener( const Reference< XKeyListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ if ( maKeyListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ maKeyListeners.removeInterface( rxListener );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->removeKeyListener( &maKeyListeners);
++}
++
++void UnoControl::addMouseListener( const Reference< XMouseListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ maMouseListeners.addInterface( rxListener );
++ if ( maMouseListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->addMouseListener( &maMouseListeners);
++}
++
++void UnoControl::removeMouseListener( const Reference< XMouseListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ if ( maMouseListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ maMouseListeners.removeInterface( rxListener );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->removeMouseListener( &maMouseListeners );
++}
++
++void UnoControl::addMouseMotionListener( const Reference< XMouseMotionListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ maMouseMotionListeners.addInterface( rxListener );
++ if ( maMouseMotionListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->addMouseMotionListener( &maMouseMotionListeners);
++}
++
++void UnoControl::removeMouseMotionListener( const Reference< XMouseMotionListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ if ( maMouseMotionListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ maMouseMotionListeners.removeInterface( rxListener );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->removeMouseMotionListener( &maMouseMotionListeners );
++}
++
++void UnoControl::addPaintListener( const Reference< XPaintListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ maPaintListeners.addInterface( rxListener );
++ if ( maPaintListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->addPaintListener( &maPaintListeners);
++}
++
++void UnoControl::removePaintListener( const Reference< XPaintListener >& rxListener ) throw(RuntimeException)
++{
++ Reference< XWindow > xPeerWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ if ( maPaintListeners.getLength() == 1 )
++ xPeerWindow = xPeerWindow.query( getPeer() );
++ maPaintListeners.removeInterface( rxListener );
++ }
++ if ( xPeerWindow.is() )
++ xPeerWindow->removePaintListener( &maPaintListeners );
++}
++
++// XView
++sal_Bool UnoControl::setGraphics( const Reference< XGraphics >& rDevice ) throw(RuntimeException)
++{
++ Reference< XView > xView;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ mxGraphics = rDevice;
++ xView = xView.query( getPeer() );
++ }
++ return xView.is() ? xView->setGraphics( rDevice ) : sal_True;
++}
++
++Reference< XGraphics > UnoControl::getGraphics( ) throw(RuntimeException)
++{
++ return mxGraphics;
++}
++
++awt::Size UnoControl::getSize( ) throw(RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++ return awt::Size( maComponentInfos.nWidth, maComponentInfos.nHeight );
++}
++
++void UnoControl::draw( sal_Int32 x, sal_Int32 y ) throw(RuntimeException)
++{
++ Reference< XWindowPeer > xDrawPeer;
++ Reference< XView > xDrawPeerView;
++
++ bool bDisposeDrawPeer( false );
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ xDrawPeer = ImplGetCompatiblePeer( sal_True );
++ bDisposeDrawPeer = xDrawPeer.is() && ( xDrawPeer != getPeer() );
++
++ xDrawPeerView.set( xDrawPeer, UNO_QUERY );
++ DBG_ASSERT( xDrawPeerView.is(), "UnoControl::draw: no peer!" );
++ }
++
++ if ( xDrawPeerView.is() )
++ xDrawPeerView->draw( x, y );
++
++ if ( bDisposeDrawPeer )
++ xDrawPeer->dispose();
++}
++
++void UnoControl::setZoom( float fZoomX, float fZoomY ) throw(RuntimeException)
++{
++ Reference< XView > xView;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ maComponentInfos.nZoomX = fZoomX;
++ maComponentInfos.nZoomY = fZoomY;
++
++ xView = xView.query( getPeer() );
++ }
++ if ( xView.is() )
++ xView->setZoom( fZoomX, fZoomY );
++}
++
++// XControl
++void UnoControl::setContext( const Reference< XInterface >& rxContext ) throw(RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ mxContext = rxContext;
++}
++
++Reference< XInterface > UnoControl::getContext( ) throw(RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ return mxContext;
++}
++
++void UnoControl::peerCreated()
++{
++ Reference< XWindow > xWindow( getPeer(), UNO_QUERY );
++ if ( !xWindow.is() )
++ return;
++
++ if ( maWindowListeners.getLength() )
++ xWindow->addWindowListener( &maWindowListeners );
++
++ if ( maFocusListeners.getLength() )
++ xWindow->addFocusListener( &maFocusListeners );
++
++ if ( maKeyListeners.getLength() )
++ xWindow->addKeyListener( &maKeyListeners );
++
++ if ( maMouseListeners.getLength() )
++ xWindow->addMouseListener( &maMouseListeners );
++
++ if ( maMouseMotionListeners.getLength() )
++ xWindow->addMouseMotionListener( &maMouseMotionListeners );
++
++ if ( maPaintListeners.getLength() )
++ xWindow->addPaintListener( &maPaintListeners );
++}
++
++void UnoControl::createPeer( const Reference< XToolkit >& rxToolkit, const Reference< XWindowPeer >& rParentPeer ) throw(RuntimeException)
++{
++ ::osl::ClearableMutexGuard aGuard( GetMutex() );
++
++ if ( !mxModel.is() )
++ {
++ RuntimeException aException;
++ aException.Message = ::rtl::OUString::createFromAscii( "createPeer: no model!" );
++ aException.Context = (XAggregation*)(::cppu::OWeakAggObject*)this;
++ throw( aException );
++ }
++
++ if( !getPeer().is() )
++ {
++ mbCreatingPeer = sal_True;
++
++ WindowClass eType;
++ Reference< XToolkit > xToolkit = rxToolkit;
++ if( rParentPeer.is() && mxContext.is() )
++ {
++ // kein TopWindow
++ if ( !xToolkit.is() )
++ xToolkit = rParentPeer->getToolkit();
++ Any aAny = OWeakAggObject::queryInterface( ::getCppuType((const Reference< XControlContainer>*)0) );
++ Reference< XControlContainer > xC;
++ aAny >>= xC;
++ if( xC.is() )
++ // Es ist ein Container
++ eType = WindowClass_CONTAINER;
++ else
++ eType = WindowClass_SIMPLE;
++ }
++ else
++ { // Nur richtig, wenn es sich um ein Top Window handelt
++ if( rParentPeer.is() )
++ {
++ if ( !xToolkit.is() )
++ xToolkit = rParentPeer->getToolkit();
++ eType = WindowClass_CONTAINER;
++ }
++ else
++ {
++ if ( !xToolkit.is() )
++ xToolkit = VCLUnoHelper::CreateToolkit();
++ eType = WindowClass_TOP;
++ }
++ }
++ WindowDescriptor aDescr;
++ aDescr.Type = eType;
++ aDescr.WindowServiceName = GetComponentServiceName();
++ aDescr.Parent = rParentPeer;
++ aDescr.Bounds = getPosSize();
++ aDescr.WindowAttributes = 0;
++
++ // Border
++ Reference< XPropertySet > xPSet( mxModel, UNO_QUERY );
++ Reference< XPropertySetInfo > xInfo = xPSet->getPropertySetInfo();
++
++ Any aVal;
++ ::rtl::OUString aPropName = GetPropertyName( BASEPROPERTY_BORDER );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Int16 n = sal_Int16();
++ if ( aVal >>= n )
++ {
++ if ( n )
++ aDescr.WindowAttributes |= WindowAttribute::BORDER;
++ else
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::NOBORDER;
++ }
++ }
++
++ // DESKTOP_AS_PARENT
++ if ( aDescr.Type == WindowClass_TOP )
++ {
++ aPropName = GetPropertyName( BASEPROPERTY_DESKTOP_AS_PARENT );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Bool b = sal_Bool();
++ if ( ( aVal >>= b ) && b)
++ aDescr.ParentIndex = -1;
++ }
++ }
++ // Moveable
++ aPropName = GetPropertyName( BASEPROPERTY_MOVEABLE );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Bool b = sal_Bool();
++ if ( ( aVal >>= b ) && b)
++ aDescr.WindowAttributes |= WindowAttribute::MOVEABLE;
++ }
++
++ // Closeable
++ aPropName = GetPropertyName( BASEPROPERTY_CLOSEABLE );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Bool b = sal_Bool();
++ if ( ( aVal >>= b ) && b)
++ aDescr.WindowAttributes |= WindowAttribute::CLOSEABLE;
++ }
++
++ // Dropdown
++ aPropName = GetPropertyName( BASEPROPERTY_DROPDOWN );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Bool b = sal_Bool();
++ if ( ( aVal >>= b ) && b)
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::DROPDOWN;
++ }
++
++ // Spin
++ aPropName = GetPropertyName( BASEPROPERTY_SPIN );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Bool b = sal_Bool();
++ if ( ( aVal >>= b ) && b)
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::SPIN;
++ }
++
++ // HScroll
++ aPropName = GetPropertyName( BASEPROPERTY_HSCROLL );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Bool b = sal_Bool();
++ if ( ( aVal >>= b ) && b)
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::HSCROLL;
++ }
++
++ // VScroll
++ aPropName = GetPropertyName( BASEPROPERTY_VSCROLL );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Bool b = sal_Bool();
++ if ( ( aVal >>= b ) && b)
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::VSCROLL;
++ }
++
++ // AutoHScroll
++ aPropName = GetPropertyName( BASEPROPERTY_AUTOHSCROLL );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Bool b = sal_Bool();
++ if ( ( aVal >>= b ) && b)
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::AUTOHSCROLL;
++ }
++
++ // AutoVScroll
++ aPropName = GetPropertyName( BASEPROPERTY_AUTOVSCROLL );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Bool b = sal_Bool();
++ if ( ( aVal >>= b ) && b)
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::AUTOVSCROLL;
++ }
+
- case BASEPROPERTY_TEXT:
- case BASEPROPERTY_LABEL:
- case BASEPROPERTY_TITLE:
-@@ -2362,8 +2408,8 @@ void VCLXWindow::draw( sal_Int32 nX, sal
- Window* pWindow = GetWindow();
- if ( !pWindow )
- return;
--
-- if ( pWindow )
-+
-+ if ( pWindow && mpImpl->isEnableVisible() )
- {
- TabPage* pTabPage = dynamic_cast< TabPage* >( pWindow );
- if ( pTabPage )
---- toolkit/source/controls/unocontrolmodel.cxx.orig 2008-06-04 11:59:12.000000000 +0800
-+++ toolkit/source/controls/unocontrolmodel.cxx 2008-06-04 11:59:19.000000000 +0800
-@@ -338,6 +338,7 @@ void UnoControlModel::ImplPropertyChange
- case BASEPROPERTY_SCALEIMAGE:
- case BASEPROPERTY_ENABLED:
- case BASEPROPERTY_PRINTABLE:
-+ case BASEPROPERTY_ENABLEVISIBLE:
- case BASEPROPERTY_DECORATION: aDefault <<= (sal_Bool) sal_True; break;
-
- case BASEPROPERTY_GROUPNAME:
---- toolkit/source/controls/unocontrol.cxx.orig 2008-06-04 11:59:12.000000000 +0800
-+++ toolkit/source/controls/unocontrol.cxx 2008-06-04 11:59:19.000000000 +0800
-@@ -1286,6 +1286,18 @@ void UnoControl::createPeer( const Refer
- }
- //issue79712 ends
-
++ //added for issue79712
++ //NoLabel
++ aPropName = GetPropertyName( BASEPROPERTY_NOLABEL );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Bool b = sal_Bool();
++ if ( ( aVal >>=b ) && b )
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::NOLABEL;
++ }
++ //issue79712 ends
++
+ // Visible
+ aPropName = GetPropertyName( BASEPROPERTY_ENABLEVISIBLE );
+ if ( xInfo->hasPropertyByName( aPropName ) )
@@ -217,40 +4875,1170 @@
+ }
+ }
+
- // Align
- aPropName = GetPropertyName( BASEPROPERTY_ALIGN );
- if ( xInfo->hasPropertyByName( aPropName ) )
---- sc/source/filter/inc/xiescher.hxx.orig 2008-06-04 11:59:12.000000000 +0800
-+++ sc/source/filter/inc/xiescher.hxx 2008-06-04 11:59:19.000000000 +0800
-@@ -94,6 +94,8 @@ public:
- void SetObjData( sal_uInt16 nObjType, sal_uInt16 nObjId, sal_uInt16 nObjFlags );
- /** Sets shape data from Escher stream. */
- void SetShapeData( sal_uInt32 nShapeId, sal_uInt32 nShapeFlags, sal_uInt32 nShapeBlipId );
++ // Align
++ aPropName = GetPropertyName( BASEPROPERTY_ALIGN );
++ if ( xInfo->hasPropertyByName( aPropName ) )
++ {
++ aVal = xPSet->getPropertyValue( aPropName );
++ sal_Int16 n = sal_Int16();
++ if ( aVal >>= n )
++ {
++ if ( n == PROPERTY_ALIGN_LEFT )
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::LEFT;
++ else if ( n == PROPERTY_ALIGN_CENTER )
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::CENTER;
++ else
++ aDescr.WindowAttributes |= VclWindowPeerAttribute::RIGHT;
++ }
++ }
++
++ // Ableitungen die Moeglichkeit geben die Attribute zu manipulieren
++ PrepareWindowDescriptor(aDescr);
++
++ // create the peer
++ setPeer( xToolkit->createWindow( aDescr ) );
++
++ // release the mutex guard (and work with copies of our members)
++ // this is necessary as our peer may lock the SolarMutex (actually, all currently known peers do), so calling
++ // into the peer with our own mutex locked may cause deadlocks
++ // (We _really_ need peers which do not use the SolarMutex. It's really pissing me off that from time to
++ // time deadlocks pop up because the low-level components like our peers use a mutex which ususally
++ // is locked at the top of the stack (it protects the global message looping). This is always dangerous, and
++ // can not always be solved by tampering with other mutexes.
++ // Unfortunately, the VCL used in the peers is not threadsafe, and by definition needs a locked SolarMutex.)
++ // 82300 - 12/21/00 - FS
++ UnoControlComponentInfos aComponentInfos(maComponentInfos);
++ sal_Bool bDesignMode(mbDesignMode);
++
++ Reference< XGraphics > xGraphics( mxGraphics );
++ Reference< XView > xView ( getPeer(), UNO_QUERY );
++ Reference< XWindow > xWindow ( getPeer(), UNO_QUERY );
++
++ aGuard.clear();
++
++ // the updateFromModel is done without a locked mutex, too.
++ // The reason is that the only thing this method does is firing property changes, and this in general has
++ // to be done without locked mutexes (as every notification to external listeners).
++ // 82300 - 12/21/00 - FS
++ updateFromModel();
++
++ xView->setZoom( aComponentInfos.nZoomX, aComponentInfos.nZoomY );
++
++ setPosSize( aComponentInfos.nX, aComponentInfos.nY, aComponentInfos.nWidth, aComponentInfos.nHeight, aComponentInfos.nFlags );
++
++ if( aComponentInfos.bVisible && !bDesignMode )
++ // Erst nach dem setzen der Daten anzeigen
++ xWindow->setVisible( aComponentInfos.bVisible );
++
++ if( !aComponentInfos.bEnable )
++ xWindow->setEnable( aComponentInfos.bEnable );
++
++ xView->setGraphics( xGraphics );
++
++ peerCreated();
++
++ mbCreatingPeer = sal_False;
++ }
++}
++
++Reference< XWindowPeer > UnoControl::getPeer() throw(RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++ return mxPeer;
++}
++
++sal_Bool UnoControl::setModel( const Reference< XControlModel >& rxModel ) throw(RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ Reference< XMultiPropertySet > xPropSet( mxModel, UNO_QUERY );
++
++ // query for the XPropertiesChangeListener - our delegator is allowed to overwrite this interface
++ Reference< XPropertiesChangeListener > xListener;
++ queryInterface( ::getCppuType( &xListener ) ) >>= xListener;
++
++ if( xPropSet.is() )
++ xPropSet->removePropertiesChangeListener( xListener );
++
++ mxModel = rxModel;
++ if( mxModel.is() )
++ {
++ xPropSet = Reference< XMultiPropertySet > ( mxModel, UNO_QUERY );
++ if( xPropSet.is() )
++ {
++ Sequence< ::rtl::OUString> aNames = lcl_ImplGetPropertyNames( xPropSet );
++ xPropSet->addPropertiesChangeListener( aNames, xListener );
++ }
++ }
++ return mxModel.is();
++}
++
++Reference< XControlModel > UnoControl::getModel( ) throw(RuntimeException)
++{
++ return mxModel;
++}
++
++Reference< XView > UnoControl::getView( ) throw(RuntimeException)
++{
++ return static_cast< XView* >( this );
++}
++
++void UnoControl::setDesignMode( sal_Bool bOn ) throw(RuntimeException)
++{
++ ModeChangeEvent aModeChangeEvent;
++
++ Reference< XWindow > xWindow;
++ {
++ ::osl::MutexGuard aGuard( GetMutex() );
++ if ( bOn == mbDesignMode )
++ return;
++
++ // remember this
++ mbDesignMode = bOn;
++ xWindow = xWindow.query( getPeer() );
++
++ // dispose our current AccessibleContext, if we have one
++ // (changing the design mode implies having a new implementation for this context,
++ // so the old one must be declared DEFUNC)
++ disposeAccessibleContext();
++
++ aModeChangeEvent.Source = *this;
++ aModeChangeEvent.NewMode = ::rtl::OUString::createFromAscii( mbDesignMode ? "design" : "alive" );
++ }
++
++ // ajust the visibility of our window
++ if ( xWindow.is() )
++ xWindow->setVisible( !bOn );
++
++ // and notify our mode listeners
++ maModeChangeListeners.notifyEach( &XModeChangeListener::modeChanged, aModeChangeEvent );
++}
++
++sal_Bool UnoControl::isDesignMode( ) throw(RuntimeException)
++{
++ return mbDesignMode;
++}
++
++sal_Bool UnoControl::isTransparent( ) throw(RuntimeException)
++{
++ return sal_False;
++}
++
++// XServiceInfo
++::rtl::OUString UnoControl::getImplementationName( ) throw(RuntimeException)
++{
++ DBG_ERROR( "This method should be overloaded!" );
++ return ::rtl::OUString();
++}
++
++sal_Bool UnoControl::supportsService( const ::rtl::OUString& rServiceName ) throw(RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ Sequence< ::rtl::OUString > aSNL = getSupportedServiceNames();
++ const ::rtl::OUString* pArray = aSNL.getConstArray();
++ const ::rtl::OUString* pArrayEnd = aSNL.getConstArray();
++ for (; pArray != pArrayEnd; ++pArray )
++ if( *pArray == rServiceName )
++ break;
++
++ return pArray != pArrayEnd;
++}
++
++Sequence< ::rtl::OUString > UnoControl::getSupportedServiceNames( ) throw(RuntimeException)
++{
++ ::rtl::OUString sName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControl" ) );
++ return Sequence< ::rtl::OUString >( &sName, 1 );
++}
++
++// ------------------------------------------------------------------------
++Reference< XAccessibleContext > SAL_CALL UnoControl::getAccessibleContext( ) throw (RuntimeException)
++{
++ // creation of the context will certainly require the SolarMutex ...
++ ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
++ ::osl::MutexGuard aGuard( GetMutex() );
++
++ Reference< XAccessibleContext > xCurrentContext( maAccessibleContext.get(), UNO_QUERY );
++ if ( !xCurrentContext.is() )
++ {
++ if ( !mbDesignMode )
++ { // in alive mode, use the AccessibleContext of the peer
++ Reference< XAccessible > xPeerAcc( getPeer(), UNO_QUERY );
++ if ( xPeerAcc.is() )
++ xCurrentContext = xPeerAcc->getAccessibleContext( );
++ }
++ else
++ // in design mode, use a fallback
++ xCurrentContext = ::toolkit::OAccessibleControlContext::create( this );
++
++ DBG_ASSERT( xCurrentContext.is(), "UnoControl::getAccessibleContext: invalid context (invalid peer?)!" );
++ maAccessibleContext = xCurrentContext;
++
++ // get notified when the context is disposed
++ Reference< XComponent > xContextComp( xCurrentContext, UNO_QUERY );
++ if ( xContextComp.is() )
++ xContextComp->addEventListener( this );
++ // In an ideal world, this is not necessary - there the object would be released as soon as it has been
++ // disposed, and thus our weak reference would be empty, too.
++ // But 'til this ideal world comes (means 'til we do never have any refcount/lifetime bugs anymore), we
++ // need to listen for disposal and reset our weak reference then.
++ }
++
++ return xCurrentContext;
++}
++
++void SAL_CALL UnoControl::addModeChangeListener( const Reference< XModeChangeListener >& _rxListener ) throw (RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++ maModeChangeListeners.addInterface( _rxListener );
++}
++
++void SAL_CALL UnoControl::removeModeChangeListener( const Reference< XModeChangeListener >& _rxListener ) throw (RuntimeException)
++{
++ ::osl::MutexGuard aGuard( GetMutex() );
++ maModeChangeListeners.removeInterface( _rxListener );
++}
++
++void SAL_CALL UnoControl::addModeChangeApproveListener( const Reference< XModeChangeApproveListener >& ) throw (NoSupportException, RuntimeException)
++{
++ throw NoSupportException( );
++}
++
++void SAL_CALL UnoControl::removeModeChangeApproveListener( const Reference< XModeChangeApproveListener >& ) throw (NoSupportException, RuntimeException)
++{
++ throw NoSupportException( );
++}
++
+--- sc/source/filter/inc/xlescher.hxx.orig 1970-01-01 08:00:00.000000000 +0800
++++ sc/source/filter/inc/xlescher.hxx 2008-04-11 04:52:34.000000000 +0800
+@@ -0,0 +1,288 @@
++/*************************************************************************
++ *
++ * 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: xlescher.hxx,v $
++ * $Revision: 1.22 $
++ *
++ * This file is part of OpenOffice.org.
++ *
++ * OpenOffice.org is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 3
++ * only, as published by the Free Software Foundation.
++ *
++ * OpenOffice.org is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Lesser General Public License version 3 for more details
++ * (a copy is included in the LICENSE file that accompanied this code).
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * version 3 along with OpenOffice.org. If not, see
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef SC_XLESCHER_HXX
++#define SC_XLESCHER_HXX
++
++#include <vcl/mapunit.hxx>
++#include "fapihelper.hxx"
++#include "xladdress.hxx"
++
++// Constants and Enumerations =================================================
++
++// misc -----------------------------------------------------------------------
++
++const long EXC_ESCHER_AUTOMARGIN = 20000; /// Automatic text margin.
++
++// (0x001C) NOTE --------------------------------------------------------------
++
++const sal_uInt16 EXC_ID_NOTE = 0x001C;
++const sal_uInt16 EXC_NOTE_VISIBLE = 0x0002;
++const sal_uInt16 EXC_NOTE5_MAXLEN = 2048;
++
++// (0x005D) OBJ ---------------------------------------------------------------
++
++const sal_uInt16 EXC_ID_OBJ = 0x005D;
++
++const sal_uInt16 EXC_OBJ_INVALID_ID = 0x0000;
++
++// sub records
++const sal_uInt16 EXC_ID_OBJ_FTEND = 0x0000; /// End of OBJ.
++const sal_uInt16 EXC_ID_OBJ_FTMACRO = 0x0004; /// Macro link.
++const sal_uInt16 EXC_ID_OBJ_FTGMO = 0x0006; /// Group marker.
++const sal_uInt16 EXC_ID_OBJ_FTCF = 0x0007; /// Clipboard format.
++const sal_uInt16 EXC_ID_OBJ_FTPIOGRBIT = 0x0008; /// Option flags.
++const sal_uInt16 EXC_ID_OBJ_FTPICTFMLA = 0x0009; /// OLE link formula.
++const sal_uInt16 EXC_ID_OBJ_FTCBLS = 0x000A; /// Check box/radio button data.
++const sal_uInt16 EXC_ID_OBJ_FTSBS = 0x000C; /// Scroll bar data.
++const sal_uInt16 EXC_ID_OBJ_FTSBSFMLA = 0x000E; /// Scroll bar/list box/combo box cell link.
++const sal_uInt16 EXC_ID_OBJ_FTGBODATA = 0x000F; /// Group box data.
++const sal_uInt16 EXC_ID_OBJ_FTLBSDATA = 0x0013; /// List box/combo box data.
++const sal_uInt16 EXC_ID_OBJ_FTCBLSFMLA = 0x0014; /// Check box/radio button cell link.
++const sal_uInt16 EXC_ID_OBJ_FTCMO = 0x0015; /// Common object settings.
++const sal_uInt16 EXC_ID_OBJ_FTUNKNOWN = 0xFFFF; /// For internal use only.
++
++// ftCmo: object types
++const sal_uInt16 EXC_OBJ_CMO_GROUP = 0x0000;
++const sal_uInt16 EXC_OBJ_CMO_LINE = 0x0001;
++const sal_uInt16 EXC_OBJ_CMO_RECTANGLE = 0x0002;
++const sal_uInt16 EXC_OBJ_CMO_ELLIPSE = 0x0003;
++const sal_uInt16 EXC_OBJ_CMO_ARC = 0x0004;
++const sal_uInt16 EXC_OBJ_CMO_CHART = 0x0005;
++const sal_uInt16 EXC_OBJ_CMO_TEXT = 0x0006;
++const sal_uInt16 EXC_OBJ_CMO_BUTTON = 0x0007;
++const sal_uInt16 EXC_OBJ_CMO_PICTURE = 0x0008;
++const sal_uInt16 EXC_OBJ_CMO_POLYGON = 0x0009;
++const sal_uInt16 EXC_OBJ_CMO_CHECKBOX = 0x000B;
++const sal_uInt16 EXC_OBJ_CMO_OPTIONBUTTON = 0x000C;
++const sal_uInt16 EXC_OBJ_CMO_EDIT = 0x000D;
++const sal_uInt16 EXC_OBJ_CMO_LABEL = 0x000E;
++const sal_uInt16 EXC_OBJ_CMO_DIALOG = 0x000F;
++const sal_uInt16 EXC_OBJ_CMO_SPIN = 0x0010;
++const sal_uInt16 EXC_OBJ_CMO_SCROLLBAR = 0x0011;
++const sal_uInt16 EXC_OBJ_CMO_LISTBOX = 0x0012;
++const sal_uInt16 EXC_OBJ_CMO_GROUPBOX = 0x0013;
++const sal_uInt16 EXC_OBJ_CMO_COMBOBOX = 0x0014;
++const sal_uInt16 EXC_OBJ_CMO_NOTE = 0x0019;
++const sal_uInt16 EXC_OBJ_CMO_DRAWING = 0x001E;
++const sal_uInt16 EXC_OBJ_CMO_UNKNOWN = 0xFFFF; /// For internal use only.
++
++// ftCmo: flags
++const sal_uInt16 EXC_OBJ_CMO_PRINTABLE = 0x0010; /// Object printable
++
++// ftPioGrbit: flags
++const sal_uInt16 EXC_OBJ_PIO_MANUALSIZE = 0x0001;
++const sal_uInt16 EXC_OBJ_PIO_LINKED = 0x0002;
++const sal_uInt16 EXC_OBJ_PIO_SYMBOL = 0x0008;
++const sal_uInt16 EXC_OBJ_PIO_CONTROL = 0x0010; /// Form control.
++const sal_uInt16 EXC_OBJ_PIO_CTLSSTREAM = 0x0020; /// Data in Ctls stream.
++const sal_uInt16 EXC_OBJ_PIO_AUTOLOAD = 0x0200;
++
++// ftCbls: Check box/radio button data
++const sal_uInt16 EXC_OBJ_CBLS_STATEMASK = 0x0003;
++const sal_uInt16 EXC_OBJ_CBLS_STATE_UNCHECK = 0x0000;
++const sal_uInt16 EXC_OBJ_CBLS_STATE_CHECK = 0x0001;
++const sal_uInt16 EXC_OBJ_CBLS_STATE_TRI = 0x0002;
++const sal_uInt16 EXC_OBJ_CBLS_FLAT = 0x0001;
++
++// ftGboData: Group box data
++const sal_uInt16 EXC_OBJ_GBO_FLAT = 0x0001;
++
++// ftLbsData: List box data
++const sal_uInt16 EXC_OBJ_LBS_SELMASK = 0x0030; /// Mask for selection type.
++const sal_uInt16 EXC_OBJ_LBS_SEL_SIMPLE = 0x0000; /// Simple selection.
++const sal_uInt16 EXC_OBJ_LBS_SEL_MULTI = 0x0010; /// Multi selection.
++const sal_uInt16 EXC_OBJ_LBS_SEL_EXT = 0x0020; /// Extended selection.
++const sal_uInt16 EXC_OBJ_LBS_FLAT = 0x0008;
++const sal_uInt16 EXC_OBJ_LBS_COMBOMASK = 0x0003; /// Mask for combobox style.
++const sal_uInt16 EXC_OBJ_LBS_COMBO_STD = 0x0000; /// Standard combo box.
++const sal_uInt16 EXC_OBJ_LBS_COMBO_SIMPLE = 0x0002; /// Simple dropdown without field.
++const sal_uInt16 EXC_OBJ_LBS_FILTERED = 0x0008; /// Drowdown style: filtered.
++
++// ftSbs: Spin button/scrollbar data
++const sal_uInt16 EXC_OBJ_SBS_HORIZONTAL = 0x0001;
++const sal_uInt16 EXC_OBJ_SBS_DEFAULTFLAGS = 0x0001;
++const sal_uInt16 EXC_OBJ_SBS_FLAT = 0x0008;
++const sal_Int16 EXC_OBJ_SBS_MINSCROLL = 0;
++const sal_Int16 EXC_OBJ_SBS_MAXSCROLL = 30000;
++
++/** Value binding mode for cells linked to form controls. */
++enum XclCtrlBindMode
++{
++ EXC_CTRL_BINDCONTENT, /// Binds cell to content of control.
++ EXC_CTRL_BINDPOSITION /// Binds cell to position in control (e.g. listbox selection index).
++};
++
++// (0x00EB) MSODRAWINGGROUP ---------------------------------------------------
++
++const sal_uInt16 EXC_ID_MSODRAWINGGROUP = 0x00EB;
++
++// (0x00EC) MSODRAWING --------------------------------------------------------
++
++const sal_uInt16 EXC_ID_MSODRAWING = 0x00EC;
++
++// additional flags not extant in svx headers
++const sal_uInt16 EXC_ESC_ANCHOR_POSLOCKED = 0x0001;
++const sal_uInt16 EXC_ESC_ANCHOR_SIZELOCKED = 0x0002;
++const sal_uInt16 EXC_ESC_ANCHOR_LOCKED = EXC_ESC_ANCHOR_POSLOCKED|EXC_ESC_ANCHOR_SIZELOCKED;
++
++// (0x00ED) MSODRAWINGSELECTION -----------------------------------------------
++
++const sal_uInt16 EXC_ID_MSODRAWINGSEL = 0x00ED;
++
++// (0x01B6) TXO ---------------------------------------------------------------
++
++const sal_uInt16 EXC_ID_TXO = 0x01B6;
++
++const sal_uInt8 EXC_TXO_HOR_LEFT = 0x01;
++const sal_uInt8 EXC_TXO_HOR_CENTER = 0x02;
++const sal_uInt8 EXC_TXO_HOR_RIGHT = 0x03;
++const sal_uInt8 EXC_TXO_HOR_JUSTIFY = 0x04;
++
++const sal_uInt8 EXC_TXO_VER_TOP = 0x01;
++const sal_uInt8 EXC_TXO_VER_CENTER = 0x02;
++const sal_uInt8 EXC_TXO_VER_BOTTOM = 0x03;
++const sal_uInt8 EXC_TXO_VER_JUSTIFY = 0x04;
++
++const sal_uInt16 EXC_TXO_TEXTROT_NONE = 0x0000;
++const sal_uInt16 EXC_TXO_TEXTROT_STACKED = 0x0001; /// Stacked top to bottom.
++const sal_uInt16 EXC_TXO_TEXTROT_90_CCW = 0x0002; /// 90 degr. counterclockwise.
++const sal_uInt16 EXC_TXO_TEXTROT_90_CW = 0x0003; /// 90 degr. clockwise.
++
++// Structs and classes ========================================================
++
++// Escher client anchor -------------------------------------------------------
++
++class Rectangle;
++class ScDocument;
++class SvStream;
++class XclImpStream;
++class XclExpStream;
++
++/** Represents the position (anchor) of an Escher object in a Calc document. */
++struct XclEscherAnchor
++{
++ XclRange maXclRange; /// Cell range address.
++ SCTAB mnScTab; /// Calc sheet index.
++ sal_uInt16 mnLX; /// X offset in left column (1/1024 of column width).
++ sal_uInt16 mnTY; /// Y offset in top row (1/256 of row height).
++ sal_uInt16 mnRX; /// X offset in right column (1/1024 of column width).
++ sal_uInt16 mnBY; /// Y offset in bottom row (1/256 of row height).
++
++ explicit XclEscherAnchor( SCTAB nScTab );
++
++ /** Calculates a rectangle from the contained coordinates. */
++ Rectangle GetRect( ScDocument& rDoc, MapUnit eMapUnit ) const;
++ /** Initializes the anchor coordinates from a rectangle. */
++ void SetRect( ScDocument& rDoc, const Rectangle& rRect, MapUnit eMapUnit );
++};
++
++SvStream& operator>>( SvStream& rStrm, XclEscherAnchor& rAnchor );
++SvStream& operator<<( SvStream& rStrm, const XclEscherAnchor& rAnchor );
++
++XclImpStream& operator>>( XclImpStream& rStrm, XclEscherAnchor& rAnchor );
++XclExpStream& operator<<( XclExpStream& rStrm, const XclEscherAnchor& rAnchor );
++
++// ----------------------------------------------------------------------------
++
++/** Identifies an Escher object by sheet index and object identifier. */
++struct XclObjId
++{
++ SCTAB mnScTab; /// Calc sheet index.
++ sal_uInt16 mnObjId; /// Excel object identifier.
++
++ explicit XclObjId();
++ explicit XclObjId( SCTAB nScTab, sal_uInt16 nObjId );
++};
++
++bool operator==( const XclObjId& rL, const XclObjId& rR );
++bool operator<( const XclObjId& rL, const XclObjId& rR );
++
++// ----------------------------------------------------------------------------
++
++/** Contains data of a TXO record for text boxes. */
++struct XclTxoData
++{
++ sal_uInt16 mnFlags; /// Option flags and alignment.
++ sal_uInt16 mnOrient; /// Text orientation.
++ sal_uInt16 mnTextLen; /// Length of the string.
++ sal_uInt16 mnFormatSize; /// Size of the format run buffer (bytes).
++
++ explicit XclTxoData();
++
++ sal_uInt8 GetXclHorAlignment() const;
++ void SetXclHorAlignment( sal_uInt8 nXclAlign );
++
++ sal_uInt8 GetXclVerAlignment() const;
++ void SetXclVerAlignment( sal_uInt8 nXclAlign );
++};
++
++XclImpStream& operator>>( XclImpStream& rStrm, XclTxoData& rData );
++XclExpStream& operator<<( XclExpStream& rStrm, const XclTxoData& rData );
++
++// ----------------------------------------------------------------------------
++
++namespace com { namespace sun { namespace star {
++ namespace drawing { class XShape; }
++ namespace awt { class XControlModel; }
++} } }
++
++class SdrObject;
++
++/** Provides static helper functions for form controls. */
++class XclControlObjHelper
++{
++public:
++ /** Returns the API control model from the passed API shape object. */
++ static ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >
++ GetModelFromShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
++
++ /** Returns the component service name for the passed control type. */
++ static ::rtl::OUString GetTbxServiceName( sal_uInt16 nCtrlType );
++ /** Returns a default control name for the passed control type. */
++ static ::rtl::OUString GetTbxControlName( sal_uInt16 nCtrlType );
++
++ /** Returns the listener type (interface name) for macro events for the passed control type. */
++ static ::rtl::OUString GetTbxListenerType( sal_uInt16 nCtrlType );
++ /** Returns the event method (function name) for macro events for the passed control type. */
++ static ::rtl::OUString GetTbxEventMethod( sal_uInt16 nCtrlType );
++ /** Returns the script type string needed for a script event descriptor. */
++ static ::rtl::OUString GetTbxScriptType();
++
++ /** Returns the Calc macro name from an Excel macro name. */
++ static ::rtl::OUString GetScMacroName( const String& rXclMacroName );
++ /** Returns the Excel macro name from a Calc macro name. */
++ static String GetXclMacroName( const ::rtl::OUString& rScMacroName );
++};
++
++// ============================================================================
++
++#endif
++
+--- sc/source/filter/inc/xiescher.hxx.orig 1970-01-01 08:00:00.000000000 +0800
++++ sc/source/filter/inc/xiescher.hxx 2008-06-04 12:38:12.000000000 +0800
+@@ -0,0 +1,633 @@
++/*************************************************************************
++ *
++ * 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: xiescher.hxx,v $
++ * $Revision: 1.28 $
++ *
++ * This file is part of OpenOffice.org.
++ *
++ * OpenOffice.org is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 3
++ * only, as published by the Free Software Foundation.
++ *
++ * OpenOffice.org is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU Lesser General Public License version 3 for more details
++ * (a copy is included in the LICENSE file that accompanied this code).
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * version 3 along with OpenOffice.org. If not, see
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++#ifndef SC_XIESCHER_HXX
++#define SC_XIESCHER_HXX
++
++#include <vector>
++#include <list>
++#include <map>
++#include <svx/msdffimp.hxx>
++#include "xlescher.hxx"
++#include "xiroot.hxx"
++#include "xistring.hxx"
++
++namespace com { namespace sun { namespace star {
++ namespace script { struct ScriptEventDescriptor; }
++} } }
++
++class ScfProgressBar;
++class ScfPropertySet;
++
++// Text box data ==============================================================
++
++class XclImpTxoData : protected XclImpRoot
++{
++public:
++ explicit XclImpTxoData( const XclImpRoot& rRoot );
++
++ /** Reads a TXO record and following CONTINUE records for string and formatting data. */
++ void ReadTxo( XclImpStream& rStrm );
++
++ /** Returns the text orientation. */
++ inline sal_uInt16 GetOrientation() const { return maData.mnOrient; }
++ /** Returns the string data, if there is any. */
++ inline const XclImpString* GetString() const { return mxString.get(); }
++
++ /** Sets the text to the passed SdrObject, if it can take text. */
++ void ProcessSdrObject( SdrObject& rSdrObj ) const;
++
++private:
++ XclTxoData maData; /// Data from the TXO record.
++ XclImpStringRef mxString; /// Plain or rich string.
++};
++
++typedef ScfRef< XclImpTxoData > XclImpTxoDataRef;
++
++// Escher objects =============================================================
++
++class XclImpDrawObjBase;
++typedef ScfRef< XclImpDrawObjBase > XclImpDrawObjRef;
++
++/** Base class for drawing objects (OBJ records). */
++class XclImpDrawObjBase : protected XclImpRoot, ScfNoCopy
++{
++public:
++ explicit XclImpDrawObjBase( const XclImpRoot& rRoot );
++ virtual ~XclImpDrawObjBase();
++
++ /** Reads the FTCMO subrecord (common object data) in an OBJ record, returns a new object. */
++ static XclImpDrawObjRef ReadObjCmo( XclImpStream& rStrm );
++ /** Reads the contents of the specified subrecord of an OBJ record from stream. */
++ virtual void ReadSubRecord( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize );
++ /** Reads the client anchor from an msofbtClientAnchor Escher record. */
++ void ReadClientAnchor( SvStream& rEscherStrm, const DffRecordHeader& rHeader );
++
++ /** Sets common object data from FTCMO subrecord. */
++ void SetObjData( sal_uInt16 nObjType, sal_uInt16 nObjId, sal_uInt16 nObjFlags );
++ /** Sets shape data from Escher stream. */
++ void SetShapeData( sal_uInt32 nShapeId, sal_uInt32 nShapeFlags, sal_uInt32 nShapeBlipId );
+ /** Sets shape data from Escher stream. */
+ inline void SetVisible( const bool nObjVisible ) { mnObjVisible = nObjVisible; }
- /** Sets whether this is an area object (then its width and height must be greater than 0). */
- inline void SetAreaObj( bool bAreaObj ) { mbAreaObj = bAreaObj; }
- /** Sets the object anchor explicitly. */
-@@ -126,6 +128,8 @@ public:
- inline bool IsInsertSdr() const { return mbInsSdr; }
- /** Returns true, if Escher object is printable. */
- inline bool IsPrintable() const { return ::get_flag( mnObjFlags, EXC_OBJ_CMO_PRINTABLE ); }
++ /** Sets whether this is an area object (then its width and height must be greater than 0). */
++ inline void SetAreaObj( bool bAreaObj ) { mbAreaObj = bAreaObj; }
++ /** Sets the object anchor explicitly. */
++ void SetClientAnchor( const XclEscherAnchor& rAnchor );
++
++ /** If set, the SdrObject will not be created, processed, or inserted into the draw page. */
++ inline void SetInvalid() { mbValid = false; }
++ /** If set, the SdrObject will be created or processed, but not be inserted into the draw page. */
++ inline void SetSkipInsertSdr() { mbInsSdr = false; }
++
++ /** Returns the Calc sheet index of this object. */
++ inline SCTAB GetScTab() const { return maObjId.mnScTab; }
++ /** Returns the sheet index and Excel object identifier from OBJ record. */
++ inline const XclObjId& GetObjId() const { return maObjId; }
++ /** Returns the Excel object type from OBJ record. */
++ inline sal_uInt16 GetObjType() const { return mnObjType; }
++ /** Returns associated macro name, if set, otherwise zero length string. */
++ const String GetMacroName() const { return maMacroName; }
++
++ /** Returns the shape identifier used in the Escher stream. */
++ inline sal_uInt32 GetShapeId() const { return mnShapeId; }
++ /** Returns the shape flags from the Escher stream. */
++ inline sal_uInt32 GetShapeFlags() const { return mnShapeFlags; }
++ /** Returns the BLIP identifier for the meta file. */
++ inline sal_uInt32 GetShapeBlipId() const { return mnShapeBlipId; }
++
++ /** Returns true, if the object is valid and will be processed.. */
++ inline bool IsValid() const { return mbValid; }
++ /** Returns true, if the SdrObject will be created or processed, but not be inserted into the draw page. */
++ inline bool IsInsertSdr() const { return mbInsSdr; }
++ /** Returns true, if Escher object is printable. */
++ inline bool IsPrintable() const { return ::get_flag( mnObjFlags, EXC_OBJ_CMO_PRINTABLE ); }
+ /** Returns true, if Escher objest is not hidden. */
+ inline bool IsVisible() const { return mnObjVisible; }
-
- /** Returns true, if the passed size is valid for this object. */
- bool IsValidSize( const Rectangle& rAnchorRect ) const;
-@@ -162,6 +166,7 @@ private:
- bool mbValid; /// true = Object is valid, do processing and insertion.
- bool mbAreaObj; /// true = Width and height must be greater than 0.
- bool mbInsSdr; /// true = Insert the SdrObject into draw page.
++
++ /** Returns true, if the passed size is valid for this object. */
++ bool IsValidSize( const Rectangle& rAnchorRect ) const;
++ /** Returns the area in the sheet used by this object. */
++ ScRange GetUsedArea() const;
++ /** Returns the area on the drawing layer for this object. */
++ Rectangle GetAnchorRect() const;
++
++ /** Returns the needed size on the progress bar (calls virtual DoGetProgressSize() function). */
++ sal_Size GetProgressSize() const;
++ /** Additional processing for the passed SdrObject (calls virtual DoProcessSdrObj() function). */
++ void ProcessSdrObject( SdrObject& rSdrObj ) const;
++
++protected:
++ /** Reads the contents of the ftMacro sub structure in an OBJ record. */
++ void ReadMacro( XclImpStream& rStrm );
++
++ /** Derived classes may return a progress bar size different from 1. */
++ virtual sal_Size DoGetProgressSize() const;
++ /** Derived classes may perform additional processing for the passed SdrObject. */
++ virtual void DoProcessSdrObj( SdrObject& rSdrObj ) const;
++
++private:
++ typedef ScfRef< XclEscherAnchor > XclEscherAnchorRef;
++
++ XclEscherAnchorRef mxAnchor; /// The position of the object in the containing sheet.
++ XclObjId maObjId; /// Sheet index and object identifier.
++ sal_uInt16 mnObjType; /// The Excel object type from OBJ record.
++ sal_uInt16 mnObjFlags; /// Additional flags from OBJ record.
++ sal_uInt32 mnShapeId; /// Shape ID from Escher stream.
++ sal_uInt32 mnShapeFlags; /// Shape flags from Escher stream.
++ sal_uInt32 mnShapeBlipId; /// The BLIP identifier (meta file).
++ String maMacroName; /// Name of an attached macro.
++ bool mbValid; /// true = Object is valid, do processing and insertion.
++ bool mbAreaObj; /// true = Width and height must be greater than 0.
++ bool mbInsSdr; /// true = Insert the SdrObject into draw page.
+ bool mnObjVisible; /// falgs for visibility
- };
-
- // ----------------------------------------------------------------------------
---- sc/source/filter/excel/xiescher.cxx.orig 2008-06-04 11:58:09.000000000 +0800
-+++ sc/source/filter/excel/xiescher.cxx 2008-06-04 11:59:19.000000000 +0800
-@@ -297,7 +297,8 @@ XclImpDrawObjBase::XclImpDrawObjBase( co
++};
++
++// ----------------------------------------------------------------------------
++
++/** A simple drawing object, e.g. line, rectangle, textbox, or bitmap. */
++class XclImpDrawingObj : public XclImpDrawObjBase
++{
++public:
++ /** @param bAreaObj true = Width and height of the object must be greater than 0. */
++ explicit XclImpDrawingObj( const XclImpRoot& rRoot, bool bAreaObj );
++
++ /** Stores the passed textbox data from a TXO record. */
++ inline void SetTxoData( XclImpTxoDataRef xTxoData ) { mxTxoData = xTxoData; }
++
++ /** Returns the text orientation from the contained textbox data. */
++ inline sal_uInt16 GetOrientation() const { return mxTxoData.is() ? mxTxoData->GetOrientation() : EXC_TXO_TEXTROT_NONE; }
++ /** Returns the string from the contained textbox data. */
++ inline const XclImpString* GetString() const { return mxTxoData.is() ? mxTxoData->GetString() : 0; }
++
++protected:
++ /** Inserts the contained text data at the passed object. */
++ virtual void DoProcessSdrObj( SdrObject& rSdrObj ) const;
++
++private:
++ XclImpTxoDataRef mxTxoData; /// Textbox data from TXO record.
++};
++
++// ----------------------------------------------------------------------------
++
++/** A note object, which is a specialized text box objext. */
++class XclImpNoteObj : public XclImpDrawingObj
++{
++public:
++ explicit XclImpNoteObj( const XclImpRoot& rRoot );
++
++ /** Sets note flags and the note position in the Calc sheet. */
++ void SetNoteData( const ScAddress& rScPos, sal_uInt16 nNoteFlags );
++
++protected:
++ /** Inserts the note into the document, sets visibility. */
++ virtual void DoProcessSdrObj( SdrObject& rSdrObj ) const;
++
++private:
++ ScAddress maScPos; /// Cell position of the note object.
++ sal_uInt16 mnNoteFlags; /// Flags from NOTE record.
++};
++
++// ----------------------------------------------------------------------------
++
++/** Helper class for form controils to manage spreadsheet links . */
++class XclImpControlObjHelper
++{
++public:
++ typedef ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > XControlModelRef;
++
++public:
++ explicit XclImpControlObjHelper( XclCtrlBindMode eBindMode );
++ virtual ~XclImpControlObjHelper();
++
++ /** Sets the control model from the created form control object. */
++ inline void SetControlModel( XControlModelRef xCtrlModel ) { mxCtrlModel = xCtrlModel; }
++
++protected:
++ /** Reads the formula for the linked cell from the current position of the stream. */
++ void ReadCellLinkFormula( XclImpStream& rStrm );
++ /** Reads the formula for the source range from the current position of the stream. */
++ void ReadSrcRangeFormula( XclImpStream& rStrm );
++
++ /** Returns true, if a linked cell address is present. */
++ inline bool HasCellLink() const { return mxCellLink.is(); }
++ /** Returns true, if a linked source cell range is present. */
++ inline bool HasSourceRange() const { return mxSrcRange.is(); }
++
++ /** Returns the property set of the form control object. */
++ ScfPropertySet GetControlPropSet() const;
++ /** Tries to set a spreadsheet cell link and source range link at the passed form control. */
++ void ConvertSheetLinks( const XclImpRoot& rRoot, SdrObject& rSdrObj ) const;
++
++private:
++ XControlModelRef mxCtrlModel; /// Model of the created form control object.
++ ScfRef< ScAddress > mxCellLink; /// Linked cell in the Calc document.
++ ScfRef< ScRange > mxSrcRange; /// Source data range in the Calc document.
++ XclCtrlBindMode meBindMode; /// Value binding mode.
++};
++
++// ----------------------------------------------------------------------------
++
++/** An old form control object (does not use the OLE mechanism, but is a "simple" drawing object). */
++class XclImpTbxControlObj : public XclImpDrawingObj, public XclImpControlObjHelper
++{
++public:
++ explicit XclImpTbxControlObj( const XclImpRoot& rRoot );
++
++ /** Reads the contents of the specified subrecord of an OBJ record from stream. */
++ virtual void ReadSubRecord( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize );
++
++ /** Returns the complete component service name for this control. */
++ ::rtl::OUString GetServiceName() const;
++ /** Tries to fill the passed descriptor with imported macro data.
++ @return true = Control is associated with a macro, rEvent contains valid data. */
++ bool FillMacroDescriptor(
++ ::com::sun::star::script::ScriptEventDescriptor& rEvent ) const;
++
++protected:
++ /** Overloaded to do additional processing on the SdrObject. */
++ virtual void DoProcessSdrObj( SdrObject& rSdrObj ) const;
++
++private:
++ /** Reads the contents of the ftCbls sub structure in an OBJ record. */
++ void ReadCbls( XclImpStream& rStrm );
++ /** Reads the contents of the ftCblsFmla sub structure in an OBJ record. */
++ void ReadCblsFmla( XclImpStream& rStrm );
++ /** Reads the contents of the ftLbsData sub structure in an OBJ record. */
++ void ReadLbsData( XclImpStream& rStrm );
++ /** Reads the contents of the ftSbs sub structure in an OBJ record. */
++ void ReadSbs( XclImpStream& rStrm );
++ /** Reads the contents of the ftGboData sub structure in an OBJ record. */
++ void ReadGboData( XclImpStream& rStrm );
++
++private:
++ ScfInt16Vec maMultiSel; /// Indexes of all selected entries in a multi selection.
++ sal_uInt16 mnState; /// Checked/unchecked state.
++ sal_Int16 mnSelEntry; /// Index of selected entry (1-based).
++ sal_Int16 mnSelType; /// Selection type.
++ sal_Int16 mnLineCount; /// Combobox dropdown line count.
++ sal_Int16 mnScrollValue; /// Scrollbar: Current value.
++ sal_Int16 mnScrollMin; /// Scrollbar: Minimum value.
++ sal_Int16 mnScrollMax; /// Scrollbar: Maximum value.
++ sal_Int16 mnScrollStep; /// Scrollbar: Single step.
++ sal_Int16 mnScrollPage; /// Scrollbar: Page step.
++ bool mbFlatButton; /// False = 3D button style; True = Flat button style.
++ bool mbFlatBorder; /// False = 3D border style; True = Flat border style.
++ bool mbScrollHor; /// Scrollbar: true = horizontal.
++};
++
++// ----------------------------------------------------------------------------
++
++/** A common Escher OLE object, or an OLE form control. */
++class XclImpOleObj : public XclImpDrawObjBase, public XclImpControlObjHelper
++{
++public:
++ explicit XclImpOleObj( const XclImpRoot& rRoot );
++
++ /** Reads the contents of the specified subrecord of an OBJ record from stream. */
++ virtual void ReadSubRecord( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize );
++
++ /** Allows to detect whether the object is iconified. */
++ inline bool IsIconified() const { return mbAsSymbol; }
++ /** Returns true, if this object is a form control, and false, if it is a common OLE object. */
++ inline bool IsControl() const { return mbControl && mbUseCtlsStrm; }
++
++ /** Returns the OLE storage name used in the Excel document. */
++ inline const String& GetStorageName() const { return maStorageName; }
++ /** Returns the position in Ctrl stream for additional form control data. */
++ inline sal_Size GetCtlsStreamPos() const { return mnCtlsStrmPos; }
++
++protected:
++ /** Overloaded to do additional processing on the SdrObject. */
++ virtual void DoProcessSdrObj( SdrObject& rSdrObj ) const;
++
++private:
++ /** Reads the contents of the ftPioGrbit sub structure in an OBJ record. */
++ void ReadPioGrbit( XclImpStream& rStrm );
++ /** Reads the contents of the ftPictFmla sub structure in an OBJ record. */
++ void ReadPictFmla( XclImpStream& rStrm, sal_uInt16 nRecSize );
++
++private:
++ String maStorageName; /// Name of the OLE storage for this object.
++ sal_Size mnCtlsStrmPos; /// Position in 'Ctls' stream for controls.
++ bool mbAsSymbol; /// true = Show as symbol.
++ bool mbLinked; /// true = Linked; false = Embedded.
++ bool mbControl; /// true = Form control, false = OLE object.
++ bool mbUseCtlsStrm; /// true = Form control data in 'Ctls' stream, false = Own storage.
++};
++
++// ----------------------------------------------------------------------------
++
++struct XclChLineFormat;
++struct XclChAreaFormat;
++class XclImpChart;
++
++/** A chart object. This is the drawing object wrapper for the chart data. */
++class XclImpChartObj : public XclImpDrawObjBase
++{
++public:
++ /** @param bOwnTab True = chart is on an own sheet; false = chart is an embedded object. */
++ explicit XclImpChartObj( const XclImpRoot& rRoot, bool bOwnTab );
++
++ /** Reads remaining data from a BIFF5 OBJ record. */
++ void ReadObj5( XclImpStream& rStrm );
++ /** Reads the complete chart substream (BOF/EOF block).
++ @descr The passed stream must be located in the BOF record of the chart substream. */
++ void ReadChartSubStream( XclImpStream& rStrm );
++
++ /** Creates and returns a new SdrObject that contains the chart. Caller takes ownership! */
++ SdrObject* CreateSdrObject( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const;
++
++protected:
++ /** Returns the needed size on the progress bar. */
++ virtual sal_Size DoGetProgressSize() const;
++
++private:
++ /** Calculates the object anchor of a sheet chart (chart fills one page). */
++ void FinalizeTabChart();
++
++private:
++ typedef ScfRef< XclImpChart > XclImpChartRef;
++ typedef ScfRef< XclChLineFormat > XclChLineFmtRef;
++ typedef ScfRef< XclChAreaFormat > XclChAreaFmtRef;
++
++ XclImpChartRef mxChart; /// The chart itself (BOF/EOF substream data).
++ XclChLineFmtRef mxLineFmt; /// Line formatting for chart frame (BIFF5).
++ XclChAreaFmtRef mxAreaFmt; /// Area formatting for chart frame (BIFF5).
++ bool mbOwnTab; /// true = own sheet; false = embedded object.
++};
++
++// Escher stream conversion ===================================================
++
++/** The solver container collects all connector rules for connected objects. */
++class XclImpSolverContainer : public SvxMSDffSolverContainer
++{
++public:
++ /** Reads the entire solver container. Stream must point to begin of container header. */
++ void ReadSolverContainer( SvStream& rEscherStrm );
++
++ /** Inserts a new pointer to an SdrObject by the related shape ID. */
++ void InsertSdrObjectInfo( const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj );
++ /** Removes a pointer to an SdrObject by the related shape ID. */
++ void RemoveSdrObjectInfo( const XclImpDrawObjBase& rDrawObj );
++
++ /** Inserts the SdrObject pointers into all connector rules. */
++ void UpdateConnectorRules();
++ /** Removes all contained connector rules. */
++ void RemoveConnectorRules();
++
++private:
++ /** Returns the first connector rule from the internal list. */
++ SvxMSDffConnectorRule* GetFirstRule();
++ /** Returns the next connector rule from the internal list. */
++ SvxMSDffConnectorRule* GetNextRule();
++ /** Updates the data of a connected shape in a connector rule. */
++ void UpdateConnection( sal_uInt32 nShapeId, SdrObject*& rpSdrObj, sal_uInt32* pnShapeFlags = 0 );
++
++private:
++ /** Stores data about an SdrObject processed during import. */
++ struct XclImpSdrInfo
++ {
++ SdrObject* mpSdrObj; /// Pointer to an SdrObject.
++ sal_uInt32 mnShapeFlags; /// Shape flags from escher stream.
++ inline explicit XclImpSdrInfo() : mpSdrObj( 0 ), mnShapeFlags( 0 ) {}
++ inline void Set( SdrObject* pSdrObj, sal_uInt32 nShapeFlags )
++ { mpSdrObj = pSdrObj; mnShapeFlags = nShapeFlags; }
++ };
++ typedef ::std::map< sal_uInt32, XclImpSdrInfo > XclImpSdrInfoMap;
++
++ XclImpSdrInfoMap maSdrInfoMap; /// Maps shape IDs to SdrObjects.
++};
++
++// ----------------------------------------------------------------------------
++
++class XclImpObjectManager;
++class XclImpOcxConverter;
++
++/** Derived from SvxMSDffManager, contains core implementation of Escher stream import. */
++class XclImpDffManager : public SvxMSDffManager, protected XclImpRoot
++{
++public:
++ explicit XclImpDffManager(
++ const XclImpRoot& rRoot,
++ XclImpObjectManager& rObjManager,
++ SvStream& rEscherStrm );
++ virtual ~XclImpDffManager();
++
++ /** Initializes the internal progress bar with the passed size and starts it. */
++ void StartProgressBar( sal_Size nProgressSize );
++ /** Processes the leading drawing group container in the Escher stream. */
++ void ProcessDrawingGroup( SvStream& rEscherStrm );
++ /** Processes a drawing container for a sheet in the Escher stream, converts all objects. */
++ void ProcessDrawing( SvStream& rEscherStrm, sal_Size nStrmPos );
++ /** Processes a chart from an Excel chart sheet, converts it to a chart object. */
++ void ProcessTabChart( const XclImpChartObj& rChartObj );
++
++ /** Returns the used area in the sheet with the passed index. */
++ ScRange GetUsedArea( SCTAB nScTab ) const;
++
++protected:
++ /** Reads the client anchor from the Escher stream and sets it at the correct Escher object. */
++ virtual void ProcessClientAnchor2(
++ SvStream& rEscherStrm,
++ DffRecordHeader& rHeader,
++ void* pClientData,
++ DffObjData& rObjData );
++ /** Processes an Escher object, reads properties from Escher stream. */
++ virtual SdrObject* ProcessObj(
++ SvStream& rEscherStrm,
++ DffObjData& rObjData,
++ void* pClientData,
++ Rectangle& rTextRect,
++ SdrObject* pOldSdrObj = 0 );
++ /** Returns the BLIP stream position, based on the passed Escher stream position. */
++ virtual ULONG Calc_nBLIPPos( ULONG nOrgVal, ULONG nStreamPos ) const;
++ /** Returns a color from the Excel color palette. */
++ virtual FASTBOOL GetColorFromPalette( USHORT nIndex, Color& rColor ) const;
++
++private:
++ /** Reads contents of a hyperlink property and returns the extracted URL. */
++ ::rtl::OUString ReadHlinkProperty( SvStream& rEscherStrm ) const;
++
++ /** Processes a drawing group container (global drawing data). */
++ void ProcessDggContainer( SvStream& rEscherStrm, const DffRecordHeader& rDggHeader );
++ /** Processes a drawing container (all drawing data of a sheet). */
++ void ProcessDgContainer( SvStream& rEscherStrm, const DffRecordHeader& rDgHeader );
++ /** Processes the global shape group container (all shapes of a sheet). */
++ void ProcessShGrContainer( SvStream& rEscherStrm, const DffRecordHeader& rShGrHeader );
++ /** Processes the solver container (connectors of a sheet). */
++ void ProcessSolverContainer( SvStream& rEscherStrm, const DffRecordHeader& rSolverHeader );
++ /** Processes a shape or shape group container (one top-level shape). */
++ void ProcessShContainer( SvStream& rEscherStrm, const DffRecordHeader& rShHeader );
++
++ /** Inserts the passed SdrObject into the document. This function takes ownership of pSdrObj! */
++ void InsertSdrObject( const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj );
++
++ /** Tries to create a custom SdrObject for specific object types. */
++ SdrObject* CreateCustomSdrObject( XclImpDrawObjBase& rDrawObj, const Rectangle& rAnchorRect );
++ /** Creates the SdrObject for the passed Excel OLE object. */
++ SdrObject* CreateSdrObject( XclImpOleObj& rOleObj, const Rectangle& rAnchorRect );
++ /** Creates the SdrObject for the passed Excel textbox control object. */
++ SdrObject* CreateSdrObject( XclImpTbxControlObj& rTbxCtrlObj, const Rectangle& rAnchorRect );
++ /** Creates the SdrObject for the passed Excel chart object. */
++ SdrObject* CreateSdrObject( const XclImpChartObj& rChartObj, const Rectangle& rAnchorRect );
++
++ /** Updates the used area of a sheet with the position and size of the passed object. */
++ void UpdateUsedArea( const XclImpDrawObjBase& rDrawObj );
++
++private:
++ typedef ::std::map< SCTAB, ScRange > ScRangeMap;
++ typedef ScfRef< ScfProgressBar > ScfProgressBarRef;
++ typedef ScfRef< XclImpOcxConverter > XclImpOcxConvRef;
++
++ XclImpObjectManager& mrObjManager; /// The Excel object manager.
++ XclImpSolverContainer maSolverCont; /// The solver container for connector rules.
++ ScRangeMap maUsedAreaMap; /// Used ranges for all sheets.
++ ScfProgressBarRef mxProgress; /// The progress bar used in ProcessObj().
++ XclImpOcxConvRef mxOcxConverter; /// The form controls converter.
++ sal_uInt32 mnOleImpFlags; /// Application OLE import settings.
++};
++
++// The object manager =========================================================
++
++/** Stores all drawing and OLE objects and additional data related to these objects. */
++class XclImpObjectManager : protected XclImpRoot
++{
++public:
++ explicit XclImpObjectManager( const XclImpRoot& rRoot );
++ virtual ~XclImpObjectManager();
++
++ // *** Read Excel records *** ---------------------------------------------
++
++ /** Reads the OBJ record (BIFF5 only). */
++ void ReadObj5( XclImpStream& rStrm );
++
++ /** Reads the MSODRAWINGGROUP record. */
++ void ReadMsoDrawingGroup( XclImpStream& rStrm );
++ /** Reads the MSODRAWING or MSODRAWINGSELECTION record. */
++ void ReadMsoDrawing( XclImpStream& rStrm );
++ /** Reads the NOTE record. */
++ void ReadNote( XclImpStream& rStrm );
++
++ /** Inserts a new chart object and reads the chart substream (BOF/EOF block).
++ @descr Used to import chart sheets, which do not have a corresponding OBJ record. */
++ void ReadTabChart( XclImpStream& rStrm );
++
++ // *** Drawing objects *** ------------------------------------------------
++
++ /** Finds the OBJ record data related to the Escher shape at the passed position. */
++ XclImpDrawObjRef FindDrawObj( const DffRecordHeader& rHeader ) const;
++ /** Finds the OBJ record data specified by the passed object identifier. */
++ XclImpDrawObjRef FindDrawObj( const XclObjId& rObjId ) const;
++ /** Finds the TXO record data related to the Escher shape at the passed position. */
++ XclImpTxoDataRef FindTxoData( const DffRecordHeader& rHeader ) const;
++
++ /** Sets the object with the passed identification to be ignored on import. */
++ void SetInvalidObj( SCTAB nScTab, sal_uInt16 nObjId );
++
++ // *** Drawing object conversion *** --------------------------------------
++
++ /** Returns the DFF manager (Escher stream converter). Don't call before the Escher stream is read. */
++ XclImpDffManager& GetDffManager();
++ /** Inserts all objects into the Calc document. */
++ void ConvertObjects();
++
++ /** Returns the used area in the sheet with the passed index. */
++ ScRange GetUsedArea( SCTAB nScTab ) const;
++
++ // ------------------------------------------------------------------------
++private:
++ /** Reads contents of an Escher record and append data to internal Escher stream. */
++ void ReadEscherRecord( XclImpStream& rStrm );
++ /** Reads a BIFF8 OBJ record following an MSODRAWING record. */
++ void ReadObj8( XclImpStream& rStrm );
++ /** Reads the TXO record. */
++ void ReadTxo( XclImpStream& rStrm );
++
++ /** Tries to start a complete chart substream by checking if next record is a BOF. */
++ bool StartChartSubStream( XclImpStream& rStrm );
++
++ /** Returns the size of the progress bar shown while processing all objects. */
++ sal_Size GetProgressSize() const;
++
++ // ------------------------------------------------------------------------
++private:
++ typedef ::std::vector< sal_Size > StreamPosVec;
++ typedef ::std::map< sal_Size, XclImpDrawObjRef > XclImpObjMap;
++ typedef ::std::map< XclObjId, XclImpDrawObjRef > XclImpObjMapById;
++ typedef ::std::map< sal_Size, XclImpTxoDataRef > XclImpTxoMap;
++ typedef ScfRef< XclImpChartObj > XclImpChartObjRef;
++ typedef ::std::list< XclImpChartObjRef > XclImpChartObjList;
++ typedef ScfRef< XclImpDffManager > XclImpDffMgrRef;
++ typedef ::std::vector< XclObjId > XclObjIdVec;
++
++ SvMemoryStream maEscherStrm; /// Copy of Escher stream in memory.
++ StreamPosVec maTabStrmPos; /// Start positions of Escher data for sheets.
++ XclImpObjMap maObjMap; /// Maps drawing objects to Escher stream position.
++ XclImpObjMapById maObjMapId; /// Maps drawing objects to sheet index and object ID.
++ XclImpTxoMap maTxoMap; /// Maps TXO textbox data to sheet index and object ID.
++ XclImpChartObjList maTabCharts; /// Charts imported from Excel chart sheets.
++ XclImpDffMgrRef mxDffManager; /// The Escher stream converter.
++ XclObjIdVec maInvalidObjs; /// All Escher objects to skip.
++};
++
++// Escher property set helper =================================================
++
++/** This class reads an Escher property set (msofbtOPT record).
++ @descr It can return separate property values or an item set which contains
++ items translated from these properties. */
++class XclImpEscherPropSet : protected XclImpRoot
++{
++public:
++ explicit XclImpEscherPropSet( const XclImpRoot& rRoot );
++
++ /** Reads an Escher property set from the stream.
++ @descr The stream must point to the start of an Escher record containing properties. */
++ void Read( XclImpStream& rStrm );
++
++ /** Returns the specified property or the default value, if not extant. */
++ sal_uInt32 GetPropertyValue( sal_uInt16 nPropId, sal_uInt32 nDefault = 0 ) const;
++
++ /** Translates the properties and fills the item set. */
++ void FillToItemSet( SfxItemSet& rItemSet ) const;
++
++private:
++ typedef ::std::auto_ptr< SvMemoryStream > SvMemoryStreamPtr;
++
++ XclImpObjectManager maObjManager; /// Local object manager, contains SVX DFF manager.
++ XclImpDffManager& mrDffManager; /// Reference to DFF manager contained in object manager.
++ SvMemoryStreamPtr mxMemStrm; /// Helper stream.
++};
++
++XclImpStream& operator>>( XclImpStream& rStrm, XclImpEscherPropSet& rPropSet );
++
++// ============================================================================
++
++#endif
++
+--- sc/source/filter/excel/xiescher.cxx.orig 2008-04-11 04:16:07.000000000 +0800
++++ sc/source/filter/excel/xiescher.cxx 2008-06-04 12:38:12.000000000 +0800
+@@ -296,7 +296,8 @@ XclImpDrawObjBase::XclImpDrawObjBase( co
mnShapeBlipId( 0 ),
mbValid( true ),
mbAreaObj( false ),
@@ -260,7 +6048,7 @@
{
}
-@@ -864,6 +865,7 @@ void XclImpTbxControlObj::DoProcessSdrOb
+@@ -790,6 +791,7 @@ void XclImpTbxControlObj::DoProcessSdrOb
// control printable?
aPropSet.SetBoolProperty( CREATE_OUSTRING( "Printable" ), IsPrintable() );
@@ -268,7 +6056,7 @@
// #118053# #i51348# set internal name of the control (use name from SdrObject, if extant)
OUString aCtrlName = rSdrObj.GetName();
-@@ -1686,6 +1688,7 @@ SdrObject* XclImpDffManager::ProcessObj(
+@@ -1552,6 +1554,7 @@ SdrObject* XclImpDffManager::ProcessObj(
// set shape information from Escher stream
xDrawObj->SetShapeData( rObjData.nShapeId, rObjData.nSpFlags, GetPropertyValue( DFF_Prop_pib ) );
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]