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.
bibletime/bibletime/frontend/cmdiarea.cpp

334 lines
7.9 KiB

/*********
*
* This file is part of BibleTime's source code, http://www.bibletime.info/.
*
* Copyright 1999-2006 by the BibleTime developers.
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
*
**********/
#include "cmdiarea.h"
#include "backend/cswordmoduleinfo.h"
#include "backend/cswordversekey.h"
#include "frontend/displaywindow/cdisplaywindow.h"
#include "frontend/keychooser/ckeychooser.h"
#include "config.h"
//KDE includes
#include <tdepopupmenu.h>
#include <tdeapplication.h>
#include <tdelocale.h>
//QT includes
#include <tqobjectlist.h>
#include <tqtimer.h>
#include <tqevent.h>
#include <tqtimer.h>
CMDIArea::CMDIArea(TQWidget *parent, const char *name )
: TQWorkspace(parent, name),
m_guiOption(Nothing),
m_childEvent(false),
m_appCaption(TQString()) {
initView();
initConnections();
readSettings();
}
/** Initializes the view of the MDI area */
void CMDIArea::initView() {
setPaletteBackgroundColor( parentWidget()->paletteBackgroundColor() ); //work around a KDE bug (IMHO was in KDE 2.x)
}
/** Initilizes the connectiosn to SIGNALS */
void CMDIArea::initConnections() {
connect(this, TQT_SIGNAL(windowActivated(TQWidget*)),
this, TQT_SLOT(slotClientActivated(TQWidget*)));
}
/** Called whan a client window was activated */
void CMDIArea::slotClientActivated(TQWidget* client) {
if (!client || !isUpdatesEnabled()) {
return;
}
CDisplayWindow* sp = dynamic_cast<CDisplayWindow*>(client);
Q_ASSERT(sp);
if (!sp || !sp->isReady()) {
return;
}
TQWidgetList windows = windowList();
for ( TQWidget* w = windows.first(); w; w = windows.next() ) {
//Don't use!! It would disable accel enabling for the active window, see CDisplayWindow::windowActivated
/* if (w == client)
continue;
*/
CDisplayWindow* window = dynamic_cast<CDisplayWindow*>(w);
window->windowActivated( (window == sp) ? true : false);
}
emit sigSetToplevelCaption( ( m_appCaption = client->caption().stripWhiteSpace() ) );
}
/** Reimplementation. Used to make use of the fixedGUIOption part. */
void CMDIArea::childEvent( TQChildEvent * e ) {
TQWorkspace::childEvent(e);
if ( m_childEvent || !e) {
return;
}
m_childEvent = true;
if (!windowList().count()) {
m_appCaption = TQString();
emit sigSetToplevelCaption( TDEApplication::kApplication()->makeStdCaption(m_appCaption) );
emit sigLastPresenterClosed();
}
if ((e->inserted() || e->removed()) ) {
if (e->inserted() && e->child() && e->child()->inherits("CDisplayWindow")) {
e->child()->installEventFilter(this); //make sure we catch the events of the new window
}
else if (e->removed() && e->child() && e->child()->inherits("CDisplayWindow")) {
e->child()->removeEventFilter(this); //make sure we catch the events of the new window
}
triggerWindowUpdate();
}
m_childEvent = false;
}
/** Reimplementation */
void CMDIArea::resizeEvent(TQResizeEvent* e) {
TQWorkspace::resizeEvent(e);
if (isUpdatesEnabled()) {
triggerWindowUpdate();
};
}
/** */
void CMDIArea::saveSettings() {}
/** */
void CMDIArea::readSettings() {}
/** Deletes all the presenters in the MDI area. */
void CMDIArea::deleteAll() {
closeAllWindows();
}
/** Enable / disable autoCascading */
void CMDIArea::setGUIOption( const MDIOption& newOption ) {
//now do the initial action
m_guiOption = newOption;
triggerWindowUpdate();
}
/** */
void CMDIArea::myTileVertical() {
if (!isUpdatesEnabled() || !usableWindowList().count() ) {
return;
}
TQPtrList<TQWidget> windows = usableWindowList();
if ((windows.count() == 1) && windows.at(0)) {
m_appCaption = windows.at(0)->caption();
windows.at(0)->showMaximized();
}
else {
TQWidget* active = activeWindow();
TQWorkspace::tile();
active->setFocus();
}
}
void CMDIArea::myTileHorizontal() {
if (!isUpdatesEnabled() || !usableWindowList().count() ) {
return;
}
TQPtrList<TQWidget> windows = usableWindowList();
if ((windows.count() == 1) && windows.at(0)) {
m_appCaption = windows.at(0)->caption();
windows.at(0)/*->parentWidget()*/->showMaximized();
}
else {
TQWidget* active = activeWindow();
if (active->isMaximized()) {
active->showNormal();
}
blockSignals(true);
setUpdatesEnabled(false);
int heightForEach = height() / windows.count();
int y = 0;
for ( int i = 0; i < int(windows.count()); ++i ) {
TQWidget *window = windows.at(i);
window->parentWidget()->showNormal();
tqApp->sendPostedEvents( 0, TQEvent::ShowNormal );
const int preferredHeight = window->minimumHeight() + window->parentWidget()->baseSize().height();
const int actHeight = TQMAX(heightForEach, preferredHeight);
window->parentWidget()->setGeometry( 0, y, width(), actHeight );
y += actHeight;
}
setUpdatesEnabled(true);
active->setFocus();
blockSignals(false);
}
}
/** */
void CMDIArea::myCascade() {
if (!isUpdatesEnabled() || !usableWindowList().count() ) {
return;
}
TQPtrList<TQWidget> windows = usableWindowList();
if ( !windows.count() ) {
return;
}
if ((windows.count() == 1) && windows.at(0)) {
m_appCaption = windows.at(0)->caption();
windows.at(0)->parentWidget()->showMaximized();
}
else {
const int offsetX = 40;
const int offsetY = 40;
const int windowWidth = width() - (windows.count()-1)*offsetX;
const int windowHeight = height() - (windows.count()-1)*offsetY;
int x = 0;
int y = 0;
TQWidget* const active = activeWindow();
if (active->isMaximized()) {
active->showNormal();
}
blockSignals(true);
setUpdatesEnabled(false);
for (int i(0); i < int(windows.count()); ++i) {
TQWidget* window = windows.at(i);
if (window == active) { //leave out the active window which should be the top window
continue;
}
window->setUpdatesEnabled(false);
window->parentWidget()->raise(); //make it the on-top-of-window-stack window to make sure they're in the right order
window->parentWidget()->setGeometry(x, y, windowWidth, windowHeight);
x += offsetX;
y += offsetY;
window->setUpdatesEnabled(true);
}
setUpdatesEnabled(true);
active->parentWidget()->setGeometry(x, y, windowWidth, windowHeight);
active->parentWidget()->raise();
active->setActiveWindow();
blockSignals(false);
}
}
/*!
\fn CMDIArea::emitWindowCaptionChanged()
*/
void CMDIArea::emitWindowCaptionChanged() {
if (activeWindow()) {
m_appCaption = activeWindow()->caption();
}
emit sigSetToplevelCaption(currentApplicationCaption());
}
/*!
\fn CMDIArea::usableWindowsCount()
*/
TQPtrList<TQWidget> CMDIArea::usableWindowList() {
TQPtrList<TQWidget> ret;
TQWidgetList windows = windowList();
for ( TQWidget* w = windows.first(); w; w = windows.next() ) {
if (w->isMinimized() || w->isHidden()) { //not usable for us
continue;
}
ret.append( w );
}
return ret;
}
bool CMDIArea::eventFilter( TQObject *o, TQEvent *e ) {
Q_ASSERT(o);
Q_ASSERT(e);
TQWidget* w = dynamic_cast<TQWidget*>( o );
bool ret = TQWorkspace::eventFilter(o,e);
if ( w && (e->type() == TQEvent::WindowStateChange) ) {
if (o->inherits("CDisplayWindow") && ((w->windowState() & TQt::WindowMinimized) || w->isHidden())) { //window was minimized, trigger a tile/cascade update if necessary
triggerWindowUpdate();
ret = false;
}
else if (!o->inherits("CDisplayWindow")){
tqDebug("CMDIArea: bad mdi child classname: %s", o->className());
//o->dumpObjectInfo();
//o->dumpObjectTree();
}
}
return ret; // standard event processing
}
/*!
\fn CMDIArea::triggerWindowUpdate()
*/
void CMDIArea::triggerWindowUpdate() {
tqDebug("CMDIArea::triggerWindowUpfdate");
if (isUpdatesEnabled() && usableWindowList().count() ) {
switch (m_guiOption) {
case autoTileVertical:
TQTimer::singleShot(0, this, TQT_SLOT(myTileVertical()));
break;
case autoTileHorizontal:
TQTimer::singleShot(0, this, TQT_SLOT(myTileHorizontal()));
break;
case autoCascade:
TQTimer::singleShot(0, this, TQT_SLOT(myCascade()));
break;
default:
tqDebug("CMDIArea::triggerWindowUpdate: no known m_guiType");
break;
}
}
}
#include "cmdiarea.moc"