1b9e67834SAndre Fischer /************************************************************** 2b9e67834SAndre Fischer * 3b9e67834SAndre Fischer * Licensed to the Apache Software Foundation (ASF) under one 4b9e67834SAndre Fischer * or more contributor license agreements. See the NOTICE file 5b9e67834SAndre Fischer * distributed with this work for additional information 6b9e67834SAndre Fischer * regarding copyright ownership. The ASF licenses this file 7b9e67834SAndre Fischer * to you under the Apache License, Version 2.0 (the 8b9e67834SAndre Fischer * "License"); you may not use this file except in compliance 9b9e67834SAndre Fischer * with the License. You may obtain a copy of the License at 10b9e67834SAndre Fischer * 11b9e67834SAndre Fischer * http://www.apache.org/licenses/LICENSE-2.0 12b9e67834SAndre Fischer * 13b9e67834SAndre Fischer * Unless required by applicable law or agreed to in writing, 14b9e67834SAndre Fischer * software distributed under the License is distributed on an 15b9e67834SAndre Fischer * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16b9e67834SAndre Fischer * KIND, either express or implied. See the License for the 17b9e67834SAndre Fischer * specific language governing permissions and limitations 18b9e67834SAndre Fischer * under the License. 19b9e67834SAndre Fischer * 20b9e67834SAndre Fischer *************************************************************/ 21b9e67834SAndre Fischer 22b9e67834SAndre Fischer #include "precompiled_sfx2.hxx" 23b9e67834SAndre Fischer 24b9e67834SAndre Fischer #include "sidebar/EnumContext.hxx" 25b9e67834SAndre Fischer 2695a18594SAndre Fischer #include <map> 2795a18594SAndre Fischer 28b9e67834SAndre Fischer namespace sfx2 { namespace sidebar { 29b9e67834SAndre Fischer 30b9e67834SAndre Fischer #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString))) 31b9e67834SAndre Fischer 32b9e67834SAndre Fischer namespace { 33b9e67834SAndre Fischer 34b9e67834SAndre Fischer typedef ::std::map<rtl::OUString,EnumContext::Application> ApplicationMap; 35b9e67834SAndre Fischer typedef ::std::vector<rtl::OUString> ApplicationVector; 36b9e67834SAndre Fischer static ApplicationMap maApplicationMap; 37b9e67834SAndre Fischer static ApplicationVector maApplicationVector; 38b9e67834SAndre Fischer 39b9e67834SAndre Fischer typedef ::std::map<rtl::OUString,EnumContext::Context> ContextMap; 40b9e67834SAndre Fischer typedef ::std::vector<rtl::OUString> ContextVector; 41b9e67834SAndre Fischer static ContextMap maContextMap; 42b9e67834SAndre Fischer static ContextVector maContextVector; 43b9e67834SAndre Fischer 44b9e67834SAndre Fischer } 45b9e67834SAndre Fischer 4695a18594SAndre Fischer const sal_Int32 EnumContext::NoMatch = 4; 4795a18594SAndre Fischer const sal_Int32 EnumContext::OptimalMatch = 0; // Neither application nor context name is "any". 48b9e67834SAndre Fischer 49b9e67834SAndre Fischer 50b9e67834SAndre Fischer EnumContext::EnumContext (void) 51f120fe41SAndre Fischer : meApplication(Application_None), 5295a18594SAndre Fischer meContext(Context_Unknown) 53b9e67834SAndre Fischer { 54b9e67834SAndre Fischer } 55b9e67834SAndre Fischer 56b9e67834SAndre Fischer 57b9e67834SAndre Fischer 58b9e67834SAndre Fischer 59b9e67834SAndre Fischer EnumContext::EnumContext ( 60b9e67834SAndre Fischer const Application eApplication, 61b9e67834SAndre Fischer const Context eContext) 62b9e67834SAndre Fischer : meApplication(eApplication), 63b9e67834SAndre Fischer meContext(eContext) 64b9e67834SAndre Fischer { 65b9e67834SAndre Fischer } 66b9e67834SAndre Fischer 67b9e67834SAndre Fischer 68b9e67834SAndre Fischer 69b9e67834SAndre Fischer 7095a18594SAndre Fischer EnumContext::EnumContext ( 7195a18594SAndre Fischer const ::rtl::OUString& rsApplicationName, 7295a18594SAndre Fischer const ::rtl::OUString& rsContextName) 7395a18594SAndre Fischer : meApplication(GetApplicationEnum(rsApplicationName)), 7495a18594SAndre Fischer meContext(GetContextEnum(rsContextName)) 7595a18594SAndre Fischer { 7695a18594SAndre Fischer } 7795a18594SAndre Fischer 7895a18594SAndre Fischer 7995a18594SAndre Fischer 8095a18594SAndre Fischer 81b9e67834SAndre Fischer sal_Int32 EnumContext::GetCombinedContext (void) const 82b9e67834SAndre Fischer { 83b9e67834SAndre Fischer return CombinedEnumContext(meApplication, meContext); 84b9e67834SAndre Fischer } 85b9e67834SAndre Fischer 86b9e67834SAndre Fischer 87b9e67834SAndre Fischer 88b9e67834SAndre Fischer 89f120fe41SAndre Fischer sal_Int32 EnumContext::GetCombinedContext_DI (void) const 90f120fe41SAndre Fischer { 91f120fe41SAndre Fischer switch (meApplication) 92f120fe41SAndre Fischer { 93f120fe41SAndre Fischer case Application_Draw: 94f120fe41SAndre Fischer case Application_Impress: 95f120fe41SAndre Fischer return CombinedEnumContext(Application_DrawImpress, meContext); 96f120fe41SAndre Fischer 97dfbb0ba8SAndre Fischer case Application_Writer: 9885f1aca2SAndre Fischer case Application_WriterGlobal: 99dfbb0ba8SAndre Fischer case Application_WriterWeb: 10085f1aca2SAndre Fischer case Application_WriterXML: 101*a7f63c05SOliver-Rainer Wittmann case Application_WriterForm: 102*a7f63c05SOliver-Rainer Wittmann case Application_WriterReport: 10385f1aca2SAndre Fischer return CombinedEnumContext(Application_WriterVariants, meContext); 104dfbb0ba8SAndre Fischer 105f120fe41SAndre Fischer default: 106f120fe41SAndre Fischer return CombinedEnumContext(meApplication, meContext); 107f120fe41SAndre Fischer } 108f120fe41SAndre Fischer } 109f120fe41SAndre Fischer 110f120fe41SAndre Fischer 111f120fe41SAndre Fischer 112f120fe41SAndre Fischer 11395a18594SAndre Fischer const ::rtl::OUString& EnumContext::GetApplicationName (void) const 11495a18594SAndre Fischer { 11595a18594SAndre Fischer return EnumContext::GetApplicationName(meApplication); 11695a18594SAndre Fischer } 11795a18594SAndre Fischer 11895a18594SAndre Fischer 11995a18594SAndre Fischer 12095a18594SAndre Fischer 12195a18594SAndre Fischer const ::rtl::OUString& EnumContext::GetContextName (void) const 12295a18594SAndre Fischer { 12395a18594SAndre Fischer return EnumContext::GetContextName(meContext); 12495a18594SAndre Fischer } 12595a18594SAndre Fischer 12695a18594SAndre Fischer 12795a18594SAndre Fischer 12895a18594SAndre Fischer 129b9e67834SAndre Fischer bool EnumContext::operator== (const EnumContext aOther) 130b9e67834SAndre Fischer { 131b9e67834SAndre Fischer return meApplication==aOther.meApplication 132b9e67834SAndre Fischer && meContext==aOther.meContext; 133b9e67834SAndre Fischer } 134b9e67834SAndre Fischer 135b9e67834SAndre Fischer 136b9e67834SAndre Fischer 137b9e67834SAndre Fischer 13895a18594SAndre Fischer bool EnumContext::operator!= (const EnumContext aOther) 13995a18594SAndre Fischer { 14095a18594SAndre Fischer return meApplication!=aOther.meApplication 14195a18594SAndre Fischer || meContext!=aOther.meContext; 14295a18594SAndre Fischer } 14395a18594SAndre Fischer 14495a18594SAndre Fischer 14595a18594SAndre Fischer 14695a18594SAndre Fischer 147b9e67834SAndre Fischer void EnumContext::AddEntry (const ::rtl::OUString& rsName, const Application eApplication) 148b9e67834SAndre Fischer { 149b9e67834SAndre Fischer maApplicationMap[rsName] = eApplication; 150b9e67834SAndre Fischer OSL_ASSERT(eApplication<=__LastApplicationEnum); 15195a18594SAndre Fischer if (maApplicationVector.size() <= size_t(eApplication)) 152b9e67834SAndre Fischer maApplicationVector.resize(eApplication+1); 153b9e67834SAndre Fischer maApplicationVector[eApplication]=rsName; 154b9e67834SAndre Fischer } 155b9e67834SAndre Fischer 156b9e67834SAndre Fischer 157b9e67834SAndre Fischer 158b9e67834SAndre Fischer 159b9e67834SAndre Fischer void EnumContext::ProvideApplicationContainers (void) 160b9e67834SAndre Fischer { 161b9e67834SAndre Fischer if (maApplicationMap.empty()) 162b9e67834SAndre Fischer { 163b9e67834SAndre Fischer maApplicationVector.resize(static_cast<size_t>(EnumContext::__LastApplicationEnum)+1); 164b9e67834SAndre Fischer AddEntry(A2S("com.sun.star.text.TextDocument"), EnumContext::Application_Writer); 16585f1aca2SAndre Fischer AddEntry(A2S("com.sun.star.text.GlobalDocument"), EnumContext::Application_WriterGlobal); 166dfbb0ba8SAndre Fischer AddEntry(A2S("com.sun.star.text.WebDocument"), EnumContext::Application_WriterWeb); 16785f1aca2SAndre Fischer AddEntry(A2S("com.sun.star.xforms.XMLFormDocument"), EnumContext::Application_WriterXML); 16865d25098SAndre Fischer AddEntry(A2S("com.sun.star.sdb.FormDesign"), EnumContext::Application_WriterForm); 169*a7f63c05SOliver-Rainer Wittmann AddEntry(A2S("com.sun.star.sdb.TextReportDesign"), EnumContext::Application_WriterReport); 17095a18594SAndre Fischer AddEntry(A2S("com.sun.star.sheet.SpreadsheetDocument"), EnumContext::Application_Calc); 17195a18594SAndre Fischer AddEntry(A2S("com.sun.star.drawing.DrawingDocument"), EnumContext::Application_Draw); 172b9e67834SAndre Fischer AddEntry(A2S("com.sun.star.presentation.PresentationDocument"), EnumContext::Application_Impress); 173f120fe41SAndre Fischer 17495a18594SAndre Fischer AddEntry(A2S("any"), EnumContext::Application_Any); 175f120fe41SAndre Fischer AddEntry(A2S("none"), EnumContext::Application_None); 176b9e67834SAndre Fischer } 177b9e67834SAndre Fischer } 178b9e67834SAndre Fischer 179b9e67834SAndre Fischer 180b9e67834SAndre Fischer 181b9e67834SAndre Fischer 182b9e67834SAndre Fischer EnumContext::Application EnumContext::GetApplicationEnum (const ::rtl::OUString& rsApplicationName) 183b9e67834SAndre Fischer { 184b9e67834SAndre Fischer ProvideApplicationContainers(); 185b9e67834SAndre Fischer 186b9e67834SAndre Fischer ApplicationMap::const_iterator iApplication( 187b9e67834SAndre Fischer maApplicationMap.find(rsApplicationName)); 188b9e67834SAndre Fischer if (iApplication != maApplicationMap.end()) 189b9e67834SAndre Fischer return iApplication->second; 190b9e67834SAndre Fischer else 191f120fe41SAndre Fischer return EnumContext::Application_None; 192b9e67834SAndre Fischer } 193b9e67834SAndre Fischer 194b9e67834SAndre Fischer 195b9e67834SAndre Fischer 196b9e67834SAndre Fischer 197b9e67834SAndre Fischer const ::rtl::OUString& EnumContext::GetApplicationName (const Application eApplication) 198b9e67834SAndre Fischer { 199b9e67834SAndre Fischer ProvideApplicationContainers(); 200b9e67834SAndre Fischer 201b9e67834SAndre Fischer const sal_Int32 nIndex (eApplication); 202b9e67834SAndre Fischer if (nIndex<0 || nIndex>= __LastApplicationEnum) 203f120fe41SAndre Fischer return maApplicationVector[Application_None]; 204b9e67834SAndre Fischer else 205b9e67834SAndre Fischer return maApplicationVector[nIndex]; 206b9e67834SAndre Fischer } 207b9e67834SAndre Fischer 208b9e67834SAndre Fischer 209b9e67834SAndre Fischer 210b9e67834SAndre Fischer 211b9e67834SAndre Fischer void EnumContext::AddEntry (const ::rtl::OUString& rsName, const Context eApplication) 212b9e67834SAndre Fischer { 213b9e67834SAndre Fischer maContextMap[rsName] = eApplication; 214b9e67834SAndre Fischer OSL_ASSERT(eApplication<=__LastContextEnum); 21595a18594SAndre Fischer if (maContextVector.size() <= size_t(eApplication)) 216b9e67834SAndre Fischer maContextVector.resize(eApplication+1); 217b9e67834SAndre Fischer maContextVector[eApplication] = rsName; 218b9e67834SAndre Fischer } 219b9e67834SAndre Fischer 220b9e67834SAndre Fischer 221b9e67834SAndre Fischer 222b9e67834SAndre Fischer 223b9e67834SAndre Fischer void EnumContext::ProvideContextContainers (void) 224b9e67834SAndre Fischer { 225b9e67834SAndre Fischer if (maContextMap.empty()) 226b9e67834SAndre Fischer { 227b9e67834SAndre Fischer maContextVector.resize(static_cast<size_t>(__LastContextEnum)+1); 22895a18594SAndre Fischer AddEntry(A2S("any"), Context_Any); 229b9e67834SAndre Fischer AddEntry(A2S("default"), Context_Default); 23054eaaa32SAndre Fischer AddEntry(A2S("empty"), Context_Empty); 231f120fe41SAndre Fischer #define AddContext(context) AddEntry(A2S(#context), Context_##context); 232f120fe41SAndre Fischer AddContext(3DObject); 233f120fe41SAndre Fischer AddContext(Annotation); 234f120fe41SAndre Fischer AddContext(Auditing); 235f120fe41SAndre Fischer AddContext(Cell); 236f120fe41SAndre Fischer AddContext(Chart); 237f120fe41SAndre Fischer AddContext(Chart); 238f120fe41SAndre Fischer AddContext(Draw); 239f120fe41SAndre Fischer AddContext(DrawPage); 240f120fe41SAndre Fischer AddContext(DrawText); 241f120fe41SAndre Fischer AddContext(EditCell); 242f120fe41SAndre Fischer AddContext(Form); 243f120fe41SAndre Fischer AddContext(Frame); 244f120fe41SAndre Fischer AddContext(Graphic); 245f120fe41SAndre Fischer AddContext(HandoutPage); 246f120fe41SAndre Fischer AddContext(MasterPage); 247f120fe41SAndre Fischer AddContext(Media); 248f120fe41SAndre Fischer AddContext(MultiObject); 249f120fe41SAndre Fischer AddContext(NotesPage); 250f120fe41SAndre Fischer AddContext(OLE); 251f120fe41SAndre Fischer AddContext(OutlineText); 252f120fe41SAndre Fischer AddContext(Pivot); 253f120fe41SAndre Fischer AddContext(SlidesorterPage); 254f120fe41SAndre Fischer AddContext(Table); 255f120fe41SAndre Fischer AddContext(Text); 256f120fe41SAndre Fischer AddContext(TextObject); 257f120fe41SAndre Fischer #undef AddContext 258b9e67834SAndre Fischer } 259b9e67834SAndre Fischer } 260b9e67834SAndre Fischer 261b9e67834SAndre Fischer 262b9e67834SAndre Fischer 263b9e67834SAndre Fischer 264b9e67834SAndre Fischer EnumContext::Context EnumContext::GetContextEnum (const ::rtl::OUString& rsContextName) 265b9e67834SAndre Fischer { 266b9e67834SAndre Fischer ProvideContextContainers(); 267b9e67834SAndre Fischer 268b9e67834SAndre Fischer ContextMap::const_iterator iContext( 269b9e67834SAndre Fischer maContextMap.find(rsContextName)); 270b9e67834SAndre Fischer if (iContext != maContextMap.end()) 271b9e67834SAndre Fischer return iContext->second; 272b9e67834SAndre Fischer else 27395a18594SAndre Fischer return EnumContext::Context_Unknown; 274b9e67834SAndre Fischer } 275b9e67834SAndre Fischer 276b9e67834SAndre Fischer 277b9e67834SAndre Fischer 278b9e67834SAndre Fischer 279b9e67834SAndre Fischer const ::rtl::OUString& EnumContext::GetContextName (const Context eContext) 280b9e67834SAndre Fischer { 281b9e67834SAndre Fischer ProvideContextContainers(); 282b9e67834SAndre Fischer 283b9e67834SAndre Fischer const sal_Int32 nIndex (eContext); 284b9e67834SAndre Fischer if (nIndex<0 || nIndex>= __LastContextEnum) 28595a18594SAndre Fischer return maContextVector[Context_Unknown]; 286b9e67834SAndre Fischer else 287b9e67834SAndre Fischer return maContextVector[nIndex]; 288b9e67834SAndre Fischer } 289b9e67834SAndre Fischer 290b9e67834SAndre Fischer 291b9e67834SAndre Fischer 292b9e67834SAndre Fischer 29395a18594SAndre Fischer sal_Int32 EnumContext::EvaluateMatch ( 29495a18594SAndre Fischer const EnumContext& rOther) const 29595a18594SAndre Fischer { 29695a18594SAndre Fischer const bool bApplicationNameIsAny (rOther.meApplication == Application_Any); 29795a18594SAndre Fischer if (rOther.meApplication==meApplication || bApplicationNameIsAny) 29895a18594SAndre Fischer { 29995a18594SAndre Fischer // Application name matches. 30095a18594SAndre Fischer const bool bContextNameIsAny (rOther.meContext == Context_Any); 30195a18594SAndre Fischer if (rOther.meContext==meContext || bContextNameIsAny) 30295a18594SAndre Fischer { 30395a18594SAndre Fischer // Context name matches. 30495a18594SAndre Fischer return (bApplicationNameIsAny ? 1 : 0) 30595a18594SAndre Fischer + (bContextNameIsAny ? 2 : 0); 30695a18594SAndre Fischer } 30795a18594SAndre Fischer } 30895a18594SAndre Fischer return NoMatch; 30995a18594SAndre Fischer } 31095a18594SAndre Fischer 31195a18594SAndre Fischer 31295a18594SAndre Fischer 31395a18594SAndre Fischer 31495a18594SAndre Fischer sal_Int32 EnumContext::EvaluateMatch (const ::std::vector<EnumContext>& rOthers) const 31595a18594SAndre Fischer { 31695a18594SAndre Fischer sal_Int32 nBestMatch (NoMatch); 31795a18594SAndre Fischer 31895a18594SAndre Fischer for (::std::vector<EnumContext>::const_iterator 31995a18594SAndre Fischer iContext(rOthers.begin()), 32095a18594SAndre Fischer iEnd(rOthers.end()); 32195a18594SAndre Fischer iContext!=iEnd; 32295a18594SAndre Fischer ++iContext) 32395a18594SAndre Fischer { 32495a18594SAndre Fischer const sal_Int32 nMatch (EvaluateMatch(*iContext)); 32595a18594SAndre Fischer if (nMatch < nBestMatch) 32695a18594SAndre Fischer { 32795a18594SAndre Fischer if (nMatch == OptimalMatch) 32895a18594SAndre Fischer { 32995a18594SAndre Fischer // We will find no better match so stop searching. 33095a18594SAndre Fischer return OptimalMatch; 33195a18594SAndre Fischer } 33295a18594SAndre Fischer nBestMatch = nMatch; 33395a18594SAndre Fischer } 33495a18594SAndre Fischer } 33595a18594SAndre Fischer return nBestMatch; 33695a18594SAndre Fischer } 33795a18594SAndre Fischer 33895a18594SAndre Fischer 33995a18594SAndre Fischer 340b9e67834SAndre Fischer } } // end of namespace sfx2::sidebar 341