/*************************************************************************** * Copyright (C) 2003,2005 by David Saxton * * david@bluehaze.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include // Temporay fix for pthread.h problem #include "circuitdocument.h" #include "docmanager.h" #include "flowcodedocument.h" #include "itemdocument.h" #include "itemlibrary.h" #include "itemselector.h" #include "libraryitem.h" #include "mechanicsdocument.h" #include #include #include #include #include #include #include #include #include ILVItem::ILVItem( TQListView* parent, const TQString &id ) : TDEListViewItem( parent, 0 ) { m_id = id; b_isRemovable = false; m_pProjectItem = 0l; } ILVItem::ILVItem( TQListViewItem* parent, const TQString &id ) : TDEListViewItem( parent, 0 ) { m_id = id; b_isRemovable = false; m_pProjectItem = 0l; } ItemSelector::ItemSelector( TQWidget *parent, const char *name ) : TDEListView( parent, name ) { addColumn( i18n( "Component" ) ); setFullWidth(true); setSorting( -1, FALSE ); setRootIsDecorated(true); setDragEnabled(true); // connect( this, TQT_SIGNAL(executed(TQListViewItem*) ), this, TQT_SLOT(slotItemExecuted(TQListViewItem*)) ); connect( this, TQT_SIGNAL(clicked(TQListViewItem*)), this, TQT_SLOT(slotItemClicked(TQListViewItem*)) ); connect( this, TQT_SIGNAL(doubleClicked(TQListViewItem*)), this, TQT_SLOT(slotItemDoubleClicked(TQListViewItem*)) ); connect( this, TQT_SIGNAL(contextMenuRequested(TQListViewItem*, const TQPoint&, int )), this, TQT_SLOT(slotContextMenuRequested(TQListViewItem*, const TQPoint&, int )) ); } ItemSelector::~ItemSelector() { writeOpenStates(); } void ItemSelector::clear() { m_categories.clear(); TDEListView::clear(); } void ItemSelector::addItem( const TQString & caption, const TQString & id, const TQString & _category, const TQPixmap & icon, bool removable ) { ILVItem *parentItem = 0L; TQString category = _category; if ( !category.startsWith("/") ) { category.prepend('/'); } do { category.remove(0,1); TQString cat; category.replace( "\\/", "|" ); int pos = category.find('/'); if ( pos == -1 ) cat = category; else cat = category.left( pos ); cat.replace( "|", "/" ); if ( m_categories.findIndex(cat) == -1 ) { m_categories.append(cat); if (parentItem) { parentItem = new ILVItem( parentItem, "" ); } else { parentItem = new ILVItem( this, "" ); } parentItem->setOpen( readOpenState(cat) ); parentItem->setExpandable(true); parentItem->setText( 0, cat ); } else { parentItem = (ILVItem*)findItem( cat, 0 ); } category.remove( 0, pos ); } while ( category.contains('/') ); if ( !parentItem ) { kdError() << "Unexpected error in finding parent item for category list"<setPixmap( 0, icon ); item->setText( 0, caption ); item->setRemovable(removable); } void ItemSelector::writeOpenStates() { TDEConfig *config = kapp->config(); config->setGroup( name() ); const TQStringList::iterator end = m_categories.end(); for ( TQStringList::iterator it = m_categories.begin(); it != end; ++it ) { TQListViewItem *item = findItem( *it, 0 ); if (item) { config->writeEntry( *it+"IsOpen", item->isOpen() ); } } } bool ItemSelector::readOpenState( const TQString &id ) { TDEConfig *config = kapp->config(); config->setGroup( name() ); return config->readBoolEntry( id+"IsOpen", true ); } void ItemSelector::slotContextMenuRequested( TQListViewItem* item, const TQPoint& pos, int /*col*/ ) { if ( !item || !(static_cast(item))->isRemovable() ) { return; } TQPopupMenu *menu = new TQPopupMenu(this); menu->insertItem( i18n("Remove %1").arg(item->text(0)), this, TQT_SLOT(slotRemoveSelectedItem()), TQt::Key_Delete ); menu->popup(pos); } void ItemSelector::slotRemoveSelectedItem() { ILVItem *item = dynamic_cast(selectedItem()); if (!item) return; emit itemRemoved( item->key( 0, 0 ) ); ILVItem *parent = dynamic_cast(item->TQListViewItem::parent()); delete item; // Get rid of the category as well if it has no children if ( parent && !parent->firstChild() ) { m_categories.remove(parent->text(0)); delete parent; } } void ItemSelector::setListCaption( const TQString &caption ) { setColumnText( 0, caption ); } void ItemSelector::slotItemClicked( TQListViewItem *item ) { if (!item) return; if ( ItemDocument * itemDocument = dynamic_cast(DocManager::self()->getFocusedDocument()) ) itemDocument->slotUnsetRepeatedItemId(); emit itemClicked( item->key( 0, 0 ) ); } void ItemSelector::slotItemDoubleClicked( TQListViewItem *item ) { if (!item) return; TQString id = item->key( 0, 0 ); if ( Document * doc = DocManager::self()->getFocusedDocument() ) { if ( doc->type() == Document::dt_flowcode && id.startsWith("flow/") ) (static_cast(doc))->slotSetRepeatedItemId(id); else if ( doc->type() == Document::dt_circuit && (id.startsWith("ec/") || id.startsWith("sc/")) ) (static_cast(doc))->slotSetRepeatedItemId(id); else if ( doc->type() == Document::dt_mechanics && id.startsWith("mech/") ) (static_cast(doc))->slotSetRepeatedItemId(id); } emit itemDoubleClicked(id); } TQDragObject* ItemSelector::dragObject() { const TQString id = currentItem()->key(0,0); TQStoredDrag * d = 0l; if ( id.startsWith("flow/") ) d = new TQStoredDrag( "ktechlab/flowpart", this ); else if ( id.startsWith("ec/") ) d = new TQStoredDrag( "ktechlab/component", this ); else if ( id.startsWith("sc/") ) d = new TQStoredDrag( "ktechlab/subcircuit", this ); else if ( id.startsWith("mech/") ) d = new TQStoredDrag( "ktechlab/mechanical", this ); if (d) { TQByteArray data; TQDataStream stream( data, IO_WriteOnly ); stream << id; d->setEncodedData(data); } // A pixmap cursor is often hard to make out // TQPixmap *pixmap = const_cast(currentItem()->pixmap(0)); // if (pixmap) d->setPixmap(*pixmap); return d; } //BEGIN class ComponentSelector ComponentSelector * ComponentSelector::m_pSelf = 0l; ComponentSelector * ComponentSelector::self( KateMDI::ToolView * parent ) { if (!m_pSelf) { assert(parent); m_pSelf = new ComponentSelector(parent); } return m_pSelf; } ComponentSelector::ComponentSelector( KateMDI::ToolView * parent ) : ItemSelector( (TQWidget*)parent, "Component Selector" ) { TQWhatsThis::add( this, i18n( "Add components to the circuit diagram by dragging them into the circuit.

" "To add more than one component of the same type, doubleclick on a component, and click repeatedly in the circuit to place the component. Right click to stop placement.

" "Some components (such as subcircuits) can be removed by right clicking on the item and selecting \"Remove\"." ) ); setListCaption( i18n("Component") ); LibraryItemList *items = itemLibrary()->items(); const LibraryItemList::iterator end = items->end(); for ( LibraryItemList::iterator it = items->begin(); it != end; ++it ) { if ( (*it)->type() == LibraryItem::lit_component ) addItem( (*it)->name(), (*it)->activeID(), (*it)->category(), (*it)->icon16() ); } } //END class ComponentSelector //BEGIN class FlowPartSelector FlowPartSelector * FlowPartSelector::m_pSelf = 0l; FlowPartSelector * FlowPartSelector::self( KateMDI::ToolView * parent ) { if (!m_pSelf) { assert(parent); m_pSelf = new FlowPartSelector(parent); } return m_pSelf; } FlowPartSelector::FlowPartSelector( KateMDI::ToolView * parent ) : ItemSelector( (TQWidget*)parent, "Part Selector" ) { TQWhatsThis::add( this, i18n("Add FlowPart to the FlowCode document by dragging them there.

