1
0
mirror of https://github.com/fwbuilder/fwbuilder synced 2026-03-24 12:17:26 +01:00
fwbuilder/src/libgui/ProjectPanel_state_ops.cpp

363 lines
10 KiB
C++

/*
Firewall Builder
Copyright (C) 2008 NetCitadel, LLC
Author: alek@codeminders.com
refactoring and bugfixes: vadim@fwbuilder.org
$Id$
This program is free software which we release under the GNU General Public
License. You may redistribute and/or modify this program under the terms
of that license as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
To get a copy of the GNU General Public License, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../../config.h"
#include "global.h"
#include "utils.h"
#include "utils_no_qt.h"
#include "ProjectPanel.h"
#include "FWBSettings.h"
#include "RCS.h"
#include "RuleSetView.h"
#include "ObjectTreeView.h"
#include <QtDebug>
#include <QMdiSubWindow>
#include <QMdiArea>
#include "fwbuilder/Library.h"
#include "fwbuilder/RuleSet.h"
using namespace Ui;
using namespace libfwbuilder;
using namespace std;
void ProjectPanel::saveState()
{
QString file_name ;
if (rcs!=NULL) file_name = rcs->getFileName();
if (fwbdebug)
qDebug( ) << "ProjectPanel::saveState " << this
<< "title " << mdiWindow->windowTitle()
<< "file_name=" << file_name
<< "ready=" << ready;
if (!ready) return;
st->setInt("Window/" + file_name + "/x", mdiWindow->x());
st->setInt("Window/" + file_name + "/y", mdiWindow->y());
st->setInt("Window/" + file_name + "/width", mdiWindow->width ());
st->setInt("Window/" + file_name + "/height", mdiWindow->height ());
saveMainSplitter();
m_panel->om->saveExpandedTreeItems();
m_panel->om->saveSectionSizes();
if (fwbdebug)
qDebug() << "ProjectPanel::saveState "
<< "rcs=" << rcs
<< "getCurrentRuleSetView()=" << getCurrentRuleSetView();
saveLastOpenedLib();
if (getCurrentRuleSetView()) saveOpenedRuleSet();
if (fwbdebug) qDebug("ProjectPanel::saveState() done");
}
void ProjectPanel::loadState(bool)
{
if (rcs==NULL) return;
QString filename = rcs->getFileName();
// This function can end up being called recursively because some
// of the operations it performs trigger various events such as
// "visibility changed" or "show".
if (loading_state) return;
loading_state = true;
if (fwbdebug)
{
qDebug() << QString("ProjectPanel::loadState filename=%1 isMaximized=%2")
.arg(filename).arg(mdiWindow->isMaximized());
qDebug() << "mdiWindow=" << mdiWindow;
qDebug() << QString("ready=%1").arg(ready);
}
if (!ready) return;
if (!mdiWindow->isMaximized() && mdiWindow)
{
if (fwbdebug) qDebug("ProjectPanel::loadState show normal");
setWindowState(0);
int x = st->getInt("Window/"+filename+"/x");
int y = st->getInt("Window/"+filename+"/y");
int width = st->getInt("Window/"+filename+"/width");
int height = st->getInt("Window/"+filename+"/height");
if (width==0 || height==0)
{
x = 10;
y = 10;
width = 600;
height= 600;
}
if (fwbdebug)
qDebug("ProjectPanel::loadState set geometry: %d %d %d %d",
x,y,width,height);
mdiWindow->setGeometry(x,y,width,height);
}
loadMainSplitter();
m_panel->om->loadExpandedTreeItems();
m_panel->om->loadSectionSizes();
loadLastOpenedLib();
loadOpenedRuleSet();
time_t last_modified = db()->getTimeLastModified();
if (fwbdebug)
qDebug() << QString("ProjectPanel::loadState filename=%1 DONE dirty=%2 last_modified=%3")
.arg(filename).arg(db()->isDirty()).arg(ctime(&last_modified));
loading_state = false;
}
void ProjectPanel::saveMainSplitter()
{
QString fileName ;
if (rcs!=NULL) fileName = rcs->getFileName();
#ifdef TREE_IS_DOCKABLE
// Save position of splitters regardless of the window state
// Do not save if one of tree panel is floating
if (!m_panel->treeDockWidget->isWindow())
{
QList<int> sl = m_panel->topSplitter->sizes();
QString arg = QString("%1,%2").arg(sl[0]).arg(sl[1]);
if (sl[0] || sl[1])
st->setStr("Window/" + fileName + "/MainWindowSplitter", arg );
if (fwbdebug)
{
QString out1 = " save Window/" + fileName + "/MainWindowSplitter";
out1+= " " + arg;
qDebug() << out1;
}
}
#else
QList<int> sl = m_panel->topSplitter->sizes();
QString arg = QString("%1,%2").arg(sl[0]).arg(sl[1]);
if (sl[0] || sl[1])
st->setStr("Window/" + fileName + "/MainWindowSplitter", arg );
if (fwbdebug)
{
QString out1 = " save Window/" + fileName + "/MainWindowSplitter";
out1+= " " + arg;
qDebug() << out1;
}
#endif
}
void ProjectPanel::loadMainSplitter()
{
QString fileName ;
if (rcs!=NULL) fileName = rcs->getFileName();
if (fwbdebug)
qDebug() << QString("ProjectPanel::loadMainSplitter() filename=%1")
.arg(fileName);
QString h_splitter_setting = "Window/" + fileName + "/MainWindowSplitter";
QString val = st->getStr(h_splitter_setting);
int w1 = 0;
int w2 = 0;
QStringList ws = val.split(',');
bool ok = false;
w1 = ws[0].toInt(&ok, 10);
if (!ok || w1 == 0) w1 = DEFAULT_H_SPLITTER_POSITION;
if (ws.size() > 1)
{
w2 = ws[1].toInt(&ok, 10);
if (!ok || w2 == 0) w2 = mdiWindow->width() - w1;
} else
w2 = mdiWindow->width() - w1;
if (fwbdebug)
qDebug() << h_splitter_setting << ":"
<< w1 << "x" << w2;
setMainSplitterPosition(w1, w2);
}
void ProjectPanel::setMainSplitterPosition(int w1, int w2)
{
if (w1 && w2)
{
QList<int> sl;
sl.push_back(w1);
sl.push_back(w2);
if (fwbdebug) qDebug("Setting main splitter position: %d,%d", w1, w2);
m_panel->topSplitter->setSizes( sl );
}
}
void ProjectPanel::collapseTree()
{
QList<int> sl;
sl.push_back(0);
sl.push_back(mdiWindow->width());
m_panel->topSplitter->setSizes( sl );
}
void ProjectPanel::collapseRules()
{
QList<int> sl;
sl.push_back(mdiWindow->width());
sl.push_back(0);
m_panel->topSplitter->setSizes( sl );
}
void ProjectPanel::loadOpenedRuleSet()
{
if (rcs==NULL) return;
QString filename = rcs->getFileName();
if (m_panel->om->getCurrentLib() == NULL) return;
int id = st->getVisibleRuleSetId(
filename, m_panel->om->getCurrentLib()->getName().c_str());
if (id > 0)
{
FWObject *obj = db()->getById(id, true);
if (obj)
{
m_panel->om->openObjectInTree(obj);
time_t last_modified = db()->getTimeLastModified();
if (fwbdebug)
qDebug("ProjectPanel::loadOpenedRuleSet(): checkpoint 1: "
"dirty=%d last_modified=%s",
db()->isDirty(), ctime(&last_modified));
openRuleSet(obj);
last_modified = db()->getTimeLastModified();
if (fwbdebug)
qDebug("ProjectPanel::loadOpenedRuleSet(): checkpoint 2: "
"dirty=%d last_modified=%s",
db()->isDirty(), ctime(&last_modified));
}
}
}
void ProjectPanel::saveOpenedRuleSet()
{
if (rcs==NULL) return;
QString filename = rcs->getFileName();
if (visibleRuleSet!=NULL)
{
st->setVisibleRuleSet(filename,
visibleRuleSet->getLibrary()->getName().c_str(),
visibleRuleSet);
getCurrentRuleSetView()->saveCollapsedGroups();
}
}
void ProjectPanel::saveLastOpenedLib()
{
QString filename = "";
if (rcs!=NULL) filename = rcs->getFileName();
FWObject* obj = m_panel->om->getCurrentLib();
if (obj!=NULL)
{
std::string sid = FWObjectDatabase::getStringId(obj->getId());
st->setStr("Window/" + filename + "/LastLib", sid.c_str() );
}
}
void ProjectPanel::loadLastOpenedLib()
{
if (fwbdebug) qDebug("ProjectPanel::loadLastOpenedLib()");
QString filename = "";
if (rcs!=NULL) filename = rcs->getFileName();
QString sid = st->getStr("Window/" + filename + "/LastLib");
if (filename!="" && sid!="")
{
if (fwbdebug)
qDebug("ProjectPanel::loadLastOpenedLib(): filename=%s "
"opening lib id=%s",
filename.toAscii().constData(),
sid.toAscii().constData());
int last_lib_id = FWObjectDatabase::getIntId(sid.toStdString());
if (last_lib_id > 0 && last_lib_id != FWObjectDatabase::DELETED_OBJECTS_ID)
{
m_panel->om->libChangedById(last_lib_id);
m_panel->om->getCurrentObjectTree()->setFocus(Qt::OtherFocusReason);
return;
}
}
loadFirstNonStandardLib();
m_panel->om->getCurrentObjectTree()->setFocus(Qt::OtherFocusReason);
}
void ProjectPanel::loadFirstNonStandardLib()
{
list<FWObject*> all_libs = db()->getByType(Library::TYPENAME);
FWObject *first_non_system_lib = NULL;
for (list<FWObject*>::iterator i=all_libs.begin(); i!=all_libs.end(); ++i)
{
int lib_id = (*i)->getId();
if (lib_id == FWObjectDatabase::DELETED_OBJECTS_ID) continue;
if (lib_id == FWObjectDatabase::STANDARD_LIB_ID) continue;
if (lib_id == FWObjectDatabase::TEMPLATE_LIB_ID) continue;
if (first_non_system_lib==NULL) first_non_system_lib = (*i);
if ((*i)->getName()=="User")
{
first_non_system_lib = *i;
break;
}
}
if (first_non_system_lib)
m_panel->om->libChangedById(first_non_system_lib->getId());
}