1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 #include "javadocs.h"
8 
9 #include <QHBoxLayout>
10 #include <QVBoxLayout>
11 #include <QListWidget>
12 #include <QMessageBox>
13 #include <QPixmap>
14 #include <QPushButton>
15 #include <QRegExp>
16 #include <QTextEdit>
17 #include <QToolTip>
18 
19 #include "commonstrings.h"
20 #include "editor.h"
21 #include "query.h"
22 #include "scpage.h"
23 #include "scribusdoc.h"
24 #include "ui/scmessagebox.h"
25 #include "iconmanager.h"
26 
27 
JavaDocs(QWidget * parent,ScribusDoc * doc,ScribusView * vie)28 JavaDocs::JavaDocs(QWidget* parent, ScribusDoc *doc, ScribusView* vie) : QDialog( parent )
29 {
30 	setModal(true);
31 	setWindowTitle( tr( "Edit JavaScripts" ) );
32 	setWindowIcon(IconManager::instance().loadIcon("AppIcon.png"));
33 	m_Doc = doc;
34 	m_View = vie;
35 	JavaDocsLayout = new QHBoxLayout(this);
36 	JavaDocsLayout->setContentsMargins(9, 9, 9, 9);
37 	JavaDocsLayout->setSpacing(6);
38 
39 	Scripts = new QListWidget( this );
40 	Scripts->setMinimumSize( QSize( 150, 200 ) );
41 	QMap<QString,QString>::Iterator it;
42 	for (it = m_Doc->JavaScripts.begin(); it != m_Doc->JavaScripts.end(); ++it)
43 		Scripts->addItem(it.key());
44 	JavaDocsLayout->addWidget( Scripts );
45 
46 	Layout1 = new QVBoxLayout;
47 	Layout1->setContentsMargins(0, 0, 0, 0);
48 	Layout1->setSpacing(6);
49 
50 	EditScript = new QPushButton( tr( "&Edit..." ), this);
51 	Layout1->addWidget( EditScript );
52 
53 	AddScript = new QPushButton( tr( "&Add..." ), this);
54 	Layout1->addWidget( AddScript );
55 
56 	DeleteScript = new QPushButton( tr( "&Delete" ), this);
57 	Layout1->addWidget( DeleteScript );
58 	QSpacerItem* spacer = new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding );
59 	Layout1->addItem( spacer );
60 
61 	ExitDia = new QPushButton( tr( "&Close" ), this);
62 	ExitDia->setDefault( true );
63 	Layout1->addWidget( ExitDia );
64 	if (m_Doc->JavaScripts.count() == 0)
65 	{
66 		EditScript->setEnabled(false);
67 		DeleteScript->setEnabled(false);
68 	}
69 	JavaDocsLayout->addLayout( Layout1 );
70 	connect(AddScript, SIGNAL(clicked()), this, SLOT(slotAdd()));
71 	connect(EditScript, SIGNAL(clicked()), this, SLOT(slotEdit()));
72 	connect(DeleteScript, SIGNAL(clicked()), this, SLOT(slotDelete()));
73 	connect(ExitDia, SIGNAL(clicked()), this, SLOT(accept()));
74 	connect(Scripts, SIGNAL(itemActivated (QListWidgetItem *)), this, SLOT(slotEdit()));
75 	connect(Scripts, SIGNAL(itemSelectionChanged()), this, SLOT(slotSelectionChanged()));
76 	AddScript->setToolTip( "<qt>" + tr( "Adds a new Script, predefines a function with the same name. If you want to use this script as an \"Open Action\" script be sure not to change the name of the function." ) + "</qt>" );
77 }
78 
slotAdd()79 void JavaDocs::slotAdd()
80 {
81 	QString nam;
82 	Query dia(this, "tt", true, tr("&New Script:"), tr("New Script"));
83 	dia.setEditText( tr("New Script"), false );
84 	dia.setTestList(m_Doc->JavaScripts.keys());
85 	if (dia.exec())
86 	{
87 		nam = dia.getEditText();
88 		nam.replace( QRegExp("[\\s\\/\\{\\[\\]\\}\\<\\>\\(\\)\\%\\.]"), "_" );
89 		Editor* dia2 = new Editor(this, "", m_View);
90 		dia2->EditTex->setText("function "+nam+"()\n{\n}");
91 		if (dia2->exec())
92 		{
93 			m_Doc->JavaScripts[nam] = dia2->EditTex->toPlainText();
94 			Scripts->addItem(nam);
95 			Scripts->setCurrentRow(Scripts->count() - 1);
96 			emit docChanged(false);
97 		}
98 		delete dia2;
99 	}
100 }
101 
slotEdit()102 void JavaDocs::slotEdit()
103 {
104 	QListWidgetItem* currentItem = Scripts->currentItem();
105 	if (!currentItem)
106 		return;
107 	QString name = currentItem->text();
108 	Editor* dia2 = new Editor(this, m_Doc->JavaScripts[name], m_View);
109 	if (dia2->exec())
110 	{
111 		m_Doc->JavaScripts[name] = dia2->EditTex->toPlainText();
112 		emit docChanged(false);
113 	}
114 	delete dia2;
115 }
116 
slotDelete()117 void JavaDocs::slotDelete()
118 {
119 	QListWidgetItem* currentItem = Scripts->currentItem();
120 	if (!currentItem)
121 		return;
122 
123 	int exit = ScMessageBox::warning(this,
124 					   CommonStrings::trWarning,
125 					   tr("Do you really want to delete this script?"),
126 					   QMessageBox::Yes | QMessageBox::No,
127 					   QMessageBox::NoButton,	// GUI default
128 					   QMessageBox::Yes);	// batch default
129 	if (exit == QMessageBox::Yes)
130 	{
131 		QString name = currentItem->text();
132 		m_Doc->JavaScripts.remove(name);
133 		Scripts->clear();
134 		QMap<QString,QString>::Iterator it;
135 		for (it = m_Doc->JavaScripts.begin(); it != m_Doc->JavaScripts.end(); ++it)
136 			Scripts->addItem(it.key());
137 		if (m_Doc->JavaScripts.count() == 0)
138 		{
139 			EditScript->setEnabled(false);
140 			DeleteScript->setEnabled(false);
141 		}
142 		emit docChanged(false);
143 	}
144 }
145 
slotSelectionChanged()146 void JavaDocs::slotSelectionChanged()
147 {
148 	QListWidgetItem* currentItem = Scripts->currentItem();
149 	EditScript->setEnabled(currentItem != nullptr);
150 	DeleteScript->setEnabled(currentItem != nullptr);
151 }
152