• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • kdeui
 

kdeui

  • kdeui
kaccelgen.h
1 /* This file is part of the KDE project
2  Copyright (C) 2000 Keunwoo Lee <klee@cs.washington.edu>
3 
4  This program is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License as published by the Free Software Foundation; either
7  version 2 of the License, or (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU Library General Public License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 
20 #ifndef KACCELGEN_H
21 #define KACCELGEN_H
22 
23 #include <tqmap.h>
24 #include <tqstring.h>
25 #include <tqstringlist.h>
26 
27 #include <kdelibs_export.h>
28 
80 namespace KAccelGen
81 {
82 
83 // HELPERS
84 
88 template <class Iter>
89 class Deref
90 {
91 public:
92  static TQString deref(Iter i) { return *i; }
93 };
94 
99 template <class Iter>
100 class Deref_Key
101 {
102 public:
103  static TQString deref(Iter i) { return i.key(); }
104 };
105 
113 inline bool
114 isLegalAccelerator(const TQString& str, uint index)
115 {
116  return index < str.length()
117  && str[index].isLetterOrNumber();
118 }
119 
128 template <class Iter, class Deref>
129 inline void
130 loadPredefined(Iter begin, Iter end, TQMap<TQChar,bool>& keys)
131 {
132  for (Iter i = begin; i != end; ++i) {
133  TQString item = Deref::deref(i);
134  int user_ampersand = item.find(TQChar('&'));
135  if( user_ampersand >= 0 ) {
136  // Sanity check. Note that we don't try to find an
137  // accelerator if the user shoots him/herself in the foot
138  // by adding a bad '&'.
139  if( isLegalAccelerator(item, user_ampersand+1) ) {
140  keys.insert(item[user_ampersand+1], true);
141  }
142  }
143  }
144 }
145 
146 
147 // ///////////////////////////////////////////////////////////////////
148 // MAIN USER FUNCTIONS
149 
150 
165 template <class Iter, class Iter_Deref >
166 void
167 generate(Iter begin, Iter end, TQStringList& target)
168 {
169  // Will keep track of used accelerator chars
170  TQMap<TQChar,bool> used_accels;
171 
172  // Prepass to detect manually user-coded accelerators
173  loadPredefined<Iter,Iter_Deref>(begin, end, used_accels);
174 
175  // Main pass
176  for (Iter i = begin; i != end; ++i) {
177  TQString item = Iter_Deref::deref(i);
178 
179  // Attempt to find a good accelerator, but only if the user
180  // has not manually hardcoded one.
181  int user_ampersand = item.find(TQChar('&'));
182  if( user_ampersand < 0 || item[user_ampersand+1] == '&') {
183  bool found = false;
184  uint found_idx;
185  uint j;
186 
187  // Check word-starting letters first.
188  for( j=0; j < item.length(); ++j ) {
189  if( isLegalAccelerator(item, j)
190  && !used_accels.contains(item[j])
191  && (0 == j || (j > 0 && item[j-1].isSpace())) ) {
192  found = true;
193  found_idx = j;
194  break;
195  }
196  }
197 
198  if( !found ) {
199  // No word-starting letter; search for any letter.
200  for( j=0; j < item.length(); ++j ) {
201  if( isLegalAccelerator(item, j)
202  && !used_accels.contains(item[j]) ) {
203  found = true;
204  found_idx = j;
205  break;
206  }
207  }
208  }
209 
210  if( found ) {
211  // Both upper and lower case marked as used
212  used_accels.insert(item[j].upper(),true);
213  used_accels.insert(item[j].lower(),true);
214  item.insert(j,TQChar('&'));
215  }
216  }
217 
218  target.append( item );
219  }
220 }
221 
230 template <class Iter>
231 inline void
232 generateFromKeys(Iter begin, Iter end, TQStringList& target)
233 {
234  generate< Iter, Deref_Key<Iter> >(begin, end, target);
235 }
236 
237 
244 inline void
245 generate(const TQStringList& source, TQStringList& target)
246 {
247  generate<TQStringList::ConstIterator, Deref<TQStringList::ConstIterator> >(source.begin(), source.end(), target);
248 }
249 
256 template <class Key>
257 inline void
258 generateFromValues(const TQMap<Key,TQString>& source, TQStringList& target)
259 {
260  generate<TQMapConstIterator<Key,TQString>, Deref_Key<TQMapConstIterator<Key,TQString> > >(source.begin(), source.end(), target);
261 }
262 
269 template <class Data>
270 inline void
271 generateFromKeys(const TQMap<TQString,Data>& source, TQStringList& target)
272 {
273  generateFromKeys(source.begin(), source.end(), target);
274 }
275 
276 
277 } // end namespace KAccelGen
278 
279 #endif
280 

kdeui

Skip menu "kdeui"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdeui

Skip menu "kdeui"
  • arts
  • dcop
  • dnssd
  • interfaces
  •     interface
  •     library
  •   kspeech
  •   ktexteditor
  • kabc
  • kate
  • kcmshell
  • kdecore
  • kded
  • kdefx
  • kdeprint
  • kdesu
  • kdeui
  • kdoctools
  • khtml
  • kimgio
  • kinit
  • kio
  •   bookmarks
  •   httpfilter
  •   kfile
  •   kio
  •   kioexec
  •   kpasswdserver
  •   kssl
  • kioslave
  •   http
  • kjs
  • kmdi
  •   kmdi
  • knewstuff
  • kparts
  • krandr
  • kresources
  • kspell2
  • kunittest
  • kutils
  • kwallet
  • libkmid
  • libkscreensaver
Generated for kdeui by doxygen 1.8.1.2
This website is maintained by Timothy Pearson.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. |