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