27#include "KoTemplateChooseDia.h"
30#include <tdeversion.h>
31#include <tdefiledialog.h>
32#include <tdeinstance.h>
33#include <KoFilterManager.h>
34#include <KoTemplates.h>
35#include <KoDocument.h>
36#include <tdemainwindow.h>
39#include <kpushbutton.h>
40#include <kjanuswidget.h>
41#include <tdeglobalsettings.h>
43#include <tdefileiconview.h>
44#include <tdefileitem.h>
45#include <tdemessagebox.h>
46#include <tdeapplication.h>
47#include <tdeaboutdata.h>
49#include <tqapplication.h>
51#include <tqtabwidget.h>
52#include <tqcombobox.h>
53#include <tqcheckbox.h>
55#include <tqobjectlist.h>
56#include <tqvgroupbox.h>
59class MyFileDialog :
public KFileDialog
63 const TQString& startDir=0,
64 const TQString& filter =0,
68 : KFileDialog (startDir, filter, parent,
name, modal),
69 m_slotOkCalled( false ) {}
73 setResult( TQDialog::Accepted );
74 return KFileDialog::selectedURL();
81 KURL url = currentURL();
82 if ( url.isLocalFile() )
84 ok = TQFile::exists( url.path() );
96 m_slotOkCalled =
true;
97 KFileDialog::slotOk();
99 bool slotOkCalled()
const {
return m_slotOkCalled; }
103 virtual void accept() {
105 KFileDialog::accept();
108 virtual void reject() {
109 KFileDialog::reject();
110 emit cancelClicked();
120class KoTemplateChooseDiaPrivate {
122 KoTemplateChooseDiaPrivate(
const TQCString& templateType, TDEInstance* instance,
123 const TQCString &format,
124 const TQString &nativeName,
125 const TQStringList& extraNativeMimeTypes,
127 m_templateType(templateType), m_instance(instance), m_format(format),
128 m_nativeName(nativeName), m_extraNativeMimeTypes( extraNativeMimeTypes ),
129 m_dialogType(dialogType), tree(0),
130 m_nostartupdlg( false ),
131 m_mainwidget(0), m_nodiag( 0 )
133 m_returnType = KoTemplateChooseDia::Empty;
136 ~KoTemplateChooseDiaPrivate() {}
138 TQCString m_templateType;
139 TDEInstance* m_instance;
141 TQString m_nativeName;
142 TQStringList m_extraNativeMimeTypes;
145 KoTemplateTree *tree;
147 TQString m_templateName;
148 TQString m_fullTemplateName;
154 TQWidget *m_mainwidget;
157 TQCheckBox *m_nodiag;
161 KFileIconView *m_recent;
162 TQVGroupBox * boxdescription;
166 MyFileDialog *m_filedialog;
169 TQTabWidget* tabWidget;
171 TQWidget* existingTab;
181KoTemplateChooseDia::KoTemplateChooseDia(TQWidget *parent,
const char *name, TDEInstance* instance,
182 const TQCString &format,
183 const TQString &nativeName,
184 const TQStringList &extraNativeMimeTypes,
185 const DialogType &dialogType,
186 const TQCString& templateType) :
190 d =
new KoTemplateChooseDiaPrivate(
195 extraNativeMimeTypes,
200 cancel->setAutoDefault(
false);
201 ok->setDefault(
true);
204 if (!templateType.isNull() && !templateType.isEmpty() && dialogType!=NoTemplates)
205 d->tree =
new KoTemplateTree(templateType, instance,
true);
207 d->m_mainwidget = makeMainWidget();
209 d->m_templateName =
"";
210 d->m_fullTemplateName =
"";
211 d->m_returnType = Cancel;
216KoTemplateChooseDia::~KoTemplateChooseDia()
224static bool cancelQuits() {
227 return onlyDoc && onlyMainWindow && kapp->instanceName() !=
"koshell";
232 const TQCString& templateType,
235 const TQString nativeName = instance->aboutData()->programName();
240 return choose( instance, file, format, nativeName, extraNativeMimeTypes,
241 dialogType, templateType, parent );
245 const TQCString &format,
246 const TQString &nativeName,
247 const TQStringList& extraNativeMimeTypes,
248 const DialogType &dialogType,
249 const TQCString& templateType,
253 parent,
"Choose", instance, format,
254 nativeName, extraNativeMimeTypes, dialogType, templateType );
258 if (dlg->noStartupDlg())
266 dlg->resize( 700, 480 );
267 if ( dlg->exec() == TQDialog::Accepted )
278bool KoTemplateChooseDia::noStartupDlg()
const {
279 return d->m_nostartupdlg;
284 return d->m_templateName;
288 return d->m_fullTemplateName;
292 return d->m_returnType;
296 return d->m_dialogType;
301void KoTemplateChooseDia::setupRecentDialog(TQWidget * widgetbase, TQGridLayout * layout)
306 d->m_recent->setSorting(
static_cast<TQDir::SortSpec
>( TQDir::Time | TQDir::Reversed ) );
307 layout->addWidget(d->m_recent,0,0);
309 TQString oldGroup = d->m_instance->config()->group();
310 d->m_instance->config()->setGroup(
"RecentFiles" );
315 TQString key=TQString(
"File%1" ).arg( i );
316 value=d->m_instance->config()->readPathEntry( key );
317 if ( !value.isEmpty() ) {
320 if ( s.endsWith(
"]") )
322 int pos = s.find(
"[");
323 s = s.mid( pos + 1, s.length() - pos - 2);
327 if(!url.isLocalFile() || TQFile::exists(url.path())) {
328 KFileItem *item =
new KFileItem( KFileItem::Unknown, KFileItem::Unknown, url );
329 d->m_recent->insertItem(item);
333 }
while ( !value.isEmpty() || i<=10 );
335 d->m_instance->config()->setGroup( oldGroup );
336 d->m_recent->showPreviews();
338 connect(d->m_recent, TQ_SIGNAL( doubleClicked ( TQIconViewItem * ) ),
339 this, TQ_SLOT( recentSelected( TQIconViewItem * ) ) );
345void KoTemplateChooseDia::setupFileDialog(TQWidget * widgetbase, TQGridLayout * layout)
347 TQString dir = TQString();
348 TQPoint point( 0, 0 );
350 d->m_filedialog=
new MyFileDialog(dir,
356 layout->addWidget(d->m_filedialog,0,0);
357 d->m_filedialog->reparent( widgetbase , point );
360 TQObjectList *l = d->m_filedialog->queryList(
"TQPushButton" );
361 TQObjectListIt childit( *l );
363 while ( (obj = childit.current()) != 0 ) {
365 ((TQPushButton*)obj)->hide();
369 d->m_filedialog->setSizeGripEnabled (
false );
372 TQStringList::Iterator mimeFilterIt = mimeFilter.at( 1 );
373 for ( TQStringList::ConstIterator it = d->m_extraNativeMimeTypes.begin();
374 it != d->m_extraNativeMimeTypes.end(); ++it ) {
375 mimeFilterIt = mimeFilter.insert( mimeFilterIt, *it );
378 d->m_filedialog->setMimeFilter( mimeFilter );
380 connect(d->m_filedialog, TQ_SIGNAL(
okClicked() ),
381 this, TQ_SLOT (
slotOk() ));
390void KoTemplateChooseDia::setupTemplateDialog(TQWidget * widgetbase, TQGridLayout * layout)
397 layout->addWidget(d->m_jwidget,0,0);
399 d->boxdescription =
new TQVGroupBox(
400 i18n(
"Selected Template"),
403 layout->addWidget(d->boxdescription, 1, 0 );
406 TDEConfigGroup grp( d->m_instance->config(),
"TemplateChooserDialog" );
407 int templateNum = grp.readNumEntry(
"TemplateTab", -1 );
408 TQString templateName = grp.readPathEntry(
"TemplateName" );
409 if ( templateName.isEmpty() && d->tree->defaultTemplate() )
410 templateName = d->tree->defaultTemplate()->name();
413 TQIconViewItem * itemtoselect = 0;
416 int entriesnumber = 0;
417 int defaultTemplateGroup = -1;
419 for ( KoTemplateGroup *group = d->tree->first(); group!=0L; group=d->tree->next() )
421 if (group->isHidden())
424 if ( d->tree->defaultGroup() == group )
425 defaultTemplateGroup = entriesnumber;
427 TQFrame * frame = d->m_jwidget->addPage (
430 group->first()->loadPicture(d->m_instance));
432 TQGridLayout * layout =
new TQGridLayout(frame);
434 layout->addWidget(canvas,0,0);
436 canvas->setBackgroundColor( colorGroup().base() );
437 canvas->setResizeMode(TQIconView::Adjust);
438 canvas->setWordWrapIconText(
true );
441 TQIconViewItem * tempitem = canvas->load(group, templateName, d->m_instance);
443 itemtoselect = tempitem;
446 canvas->setSelectionMode(TQIconView::Single);
448 connect( canvas, TQ_SIGNAL( clicked ( TQIconViewItem * ) ),
449 this, TQ_SLOT( currentChanged( TQIconViewItem * ) ) );
451 connect( canvas, TQ_SIGNAL( doubleClicked( TQIconViewItem * ) ),
452 this, TQ_SLOT( chosen(TQIconViewItem *) ) );
457 d->boxdescription->setInsideMargin ( 3 );
458 d->boxdescription->setInsideSpacing ( 3 );
460 d->textedit =
new KTextEdit( d->boxdescription );
461 d->textedit->setReadOnly(1);
462 d->textedit->setText(descriptionText(i18n(
"Empty Document"), i18n(
"Creates an empty document")));
463 d->textedit->setLineWidth(0);
464 d->textedit->setMaximumHeight(50);
468 d->m_jwidget->hide();
471 if (entriesnumber >= templateNum && templateNum != -1 )
472 d->m_jwidget->showPage(templateNum);
473 else if ( defaultTemplateGroup != -1)
474 d->m_jwidget->showPage(defaultTemplateGroup);
478 currentChanged(itemtoselect);
481 TQString translatedstring = i18n(
"Always start %1 with the selected template").arg(d->m_nativeName);
483 d->m_nodiag =
new TQCheckBox ( translatedstring , widgetbase);
484 layout->addWidget(d->m_nodiag, 2, 0);
485 TQString startwithoutdialog = grp.readEntry(
"NoStartDlg" );
486 bool ischecked = startwithoutdialog == TQString(
"yes");
490 if (d->m_dialogType == Everything)
492 d->m_nodiag->setChecked( ischecked );
496 d->m_nodiag->setTristate();
497 d->m_nodiag->setNoChange();
503void KoTemplateChooseDia::setupDialog()
506 TQGridLayout *maingrid=
new TQGridLayout( d->m_mainwidget, 1, 1, 2, 6);
507 TDEConfigGroup grp( d->m_instance->config(),
"TemplateChooserDialog" );
509 if (d->m_dialogType == Everything)
513 if (grp.readEntry(
"NoStartDlg" ) == TQString(
"yes") )
515 d->m_nostartupdlg =
true;
516 d->m_returnType = Empty;
519 if (grp.readEntry(
"LastReturnType") == TQString(
"Empty") )
523 d->m_templateName = grp.readPathEntry(
"TemplateName" );
524 d->m_fullTemplateName = grp.readPathEntry(
"FullTemplateName" );
527 if (!TQFile::exists(d->m_fullTemplateName))
530 if (d->m_fullTemplateName.length() < 2)
533 d->m_returnType = Template;
540 d->tabWidget =
new TQTabWidget( d->m_mainwidget,
"tabWidget" );
541 maingrid->addWidget( d->tabWidget, 0, 0 );
544 d->newTab =
new TQWidget( d->tabWidget,
"newTab" );
545 d->tabWidget->insertTab( d->newTab, i18n(
"&Create Document" ) );
549 d->existingTab =
new TQWidget( d->tabWidget,
"existingTab" );
550 d->tabWidget->insertTab( d->existingTab, i18n(
"Open &Existing Document" ) );
551 TQGridLayout * existingTabLayout =
new TQGridLayout( d->existingTab, 1, 1, 0,
KDialog::spacingHint());
554 d->recentTab =
new TQWidget( d->tabWidget,
"recentTab" );
555 d->tabWidget->insertTab( d->recentTab, i18n(
"Open &Recent Document" ) );
558 setupTemplateDialog(d->newTab, newTabLayout);
559 setupFileDialog(d->existingTab, existingTabLayout);
560 setupRecentDialog(d->recentTab, recentTabLayout);
562 TQString tabhighlighted = grp.readEntry(
"LastReturnType");
563 if ( tabhighlighted ==
"Template" )
564 d->tabWidget->setCurrentPage(0);
565 else if (tabhighlighted ==
"File" )
566 d->tabWidget->setCurrentPage(2);
568 d->tabWidget->setCurrentPage(0);
574 if (d->m_dialogType == NoTemplates)
576 setupFileDialog(d->m_mainwidget, maingrid);
579 if (d->m_dialogType == OnlyTemplates)
582 setupTemplateDialog(d->m_mainwidget, maingrid);
589void KoTemplateChooseDia::currentChanged( TQIconViewItem * item)
593 TQIconView* canvas = item->iconView();
596 d->textedit->setText( descriptionText(
598 ((KoTCDIconViewItem *) item)->getDescr()
603 canvas->setSelected(item,1,0);
606 d->m_templateName = item->text();
607 d->m_fullTemplateName = ((KoTCDIconViewItem *) item)->getFName();
613void KoTemplateChooseDia::chosen(TQIconViewItem * item)
618 currentChanged(item);
625void KoTemplateChooseDia::recentSelected( TQIconViewItem * item)
641 TDEConfigGroup grp( d->m_instance->config(),
"TemplateChooserDialog" );
642 static const char*
const s_returnTypes[] = { 0 ,
"Template",
"File",
"Empty" };
643 if ( d->m_returnType <= Empty )
645 grp.writeEntry(
"LastReturnType", TQString::fromLatin1(s_returnTypes[d->m_returnType]) );
646 if (d->m_returnType == Template)
648 grp.writeEntry(
"TemplateTab", d->m_jwidget->activePageIndex() );
649 grp.writePathEntry(
"TemplateName", d->m_templateName );
650 grp.writePathEntry(
"FullTemplateName", d->m_fullTemplateName);
657 if (d->m_nodiag->state() == TQButton::On) {
658 grp.writeEntry(
"NoStartDlg",
"yes");
660 else if (d->m_nodiag->state() == TQButton::Off) {
661 grp.writeEntry(
"NoStartDlg",
"no");
667 kdWarning(30003) <<
"Unsupported template chooser result: " << d->m_returnType << endl;
668 grp.writeEntry(
"LastReturnType", TQString() );
676bool KoTemplateChooseDia::collectInfo()
681 bool newTabSelected =
false;
682 if ( d->m_dialogType == Everything)
683 if ( d->tabWidget->currentPage() == d->newTab )
684 newTabSelected =
true;
687 if ( d->m_dialogType==OnlyTemplates || newTabSelected )
690 if (d->m_templateName.length() > 0)
691 d->m_returnType = Template;
693 d->m_returnType=Empty;
697 else if ( d->m_dialogType != OnlyTemplates )
700 if (d->m_dialogType == Everything && d->tabWidget->currentPage() == d->recentTab)
703 KFileItem * item = d->m_recent->currentFileItem();
706 KURL url = item->url();
707 if(url.isLocalFile() && !TQFile::exists(url.path()))
712 d->m_fullTemplateName = url.url();
713 d->m_returnType = File;
718 if ( !d->m_filedialog->slotOkCalled() )
719 d->m_filedialog->slotOk();
720 KURL url = d->m_filedialog->currentURL();
721 d->m_fullTemplateName = url.url();
722 d->m_returnType = File;
723 return d->m_filedialog->checkURL();
728 d->m_returnType=Empty;
734TQString KoTemplateChooseDia::descriptionText(
const TQString &name,
const TQString &description)
736 TQString descrText(i18n(
"Name:"));
737 descrText +=
" " +
name;
739 descrText += i18n(
"Description:");
740 if (description.isEmpty())
741 descrText +=
" " + i18n(
"No description available");
743 descrText +=
" " + description;
749TQIconViewItem * KoTCDIconCanvas::load( KoTemplateGroup *group,
const TQString& name, TDEInstance* instance )
751 TQIconViewItem * itemtoreturn = 0;
753 for (KoTemplate *t=group->first(); t!=0L; t=group->next()) {
756 TQIconViewItem *item =
new KoTCDIconViewItem(
759 t->loadPicture(instance),
763 if (name == t->name())
768 item->setKey(t->name());
769 item->setDragEnabled(
false);
770 item->setDropEnabled(
false);
778KoTCDRecentFilesIconView::~KoTCDRecentFilesIconView()
783void KoTCDRecentFilesIconView::showToolTip( TQIconViewItem* item )
794 const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo();
795 TQString toolTipText = fi->url().prettyURL( 0, KURL::StripFileProtocol );
796 toolTip =
new TQLabel( TQString::fromLatin1(
" %1 ").arg(toolTipText), 0,
798 WStyle_StaysOnTop | WStyle_Customize | WStyle_NoBorder | WStyle_Tool | WX11BypassWM );
799 toolTip->setFrameStyle( TQFrame::Plain | TQFrame::Box );
800 toolTip->setLineWidth( 1 );
801 toolTip->setAlignment( AlignLeft | AlignTop );
802 toolTip->move( TQCursor::pos() + TQPoint( 14, 14 ) );
803 toolTip->adjustSize();
804 TQRect screen = TQApplication::desktop()->screenGeometry(
805 TQApplication::desktop()->screenNumber(TQCursor::pos()));
806 if (toolTip->x()+toolTip->width() > screen.right()) {
807 toolTip->move(toolTip->x()+screen.right()-toolTip->x()-toolTip->width(), toolTip->y());
809 if (toolTip->y()+toolTip->height() > screen.bottom()) {
810 toolTip->move(toolTip->x(), screen.bottom()-toolTip->y()-toolTip->height()+toolTip->y());
812 toolTip->setFont( TQToolTip::font() );
813 toolTip->setPalette( TQToolTip::palette(),
true );
817void KoTCDRecentFilesIconView::removeToolTip()
826 KFileIconView::hideEvent( ev );
829#include "KoTemplateChooseDia.moc"
virtual void slotCancel()
void setButtonCancel(const KGuiItem &item=KStdGuiItem::cancel())
virtual void setCaption(const TQString &caption)
static void error(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, int options=Notify)
static TQCString readNativeFormatMimeType(TDEInstance *instance=0)
Used by KoApplication, and by KoMainWindow, when no document exists yet.
static TQStringList readExtraNativeMimeTypes(TDEInstance *instance=0)
Used by KoMainWindow, when no document exists yet.
static TQPtrList< KoDocument > * documentList()
static TQStringList mimeFilter()
The same method as KoFilterManager::mimeFilter but suited for KoShell.
Our reimplementation of TDEIconCanvas used within the template-chooser dialog.
Our reimplementation of KFileIconView used as the "recent files" view within the template-chooser dia...
virtual void hideEvent(TQHideEvent *)
Reimplemented to remove an eventual tooltip.
This class is used to show the template dialog on startup.
virtual void slotOk()
Activated when the Ok button has been clicked.
ReturnType
The Dialog returns one of these values depending on the input of the user.
static ReturnType choose(TDEInstance *instance, TQString &file, const DialogType &dialogType, const TQCString &templateType, TQWidget *parent)
This is the static method you'll normally use to show the dialog.
DialogType
To configure the dialog you have to use this enum.
TQString getFullTemplate() const
Method to get the "full" template (path+template)
ReturnType getReturnType() const
The ReturnType (call this one after exec())
DialogType getDialogType() const
The dialogType - normally you won't need this one.
TQString getTemplate() const
Method to get the current template.
static TQPtrList< TDEMainWindow > * memberList
const char * name(StdAction id)