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 ),
66 QtxMainWindow::~QtxMainWindow()
68 setDockableMenuBar( false );
69 setDockableStatusBar( false );
72 bool QtxMainWindow::isDockableMenuBar() const
77 void QtxMainWindow::setDockableMenuBar( const bool on )
79 if ( isDockableMenuBar() == on )
82 QMenuBar* mb = menuBar();
86 if ( on && !myMenuBar )
88 mb->setCaption( tr( "Menu bar" ) );
89 QtxToolBar* dockMb = new QtxToolBar( true, this, "menu bar container" );
91 new Filter( mb, this, myMenuBar );
92 dockMb->setWidget( mb );
93 dockMb->setNewLine( true );
94 dockMb->setStretchable( true );
95 dockMb->setResizeEnabled( false );
97 moveDockWindow( dockMb, DockTop );
98 setDockEnabled( dockMb, Left, false );
99 setDockEnabled( dockMb, Right, false );
101 setAppropriate( dockMb, false );
103 connect( dockMb, SIGNAL( destroyed( QObject* ) ), this, SLOT( onDestroyed( QObject* ) ) );
105 else if ( !on && myMenuBar )
107 mb->reparent( this, QPoint( 0, 0 ), mb->isVisibleTo( mb->parentWidget() ) );
108 disconnect( myMenuBar, SIGNAL( destroyed( QObject* ) ), this, SLOT( onDestroyed( QObject* ) ) );
111 QChildEvent ce( QEvent::ChildRemoved, mb );
112 QApplication::sendEvent( this, &ce );
118 bool QtxMainWindow::isDockableStatusBar() const
123 void QtxMainWindow::setDockableStatusBar( const bool on )
125 if ( isDockableStatusBar() == on )
128 QStatusBar* sb = statusBar();
132 if ( on && !myStatusBar )
134 sb->setCaption( tr( "Status bar" ) );
135 QtxToolBar* dockSb = new QtxToolBar( true, this, "status bar container" );
136 myStatusBar = dockSb;
137 new Filter( sb, this, myStatusBar );
138 dockSb->setWidget( sb );
139 dockSb->setNewLine( true );
140 dockSb->setStretchable( true );
141 dockSb->setResizeEnabled( false );
142 sb->setMinimumWidth( 250 );
144 sb->setSizeGripEnabled( false );
146 moveDockWindow( dockSb, DockBottom );
147 setDockEnabled( dockSb, Left, false );
148 setDockEnabled( dockSb, Right, false );
150 setAppropriate( dockSb, false );
152 connect( dockSb, SIGNAL( destroyed( QObject* ) ), this, SLOT( onDestroyed( QObject* ) ) );
154 else if ( !on && myStatusBar )
156 sb->reparent( this, QPoint( 0, 0 ), sb->isVisibleTo( sb->parentWidget() ) );
157 disconnect( myStatusBar, SIGNAL( destroyed( QObject* ) ), this, SLOT( onDestroyed( QObject* ) ) );
160 QChildEvent ce( QEvent::ChildRemoved, sb );
161 QApplication::sendEvent( this, &ce );
163 sb->setSizeGripEnabled( true );
169 void QtxMainWindow::loadGeometry( QtxResourceMgr* resMgr, const QString& section )
171 QString sec = section.stripWhiteSpace();
172 if ( !resMgr || sec.isEmpty() )
176 if ( !resMgr->value( sec, "state", winState ) )
179 if ( resMgr->value( sec, "state", stateStr ) )
180 winState = windowState( stateStr );
183 int win_w = resMgr->integerValue( sec, "width", width() );
184 int win_h = resMgr->integerValue( sec, "height", height() );
186 int winPosX = windowPosition( resMgr->stringValue( sec, QString( "pos_x" ), QString::null ) );
187 int winPosY = windowPosition( resMgr->stringValue( sec, QString( "pos_y" ), QString::null ) );
189 QWidget* desk = QApplication::desktop();
192 if ( winPosX == WP_Absolute )
193 win_x = resMgr->integerValue( sec, "pos_x", x() );
195 win_x = relativeCoordinate( winPosX, desk->width(), win_w );
198 if ( winPosX == WP_Absolute )
199 win_y = resMgr->integerValue( sec, "pos_y", y() );
201 win_y = relativeCoordinate( winPosY, desk->height(), win_h );
203 bool vis = isVisibleTo( parentWidget() );
205 resize( win_w, win_h );
206 move( win_x, win_y );
224 vis ? show() : hide();
227 int QtxMainWindow::relativeCoordinate( const int type, const int WH, const int wh ) const
233 res = ( WH - wh ) / 2;
245 void QtxMainWindow::saveGeometry( QtxResourceMgr* resMgr, const QString& section ) const
247 QString sec = section.stripWhiteSpace();
248 if ( !resMgr || sec.isEmpty() )
251 resMgr->setValue( sec, "pos_x", pos().x() );
252 resMgr->setValue( sec, "pos_y", pos().y() );
253 resMgr->setValue( sec, "width", frameGeometry().width() );
254 resMgr->setValue( sec, "height",frameGeometry().height() );
256 int winState = WS_Normal;
258 winState = WS_Minimized;
259 else if ( isMaximized() )
260 winState = WS_Maximized;
262 resMgr->setValue( sec, "state", winState );
265 bool QtxMainWindow::eventFilter( QObject* o, QEvent* e )
267 return QMainWindow::eventFilter( o, e );
270 void QtxMainWindow::setAppropriate( QDockWindow* dw, bool a )
272 QMainWindow::setAppropriate( dw, myStatusBar != dw && myMenuBar != dw && a );
275 void QtxMainWindow::setUpLayout()
277 QMainWindow::setUpLayout();
279 if ( myMenuBar && layout() )
280 layout()->setMenuBar( 0 );
283 void QtxMainWindow::onDestroyed( QObject* obj )
286 if ( obj == myMenuBar )
291 else if ( obj == myStatusBar )
299 QChildEvent ce( QEvent::ChildRemoved, o );
300 QApplication::sendEvent( this, &ce );
304 int QtxMainWindow::windowState( const QString& str ) const
306 static QMap<QString, int> winStateMap;
307 if ( winStateMap.isEmpty() )
309 winStateMap["normal"] = WS_Normal;
310 winStateMap["min"] = WS_Minimized;
311 winStateMap["mini"] = WS_Minimized;
312 winStateMap["minimized"] = WS_Minimized;
313 winStateMap["max"] = WS_Maximized;
314 winStateMap["maxi"] = WS_Maximized;
315 winStateMap["maximized"] = WS_Maximized;
316 winStateMap["hidden"] = WS_Hidden;
317 winStateMap["hided"] = WS_Hidden;
318 winStateMap["hide"] = WS_Hidden;
319 winStateMap["invisible"] = WS_Hidden;
323 QString stateStr = str.stripWhiteSpace().lower();
324 if ( winStateMap.contains( stateStr ) )
325 res = winStateMap[stateStr];
329 int QtxMainWindow::windowPosition( const QString& str ) const
331 static QMap<QString, int> winPosMap;
332 if ( winPosMap.isEmpty() )
334 winPosMap["center"] = WP_Center;
335 winPosMap["left"] = WP_Left;
336 winPosMap["right"] = WP_Right;
337 winPosMap["top"] = WP_Top;
338 winPosMap["bottom"] = WP_Bottom;
341 int res = WP_Absolute;
342 QString posStr = str.stripWhiteSpace().lower();
343 if ( winPosMap.contains( posStr ) )
344 res = winPosMap[posStr];