Indenters: Fix dangling pointer when project settings are deleted.

Task-number: QTCREATORBUG-5390
Change-Id: I68517955a86fbb2ded53f6235a7fe27793e2b2c8
Reviewed-on: http://codereview.qt.nokia.com/1481
Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com>
This commit is contained in:
Christian Kamm
2011-07-12 08:52:32 +02:00
parent f7b2dd95de
commit 1dfd78a9c8
4 changed files with 33 additions and 1 deletions

View File

@@ -50,6 +50,8 @@ using namespace CppTools;
CppQtStyleIndenter::CppQtStyleIndenter()
: m_cppCodeStylePreferences(0)
{
// Just for safety. setCodeStylePreferences should be called when the editor the
// indenter belongs to gets initialized.
m_cppCodeStylePreferences = CppToolsSettings::instance()->cppCodeStylePreferences();
}

View File

@@ -51,6 +51,7 @@
#include "codeassistant.h"
#include "defaultassistinterface.h"
#include "convenience.h"
#include "texteditorsettings.h"
#include <aggregation/aggregate.h>
#include <coreplugin/actionmanager/actionmanager.h>
@@ -4335,12 +4336,16 @@ void BaseTextEditorWidget::setTabPreferences(TabPreferences *tabPreferences)
{
if (d->m_tabPreferences) {
disconnect(d->m_tabPreferences, SIGNAL(currentSettingsChanged(TextEditor::TabSettings)),
this, SLOT(setTabSettings(TextEditor::TabSettings)));
this, SLOT(setTabSettings(TextEditor::TabSettings)));
disconnect(d->m_tabPreferences, SIGNAL(destroyed()),
this, SLOT(onTabPreferencesDestroyed()));
}
d->m_tabPreferences = tabPreferences;
if (d->m_tabPreferences) {
connect(d->m_tabPreferences, SIGNAL(currentSettingsChanged(TextEditor::TabSettings)),
this, SLOT(setTabSettings(TextEditor::TabSettings)));
connect(d->m_tabPreferences, SIGNAL(destroyed()),
this, SLOT(onTabPreferencesDestroyed()));
setTabSettings(d->m_tabPreferences->currentSettings());
}
}
@@ -4351,15 +4356,37 @@ void BaseTextEditorWidget::setCodeStylePreferences(IFallbackPreferences *prefere
if (d->m_codeStylePreferences) {
disconnect(d->m_codeStylePreferences, SIGNAL(currentValueChanged(QVariant)),
this, SLOT(slotCodeStyleSettingsChanged(QVariant)));
disconnect(d->m_codeStylePreferences, SIGNAL(destroyed()),
this, SLOT(onCodeStylePreferencesDestroyed()));
}
d->m_codeStylePreferences = preferences;
if (d->m_codeStylePreferences) {
connect(d->m_codeStylePreferences, SIGNAL(currentValueChanged(QVariant)),
this, SLOT(slotCodeStyleSettingsChanged(QVariant)));
connect(d->m_codeStylePreferences, SIGNAL(destroyed()),
this, SLOT(onCodeStylePreferencesDestroyed()));
slotCodeStyleSettingsChanged(d->m_codeStylePreferences->currentValue());
}
}
void BaseTextEditorWidget::onTabPreferencesDestroyed()
{
if (sender() != d->m_tabPreferences)
return;
// avoid failing disconnects, m_tabPreferences has already been reduced to QObject
d->m_tabPreferences = 0;
setTabPreferences(TextEditorSettings::instance()->tabPreferences(languageSettingsId()));
}
void BaseTextEditorWidget::onCodeStylePreferencesDestroyed()
{
if (sender() != d->m_codeStylePreferences)
return;
// avoid failing disconnects, m_codeStylePreferences has already been reduced to QObject
d->m_codeStylePreferences = 0;
setCodeStylePreferences(TextEditorSettings::instance()->codeStylePreferences(languageSettingsId()));
}
void BaseTextEditorWidget::slotCodeStyleSettingsChanged(const QVariant &)
{

View File

@@ -355,6 +355,8 @@ private slots:
bool inFindScope(const QTextCursor &cursor);
bool inFindScope(int selectionStart, int selectionEnd);
void inSnippetMode(bool *active);
void onTabPreferencesDestroyed();
void onCodeStylePreferencesDestroyed();
private:
Internal::BaseTextEditorPrivate *d;

View File

@@ -33,6 +33,7 @@
#include "indenter.h"
#include "basetexteditor.h"
#include "tabsettings.h"
#include "ifallbackpreferences.h"
using namespace TextEditor;