fb2dock.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #include "fb2dock.hpp"
  2. #include "fb2code.hpp"
  3. #include "fb2head.hpp"
  4. #include "fb2page.hpp"
  5. #include "fb2text.hpp"
  6. #include <QLayout>
  7. #include <QtDebug>
  8. //---------------------------------------------------------------------------
  9. // FbModeAction
  10. //---------------------------------------------------------------------------
  11. FbModeAction::FbModeAction(FbMainDock *parent, Fb::Mode mode, const QString &text)
  12. : QAction(text, parent)
  13. , m_dock(parent)
  14. , m_mode(mode)
  15. {
  16. setCheckable(true);
  17. connect(this, SIGNAL(triggered()), SLOT(switchMode()));
  18. }
  19. void FbModeAction::switchMode()
  20. {
  21. m_dock->switchMode(m_mode);
  22. }
  23. //---------------------------------------------------------------------------
  24. // FbMainDock
  25. //---------------------------------------------------------------------------
  26. FbMainDock::FbMainDock(QWidget *parent)
  27. : QStackedWidget(parent)
  28. , isSwitched(false)
  29. {
  30. textFrame = new FbTextFrame(this);
  31. m_text = new FbTextEdit(textFrame, parent);
  32. textFrame->layout()->addWidget(m_text);
  33. m_head = new FbHeadEdit(this, m_text);
  34. m_code = new FbCodeEdit(this);
  35. addWidget(textFrame);
  36. addWidget(m_head);
  37. addWidget(m_code);
  38. }
  39. void FbMainDock::switchMode(Fb::Mode mode)
  40. {
  41. QString xml;
  42. if (currentWidget() == m_code) {
  43. switch (mode) {
  44. case Fb::Text:
  45. case Fb::Head:
  46. default: ;
  47. }
  48. } else {
  49. switch (mode) {
  50. case Fb::Code: m_text->save(&xml); break;
  51. case Fb::Html: xml = m_text->toHtml(); break;
  52. default: ;
  53. }
  54. }
  55. setMode(mode);
  56. if (!xml.isEmpty()) {
  57. m_code->setPlainText(xml);
  58. }
  59. }
  60. void FbMainDock::setMode(Fb::Mode mode)
  61. {
  62. if (mode == m_mode) return;
  63. enableMenu(mode == Fb::Text);
  64. switch (m_mode = mode) {
  65. case Fb::Text: setModeText(); break;
  66. case Fb::Head: setModeHead(); break;
  67. case Fb::Code: setModeCode(); break;
  68. case Fb::Html: setModeHtml(); break;
  69. }
  70. }
  71. void FbMainDock::setModeText()
  72. {
  73. m_mode = Fb::Text;
  74. setCurrentWidget(textFrame);
  75. m_head->disconnectActions();
  76. m_code->disconnectActions();
  77. m_text->connectActions(m_tool);
  78. m_text->viewContents(true);
  79. }
  80. void FbMainDock::setModeHead()
  81. {
  82. m_mode = Fb::Head;
  83. m_text->hideDocks();
  84. setCurrentWidget(m_head);
  85. m_text->disconnectActions();
  86. m_code->disconnectActions();
  87. m_head->connectActions(m_tool);
  88. }
  89. void FbMainDock::setModeCode()
  90. {
  91. m_mode = Fb::Code;
  92. m_text->hideDocks();
  93. setCurrentWidget(m_code);
  94. m_text->disconnectActions();
  95. m_head->disconnectActions();
  96. m_code->connectActions(m_tool);
  97. }
  98. void FbMainDock::setModeHtml()
  99. {
  100. m_mode = Fb::Html;
  101. m_text->hideDocks();
  102. setCurrentWidget(m_code);
  103. m_text->disconnectActions();
  104. m_head->disconnectActions();
  105. m_code->connectActions(m_tool);
  106. }
  107. bool FbMainDock::load(const QString &filename)
  108. {
  109. QFile file(filename);
  110. if (!file.open(QFile::ReadOnly | QFile::Text)) {
  111. qCritical() << QObject::tr("Cannot read file %1: %2.").arg(filename).arg(file.errorString());
  112. return false;
  113. }
  114. if (currentWidget() == m_code) {
  115. m_code->clear();
  116. return m_code->read(&file);
  117. }
  118. return false;
  119. }
  120. bool FbMainDock::save(QIODevice *device, const QString &codec)
  121. {
  122. if (currentWidget() == m_code) {
  123. QTextStream out(device);
  124. out << m_code->toPlainText();
  125. } else {
  126. isSwitched = false;
  127. m_text->save(device, codec);
  128. }
  129. return true;
  130. }
  131. bool FbMainDock::isModified() const
  132. {
  133. if (isSwitched) return true;
  134. QWidget * current = currentWidget();
  135. if (current == textFrame) return m_text->isModified();
  136. if (current == m_head) return m_text->isModified();
  137. if (current == m_code) return m_code->isModified();
  138. return false;
  139. }
  140. void FbMainDock::addMenu(QMenu *menu)
  141. {
  142. m_menus.append(menu);
  143. }
  144. void FbMainDock::enableMenu(bool value)
  145. {
  146. foreach (QMenu *menu, m_menus) {
  147. menu->setEnabled(value);
  148. }
  149. }