forked from qt-creator/qt-creator
DesignMode/Qt Designer clean-up Part V: Renaming
Re-introduce FormWindowEditor as IEditor used for Designer. Use SharedTools::WidgetHost directly for embedding into FormEditorStack, doing the geometry-changed handling in there as well.
This commit is contained in:
@@ -4,6 +4,15 @@ They are dependent on the CPP editor plugin.
|
|||||||
Including cpp.pri in designer.pro enables them and defines
|
Including cpp.pri in designer.pro enables them and defines
|
||||||
CPP_ENABLED.
|
CPP_ENABLED.
|
||||||
|
|
||||||
|
Editor
|
||||||
|
------
|
||||||
|
|
||||||
|
The editor shows read-only XML text in a PlainTextEditor and Designer
|
||||||
|
in Design mode. The switch is done in the currentEditorChanged signal.
|
||||||
|
To make the text editor work, IEditor needs to aggregate a PlainTextEditable
|
||||||
|
and delegate some functionality to it, while the isModified()-handling
|
||||||
|
needs to be done by Designer itself.
|
||||||
|
|
||||||
Resource handling:
|
Resource handling:
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
@@ -64,4 +64,4 @@ SOURCES += formeditorplugin.cpp \
|
|||||||
|
|
||||||
RESOURCES += designer.qrc
|
RESOURCES += designer.qrc
|
||||||
|
|
||||||
OTHER_FILES += Designer.pluginspec Designer.mimetypes.xml
|
OTHER_FILES += Designer.pluginspec Designer.mimetypes.xml README.txt
|
||||||
|
@@ -28,208 +28,26 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "designerxmleditor.h"
|
#include "designerxmleditor.h"
|
||||||
|
#include "formwindoweditor.h"
|
||||||
#include "designerconstants.h"
|
#include "designerconstants.h"
|
||||||
#include "resourcehandler.h"
|
|
||||||
#include "qt_private/formwindowbase_p.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include <coreplugin/editormanager/editormanager.h>
|
#include <coreplugin/editormanager/editormanager.h>
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
#include <coreplugin/modemanager.h>
|
#include <coreplugin/modemanager.h>
|
||||||
#include <coreplugin/imode.h>
|
#include <coreplugin/imode.h>
|
||||||
#include <coreplugin/coreconstants.h>
|
#include <coreplugin/coreconstants.h>
|
||||||
#include <coreplugin/uniqueidmanager.h>
|
|
||||||
#include <texteditor/basetextdocument.h>
|
|
||||||
|
|
||||||
#include <utils/qtcassert.h>
|
|
||||||
|
|
||||||
#include <QtDesigner/QDesignerFormWindowInterface>
|
#include <QtDesigner/QDesignerFormWindowInterface>
|
||||||
|
|
||||||
#include <QtCore/QDebug>
|
#include <QtCore/QDebug>
|
||||||
#include <QtCore/QFileInfo>
|
|
||||||
#include <QtCore/QFile>
|
|
||||||
|
|
||||||
namespace Designer {
|
namespace Designer {
|
||||||
|
|
||||||
DesignerXmlEditorEditable::DesignerXmlEditorEditable(Internal::DesignerXmlEditor *editor,
|
|
||||||
QDesignerFormWindowInterface *form,
|
|
||||||
QObject *parent) :
|
|
||||||
Core::IEditor(parent),
|
|
||||||
m_textEditable(editor),
|
|
||||||
m_file(form)
|
|
||||||
{
|
|
||||||
Core::UniqueIDManager *uidm = Core::UniqueIDManager::instance();
|
|
||||||
m_context << uidm->uniqueIdentifier(QLatin1String(Designer::Constants::K_DESIGNER_XML_EDITOR_ID));
|
|
||||||
m_context << uidm->uniqueIdentifier(QLatin1String(Designer::Constants::C_DESIGNER_XML_EDITOR));
|
|
||||||
connect(form, SIGNAL(changed()), this, SIGNAL(changed()));
|
|
||||||
// Revert to saved/load externally modified files
|
|
||||||
connect(&m_file, SIGNAL(reload(QString)), this, SLOT(slotOpen(QString)));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DesignerXmlEditorEditable::createNew(const QString &contents)
|
|
||||||
{
|
|
||||||
if (Designer::Constants::Internal::debug)
|
|
||||||
qDebug() << "DesignerXmlEditorEditable::createNew" << contents.size();
|
|
||||||
|
|
||||||
syncXmlEditor(QString());
|
|
||||||
|
|
||||||
QDesignerFormWindowInterface *form = m_file.formWindow();
|
|
||||||
QTC_ASSERT(form, return false);
|
|
||||||
|
|
||||||
if (contents.isEmpty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
form->setContents(contents);
|
|
||||||
if (form->mainContainer() == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
syncXmlEditor(contents);
|
|
||||||
m_file.setFileName(QString());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DesignerXmlEditorEditable::slotOpen(const QString &fileName)
|
|
||||||
{
|
|
||||||
open(fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DesignerXmlEditorEditable::open(const QString &fileName)
|
|
||||||
{
|
|
||||||
if (Designer::Constants::Internal::debug)
|
|
||||||
qDebug() << "DesignerXmlEditorEditable::open" << fileName;
|
|
||||||
|
|
||||||
QDesignerFormWindowInterface *form = m_file.formWindow();
|
|
||||||
QTC_ASSERT(form, return false);
|
|
||||||
|
|
||||||
if (fileName.isEmpty()) {
|
|
||||||
setDisplayName(tr("untitled"));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QFileInfo fi(fileName);
|
|
||||||
const QString absfileName = fi.absoluteFilePath();
|
|
||||||
|
|
||||||
QFile file(absfileName);
|
|
||||||
if (!file.open(QIODevice::ReadOnly|QIODevice::Text))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
form->setFileName(absfileName);
|
|
||||||
|
|
||||||
const QString contents = QString::fromUtf8(file.readAll());
|
|
||||||
form->setContents(contents);
|
|
||||||
file.close();
|
|
||||||
if (!form->mainContainer())
|
|
||||||
return false;
|
|
||||||
form->setDirty(false);
|
|
||||||
syncXmlEditor(contents);
|
|
||||||
|
|
||||||
setDisplayName(fi.fileName());
|
|
||||||
m_file.setFileName(absfileName);
|
|
||||||
|
|
||||||
if (Internal::ResourceHandler *rh = qFindChild<Designer::Internal::ResourceHandler*>(form))
|
|
||||||
rh->updateResources();
|
|
||||||
|
|
||||||
emit changed();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DesignerXmlEditorEditable::syncXmlEditor()
|
|
||||||
{
|
|
||||||
if (Designer::Constants::Internal::debug)
|
|
||||||
qDebug() << "DesignerXmlEditorEditable::syncXmlEditor" << m_file.fileName();
|
|
||||||
syncXmlEditor(contents());
|
|
||||||
}
|
|
||||||
|
|
||||||
void DesignerXmlEditorEditable::syncXmlEditor(const QString &contents)
|
|
||||||
{
|
|
||||||
m_textEditable.editor()->setPlainText(contents);
|
|
||||||
m_textEditable.editor()->setReadOnly(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
Core::IFile *DesignerXmlEditorEditable::file()
|
|
||||||
{
|
|
||||||
return &m_file;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString DesignerXmlEditorEditable::id() const
|
|
||||||
{
|
|
||||||
return QLatin1String(Designer::Constants::K_DESIGNER_XML_EDITOR_ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString DesignerXmlEditorEditable::displayName() const
|
|
||||||
{
|
|
||||||
return m_textEditable.displayName();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DesignerXmlEditorEditable::setDisplayName(const QString &title)
|
|
||||||
{
|
|
||||||
m_textEditable.setDisplayName(title);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DesignerXmlEditorEditable::duplicateSupported() const
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Core::IEditor *DesignerXmlEditorEditable::duplicate(QWidget *)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray DesignerXmlEditorEditable::saveState() const
|
|
||||||
{
|
|
||||||
return m_textEditable.saveState();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DesignerXmlEditorEditable::restoreState(const QByteArray &state)
|
|
||||||
{
|
|
||||||
return m_textEditable.restoreState(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<int> DesignerXmlEditorEditable::context() const
|
|
||||||
{
|
|
||||||
return m_context;
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget *DesignerXmlEditorEditable::widget()
|
|
||||||
{
|
|
||||||
return m_textEditable.widget();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DesignerXmlEditorEditable::isTemporary() const
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget *DesignerXmlEditorEditable::toolBar()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString DesignerXmlEditorEditable::contents() const
|
|
||||||
{
|
|
||||||
const qdesigner_internal::FormWindowBase *fw = qobject_cast<const qdesigner_internal::FormWindowBase *>(m_file.formWindow());
|
|
||||||
QTC_ASSERT(fw, return QString());
|
|
||||||
return fw->fileContents(); // No warnings about spacers here
|
|
||||||
}
|
|
||||||
|
|
||||||
TextEditor::BaseTextDocument *DesignerXmlEditorEditable::textDocument()
|
|
||||||
{
|
|
||||||
return qobject_cast<TextEditor::BaseTextDocument*>(m_textEditable.file());
|
|
||||||
}
|
|
||||||
|
|
||||||
TextEditor::PlainTextEditorEditable *DesignerXmlEditorEditable::textEditable()
|
|
||||||
{
|
|
||||||
return &m_textEditable;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
DesignerXmlEditor::DesignerXmlEditor(QDesignerFormWindowInterface *form,
|
DesignerXmlEditor::DesignerXmlEditor(QDesignerFormWindowInterface *form,
|
||||||
QWidget *parent) :
|
QWidget *parent) :
|
||||||
TextEditor::PlainTextEditor(parent),
|
TextEditor::PlainTextEditor(parent),
|
||||||
m_editable(new DesignerXmlEditorEditable(this, form))
|
m_designerEditor(new FormWindowEditor(this, form))
|
||||||
{
|
{
|
||||||
setReadOnly(true);
|
setReadOnly(true);
|
||||||
connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)),
|
connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)),
|
||||||
@@ -240,12 +58,12 @@ TextEditor::BaseTextEditorEditable *DesignerXmlEditor::createEditableInterface()
|
|||||||
{
|
{
|
||||||
if (Designer::Constants::Internal::debug)
|
if (Designer::Constants::Internal::debug)
|
||||||
qDebug() << "DesignerXmlEditor::createEditableInterface()";
|
qDebug() << "DesignerXmlEditor::createEditableInterface()";
|
||||||
return m_editable->textEditable();
|
return m_designerEditor->textEditable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DesignerXmlEditor::updateEditorInfoBar(Core::IEditor *editor)
|
void DesignerXmlEditor::updateEditorInfoBar(Core::IEditor *editor)
|
||||||
{
|
{
|
||||||
if (editor == m_editable) {
|
if (editor == m_designerEditor) {
|
||||||
Core::EditorManager::instance()->showEditorInfoBar(Constants::INFO_READ_ONLY,
|
Core::EditorManager::instance()->showEditorInfoBar(Constants::INFO_READ_ONLY,
|
||||||
tr("This file can only be edited in Design Mode."),
|
tr("This file can only be edited in Design Mode."),
|
||||||
"Open Designer", this, SLOT(designerModeClicked()));
|
"Open Designer", this, SLOT(designerModeClicked()));
|
||||||
@@ -259,9 +77,9 @@ void DesignerXmlEditor::designerModeClicked()
|
|||||||
Core::ICore::instance()->modeManager()->activateMode(QLatin1String(Core::Constants::MODE_DESIGN));
|
Core::ICore::instance()->modeManager()->activateMode(QLatin1String(Core::Constants::MODE_DESIGN));
|
||||||
}
|
}
|
||||||
|
|
||||||
DesignerXmlEditorEditable *DesignerXmlEditor::designerEditable() const
|
FormWindowEditor *DesignerXmlEditor::designerEditor() const
|
||||||
{
|
{
|
||||||
return m_editable;
|
return m_designerEditor;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -30,88 +30,24 @@
|
|||||||
#ifndef DESIGNERXMLEDITOR_H
|
#ifndef DESIGNERXMLEDITOR_H
|
||||||
#define DESIGNERXMLEDITOR_H
|
#define DESIGNERXMLEDITOR_H
|
||||||
|
|
||||||
#include "designer_export.h"
|
|
||||||
#include "formwindowfile.h"
|
|
||||||
|
|
||||||
#include <texteditor/plaintexteditor.h>
|
#include <texteditor/plaintexteditor.h>
|
||||||
|
|
||||||
namespace Core {
|
QT_BEGIN_NAMESPACE
|
||||||
class IMode;
|
class QDesignerFormWindowInterface;
|
||||||
}
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
namespace TextEditor {
|
|
||||||
class BaseTextDocument;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Designer {
|
namespace Designer {
|
||||||
|
class FormWindowEditor;
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
class DesignerXmlEditor;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The actual Core::IEditor belonging to Qt Designer. It internally embeds
|
|
||||||
// a TextEditor::PlainTextEditorEditable which is used to make the
|
|
||||||
// Read-only edit mode XML text editor work and delegates some functionality
|
|
||||||
// to it. However, the isDirty() handling is delegated to the FormWindowFile,
|
|
||||||
// which is the Core::IFile used for it.
|
|
||||||
class DESIGNER_EXPORT DesignerXmlEditorEditable : public Core::IEditor
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit DesignerXmlEditorEditable(Internal::DesignerXmlEditor *editor,
|
|
||||||
QDesignerFormWindowInterface *form,
|
|
||||||
QObject *parent = 0);
|
|
||||||
|
|
||||||
// IEditor
|
|
||||||
virtual bool createNew(const QString &contents = QString());
|
|
||||||
virtual bool open(const QString &fileName = QString());
|
|
||||||
virtual Core::IFile *file();
|
|
||||||
virtual QString id() const;
|
|
||||||
virtual QString displayName() const;
|
|
||||||
virtual void setDisplayName(const QString &title);
|
|
||||||
|
|
||||||
virtual bool duplicateSupported() const;
|
|
||||||
virtual IEditor *duplicate(QWidget *parent);
|
|
||||||
|
|
||||||
virtual QByteArray saveState() const;
|
|
||||||
virtual bool restoreState(const QByteArray &state);
|
|
||||||
|
|
||||||
virtual bool isTemporary() const;
|
|
||||||
|
|
||||||
virtual QWidget *toolBar();
|
|
||||||
|
|
||||||
// IContext
|
|
||||||
virtual QList<int> context() const;
|
|
||||||
virtual QWidget *widget();
|
|
||||||
|
|
||||||
// For uic code model support
|
|
||||||
QString contents() const;
|
|
||||||
|
|
||||||
TextEditor::BaseTextDocument *textDocument();
|
|
||||||
TextEditor::PlainTextEditorEditable *textEditable();
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void syncXmlEditor();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void slotOpen(const QString &fileName);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void syncXmlEditor(const QString &contents);
|
|
||||||
|
|
||||||
TextEditor::PlainTextEditorEditable m_textEditable;
|
|
||||||
Internal::FormWindowFile m_file;
|
|
||||||
QList<int> m_context;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A stub-like, read-only text editor which displays UI files as text. Could be used as a
|
/* A stub-like, read-only text editor which displays UI files as text. Could be used as a
|
||||||
* read/write editor too, but due to lack of XML editor, highlighting and other such
|
* read/write editor too, but due to lack of XML editor, highlighting and other such
|
||||||
* functionality, editing is disabled.
|
* functionality, editing is disabled.
|
||||||
* Provides an informational title bar containing a button triggering a
|
* Provides an informational title bar containing a button triggering a
|
||||||
* switch to design mode.
|
* switch to design mode.
|
||||||
* Internally manages DesignerXmlEditorEditable and uses the plain text
|
* Internally manages a FormWindowEditor and uses the plain text
|
||||||
* editable embedded in it. */
|
* editable embedded in it. */
|
||||||
namespace Internal {
|
|
||||||
|
|
||||||
class DesignerXmlEditor : public TextEditor::PlainTextEditor
|
class DesignerXmlEditor : public TextEditor::PlainTextEditor
|
||||||
{
|
{
|
||||||
@@ -120,7 +56,7 @@ public:
|
|||||||
explicit DesignerXmlEditor(QDesignerFormWindowInterface *form,
|
explicit DesignerXmlEditor(QDesignerFormWindowInterface *form,
|
||||||
QWidget *parent = 0);
|
QWidget *parent = 0);
|
||||||
|
|
||||||
DesignerXmlEditorEditable *designerEditable() const;
|
FormWindowEditor *designerEditor() const;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void designerModeClicked();
|
void designerModeClicked();
|
||||||
@@ -130,7 +66,7 @@ protected:
|
|||||||
virtual TextEditor::BaseTextEditorEditable *createEditableInterface();
|
virtual TextEditor::BaseTextEditorEditable *createEditableInterface();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DesignerXmlEditorEditable *m_editable;
|
FormWindowEditor *m_designerEditor;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // Internal
|
} // Internal
|
||||||
|
@@ -30,19 +30,22 @@
|
|||||||
#ifndef EDITORDATA_H
|
#ifndef EDITORDATA_H
|
||||||
#define EDITORDATA_H
|
#define EDITORDATA_H
|
||||||
|
|
||||||
|
namespace SharedTools {
|
||||||
|
class WidgetHost;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Designer {
|
namespace Designer {
|
||||||
class FormWindowEditor;
|
class FormWindowEditor;
|
||||||
class DesignerXmlEditorEditable;
|
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
// Associates XML and its form editor
|
// Associates the XML editor implementing the IEditor and its form widget host
|
||||||
struct EditorData {
|
struct EditorData {
|
||||||
EditorData() : xmlEditor(0), formEditor(0) {}
|
EditorData() : formWindowEditor(0), widgetHost(0) {}
|
||||||
operator bool() const { return xmlEditor != 0; }
|
operator bool() const { return formWindowEditor != 0; }
|
||||||
|
|
||||||
DesignerXmlEditorEditable *xmlEditor;
|
FormWindowEditor *formWindowEditor;
|
||||||
Designer::FormWindowEditor *formEditor;
|
SharedTools::WidgetHost *widgetHost;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
@@ -107,7 +107,7 @@ bool EditorWidget::setVisibleEditor(Core::IEditor *xmlEditor)
|
|||||||
return m_stack->setVisibleEditor(xmlEditor);
|
return m_stack->setVisibleEditor(xmlEditor);
|
||||||
}
|
}
|
||||||
|
|
||||||
Designer::FormWindowEditor *EditorWidget::formWindowEditorForXmlEditor(const Core::IEditor *xmlEditor) const
|
SharedTools::WidgetHost *EditorWidget::formWindowEditorForXmlEditor(const Core::IEditor *xmlEditor) const
|
||||||
{
|
{
|
||||||
return m_stack->formWindowEditorForXmlEditor(xmlEditor);
|
return m_stack->formWindowEditorForXmlEditor(xmlEditor);
|
||||||
}
|
}
|
||||||
@@ -117,7 +117,7 @@ EditorData EditorWidget::activeEditor() const
|
|||||||
return m_stack->activeEditor();
|
return m_stack->activeEditor();
|
||||||
}
|
}
|
||||||
|
|
||||||
Designer::FormWindowEditor *EditorWidget::formWindowEditorForFormWindow(const QDesignerFormWindowInterface *fw) const
|
SharedTools::WidgetHost *EditorWidget::formWindowEditorForFormWindow(const QDesignerFormWindowInterface *fw) const
|
||||||
{
|
{
|
||||||
return m_stack->formWindowEditorForFormWindow(fw);
|
return m_stack->formWindowEditorForFormWindow(fw);
|
||||||
}
|
}
|
||||||
|
@@ -38,12 +38,14 @@ QT_BEGIN_NAMESPACE
|
|||||||
class QDesignerFormWindowInterface;
|
class QDesignerFormWindowInterface;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
namespace SharedTools {
|
||||||
|
class WidgetHost;
|
||||||
|
}
|
||||||
namespace Core {
|
namespace Core {
|
||||||
class IEditor;
|
class IEditor;
|
||||||
}
|
}
|
||||||
namespace Designer {
|
namespace Designer {
|
||||||
class FormWindowEditor;
|
class FormWindowEditor;
|
||||||
class DesignerXmlEditorEditable;
|
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
struct EditorData;
|
struct EditorData;
|
||||||
@@ -64,8 +66,8 @@ public:
|
|||||||
void add(const EditorData &d);
|
void add(const EditorData &d);
|
||||||
bool removeFormWindowEditor(Core::IEditor *xmlEditor);
|
bool removeFormWindowEditor(Core::IEditor *xmlEditor);
|
||||||
bool setVisibleEditor(Core::IEditor *xmlEditor);
|
bool setVisibleEditor(Core::IEditor *xmlEditor);
|
||||||
Designer::FormWindowEditor *formWindowEditorForXmlEditor(const Core::IEditor *xmlEditor) const;
|
SharedTools::WidgetHost *formWindowEditorForXmlEditor(const Core::IEditor *xmlEditor) const;
|
||||||
Designer::FormWindowEditor *formWindowEditorForFormWindow(const QDesignerFormWindowInterface *fw) const;
|
SharedTools::WidgetHost *formWindowEditorForFormWindow(const QDesignerFormWindowInterface *fw) const;
|
||||||
|
|
||||||
EditorData activeEditor() const;
|
EditorData activeEditor() const;
|
||||||
|
|
||||||
|
@@ -74,7 +74,7 @@ Core::IFile *FormEditorFactory::open(const QString &fileName)
|
|||||||
Core::IEditor *FormEditorFactory::createEditor(QWidget *parent)
|
Core::IEditor *FormEditorFactory::createEditor(QWidget *parent)
|
||||||
{
|
{
|
||||||
const EditorData data = FormEditorW::instance()->createEditor(parent);
|
const EditorData data = FormEditorW::instance()->createEditor(parent);
|
||||||
return data.xmlEditor;
|
return data.formWindowEditor;
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList FormEditorFactory::mimeTypes() const
|
QStringList FormEditorFactory::mimeTypes() const
|
||||||
|
@@ -28,11 +28,12 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "formeditorstack.h"
|
#include "formeditorstack.h"
|
||||||
#include "designerxmleditor.h"
|
|
||||||
#include "formwindoweditor.h"
|
#include "formwindoweditor.h"
|
||||||
#include "formeditorw.h"
|
#include "formeditorw.h"
|
||||||
#include "designerconstants.h"
|
#include "designerconstants.h"
|
||||||
|
|
||||||
|
#include <widgethost.h>
|
||||||
|
|
||||||
#include <coreplugin/coreconstants.h>
|
#include <coreplugin/coreconstants.h>
|
||||||
#include <coreplugin/modemanager.h>
|
#include <coreplugin/modemanager.h>
|
||||||
#include <coreplugin/imode.h>
|
#include <coreplugin/imode.h>
|
||||||
@@ -42,8 +43,11 @@
|
|||||||
#include <QDesignerFormWindowInterface>
|
#include <QDesignerFormWindowInterface>
|
||||||
#include <QDesignerFormWindowManagerInterface>
|
#include <QDesignerFormWindowManagerInterface>
|
||||||
#include <QDesignerFormEditorInterface>
|
#include <QDesignerFormEditorInterface>
|
||||||
|
#include <QDesignerPropertyEditorInterface>
|
||||||
|
|
||||||
#include <QtCore/QDebug>
|
#include <QtCore/QDebug>
|
||||||
|
#include <QtCore/QVariant>
|
||||||
|
#include <QtCore/QRect>
|
||||||
|
|
||||||
namespace Designer {
|
namespace Designer {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
@@ -58,7 +62,7 @@ FormEditorStack::FormEditorStack(QWidget *parent) :
|
|||||||
void FormEditorStack::add(const EditorData &data)
|
void FormEditorStack::add(const EditorData &data)
|
||||||
{
|
{
|
||||||
if (m_designerCore == 0) { // Initialize first time here
|
if (m_designerCore == 0) { // Initialize first time here
|
||||||
m_designerCore = data.formEditor->formWindow()->core();
|
m_designerCore = data.widgetHost->formWindow()->core();
|
||||||
connect(m_designerCore->formWindowManager(), SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)),
|
connect(m_designerCore->formWindowManager(), SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)),
|
||||||
this, SLOT(updateFormWindowSelectionHandles()));
|
this, SLOT(updateFormWindowSelectionHandles()));
|
||||||
connect(Core::ModeManager::instance(), SIGNAL(currentModeAboutToChange(Core::IMode*)),
|
connect(Core::ModeManager::instance(), SIGNAL(currentModeAboutToChange(Core::IMode*)),
|
||||||
@@ -66,20 +70,23 @@ void FormEditorStack::add(const EditorData &data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Designer::Constants::Internal::debug)
|
if (Designer::Constants::Internal::debug)
|
||||||
qDebug() << "FormEditorStack::add" << data.xmlEditor << data.formEditor;
|
qDebug() << "FormEditorStack::add" << data.formWindowEditor << data.widgetHost;
|
||||||
|
|
||||||
m_formEditors.append(data);
|
m_formEditors.append(data);
|
||||||
addWidget(data.formEditor);
|
addWidget(data.widgetHost);
|
||||||
|
|
||||||
|
connect(data.widgetHost, SIGNAL(formWindowSizeChanged(int,int)),
|
||||||
|
this, SLOT(formSizeChanged(int,int)));
|
||||||
|
|
||||||
if (Designer::Constants::Internal::debug)
|
if (Designer::Constants::Internal::debug)
|
||||||
qDebug() << "FormEditorStack::add" << data.formEditor;
|
qDebug() << "FormEditorStack::add" << data.widgetHost;
|
||||||
}
|
}
|
||||||
|
|
||||||
int FormEditorStack::indexOf(const QDesignerFormWindowInterface *fw) const
|
int FormEditorStack::indexOf(const QDesignerFormWindowInterface *fw) const
|
||||||
{
|
{
|
||||||
const int count = m_formEditors.size();
|
const int count = m_formEditors.size();
|
||||||
for(int i = 0; i < count; ++i)
|
for(int i = 0; i < count; ++i)
|
||||||
if (m_formEditors[i].formEditor->formWindow() == fw)
|
if (m_formEditors[i].widgetHost->formWindow() == fw)
|
||||||
return i;
|
return i;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -88,7 +95,7 @@ int FormEditorStack::indexOf(const Core::IEditor *xmlEditor) const
|
|||||||
{
|
{
|
||||||
const int count = m_formEditors.size();
|
const int count = m_formEditors.size();
|
||||||
for(int i = 0; i < count; ++i)
|
for(int i = 0; i < count; ++i)
|
||||||
if (m_formEditors[i].xmlEditor == xmlEditor)
|
if (m_formEditors[i].formWindowEditor == xmlEditor)
|
||||||
return i;
|
return i;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -104,10 +111,10 @@ EditorData FormEditorStack::activeEditor() const
|
|||||||
return EditorData();
|
return EditorData();
|
||||||
}
|
}
|
||||||
|
|
||||||
Designer::FormWindowEditor *FormEditorStack::formWindowEditorForFormWindow(const QDesignerFormWindowInterface *fw) const
|
SharedTools::WidgetHost *FormEditorStack::formWindowEditorForFormWindow(const QDesignerFormWindowInterface *fw) const
|
||||||
{
|
{
|
||||||
const int i = indexOf(fw);
|
const int i = indexOf(fw);
|
||||||
return i != -1 ? m_formEditors[i].formEditor : static_cast<Designer::FormWindowEditor *>(0);
|
return i != -1 ? m_formEditors[i].widgetHost : static_cast<SharedTools::WidgetHost *>(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FormEditorStack::removeFormWindowEditor(Core::IEditor *xmlEditor)
|
bool FormEditorStack::removeFormWindowEditor(Core::IEditor *xmlEditor)
|
||||||
@@ -117,8 +124,8 @@ bool FormEditorStack::removeFormWindowEditor(Core::IEditor *xmlEditor)
|
|||||||
const int i = indexOf(xmlEditor);
|
const int i = indexOf(xmlEditor);
|
||||||
if (i == -1) // Fail silently as this is invoked for all editors.
|
if (i == -1) // Fail silently as this is invoked for all editors.
|
||||||
return false;
|
return false;
|
||||||
removeWidget(m_formEditors[i].formEditor->widget());
|
removeWidget(m_formEditors[i].widgetHost->widget());
|
||||||
delete m_formEditors[i].formEditor;
|
delete m_formEditors[i].widgetHost;
|
||||||
m_formEditors.removeAt(i);
|
m_formEditors.removeAt(i);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -142,15 +149,27 @@ void FormEditorStack::updateFormWindowSelectionHandles()
|
|||||||
qDebug() << "updateFormWindowSelectionHandles";
|
qDebug() << "updateFormWindowSelectionHandles";
|
||||||
QDesignerFormWindowInterface *activeFormWindow = m_designerCore->formWindowManager()->activeFormWindow();
|
QDesignerFormWindowInterface *activeFormWindow = m_designerCore->formWindowManager()->activeFormWindow();
|
||||||
foreach(const EditorData &fdm, m_formEditors) {
|
foreach(const EditorData &fdm, m_formEditors) {
|
||||||
const bool active = activeFormWindow == fdm.formEditor->formWindow();
|
const bool active = activeFormWindow == fdm.widgetHost->formWindow();
|
||||||
fdm.formEditor->updateFormWindowSelectionHandles(active);
|
fdm.widgetHost->updateFormWindowSelectionHandles(active);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Designer::FormWindowEditor *FormEditorStack::formWindowEditorForXmlEditor(const Core::IEditor *xmlEditor) const
|
void FormEditorStack::formSizeChanged(int w, int h)
|
||||||
|
{
|
||||||
|
// Handle main container resize.
|
||||||
|
if (Designer::Constants::Internal::debug)
|
||||||
|
qDebug() << Q_FUNC_INFO << w << h;
|
||||||
|
if (const SharedTools::WidgetHost *wh = qobject_cast<const SharedTools::WidgetHost *>(sender())) {
|
||||||
|
wh->formWindow()->setDirty(true);
|
||||||
|
static const QString geometry = QLatin1String("geometry");
|
||||||
|
m_designerCore->propertyEditor()->setPropertyValue(geometry, QRect(0,0,w,h) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedTools::WidgetHost *FormEditorStack::formWindowEditorForXmlEditor(const Core::IEditor *xmlEditor) const
|
||||||
{
|
{
|
||||||
const int i = indexOf(xmlEditor);
|
const int i = indexOf(xmlEditor);
|
||||||
return i != -1 ? m_formEditors.at(i).formEditor : static_cast<Designer::FormWindowEditor *>(0);
|
return i != -1 ? m_formEditors.at(i).widgetHost : static_cast<SharedTools::WidgetHost *>(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormEditorStack::modeAboutToChange(Core::IMode *m)
|
void FormEditorStack::modeAboutToChange(Core::IMode *m)
|
||||||
@@ -161,7 +180,7 @@ void FormEditorStack::modeAboutToChange(Core::IMode *m)
|
|||||||
// Sync the editor when leaving design mode
|
// Sync the editor when leaving design mode
|
||||||
if (m && m->id() == QLatin1String(Core::Constants::MODE_DESIGN))
|
if (m && m->id() == QLatin1String(Core::Constants::MODE_DESIGN))
|
||||||
foreach(const EditorData &data, m_formEditors)
|
foreach(const EditorData &data, m_formEditors)
|
||||||
data.xmlEditor->syncXmlEditor();
|
data.formWindowEditor->syncXmlEditor();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // Internal
|
} // Internal
|
||||||
|
@@ -47,9 +47,6 @@ namespace Core {
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace Designer {
|
namespace Designer {
|
||||||
class FormWindowEditor;
|
|
||||||
class DesignerXmlEditorEditable;
|
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
/* FormEditorStack: Maintains a stack of Qt Designer form windows embedded
|
/* FormEditorStack: Maintains a stack of Qt Designer form windows embedded
|
||||||
@@ -68,14 +65,15 @@ public:
|
|||||||
bool removeFormWindowEditor(Core::IEditor *xmlEditor);
|
bool removeFormWindowEditor(Core::IEditor *xmlEditor);
|
||||||
|
|
||||||
bool setVisibleEditor(Core::IEditor *xmlEditor);
|
bool setVisibleEditor(Core::IEditor *xmlEditor);
|
||||||
Designer::FormWindowEditor *formWindowEditorForXmlEditor(const Core::IEditor *xmlEditor) const;
|
SharedTools::WidgetHost *formWindowEditorForXmlEditor(const Core::IEditor *xmlEditor) const;
|
||||||
Designer::FormWindowEditor *formWindowEditorForFormWindow(const QDesignerFormWindowInterface *fw) const;
|
SharedTools::WidgetHost *formWindowEditorForFormWindow(const QDesignerFormWindowInterface *fw) const;
|
||||||
|
|
||||||
EditorData activeEditor() const;
|
EditorData activeEditor() const;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void updateFormWindowSelectionHandles();
|
void updateFormWindowSelectionHandles();
|
||||||
void modeAboutToChange(Core::IMode *);
|
void modeAboutToChange(Core::IMode *);
|
||||||
|
void formSizeChanged(int w, int h);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline int indexOf(const QDesignerFormWindowInterface *) const;
|
inline int indexOf(const QDesignerFormWindowInterface *) const;
|
||||||
|
@@ -40,6 +40,7 @@
|
|||||||
#include "designercontext.h"
|
#include "designercontext.h"
|
||||||
#include "editorwidget.h"
|
#include "editorwidget.h"
|
||||||
#include "resourcehandler.h"
|
#include "resourcehandler.h"
|
||||||
|
#include <widgethost.h>
|
||||||
|
|
||||||
#include <coreplugin/modemanager.h>
|
#include <coreplugin/modemanager.h>
|
||||||
#include <coreplugin/designmode.h>
|
#include <coreplugin/designmode.h>
|
||||||
@@ -666,13 +667,13 @@ EditorData FormEditorW::createEditor(QWidget *parent)
|
|||||||
ResourceHandler *resourceHandler = new ResourceHandler(form);
|
ResourceHandler *resourceHandler = new ResourceHandler(form);
|
||||||
form->setDesignerGrid(qdesigner_internal::FormWindowBase::defaultDesignerGrid());
|
form->setDesignerGrid(qdesigner_internal::FormWindowBase::defaultDesignerGrid());
|
||||||
qdesigner_internal::FormWindowBase::setupDefaultAction(form);
|
qdesigner_internal::FormWindowBase::setupDefaultAction(form);
|
||||||
data.formEditor = new FormWindowEditor(form);
|
data.widgetHost = new SharedTools::WidgetHost( /* parent */ 0, form);
|
||||||
DesignerXmlEditor *xmlEditor = new DesignerXmlEditor(form, parent);
|
DesignerXmlEditor *xmlEditor = new DesignerXmlEditor(form, parent);
|
||||||
TextEditor::TextEditorSettings::instance()->initializeEditor(xmlEditor);
|
TextEditor::TextEditorSettings::instance()->initializeEditor(xmlEditor);
|
||||||
data.xmlEditor = xmlEditor->designerEditable();
|
data.formWindowEditor = xmlEditor->designerEditor();
|
||||||
connect(data.formEditor, SIGNAL(formWindowSizeChanged(int,int)),
|
connect(data.widgetHost, SIGNAL(formWindowSizeChanged(int,int)),
|
||||||
xmlEditor, SIGNAL(changed()));
|
xmlEditor, SIGNAL(changed()));
|
||||||
connect(data.xmlEditor->file(), SIGNAL(changed()),
|
connect(data.formWindowEditor->file(), SIGNAL(changed()),
|
||||||
resourceHandler, SLOT(updateResources()));
|
resourceHandler, SLOT(updateResources()));
|
||||||
m_editorWidget->add(data);
|
m_editorWidget->add(data);
|
||||||
return data;
|
return data;
|
||||||
@@ -695,10 +696,10 @@ void FormEditorW::currentEditorChanged(Core::IEditor *editor)
|
|||||||
qDebug() << Q_FUNC_INFO << editor << " of " << m_fwm->formWindowCount();
|
qDebug() << Q_FUNC_INFO << editor << " of " << m_fwm->formWindowCount();
|
||||||
|
|
||||||
if (editor && editor->id() == QLatin1String(Constants::K_DESIGNER_XML_EDITOR_ID)) {
|
if (editor && editor->id() == QLatin1String(Constants::K_DESIGNER_XML_EDITOR_ID)) {
|
||||||
DesignerXmlEditorEditable *xmlEditor = qobject_cast<DesignerXmlEditorEditable *>(editor);
|
FormWindowEditor *xmlEditor = qobject_cast<FormWindowEditor *>(editor);
|
||||||
QTC_ASSERT(xmlEditor, return);
|
QTC_ASSERT(xmlEditor, return);
|
||||||
ensureInitStage(FullyInitialized);
|
ensureInitStage(FullyInitialized);
|
||||||
FormWindowEditor *fw = m_editorWidget->formWindowEditorForXmlEditor(xmlEditor);
|
SharedTools::WidgetHost *fw = m_editorWidget->formWindowEditorForXmlEditor(xmlEditor);
|
||||||
QTC_ASSERT(fw, return)
|
QTC_ASSERT(fw, return)
|
||||||
m_editorWidget->setVisibleEditor(xmlEditor);
|
m_editorWidget->setVisibleEditor(xmlEditor);
|
||||||
m_fwm->setActiveFormWindow(fw->formWindow());
|
m_fwm->setActiveFormWindow(fw->formWindow());
|
||||||
|
@@ -64,8 +64,6 @@ class DesignMode;
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace Designer {
|
namespace Designer {
|
||||||
class FormWindowEditor;
|
|
||||||
|
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
struct EditorData;
|
struct EditorData;
|
||||||
|
@@ -28,37 +28,226 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "formwindoweditor.h"
|
#include "formwindoweditor.h"
|
||||||
|
#include "formwindowfile.h"
|
||||||
#include "designerconstants.h"
|
#include "designerconstants.h"
|
||||||
#include "formeditorw.h"
|
#include "resourcehandler.h"
|
||||||
|
#include "qt_private/formwindowbase_p.h"
|
||||||
|
#include "designerxmleditor.h"
|
||||||
|
#include <widgethost.h>
|
||||||
|
|
||||||
|
#include <coreplugin/editormanager/editormanager.h>
|
||||||
|
#include <coreplugin/icore.h>
|
||||||
|
#include <coreplugin/modemanager.h>
|
||||||
|
#include <coreplugin/imode.h>
|
||||||
|
#include <coreplugin/coreconstants.h>
|
||||||
|
#include <coreplugin/uniqueidmanager.h>
|
||||||
|
#include <texteditor/basetextdocument.h>
|
||||||
|
#include <texteditor/plaintexteditor.h>
|
||||||
|
|
||||||
#include <coreplugin/ifile.h>
|
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
#include <QtDesigner/QDesignerFormWindowInterface>
|
#include <QtDesigner/QDesignerFormWindowInterface>
|
||||||
#include <QtDesigner/QDesignerFormEditorInterface>
|
|
||||||
#include <QtDesigner/QDesignerFormWindowManagerInterface>
|
|
||||||
#include <QtDesigner/QDesignerPropertyEditorInterface>
|
|
||||||
#include "qt_private/formwindowbase_p.h"
|
|
||||||
|
|
||||||
#include <QtCore/QDebug>
|
#include <QtCore/QDebug>
|
||||||
|
#include <QtCore/QFileInfo>
|
||||||
|
#include <QtCore/QFile>
|
||||||
|
|
||||||
using namespace Designer;
|
namespace Designer {
|
||||||
using namespace Designer::Internal;
|
|
||||||
using namespace Designer::Constants;
|
|
||||||
|
|
||||||
FormWindowEditor::FormWindowEditor(QDesignerFormWindowInterface *form,
|
struct FormWindowEditorPrivate {
|
||||||
QWidget *parent) :
|
explicit FormWindowEditorPrivate(Internal::DesignerXmlEditor *editor,
|
||||||
SharedTools::WidgetHost(parent, form)
|
QDesignerFormWindowInterface *form);
|
||||||
|
|
||||||
|
TextEditor::PlainTextEditorEditable m_textEditable;
|
||||||
|
Internal::FormWindowFile m_file;
|
||||||
|
QList<int> m_context;
|
||||||
|
};
|
||||||
|
|
||||||
|
FormWindowEditorPrivate::FormWindowEditorPrivate(Internal::DesignerXmlEditor *editor,
|
||||||
|
QDesignerFormWindowInterface *form) :
|
||||||
|
m_textEditable(editor), m_file(form)
|
||||||
{
|
{
|
||||||
connect(this, SIGNAL(formWindowSizeChanged(int,int)), this, SLOT(slotFormSizeChanged(int,int)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormWindowEditor::slotFormSizeChanged(int w, int h)
|
FormWindowEditor::FormWindowEditor(Internal::DesignerXmlEditor *editor,
|
||||||
|
QDesignerFormWindowInterface *form,
|
||||||
|
QObject *parent) :
|
||||||
|
Core::IEditor(parent),
|
||||||
|
d(new FormWindowEditorPrivate(editor, form))
|
||||||
|
{
|
||||||
|
Core::UniqueIDManager *uidm = Core::UniqueIDManager::instance();
|
||||||
|
d->m_context << uidm->uniqueIdentifier(QLatin1String(Designer::Constants::K_DESIGNER_XML_EDITOR_ID))
|
||||||
|
<< uidm->uniqueIdentifier(QLatin1String(Designer::Constants::C_DESIGNER_XML_EDITOR));
|
||||||
|
connect(form, SIGNAL(changed()), this, SIGNAL(changed()));
|
||||||
|
// Revert to saved/load externally modified files
|
||||||
|
connect(&(d->m_file), SIGNAL(reload(QString)), this, SLOT(slotOpen(QString)));
|
||||||
|
}
|
||||||
|
|
||||||
|
FormWindowEditor::~FormWindowEditor()
|
||||||
|
{
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FormWindowEditor::createNew(const QString &contents)
|
||||||
{
|
{
|
||||||
if (Designer::Constants::Internal::debug)
|
if (Designer::Constants::Internal::debug)
|
||||||
qDebug() << Q_FUNC_INFO << w << h;
|
qDebug() << "FormWindowEditor::createNew" << contents.size();
|
||||||
|
|
||||||
formWindow()->setDirty(true);
|
syncXmlEditor(QString());
|
||||||
static const QString geometry = QLatin1String("geometry");
|
|
||||||
FormEditorW::instance()->designerEditor()->propertyEditor()->setPropertyValue(geometry, QRect(0,0,w,h) );
|
QDesignerFormWindowInterface *form = d->m_file.formWindow();
|
||||||
|
QTC_ASSERT(form, return false);
|
||||||
|
|
||||||
|
if (contents.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
form->setContents(contents);
|
||||||
|
if (form->mainContainer() == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
syncXmlEditor(contents);
|
||||||
|
d->m_file.setFileName(QString());
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FormWindowEditor::slotOpen(const QString &fileName)
|
||||||
|
{
|
||||||
|
open(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FormWindowEditor::open(const QString &fileName)
|
||||||
|
{
|
||||||
|
if (Designer::Constants::Internal::debug)
|
||||||
|
qDebug() << "FormWindowEditor::open" << fileName;
|
||||||
|
|
||||||
|
QDesignerFormWindowInterface *form = d->m_file.formWindow();
|
||||||
|
QTC_ASSERT(form, return false);
|
||||||
|
|
||||||
|
if (fileName.isEmpty()) {
|
||||||
|
setDisplayName(tr("untitled"));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QFileInfo fi(fileName);
|
||||||
|
const QString absfileName = fi.absoluteFilePath();
|
||||||
|
|
||||||
|
QFile file(absfileName);
|
||||||
|
if (!file.open(QIODevice::ReadOnly|QIODevice::Text))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
form->setFileName(absfileName);
|
||||||
|
|
||||||
|
const QString contents = QString::fromUtf8(file.readAll());
|
||||||
|
form->setContents(contents);
|
||||||
|
file.close();
|
||||||
|
if (!form->mainContainer())
|
||||||
|
return false;
|
||||||
|
form->setDirty(false);
|
||||||
|
syncXmlEditor(contents);
|
||||||
|
|
||||||
|
setDisplayName(fi.fileName());
|
||||||
|
d->m_file.setFileName(absfileName);
|
||||||
|
|
||||||
|
if (Internal::ResourceHandler *rh = qFindChild<Designer::Internal::ResourceHandler*>(form))
|
||||||
|
rh->updateResources();
|
||||||
|
|
||||||
|
emit changed();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FormWindowEditor::syncXmlEditor()
|
||||||
|
{
|
||||||
|
if (Designer::Constants::Internal::debug)
|
||||||
|
qDebug() << "FormWindowEditor::syncXmlEditor" << d->m_file.fileName();
|
||||||
|
syncXmlEditor(contents());
|
||||||
|
}
|
||||||
|
|
||||||
|
void FormWindowEditor::syncXmlEditor(const QString &contents)
|
||||||
|
{
|
||||||
|
d->m_textEditable.editor()->setPlainText(contents);
|
||||||
|
d->m_textEditable.editor()->setReadOnly(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::IFile *FormWindowEditor::file()
|
||||||
|
{
|
||||||
|
return &d->m_file;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FormWindowEditor::id() const
|
||||||
|
{
|
||||||
|
return QLatin1String(Designer::Constants::K_DESIGNER_XML_EDITOR_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FormWindowEditor::displayName() const
|
||||||
|
{
|
||||||
|
return d->m_textEditable.displayName();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FormWindowEditor::setDisplayName(const QString &title)
|
||||||
|
{
|
||||||
|
d->m_textEditable.setDisplayName(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FormWindowEditor::duplicateSupported() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::IEditor *FormWindowEditor::duplicate(QWidget *)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray FormWindowEditor::saveState() const
|
||||||
|
{
|
||||||
|
return d->m_textEditable.saveState();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FormWindowEditor::restoreState(const QByteArray &state)
|
||||||
|
{
|
||||||
|
return d->m_textEditable.restoreState(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<int> FormWindowEditor::context() const
|
||||||
|
{
|
||||||
|
return d->m_context;
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget *FormWindowEditor::widget()
|
||||||
|
{
|
||||||
|
return d->m_textEditable.widget();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FormWindowEditor::isTemporary() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget *FormWindowEditor::toolBar()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FormWindowEditor::contents() const
|
||||||
|
{
|
||||||
|
const qdesigner_internal::FormWindowBase *fw = qobject_cast<const qdesigner_internal::FormWindowBase *>(d->m_file.formWindow());
|
||||||
|
QTC_ASSERT(fw, return QString());
|
||||||
|
return fw->fileContents(); // No warnings about spacers here
|
||||||
|
}
|
||||||
|
|
||||||
|
TextEditor::BaseTextDocument *FormWindowEditor::textDocument()
|
||||||
|
{
|
||||||
|
return qobject_cast<TextEditor::BaseTextDocument*>(d->m_textEditable.file());
|
||||||
|
}
|
||||||
|
|
||||||
|
TextEditor::PlainTextEditorEditable *FormWindowEditor::textEditable()
|
||||||
|
{
|
||||||
|
return &d->m_textEditable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Designer
|
||||||
|
|
||||||
|
@@ -30,29 +30,84 @@
|
|||||||
#ifndef FORMWINDOWEDITOR_H
|
#ifndef FORMWINDOWEDITOR_H
|
||||||
#define FORMWINDOWEDITOR_H
|
#define FORMWINDOWEDITOR_H
|
||||||
|
|
||||||
#include "widgethost.h"
|
#include "designer_export.h"
|
||||||
|
#include <coreplugin/editormanager/ieditor.h>
|
||||||
|
|
||||||
#include <QtCore/QStringList>
|
QT_BEGIN_NAMESPACE
|
||||||
#include <QtCore/QPointer>
|
class QDesignerFormWindowInterface;
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
class IFile;
|
class IMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace TextEditor {
|
||||||
|
class BaseTextDocument;
|
||||||
|
class PlainTextEditorEditable;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Designer {
|
namespace Designer {
|
||||||
|
|
||||||
// Master class maintaining a form window editor,
|
namespace Internal {
|
||||||
// containing file and widget host
|
class DesignerXmlEditor;
|
||||||
|
}
|
||||||
|
struct FormWindowEditorPrivate;
|
||||||
|
|
||||||
class FormWindowEditor : public SharedTools::WidgetHost
|
// The actual Core::IEditor belonging to Qt Designer. Uses FormWindowFile
|
||||||
|
// as the Core::IFile to do the isModified() handling,
|
||||||
|
// which needs to be done by Qt Designer.
|
||||||
|
// However, to make the read-only XML text editor work,
|
||||||
|
// a TextEditor::PlainTextEditorEditable (IEditor) is also required.
|
||||||
|
// It is aggregated and some functions are delegated to it.
|
||||||
|
|
||||||
|
class DESIGNER_EXPORT FormWindowEditor : public Core::IEditor
|
||||||
{
|
{
|
||||||
|
Q_PROPERTY(QString contents READ contents)
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit FormWindowEditor(QDesignerFormWindowInterface *form,
|
explicit FormWindowEditor(Internal::DesignerXmlEditor *editor,
|
||||||
QWidget *parent = 0);
|
QDesignerFormWindowInterface *form,
|
||||||
|
QObject *parent = 0);
|
||||||
|
virtual ~FormWindowEditor();
|
||||||
|
|
||||||
|
// IEditor
|
||||||
|
virtual bool createNew(const QString &contents = QString());
|
||||||
|
virtual bool open(const QString &fileName = QString());
|
||||||
|
virtual Core::IFile *file();
|
||||||
|
virtual QString id() const;
|
||||||
|
virtual QString displayName() const;
|
||||||
|
virtual void setDisplayName(const QString &title);
|
||||||
|
|
||||||
|
virtual bool duplicateSupported() const;
|
||||||
|
virtual IEditor *duplicate(QWidget *parent);
|
||||||
|
|
||||||
|
virtual QByteArray saveState() const;
|
||||||
|
virtual bool restoreState(const QByteArray &state);
|
||||||
|
|
||||||
|
virtual bool isTemporary() const;
|
||||||
|
|
||||||
|
virtual QWidget *toolBar();
|
||||||
|
|
||||||
|
// IContext
|
||||||
|
virtual QList<int> context() const;
|
||||||
|
virtual QWidget *widget();
|
||||||
|
|
||||||
|
// For uic code model support
|
||||||
|
QString contents() const;
|
||||||
|
|
||||||
|
TextEditor::BaseTextDocument *textDocument();
|
||||||
|
TextEditor::PlainTextEditorEditable *textEditable();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void syncXmlEditor();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slotFormSizeChanged(int w, int h);
|
void slotOpen(const QString &fileName);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void syncXmlEditor(const QString &contents);
|
||||||
|
|
||||||
|
FormWindowEditorPrivate *d;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Designer
|
} // namespace Designer
|
||||||
|
@@ -94,8 +94,6 @@ QString FormWindowFile::fileName() const
|
|||||||
|
|
||||||
bool FormWindowFile::isModified() const
|
bool FormWindowFile::isModified() const
|
||||||
{
|
{
|
||||||
if (Designer::Constants::Internal::debug > 1)
|
|
||||||
qDebug() << Q_FUNC_INFO << m_formWindow->isDirty();
|
|
||||||
return m_formWindow && m_formWindow->isDirty();
|
return m_formWindow && m_formWindow->isDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -42,14 +42,12 @@ QT_END_NAMESPACE
|
|||||||
namespace Designer {
|
namespace Designer {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
class FormWindowSelection;
|
|
||||||
|
|
||||||
class FormWindowFile : public Core::IFile
|
class FormWindowFile : public Core::IFile
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FormWindowFile(QDesignerFormWindowInterface *form, QObject *parent = 0);
|
explicit FormWindowFile(QDesignerFormWindowInterface *form, QObject *parent = 0);
|
||||||
|
|
||||||
// IFile
|
// IFile
|
||||||
bool save(const QString &fileName = QString());
|
bool save(const QString &fileName = QString());
|
||||||
|
@@ -28,12 +28,12 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "formeditorplugin.h"
|
#include "formeditorplugin.h"
|
||||||
#include "designerxmleditor.h"
|
#include "formwindoweditor.h"
|
||||||
#include "qtcreatorintegration.h"
|
#include "qtcreatorintegration.h"
|
||||||
#include "formeditorw.h"
|
#include "formeditorw.h"
|
||||||
#include "formwindoweditor.h"
|
|
||||||
#include "editordata.h"
|
#include "editordata.h"
|
||||||
#include "codemodelhelpers.h"
|
#include "codemodelhelpers.h"
|
||||||
|
#include <widgethost.h>
|
||||||
|
|
||||||
#include <cpptools/cppmodelmanagerinterface.h>
|
#include <cpptools/cppmodelmanagerinterface.h>
|
||||||
#include <cplusplus/Symbols.h>
|
#include <cplusplus/Symbols.h>
|
||||||
@@ -99,14 +99,14 @@ QtCreatorIntegration::QtCreatorIntegration(QDesignerFormEditorInterface *core, F
|
|||||||
void QtCreatorIntegration::updateSelection()
|
void QtCreatorIntegration::updateSelection()
|
||||||
{
|
{
|
||||||
if (const EditorData ed = m_few->activeEditor())
|
if (const EditorData ed = m_few->activeEditor())
|
||||||
ed.formEditor->updateFormWindowSelectionHandles(true);
|
ed.widgetHost->updateFormWindowSelectionHandles(true);
|
||||||
qdesigner_internal::QDesignerIntegration::updateSelection();
|
qdesigner_internal::QDesignerIntegration::updateSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget *QtCreatorIntegration::containerWindow(QWidget * /*widget*/) const
|
QWidget *QtCreatorIntegration::containerWindow(QWidget * /*widget*/) const
|
||||||
{
|
{
|
||||||
if (const EditorData ed = m_few->activeEditor())
|
if (const EditorData ed = m_few->activeEditor())
|
||||||
return ed.formEditor->integrationContainer();
|
return ed.widgetHost->integrationContainer();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -574,7 +574,7 @@ bool QtCreatorIntegration::navigateToSlot(const QString &objectName,
|
|||||||
{
|
{
|
||||||
const EditorData ed = m_few->activeEditor();
|
const EditorData ed = m_few->activeEditor();
|
||||||
QTC_ASSERT(ed, return false)
|
QTC_ASSERT(ed, return false)
|
||||||
const QString currentUiFile = ed.xmlEditor->file()->fileName();
|
const QString currentUiFile = ed.formWindowEditor->file()->fileName();
|
||||||
#if 0
|
#if 0
|
||||||
return Designer::Internal::navigateToSlot(currentUiFile, objectName, signalSignature, parameterNames, errorMessage);
|
return Designer::Internal::navigateToSlot(currentUiFile, objectName, signalSignature, parameterNames, errorMessage);
|
||||||
#endif
|
#endif
|
||||||
@@ -613,7 +613,7 @@ bool QtCreatorIntegration::navigateToSlot(const QString &objectName,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDesignerFormWindowInterface *fwi = ed.formEditor->formWindow();
|
QDesignerFormWindowInterface *fwi = ed.widgetHost->formWindow();
|
||||||
|
|
||||||
const QString uiClass = uiClassName(fwi->mainContainer()->objectName());
|
const QString uiClass = uiClassName(fwi->mainContainer()->objectName());
|
||||||
|
|
||||||
|
@@ -48,7 +48,7 @@
|
|||||||
#include <projectexplorer/project.h>
|
#include <projectexplorer/project.h>
|
||||||
#include <projectexplorer/projectexplorerconstants.h>
|
#include <projectexplorer/projectexplorerconstants.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
#include <designer/designerxmleditor.h>
|
#include <designer/formwindoweditor.h>
|
||||||
|
|
||||||
#include <QtCore/QCoreApplication>
|
#include <QtCore/QCoreApplication>
|
||||||
#include <QtCore/QDir>
|
#include <QtCore/QDir>
|
||||||
@@ -115,7 +115,7 @@ void Qt4Manager::init()
|
|||||||
void Qt4Manager::editorChanged(Core::IEditor *editor)
|
void Qt4Manager::editorChanged(Core::IEditor *editor)
|
||||||
{
|
{
|
||||||
// Handle old editor
|
// Handle old editor
|
||||||
Designer::DesignerXmlEditorEditable *lastFormEditor = qobject_cast<Designer::DesignerXmlEditorEditable *>(m_lastEditor);
|
Designer::FormWindowEditor *lastFormEditor = qobject_cast<Designer::FormWindowEditor *>(m_lastEditor);
|
||||||
if (lastFormEditor) {
|
if (lastFormEditor) {
|
||||||
disconnect(lastFormEditor, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged()));
|
disconnect(lastFormEditor, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged()));
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ void Qt4Manager::editorChanged(Core::IEditor *editor)
|
|||||||
m_lastEditor = editor;
|
m_lastEditor = editor;
|
||||||
|
|
||||||
// Handle new editor
|
// Handle new editor
|
||||||
if (Designer::DesignerXmlEditorEditable *fw = qobject_cast<Designer::DesignerXmlEditorEditable *>(editor))
|
if (Designer::FormWindowEditor *fw = qobject_cast<Designer::FormWindowEditor *>(editor))
|
||||||
connect(fw, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged()));
|
connect(fw, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ void Qt4Manager::editorAboutToClose(Core::IEditor *editor)
|
|||||||
if (m_lastEditor == editor) {
|
if (m_lastEditor == editor) {
|
||||||
// Oh no our editor is going to be closed
|
// Oh no our editor is going to be closed
|
||||||
// get the content first
|
// get the content first
|
||||||
Designer::DesignerXmlEditorEditable *lastEditor = qobject_cast<Designer::DesignerXmlEditorEditable *>(m_lastEditor);
|
Designer::FormWindowEditor *lastEditor = qobject_cast<Designer::FormWindowEditor *>(m_lastEditor);
|
||||||
if (lastEditor) {
|
if (lastEditor) {
|
||||||
disconnect(lastEditor, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged()));
|
disconnect(lastEditor, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged()));
|
||||||
if (m_dirty) {
|
if (m_dirty) {
|
||||||
@@ -158,7 +158,7 @@ void Qt4Manager::uiEditorContentsChanged()
|
|||||||
// cast sender, get filename
|
// cast sender, get filename
|
||||||
if (m_dirty)
|
if (m_dirty)
|
||||||
return;
|
return;
|
||||||
Designer::DesignerXmlEditorEditable *fw = qobject_cast<Designer::DesignerXmlEditorEditable *>(sender());
|
Designer::FormWindowEditor *fw = qobject_cast<Designer::FormWindowEditor *>(sender());
|
||||||
if (!fw)
|
if (!fw)
|
||||||
return;
|
return;
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
|
@@ -48,7 +48,7 @@ class WidgetHost : public QScrollArea
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
WidgetHost(QWidget *parent = 0, QDesignerFormWindowInterface *formWindow = 0);
|
explicit WidgetHost(QWidget *parent = 0, QDesignerFormWindowInterface *formWindow = 0);
|
||||||
virtual ~WidgetHost();
|
virtual ~WidgetHost();
|
||||||
// Show handles if active and main container is selected.
|
// Show handles if active and main container is selected.
|
||||||
void updateFormWindowSelectionHandles(bool active);
|
void updateFormWindowSelectionHandles(bool active);
|
||||||
|
Reference in New Issue
Block a user