1 #include "lrdialogdesigner.h"
2 
3 #include <QPluginLoader>
4 
5 #include <QDesignerComponents>
6 #include <QDesignerFormEditorInterface>
7 #include <QDesignerFormWindowInterface>
8 #include <QDesignerFormWindowManagerInterface>
9 #include <QDesignerFormEditorPluginInterface>
10 
11 #include <QDesignerWidgetBoxInterface>
12 #include <QDesignerActionEditorInterface>
13 #include <QDesignerPropertyEditorInterface>
14 #include <QDesignerObjectInspectorInterface>
15 #include <QDesignerFormEditorInterface>
16 #include <QAction>
17 #include <QDebug>
18 #include <QVBoxLayout>
19 
20 #if HAVE_QT5
21 #include <QDesignerIntegration>
22 #endif
23 #if HAVE_QT4
24 #include "qdesigner_integration_p.h"
25 #include <QtDesigner/QDesignerIntegrationInterface>
26 #endif
27 #include "pluginmanager_p.h"
28 #include "widgethost.h"
29 #include <abstractobjectinspector.h>
30 
31 namespace LimeReport{
32 
DialogDesignerManager(QObject * parent)33 DialogDesignerManager::DialogDesignerManager(QObject *parent) : QObject(parent)
34 {
35     QDesignerComponents::initializeResources();
36     m_formEditor = QDesignerComponents::createFormEditor(this);
37     QDesignerComponents::initializePlugins(m_formEditor);
38     QDesignerComponents::createTaskMenu(m_formEditor, this);
39 
40     m_editWidgetsAction = new QAction(tr("Edit Widgets"), this);
41     m_editWidgetsAction->setIcon(QIcon(":/images/images/widgettool.png"));
42     m_editWidgetsAction->setEnabled(false);
43     connect(m_editWidgetsAction, SIGNAL(triggered()), this, SLOT(slotEditWidgets()));
44     connect(m_formEditor->formWindowManager(), SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)),
45             this, SLOT(slotActiveFormWindowChanged(QDesignerFormWindowInterface*)) );
46 
47     m_modes = new QActionGroup(this);
48     m_modes->setExclusive(true);
49     m_modes->addAction(m_editWidgetsAction);
50 
51     foreach ( QObject* o, QPluginLoader::staticInstances() << m_formEditor->pluginManager()->instances() )
52     {
53         if (  QDesignerFormEditorPluginInterface* fep = qobject_cast<QDesignerFormEditorPluginInterface*>( o ) )
54         {
55             if ( !fep->isInitialized() )
56                 fep->initialize( m_formEditor );
57             fep->action()->setCheckable( true );
58             fep->action()->setIcon(QIcon(iconPathByName(fep->action()->objectName())));
59             m_modes->addAction(fep->action());
60         }
61     }
62 
63     m_widgetBox = QDesignerComponents::createWidgetBox(m_formEditor, 0);
64     m_widgetBox->setWindowTitle(tr("Widget Box"));
65     m_widgetBox->setObjectName(QLatin1String("WidgetBox"));
66     m_formEditor->setWidgetBox(m_widgetBox);
67     m_formEditor->setTopLevel(m_widgetBox);
68     m_designerToolWindows.append(m_widgetBox);
69     connect(m_widgetBox, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) );
70 
71     m_objectInspector = QDesignerComponents::createObjectInspector(m_formEditor, 0);
72     m_objectInspector->setWindowTitle(tr("Object Inspector"));
73     m_objectInspector->setObjectName(QLatin1String("ObjectInspector"));
74     m_formEditor->setObjectInspector(m_objectInspector);
75     m_designerToolWindows.append(m_objectInspector);
76     connect(m_objectInspector, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) );
77 
78     m_propertyEditor = QDesignerComponents::createPropertyEditor(m_formEditor, 0);
79     m_propertyEditor->setWindowTitle(tr("Property Editor"));
80     m_propertyEditor->setObjectName(QLatin1String("PropertyEditor"));
81     m_formEditor->setPropertyEditor(m_propertyEditor);
82     m_designerToolWindows.append(m_propertyEditor);
83     connect(m_propertyEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) );
84 
85     m_signalSlotEditor = QDesignerComponents::createSignalSlotEditor(m_formEditor, 0);
86     m_signalSlotEditor->setWindowTitle(tr("Signals && Slots Editor"));
87     m_signalSlotEditor->setObjectName(QLatin1String("SignalsAndSlotsEditor"));
88 
89     m_designerToolWindows.append(m_signalSlotEditor);
90     connect(m_signalSlotEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) );
91 
92     m_resourcesEditor = QDesignerComponents::createResourceEditor(m_formEditor, 0);
93     m_resourcesEditor->setWindowTitle(tr("Resource Editor"));
94     m_resourcesEditor->setObjectName(QLatin1String("ResourceEditor"));
95     m_designerToolWindows.append(m_resourcesEditor);
96     connect(m_resourcesEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) );
97 
98     m_actionEditor = QDesignerComponents::createActionEditor(m_formEditor, 0);
99     m_actionEditor->setWindowTitle(tr("Action Editor"));
100     m_actionEditor->setObjectName("ActionEditor");
101     m_formEditor->setActionEditor(m_actionEditor);
102     m_designerToolWindows.append(m_actionEditor);
103     connect(m_actionEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) );
104 
105 #ifdef HAVE_QT4
106     m_designerIntegration = new qdesigner_internal::QDesignerIntegration(m_formEditor,this);
107 #endif
108 #ifdef HAVE_QT5
109     m_designerIntegration = new QDesignerIntegration(m_formEditor,this);
110 #endif
111     m_formEditor->setIntegration(m_designerIntegration);
112 
113 }
114 
~DialogDesignerManager()115 DialogDesignerManager::~DialogDesignerManager()
116 {
117     for (int i = 0; i<m_designerToolWindows.size();++i){
118         if (m_designerToolWindows[i])
119             delete m_designerToolWindows[i];
120     }
121 
122     delete m_designerIntegration;
123     delete m_formEditor;
124 }
125 
initToolBar(QToolBar * tb)126 void DialogDesignerManager::initToolBar(QToolBar *tb)
127 {
128     tb->setIconSize(QSize(16,16));
129     m_formEditor->formWindowManager()->actionCopy()->setIcon(QIcon(":/report/images/copy"));
130     tb->addAction(m_formEditor->formWindowManager()->actionCopy());
131     m_formEditor->formWindowManager()->actionPaste()->setIcon(QIcon(":/report/images/paste"));
132     tb->addAction(m_formEditor->formWindowManager()->actionPaste());
133     m_formEditor->formWindowManager()->actionCut()->setIcon(QIcon(":/report/images/cut"));
134     tb->addAction(m_formEditor->formWindowManager()->actionCut());
135     m_formEditor->formWindowManager()->actionUndo()->setIcon(QIcon(":/report/images/undo"));
136     tb->addAction(m_formEditor->formWindowManager()->actionUndo());
137     m_formEditor->formWindowManager()->actionRedo()->setIcon(QIcon(":/report/images/redo"));
138     tb->addAction(m_formEditor->formWindowManager()->actionRedo());
139 
140     tb->addActions(m_modes->actions());
141 
142     tb->addAction(m_formEditor->formWindowManager()->actionHorizontalLayout());
143     tb->addAction(m_formEditor->formWindowManager()->actionVerticalLayout());
144     tb->addAction(m_formEditor->formWindowManager()->actionSplitHorizontal());
145     tb->addAction(m_formEditor->formWindowManager()->actionSplitVertical());
146     tb->addAction(m_formEditor->formWindowManager()->actionGridLayout());
147     m_formEditor->formWindowManager()->actionFormLayout()->setIcon(QIcon(":/images/images/editform.png"));
148     tb->addAction(m_formEditor->formWindowManager()->actionFormLayout());
149     tb->addAction(m_formEditor->formWindowManager()->actionBreakLayout());
150     tb->addAction(m_formEditor->formWindowManager()->actionAdjustSize());
151 }
152 
createFormEditor(const QString & content)153 QWidget *DialogDesignerManager::createFormEditor(const QString &content)
154 {
155     QDesignerFormWindowInterface* wnd = m_formEditor->formWindowManager()->createFormWindow(0, Qt::Window);
156     wnd->setContents(content);
157     m_formEditor->formWindowManager()->setActiveFormWindow(wnd);
158     m_formEditor->objectInspector()->setFormWindow(wnd);
159     wnd->editWidgets();
160 
161     DialogDesigner* dialogDesigner = new DialogDesigner(wnd, m_formEditor);
162 
163     connect(dialogDesigner, SIGNAL(dialogChanged(QString)), this, SIGNAL(dialogChanged(QString)));
164     connect(dialogDesigner, SIGNAL(dialogNameChanged(QString,QString)), this, SIGNAL(dialogNameChanged(QString,QString)));
165     connect(dialogDesigner, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)));
166 
167     m_dialogDesigners.append(dialogDesigner);
168 
169     return dialogDesigner;
170 
171 }
172 
getDialogDescription(QWidget * form)173 QByteArray DialogDesignerManager::getDialogDescription(QWidget *form)
174 {
175     QByteArray result;
176     DialogDesigner* dialogDesigner = dynamic_cast<DialogDesigner*>(form);
177     Q_ASSERT(dialogDesigner != NULL);
178     //SharedTools::WidgetHost* wh = dynamic_cast<SharedTools::WidgetHost*>(form);
179     if (dialogDesigner){
180         result = dialogDesigner->dialogContent();
181         //wh->formWindow()->setDirty(false);
182     }
183     return result;
184 }
185 
setActiveEditor(QWidget * widget)186 void DialogDesignerManager::setActiveEditor(QWidget *widget)
187 {
188     SharedTools::WidgetHost* wh = dynamic_cast<SharedTools::WidgetHost*>(widget);
189     if (wh){
190         m_formEditor->formWindowManager()->setActiveFormWindow(wh->formWindow());
191     }
192 }
193 
setDirty(bool value)194 void DialogDesignerManager::setDirty(bool value)
195 {
196     foreach(DialogDesigner* dialogDesigner, m_dialogDesigners){
197         dialogDesigner->setChanged(value);
198     }
199 }
200 
widgetBox() const201 QWidget* DialogDesignerManager::widgetBox() const
202 {
203     return m_widgetBox;
204 }
205 
actionEditor() const206 QWidget* DialogDesignerManager::actionEditor() const
207 {
208     return m_actionEditor;
209 }
210 
propertyEditor() const211 QWidget* DialogDesignerManager::propertyEditor() const
212 {
213     return m_propertyEditor;
214 }
215 
objectInspector() const216 QWidget* DialogDesignerManager::objectInspector() const
217 {
218     return m_objectInspector;
219 }
220 
signalSlotEditor() const221 QWidget *DialogDesignerManager::signalSlotEditor() const
222 {
223     return m_signalSlotEditor;
224 }
225 
resourcesEditor() const226 QWidget *DialogDesignerManager::resourcesEditor() const
227 {
228     return m_resourcesEditor;
229 }
230 
slotObjectDestroyed(QObject * object)231 void DialogDesignerManager::slotObjectDestroyed(QObject* object)
232 {
233 
234     QList<DialogDesigner*>::Iterator it = m_dialogDesigners.begin();
235     while(it!=m_dialogDesigners.end()){
236         if (*it == object){
237             it = m_dialogDesigners.erase(it);
238             return;
239         } else {
240             ++it;
241         }
242     }
243 
244     for ( int i = 0; i<m_designerToolWindows.size();++i){
245         m_designerToolWindows[i] = m_designerToolWindows[i] == object ? 0 : m_designerToolWindows[i];
246     }
247 
248 }
249 
slotEditWidgets()250 void DialogDesignerManager::slotEditWidgets()
251 {
252    for (int i = 0; i<m_formEditor->formWindowManager()->formWindowCount(); ++i){
253        m_formEditor->formWindowManager()->formWindow(i)->editWidgets();
254    }
255 }
256 
slotActiveFormWindowChanged(QDesignerFormWindowInterface * formWindow)257 void DialogDesignerManager::slotActiveFormWindowChanged(QDesignerFormWindowInterface *formWindow)
258 {
259     if (formWindow){
260         m_editWidgetsAction->setEnabled(true);
261         m_activeWindowName = formWindow->objectName();
262     }
263 }
264 
iconPathByName(const QString & name)265 QString DialogDesignerManager::iconPathByName(const QString &name)
266 {
267     if (name.compare("__qt_edit_signals_slots_action") == 0)
268         return ":/images/images/signalslottool.png";
269     if (name.compare("__qt_edit_buddies_action") == 0)
270         return ":/images/images/buddytool.png";
271     if (name.compare("_qt_edit_tab_order_action") == 0)
272         return ":/images/images/tabordertool.png";
273     return "";
274 }
275 
DialogDesigner(QDesignerFormWindowInterface * wnd,QDesignerFormEditorInterface * formEditor,QWidget * parent,Qt::WindowFlags flags)276 DialogDesigner::DialogDesigner(QDesignerFormWindowInterface* wnd, QDesignerFormEditorInterface* formEditor, QWidget *parent, Qt::WindowFlags flags)
277     :QWidget(parent, flags), m_formEditor(formEditor)
278 {
279     m_dialogName = wnd->mainContainer()->objectName();
280     connect(wnd, SIGNAL(changed()), this, SLOT(slotDialogChanged()));
281 
282     m_designerHolder = new SharedTools::WidgetHost(this,wnd);
283     m_designerHolder->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
284     m_designerHolder->setFocusProxy( wnd );
285 
286     QVBoxLayout* l = new QVBoxLayout(this);
287     l->addWidget(m_designerHolder);
288     setLayout(l);
289 
290 }
291 
~DialogDesigner()292 DialogDesigner::~DialogDesigner(){}
293 
dialogName() const294 QString DialogDesigner::dialogName() const
295 {
296     return m_dialogName;
297 }
298 
setDialogName(const QString & dialogName)299 void DialogDesigner::setDialogName(const QString &dialogName)
300 {
301     m_dialogName = dialogName;
302 }
303 
isChanged()304 bool DialogDesigner::isChanged()
305 {
306     return m_designerHolder->formWindow()->isDirty();
307 }
308 
setChanged(bool value)309 void DialogDesigner::setChanged(bool value)
310 {
311     m_designerHolder->formWindow()->setDirty(value);
312 }
313 
dialogContent()314 QByteArray DialogDesigner::dialogContent()
315 {
316     if (m_designerHolder && m_designerHolder->formWindow())
317         return m_designerHolder->formWindow()->contents().toUtf8();
318     return QByteArray();
319 }
320 
undo()321 void DialogDesigner::undo()
322 {
323     Q_ASSERT(m_formEditor != NULL);
324     if (m_formEditor){
325         m_formEditor->formWindowManager()->actionUndo()->trigger();
326     }
327 }
328 
redo()329 void DialogDesigner::redo()
330 {
331     Q_ASSERT(m_formEditor != NULL);
332     if (m_formEditor){
333         m_formEditor->formWindowManager()->actionRedo()->trigger();
334     }
335 }
336 
slotMainContainerNameChanged(QString newName)337 void DialogDesigner::slotMainContainerNameChanged(QString newName)
338 {
339     if (m_dialogName.compare(newName) != 0){
340         emit dialogNameChanged(m_dialogName, newName);
341         m_dialogName = newName;
342     }
343 }
344 
slotDialogChanged()345 void DialogDesigner::slotDialogChanged()
346 {
347     Q_ASSERT(m_designerHolder != NULL);
348     if (m_designerHolder && m_designerHolder->formWindow()){
349         if ( m_designerHolder->formWindow()->mainContainer()->objectName().compare(m_dialogName) !=0 ){
350             emit dialogNameChanged(m_dialogName, m_designerHolder->formWindow()->mainContainer()->objectName());
351             m_dialogName = m_designerHolder->formWindow()->mainContainer()->objectName();
352         }
353         emit dialogChanged(m_dialogName);
354         m_designerHolder->formWindow()->setDirty(false);
355     }
356 }
357 
358 }
359