/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** Commercial Usage ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://qt.nokia.com/contact. ** **************************************************************************/ #include "outputpane.h" #include "outputpanemanager.h" #include "coreconstants.h" #include "icore.h" #include "ioutputpane.h" #include "modemanager.h" #include #include namespace Core { struct OutputPanePlaceHolderPrivate { explicit OutputPanePlaceHolderPrivate(Core::IMode *mode, QSplitter *parent); Core::IMode *m_mode; QSplitter *m_splitter; bool m_closeable; static OutputPanePlaceHolder* m_current; }; OutputPanePlaceHolderPrivate::OutputPanePlaceHolderPrivate(Core::IMode *mode, QSplitter *parent) : m_mode(mode), m_splitter(parent), m_closeable(true) { } OutputPanePlaceHolder *OutputPanePlaceHolderPrivate::m_current = 0; OutputPanePlaceHolder::OutputPanePlaceHolder(Core::IMode *mode, QSplitter* parent) : QWidget(parent), d(new OutputPanePlaceHolderPrivate(mode, parent)) { setVisible(false); setLayout(new QVBoxLayout); QSizePolicy sp; sp.setHorizontalPolicy(QSizePolicy::Preferred); sp.setVerticalPolicy(QSizePolicy::Preferred); sp.setHorizontalStretch(0); setSizePolicy(sp); layout()->setMargin(0); connect(Core::ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode *)), this, SLOT(currentModeChanged(Core::IMode *))); } OutputPanePlaceHolder::~OutputPanePlaceHolder() { if (d->m_current == this) { Internal::OutputPaneManager::instance()->setParent(0); Internal::OutputPaneManager::instance()->hide(); } } void OutputPanePlaceHolder::setCloseable(bool b) { d->m_closeable = b; } bool OutputPanePlaceHolder::closeable() { return d->m_closeable; } void OutputPanePlaceHolder::currentModeChanged(Core::IMode *mode) { if (d->m_current == this) { d->m_current = 0; Internal::OutputPaneManager *om = Internal::OutputPaneManager::instance(); om->setParent(0); om->hide(); om->updateStatusButtons(false); } if (d->m_mode == mode) { d->m_current = this; Internal::OutputPaneManager *om = Internal::OutputPaneManager::instance(); layout()->addWidget(om); om->show(); om->updateStatusButtons(isVisible()); om->setCloseable(d->m_closeable); } } void OutputPanePlaceHolder::maximizeOrMinimize(bool maximize) { if (!d->m_splitter) return; int idx = d->m_splitter->indexOf(this); if (idx < 0) return; QList sizes = d->m_splitter->sizes(); if (maximize) { int sum = 0; foreach(int s, sizes) sum += s; for (int i = 0; i < sizes.count(); ++i) { sizes[i] = 32; } sizes[idx] = sum - (sizes.count()-1) * 32; } else { int target = sizeHint().height(); int space = sizes[idx] - target; if (space > 0) { for (int i = 0; i < sizes.count(); ++i) { sizes[i] += space / (sizes.count()-1); } sizes[idx] = target; } } d->m_splitter->setSizes(sizes); } bool OutputPanePlaceHolder::isMaximized() const { return Internal::OutputPaneManager::instance()->isMaximized(); } void OutputPanePlaceHolder::unmaximize() { if (Internal::OutputPaneManager::instance()->isMaximized()) Internal::OutputPaneManager::instance()->slotMinMax(); } OutputPanePlaceHolder *OutputPanePlaceHolder::getCurrent() { return OutputPanePlaceHolderPrivate::m_current; } bool OutputPanePlaceHolder::canMaximizeOrMinimize() const { return d->m_splitter != 0; } bool OutputPanePlaceHolder::isCurrentVisible() { return OutputPanePlaceHolderPrivate::m_current && OutputPanePlaceHolderPrivate::m_current->isVisible(); } } // namespace Core