1 // File: QtxMainWindow.cxx
2 // Author: Sergey TELKOV
4 #include "QtxMainWindow.h"
6 #include "QtxToolBar.h"
7 #include "QtxResourceMgr.h"
11 #include <qstatusbar.h>
12 #include <qapplication.h>
15 Class: QtxMainWindow::Filter [Internal]
16 Descr: Internal object with event filter for QtxMainWindow.
19 class QtxMainWindow::Filter : public QObject
22 Filter( QWidget*, QtxMainWindow*, QObject* = 0 );
25 virtual bool eventFilter( QObject*, QEvent* );
32 QtxMainWindow::Filter::Filter( QWidget* wid, QtxMainWindow* mw, QObject* parent )
37 myMain->installEventFilter( this );
40 QtxMainWindow::Filter::~Filter()
44 bool QtxMainWindow::Filter::eventFilter( QObject* o, QEvent* e )
46 if ( myMain == o && e->type() == QEvent::ChildRemoved &&
47 myWidget == ((QChildEvent*)e)->child() )
50 return QObject::eventFilter( o, e );
54 Class: QtxMainWindow [Public]
55 Descr: Main window with support of dockable menubar/status bar
56 and geometry store/retrieve.
59 QtxMainWindow::QtxMainWindow( QWidget* parent, const char* name, WFlags f )
60 : QMainWindow( parent, name, f ),
67 QtxMainWindow::~QtxMainWindow()
69 setDockableMenuBar( false );
70 setDockableStatusBar( false );
73 bool QtxMainWindow::isDockableMenuBar() const
78 void QtxMainWindow::setDockableMenuBar( const bool on )
80 if ( isDockableMenuBar() == on )
83 QMenuBar* mb = menuBar();
87 if ( on && !myMenuBar )
89 mb->setCaption( tr( "Menu bar" ) );
90 QtxToolBar* dockMb = new QtxToolBar( true, this, "menu bar container" );
92 new Filter( mb, this, myMenuBar );
93 dockMb->setWidget( mb );
94 dockMb->setNewLine( true );
95 dockMb->setStretchable( true );
96 dockMb->setResizeEnabled( false );
98 moveDockWindow( dockMb, DockTop );
99 setDockEnabled( dockMb, Left, false );
100 setDockEnabled( dockMb, Right, false );
102 setAppropriate( dockMb, false );
104 connect( dockMb, SIGNAL( destroyed( QObject* ) ), this, SLOT( onDestroyed( QObject* ) ) );
106 else if ( !on && myMenuBar )
108 mb->reparent( this, QPoint( 0, 0 ), mb->isVisibleTo( mb->parentWidget() ) );
109 disconnect( myMenuBar, SIGNAL( destroyed( QObject* ) ), this, SLOT( onDestroyed( QObject* ) ) );
112 QChildEvent ce( QEvent::ChildRemoved, mb );
113 QApplication::sendEvent( this, &ce );
119 bool QtxMainWindow::isDockableStatusBar() const
124 void QtxMainWindow::setDockableStatusBar( const bool on )
126 if ( isDockableStatusBar() == on )
129 QStatusBar* sb = statusBar();
133 if ( on && !myStatusBar )
135 sb->setCaption( tr( "Status bar" ) );
136 QtxToolBar* dockSb = new QtxToolBar( true, this, "status bar container" );
137 myStatusBar = dockSb;
138 new Filter( sb, this, myStatusBar );
139 dockSb->setWidget( sb );
140 dockSb->setNewLine( true );
141 dockSb->setStretchable( true );
142 dockSb->setResizeEnabled( false );
143 sb->setMinimumWidth( 250 );
145 sb->setSizeGripEnabled( false );
147 moveDockWindow( dockSb, DockBottom );
148 setDockEnabled( dockSb, Left, false );
149 setDockEnabled( dockSb, Right, false );
151 setAppropriate( dockSb, false );
153 connect( dockSb, SIGNAL( destroyed( QObject* ) ), this, SLOT( onDestroyed( QObject* ) ) );
155 else if ( !on && myStatusBar )
157 sb->reparent( this, QPoint( 0, 0 ), sb->isVisibleTo( sb->parentWidget() ) );
158 disconnect( myStatusBar, SIGNAL( destroyed( QObject* ) ), this, SLOT( onDestroyed( QObject* ) ) );
161 QChildEvent ce( QEvent::ChildRemoved, sb );
162 QApplication::sendEvent( this, &ce );
164 sb->setSizeGripEnabled( true );
170 void QtxMainWindow::loadGeometry( QtxResourceMgr* resMgr, const QString& section )
172 QString sec = section.stripWhiteSpace();
173 if ( !resMgr || sec.isEmpty() )
177 if ( !resMgr->value( sec, "state", winState ) )
180 if ( resMgr->value( sec, "state", stateStr ) )
181 winState = windowState( stateStr );
184 int win_w = resMgr->integerValue( sec, "width", width() );
185 int win_h = resMgr->integerValue( sec, "height", height() );
187 int winPosX = windowPosition( resMgr->stringValue( sec, QString( "pos_x" ), QString::null ) );
188 int winPosY = windowPosition( resMgr->stringValue( sec, QString( "pos_y" ), QString::null ) );
190 QWidget* desk = QApplication::desktop();
193 if ( winPosX == WP_Absolute )
194 win_x = resMgr->integerValue( sec, "pos_x", x() );
196 win_x = relativeCoordinate( winPosX, desk->width(), win_w );
199 if ( winPosX == WP_Absolute )
200 win_y = resMgr->integerValue( sec, "pos_y", y() );
202 win_y = relativeCoordinate( winPosY, desk->height(), win_h );
204 bool vis = isVisibleTo( parentWidget() );
206 resize( win_w, win_h );
207 move( win_x, win_y );
211 vis ? show() : hide();
214 void QtxMainWindow::show()
236 int QtxMainWindow::relativeCoordinate( const int type, const int WH, const int wh ) const
242 res = ( WH - wh ) / 2;
254 void QtxMainWindow::saveGeometry( QtxResourceMgr* resMgr, const QString& section ) const
256 QString sec = section.stripWhiteSpace();
257 if ( !resMgr || sec.isEmpty() )
260 resMgr->setValue( sec, "pos_x", pos().x() );
261 resMgr->setValue( sec, "pos_y", pos().y() );
262 resMgr->setValue( sec, "width", width() );
263 resMgr->setValue( sec, "height", height() );
265 int winState = WS_Normal;
267 winState = WS_Minimized;
268 else if ( isMaximized() )
269 winState = WS_Maximized;
271 resMgr->setValue( sec, "state", winState );
274 bool QtxMainWindow::eventFilter( QObject* o, QEvent* e )
276 return QMainWindow::eventFilter( o, e );
279 void QtxMainWindow::setAppropriate( QDockWindow* dw, bool a )
281 QMainWindow::setAppropriate( dw, myStatusBar != dw && myMenuBar != dw && a );
284 void QtxMainWindow::setUpLayout()
286 QMainWindow::setUpLayout();
288 if ( myMenuBar && layout() )
289 layout()->setMenuBar( 0 );
292 void QtxMainWindow::onDestroyed( QObject* obj )
295 if ( obj == myMenuBar )
300 else if ( obj == myStatusBar )
308 QChildEvent ce( QEvent::ChildRemoved, o );
309 QApplication::sendEvent( this, &ce );
313 int QtxMainWindow::windowState( const QString& str ) const
315 static QMap<QString, int> winStateMap;
316 if ( winStateMap.isEmpty() )
318 winStateMap["normal"] = WS_Normal;
319 winStateMap["min"] = WS_Minimized;
320 winStateMap["mini"] = WS_Minimized;
321 winStateMap["minimized"] = WS_Minimized;
322 winStateMap["max"] = WS_Maximized;
323 winStateMap["maxi"] = WS_Maximized;
324 winStateMap["maximized"] = WS_Maximized;
325 winStateMap["hidden"] = WS_Hidden;
326 winStateMap["hided"] = WS_Hidden;
327 winStateMap["hide"] = WS_Hidden;
328 winStateMap["invisible"] = WS_Hidden;
332 QString stateStr = str.stripWhiteSpace().lower();
333 if ( winStateMap.contains( stateStr ) )
334 res = winStateMap[stateStr];
338 int QtxMainWindow::windowPosition( const QString& str ) const
340 static QMap<QString, int> winPosMap;
341 if ( winPosMap.isEmpty() )
343 winPosMap["center"] = WP_Center;
344 winPosMap["left"] = WP_Left;
345 winPosMap["right"] = WP_Right;
346 winPosMap["top"] = WP_Top;
347 winPosMap["bottom"] = WP_Bottom;
350 int res = WP_Absolute;
351 QString posStr = str.stripWhiteSpace().lower();
352 if ( winPosMap.contains( posStr ) )
353 res = winPosMap[posStr];