1 /* This file is part of the KDE project
2  * Copyright (C) 2007 Thomas Zander <zander@kde.org>
3  * Copyright (C) 2009 Pierre Stirnweiss <pstirnweiss@googlemail.com>
4  * Copyright (C) 2012 Gopalakrishna Bhat A <gopalakbhat@gmail.com>
5  * Copyright (C) 2012 Mojtaba Shahi Senobari <mojtaba.shahi3000@gmail.com>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22 
23 #include "CharacterGeneral.h"
24 #include "CharacterHighlighting.h"
25 #include "LanguageTab.h"
26 #include "FontDecorations.h"
27 #include "FormattingPreview.h"
28 
29 #include "StylesCombo.h"
30 #include "StylesModel.h"
31 
32 #include <KoParagraphStyle.h>
33 #include <KoStyleThumbnailer.h>
34 #include <KoStyleManager.h>
35 #include <KoCharacterStyle.h>
36 
37 #include <QDebug>
38 
CharacterGeneral(QWidget * parent)39 CharacterGeneral::CharacterGeneral(QWidget *parent)
40     : QWidget(parent)
41     , m_style(0)
42     , m_styleManager(0)
43     , m_thumbnail(new KoStyleThumbnailer())
44     , m_paragraphStyleModel(new StylesModel(0, StylesModel::ParagraphStyle))
45     , m_characterInheritedStyleModel(new StylesModel(0, StylesModel::CharacterStyle))
46 {
47     widget.setupUi(this);
48     // we don't have next style for character styles
49     widget.nextStyle->setVisible(false);
50     widget.label_2->setVisible(false);
51     //
52 
53     // paragraph style model
54     widget.nextStyle->showEditIcon(false);
55     widget.nextStyle->setStyleIsOriginal(true);
56     m_paragraphStyleModel->setStyleThumbnailer(m_thumbnail);
57     widget.nextStyle->setStylesModel(m_paragraphStyleModel);
58     // inherited style model
59     widget.inheritStyle->showEditIcon(false);
60     widget.inheritStyle->setStyleIsOriginal(true);
61     //for character General
62     m_characterInheritedStyleModel->setStyleThumbnailer(m_thumbnail);
63     widget.inheritStyle->setStylesModel(m_characterInheritedStyleModel);
64     widget.inheritStyle->setEnabled(false);
65 
66     m_characterHighlighting = new CharacterHighlighting(true, this);
67     connect(m_characterHighlighting, SIGNAL(charStyleChanged()), this, SIGNAL(styleChanged()));
68     connect(m_characterHighlighting, SIGNAL(charStyleChanged()), this, SLOT(setPreviewCharacterStyle()));
69 
70     m_languageTab = new LanguageTab(true, this);
71 
72     widget.tabs->addTab(m_characterHighlighting, i18n("Font"));
73 
74     m_languageTab->setVisible(false);
75 
76     connect(widget.name, SIGNAL(textChanged(QString)), this, SIGNAL(nameChanged(QString)));
77 }
78 
hideStyleName(bool hide)79 void CharacterGeneral::hideStyleName(bool hide)
80 {
81     if (hide) {
82         disconnect(widget.name, SIGNAL(textChanged(QString)), this, SIGNAL(nameChanged(QString)));
83         widget.tabs->removeTab(0);
84         m_nameHidden = true;
85     }
86 }
87 
setStyle(KoCharacterStyle * style)88 void CharacterGeneral::setStyle(KoCharacterStyle *style)
89 {
90     m_style = style;
91     if (m_style == 0) {
92         return;
93     }
94     blockSignals(true);
95 
96     if (!m_nameHidden) {
97         widget.name->setText(style->name());
98     }
99 
100     m_characterHighlighting->setDisplay(style);
101     //m_languageTab->setDisplay(style);
102 
103     widget.preview->setCharacterStyle(style);
104 
105     if (m_styleManager) {
106         KoCharacterStyle *parentStyle = style->parentStyle();
107         if (parentStyle) {
108             widget.inheritStyle->setCurrentIndex(m_characterInheritedStyleModel->indexOf(parentStyle).row());
109         }
110     }
111 
112     blockSignals(false);
113 }
114 
save(KoCharacterStyle * style)115 void CharacterGeneral::save(KoCharacterStyle *style)
116 {
117     KoCharacterStyle *savingStyle;
118     if (style == 0) {
119         if (m_style == 0) {
120             return;
121         } else {
122             savingStyle = m_style;
123         }
124     } else {
125         savingStyle = style;
126     }
127 
128     m_characterHighlighting->save(savingStyle);
129     //m_languageTab->save(savingStyle);
130     savingStyle->setName(widget.name->text());
131 
132     if (m_style == savingStyle) {
133         emit styleAltered(savingStyle);
134     }
135 }
136 
switchToGeneralTab()137 void CharacterGeneral::switchToGeneralTab()
138 {
139     widget.tabs->setCurrentIndex(0);
140 }
141 
selectName()142 void CharacterGeneral::selectName()
143 {
144     widget.tabs->setCurrentIndex(widget.tabs->indexOf(widget.generalTab));
145     widget.name->selectAll();
146     widget.name->setFocus(Qt::OtherFocusReason);
147 }
148 
setPreviewCharacterStyle()149 void CharacterGeneral::setPreviewCharacterStyle()
150 {
151     KoCharacterStyle *charStyle = new KoCharacterStyle();
152     save(charStyle);
153     if (charStyle) {
154         widget.preview->setCharacterStyle(charStyle);
155     }
156 
157     delete charStyle;
158 }
159 
styleName() const160 QString CharacterGeneral::styleName() const
161 {
162     return widget.name->text();
163 }
164 
setStyleManager(KoStyleManager * sm)165 void CharacterGeneral::setStyleManager(KoStyleManager *sm)
166 {
167     if (!sm) {
168         return;
169     }
170     m_styleManager = sm;
171     m_paragraphStyleModel->setStyleManager(m_styleManager);
172     m_characterInheritedStyleModel->setStyleManager(m_styleManager);
173 }
174 
updateNextStyleCombo(KoParagraphStyle * style)175 void CharacterGeneral::updateNextStyleCombo(KoParagraphStyle *style)
176 {
177     if (!style) {
178         return;
179     }
180 
181     widget.nextStyle->setCurrentIndex(m_paragraphStyleModel->indexOf(style).row());
182     m_paragraphStyleModel->setCurrentParagraphStyle(style->styleId());
183 }
184 
nextStyleId()185 int CharacterGeneral::nextStyleId()
186 {
187     if (!m_styleManager) {
188         return 0;
189     }
190     int nextStyleIndex = widget.nextStyle->currentIndex();
191     QModelIndex paragraphStyleIndex = m_paragraphStyleModel->index(nextStyleIndex);
192     quint64 internalId = paragraphStyleIndex.internalId();
193     KoParagraphStyle *paragraphStyle = m_styleManager->paragraphStyle(internalId);
194     if (paragraphStyle) {
195         return paragraphStyle->styleId();
196     } else {
197         return 0;
198     }
199 }
200 
style() const201 KoCharacterStyle *CharacterGeneral::style() const
202 {
203     return m_style;
204 }
205