To add more than one FlowPart of the same type, doubleclick on a FlowPart, and click repeatedly in the FlowChart to place the component. Right click to stop placement.") ); setListCaption( i18n("Flow Part") ); LibraryItemList *items = itemLibrary()->items(); const LibraryItemList::iterator end = items->end(); for ( LibraryItemList::iterator it = items->begin(); it != end; ++it ) { if ( (*it)->type() == LibraryItem::lit_flowpart ) addItem( (*it)->name(), (*it)->activeID(), (*it)->category(), (*it)->icon16() ); } } //END class FlowPartSelector //BEGIN class MechanicsSelector MechanicsSelector * MechanicsSelector::m_pSelf = 0l; MechanicsSelector * MechanicsSelector::self( KateMDI::ToolView * parent ) { if (!m_pSelf) { assert(parent); m_pSelf = new MechanicsSelector( (TQWidget*)parent ); } return m_pSelf; } MechanicsSelector::MechanicsSelector( TQWidget *parent ) : ItemSelector( (TQWidget*)parent, "Mechanics Selector" ) { TQWhatsThis::add( this, i18n("Add mechanical parts to the mechanics work area by dragging them there.") ); LibraryItemList *items = itemLibrary()->items(); const LibraryItemList::iterator end = items->end(); for ( LibraryItemList::iterator it = items->begin(); it != end; ++it ) { if ( (*it)->type() == LibraryItem::lit_mechanical ) { addItem( (*it)->name(), (*it)->activeID(), (*it)->category(), (*it)->icon16() ); } } } //END class MechanicsSelector #include "itemselector.moc"