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.

302 lines
9.7 KiB

/***************************************************************************
ksworkspace.cpp - description
-------------------
begin : Thu Jan 17 2002
copyright : (C) 2002 by kamil
email : kamil@localhost.localdomain
***************************************************************************/
/***************************************************************************
* *
* 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 "ksworkspace.h"
#include"kmatplotshell.h"
#include"pixmaps/action_windows.xpm"
#include<qworkspace.h>
#include<qlayout.h>
#include<qpushbutton.h>
#include<qhbuttongroup.h>
#include<qpopupmenu.h>
#include<qaction.h>
#include<qcursor.h>
KSWorkspace::KSWorkspace( KMatplotShell *shell, const char *name )
: QWidget(shell,name)
{
m_shell = shell;
QVBoxLayout *layout = new QVBoxLayout( this );
m_workspace = new QWorkspace( this );
connect( m_workspace, SIGNAL(windowActivated(QWidget*)), this, SLOT(slot_window_activated(QWidget*)) );
m_button_bar = new QWidget( this );
m_button_bar->setFixedHeight( 22 );
m_button_bar->installEventFilter( this );
layout->addWidget( m_workspace );
layout->addWidget( m_button_bar );
QHBoxLayout *button_bar_layout = new QHBoxLayout( m_button_bar );
m_buttons = new QHButtonGroup( m_button_bar );
m_buttons->setExclusive( TRUE );
m_buttons->setInsideMargin( 0 );
m_buttons->setInsideSpacing( 0 );
button_bar_layout->addWidget( m_buttons );
button_bar_layout->addStretch( 1 );
}
//--------------------------------------------------------------------------//
KSWorkspace::~KSWorkspace()
{
}
//--------------------------------------------------------------------------//
KSWorkspaceWindow *KSWorkspace::activeWindow() const
{
return dynamic_cast<KSWorkspaceWindow*>(m_workspace->activeWindow());
}
//--------------------------------------------------------------------------//
KSWindowButton *KSWorkspace::addWindow( KSWorkspaceWindow *w )
{
KSWindowButton *new_button = new KSWindowButton( w, m_buttons );
new_button->show();
return new_button;
}
//--------------------------------------------------------------------------//
void KSWorkspace::removeWindow( KSWorkspaceWindow *w )
{
if ( w && w->isActive() ) windowDeactivate( w );
if ( w ) delete w->button();
}
//--------------------------------------------------------------------------//
void KSWorkspace::windowActivate( KSWorkspaceWindow *w )
{
if ( w && !w->isActive() ) {
w->activated();
w->setActive( TRUE );
if ( w->button() ) w->button()->setOn( TRUE );
m_shell->objectContainer()->setWidget( w->createObjectPanel(m_shell->objectContainer()) );
m_shell->propertyContainer()->setWidget( w->createPropertyPanel(m_shell->propertyContainer()) );
}
}
//--------------------------------------------------------------------------//
void KSWorkspace::windowDeactivate( KSWorkspaceWindow *w )
{
if ( w && w->isActive() ) {
w->deactivated();
w->setActive( FALSE );
if ( w->button() ) w->button()->setOn( FALSE );
m_shell->objectContainer()->setWidget( NULL );
m_shell->propertyContainer()->setWidget( NULL );
m_shell->disableCustomActions();
}
}
//--------------------------------------------------------------------------//
void KSWorkspace::slot_window_activated( QWidget *w )
{
QWidgetList window_list = m_workspace->windowList();
for ( QWidget *curr_widget = window_list.first(); curr_widget; curr_widget = window_list.next() ) {
KSWorkspaceWindow *curr_window = dynamic_cast<KSWorkspaceWindow*>(curr_widget);
if ( curr_window && curr_window->isActive() && curr_widget != w ) windowDeactivate( curr_window );
}
KSWorkspaceWindow *window = dynamic_cast<KSWorkspaceWindow*>(w);
if ( window && !window->isActive() ) windowActivate( window );
}
//--------------------------------------------------------------------------//
bool KSWorkspace::eventFilter( QObject *o, QEvent *e )
{
if ( e->type() == QEvent::ContextMenu && o == m_button_bar ) {
((QContextMenuEvent *)e)->accept();
QPopupMenu *windows = new QPopupMenu( this );
QPopupMenu *new_window = new QPopupMenu( windows );
windows->insertItem( tr("New window"), new_window );
m_shell->m_new_page_view_win->addTo( new_window );
m_shell->m_new_worksheet_win->addTo( new_window );
m_shell->m_new_edit_data_win->addTo( new_window );
windows->insertSeparator();
m_shell->m_restore_windows->addTo( windows );
m_shell->m_maximize_windows->addTo( windows );
m_shell->m_minimize_windows->addTo( windows );
windows->insertSeparator();
m_shell->m_hide_window->addTo( windows );
m_shell->m_show_window->addTo( windows );
windows->insertSeparator();
m_shell->m_close_window->addTo( windows );
windows->insertSeparator();
m_shell->m_tile_windows->addTo( windows );
m_shell->m_cascade_windows->addTo( windows );
windows->exec(QCursor::pos()); delete windows;
return TRUE;
}
return FALSE;
}
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------//
KSWorkspaceWindow::KSWorkspaceWindow( KSWorkspace *workspace, const QString& caption, const QPixmap& icon, WFlags f )
:QWidget( workspace->workspace(), "workspace_window", f | WDestructiveClose )
{
m_contents = NULL;
m_workspace = workspace;
m_active = false;
setCaption( caption );
setIcon( icon );
m_button = m_workspace->addWindow( this );
}
//--------------------------------------------------------------------------//
KSWorkspaceWindow::~KSWorkspaceWindow()
{
m_workspace->removeWindow( this );
}
//--------------------------------------------------------------------------//
void KSWorkspaceWindow::setContents( QWidget *contents )
{
delete m_contents;
m_contents = contents;
if ( m_contents ) {
m_contents->move( 0, 0 );
m_contents->resize( size() );
m_contents->show();
}
}
//--------------------------------------------------------------------------//
void KSWorkspaceWindow::setActive( bool enable )
{
m_active = enable;
}
//--------------------------------------------------------------------------//
void KSWorkspaceWindow::resizeEvent( QResizeEvent * )
{
if ( m_contents ) {
m_contents->move( 0, 0 );
m_contents->resize( size() );
}
}
//--------------------------------------------------------------------------//
void KSWorkspaceWindow::focusInEvent( QFocusEvent *event )
{
QWidget::focusInEvent( event );
}
//--------------------------------------------------------------------------//
void KSWorkspaceWindow::focusOutEvent( QFocusEvent *event )
{
QWidget::focusOutEvent( event );
}
//--------------------------------------------------------------------------//
void KSWorkspaceWindow::setTitle( const QString& newTitle )
{
setCaption( newTitle );
if ( button() ) button()->setText( newTitle );
}
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------//
//--------------------------------------------------------------------------//
KSWindowButton::KSWindowButton( KSWorkspaceWindow *window, QWidget *parent )
: QPushButton( parent )
{
m_window = window;
setText( window->caption() );
QPixmap pixmap = *window->icon();
pixmap.resize( 10, 10 );
setIconSet( pixmap );
setFixedHeight( 22 );
setMinimumWidth( 5 );
setFont( QFont("Arial",9) );
setToggleButton( TRUE );
connect( this, SIGNAL(pressed()), this, SLOT(slot_button_pressed()) );
}
//--------------------------------------------------------------------------//
KSWindowButton::~KSWindowButton()
{
}
//--------------------------------------------------------------------------//
void KSWindowButton::slot_button_pressed()
{
m_window->setFocus();
}
//--------------------------------------------------------------------------//
void KSWindowButton::contextMenuEvent( QContextMenuEvent *e )
{
QPopupMenu *menu = new QPopupMenu( this );
e->accept();
int restore_id = menu->insertItem(tr("Restore"));
int maximize_id = menu->insertItem(tr("Maximize"));
int minimize_id = menu->insertItem(tr("Minimize"));
menu->insertSeparator();
int hide_id = menu->insertItem(tr("Hide"));
int show_id = menu->insertItem(tr("Show"));
menu->insertSeparator();
int close_id = menu->insertItem(tr("Close"));
int selected_id = menu->exec(QCursor::pos()); delete menu;
if ( selected_id == restore_id ) {
m_window->showNormal();
}
else if ( selected_id == maximize_id ) {
m_window->showMaximized();
}
else if ( selected_id == minimize_id ) {
m_window->showMinimized();
}
else if ( selected_id == hide_id ) {
m_window->hide();
}
else if ( selected_id == show_id ) {
m_window->show();
}
else if ( selected_id == close_id ) {
// ups we are deleting ourselves
m_window->close();
}
}