You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
8.6 KiB
306 lines
8.6 KiB
/*
|
|
* Copyright (c) 2002-2003 Jesper K. Pedersen <blackie@kde.org>
|
|
*
|
|
* 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 <tqmessagebox.h>
|
|
#else
|
|
#include <kmessagebox.h>
|
|
#include "kmultiformlistbox-multivisible.moc"
|
|
#endif
|
|
|
|
#include "kmultiformlistbox-multivisible.h"
|
|
#include "indexWindow.h"
|
|
#include "ccp.h"
|
|
|
|
#include <tqbitmap.h>
|
|
|
|
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->tqsizeHint().width());
|
|
if (strcmp(child->name(), "seperator") != 0) {
|
|
totalHeight += child->tqsizeHint().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->tqsizeHint().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<const KMultiFormListBoxEntry *>(child))
|
|
count++;
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
|