1 /*****************************************************************************
2 * dictwidget.cpp - QStarDict, a StarDict clone written with using Qt *
3 * Copyright (C) 2007 Alexander Rodin *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License along *
16 * with this program; if not, write to the Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
18 *****************************************************************************/
20 #include "dictwidget.h"
23 #include <QVBoxLayout>
27 #include <QFileDialog>
30 #include <QTextStream>
31 #include <QMessageBox>
32 #include <QMouseEvent>
33 #include <QTextDocument>
36 #include <QPrintDialog>
38 #include "application.h"
39 #include "dictbrowser.h"
44 class DictWidgetToolbar: public QToolBar
47 DictWidgetToolbar(QWidget *parent = 0)
52 virtual void mouseDoubleClickEvent(QMouseEvent *event)
54 if (! actionAt(event->pos()))
55 QToolBar::mouseDoubleClickEvent(event);
63 DictWidget::DictWidget(QWidget *parent, Qt::WindowFlags f)
66 m_translationView = new DictBrowser(this);
67 setFrameStyle(m_translationView->frameStyle());
68 m_translationView->setFrameStyle(QFrame::NoFrame);
69 m_translationView->verticalScrollBar()->setCursor(Qt::ArrowCursor);
70 m_translationView->horizontalScrollBar()->setCursor(Qt::ArrowCursor);
71 m_translationView->setOpenExternalLinks(true);
72 connect(m_translationView, SIGNAL(sourceChanged(const QUrl&)), SLOT(on_translationView_sourceChanged(const QUrl&)));
74 m_toolBar = new DictWidgetToolbar(this);
75 m_toolBar->setMouseTracking(true);
77 QAction *actionBackward = m_toolBar->addAction(QIcon(":/icons/go-previous.png"), tr("Previous"),
78 m_translationView, SLOT(backward()));
79 actionBackward->setDisabled(true);
80 connect(m_translationView, SIGNAL(backwardAvailable(bool)), actionBackward, SLOT(setEnabled(bool)));
82 QAction *actionForward = m_toolBar->addAction(QIcon(":/icons/go-next.png"), tr("Next"),
83 m_translationView, SLOT(forward()));
84 actionForward->setDisabled(true);
85 connect(m_translationView, SIGNAL(forwardAvailable(bool)), actionForward, SLOT(setEnabled(bool)));
87 QAction *actionSaveToFile = m_toolBar->addAction(QIcon(":/icons/document-save-as.png"), tr("&Save to file"),
88 this, SLOT(saveToFile()));
91 font.setPointSize(16);
92 actionBackward->setFont(font);
93 actionForward->setFont(font);
94 actionSaveToFile->setFont(font);
97 QAction *actionPrint = m_toolBar->addAction(QIcon(":/icons/document-print.png"), tr("Prin&t translation"),
99 actionPrint->setFont(font);
102 QAction *actionSpeak = m_toolBar->addAction(QIcon(":/icons/speaker.png"), tr("Speak &word"),
103 this, SLOT(speak()));
104 actionSpeak->setFont(font);
106 toolBarSize.setWidth(70);
107 toolBarSize.setHeight(50);
108 m_toolBar->setIconSize(toolBarSize);
110 QVBoxLayout *layout = new QVBoxLayout(this);
111 layout->setMargin(0);
112 layout->setSpacing(0);
113 layout->addWidget(m_toolBar);
114 layout->addWidget(m_translationView);
118 void DictWidget::toggleToolBar(bool CheckedState)
120 CheckedState ? this->m_toolBar->show() : this->m_toolBar->hide();
121 //m_toolBar->setVisible(CheckedState);
124 void DictWidget::translate(const QString &str)
126 m_translationView->setSource(QUrl("qstardict:" + str));
129 void DictWidget::on_translationView_sourceChanged(const QUrl &name)
131 emit wordTranslated(name.toString(QUrl::RemoveScheme));
134 void DictWidget::saveToFile()
136 static QDir dir( QDir::homePath() ); //added by Frank
137 static QString filter(tr("Text files (*.txt)")); //added by Frank
139 QFileDialog dialog(this, tr("Save translation"),
140 dir.path(), filter); //updated by Frank
141 dialog.selectFile(translatedWord());//added by Frank
142 dialog.setNameFilters(QStringList() << tr("HTML files (*.html, *.htm)") << tr("Text files (*.txt)"));//updated by Frank
143 dialog.selectNameFilter(filter); //added by Frank
145 if (dialog.exec() && dialog.selectedFiles().size())
147 QString fileName = dialog.selectedFiles().first();
148 /*QString*/ filter = dialog.selectedFilter();//updated by Frank
149 dir = dialog.directory(); //added by Frank
150 if (filter == tr("HTML files (*.html, *.htm)") &&
151 ! (fileName.endsWith(".html", Qt::CaseInsensitive) || fileName.endsWith(".htm", Qt::CaseInsensitive)))
153 else if (filter == tr("Text files (*.txt)") && ! fileName.endsWith(".txt", Qt::CaseInsensitive))
156 QFile outputFile(fileName);
157 if (! outputFile.open(QIODevice::WriteOnly | QIODevice::Text))
159 QMessageBox::warning(this, tr("Error"),
160 tr("Cannot save translation as %1").arg(fileName));
163 QTextStream outputStream(&outputFile);
164 if (filter == tr("HTML files (*.html, *.htm)"))
165 outputStream << m_translationView->document()->toHtml("UTF-8");
167 outputStream << m_translationView->toPlainText();
171 void DictWidget::speak()
173 Application::instance()->speaker()->speak(translatedWord());
177 void DictWidget::print()
179 QPrinter printer(QPrinter::HighResolution);
180 QPrintDialog dialog(&printer, this);
181 if (dialog.exec() == QDialog::Accepted)
182 m_translationView->print(&printer);
186 void DictWidget::setDefaultStyleSheet(const QString &css)
188 m_translationView->document()->setDefaultStyleSheet(css);
189 m_translationView->reload();
194 // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc