bump product version to 4.1.6.2
[LibreOffice.git] / framework / source / uielement / statusbarmerger.cxx
blob098c621536daa3b5ca69072183a9fb7217b668fd
1 /*
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>
20 using rtl::OUString;
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;
26 namespace framework
28 namespace {
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 )
56 OUString sAlignment;
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 ) ) )
78 sal_Int32 aWidth = 0;
79 aPropVal.Value >>= aWidth;
80 rItem.nWidth = sal_uInt16( aWidth );
84 sal_uInt16 nItemBits(0);
85 if ( bAutoSize )
86 nItemBits |= SIB_AUTOSIZE;
87 if ( bOwnerDraw )
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;
93 else
94 // if unset, defaults to left alignment
95 nItemBits |= SIB_LEFT;
96 rItem.nItemBits = nItemBits;
99 static void lcl_CreateStatusbarItem( StatusBar* pStatusbar,
100 sal_uInt16 nPos,
101 sal_uInt16 nItemId,
102 const AddonStatusbarItem& rAddonItem )
104 pStatusbar->InsertItem( nItemId,
105 rAddonItem.nWidth,
106 rAddonItem.nItemBits,
107 STATUSBAR_OFFSET,
108 nPos );
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,
121 sal_uInt16 nPos,
122 sal_uInt16 nModIndex,
123 sal_uInt16& rItemId,
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 ) )
132 continue;
134 sal_uInt16 nInsPos = nPos + nModIndex + i;
135 if ( nInsPos > pStatusbar->GetItemCount() )
136 nInsPos = STATUSBAR_APPEND;
138 lcl_CreateStatusbarItem( pStatusbar, nInsPos, rItemId, rItem );
139 ++rItemId;
142 return true;
145 static bool lcl_ReplaceItem( StatusBar* pStatusbar,
146 sal_uInt16 nPos,
147 sal_uInt16& rItemId,
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,
156 sal_uInt16 nPos,
157 const ::rtl::OUString& rMergeCommandParameter )
159 sal_Int32 nCount = rMergeCommandParameter.toInt32();
160 if ( nCount > 0 )
162 for ( sal_Int32 i = 0; i < nCount; i++ )
164 if ( nPos < pStatusbar->GetItemCount() )
165 pStatusbar->RemoveItem( nPos );
168 return true;
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 );
191 return true;
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 )
202 return nPos;
205 return STATUSBAR_ITEM_NOTFOUND;
208 bool StatusbarMerger::ProcessMergeOperation(
209 StatusBar* pStatusbar,
210 sal_uInt16 nPos,
211 sal_uInt16& rItemId,
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 );
226 return false;
229 bool StatusbarMerger::ProcessMergeFallback(
230 StatusBar* pStatusbar,
231 sal_uInt16 /*nPos*/,
232 sal_uInt16& rItemId,
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 ))) )
243 return true;
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 );
254 return false;