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.
tdegraphics/kpovmodeler/pmdialogview.cpp

442 lines
13 KiB

/*
**************************************************************************
description
--------------------
copyright : (C) 2000-2003 by Andreas Zehender
email : zehender@kde.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 "pmdialogview.h"
#include "pmdialogeditbase.h"
#include "pmallobjects.h"
#include "pmdebug.h"
#include "pmfactory.h"
#include "pmdatachangecommand.h"
#include "pmpart.h"
#include "pmdocumentationmap.h"
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <kdialog.h>
#include <kprocess.h>
#include <kiconloader.h>
#include <krun.h>
#include <kstdguiitem.h>
#include <tqlayout.h>
#include <tqpushbutton.h>
#include <tqgroupbox.h>
#include <tqscrollview.h>
#include <tqlabel.h>
PMDialogEditContent::PMDialogEditContent( TQWidget* parent, const char* name )
: TQScrollView( parent, name )
{
m_pContents = 0;
setVScrollBarMode( AlwaysOff );
setHScrollBarMode( AlwaysOff );
setFrameStyle( Panel | Sunken );
setLineWidth( 1 );
setResizePolicy( Manual );
}
void PMDialogEditContent::setContents( TQWidget* wid )
{
if( m_pContents )
removeChild( m_pContents );
m_pContents = wid;
if( m_pContents )
{
addChild( m_pContents );
calculateSize( );
}
}
void PMDialogEditContent::calculateSize( )
{
int fw = lineWidth( ) * 2;
if( m_pContents )
{
TQSize newSize = m_pContents->minimumSizeHint( );
setVScrollBarMode( AlwaysOff );
setHScrollBarMode( AlwaysOff );
setMargins( 0, 0, 0, 0 );
if( width( ) - fw < newSize.width( ) )
{
setHScrollBarMode( AlwaysOn );
if( ( height( ) - horizontalScrollBar( )->height( ) - fw )
< newSize.height( ) )
setVScrollBarMode( AlwaysOn );
else
newSize.setHeight( height( ) - horizontalScrollBar( )->height( ) - 2 );
}
else if( height( ) - fw < newSize.height( ) )
{
setVScrollBarMode( AlwaysOn );
if( ( width( ) - verticalScrollBar( )->width( ) - fw )
< newSize.width( ) )
setHScrollBarMode( AlwaysOn );
else
newSize.setWidth( width( ) - verticalScrollBar( )->width( ) - fw );
}
else
{
newSize.setWidth( width( ) - fw );
newSize.setHeight( height( ) - fw );
}
resizeContents( newSize.width( ), newSize.height( ) );
m_pContents->resize( newSize );
}
}
void PMDialogEditContent::resizeEvent( TQResizeEvent* /* ev */ )
{
calculateSize( );
}
PMDialogView::PMDialogView( PMPart* part, TQWidget* parent, const char* name )
: PMViewBase( parent, name )
{
m_pDisplayedWidget = 0;
m_unsavedData = false;
m_pHelper = new PMDialogEditContent( this );
m_pHelper->show( );
m_pPart = part;
m_pLayout = new TQVBoxLayout( this, KDialog::marginHint( ),
KDialog::spacingHint( ) );
TQHBoxLayout* labelLayout = new TQHBoxLayout( m_pLayout );
m_pPixmapLabel = new TQLabel( this );
m_pObjectTypeLabel = new TQLabel( this );
labelLayout->addWidget( m_pPixmapLabel );
labelLayout->addWidget( m_pObjectTypeLabel );
labelLayout->addStretch( );
m_pLayout->addWidget( m_pHelper, 2 );
m_pLayout->addStretch( );
TQHBoxLayout* buttonLayout = new TQHBoxLayout( m_pLayout );
m_pHelpButton = new KPushButton( KStdGuiItem::help(), this );
buttonLayout->addWidget( m_pHelpButton );
connect( m_pHelpButton, TQ_SIGNAL( clicked( ) ), this, TQ_SLOT( slotHelp( ) ) );
m_pHelpButton->setEnabled( false );
m_pApplyButton = new KPushButton( KStdGuiItem::apply(), this );
buttonLayout->addWidget( m_pApplyButton );
connect( m_pApplyButton, TQ_SIGNAL( clicked( ) ), this, TQ_SLOT( slotApply( ) ) );
m_pApplyButton->setEnabled( false );
buttonLayout->addStretch( );
m_pCancelButton = new KPushButton( KStdGuiItem::cancel(), this );
buttonLayout->addWidget( m_pCancelButton );
connect( m_pCancelButton, TQ_SIGNAL( clicked( ) ), this, TQ_SLOT( slotCancel( ) ) );
m_pCancelButton->setEnabled( false );
m_pLayout->activate( );
connect( part, TQ_SIGNAL( refresh( ) ), TQ_SLOT( slotRefresh( ) ) );
connect( part, TQ_SIGNAL( objectChanged( PMObject*, const int, TQObject* ) ),
TQ_SLOT( slotObjectChanged( PMObject*, const int, TQObject* ) ) );
connect( part, TQ_SIGNAL( clear( ) ), TQ_SLOT( slotClear( ) ) );
connect( part, TQ_SIGNAL( aboutToRender( ) ), TQ_SLOT( slotAboutToRender( ) ) );
connect( part, TQ_SIGNAL( aboutToSave( ) ), TQ_SLOT( slotAboutToRender( ) ) );
connect( this, TQ_SIGNAL( objectChanged( PMObject*, const int, TQObject* ) ),
part, TQ_SLOT( slotObjectChanged( PMObject*, const int, TQObject* ) ) );
displayObject( m_pPart->activeObject( ) );
}
PMDialogView::~PMDialogView( )
{
emit destroyed( this );
}
void PMDialogView::slotObjectChanged( PMObject* obj, const int mode, TQObject* sender )
{
if( sender == this )
return;
if( mode & PMCNewSelection )
{
if( m_pDisplayedWidget )
if( m_pDisplayedWidget->displayedObject( ) )
if( m_unsavedData )
if( shouldSaveData( ) )
slotApply( );
displayObject( obj );
}
if( mode & ( PMCSelected | PMCDeselected ) )
{
if( m_pDisplayedWidget )
if( m_pDisplayedWidget->displayedObject( ) )
if( m_unsavedData )
if( shouldSaveData( ) )
slotApply( );
displayObject( 0 );
}
if( mode & PMCRemove )
{
if( m_pDisplayedWidget )
{
if( m_pDisplayedWidget->displayedObject( ) == obj )
{
displayObject( 0 );
}
}
}
if( mode & ( PMCData | PMCDescription ) )
{
if( m_pDisplayedWidget )
{
if( m_pDisplayedWidget->displayedObject( ) )
{
if( m_pDisplayedWidget->displayedObject( ) == obj )
{
displayObject( obj, mode & PMCDescription );
m_unsavedData = false;
m_pApplyButton->setEnabled( false );
m_pCancelButton->setEnabled( false );
}
}
}
}
if( mode & PMCControlPointSelection )
{
if( m_pDisplayedWidget )
m_pDisplayedWidget->updateControlPointSelection( );
}
}
bool PMDialogView::shouldSaveData( )
{
return ( KMessageBox::questionYesNo(
this, i18n( "This object was modified.\n\nSave changes?" ),
i18n( "Unsaved Changes" ), KStdGuiItem::save(), KStdGuiItem::discard() ) == KMessageBox::Yes );
}
void PMDialogView::slotRefresh( )
{
if( m_pDisplayedWidget )
m_pDisplayedWidget->redisplay( );
}
void PMDialogView::slotClear( )
{
displayObject( 0 );
}
void PMDialogView::slotApply( )
{
if( m_pDisplayedWidget )
{
PMObject* obj = m_pDisplayedWidget->displayedObject( );
if( obj )
{
if( m_pDisplayedWidget->isDataValid( ) )
{
PMDataChangeCommand* cmd;
obj->createMemento( );
m_pDisplayedWidget->saveData( );
cmd = new PMDataChangeCommand( obj->takeMemento( ) );
m_pPart->executeCommand( cmd );
m_pApplyButton->setEnabled( false );
m_pCancelButton->setEnabled( false );
m_unsavedData = false;
}
}
}
}
void PMDialogView::slotHelp( )
{
if( m_pDisplayedWidget && m_pDisplayedWidget->displayedObject( ) )
{
TQString url = PMDocumentationMap::theMap( )->documentation(
m_pDisplayedWidget->displayedObject( )->className( ) );
if( !url.isEmpty( ) )
{
// Instead of calling invokeBrowser run konqueror directly.
// invokeBrowser was ignoring html anchors.
url = "konqueror " + TDEProcess::quote(url);
KRun::runCommand( url );
}
}
}
void PMDialogView::slotCancel( )
{
m_pCancelButton->setEnabled( false );
m_pApplyButton->setEnabled( false );
m_unsavedData = false;
if( m_pDisplayedWidget )
{
bool b = m_pDisplayedWidget->signalsBlocked( );
m_pDisplayedWidget->blockSignals( true );
m_pDisplayedWidget->redisplay( );
m_pDisplayedWidget->blockSignals( b );
slotSizeChanged( );
}
}
void PMDialogView::slotDataChanged( )
{
// kdDebug( PMArea ) << "PMDialogView::slotDataChanged\n";
m_pApplyButton->setEnabled( true ) ;
m_pCancelButton->setEnabled( true );
m_unsavedData = true;
}
void PMDialogView::slotSizeChanged( )
{
// force recalculating of the layout
if( m_pDisplayedWidget )
if( m_pDisplayedWidget->layout( ) )
m_pDisplayedWidget->layout( )->activate( );
m_pHelper->calculateSize( );
}
void PMDialogView::slotControlPointSelectionChanged( )
{
if( m_pDisplayedWidget && m_pDisplayedWidget->displayedObject( ) )
emit objectChanged( m_pDisplayedWidget->displayedObject( ),
PMCControlPointSelection, this );
}
void PMDialogView::displayObject( PMObject* obj, bool updateDescription )
{
PMDialogEditBase* old = 0;
if( !obj )
{
if( m_pDisplayedWidget )
old = m_pDisplayedWidget;
m_pDisplayedWidget = new PMDialogEditBase( m_pHelper->viewport( ) );
m_pDisplayedWidget->createWidgets( );
m_pHelper->setContents( m_pDisplayedWidget );
m_pPixmapLabel->setText( "" );
m_pObjectTypeLabel->setText( "" );
}
else
{
bool newWidget = true;
if( m_pDisplayedWidget )
{
if( m_pDisplayedWidget->displayedObject( ) )
{
if( obj->type( ) == m_pDisplayedWidget->displayedObject( )->type( ) )
{
// current widget displays object of the same type
// reuse the widget
newWidget = false;
}
}
}
if( newWidget )
{
// first create the new widget, then delete the old one.
if( m_pDisplayedWidget )
old = m_pDisplayedWidget;
m_pDisplayedWidget = obj->editWidget( m_pHelper->viewport( ) );
m_pDisplayedWidget->setPart( m_pPart );
m_pDisplayedWidget->createWidgets( );
m_pHelper->setContents( m_pDisplayedWidget );
if( m_pDisplayedWidget )
{
connect( m_pDisplayedWidget, TQ_SIGNAL( dataChanged( ) ),
this, TQ_SLOT( slotDataChanged( ) ) );
connect( m_pDisplayedWidget, TQ_SIGNAL( sizeChanged( ) ),
this, TQ_SLOT( slotSizeChanged( ) ) );
connect( m_pDisplayedWidget, TQ_SIGNAL( aboutToRender( ) ),
this, TQ_SLOT( slotAboutToRender( ) ) );
connect( m_pDisplayedWidget,
TQ_SIGNAL( controlPointSelectionChanged( ) ),
TQ_SLOT( slotControlPointSelectionChanged( ) ) );
}
}
}
if( m_pDisplayedWidget )
{
bool b = m_pDisplayedWidget->signalsBlocked( );
m_pDisplayedWidget->blockSignals( true );
m_pDisplayedWidget->displayObject( obj );
m_pDisplayedWidget->blockSignals( b );
m_pHelpButton->setEnabled( !m_pDisplayedWidget->helpTopic( ).isNull() );
if( !m_pDisplayedWidget->isVisible( ) )
m_pDisplayedWidget->show( );
if( obj && updateDescription )
{
m_pPixmapLabel->setPixmap( SmallIcon( obj->pixmap( ), PMFactory::instance( ) ) );
m_pObjectTypeLabel->setText( obj->description( ) );
}
slotSizeChanged( );
}
if( old )
delete old;
m_pApplyButton->setEnabled( false );
m_pCancelButton->setEnabled( false );
m_pHelpButton->setEnabled( !PMDocumentationMap::theMap( )
->povrayDocumentationPath( ).isEmpty( ) );
m_unsavedData = false;
}
void PMDialogView::keyPressEvent( TQKeyEvent* ev )
{
if( ( ev->key( ) == Key_Return ) || ( ev->key( ) == Key_Enter ) )
slotApply( );
}
void PMDialogView::slotAboutToRender( )
{
if( m_unsavedData )
if( shouldSaveData( ) )
slotApply( );
}
TQString PMDialogView::description( ) const
{
return i18n( "Object Properties" );
}
TQString PMDialogViewFactory::description( ) const
{
return i18n( "Object Properties" );
}
#include "pmdialogview.moc"