tizenmanifesteditorwidget.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2013 Jarek Pelczar <jpelczar@gmail.com>
  4. ** Copyright (C) 2014 Tomasz Olszak <olszak.tomasz@gmail.com>
  5. **
  6. ** This file is part of Qt Creator.
  7. **
  8. ** Commercial License Usage
  9. ** Licensees holding valid commercial Qt licenses may use this file in
  10. ** accordance with the commercial license agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Digia. For licensing terms and
  13. ** conditions see http://qt.digia.com/licensing. For further information
  14. ** use the contact form at http://qt.digia.com/contact-us.
  15. **
  16. ** GNU Lesser General Public License Usage
  17. ** Alternatively, this file may be used under the terms of the GNU Lesser
  18. ** General Public License version 2.1 as published by the Free Software
  19. ** Foundation and appearing in the file LICENSE.LGPL included in the
  20. ** packaging of this file. Please review the following information to
  21. ** ensure the GNU Lesser General Public License version 2.1 requirements
  22. ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
  23. **
  24. ** In addition, as a special exception, Digia gives you certain additional
  25. ** rights. These rights are described in the Digia Qt LGPL Exception
  26. ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
  27. **
  28. ****************************************************************************/
  29. #include "tizenmanifesteditorwidget.h"
  30. #include "tizenmanifestdocument.h"
  31. #include "tizenmanifesteditor.h"
  32. #include "tizenconstants.h"
  33. #include <coreplugin/icore.h>
  34. #include <coreplugin/infobar.h>
  35. #include "botan/botan.h"
  36. #include <QResizeEvent>
  37. #include <QTimer>
  38. #include <QDomDocument>
  39. #include <QVBoxLayout>
  40. #include <QDebug>
  41. using namespace TextEditor;
  42. namespace Tizen {
  43. namespace Internal {
  44. static const char TIZEN_MANIFEST_EDITOR_GENERAL_PANE_CONTEXT_ID[] = "Tizen.Manifest.Editor.General.Pane.Context";
  45. static const char TIZEN_MANIFEST_EDITOR_INFO_BAR_ID[] = "Tizen.Manifest.Editor.Info.Bar.Id";
  46. TizenManifestEditorWidget::TizenManifestEditorWidget(QWidget *parent, TextEditor::TextEditorActionHandler * ah) :
  47. TextEditor::PlainTextEditorWidget(parent),
  48. m_actionHandler(ah),
  49. m_activePage(GeneralPage),
  50. m_dirty(false),
  51. m_stayClean(false)
  52. {
  53. QSharedPointer<TizenManifestDocument> doc(new TizenManifestDocument(this));
  54. doc->setMimeType(QLatin1String(Constants::TIZEN_MANIFEST_MIME_TYPE));
  55. setBaseTextDocument(doc);
  56. ah->setupActions(this);
  57. configure(QLatin1String(Constants::TIZEN_MANIFEST_MIME_TYPE));
  58. initializePage();
  59. setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  60. setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  61. m_parseTimer = new QTimer(this);
  62. m_parseTimer->setSingleShot(true);
  63. m_parseTimer->setInterval(800);
  64. connect(m_parseTimer, SIGNAL(timeout()), SLOT(delayedParseCheck()));
  65. connect(document(), SIGNAL(contentsChanged()), SLOT(startParseCheck()));
  66. }
  67. bool TizenManifestEditorWidget::isModified() const
  68. {
  69. return m_dirty;
  70. }
  71. bool TizenManifestEditorWidget::open(QString *errorString, const QString &fileName, const QString &realFileName)
  72. {
  73. if(!TextEditor::PlainTextEditorWidget::open(errorString, fileName, realFileName))
  74. return false;
  75. int errorLine, errorColumn;
  76. QString error;
  77. QDomDocument doc;
  78. if(doc.setContent(toPlainText(), &error, &errorLine, &errorColumn)) {
  79. if(checkDocument(doc, &error, &errorLine, &errorColumn)) {
  80. if(activePage() != SourcePage)
  81. syncToWidgets(doc);
  82. return true;
  83. }
  84. }
  85. updateInfoBar(error, errorLine, errorColumn);
  86. setActivePage(SourcePage);
  87. return true;
  88. }
  89. void TizenManifestEditorWidget::preSave()
  90. {
  91. if(activePage() != SourcePage)
  92. syncToEditor();
  93. updateInfoBar();
  94. }
  95. TizenManifestEditorWidget::EditorPage TizenManifestEditorWidget::activePage() const
  96. {
  97. return m_activePage;
  98. }
  99. bool TizenManifestEditorWidget::setActivePage(EditorPage page)
  100. {
  101. EditorPage prevPage = activePage();
  102. if(prevPage == page)
  103. return true;
  104. m_activePage = page;
  105. if(page == SourcePage) {
  106. syncToEditor();
  107. m_overlayWidget->setVisible(false);
  108. setFocus();
  109. setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
  110. setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
  111. } else {
  112. if(!syncToWidgets())
  113. return false;
  114. m_overlayWidget->setVisible(true);
  115. QWidget * fw = m_overlayWidget->focusWidget();
  116. if(fw && fw != m_overlayWidget)
  117. fw->setFocus();
  118. setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  119. setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  120. }
  121. return true;
  122. }
  123. TextEditor::BaseTextEditor * TizenManifestEditorWidget::createEditor()
  124. {
  125. return new TizenManifestEditor(this);
  126. }
  127. void TizenManifestEditorWidget::resizeEvent(QResizeEvent * e)
  128. {
  129. PlainTextEditorWidget::resizeEvent(e);
  130. m_overlayWidget->resize(this->size());
  131. }
  132. void TizenManifestEditorWidget::initializePage()
  133. {
  134. QWidget * mainWidget = new QWidget(this);
  135. mainWidget->setAutoFillBackground(true);
  136. mainWidget->setFocusPolicy(Qt::WheelFocus);
  137. Core::IContext * myContext = new Core::IContext(this);
  138. myContext->setWidget(mainWidget);
  139. myContext->setContext(Core::Context(TIZEN_MANIFEST_EDITOR_GENERAL_PANE_CONTEXT_ID));
  140. Core::ICore::addContextObject(myContext);
  141. m_form.setupUi(mainWidget);
  142. connect(m_form.addFeatureButton, SIGNAL(clicked()), SLOT(addFeatureClicked()));
  143. connect(m_form.removeFeatureButton, SIGNAL(clicked()), SLOT(removeFeatureClicked()));
  144. connect(m_form.featuresList, SIGNAL(itemSelectionChanged()), SLOT(updateFeaturesButton()));
  145. connect(m_form.featureValueComboBox, SIGNAL(currentIndexChanged(int)), SLOT(featureValueIndexChanged(int)));
  146. connect(m_form.generateAppIdButton, SIGNAL(clicked()), SLOT(generateAppId()));
  147. connect(m_form.authorLineEdit, SIGNAL(textChanged(QString)), SLOT(authorChanged(QString)));
  148. connect(m_form.urlLineEdit, SIGNAL(textChanged(QString)), SLOT(urlChanged(QString)));
  149. connect(m_form.applicationNameEditor,SIGNAL(textChanged(QString)),SLOT(setDirty()));
  150. connect(m_form.versionEditor,SIGNAL(textChanged(QString)),SLOT(setDirty()));
  151. connect(m_form.checkBoxShowMainMenuIcon,SIGNAL(toggled(bool)),SLOT(setDirty()));
  152. connect(m_form.checkBoxShowHideFromHistoryList,SIGNAL(toggled(bool)),SLOT(setDirty()));
  153. updateFeaturesButton();
  154. m_overlayWidget = mainWidget;
  155. }
  156. void TizenManifestEditorWidget::delayedParseCheck()
  157. {
  158. m_parseTimer->start();
  159. }
  160. void TizenManifestEditorWidget::startParseCheck()
  161. {
  162. updateInfoBar();
  163. }
  164. void TizenManifestEditorWidget::updateInfoBar()
  165. {
  166. if(activePage() != SourcePage) {
  167. m_parseTimer->stop();
  168. return;
  169. }
  170. QDomDocument doc;
  171. int errorLine, errorColumn;
  172. QString error;
  173. if(doc.setContent(toPlainText(), &error, &errorLine, &errorColumn)) {
  174. if(checkDocument(doc, &error, &errorLine, &errorColumn)) {
  175. hideInfoBar();
  176. return;
  177. }
  178. }
  179. updateInfoBar(error, errorLine, errorColumn);
  180. }
  181. void TizenManifestEditorWidget::setDirty(bool dirty)
  182. {
  183. if(m_stayClean)
  184. return;
  185. m_dirty = dirty;
  186. emit changed();
  187. }
  188. bool TizenManifestEditorWidget::checkDocument(QDomDocument doc, QString * errorMessage, int * errorLine, int * errorColumn)
  189. {
  190. QDomElement manifest = doc.documentElement();
  191. if(manifest.tagName() != QLatin1String("Manifest")) {
  192. *errorMessage = tr("Tizen Manifest file must begin with \"Manifest\" element");
  193. *errorLine = manifest.lineNumber();
  194. *errorColumn = manifest.columnNumber();
  195. return false;
  196. }
  197. return true;
  198. }
  199. void TizenManifestEditorWidget::updateInfoBar(QString errorMessage, int errorLine, int errorColumn)
  200. {
  201. Core::InfoBar * bar = editorDocument()->infoBar();
  202. QString text;
  203. if(errorLine < 0)
  204. text = tr("Could not parse file: '%1'").arg(errorMessage);
  205. else
  206. text = tr("%2: Could not parse file: '%1'").arg(errorMessage).arg(errorLine);
  207. Core::InfoBarEntry infoBarEntry(TIZEN_MANIFEST_EDITOR_INFO_BAR_ID, text);
  208. bar->removeInfo(TIZEN_MANIFEST_EDITOR_INFO_BAR_ID);
  209. bar->addInfo(infoBarEntry);
  210. m_errorLine = errorLine;
  211. m_errorColumn = errorColumn;
  212. m_parseTimer->stop();
  213. }
  214. void TizenManifestEditorWidget::hideInfoBar()
  215. {
  216. Core::InfoBar * bar = editorDocument()->infoBar();
  217. bar->removeInfo(TIZEN_MANIFEST_EDITOR_INFO_BAR_ID);
  218. m_parseTimer->stop();
  219. }
  220. bool TizenManifestEditorWidget::syncToWidgets()
  221. {
  222. QDomDocument doc;
  223. QString errorMessage;
  224. int errorLine, errorColumn;
  225. if(doc.setContent(toPlainText(), &errorMessage, &errorLine, &errorColumn)) {
  226. if(checkDocument(doc, &errorMessage, &errorLine, &errorColumn)) {
  227. hideInfoBar();
  228. syncToWidgets(doc);
  229. return true;
  230. }
  231. }
  232. updateInfoBar(errorMessage, errorLine, errorColumn);
  233. return false;
  234. }
  235. void TizenManifestEditorWidget::syncToWidgets(QDomDocument doc)
  236. {
  237. m_stayClean = true;
  238. QDomElement manifest = doc.documentElement();
  239. QDomElement appId = manifest.firstChildElement(QLatin1String("Id"));
  240. m_form.appIdEditor->setText(appId.text());
  241. QDomElement version = manifest.firstChildElement(QLatin1String("Version"));
  242. m_form.versionEditor->setText(version.text());
  243. QDomElement requirements = manifest.firstChildElement(QLatin1String("Requirements"));
  244. const QString kFeature(QLatin1String("Feature"));
  245. const QString kName(QLatin1String("Name"));
  246. QDomElement author = manifest.firstChildElement(QLatin1String("Author"));
  247. m_form.authorLineEdit->setText(author.text());
  248. QDomElement url = manifest.firstChildElement(QLatin1String("Url"));
  249. m_form.urlLineEdit->setText(url.text());
  250. QDomElement type = manifest.firstChildElement(QLatin1String("Type"));
  251. m_form.appTypeCombo->setCurrentIndex(m_form.appTypeCombo->findText(type.text()));
  252. QDomElement apps = manifest.firstChildElement(QLatin1String("Apps"));
  253. QDomElement uiApp = apps.firstChildElement(QLatin1String("UiApp"));
  254. m_form.applicationNameEditor->setText(uiApp.attribute(QLatin1String("Name")));
  255. m_form.checkBoxShowMainMenuIcon->setChecked(uiApp.attribute(QLatin1String("MenuIconVisible")).toLower() == QLatin1String("true"));
  256. m_form.checkBoxShowHideFromHistoryList->setChecked(uiApp.attribute(QLatin1String("LaunchingHistoryVisible")).toLower() == QLatin1String("true"));
  257. QDomElement displayNames = uiApp.firstChildElement(QLatin1String("DisplayNames"));
  258. m_form.displayNameTable->clearContents();
  259. QDomNodeList displayNamesNodeList = displayNames.elementsByTagName(QLatin1String("DisplayName"));
  260. m_form.displayNameTable->setRowCount(displayNamesNodeList.size());
  261. QDomElement displayName;
  262. for(int i = 0; i < displayNamesNodeList.size(); i++) {
  263. displayName = displayNamesNodeList.at(i).toElement();
  264. m_form.displayNameTable->setItem(i,0,new QTableWidgetItem(displayName.text()));
  265. m_form.displayNameTable->setItem(i,1,new QTableWidgetItem(displayName.attribute(QLatin1String("Locale"))));
  266. }
  267. m_form.featuresList->clear();
  268. m_featureValues.clear();
  269. QStringList features;
  270. for(QDomElement child = requirements.firstChildElement(kFeature) ; !child.isNull() ; child = child.nextSiblingElement(kFeature)) {
  271. QString name = child.attribute(kName);
  272. QString value = child.text().trimmed();
  273. m_form.featuresList->addItem(name);
  274. m_featureValues[name] = value;
  275. }
  276. m_form.featuresList->addItems(features);
  277. updateFeaturesButton();
  278. m_stayClean = false;
  279. m_dirty = false;
  280. }
  281. void TizenManifestEditorWidget::updateValue(QDomElement parent, const QString& element, const QString& value)
  282. {
  283. QDomDocument doc = parent.ownerDocument();
  284. QDomElement prevChild = parent.firstChildElement(element);
  285. QDomElement newChild;
  286. if(!value.isEmpty()) {
  287. newChild = doc.createElement(element);
  288. newChild.appendChild(doc.createTextNode(value));
  289. }
  290. if(prevChild.isNull()) {
  291. if(!value.isEmpty())
  292. parent.appendChild(newChild);
  293. } else {
  294. if(value.isEmpty())
  295. parent.removeChild(prevChild);
  296. else
  297. parent.replaceChild(newChild, prevChild);
  298. }
  299. }
  300. void TizenManifestEditorWidget::syncToEditor()
  301. {
  302. QDomDocument doc;
  303. if(!doc.setContent(toPlainText())) {
  304. updateInfoBar();
  305. return;
  306. }
  307. QDomElement manifest = doc.documentElement();
  308. QDomElement appId = manifest.firstChildElement(QLatin1String("Id"));
  309. QDomElement newAppId = doc.createElement(QLatin1String("Id"));
  310. newAppId.appendChild(doc.createTextNode(m_form.appIdEditor->text()));
  311. manifest.replaceChild(newAppId, appId);
  312. QDomElement version = manifest.firstChildElement(QLatin1String("Version"));
  313. QDomElement newVersion = doc.createElement(QLatin1String("Version"));
  314. newVersion.appendChild(doc.createTextNode(m_form.versionEditor->text())) ;
  315. manifest.replaceChild(newVersion, version);
  316. QDomElement apps = manifest.firstChildElement(QLatin1String("Apps"));
  317. QDomElement uiApp = apps.firstChildElement(QLatin1String("UiApp"));
  318. uiApp.setAttribute(QLatin1String("Name"),m_form.applicationNameEditor->text());
  319. QString menuIconVisibleValue = QLatin1String(m_form.checkBoxShowMainMenuIcon->isChecked() ? "True" : "False");
  320. QString launchHistoryVisible = QLatin1String(m_form.checkBoxShowHideFromHistoryList->isChecked() ? "True" : "False");
  321. uiApp.setAttribute(QLatin1String("MenuIconVisible"),menuIconVisibleValue);
  322. uiApp.setAttribute(QLatin1String("LaunchingHistoryVisible"),launchHistoryVisible);
  323. const QString kRequirements(QLatin1String("Requirements"));
  324. QDomElement features = doc.createElement(kRequirements);
  325. const QString kFeature(QLatin1String("Feature"));
  326. const QString kName(QLatin1String("Name"));
  327. updateValue(manifest, QLatin1String("Author"), m_form.authorLineEdit->text().trimmed());
  328. updateValue(manifest, QLatin1String("Url"), m_form.urlLineEdit->text().trimmed());
  329. for(int i = 0 ; i < m_form.featuresList->count() ; ++i) {
  330. QDomElement feature = doc.createElement(kFeature);
  331. feature.setAttribute(kName, m_form.featuresList->item(i)->text());
  332. feature.appendChild(doc.createTextNode(m_featureValues[m_form.featuresList->item(i)->text()]));
  333. features.appendChild(feature);
  334. }
  335. manifest.replaceChild(features, manifest.firstChildElement(kRequirements));
  336. QString newText = doc.toString(4);
  337. if(newText == toPlainText())
  338. return;
  339. setPlainText(newText);
  340. document()->setModified(true);
  341. m_dirty = false;
  342. }
  343. void TizenManifestEditorWidget::addFeatureClicked()
  344. {
  345. }
  346. void TizenManifestEditorWidget::removeFeatureClicked()
  347. {
  348. QModelIndex featureIndex = m_form.featuresList->currentIndex();
  349. if(featureIndex.isValid()) {
  350. QAbstractItemModel * model = m_form.featuresList->model();
  351. model->removeRow(featureIndex.row());
  352. setDirty();
  353. }
  354. }
  355. void TizenManifestEditorWidget::updateFeaturesButton()
  356. {
  357. m_form.removeFeatureButton->setDisabled(m_form.featuresList->currentItem() == NULL);
  358. if(m_featureValues.isEmpty() && m_form.featurePropertiesGroup->isVisible()) {
  359. m_form.featurePropertiesGroup->hide();
  360. } else if(m_form.featuresList->currentItem() == NULL && m_form.featurePropertiesGroup->isVisible()) {
  361. m_form.featurePropertiesGroup->hide();
  362. } else if(m_form.featuresList->currentItem()) {
  363. QListWidgetItem * item = m_form.featuresList->currentItem();
  364. QString key = item->text();
  365. QString value = m_featureValues.value(key);
  366. QHash<QString, QList<TizenFeatureValue> > features = this->features();
  367. QList<TizenFeatureValue> values = features.value(key);
  368. m_form.featureDescriptionLabel->setText(QString());
  369. QStringList comboValues;
  370. comboValues.reserve(values.size());
  371. int currentIndex = -1;
  372. int index = 0;
  373. foreach(const TizenFeatureValue& v, values) {
  374. comboValues.append(v.value);
  375. if(v.value == value) {
  376. currentIndex = index;
  377. m_form.featureDescriptionLabel->setText(v.description);
  378. } else {
  379. ++index;
  380. }
  381. }
  382. m_form.featureValueComboBox->clear();
  383. m_form.featureValueComboBox->addItems(comboValues);
  384. if(currentIndex != -1) {
  385. m_form.featureValueComboBox->setDisabled(comboValues.count() < 2);
  386. m_form.featureValueComboBox->setCurrentIndex(currentIndex);
  387. } else
  388. m_form.featureValueComboBox->setDisabled(true);
  389. if(!m_form.featurePropertiesGroup->isVisible())
  390. m_form.featurePropertiesGroup->show();
  391. }
  392. }
  393. void TizenManifestEditorWidget::featureValueIndexChanged(int index)
  394. {
  395. if(index < 0)
  396. return;
  397. if(QListWidgetItem * item = m_form.featuresList->currentItem()) {
  398. QString key = item->text();
  399. if(key != m_featureValues[key]) {
  400. m_featureValues[key] = m_form.featureValueComboBox->currentText();
  401. setDirty(true);
  402. }
  403. }
  404. }
  405. QHash<QString, QList<TizenManifestEditorWidget::TizenFeatureValue> > TizenManifestEditorWidget::features()
  406. {
  407. if(!m_features.isEmpty())
  408. return m_features;
  409. QDomDocument doc;
  410. QFile srcFile(QLatin1String(":/tizen/resource/features.xml"));
  411. if(srcFile.open(QFile::ReadOnly)) {
  412. QString errorText;
  413. int errorLine, errorColumn;
  414. if(doc.setContent(&srcFile, &errorText, &errorLine, &errorColumn)) {
  415. const QString kFeature(QLatin1String("Feature"));
  416. const QString kName(QLatin1String("Name"));
  417. const QString kOption(QLatin1String("Option"));
  418. const QString kValue(QLatin1String("Value"));
  419. const QString kDescription(QLatin1String("Description"));
  420. const QString kDefault(QLatin1String("Default"));
  421. QDomElement root = doc.documentElement();
  422. for(QDomElement feature = root.firstChildElement(kFeature) ; !feature.isNull() ; feature = feature.nextSiblingElement(kFeature)) {
  423. QString name = feature.attribute(kName);
  424. QList<TizenFeatureValue> options;
  425. for(QDomElement option = feature.firstChildElement(kOption) ; !option.isNull() ; option = option.nextSiblingElement(kOption)) {
  426. bool isDefault = option.attribute(kDefault) == QLatin1String("true");
  427. options.append(TizenFeatureValue(option.attribute(kValue), option.attribute(kDescription), isDefault));
  428. }
  429. m_features[name] = options;
  430. }
  431. } else {
  432. #ifdef QT_DEBUG
  433. qWarning() << "Can't parse XML with error" << errorText << "@" << errorLine << ":" << errorColumn;
  434. #endif
  435. }
  436. } else {
  437. #ifdef QT_DEBUG
  438. qWarning() << "Can't open features XML:" << srcFile.errorString();
  439. #endif
  440. }
  441. return m_features;
  442. }
  443. void TizenManifestEditorWidget::generateAppId()
  444. {
  445. static const char APP_ID_CHARS[] = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  446. Botan::AutoSeeded_RNG rng;
  447. rng.reseed();
  448. Botan::byte bytes[10];
  449. rng.randomize(bytes, sizeof(bytes));
  450. QString appId;
  451. appId.reserve(sizeof(bytes));
  452. for(int i = 0 ; i < (int)sizeof(bytes) ; ++i) {
  453. appId.append(QLatin1Char(APP_ID_CHARS[bytes[i] % (sizeof(APP_ID_CHARS) - 1)]));
  454. }
  455. m_form.appIdEditor->setText(appId);
  456. setDirty();
  457. }
  458. void TizenManifestEditorWidget::authorChanged(QString author)
  459. {
  460. Q_UNUSED(author)
  461. setDirty();
  462. }
  463. void TizenManifestEditorWidget::urlChanged(QString url)
  464. {
  465. Q_UNUSED(url)
  466. setDirty();
  467. }
  468. } // namespace Internal
  469. } // namespace Tizen