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 "pageselector.h"
8 
9 #include <QByteArray>
10 #include <QComboBox>
11 #include <QDebug>
12 #include <QEvent>
13 #include <QHBoxLayout>
14 #include <QLabel>
15 #include <QLineEdit>
16 #include <QPixmap>
17 #include <QPushButton>
18 #include <QRegExp>
19 #include <QSignalBlocker>
20 #include <QToolTip>
21 #include <QValidator>
22 
23 #include "scpaths.h"
24 #include "scribusapp.h"
25 #include "iconmanager.h"
26 #include "util.h"
27 
PageSelector(QWidget * parent,int maximumPage)28 PageSelector::PageSelector( QWidget* parent, int maximumPage ) : QWidget( parent, Qt::WindowFlags() )
29 {
30 	pageCountString = "%1";
31 	m_lastPage = maximumPage;
32 	pageSelectorLayout = new QHBoxLayout( this );
33 	pageSelectorLayout->setContentsMargins(0, 0, 0, 0);
34 	pageSelectorLayout->setSpacing(1);
35 
36 	startButton = new QPushButton( this );
37 	backButton = new QPushButton( this );
38 	forwardButton = new QPushButton( this );
39 	lastButton = new QPushButton( this );
40 
41 	startButton->setDefault( false );
42 	backButton->setDefault( false );
43 	forwardButton->setDefault( false );
44 	lastButton->setDefault( false );
45 
46 	startButton->setAutoDefault( false );
47 	backButton->setAutoDefault( false );
48 	forwardButton->setAutoDefault( false );
49 	lastButton->setAutoDefault( false );
50 
51 	startButton->setIcon(IconManager::instance().loadIcon("16/go-first.png"));
52 	backButton->setIcon(IconManager::instance().loadIcon("16/go-previous.png"));
53 	forwardButton->setIcon(IconManager::instance().loadIcon("16/go-next.png"));
54 	lastButton->setIcon(IconManager::instance().loadIcon("16/go-last.png"));
55 
56 	startButton->setFocusPolicy(Qt::NoFocus);
57 	backButton->setFocusPolicy(Qt::NoFocus);
58 	forwardButton->setFocusPolicy(Qt::NoFocus);
59 	lastButton->setFocusPolicy(Qt::NoFocus);
60 
61 	forwardButton->setAutoRepeat(true);
62 	backButton->setAutoRepeat(true);
63 
64 	m_validator = new QIntValidator(1, m_lastPage, this);
65 	m_pageCombo = new QComboBox( this );
66 	m_pageCombo->setEditable(true);
67 	m_pageCombo->setDuplicatesEnabled( false );
68 	m_pageCombo->setInsertPolicy(QComboBox::NoInsert);
69 	m_pageCombo->lineEdit()->setAlignment(Qt::AlignHCenter);
70 	for (int i = 0; i < m_lastPage; ++i)
71 		m_pageCombo->addItem(QString::number(i+1));
72 	m_pageCombo->setValidator(m_validator);
73 	m_pageCombo->setMinimumSize(fontMetrics().horizontalAdvance( "9999" )+20, 20);
74 	m_pageCombo->setFocusPolicy(Qt::ClickFocus);
75 	m_pageCombo->setObjectName("pageCombo");
76 
77 	pageCountLabel = new QLabel(pageCountString.arg(m_lastPage), this);
78 
79 	forwardButton->setEnabled(true);
80 	lastButton->setEnabled(true);
81 	backButton->setEnabled(false);
82 	startButton->setEnabled(false);
83 	if (m_currentPage == m_lastPage)
84 	{
85 		forwardButton->setEnabled(false);
86 		lastButton->setEnabled(false);
87 	}
88 
89 	iconSetChange();
90 
91 	pageSelectorLayout->addWidget( startButton );
92 	pageSelectorLayout->addWidget( backButton );
93 	pageSelectorLayout->addWidget( m_pageCombo );
94 	pageSelectorLayout->addWidget( pageCountLabel );
95 	pageSelectorLayout->addWidget( forwardButton );
96 	pageSelectorLayout->addWidget( lastButton );
97 
98 	languageChange();
99 
100 	// signals and slots connections
101 	connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
102 
103 	connect( m_pageCombo, SIGNAL( activated(int) ), this, SLOT( gotoPage(int) ) );
104 	connect( backButton, SIGNAL( clicked() ), this, SLOT( goBackward()) );
105 	connect( startButton, SIGNAL( clicked() ), this, SLOT( goToStart() ) );
106 	connect( forwardButton, SIGNAL( clicked() ), this, SLOT( goForward() ) );
107 	connect( lastButton, SIGNAL( clicked() ), this, SLOT( goToEnd() ) );
108 }
109 
hasFocus()110 bool PageSelector::hasFocus()
111 {
112 	return m_pageCombo->hasFocus();
113 }
114 
clearFocus()115 void PageSelector::clearFocus()
116 {
117 	m_pageCombo->clearFocus();
118 }
119 
focusPolicy(Qt::FocusPolicy policy)120 void PageSelector::focusPolicy(Qt::FocusPolicy policy)
121 {
122 	m_pageCombo->setFocusPolicy(policy);
123 }
124 
setFont(const QFont & font)125 void PageSelector::setFont(const QFont& font)
126 {
127 	pageCountLabel->setFont(font);
128 	QWidget::setFont(font);
129 }
130 
getCurrentPage()131 int PageSelector::getCurrentPage()
132 {
133 	return m_currentPage;
134 }
135 
gotoPage(int i)136 void PageSelector::gotoPage(int i)
137 {
138 	clearFocus();
139 	setGUIForPage(i);
140 	emit pageChanged(i + 1);
141 }
142 
setGUIForPage(int i)143 void PageSelector::setGUIForPage(int i)
144 {
145 	QSignalBlocker signalBlocker(m_pageCombo);
146 	m_pageCombo->setCurrentIndex(i);
147 	m_currentPage = i + 1;
148 	setCurrentComboItem(m_pageCombo, QString::number(m_currentPage));
149 	backButton->setEnabled(i != 0);
150 	startButton->setEnabled(i != 0);
151 	forwardButton->setEnabled(i != m_lastPage - 1);
152 	lastButton->setEnabled(i != m_lastPage - 1);
153 }
154 
setMaximum(int i)155 void PageSelector::setMaximum(int i)
156 {
157 	QSignalBlocker signalBlocker(m_pageCombo);
158 	m_pageCombo->clear();
159 	m_lastPage = i;
160 	m_validator->setRange(1, m_lastPage);
161 	for (int b = 0; b < m_lastPage; ++b)
162 	{
163 		m_pageCombo->addItem(QString::number(b + 1));
164 	}
165 	setCurrentComboItem(m_pageCombo, QString::number(m_currentPage));
166 	pageCountLabel->setText(pageCountString.arg(m_lastPage));
167 }
168 
goToStart()169 void PageSelector::goToStart()
170 {
171 	if (m_currentPage == 1)
172 		return;
173 	gotoPage(0);
174 }
175 
goToEnd()176 void PageSelector::goToEnd()
177 {
178 	if (m_currentPage == m_lastPage)
179 		return;
180 	gotoPage(m_lastPage - 1);
181 }
182 
goBackward()183 void PageSelector::goBackward()
184 {
185 	m_currentPage--;
186 	if (m_currentPage < 1)
187 		m_currentPage = 1;
188 	gotoPage(m_currentPage - 1);
189 }
190 
goForward()191 void PageSelector::goForward()
192 {
193 	m_currentPage++;
194 	if (m_currentPage > m_lastPage)
195 		m_currentPage = m_lastPage;
196 	gotoPage(m_currentPage - 1);
197 }
198 
changeEvent(QEvent * e)199 void PageSelector::changeEvent(QEvent *e)
200 {
201 	if (e->type() == QEvent::LanguageChange)
202 		languageChange();
203 	else
204 		QWidget::changeEvent(e);
205 }
206 
iconSetChange()207 void PageSelector::iconSetChange()
208 {
209 	QByteArray stylesheet;
210 	if (loadRawText(ScPaths::instance().libDir() + "scribus.css", stylesheet))
211 	{
212 		QString downArrow(IconManager::instance().pathForIcon("16/go-down.png"));
213 		QByteArray da;
214 		da.append(downArrow.toUtf8());
215 		stylesheet.replace("___downArrow___", da);
216 		setStyleSheet(QString(stylesheet));
217 	}
218 }
219 
languageChange()220 void PageSelector::languageChange()
221 {
222 	startButton->setToolTip( tr("Go to the first page") );
223 	backButton->setToolTip( tr("Go to the previous page") );
224 	forwardButton->setToolTip( tr("Go to the next page") );
225 	lastButton->setToolTip( tr("Go to the last page") );
226 	m_pageCombo->setToolTip( tr("Select the current page") );
227 	pageCountString =  tr(" of %1", "number of pages in document");
228 	pageCountLabel->setText(pageCountString.arg(m_lastPage));
229 	setCurrentComboItem(m_pageCombo, QString::number(m_currentPage));
230 }
231 
232