2 * This file is part of the LibreOffice project.
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 * This file incorporates work covered by the following license notice:
10 * Licensed to the Apache Software Foundation (ASF) under one or more
11 * contributor license agreements. See the NOTICE file distributed
12 * with this work for additional information regarding copyright
13 * ownership. The ASF licenses this file to you under the Apache
14 * License, Version 2.0 (the "License"); you may not use this file
15 * except in compliance with the License. You may obtain a copy of
16 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 #include <uielement/statusbarmerger.hxx>
21 using com::sun::star::frame::XFrame
;
22 using com::sun::star::uno::Reference
;
23 using com::sun::star::beans::PropertyValue
;
24 using com::sun::star::uno::Sequence
;
30 static const char MERGE_STATUSBAR_URL
[] = "URL";
31 static const char MERGE_STATUSBAR_TITLE
[] = "Title";
32 static const char MERGE_STATUSBAR_CONTEXT
[] = "Context";
33 static const char MERGE_STATUSBAR_ALIGN
[] = "Alignment";
34 static const char MERGE_STATUSBAR_AUTOSIZE
[] = "AutoSize";
35 static const char MERGE_STATUSBAR_OWNERDRAW
[] = "OwnerDraw";
36 static const char MERGE_STATUSBAR_WIDTH
[] = "Width";
38 static const char STATUSBAR_ALIGN_LEFT
[] = "left";
39 static const char STATUSBAR_ALIGN_CENTER
[] = "center";
40 static const char STATUSBAR_ALIGN_RIGHT
[] = "right";
42 static const char MERGECOMMAND_ADDAFTER
[] = "AddAfter";
43 static const char MERGECOMMAND_ADDBEFORE
[] = "AddBefore";
44 static const char MERGECOMMAND_REPLACE
[] = "Replace";
45 static const char MERGECOMMAND_REMOVE
[] = "Remove";
47 static const char MERGEFALLBACK_ADDLAST
[] = "AddLast";
48 static const char MERGEFALLBACK_ADDFIRST
[] = "AddFirst";
49 static const char MERGEFALLBACK_IGNORE
[] = "Ignore";
52 static void lcl_ConvertSequenceToValues(
53 const Sequence
< PropertyValue
> &rSequence
,
54 AddonStatusbarItem
&rItem
)
57 sal_Bool bAutoSize
= sal_False
;
58 sal_Bool bOwnerDraw
= sal_False
;
60 PropertyValue aPropVal
;
61 for ( sal_Int32 i
= 0; i
< rSequence
.getLength(); i
++ )
63 aPropVal
= rSequence
[i
];
64 if ( aPropVal
.Name
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGE_STATUSBAR_URL
) ) )
65 aPropVal
.Value
>>= rItem
.aCommandURL
;
66 else if ( aPropVal
.Name
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGE_STATUSBAR_TITLE
) ) )
67 aPropVal
.Value
>>= rItem
.aLabel
;
68 else if ( aPropVal
.Name
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGE_STATUSBAR_CONTEXT
) ) )
69 aPropVal
.Value
>>= rItem
.aContext
;
70 else if ( aPropVal
.Name
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGE_STATUSBAR_ALIGN
) ) )
71 aPropVal
.Value
>>= sAlignment
;
72 else if ( aPropVal
.Name
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGE_STATUSBAR_AUTOSIZE
) ) )
73 aPropVal
.Value
>>= bAutoSize
;
74 else if ( aPropVal
.Name
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGE_STATUSBAR_OWNERDRAW
) ) )
75 aPropVal
.Value
>>= bOwnerDraw
;
76 else if ( aPropVal
.Name
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGE_STATUSBAR_WIDTH
) ) )
79 aPropVal
.Value
>>= aWidth
;
80 rItem
.nWidth
= sal_uInt16( aWidth
);
84 sal_uInt16
nItemBits(0);
86 nItemBits
|= SIB_AUTOSIZE
;
88 nItemBits
|= SIB_USERDRAW
;
89 if ( sAlignment
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( STATUSBAR_ALIGN_CENTER
)))
90 nItemBits
|= SIB_CENTER
;
91 else if ( sAlignment
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( STATUSBAR_ALIGN_RIGHT
)))
92 nItemBits
|= SIB_RIGHT
;
94 // if unset, defaults to left alignment
95 nItemBits
|= SIB_LEFT
;
96 rItem
.nItemBits
= nItemBits
;
99 static void lcl_CreateStatusbarItem( StatusBar
* pStatusbar
,
102 const AddonStatusbarItem
& rAddonItem
)
104 pStatusbar
->InsertItem( nItemId
,
106 rAddonItem
.nItemBits
,
109 pStatusbar
->SetItemCommand( nItemId
, rAddonItem
.aCommandURL
);
110 pStatusbar
->SetQuickHelpText( nItemId
, rAddonItem
.aLabel
);
111 pStatusbar
->SetAccessibleName( nItemId
, rAddonItem
.aLabel
);
113 // add-on specific data
114 AddonStatusbarItemData
*pUserData
= new AddonStatusbarItemData
;
115 pUserData
->aLabel
= rAddonItem
.aLabel
;
116 pUserData
->nItemBits
= rAddonItem
.nItemBits
;
117 pStatusbar
->SetItemData( nItemId
, pUserData
);
120 static bool lcl_MergeItems( StatusBar
* pStatusbar
,
122 sal_uInt16 nModIndex
,
124 const ::rtl::OUString
& rModuleIdentifier
,
125 const AddonStatusbarItemContainer
& rAddonItems
)
127 const sal_uInt16
nSize( rAddonItems
.size() );
128 for ( sal_Int32 i
= 0; i
< nSize
; i
++ )
130 const AddonStatusbarItem
& rItem
= rAddonItems
[i
];
131 if ( !StatusbarMerger::IsCorrectContext( rItem
.aContext
, rModuleIdentifier
) )
134 sal_uInt16 nInsPos
= nPos
+ nModIndex
+ i
;
135 if ( nInsPos
> pStatusbar
->GetItemCount() )
136 nInsPos
= STATUSBAR_APPEND
;
138 lcl_CreateStatusbarItem( pStatusbar
, nInsPos
, rItemId
, rItem
);
145 static bool lcl_ReplaceItem( StatusBar
* pStatusbar
,
148 const ::rtl::OUString
& rModuleIdentifier
,
149 const AddonStatusbarItemContainer
& rAddonToolbarItems
)
151 pStatusbar
->RemoveItem( pStatusbar
->GetItemId( nPos
) );
152 return lcl_MergeItems( pStatusbar
, nPos
, 0, rItemId
, rModuleIdentifier
, rAddonToolbarItems
);
155 static bool lcl_RemoveItems( StatusBar
* pStatusbar
,
157 const ::rtl::OUString
& rMergeCommandParameter
)
159 sal_Int32 nCount
= rMergeCommandParameter
.toInt32();
162 for ( sal_Int32 i
= 0; i
< nCount
; i
++ )
164 if ( nPos
< pStatusbar
->GetItemCount() )
165 pStatusbar
->RemoveItem( nPos
);
173 bool StatusbarMerger::IsCorrectContext(
174 const OUString
& rContext
,
175 const OUString
& rModuleIdentifier
)
177 return (( rContext
.getLength() == 0 ) || ( rContext
.indexOf( rModuleIdentifier
) >= 0 ));
180 bool StatusbarMerger::ConvertSeqSeqToVector(
181 const Sequence
< Sequence
< PropertyValue
> > &rSequence
,
182 AddonStatusbarItemContainer
& rContainer
)
184 for ( sal_Int32 i
= 0; i
< rSequence
.getLength(); i
++ )
186 AddonStatusbarItem aStatusBarItem
;
187 lcl_ConvertSequenceToValues( rSequence
[i
], aStatusBarItem
);
188 rContainer
.push_back( aStatusBarItem
);
194 sal_uInt16
StatusbarMerger::FindReferencePos(
195 StatusBar
* pStatusbar
,
196 const OUString
& rReferencePoint
)
198 for ( sal_uInt16 nPos
= 0; nPos
< pStatusbar
->GetItemCount(); nPos
++ )
200 const ::rtl::OUString rCmd
= pStatusbar
->GetItemCommand( pStatusbar
->GetItemId( nPos
) );
201 if ( rReferencePoint
== rCmd
)
205 return STATUSBAR_ITEM_NOTFOUND
;
208 bool StatusbarMerger::ProcessMergeOperation(
209 StatusBar
* pStatusbar
,
212 const ::rtl::OUString
& rModuleIdentifier
,
213 const ::rtl::OUString
& rMergeCommand
,
214 const ::rtl::OUString
& rMergeCommandParameter
,
215 const AddonStatusbarItemContainer
& rItems
)
217 if ( rMergeCommand
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGECOMMAND_ADDAFTER
) ) )
218 return lcl_MergeItems( pStatusbar
, nPos
, 1, rItemId
, rModuleIdentifier
, rItems
);
219 else if ( rMergeCommand
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGECOMMAND_ADDBEFORE
) ) )
220 return lcl_MergeItems( pStatusbar
, nPos
, 0, rItemId
, rModuleIdentifier
, rItems
);
221 else if ( rMergeCommand
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGECOMMAND_REPLACE
) ) )
222 return lcl_ReplaceItem( pStatusbar
, nPos
, rItemId
, rModuleIdentifier
, rItems
);
223 else if ( rMergeCommand
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGECOMMAND_REMOVE
) ) )
224 return lcl_RemoveItems( pStatusbar
, nPos
, rMergeCommandParameter
);
229 bool StatusbarMerger::ProcessMergeFallback(
230 StatusBar
* pStatusbar
,
233 const ::rtl::OUString
& rModuleIdentifier
,
234 const ::rtl::OUString
& rMergeCommand
,
235 const ::rtl::OUString
& rMergeFallback
,
236 const AddonStatusbarItemContainer
& rItems
)
238 // fallback IGNORE or REPLACE/REMOVE item not found
239 if (( rMergeFallback
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGEFALLBACK_IGNORE
))) ||
240 ( rMergeCommand
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGECOMMAND_REPLACE
))) ||
241 ( rMergeCommand
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGECOMMAND_REMOVE
))) )
245 else if (( rMergeCommand
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGECOMMAND_ADDBEFORE
))) ||
246 ( rMergeCommand
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGECOMMAND_ADDAFTER
))) )
248 if ( rMergeFallback
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGEFALLBACK_ADDFIRST
)))
249 return lcl_MergeItems( pStatusbar
, 0, 0, rItemId
, rModuleIdentifier
, rItems
);
250 else if ( rMergeFallback
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( MERGEFALLBACK_ADDLAST
)))
251 return lcl_MergeItems( pStatusbar
, STATUSBAR_APPEND
, 0, rItemId
, rModuleIdentifier
, rItems
);