2
* KFontInst - KDE Font Installer
4
* Copyright 2003-2007 Craig Drummond <craig@kde.org>
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* General Public License for more details.
18
* You should have received a copy of the GNU General Public License
19
* along with this program; see the file COPYING. If not, write to
20
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21
* Boston, MA 02110-1301, USA.
24
#include "KCmFontInst.h"
25
#include "KfiConstants.h"
26
#include "PrintDialog.h"
28
#include "FontPreview.h"
29
#include "FontsPackage.h"
32
#include "DuplicatesDialog.h"
33
#include "FontFilter.h"
34
#include "PreviewSelectAction.h"
35
#include "PreviewList.h"
36
#include <QtGui/QGridLayout>
37
#include <QtGui/QBoxLayout>
38
#include <QtGui/QSplitter>
39
#include <QtGui/QProgressBar>
40
#include <QtGui/QApplication>
41
#include <QtGui/QComboBox>
42
#include <QtGui/QPainter>
43
#include <QtGui/QMenu>
44
#include <QtGui/QLabel>
45
#include <QtCore/QCoreApplication>
46
#include <QtCore/QProcess>
47
#include <QtCore/QTextStream>
48
#include <KDE/KAboutData>
49
#include <KDE/KToolBar>
50
#include <KDE/KFileDialog>
51
#include <KDE/KMessageBox>
52
#include <KDE/KIO/Job>
53
#include <KDE/KIO/NetAccess>
54
#include <KDE/KPushButton>
55
#include <KDE/KGlobal>
56
#include <KDE/KGuiItem>
57
#include <KDE/KInputDialog>
58
#include <KDE/KIconLoader>
59
#include <KDE/KProgressDialog>
60
#include <KDE/KTempDir>
61
#include <KDE/KTemporaryFile>
63
#include <KDE/KActionMenu>
64
#include <KDE/KToggleAction>
65
#include <KDE/KStandardDirs>
67
#include <KDE/KPluginFactory>
68
#include <KDE/KPluginLoader>
69
#include <KDE/KStandardAction>
72
#define CFG_GROUP "Main Settings"
73
#define CFG_PREVIEW_SPLITTER_SIZES "PreviewSplitterSizes"
74
#define CFG_GROUP_SPLITTER_SIZES "GroupSplitterSizes"
75
#define CFG_FONT_SIZE "FontSize"
77
K_PLUGIN_FACTORY(FontInstallFactory,
78
registerPlugin<KFI::CKCmFontInst>();
80
K_EXPORT_PLUGIN(FontInstallFactory("fontinst"))
85
static QString partialIcon(bool load=true)
87
QString name(KGlobal::dirs()->saveLocation("cache", "kfi")+"/partial.png");
89
if(Misc::fExists(name))
97
QPixmap pix=KIconLoader::global()->loadIcon("dialog-ok", KIconLoader::Small, KIconLoader::SizeSmall,
98
KIconLoader::DisabledState);
100
pix.save(name, "PNG");
106
class CPushButton : public KPushButton
110
CPushButton(const KGuiItem &item, QWidget *parent)
111
: KPushButton(item, parent)
113
theirHeight=qMax(theirHeight, KPushButton::sizeHint().height());
114
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
117
QSize sizeHint() const
119
QSize sh(KPushButton::sizeHint());
121
sh.setHeight(theirHeight);
122
if(sh.width()<sh.height())
123
sh.setWidth(sh.height());
124
else if(text().isEmpty())
125
sh.setWidth(theirHeight);
129
static int theirHeight;
132
class CToolBar : public KToolBar
136
CToolBar(QWidget *parent)
141
setToolButtonStyle(Qt::ToolButtonIconOnly);
142
setFont(QApplication::font());
145
void paintEvent(QPaintEvent *)
147
QColor col(palette().color(backgroundRole()));
150
QPainter(this).fillRect(rect(), col);
154
class CProgressBar : public QProgressBar
158
CProgressBar(QWidget *p, int h) : QProgressBar(p), itsHeight((int)(h*0.6))
159
{ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); }
161
virtual ~CProgressBar() { }
163
int height() const { return itsHeight; }
164
QSize sizeHint() const { return QSize(100, itsHeight); }
171
int CPushButton::theirHeight=0;
173
CKCmFontInst::CKCmFontInst(QWidget *parent, const QVariantList&)
174
: KCModule(FontInstallFactory::componentData(), parent),
176
itsConfig(KFI_UI_CFG_FILE),
179
itsUpdateDialog(NULL),
185
KGlobal::locale()->insertCatalog(KFI_CATALOGUE);
186
KIconLoader::global()->addAppDir(KFI_NAME);
187
KIconLoader::global()->reconfigure(KFI_NAME, KGlobal::dirs());
189
KAboutData *about = new KAboutData("fontinst", 0, ki18n("KDE Font Installer"), 0, KLocalizedString(),
190
KAboutData::License_GPL, ki18n("(C) Craig Drummond, 2000 - 2009"));
191
about->addAuthor(ki18n("Craig Drummond"), ki18n("Developer and maintainer"), "craig@kde.org");
194
KConfigGroup cg(&itsConfig, CFG_GROUP);
196
itsGroupSplitter=new QSplitter(this);
197
itsGroupSplitter->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
198
QWidget *groupWidget=new QWidget(itsGroupSplitter),
199
*fontWidget=new QWidget(itsGroupSplitter);
201
itsPreviewSplitter=new QSplitter(fontWidget);
202
itsPreviewSplitter->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
204
QWidget *toolbarWidget=new QWidget(this),
205
*fontControlWidget=new QWidget(fontWidget);
206
CToolBar *toolbar=new CToolBar(toolbarWidget);
207
QGridLayout *groupsLayout=new QGridLayout(groupWidget);
208
QBoxLayout *mainLayout=new QBoxLayout(QBoxLayout::TopToBottom, this),
209
*toolbarLayout=new QBoxLayout(QBoxLayout::LeftToRight, toolbarWidget),
210
*fontsLayout=new QBoxLayout(QBoxLayout::TopToBottom, fontWidget),
211
*fontControlLayout=new QBoxLayout(QBoxLayout::LeftToRight, fontControlWidget);
213
toolbarLayout->setMargin(0);
214
toolbarLayout->setSpacing(KDialog::spacingHint());
215
mainLayout->setMargin(0);
216
mainLayout->setSpacing(KDialog::spacingHint());
217
groupsLayout->setMargin(0);
218
groupsLayout->setSpacing(KDialog::spacingHint());
219
fontsLayout->setMargin(0);
220
fontsLayout->setSpacing(KDialog::spacingHint());
221
fontControlLayout->setMargin(0);
222
fontControlLayout->setSpacing(KDialog::spacingHint());
225
KAction *duplicateFontsAct=new KAction(KIcon("system-search"), i18n("Scan for Duplicate Fonts..."), this);
226
//*validateFontsAct=new KAction(KIcon("checkmark"), i18n("Validate Fonts..."), this);
227
//*downloadFontsAct=new KAction(KIcon("go-down"), i18n("Download Fonts..."), this);
229
itsToolsMenu=new KActionMenu(KIcon("system-run"), i18n("Tools"), this);
230
itsToolsMenu->addAction(duplicateFontsAct);
231
//itsToolsMenu->addAction(validateFontsAct);
232
//itsToolsMenu->addAction(downloadFontsAct);
233
itsToolsMenu->setDelayed(false);
234
toolbar->addAction(itsToolsMenu);
235
itsFilter=new CFontFilter(toolbarWidget);
237
// Details - Groups...
238
itsGroupList=new CGroupList(groupWidget);
239
itsGroupListView=new CGroupListView(groupWidget, itsGroupList);
241
KPushButton *createGroup=new CPushButton(KGuiItem(QString(), "list-add",
242
i18n("Create a new group")),
245
itsDeleteGroupControl=new CPushButton(KGuiItem(QString(), "edit-delete",
246
i18n("Remove group")),
249
itsEnableGroupControl=new CPushButton(KGuiItem(QString(), "enablefont",
250
i18n("Enable all disabled fonts in the current group")),
253
itsDisableGroupControl=new CPushButton(KGuiItem(QString(), "disablefont",
254
i18n("Disable all enabled fonts in the current group")),
257
groupsLayout->addWidget(itsGroupListView, 0, 0, 1, 5);
258
groupsLayout->addWidget(createGroup, 1, 0);
259
groupsLayout->addWidget(itsDeleteGroupControl, 1, 1);
260
groupsLayout->addWidget(itsEnableGroupControl, 1, 2);
261
groupsLayout->addWidget(itsDisableGroupControl, 1, 3);
262
groupsLayout->addItem(new QSpacerItem(itsDisableGroupControl->width(), KDialog::spacingHint(),
263
QSizePolicy::Expanding, QSizePolicy::Fixed), 1, 4);
265
QWidget *previewWidget = new QWidget(this);
266
QBoxLayout *previewWidgetLayout = new QBoxLayout(QBoxLayout::TopToBottom, previewWidget);
267
previewWidgetLayout->setMargin(0);
268
previewWidgetLayout->setSpacing(0);
271
QFrame *previewFrame=new QFrame(previewWidget);
272
QBoxLayout *previewFrameLayout=new QBoxLayout(QBoxLayout::LeftToRight, previewFrame);
274
previewFrameLayout->setMargin(0);
275
previewFrameLayout->setSpacing(0);
276
previewFrame->setFrameShape(QFrame::StyledPanel);
277
previewFrame->setFrameShadow(QFrame::Sunken);
278
previewFrame->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
280
itsPreview=new CFontPreview(previewFrame);
281
itsPreview->setWhatsThis(i18n("This displays a preview of the selected font."));
282
itsPreview->setContextMenuPolicy(Qt::CustomContextMenu);
283
previewFrameLayout->addWidget(itsPreview);
284
previewWidgetLayout->addWidget(previewFrame);
285
itsPreview->engine()->readConfig(itsConfig);
287
// List-style preview...
288
itsPreviewList = new CPreviewListView(itsPreview->engine(), previewWidget);
289
previewWidgetLayout->addWidget(itsPreviewList);
290
itsPreviewList->setVisible(false);
293
itsFontList=new CFontList(fontWidget);
294
itsFontListView=new CFontListView(itsPreviewSplitter, itsFontList);
295
itsFontListView->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
297
itsAddFontControl=new CPushButton(KGuiItem(i18n("Add..."), "list-add",
298
i18n("Install fonts")),
301
itsDeleteFontControl=new CPushButton(KGuiItem(i18n("Delete"), "edit-delete",
302
i18n("Delete all selected fonts")),
305
itsPreviewSplitter->addWidget(previewWidget);
306
itsPreviewSplitter->setCollapsible(1, true);
308
itsStatusLabel = new QLabel(fontControlWidget);
309
itsStatusLabel->setAlignment(Qt::AlignVCenter|Qt::AlignRight);
310
itsListingProgress=new CProgressBar(fontControlWidget, itsStatusLabel->height());
311
itsListingProgress->setRange(0, 100);
314
toolbarLayout->addWidget(toolbar);
315
toolbarLayout->addItem(new QSpacerItem(KDialog::spacingHint(), 2, QSizePolicy::MinimumExpanding, QSizePolicy::Fixed));
316
toolbarLayout->addWidget(itsFilter);
317
mainLayout->addWidget(toolbarWidget);
318
mainLayout->addWidget(itsGroupSplitter);
320
fontControlLayout->addWidget(itsAddFontControl);
321
fontControlLayout->addWidget(itsDeleteFontControl);
322
fontControlLayout->addWidget(itsStatusLabel);
323
fontControlLayout->addItem(new QSpacerItem(0, itsListingProgress->height()+4,
324
QSizePolicy::Fixed, QSizePolicy::Fixed));
325
fontControlLayout->addWidget(itsListingProgress);
327
fontsLayout->addWidget(itsPreviewSplitter);
328
fontsLayout->addWidget(fontControlWidget);
330
// Set size of widgets...
331
itsPreviewSplitter->setChildrenCollapsible(false);
332
itsGroupSplitter->setChildrenCollapsible(false);
333
itsGroupSplitter->setStretchFactor(0, 0);
334
itsGroupSplitter->setStretchFactor(1, 1);
335
itsPreviewSplitter->setStretchFactor(0, 1);
336
itsPreviewSplitter->setStretchFactor(1, 0);
338
// Set sizes for 3 views...
339
QList<int> defaultSizes;
342
itsPreviewSplitter->setSizes(cg.readEntry(CFG_PREVIEW_SPLITTER_SIZES, defaultSizes));
344
defaultSizes.clear();
347
itsGroupSplitter->setSizes(cg.readEntry(CFG_GROUP_SPLITTER_SIZES, defaultSizes));
349
// Preview widget pop-up menu
350
itsPreviewMenu = new QMenu(itsPreview);
351
QAction *zoomIn=KStandardAction::create(KStandardAction::ZoomIn, itsPreview, SLOT(zoomIn()), this),
352
*zoomOut=KStandardAction::create(KStandardAction::ZoomOut, itsPreview, SLOT(zoomOut()), this);
354
itsPreviewMenu->addAction(zoomIn);
355
itsPreviewMenu->addAction(zoomOut);
356
itsPreviewMenu->addSeparator();
357
CPreviewSelectAction *prevSel=new CPreviewSelectAction(itsPreviewMenu);
358
itsPreviewMenu->addAction(prevSel);
359
KAction *changeTextAct=new KAction(KIcon("edit-rename"), i18n("Change Preview Text..."), this);
360
itsPreviewMenu->addAction(changeTextAct),
362
itsPreviewListMenu = new QMenu(itsPreviewList);
363
itsPreviewListMenu->addAction(changeTextAct),
365
// Connect signals...
366
connect(itsPreview, SIGNAL(atMax(bool)), zoomIn, SLOT(setDisabled(bool)));
367
connect(itsPreview, SIGNAL(atMin(bool)), zoomOut, SLOT(setDisabled(bool)));
368
connect(prevSel, SIGNAL(range(const QList<CFcEngine::TRange> &)),
369
itsPreview, SLOT(setUnicodeRange(const QList<CFcEngine::TRange> &)));
370
connect(changeTextAct, SIGNAL(triggered(bool)), SLOT(changeText()));
371
connect(itsFilter, SIGNAL(textChanged(const QString &)), itsFontListView, SLOT(filterText(const QString &)));
372
connect(itsFilter, SIGNAL(criteriaChanged(int, qulonglong)), itsFontListView, SLOT(filterCriteria(int, qulonglong)));
373
connect(itsGroupListView, SIGNAL(del()), SLOT(removeGroup()));
374
connect(itsGroupListView, SIGNAL(print()), SLOT(printGroup()));
375
connect(itsGroupListView, SIGNAL(enable()), SLOT(enableGroup()));
376
connect(itsGroupListView, SIGNAL(disable()), SLOT(disableGroup()));
377
connect(itsGroupListView, SIGNAL(moveFonts()), SLOT(moveFonts()));
378
connect(itsGroupListView, SIGNAL(zip()), SLOT(zipGroup()));
379
connect(itsGroupListView, SIGNAL(itemSelected(const QModelIndex &)),
380
SLOT(groupSelected(const QModelIndex &)));
381
connect(itsGroupListView, SIGNAL(info(const QString &)),
382
SLOT(showInfo(const QString &)));
383
connect(itsGroupList, SIGNAL(refresh()), SLOT(refreshFontList()));
384
connect(itsFontList, SIGNAL(listingPercent(int)), SLOT(listingPercent(int)));
385
connect(itsFontList, SIGNAL(layoutChanged()), SLOT(setStatusBar()));
386
connect(itsFontListView, SIGNAL(del()), SLOT(deleteFonts()));
387
connect(itsFontListView, SIGNAL(print()), SLOT(print()));
388
connect(itsFontListView, SIGNAL(enable()), SLOT(enableFonts()));
389
connect(itsFontListView, SIGNAL(disable()), SLOT(disableFonts()));
390
connect(itsFontListView, SIGNAL(fontsDropped(const QSet<KUrl> &)),
391
SLOT(addFonts(const QSet<KUrl> &)));
392
connect(itsFontListView, SIGNAL(itemsSelected(const QModelIndexList &)), SLOT(fontsSelected(const QModelIndexList &)));
393
connect(itsFontListView, SIGNAL(refresh()), SLOT(setStatusBar()));
394
connect(itsGroupListView, SIGNAL(unclassifiedChanged()), itsFontListView, SLOT(refreshFilter()));
395
connect(createGroup, SIGNAL(clicked()), SLOT(addGroup()));
396
connect(itsDeleteGroupControl, SIGNAL(clicked()), SLOT(removeGroup()));
397
connect(itsEnableGroupControl, SIGNAL(clicked()), SLOT(enableGroup()));
398
connect(itsDisableGroupControl, SIGNAL(clicked()), SLOT(disableGroup()));
399
connect(itsAddFontControl, SIGNAL(clicked()), SLOT(addFonts()));
400
connect(itsDeleteFontControl, SIGNAL(clicked()), SLOT(deleteFonts()));
401
connect(duplicateFontsAct, SIGNAL(triggered(bool)), SLOT(duplicateFonts()));
402
//connect(validateFontsAct, SIGNAL(triggered(bool)), SLOT(validateFonts()));
403
//connect(downloadFontsAct, SIGNAL(triggered(bool)), SLOT(downloadFonts()));
404
connect(itsPreview, SIGNAL(customContextMenuRequested(const QPoint &)), SLOT(previewMenu(const QPoint &)));
405
connect(itsPreviewList, SIGNAL(showMenu(const QPoint &)), SLOT(previewMenu(const QPoint &)));
411
CKCmFontInst::~CKCmFontInst()
413
KConfigGroup cg(&itsConfig, CFG_GROUP);
415
cg.writeEntry(CFG_PREVIEW_SPLITTER_SIZES, itsPreviewSplitter->sizes());
416
cg.writeEntry(CFG_GROUP_SPLITTER_SIZES, itsGroupSplitter->sizes());
421
QString CKCmFontInst::quickHelp() const
424
? i18n("<h1>Font Installer</h1><p> This module allows you to"
425
" install TrueType, Type1, and Bitmap"
426
" fonts.</p><p>You may also install fonts using Konqueror:"
427
" type fonts:/ into Konqueror's location bar"
428
" and this will display your installed fonts. To install a"
429
" font, simply copy one into the folder.</p>")
430
: i18n("<h1>Font Installer</h1><p> This module allows you to"
431
" install TrueType, Type1, and Bitmap"
432
" fonts.</p><p>You may also install fonts using Konqueror:"
433
" type fonts:/ into Konqueror's location bar"
434
" and this will display your installed fonts. To install a"
435
" font, simply copy it into the appropriate folder - "
436
" \"%1\" for fonts available to just yourself, or "
437
" \"%2\" for system-wide fonts (available to all).</p>",
438
i18n(KFI_KIO_FONTS_USER), i18n(KFI_KIO_FONTS_SYS));
441
void CKCmFontInst::previewMenu(const QPoint &pos)
443
if(itsPreviewList->isHidden())
444
itsPreviewMenu->popup(itsPreview->mapToGlobal(pos));
446
itsPreviewListMenu->popup(itsPreviewList->mapToGlobal(pos));
449
void CKCmFontInst::fontsSelected(const QModelIndexList &list)
451
itsDeleteFontControl->setEnabled(false);
457
CFontModelItem *mi=static_cast<CFontModelItem *>(list.last().internalPointer());
458
CFontItem *font=mi->parent()
459
? static_cast<CFontItem *>(mi)
460
: (static_cast<CFamilyItem *>(mi))->regularFont();
463
itsPreview->showFont(font->isEnabled() ? font->family() : font->fileName(),
464
font->styleInfo(), font->index());
467
itsPreviewList->showFonts(list);
469
itsDeleteFontControl->setEnabled(list.count());
470
itsPreviewList->setVisible(list.count()>1);
471
itsPreview->parentWidget()->setVisible(list.count()<2);
474
void CKCmFontInst::addFonts()
476
QString filter("application/x-font-ttf "
477
"application/x-font-otf "
478
"application/x-font-type1 "
479
"application/x-font-pcf "
480
"application/x-font-bdf "
481
"application/vnd.kde.fontspackage");
483
KUrl::List list=KFileDialog::getOpenUrls(KUrl(), filter, this, i18n("Add Fonts"));
488
KUrl::List::Iterator it(list.begin()),
493
if(KFI_KIO_FONTS_PROTOCOL!=(*it).protocol()) // Do not try to install from fonts:/ !!!
495
KUrl url(KIO::NetAccess::mostLocalUrl(*it, this));
497
if(url.isLocalFile())
499
QString file(url.toLocalFile());
501
if(Misc::isPackage(file)) // If its a package we need to unzip 1st...
502
urls+=FontsPackage::extract(url.toLocalFile(), &itsTempDir);
503
else if(!Misc::isMetrics(url))
506
else if(!Misc::isMetrics(url))
517
void CKCmFontInst::groupSelected(const QModelIndex &index)
519
CGroupListItem *grp=NULL;
522
grp=static_cast<CGroupListItem *>(index.internalPointer());
524
itsFontListView->setFilterGroup(grp);
528
// Check fonts listed within group are still valid!
529
if(grp && grp->isCustom() && !grp->validated())
531
QSet<QString> remList;
532
QSet<QString>::Iterator it(grp->families().begin()),
533
end(grp->families().end());
536
if(!itsFontList->hasFamily(*it))
541
itsGroupList->removeFromGroup(grp, *it);
546
void CKCmFontInst::print(bool all)
549
// In order to support printing of newly installed/enabled fonts, the actual printing
550
// is carried out by the kfontinst helper app. This way we know Qt's font list will be
552
if(!itsPrintProc || QProcess::NotRunning==itsPrintProc->state())
554
QString exe(KStandardDirs::findExe(QLatin1String(KFI_PRINTER), KStandardDirs::installPath("libexec")));
557
KMessageBox::error(this, i18n("Failed to locate font printer."));
560
QSet<Misc::TFont> fonts;
562
itsFontListView->getPrintableFonts(fonts, !all);
566
CPrintDialog dlg(this);
567
KConfigGroup cg(&itsConfig, CFG_GROUP);
569
if(dlg.exec(cg.readEntry(CFG_FONT_SIZE, 1)))
571
static const int constSizes[]={0, 12, 18, 24, 36, 48};
572
QSet<Misc::TFont>::ConstIterator it(fonts.begin()),
574
KTemporaryFile tmpFile;
575
bool useFile(fonts.count()>16),
580
itsPrintProc=new QProcess(this);
582
itsPrintProc->kill();
585
// If we have lots of fonts to print, pass kfontinst a tempory groups file to print
586
// instead of passing font by font...
591
QTextStream str(&tmpFile);
594
str << (*it).family << endl
595
<< (*it).styleInfo << endl;
597
args << "--embed" << QString().sprintf("0x%x", (unsigned int)window()->winId())
598
<< "--caption" << KGlobal::caption().toUtf8()
599
<< "--icon" << "preferences-desktop-font-installer"
600
<< "--size" << QString().setNum(constSizes[dlg.chosenSize() < 6 ? dlg.chosenSize() : 2])
601
<< "--listfile" << tmpFile.fileName()
606
KMessageBox::error(this, i18n("Failed to save list of fonts to print."));
612
args << "--embed" << QString().sprintf("0x%x", (unsigned int)window()->winId())
613
<< "--caption" << KGlobal::caption().toUtf8()
614
<< "--icon" << "preferences-desktop-font-installer"
615
<< "--size" << QString().setNum(constSizes[dlg.chosenSize()<6 ? dlg.chosenSize() : 2]);
618
args << "--pfont" << QString((*it).family.toUtf8()+','+QString().setNum((*it).styleInfo));
623
itsPrintProc->start(exe, args);
625
if(itsPrintProc->waitForStarted(1000))
628
tmpFile.setAutoRemove(false);
631
KMessageBox::error(this, i18n("Failed to start font printer."));
633
cg.writeEntry(CFG_FONT_SIZE, dlg.chosenSize());
637
KMessageBox::information(this, i18n("There are no printable fonts.\n"
638
"You can only print non-bitmap and enabled fonts."),
639
i18n("Cannot Print"));
644
void CKCmFontInst::deleteFonts()
646
CJobRunner::ItemList urls;
647
QStringList fontNames;
648
QSet<Misc::TFont> fonts;
650
itsDeletedFonts.clear();
651
itsFontListView->getFonts(urls, fontNames, &fonts, true);
654
KMessageBox::information(this, i18n("You did not select anything to delete."),
655
i18n("Nothing to Delete"));
658
QSet<Misc::TFont>::ConstIterator it(fonts.begin()),
663
itsDeletedFonts.insert((*it).family);
665
switch(fontNames.count())
670
doIt = KMessageBox::Yes==KMessageBox::warningYesNo(this,
671
i18n("<p>Do you really want to "
672
"delete</p><p>\'<b>%1</b>\'?</p>", fontNames.first()),
673
i18n("Delete Font"), KStandardGuiItem::del());
676
doIt = KMessageBox::Yes==KMessageBox::warningYesNoList(this,
677
i18np("Do you really want to delete this font?",
678
"Do you really want to delete these %1 fonts?",
680
fontNames, i18n("Delete Fonts"), KStandardGuiItem::del());
685
itsStatusLabel->setText(i18n("Deleting font(s)..."));
686
doCmd(CJobRunner::CMD_DELETE, urls);
691
void CKCmFontInst::moveFonts()
693
CJobRunner::ItemList urls;
694
QStringList fontNames;
696
itsDeletedFonts.clear();
697
itsFontListView->getFonts(urls, fontNames, NULL, true);
700
KMessageBox::information(this, i18n("You did not select anything to move."),
701
i18n("Nothing to Move"));
706
switch(fontNames.count())
711
doIt = KMessageBox::Yes==KMessageBox::warningYesNo(this,
712
i18n("<p>Do you really want to "
713
"move</p><p>\'<b>%1</b>\'?</p>", fontNames.first()),
714
i18n("Move Font"), KGuiItem(i18n("Move")));
717
doIt = KMessageBox::Yes==KMessageBox::warningYesNoList(this,
718
i18np("Do you really want to move this font?",
719
"Do you really want to move these %1 fonts?",
721
fontNames, i18n("Move Fonts"), KGuiItem(i18n("Move")));
726
itsStatusLabel->setText(i18n("Moving font(s)..."));
727
doCmd(CJobRunner::CMD_MOVE, urls, !itsGroupListView->isSystem());
732
void CKCmFontInst::zipGroup()
734
QModelIndex idx(itsGroupListView->currentIndex());
738
CGroupListItem *grp=static_cast<CGroupListItem *>(idx.internalPointer());
742
QString fileName=KFileDialog::getSaveFileName(grp->name(), "application/zip", this, i18n("Export Group"),
743
KFileDialog::ConfirmOverwrite);
745
if(!fileName.isEmpty())
749
if(zip.open(QIODevice::WriteOnly))
753
files=itsFontListView->getFiles();
757
QMap<QString, QString> map=Misc::getFontFileMap(files);
758
QMap<QString, QString>::ConstIterator it(map.constBegin()),
762
zip.addLocalFile(it.value(), it.key());
766
KMessageBox::error(this, i18n("No files?"));
769
KMessageBox::error(this, i18n("Failed to open %1 for writing", fileName));
775
void CKCmFontInst::enableFonts()
780
void CKCmFontInst::disableFonts()
785
void CKCmFontInst::addGroup()
788
QString name(KInputDialog::getText(i18n("Create New Group"),
789
i18n("Please enter the name of the new group:"),
790
i18n("New Group"), &ok, this));
792
if(ok && !name.isEmpty())
793
itsGroupList->createGroup(name);
796
void CKCmFontInst::removeGroup()
798
if(itsGroupList->removeGroup(itsGroupListView->currentIndex()))
802
void CKCmFontInst::enableGroup()
807
void CKCmFontInst::disableGroup()
812
void CKCmFontInst::changeText()
815
QRegExpValidator validator(QRegExp(".*"), 0L);
816
QString oldStr(itsPreview->engine()->getPreviewString()),
817
newStr(KInputDialog::getText(i18n("Preview Text"),
818
i18n("Please enter new text:"),
819
oldStr, &status, this, &validator));
821
if(status && oldStr!=newStr)
823
itsPreview->engine()->setPreviewString(newStr);
825
if(itsPreview->width()>6)
826
itsPreview->showFont();
827
itsPreviewList->refreshPreviews();
831
void CKCmFontInst::duplicateFonts()
833
CDuplicatesDialog(this, itsFontList).exec();
836
//void CKCmFontInst::validateFonts()
840
//void CKCmFontInst::downloadFonts()
844
void CKCmFontInst::print()
849
void CKCmFontInst::printGroup()
854
void CKCmFontInst::listingPercent(int p)
858
showInfo(i18n("Scanning font list..."));
859
itsListingProgress->show();
861
else if(100==p && p!=itsListingProgress->value())
863
removeDeletedFontsFromGroups();
865
QSet<QString> foundries;
867
itsFontList->getFoundries(foundries);
868
itsFilter->setFoundries(foundries);
870
itsListingProgress->hide();
871
itsFontListView->selectFirstFont();
873
itsListingProgress->setValue(p);
876
void CKCmFontInst::refreshFontList()
878
itsFontListView->refreshFilter();
882
void CKCmFontInst::refreshFamilies()
884
QSet<QString> enabledFamilies,
888
itsFontList->getFamilyStats(enabledFamilies, disabledFamilies, partialFamilies);
889
itsGroupList->updateStatus(enabledFamilies, disabledFamilies, partialFamilies);
893
void CKCmFontInst::showInfo(const QString &info)
896
if(itsLastStatusBarMsg.isEmpty())
900
itsStatusLabel->setText(itsLastStatusBarMsg);
901
itsLastStatusBarMsg=QString();
905
if(itsLastStatusBarMsg.isEmpty())
906
itsLastStatusBarMsg=itsStatusLabel->text();
907
itsStatusLabel->setText(info);
911
void CKCmFontInst::setStatusBar()
913
if(itsFontList->slowUpdates())
919
bool selectedEnabled=false,
920
selectedDisabled=false;
922
itsStatusLabel->setToolTip(QString());
923
if(0==itsFontList->families().count())
924
itsStatusLabel->setText(i18n("No fonts"));
927
itsFontListView->stats(enabled, disabled, partial);
928
itsFontListView->selectedStatus(selectedEnabled, selectedDisabled);
930
QString text(i18np("1 Font", "%1 Fonts", enabled+disabled+partial));
932
if(disabled||partial)
934
text+=i18n(" (<img src=\"%1\" />%2 <img src=\"%3\" />%4 <img src=\"%5\" />%6)",
935
KIconLoader::global()->iconPath("dialog-ok", -KIconLoader::SizeSmall),
937
KIconLoader::global()->iconPath("dialog-cancel", -KIconLoader::SizeSmall),
941
itsStatusLabel->setToolTip(i18n("<table>"
942
"<tr><td>Enabled fonts:</td><td>%1</td></tr>"
943
"<tr><td>Disabled fonts:</td><td>%2</td></tr>"
944
"<tr><td>Partially enabled fonts:</td><td>%3</td></tr>"
945
"<tr><td>Total fonts:</td><td>%4</td></tr>"
946
"</table>", enabled, disabled, partial, enabled+disabled+partial));
949
itsStatusLabel->setText(disabled||partial ? "<p>"+text+"</p>" : text);
952
CGroupListItem::EType type(itsGroupListView->getType());
954
bool isStd(CGroupListItem::CUSTOM==type);
956
itsAddFontControl->setEnabled(CGroupListItem::ALL==type||CGroupListItem::UNCLASSIFIED==type||
957
CGroupListItem::PERSONAL==type||CGroupListItem::SYSTEM==type);
958
itsDeleteGroupControl->setEnabled(isStd);
959
itsEnableGroupControl->setEnabled(disabled||partial);
960
itsDisableGroupControl->setEnabled(isStd && (enabled||partial));
962
itsGroupListView->controlMenu(itsDeleteGroupControl->isEnabled(),
963
itsEnableGroupControl->isEnabled(),
964
itsDisableGroupControl->isEnabled(), enabled||partial, enabled||disabled);
966
itsDeleteFontControl->setEnabled(selectedEnabled||selectedDisabled);
969
void CKCmFontInst::addFonts(const QSet<KUrl> &src)
971
if(src.count() && !itsGroupListView->isCustom())
979
switch(itsGroupListView->getType())
981
case CGroupListItem::ALL:
982
case CGroupListItem::UNCLASSIFIED:
983
switch(KMessageBox::questionYesNoCancel(this,
984
i18n("Do you wish to install the font(s) for personal use "
985
"(only available to you), or "
986
"system-wide (available to all users)?"),
987
i18n("Where to Install"), KGuiItem(i18n(KFI_KIO_FONTS_USER)),
988
KGuiItem(i18n(KFI_KIO_FONTS_SYS))))
990
case KMessageBox::Yes:
993
case KMessageBox::No:
997
case KMessageBox::Cancel:
1001
case CGroupListItem::PERSONAL:
1004
case CGroupListItem::SYSTEM:
1013
QSet<KUrl>::ConstIterator it,
1017
// Check if font has any associated AFM or PFM file...
1018
itsStatusLabel->setText(i18n("Looking for any associated files..."));
1022
itsProgress=new KProgressDialog(this, i18n("Scanning Files..."),
1023
i18n("Looking for additional files to install..."));
1024
itsProgress->setModal(true);
1025
itsProgress->setAutoReset(true);
1026
itsProgress->setAutoClose(true);
1029
itsProgress->setAllowCancel(false);
1030
itsProgress->setMinimumDuration(500);
1031
itsProgress->progressBar()->show();
1032
itsProgress->progressBar()->setRange(0, src.size());
1033
itsProgress->progressBar()->setValue(0);
1035
int steps=src.count()<200 ? 1 : src.count()/10;
1036
for(it=src.begin(); it!=end; ++it)
1038
KUrl::List associatedUrls;
1040
itsProgress->setLabelText(i18n("Looking for files associated with %1", (*it).prettyUrl()));
1041
itsProgress->progressBar()->setValue(itsProgress->progressBar()->value()+1);
1042
if(1==steps || 0==(itsProgress->progressBar()->value()%steps))
1044
bool dialogVisible(itsProgress->isVisible());
1045
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
1046
if(dialogVisible && !itsProgress->isVisible()) // User closed dialog! re-open!!!
1047
itsProgress->show();
1050
CJobRunner::getAssociatedUrls(*it, associatedUrls, false, this);
1053
KUrl::List::Iterator aIt(associatedUrls.begin()),
1054
aEnd(associatedUrls.end());
1056
for(; aIt!=aEnd; ++aIt)
1059
itsProgress->close();
1061
CJobRunner::ItemList installUrls;
1064
for(it=copy.begin(); it!=end; ++it)
1065
installUrls.append(*it);
1067
itsStatusLabel->setText(i18n("Installing font(s)..."));
1068
doCmd(CJobRunner::CMD_INSTALL, installUrls, system);
1072
void CKCmFontInst::removeDeletedFontsFromGroups()
1074
if(itsDeletedFonts.count())
1076
QSet<QString>::Iterator it(itsDeletedFonts.begin()),
1077
end(itsDeletedFonts.end());
1079
for(; it!=end; ++it)
1080
if(!itsFontList->hasFamily(*it))
1081
itsGroupList->removeFamily(*it);
1083
itsDeletedFonts.clear();
1087
void CKCmFontInst::selectGroup(CGroupListItem::EType grp)
1089
QModelIndex current(itsGroupListView->currentIndex());
1091
if(current.isValid())
1093
CGroupListItem *grpItem=static_cast<CGroupListItem *>(current.internalPointer());
1095
if(grpItem && grp==grpItem->type())
1098
itsGroupListView->selectionModel()->select(current,
1099
QItemSelectionModel::Deselect);
1102
QModelIndex idx(itsGroupList->index(grp));
1104
itsGroupListView->selectionModel()->select(idx, QItemSelectionModel::Select);
1105
itsGroupListView->setCurrentIndex(idx);
1107
itsFontListView->refreshFilter();
1111
void CKCmFontInst::toggleGroup(bool enable)
1113
QModelIndex idx(itsGroupListView->currentIndex());
1117
CGroupListItem *grp=static_cast<CGroupListItem *>(idx.internalPointer());
1120
toggleFonts(enable, grp->name());
1124
void CKCmFontInst::toggleFonts(bool enable, const QString &grp)
1126
CJobRunner::ItemList urls;
1129
itsFontListView->getFonts(urls, fonts, NULL, grp.isEmpty(), !enable, enable);
1132
KMessageBox::information(this,
1133
enable ? i18n("You did not select anything to enable.")
1134
: i18n("You did not select anything to disable."),
1135
enable ? i18n("Nothing to Enable") : i18n("Nothing to Disable"));
1137
toggleFonts(urls, fonts, enable, grp);
1140
void CKCmFontInst::toggleFonts(CJobRunner::ItemList &urls, const QStringList &fonts, bool enable,
1145
switch(fonts.count())
1150
doIt = KMessageBox::Yes==KMessageBox::warningYesNo(this,
1152
? enable ? i18n("<p>Do you really want to "
1153
"enable</p><p>\'<b>%1</b>\'?</p>", fonts.first())
1154
: i18n("<p>Do you really want to "
1155
"disable</p><p>\'<b>%1</b>\'?</p>", fonts.first())
1156
: enable ? i18n("<p>Do you really want to "
1157
"enable</p><p>\'<b>%1</b>\', "
1158
"contained within group \'<b>%2</b>\'?</p>",
1160
: i18n("<p>Do you really want to "
1161
"disable</p><p>\'<b>%1</b>\', "
1162
"contained within group \'<b>%2</b>\'?</p>",
1163
fonts.first(), grp),
1164
enable ? i18n("Enable Font") : i18n("Disable Font"),
1165
enable ? KGuiItem(i18n("Enable"), "enablefont", i18n("Enable Font"))
1166
: KGuiItem(i18n("Disable"), "disablefont", i18n("Disable Font")));
1169
doIt = KMessageBox::Yes==KMessageBox::warningYesNoList(this,
1171
? enable ? i18np("Do you really want to enable this font?",
1172
"Do you really want to enable these %1 fonts?",
1174
: i18np("Do you really want to disable this font?",
1175
"Do you really want to disable these %1 fonts?",
1177
: enable ? i18np("<p>Do you really want to enable this font "
1178
"contained within group \'<b>%2</b>\'?</p>",
1179
"<p>Do you really want to enable these %1 fonts "
1180
"contained within group \'<b>%2</b>\'?</p>",
1182
: i18np("<p>Do you really want to disable this font "
1183
"contained within group \'<b>%2</b>\'?</p>",
1184
"<p>Do you really want to disable these %1 fonts "
1185
"contained within group \'<b>%2</b>\'?</p>",
1188
enable ? i18n("Enable Fonts") : i18n("Disable Fonts"),
1189
enable ? KGuiItem(i18n("Enable"), "enablefont", i18n("Enable Fonts"))
1190
: KGuiItem(i18n("Disable"), "disablefont", i18n("Disable Fonts")));
1196
itsStatusLabel->setText(i18n("Enabling font(s)..."));
1198
itsStatusLabel->setText(i18n("Disabling font(s)..."));
1200
doCmd(enable ? CJobRunner::CMD_ENABLE : CJobRunner::CMD_DISABLE, urls);
1204
void CKCmFontInst::selectMainGroup()
1206
selectGroup(/*Misc::root()
1207
? */CGroupListItem::ALL/* : CGroupListItem::PERSONAL*/);
1210
void CKCmFontInst::doCmd(CJobRunner::ECommand cmd, const CJobRunner::ItemList &urls, bool system)
1212
itsFontList->setSlowUpdates(true);
1213
CJobRunner runner(this);
1215
connect(&runner, SIGNAL(configuring()), itsFontList, SLOT(unsetSlowUpdates()));
1216
runner.exec(cmd, urls, system);
1217
itsFontList->setSlowUpdates(false);
1218
CFcEngine::setDirty();
1222
itsFontListView->repaint();
1223
removeDeletedFontsFromGroups();
1229
#include "KCmFontInst.moc"