/* * Copyright (c) 2002-2003 Jesper K. Pedersen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. **/ #ifdef TQT_ONLY #include "compat.h" #include #else #include #include "tdemultiformlistbox-multivisible.moc" #endif #include "tdemultiformlistbox-multivisible.h" #include "indexWindow.h" #include "ccp.h" #include const int indexButtonWidth = 16; const int indexButtonHeight = 12; const uchar indexButtonBits[] = { 0x00, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x04, 0x02, 0x04, 0x02, 0xc4, 0x8a, 0x24, 0x53, 0x14, 0x22, 0x14, 0x22, 0x24, 0x53, 0xce, 0x8a, 0x00, 0x00 }; KMultiFormListBoxMultiVisible::KMultiFormListBoxMultiVisible(KMultiFormListBoxFactory *fact, TQWidget *parent, const char *name) : TQScrollView(parent, name) { factory = fact; // Initialize the element list elms = new WidgetList(); // Initialize the clipper. enableClipper(true); resizeContents(50,50); // This is required for proper functionality } //---------------------------------------------------------------------- // This function returns a list of the elements in the KMultiFormListBox widget. //---------------------------------------------------------------------- KMultiFormListBoxEntryList KMultiFormListBoxMultiVisible::elements() { KMultiFormListBoxEntryList res; for (TQWidget *child = elms->first(); child; child=elms->next()) { if (strcmp(child->name(),"seperator") != 0) { res.append((KMultiFormListBoxEntry *) child); } } return res; } //---------------------------------------------------------------------- // This function is called whenever the KMultiFormListBox widget is resized. It is // necessary to ensure that the content of the clipper is resized. //---------------------------------------------------------------------- void KMultiFormListBoxMultiVisible::resizeEvent(TQResizeEvent *e) { // The call of the super class ensures that the outer border is updated. TQScrollView::resizeEvent(e); updateClipperContent(); } void KMultiFormListBoxMultiVisible::updateClipperContent() { // Extract the current size of the clipper int ClipperWidth = clipper()->size().width(); int ClipperHeight = clipper()->size().height(); // Initialize the calculation of the size of the new clipper. int totalHeight = 0; int maxWidth = ClipperWidth; int count = 0; // calculate the required size. for (TQWidget *child = elms->first(); child; child=elms->next()) { maxWidth = TQMAX(maxWidth, child->sizeHint().width()); if (strcmp(child->name(), "seperator") != 0) { totalHeight += child->sizeHint().height(); count++; } else { totalHeight += child->size().height(); } } // Calculate the extra height for the elements. int extra = 0; if (totalHeight < ClipperHeight && count != 0) { extra = (ClipperHeight - totalHeight) / count; totalHeight = ClipperHeight; } // Now place the elements in the clipper. int yPos = 0; for (TQWidget *child2 = elms->first(); child2; child2=elms->next()) { int h; if ( strcmp(child2->name(),"seperator") != 0) { h = child2->sizeHint().height(); h += extra; } else { h = child2->size().height(); } moveChild(child2, 0,yPos); child2->resize(maxWidth,h); yPos += h; } // Finally call the resize procedure for the clipper to ensure that the // new sizes is shown properly. resizeContents(maxWidth, totalHeight); } void KMultiFormListBoxMultiVisible::addElement() { addElement(0); } void KMultiFormListBoxMultiVisible::addElement(KMultiFormListBoxEntry *after) { KMultiFormListBoxEntry *elm = factory->create(viewport()); insertElmIntoWidget(elm, after); } void KMultiFormListBoxMultiVisible::append(KMultiFormListBoxEntry *elm) { elm->reparent(viewport(), 0, TQPoint(0,0), false); insertElmIntoWidget(elm, 0); } void KMultiFormListBoxMultiVisible::delElement(TQWidget *elm) { int index = elms->find(elm); TQWidget *next = elms->at(index+1); if (strcmp(next->name(),"seperator") != 0) { elms->removeRef(next); removeChild(next); } elms->removeRef(elm); removeChild(elm); updateClipperContent(); } void KMultiFormListBoxMultiVisible::delAnElement() { delElement(elms->at(0)); } void KMultiFormListBoxMultiVisible::insertElmIntoWidget(KMultiFormListBoxEntry *elm, KMultiFormListBoxEntry *after) { // Bind the index button if it exists. if (elm->indexButton()) { elm->indexButton()->setPixmap(TQBitmap(indexButtonWidth, indexButtonHeight, indexButtonBits, true)); connect(elm->indexButton(), TQT_SIGNAL(clicked()), elm, TQT_SLOT(acceptIndexButton())); connect(elm, TQT_SIGNAL(gotoIndex(KMultiFormListBoxEntry *)), this, TQT_SLOT(showIndexList(KMultiFormListBoxEntry *))); } // Find the location to insert the new element. int index = elms->count(); if (after) { index = elms->findRef(after); } // Now show the new element. elms->insert(index, elm); elm->show(); addChild(elm,0,0); // updateClipperContent will place the child correctly. TQWidget *sep = factory->separator(viewport()); if (sep != 0) { sep->setName("seperator"); sep->show(); addChild(sep,0,0); // updateClipperContent will place the child correctly. elms->insert(index+1, sep); } updateClipperContent(); showWidget(elm); // scroll to show the new widget. // install cut'n'paste functionallity new CCP(this,elm); } //---------------------------------------------------------------------- // This function shows the list of available Idx elements. //---------------------------------------------------------------------- void KMultiFormListBoxMultiVisible::showIndexList(KMultiFormListBoxEntry *elm) { indexWindow *menu = new indexWindow(); // Insert the elements into the menu item. for (TQWidget *child = elms->first(); child; child=elms->next()) { if ( strcmp(child->name(), "seperator") != 0) { TQString txt = ((KMultiFormListBoxEntry *) child)->idxString(); menu->insertItem(txt); } } // Calculate the location of the window TQPoint start; int width; elm->indexWindowPos(&start, &width); // Show the window. int index = menu->exec(start,width); if (index != -1) { for (TQWidget *child = elms->first(); child; child=elms->next()) { if ( strcmp(child->name(), "seperator") != 0) { if (index == 0) { showWidget((KMultiFormListBoxEntry *) child); break; } index--; } } } delete menu; } //---------------------------------------------------------------------- // Scroll to the loaction of the given KMultiFormListBoxEntry element. //---------------------------------------------------------------------- void KMultiFormListBoxMultiVisible::showWidget(KMultiFormListBoxEntry *elm) { setContentsPos(childX(elm), childY(elm)); } void KMultiFormListBoxMultiVisible::cut(KMultiFormListBoxEntry *elm) { if (countElements(elms) == 1) { KMessageBox::information(this, i18n("Due to a bug, it is not possible to remove the last element."), i18n("Internal Error") ); return; } TQDataStream stream(clipboard, IO_WriteOnly); factory->toStream( TQT_TQOBJECT(elm), stream ); delElement(elm); } void KMultiFormListBoxMultiVisible::copy(KMultiFormListBoxEntry *elm) { TQDataStream stream(clipboard, IO_WriteOnly); factory->toStream(TQT_TQOBJECT(elm), stream); } void KMultiFormListBoxMultiVisible::paste(KMultiFormListBoxEntry *oldElm) { if (clipboard.size() == 0) { KMessageBox::information(this, i18n("There is no element on the clipboard to paste in.")); return; } KMultiFormListBoxEntry *newElm = factory->create(viewport()); TQDataStream stream( clipboard, IO_ReadOnly ); factory->fromStream(stream, TQT_TQOBJECT(newElm)); insertElmIntoWidget(newElm,oldElm); } int KMultiFormListBoxMultiVisible::countElements(WidgetList *elms) { int count = 0; for (TQWidget *child = elms->first(); child; child=elms->next()) { if (dynamic_cast(child)) count++; } return count; }