// // C++ Implementation: %{MODULE} // // Description: // // // Author: %{AUTHOR} <%{EMAIL}>, (C) %{YEAR} // // Copyright: See COPYING file that comes with this distribution // // // TQt includes #include #include // KDE includes #include #include #include #include // App specific includes #include "Types.h" #include "contextmenuhandler.h" /** * XML-ActionHandler */ ContextActionHandler::ContextActionHandler(ContextMenuHandler *menuhandler) : TQXmlDefaultHandler(), m_menuhandler(menuhandler) { m_subName = TQString(); m_actionName = TQString(); m_qty = TQString(); m_popup = menuhandler->m_popupmenu; m_hit = false; m_searchID = TQString(); } ContextActionHandler::~ContextActionHandler() { } void ContextActionHandler::setSearchID( const TQString xmlID ) { m_searchID = xmlID; } bool ContextActionHandler::startElement( const TQString &, const TQString &, const TQString &qName, const TQXmlAttributes &atts ) { if ( qName == "Item" ){ if ( atts.value("id") == m_searchID ){ if ( atts.value("editable") == "yes"){ m_menuhandler->setItemEditable( true ); } if ( atts.value("maxlines") != ""){ m_menuhandler->setItemMaxlines( atts.value("maxlines") ); } m_hit = true; } else { m_hit = false; } } if ( !(m_hit && m_menuhandler->m_popupmenu) ) return true; if ( qName == "Action" ){ m_actionName = ""; m_qty = atts.value("qty"); } else if ( qName == "Submenu" ){ if ( atts.value("name") != "" ){ m_subName = atts.value("name"); m_popup = m_menuhandler->SubMenuFactory(m_popup); } } return true; } bool ContextActionHandler::endElement( const TQString &, const TQString &, const TQString &qName ) { if ( !(m_hit && m_menuhandler->m_popupmenu) ) return true; if ( qName == "Action" ){ KAction* newAction = m_menuhandler->ActionFactory(m_actionName, m_qty); if ( newAction ) newAction->plug( m_popup ); } else if ( qName == "Submenu" ){ if ( m_subName == "New" ){ m_menuhandler->m_popupmenu->insertItem( i18n("New"), m_popup); } // only one sublevel spported -> back to toplevel menu m_popup = m_menuhandler->m_popupmenu; } return true; } bool ContextActionHandler::characters( const TQString &ch ) { m_actionName += ch; return true; } /** * MenuHandler */ ContextMenuHandler::ContextMenuHandler(TQObject *tqparent, const char *name) : TQObject(tqparent, name), m_DocTreeView(tqparent) { m_popupmenu = NULL; m_item = NULL; initActions(); m_XmlFilePath = KGlobal::dirs()->findResource("data", "ksayit/ContextMenus.xml"); } ContextMenuHandler::~ContextMenuHandler() { delete renameItem; delete deleteItem; delete newBookInfo; delete newChapter; delete newKeywordSet; delete newKeyword; delete newAbstract; delete newAuthorGroup; delete newAuthor; delete newDate; delete newReleaseInfo; delete newTitle; delete newParagraph; delete newSection_1; delete newSection_2; delete newSection_3; delete newSection_4; delete newSection_5; if (m_popupmenu) delete m_popupmenu; } void ContextMenuHandler::initActions() { // User defined actions renameItem = new KAction (i18n("Rename..."), 0, m_DocTreeView, TQT_SLOT (slotRenameItem()), NULL ); deleteItem = new KAction (i18n("Delete..."), 0, m_DocTreeView, TQT_SLOT (slotDeleteItem()), NULL ); newBookInfo = new KAction ( i18n("Overview"), 0, m_DocTreeView, TQT_SLOT (slotNewBookInfo()), NULL ); newChapter = new KAction ( i18n("Chapter"), 0, m_DocTreeView, TQT_SLOT (slotNewChapter()), NULL ); newKeywordSet = new KAction ( i18n("Keywords"), 0, m_DocTreeView, TQT_SLOT (slotNewKeywordSet()), NULL ); newKeyword = new KAction ( i18n("Keyword"), 0, m_DocTreeView, TQT_SLOT (slotNewKeyword()), NULL ); newAbstract = new KAction ( i18n("Abstract"), 0, m_DocTreeView, TQT_SLOT (slotNewAbstract()), NULL ); newAuthorGroup = new KAction ( i18n("Authors"), 0, m_DocTreeView, TQT_SLOT (slotNewAuthorGroup()), NULL ); newAuthor = new KAction ( i18n("Author"), 0, m_DocTreeView, TQT_SLOT (slotNewAuthor()), NULL ); newDate = new KAction ( i18n("Date"), 0, m_DocTreeView, TQT_SLOT (slotNewDate()), NULL ); newReleaseInfo = new KAction ( i18n("Release Info"), 0, m_DocTreeView, TQT_SLOT (slotNewReleaseInfo()), NULL ); newTitle = new KAction ( i18n("Title"), 0, m_DocTreeView, TQT_SLOT (slotNewTitle()), NULL ); newParagraph = new KAction ( i18n("Paragraph"), 0, m_DocTreeView, TQT_SLOT (slotNewParagraph()), NULL ); newSection_1 = new KAction ( i18n("Section Level 1"), 0, m_DocTreeView, TQT_SLOT (slotNewSection_1()), NULL ); newSection_2 = new KAction ( i18n("Section Level 2"), 0, m_DocTreeView, TQT_SLOT (slotNewSection_2()), NULL ); newSection_3 = new KAction ( i18n("Section Level 3"), 0, m_DocTreeView, TQT_SLOT (slotNewSection_3()), NULL ); newSection_4 = new KAction ( i18n("Section Level 4"), 0, m_DocTreeView, TQT_SLOT (slotNewSection_4()), NULL ); newSection_5 = new KAction ( i18n("Section Level 5"), 0, m_DocTreeView, TQT_SLOT (slotNewSection_5()), NULL ); } KPopupMenu* ContextMenuHandler::getPopupMenu(ListViewInterface *item) { if ( !item ) return NULL; m_item = item; TQString xmlID = ( item->getValue(KSayItGlobal::XMLCONTEXTNAME) ).toString(); if ( xmlID.isNull() ) return NULL; // delete old popup menu and create new one if ( m_popupmenu ){ delete m_popupmenu; m_popupmenu = NULL; } m_popupmenu = new KPopupMenu(0); bool res; res = parseXmlFile(xmlID); if ( res ){ return m_popupmenu; } else { delete m_popupmenu; m_popupmenu = NULL; return NULL; } } void ContextMenuHandler::registerPopupMenu(ListViewInterface *item) { if ( !item ) return; m_item = item; TQString xmlID = ( item->getValue(KSayItGlobal::XMLCONTEXTNAME) ).toString(); if ( xmlID.isNull() ) return; // delete old popup menu if ( m_popupmenu ){ delete m_popupmenu; m_popupmenu = NULL; } // if m_popupmenu == NULL, the parser should not create a popupmenu parseXmlFile(xmlID); } bool ContextMenuHandler::parseXmlFile(const TQString &xmlID) { kdDebug(100200) << "ContextMenuHandler::parseXmlFile()" << endl; kdDebug(100200) << "XML-File: " << m_XmlFilePath << endl; TQFile xmlFile( m_XmlFilePath ); TQXmlSimpleReader parser; ContextActionHandler handler(this); handler.setSearchID(xmlID); parser.setContentHandler( &handler ); return parser.parse( TQT_TQIODEVICE(&xmlFile) ); } KAction* ContextMenuHandler::ActionFactory( const TQString &actionName, const TQString &qty ) { bool enabled; if ( qty.lower() == "n" ){ // unlimited don't check return enabled action enabled = true; } else { // check if qty is within allowed limits ListViewInterface *i = static_cast(m_item->firstChild()); int count = 0; TQString name = TQString(); while (i){ name = ( i->getValue(KSayItGlobal::XMLCONTEXTNAME) ).toString(); if ( name.lower() == actionName.lower() ){ count++; } i = static_cast(i->nextSibling()); } enabled = count < qty.toInt() ? true : false; } if ( actionName == "Rename" ){ renameItem->setEnabled( enabled ); return renameItem; } else if ( actionName == "Delete" ){ deleteItem->setEnabled( enabled ); return deleteItem; } else if ( actionName == "BookInfo" ){ newBookInfo->setEnabled( enabled ); return newBookInfo; } else if ( actionName == "Chapter" ){ newChapter->setEnabled( enabled ); return newChapter; } else if ( actionName == "KeywordSet" ){ newKeywordSet->setEnabled( enabled ); return newKeywordSet; } else if ( actionName == "Keyword" ){ newKeyword->setEnabled( enabled ); return newKeyword; } else if ( actionName == "Abstract" ){ newAbstract->setEnabled( enabled ); return newAbstract; } else if ( actionName == "AuthorGroup" ){ newAuthorGroup->setEnabled( enabled ); return newAuthorGroup; } else if ( actionName == "Author" ){ newAuthor->setEnabled( enabled ); return newAuthor; } else if ( actionName == "Date" ){ newDate->setEnabled( enabled ); return newDate; } else if ( actionName == "ReleaseInfo" ){ newReleaseInfo->setEnabled( enabled ); return newReleaseInfo; } else if ( actionName == "Title" ){ newTitle->setEnabled( enabled ); return newTitle; } else if ( actionName == "Paragraph" ){ newParagraph->setEnabled( enabled ); return newParagraph; } else if ( actionName == "Section_1" ){ newSection_1->setEnabled( enabled ); return newSection_1; } else if ( actionName == "Section_2" ){ newSection_2->setEnabled( enabled ); return newSection_2; } else if ( actionName == "Section_3" ){ newSection_3->setEnabled( enabled ); return newSection_3; } else if ( actionName == "Section_4" ){ newSection_4->setEnabled( enabled ); return newSection_4; } else if ( actionName == "Section_5" ){ newSection_5->setEnabled( enabled ); return newSection_5; } kdDebug(100200) << "ERROR!!! ContextMenuHandler::ActionFactory()" << endl; return NULL; } KPopupMenu* ContextMenuHandler::SubMenuFactory(KPopupMenu *tqparent) { return new KPopupMenu(tqparent); } void ContextMenuHandler::setItemEditable( bool editable ) { if ( m_item ) m_item->setValue(KSayItGlobal::ISEDITABLE, editable); } void ContextMenuHandler::setItemMaxlines( const TQString &maxlines ) { if ( maxlines == "" ) return; if ( !m_item ) return; int value = maxlines.toInt(); m_item->setValue( KSayItGlobal::MAXLINES, value ); } #include "contextmenuhandler.moc"