1/*
2 * genshortcutents.cpp - Copyright 2005 Frerich Raabe <raabe@kde.org>
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25#include "kaboutdata.h"
26#include "kcomponentdata.h"
27#include "kcmdlineargs.h"
28#include "klocale.h"
29#include "kstandardshortcut.h"
30
31#include <QtCore/QDate>
32#include <QtCore/QFile>
33#include <QtCore/QCoreApplication>
34#include <QtCore/QTextStream>
35#include <QtCore/QStringList>
36
37static QString keyAsMarkup( const QString &key )
38{
39 if ( key == "Alt" || key == "Ctrl" || key == "Enter" || key == "Esc" ||
40 key == "Shift" || key == "Tab" ) {
41 return QString('&' + key + ';');
42 }
43 if ( key == "Left" || key == "Right" || key == "Up" || key == "Down" ) {
44 return QString("<keysym>" + key + " Arrow</keysym>");
45 }
46 if ( key == "Backspace" || key == "Menu" ) {
47 return QString("<keysym>" + key + "</keysym>");
48 }
49 if ( key == "Plus" ) {
50 return QString("<keycap>+</keycap>");
51 }
52 if ( key == "Minus" ) {
53 return QString("<keycap>-</keycap>");
54 }
55 return QString("<keycap>" + key + "</keycap>");
56}
57
58static QString entityForAccel( KStandardShortcut::StandardShortcut accel )
59{
60 QString markup = "<!ENTITY KeyCombo_";
61
62 /* We use a switch so that the compiler gives us warning messages in
63 * case KStandardShortcut::StandardShortcut gets extended (which means we have to
64 * extend this code, too).
65 */
66 switch ( accel ) {
67 case KStandardShortcut::AccelNone:
68 break;
69 case KStandardShortcut::Open:
70 markup += "Open";
71 break;
72 case KStandardShortcut::OpenRecent:
73 markup += "OpenRecent";
74 break;
75 case KStandardShortcut::New:
76 markup += "New";
77 break;
78 case KStandardShortcut::Close:
79 markup += "Close";
80 break;
81 case KStandardShortcut::Save:
82 markup += "Save";
83 break;
84 case KStandardShortcut::SaveAs:
85 markup += "SaveAs";
86 break;
87 case KStandardShortcut::Print:
88 markup += "Print";
89 break;
90 case KStandardShortcut::Quit:
91 markup += "Quit";
92 break;
93 case KStandardShortcut::Undo:
94 markup += "Undo";
95 break;
96 case KStandardShortcut::Redo:
97 markup += "Redo";
98 break;
99 case KStandardShortcut::Cut:
100 markup += "Cut";
101 break;
102 case KStandardShortcut::Copy:
103 markup += "Copy";
104 break;
105 case KStandardShortcut::Paste:
106 markup += "Paste";
107 break;
108 case KStandardShortcut::SelectAll:
109 markup += "SelectAll";
110 break;
111 case KStandardShortcut::Deselect:
112 markup += "Deselect";
113 break;
114 case KStandardShortcut::DeleteWordBack:
115 markup += "DeleteWordBack";
116 break;
117 case KStandardShortcut::DeleteWordForward:
118 markup += "DeleteWordForward";
119 break;
120 case KStandardShortcut::Find:
121 markup += "Find";
122 break;
123 case KStandardShortcut::FindNext:
124 markup += "FindNext";
125 break;
126 case KStandardShortcut::FindPrev:
127 markup += "FindPrev";
128 break;
129 case KStandardShortcut::Replace:
130 markup += "Replace";
131 break;
132 case KStandardShortcut::Home:
133 markup += "Home";
134 break;
135 case KStandardShortcut::Begin:
136 markup += "Begin";
137 break;
138 case KStandardShortcut::End:
139 markup += "End";
140 break;
141 case KStandardShortcut::Prior:
142 markup += "Prior";
143 break;
144 case KStandardShortcut::Next:
145 markup += "Next";
146 break;
147 case KStandardShortcut::GotoLine:
148 markup += "GotoLine";
149 break;
150 case KStandardShortcut::AddBookmark:
151 markup += "AddBookmark";
152 break;
153 case KStandardShortcut::ZoomIn:
154 markup += "ZoomIn";
155 break;
156 case KStandardShortcut::ZoomOut:
157 markup += "ZoomOut";
158 break;
159 case KStandardShortcut::Up:
160 markup += "Up";
161 break;
162 case KStandardShortcut::Back:
163 markup += "Back";
164 break;
165 case KStandardShortcut::Forward:
166 markup += "Forward";
167 break;
168 case KStandardShortcut::Reload:
169 markup += "Reload";
170 break;
171 case KStandardShortcut::ShowMenubar:
172 markup += "ShowMenubar";
173 break;
174 case KStandardShortcut::Help:
175 markup += "Help";
176 break;
177 case KStandardShortcut::WhatsThis:
178 markup += "WhatsThis";
179 break;
180 case KStandardShortcut::TextCompletion:
181 markup += "TextCompletion";
182 break;
183 case KStandardShortcut::PrevCompletion:
184 markup += "PrevCompletion";
185 break;
186 case KStandardShortcut::NextCompletion:
187 markup += "NextCompletion";
188 break;
189 case KStandardShortcut::SubstringCompletion:
190 markup += "SubstringCompletion";
191 break;
192 case KStandardShortcut::RotateUp:
193 markup += "RotateUp";
194 break;
195 case KStandardShortcut::RotateDown:
196 markup += "RotateDown";
197 break;
198 case KStandardShortcut::TabNext:
199 markup += "TabNext";
200 break;
201 case KStandardShortcut::TabPrev:
202 markup += "TabPrev";
203 break;
204 case KStandardShortcut::FullScreen:
205 markup += "FullScreen";
206 break;
207 case KStandardShortcut::BackwardWord:
208 markup += "BackwardWord";
209 break;
210 case KStandardShortcut::ForwardWord:
211 markup += "ForwardWord";
212 break;
213 case KStandardShortcut::BeginningOfLine:
214 markup += "BeginningOfLine";
215 break;
216 case KStandardShortcut::EndOfLine:
217 markup += "EndOfLine";
218 break;
219 case KStandardShortcut::PasteSelection:
220 markup += "PastSelection";
221 break;
222 case KStandardShortcut::Revert:
223 markup += "Revert";
224 break;
225 case KStandardShortcut::PrintPreview:
226 markup += "PrintPreview";
227 break;
228 case KStandardShortcut::Mail:
229 markup += "Mail";
230 break;
231 case KStandardShortcut::Clear:
232 markup += "Clear";
233 break;
234 case KStandardShortcut::ActualSize:
235 markup += "ActualSize";
236 break;
237 case KStandardShortcut::FitToPage:
238 markup += "FitToPage";
239 break;
240 case KStandardShortcut::FitToWidth:
241 markup += "FitToWidth";
242 break;
243 case KStandardShortcut::FitToHeight:
244 markup += "FitToHeight";
245 break;
246 case KStandardShortcut::Zoom:
247 markup += "Zoom";
248 break;
249 case KStandardShortcut::Goto:
250 markup += "Goto";
251 break;
252 case KStandardShortcut::GotoPage:
253 markup += "GotoPage";
254 break;
255 case KStandardShortcut::DocumentBack:
256 markup += "DocumentBack";
257 break;
258 case KStandardShortcut::DocumentForward:
259 markup += "DocumentForward";
260 break;
261 case KStandardShortcut::EditBookmarks:
262 markup += "EditBookmarks";
263 break;
264 case KStandardShortcut::Spelling:
265 markup += "Spelling";
266 break;
267 case KStandardShortcut::ShowToolbar:
268 markup += "ShowToolbar";
269 break;
270 case KStandardShortcut::ShowStatusbar:
271 markup += "ShowStatusbar";
272 break;
273 case KStandardShortcut::SaveOptions:
274 markup += "SaveOptions";
275 break;
276 case KStandardShortcut::KeyBindings:
277 markup += "KeyBindings";
278 break;
279 case KStandardShortcut::Preferences:
280 markup += "Preferences";
281 break;
282 case KStandardShortcut::ConfigureToolbars:
283 markup += "ConfigureToolbars";
284 break;
285 case KStandardShortcut::ConfigureNotifications:
286 markup += "ConfigureNotifications";
287 break;
288 case KStandardShortcut::TipofDay:
289 markup += "TipofDay";
290 break;
291 case KStandardShortcut::ReportBug:
292 markup += "ReportBug";
293 break;
294 case KStandardShortcut::SwitchApplicationLanguage:
295 markup += "SwitchApplicationLanguage";
296 break;
297 case KStandardShortcut::AboutApp:
298 markup += "AboutApp";
299 break;
300 case KStandardShortcut::AboutKDE:
301 markup += "AboutKDE";
302 break;
303 case KStandardShortcut::StandardShortcutCount:
304 break;
305 }
306
307 markup += "\t\"";
308
309 QString internalStr = KStandardShortcut::shortcut( accel ).toString();
310 QString firstSequence = internalStr.left( internalStr.indexOf( ';' ) );
311 const QStringList keys = firstSequence.split( '+',QString::SkipEmptyParts );
312 if ( keys.empty() ) {
313 return QString();
314 }
315
316 if ( keys.count() == 1 ) {
317 if ( keys.first().startsWith( QLatin1String("XF86") ) ) {
318 return QString();
319 }
320 markup += keyAsMarkup( keys.first() );
321 } else {
322 markup += "<keycombo action=\"Simul\">";
323 foreach( const QString &key, keys ) {
324 if ( key.startsWith( QLatin1String("XF86") ) ) {
325 continue;
326 }
327 markup += keyAsMarkup( key );
328 }
329 markup += "</keycombo>";
330 }
331 markup += "\">";
332 return markup;
333}
334
335int main( int argc, char **argv )
336{
337 KCmdLineOptions cmdLineOptions;
338 cmdLineOptions.add("o");
339 cmdLineOptions.add("output <file>", ki18n("Output file"), "kde-standard-accels.entities");
340
341 KAboutData aboutData( "genshortcutents", 0, ki18n("genshortcutents"), "1.0",
342 ki18n( "Generates DocBook entities for key shortcuts of standard actions" ));
343
344 KCmdLineArgs::init( argc, argv, &aboutData );
345 KCmdLineArgs::addCmdLineOptions( cmdLineOptions );
346
347 KComponentData componentData( &aboutData );
348 QCoreApplication app( KCmdLineArgs::qtArgc(), KCmdLineArgs::qtArgv() );
349
350 KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
351
352 const QString outputFileName = args->getOption( "output" );
353 QFile outputFile( outputFileName );
354 if ( !outputFile.open( QIODevice::WriteOnly ) ) {
355 qDebug( "Failed to open %s for writing.", qPrintable( outputFileName ) );
356 return 1;
357 }
358
359 QTextStream stream( &outputFile );
360 stream << "<!-- Generated by "
361 << aboutData.programName() + ' '
362 << aboutData.version() + " on "
363 << QDateTime::currentDateTime().toString() + ".\n";
364 stream << " Do not bother to fiddle with this, your modifications will be\n"
365 << " overwritten as soon as the file is regenerated. -->\n";
366 stream << "\n";
367
368 for ( unsigned int i = 0; i < KStandardShortcut::StandardShortcutCount; ++i ) {
369 stream << entityForAccel( static_cast<KStandardShortcut::StandardShortcut>(i) ) << "\n";
370 }
371}
372
373