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 | |
37 | static 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 | |
58 | static 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 | |
335 | int 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 | |