• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • Contact Us
 

KHTML

jsediting.cpp

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
00003  *
00004  * Redistribution and use in source and binary forms, with or without
00005  * modification, are permitted provided that the following conditions
00006  * are met:
00007  * 1. Redistributions of source code must retain the above copyright
00008  *    notice, this list of conditions and the following disclaimer.
00009  * 2. Redistributions in binary form must reproduce the above copyright
00010  *    notice, this list of conditions and the following disclaimer in the
00011  *    documentation and/or other materials provided with the distribution.
00012  *
00013  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
00014  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00015  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00016  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
00017  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00018  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00019  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00020  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
00021  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00022  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00023  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00024  */
00025 
00026 #include "jsediting.h"
00027 #include "htmlediting.h"
00028 #include "editor.h"
00029 
00030 #include "css/cssproperties.h"
00031 #include "css/cssvalues.h"
00032 #include "css/css_valueimpl.h"
00033 #include "xml/dom_selection.h"
00034 #include "xml/dom_docimpl.h"
00035 #include "dom/dom_string.h"
00036 
00037 #include "misc/khtml_partaccessor.h"
00038 
00039 #include <QHash>
00040 #include <QString>
00041 
00042 using khtml::TypingCommand;
00043 // 
00044 #define KPAC khtml::KHTMLPartAccessor
00045 
00046 namespace DOM {
00047 
00048 class DocumentImpl;
00049 
00050 struct CommandImp {
00051     bool (*execFn)(KHTMLPart *part, bool userInterface, const DOMString &value);
00052     bool (*enabledFn)(KHTMLPart *part);
00053     Editor::TriState (*stateFn)(KHTMLPart *part);
00054     DOMString (*valueFn)(KHTMLPart *part);
00055 };
00056 
00057 typedef QHash<QString,const CommandImp*> CommandDict;
00058 static CommandDict createCommandDictionary();
00059 
00060 bool JSEditor::execCommand(const CommandImp *cmd, bool userInterface, const DOMString &value)
00061 {
00062     if (!cmd || !cmd->enabledFn)
00063         return false;
00064     KHTMLPart *part = m_doc->part();
00065     if (!part)
00066         return false;
00067     m_doc->updateLayout();
00068     return cmd->enabledFn(part) && cmd->execFn(part, userInterface, value);
00069 }
00070 
00071 bool JSEditor::queryCommandEnabled(const CommandImp *cmd)
00072 {
00073     if (!cmd || !cmd->enabledFn)
00074         return false;
00075     KHTMLPart *part = m_doc->part();
00076     if (!part)
00077         return false;
00078     m_doc->updateLayout();
00079     return cmd->enabledFn(part);
00080 }
00081 
00082 bool JSEditor::queryCommandIndeterm(const CommandImp *cmd)
00083 {
00084     if (!cmd || !cmd->enabledFn)
00085         return false;
00086     KHTMLPart *part = m_doc->part();
00087     if (!part)
00088         return false;
00089     m_doc->updateLayout();
00090     return cmd->stateFn(part) == Editor::MixedTriState;
00091 }
00092 
00093 bool JSEditor::queryCommandState(const CommandImp *cmd)
00094 {
00095     if (!cmd || !cmd->enabledFn)
00096         return false;
00097     KHTMLPart *part = m_doc->part();
00098     if (!part)
00099         return false;
00100     m_doc->updateLayout();
00101     return cmd->stateFn(part) != Editor::FalseTriState;
00102 }
00103 
00104 bool JSEditor::queryCommandSupported(const CommandImp *cmd)
00105 {
00106     return cmd != 0;
00107 }
00108 
00109 DOMString JSEditor::queryCommandValue(const CommandImp *cmd)
00110 {
00111     if (!cmd || !cmd->enabledFn)
00112         return DOMString();
00113     KHTMLPart *part = m_doc->part();
00114     if (!part)
00115         return DOMString();
00116     m_doc->updateLayout();
00117     return cmd->valueFn(part);
00118 }
00119 
00120 // =============================================================================================
00121 
00122 // Private stuff
00123 
00124 static bool execStyleChange(KHTMLPart *part, int propertyID, const DOMString &propertyValue)
00125 {
00126     CSSStyleDeclarationImpl *style = new CSSStyleDeclarationImpl(0);
00127     style->setProperty(propertyID, propertyValue);
00128     style->ref();
00129     part->editor()->applyStyle(style);
00130     style->deref();
00131     return true;
00132 }
00133 
00134 static bool execStyleChange(KHTMLPart *part, int propertyID, int propertyEnum)
00135 {
00136     CSSStyleDeclarationImpl *style = new CSSStyleDeclarationImpl(0);
00137     style->setProperty(propertyID, propertyEnum);
00138     style->ref();
00139     part->editor()->applyStyle(style);
00140     style->deref();
00141     return true;
00142 }
00143 
00144 static bool execStyleChange(KHTMLPart *part, int propertyID, const char *propertyValue)
00145 {
00146     return execStyleChange(part, propertyID, DOMString(propertyValue));
00147 }
00148 
00149 static Editor::TriState stateStyle(KHTMLPart *part, int propertyID, const char *desiredValue)
00150 {
00151     CSSStyleDeclarationImpl *style = new CSSStyleDeclarationImpl(0);
00152     style->setProperty(propertyID, desiredValue);
00153     style->ref();
00154     Editor::TriState state = part->editor()->selectionHasStyle(style);
00155     style->deref();
00156     return state;
00157 }
00158 
00159 static bool selectionStartHasStyle(KHTMLPart *part, int propertyID, const char *desiredValue)
00160 {
00161     CSSStyleDeclarationImpl *style = new CSSStyleDeclarationImpl(0);
00162     style->setProperty(propertyID, desiredValue);
00163     style->ref();
00164     bool hasStyle = part->editor()->selectionStartHasStyle(style);
00165     style->deref();
00166     return hasStyle;
00167 }
00168 
00169 static DOMString valueStyle(KHTMLPart *part, int propertyID)
00170 {
00171     return part->editor()->selectionStartStylePropertyValue(propertyID);
00172 }
00173 
00174 // =============================================================================================
00175 //
00176 // execCommand implementations
00177 //
00178 
00179 static bool execBackColor(KHTMLPart *part, bool /*userInterface*/, const DOMString &value)
00180 {
00181     return execStyleChange(part, CSS_PROP_BACKGROUND_COLOR, value);
00182 }
00183 
00184 static bool execBold(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00185 {
00186     bool isBold = selectionStartHasStyle(part, CSS_PROP_FONT_WEIGHT, "bold");
00187     return execStyleChange(part, CSS_PROP_FONT_WEIGHT, isBold ? "normal" : "bold");
00188 }
00189 
00190 static bool execCopy(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00191 {
00192     part->editor()->copy();
00193     return true;
00194 }
00195 
00196 static bool execCut(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00197 {
00198     part->editor()->cut();
00199     return true;
00200 }
00201 
00202 static bool execDelete(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00203 {
00204     TypingCommand::deleteKeyPressed(KPAC::xmlDocImpl(part));
00205     return true;
00206 }
00207 
00208 static bool execFontName(KHTMLPart *part, bool /*userInterface*/, const DOMString &value)
00209 {
00210     return execStyleChange(part, CSS_PROP_FONT_FAMILY, value);
00211 }
00212 
00213 static bool execFontSize(KHTMLPart *part, bool /*userInterface*/, const DOMString &value)
00214 {
00215     // This should handle sizes 1-7 like <font> does. Who the heck designed this interface? (Rhetorical question)
00216     bool ok;
00217     int val = value.string().toInt(&ok);
00218     if (ok && val >= 1 && val <= 7) {
00219         int size;
00220         switch (val) {
00221         case 1: size = CSS_VAL_XX_SMALL; break;
00222         case 2: size = CSS_VAL_SMALL; break;
00223         case 3: size = CSS_VAL_MEDIUM; break;
00224         case 4: size = CSS_VAL_LARGE; break;
00225         case 5: size = CSS_VAL_X_LARGE;  break;
00226         case 6: size = CSS_VAL_XX_LARGE; break;
00227         default: size = CSS_VAL__KHTML_XXX_LARGE;
00228         }
00229         return execStyleChange(part, CSS_PROP_FONT_SIZE, size);
00230     }
00231     
00232     return execStyleChange(part, CSS_PROP_FONT_SIZE, value);
00233 }
00234 
00235 static bool execForeColor(KHTMLPart *part, bool /*userInterface*/, const DOMString &value)
00236 {
00237     return execStyleChange(part, CSS_PROP_COLOR, value);
00238 }
00239 
00240 static bool execIndent(KHTMLPart * /*part*/, bool /*userInterface*/, const DOMString &/*value*/)
00241 {
00242     // FIXME: Implement.
00243     return false;
00244 }
00245 
00246 static bool execInsertNewline(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00247 {
00248     TypingCommand::insertNewline(KPAC::xmlDocImpl(part));
00249     return true;
00250 }
00251 
00252 static bool execInsertParagraph(KHTMLPart * /*part*/, bool /*userInterface*/, const DOMString &/*value*/)
00253 {
00254     // FIXME: Implement.
00255     return false;
00256 }
00257 
00258 static bool execInsertText(KHTMLPart *part, bool /*userInterface*/, const DOMString &value)
00259 {
00260     TypingCommand::insertText(KPAC::xmlDocImpl(part), value);
00261     return true;
00262 }
00263 
00264 static bool execItalic(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00265 {
00266     bool isItalic = selectionStartHasStyle(part, CSS_PROP_FONT_STYLE, "italic");
00267     return execStyleChange(part, CSS_PROP_FONT_STYLE, isItalic ? "normal" : "italic");
00268 }
00269 
00270 static bool execJustifyCenter(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00271 {
00272     return execStyleChange(part, CSS_PROP_TEXT_ALIGN, "center");
00273 }
00274 
00275 static bool execJustifyFull(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00276 {
00277     return execStyleChange(part, CSS_PROP_TEXT_ALIGN, "justify");
00278 }
00279 
00280 static bool execJustifyLeft(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00281 {
00282     return execStyleChange(part, CSS_PROP_TEXT_ALIGN, "left");
00283 }
00284 
00285 static bool execJustifyRight(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00286 {
00287     return execStyleChange(part, CSS_PROP_TEXT_ALIGN, "right");
00288 }
00289 
00290 static bool execOutdent(KHTMLPart * /*part*/, bool /*userInterface*/, const DOMString &/*value*/)
00291 {
00292     // FIXME: Implement.
00293     return false;
00294 }
00295 
00296 #ifndef NO_SUPPORT_PASTE
00297 
00298 static bool execPaste(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00299 {
00300     part->editor()->paste();
00301     return true;
00302 }
00303 
00304 #endif
00305 
00306 static bool execPrint(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00307 {
00308     part->editor()->print();
00309     return true;
00310 }
00311 
00312 static bool execRedo(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00313 {
00314     part->editor()->redo();
00315     return true;
00316 }
00317 
00318 static bool execSelectAll(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00319 {
00320     part->selectAll();
00321     return true;
00322 }
00323 
00324 static bool execSubscript(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00325 {
00326     return execStyleChange(part, CSS_PROP_VERTICAL_ALIGN, "sub");
00327 }
00328 
00329 static bool execSuperscript(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00330 {
00331     return execStyleChange(part, CSS_PROP_VERTICAL_ALIGN, "super");
00332 }
00333 
00334 static bool execUndo(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00335 {
00336     part->editor()->undo();
00337     return true;
00338 }
00339 
00340 static bool execUnselect(KHTMLPart *part, bool /*userInterface*/, const DOMString &/*value*/)
00341 {
00342     KPAC::clearSelection(part);
00343     return true;
00344 }
00345 
00346 // =============================================================================================
00347 //
00348 // queryCommandEnabled implementations
00349 //
00350 // It's a bit difficult to get a clear notion of the difference between
00351 // "supported" and "enabled" from reading the Microsoft documentation, but
00352 // what little I could glean from that seems to make some sense.
00353 //     Supported = The command is supported by this object.
00354 //     Enabled =   The command is available and enabled.
00355 
00356 static bool enabled(KHTMLPart * /*part*/)
00357 {
00358     return true;
00359 }
00360 
00361 static bool enabledAnySelection(KHTMLPart *part)
00362 {
00363     return KPAC::caret(part).notEmpty();
00364 }
00365 
00366 #ifndef NO_SUPPORT_PASTE
00367 
00368 static bool enabledPaste(KHTMLPart *part)
00369 {
00370     return part->editor()->canPaste();
00371 }
00372 
00373 #endif
00374 
00375 static bool enabledRangeSelection(KHTMLPart *part)
00376 {
00377     return KPAC::caret(part).state() == Selection::RANGE;
00378 }
00379 
00380 static bool enabledRedo(KHTMLPart *part)
00381 {
00382     return part->editor()->canRedo();
00383 }
00384 
00385 static bool enabledUndo(KHTMLPart *part)
00386 {
00387     return part->editor()->canUndo();
00388 }
00389 
00390 // =============================================================================================
00391 //
00392 // queryCommandIndeterm/State implementations
00393 //
00394 // It's a bit difficult to get a clear notion of what these methods are supposed
00395 // to do from reading the Microsoft documentation, but my current guess is this:
00396 //
00397 //     queryCommandState and queryCommandIndeterm work in concert to return
00398 //     the two bits of information that are needed to tell, for instance,
00399 //     if the text of a selection is bold. The answer can be "yes", "no", or
00400 //     "partially".
00401 //
00402 // If this is so, then queryCommandState should return "yes" in the case where
00403 // all the text is bold and "no" for non-bold or partially-bold text.
00404 // Then, queryCommandIndeterm should return "no" in the case where
00405 // all the text is either all bold or not-bold and and "yes" for partially-bold text.
00406 
00407 static Editor::TriState stateNone(KHTMLPart * /*part*/)
00408 {
00409     return Editor::FalseTriState;
00410 }
00411 
00412 static Editor::TriState stateBold(KHTMLPart *part)
00413 {
00414     return stateStyle(part, CSS_PROP_FONT_WEIGHT, "bold");
00415 }
00416 
00417 static Editor::TriState stateItalic(KHTMLPart *part)
00418 {
00419     return stateStyle(part, CSS_PROP_FONT_STYLE, "italic");
00420 }
00421 
00422 static Editor::TriState stateSubscript(KHTMLPart *part)
00423 {
00424     return stateStyle(part, CSS_PROP_VERTICAL_ALIGN, "sub");
00425 }
00426 
00427 static Editor::TriState stateSuperscript(KHTMLPart *part)
00428 {
00429     return stateStyle(part, CSS_PROP_VERTICAL_ALIGN, "super");
00430 }
00431 
00432 // =============================================================================================
00433 //
00434 // queryCommandValue implementations
00435 //
00436 
00437 static DOMString valueNull(KHTMLPart * /*part*/)
00438 {
00439     return DOMString();
00440 }
00441 
00442 static DOMString valueBackColor(KHTMLPart *part)
00443 {
00444     return valueStyle(part, CSS_PROP_BACKGROUND_COLOR);
00445 }
00446 
00447 static DOMString valueFontName(KHTMLPart *part)
00448 {
00449     return valueStyle(part, CSS_PROP_FONT_FAMILY);
00450 }
00451 
00452 static DOMString valueFontSize(KHTMLPart *part)
00453 {
00454     return valueStyle(part, CSS_PROP_FONT_SIZE);
00455 }
00456 
00457 static DOMString valueForeColor(KHTMLPart *part)
00458 {
00459     return valueStyle(part, CSS_PROP_COLOR);
00460 }
00461 
00462 // =============================================================================================
00463 
00464 struct EditorCommandInfo { const char *name; CommandImp imp; };
00465 
00466 // NOTE: strictly keep in sync with EditorCommand in editor_command.h
00467 static const EditorCommandInfo commands[] = {
00468 
00469     { "backColor", { execBackColor, enabled, stateNone, valueBackColor } },
00470     { "bold", { execBold, enabledAnySelection, stateBold, valueNull } },
00471     { "copy", { execCopy, enabledRangeSelection, stateNone, valueNull } },
00472     { "cut", { execCut, enabledRangeSelection, stateNone, valueNull } },
00473     { "delete", { execDelete, enabledAnySelection, stateNone, valueNull } },
00474     { "fontName", { execFontName, enabledAnySelection, stateNone, valueFontName } },
00475     { "fontSize", { execFontSize, enabledAnySelection, stateNone, valueFontSize } },
00476     { "foreColor", { execForeColor, enabledAnySelection, stateNone, valueForeColor } },
00477     { "indent", { execIndent, enabledAnySelection, stateNone, valueNull } },
00478     { "insertNewline", { execInsertNewline, enabledAnySelection, stateNone, valueNull } },
00479     { "insertParagraph", { execInsertParagraph, enabledAnySelection, stateNone, valueNull } },
00480     { "insertText", { execInsertText, enabledAnySelection, stateNone, valueNull } },
00481     { "italic", { execItalic, enabledAnySelection, stateItalic, valueNull } },
00482     { "justifyCenter", { execJustifyCenter, enabledAnySelection, stateNone, valueNull } },
00483     { "justifyFull", { execJustifyFull, enabledAnySelection, stateNone, valueNull } },
00484     { "justifyLeft", { execJustifyLeft, enabledAnySelection, stateNone, valueNull } },
00485     { "justifyNone", { execJustifyLeft, enabledAnySelection, stateNone, valueNull } },
00486     { "justifyRight", { execJustifyRight, enabledAnySelection, stateNone, valueNull } },
00487     { "outdent", { execOutdent, enabledAnySelection, stateNone, valueNull } },
00488 #ifndef NO_SUPPORT_PASTE
00489     { "paste", { execPaste, enabledPaste, stateNone, valueNull } },
00490 #else
00491     { 0, { 0, 0, 0, 0 } },
00492 #endif
00493     { "print", { execPrint, enabled, stateNone, valueNull } },
00494     { "redo", { execRedo, enabledRedo, stateNone, valueNull } },
00495     { "selectAll", { execSelectAll, enabled, stateNone, valueNull } },
00496     { "subscript", { execSubscript, enabledAnySelection, stateSubscript, valueNull } },
00497     { "superscript", { execSuperscript, enabledAnySelection, stateSuperscript, valueNull } },
00498     { "undo", { execUndo, enabledUndo, stateNone, valueNull } },
00499     { "unselect", { execUnselect, enabledAnySelection, stateNone, valueNull } }
00500 
00501     //
00502     // The "unsupported" commands are listed here since they appear in the Microsoft
00503     // documentation used as the basis for the list.
00504     //
00505 
00506     // 2d-position (not supported)
00507     // absolutePosition (not supported)
00508     // blockDirLTR (not supported)
00509     // blockDirRTL (not supported)
00510     // browseMode (not supported)
00511     // clearAuthenticationCache (not supported)
00512     // createBookmark (not supported)
00513     // createLink (not supported)
00514     // dirLTR (not supported)
00515     // dirRTL (not supported)
00516     // editMode (not supported)
00517     // formatBlock (not supported)
00518     // inlineDirLTR (not supported)
00519     // inlineDirRTL (not supported)
00520     // insertButton (not supported)
00521     // insertFieldSet (not supported)
00522     // insertHorizontalRule (not supported)
00523     // insertIFrame (not supported)
00524     // insertImage (not supported)
00525     // insertInputButton (not supported)
00526     // insertInputCheckbox (not supported)
00527     // insertInputFileUpload (not supported)
00528     // insertInputHidden (not supported)
00529     // insertInputImage (not supported)
00530     // insertInputPassword (not supported)
00531     // insertInputRadio (not supported)
00532     // insertInputReset (not supported)
00533     // insertInputSubmit (not supported)
00534     // insertInputText (not supported)
00535     // insertMarquee (not supported)
00536     // insertOrderedList (not supported)
00537     // insertSelectDropDown (not supported)
00538     // insertSelectListBox (not supported)
00539     // insertTextArea (not supported)
00540     // insertUnorderedList (not supported)
00541     // liveResize (not supported)
00542     // multipleSelection (not supported)
00543     // open (not supported)
00544     // overwrite (not supported)
00545     // playImage (not supported)
00546     // refresh (not supported)
00547     // removeFormat (not supported)
00548     // removeParaFormat (not supported)
00549     // saveAs (not supported)
00550     // sizeToControl (not supported)
00551     // sizeToControlHeight (not supported)
00552     // sizeToControlWidth (not supported)
00553     // stop (not supported)
00554     // stopimage (not supported)
00555     // strikethrough (not supported)
00556     // unbookmark (not supported)
00557     // underline (not supported)
00558     // unlink (not supported)
00559 };
00560 
00561 static CommandDict createCommandDictionary()
00562 {
00563     const int numCommands = sizeof(commands) / sizeof(commands[0]);
00564     CommandDict commandDictionary; // case-insensitive dictionary
00565     for (int i = 0; i < numCommands; ++i) {
00566         if (commands[i].name)
00567             commandDictionary.insert(QString(commands[i].name).toLower(), &commands[i].imp);
00568     }
00569     return commandDictionary;
00570 }
00571 
00572 const CommandImp *JSEditor::commandImp(const DOMString &command)
00573 {
00574     static CommandDict commandDictionary = createCommandDictionary();
00575     CommandDict::const_iterator it = commandDictionary.constFind(command.string().toLower());
00576     return commandDictionary.value( command.string().toLower() );
00577 }
00578 
00579 const CommandImp *JSEditor::commandImp(int command)
00580 {
00581     if (command < 0 || command >= int(sizeof commands / sizeof commands[0]) )
00582         return 0;
00583     return &commands[command].imp;
00584 }
00585 
00586 
00587 
00588 } // namespace DOM
00589 
00590 #undef KPAC

KHTML

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

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • Kross
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.5.7
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal