1  /**************************************************************
2   *
3   * Licensed to the Apache Software Foundation (ASF) under one
4   * or more contributor license agreements.  See the NOTICE file
5   * distributed with this work for additional information
6   * regarding copyright ownership.  The ASF licenses this file
7   * to you under the Apache License, Version 2.0 (the
8   * "License"); you may not use this file except in compliance
9   * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   *
20   *************************************************************/
21  
22  #include "precompiled_sfx2.hxx"
23  
24  #include "ContextMatcher.hxx"
25  #include "Context.hxx"
26  
27  using ::rtl::OUString;
28  
29  namespace sfx2 { namespace sidebar {
30  
31  namespace {
32      static const sal_Char* gsAny = "any";
33  }
34  
35  
36  
ContextMatcher(void)37  ContextMatcher::ContextMatcher (void)
38      : maEntries()
39  {
40  }
41  
42  
43  
44  
~ContextMatcher(void)45  ContextMatcher::~ContextMatcher (void)
46  {
47  }
48  
49  
50  
51  
EvaluateMatch(const Context & rContext) const52  sal_Int32 ContextMatcher::EvaluateMatch (
53      const Context& rContext) const
54  {
55      sal_Int32 nBestMatch (Context::NoMatch);
56  
57      for (::std::vector<Entry>::const_iterator
58               iEntry(maEntries.begin()),
59               iEnd(maEntries.end());
60           iEntry!=iEnd;
61           ++iEntry)
62      {
63          const sal_Int32 nMatch (EvaluateMatch(rContext, *iEntry));
64          if (nMatch < nBestMatch)
65              nBestMatch = nMatch;
66              if (nBestMatch == Context::OptimalMatch)
67              break;
68      }
69  
70      return nBestMatch;
71  }
72  
73  
74  
75  
EvaluateMatch(const Context & rContext,const Entry & rEntry) const76  sal_Int32 ContextMatcher::EvaluateMatch (
77      const Context& rContext,
78      const Entry& rEntry) const
79  {
80      sal_Int32 nApplicationMatch (Context::NoMatch);
81      if (rContext.msApplication.equals(rEntry.msApplicationName))
82          nApplicationMatch = 0;
83      else if (rEntry.msApplicationName.equalsAscii(gsAny))
84          nApplicationMatch = Context::ApplicationWildcardMatch;
85      else
86          return Context::NoMatch;
87  
88      sal_Int32 nBestContextMatch (Context::NoMatch);
89      for (::std::vector<OUString>::const_iterator
90               iContext(rEntry.maContextNames.begin()),
91               iEnd(rEntry.maContextNames.end());
92           iContext!=iEnd;
93           ++iContext)
94      {
95          sal_Int32 nContextMatch (Context::NoMatch);
96          if (rContext.msContext.equals(*iContext))
97              nContextMatch = 0;
98          else if (iContext->equalsAscii(gsAny))
99              nContextMatch = Context::ContextWildcardMatch;
100          else
101              continue;
102          if (nContextMatch < nBestContextMatch)
103              nBestContextMatch = nContextMatch;
104      }
105  
106      if (rEntry.mbIsContextListNegated)
107          nBestContextMatch = Context::NoMatch - nBestContextMatch;
108  
109      return nApplicationMatch + nBestContextMatch;
110  }
111  
112  
113  
114  
AddMatcher(const::rtl::OUString & rsApplicationName,const::std::vector<rtl::OUString> & rContextNames,const bool bIsContextListNegated)115  void ContextMatcher::AddMatcher (
116      const ::rtl::OUString& rsApplicationName,
117      const ::std::vector<rtl::OUString>& rContextNames,
118      const bool bIsContextListNegated)
119  {
120      maEntries.push_back(Entry());
121      maEntries.back().msApplicationName = rsApplicationName;
122      maEntries.back().maContextNames = rContextNames;
123      maEntries.back().mbIsContextListNegated = bIsContextListNegated;
124  }
125  
126  
127  
128  
AddMatcher(const::rtl::OUString & rsApplicationName,const::rtl::OUString & rsContextName)129  void ContextMatcher::AddMatcher (
130      const ::rtl::OUString& rsApplicationName,
131      const ::rtl::OUString& rsContextName)
132  {
133      maEntries.push_back(Entry());
134      maEntries.back().msApplicationName = rsApplicationName;
135      maEntries.back().maContextNames.push_back(rsContextName);
136      maEntries.back().mbIsContextListNegated = false;
137  }
138  
139  
140  } } // end of namespace sfx2::sidebar
141