27#include "KoTemplateChooseDia.h"
30#include <tdefiledialog.h>
31#include <tdeinstance.h>
32#include <KoFilterManager.h>
33#include <KoTemplates.h>
34#include <KoDocument.h>
35#include <tdemainwindow.h>
38#include <kpushbutton.h>
39#include <kjanuswidget.h>
40#include <tdeglobalsettings.h>
42#include <tdefileiconview.h>
43#include <tdefileitem.h>
44#include <tdemessagebox.h>
45#include <tdeapplication.h>
46#include <tdeaboutdata.h>
48#include <tqapplication.h>
50#include <tqtabwidget.h>
51#include <tqcombobox.h>
52#include <tqcheckbox.h>
54#include <tqobjectlist.h>
55#include <tqvgroupbox.h>
58class MyFileDialog :
public KFileDialog
62 const TQString& startDir=0,
63 const TQString& filter =0,
67 : KFileDialog (startDir, filter, parent,
name, modal),
68 m_slotOkCalled( false ) {}
72 setResult( TQDialog::Accepted );
73 return KFileDialog::selectedURL();
80 KURL url = currentURL();
81 if ( url.isLocalFile() )
83 ok = TQFile::exists( url.path() );
95 m_slotOkCalled =
true;
96 KFileDialog::slotOk();
98 bool slotOkCalled()
const {
return m_slotOkCalled; }
102 virtual void accept() {
104 KFileDialog::accept();
107 virtual void reject() {
108 KFileDialog::reject();
109 emit cancelClicked();
119class KoTemplateChooseDiaPrivate {
121 KoTemplateChooseDiaPrivate(
const TQCString& templateType, TDEInstance* instance,
122 const TQCString &format,
123 const TQString &nativeName,
124 const TQStringList& extraNativeMimeTypes,
126 m_templateType(templateType), m_instance(instance), m_format(format),
127 m_nativeName(nativeName), m_extraNativeMimeTypes( extraNativeMimeTypes ),
128 m_dialogType(dialogType), tree(0),
129 m_nostartupdlg( false ),
130 m_mainwidget(0), m_nodiag( 0 )
132 m_returnType = KoTemplateChooseDia::Empty;
135 ~KoTemplateChooseDiaPrivate() {}
137 TQCString m_templateType;
138 TDEInstance* m_instance;
140 TQString m_nativeName;
141 TQStringList m_extraNativeMimeTypes;
144 KoTemplateTree *tree;
146 TQString m_templateName;
147 TQString m_fullTemplateName;
153 TQWidget *m_mainwidget;
156 TQCheckBox *m_nodiag;
159 KJanusWidget * m_jwidget;
160 KFileIconView *m_recent;
161 TQVGroupBox * boxdescription;
162 KTextEdit * textedit;
165 MyFileDialog *m_filedialog;
168 TQTabWidget* tabWidget;
170 TQWidget* existingTab;
180KoTemplateChooseDia::KoTemplateChooseDia(TQWidget *parent,
const char *name, TDEInstance* instance,
181 const TQCString &format,
182 const TQString &nativeName,
183 const TQStringList &extraNativeMimeTypes,
184 const DialogType &dialogType,
185 const TQCString& templateType) :
189 d =
new KoTemplateChooseDiaPrivate(
194 extraNativeMimeTypes,
199 cancel->setAutoDefault(
false);
200 ok->setDefault(
true);
203 if (!templateType.isNull() && !templateType.isEmpty() && dialogType!=NoTemplates)
204 d->tree =
new KoTemplateTree(templateType, instance,
true);
206 d->m_mainwidget = makeMainWidget();
208 d->m_templateName =
"";
209 d->m_fullTemplateName =
"";
210 d->m_returnType = Cancel;
215KoTemplateChooseDia::~KoTemplateChooseDia()
223static bool cancelQuits() {
226 return onlyDoc && onlyMainWindow && kapp->instanceName() !=
"koshell";
231 const TQCString& templateType,
234 const TQString nativeName = instance->aboutData()->programName();
239 return choose( instance, file, format, nativeName, extraNativeMimeTypes,
240 dialogType, templateType, parent );
244 const TQCString &format,
245 const TQString &nativeName,
246 const TQStringList& extraNativeMimeTypes,
247 const DialogType &dialogType,
248 const TQCString& templateType,
252 parent,
"Choose", instance, format,
253 nativeName, extraNativeMimeTypes, dialogType, templateType );
257 if (dlg->noStartupDlg())
265 dlg->resize( 700, 480 );
266 if ( dlg->exec() == TQDialog::Accepted )
277bool KoTemplateChooseDia::noStartupDlg()
const {
278 return d->m_nostartupdlg;
283 return d->m_templateName;
287 return d->m_fullTemplateName;
291 return d->m_returnType;
295 return d->m_dialogType;
300void KoTemplateChooseDia::setupRecentDialog(TQWidget * widgetbase, TQGridLayout * layout)
305 d->m_recent->setSorting(
static_cast<TQDir::SortSpec
>( TQDir::Time | TQDir::Reversed ) );
306 layout->addWidget(d->m_recent,0,0);
308 TQString oldGroup = d->m_instance->config()->group();
309 d->m_instance->config()->setGroup(
"RecentFiles" );
314 TQString key=TQString(
"File%1" ).arg( i );
315 value=d->m_instance->config()->readPathEntry( key );
316 if ( !value.isEmpty() ) {
319 if ( s.endsWith(
"]") )
321 int pos = s.find(
"[");
322 s = s.mid( pos + 1, s.length() - pos - 2);
326 if(!url.isLocalFile() || TQFile::exists(url.path())) {
327 KFileItem *item =
new KFileItem( KFileItem::Unknown, KFileItem::Unknown, url );
328 d->m_recent->insertItem(item);
332 }
while ( !value.isEmpty() || i<=10 );
334 d->m_instance->config()->setGroup( oldGroup );
335 d->m_recent->showPreviews();
337 connect(d->m_recent, TQ_SIGNAL( doubleClicked ( TQIconViewItem * ) ),
338 this, TQ_SLOT( recentSelected( TQIconViewItem * ) ) );
344void KoTemplateChooseDia::setupFileDialog(TQWidget * widgetbase, TQGridLayout * layout)
346 TQString dir = TQString();
347 TQPoint point( 0, 0 );
349 d->m_filedialog=
new MyFileDialog(dir,
355 layout->addWidget(d->m_filedialog,0,0);
356 d->m_filedialog->reparent( widgetbase , point );
359 TQObjectList *l = d->m_filedialog->queryList(
"TQPushButton" );
360 TQObjectListIt childit( *l );
362 while ( (obj = childit.current()) != 0 ) {
364 ((TQPushButton*)obj)->hide();
368 d->m_filedialog->setSizeGripEnabled (
false );
371 TQStringList::Iterator mimeFilterIt = mimeFilter.at( 1 );
372 for ( TQStringList::ConstIterator it = d->m_extraNativeMimeTypes.begin();
373 it != d->m_extraNativeMimeTypes.end(); ++it ) {
374 mimeFilterIt = mimeFilter.insert( mimeFilterIt, *it );
377 d->m_filedialog->setMimeFilter( mimeFilter );
379 connect(d->m_filedialog, TQ_SIGNAL(
okClicked() ),
380 this, TQ_SLOT (
slotOk() ));
389void KoTemplateChooseDia::setupTemplateDialog(TQWidget * widgetbase, TQGridLayout * layout)
392 d->m_jwidget =
new KJanusWidget(
396 layout->addWidget(d->m_jwidget,0,0);
398 d->boxdescription =
new TQVGroupBox(
399 i18n(
"Selected Template"),
402 layout->addWidget(d->boxdescription, 1, 0 );
405 TDEConfigGroup grp( d->m_instance->config(),
"TemplateChooserDialog" );
406 int templateNum = grp.readNumEntry(
"TemplateTab", -1 );
407 TQString templateName = grp.readPathEntry(
"TemplateName" );
408 if ( templateName.isEmpty() && d->tree->defaultTemplate() )
409 templateName = d->tree->defaultTemplate()->name();
412 TQIconViewItem * itemtoselect = 0;
415 int entriesnumber = 0;
416 int defaultTemplateGroup = -1;
418 for ( KoTemplateGroup *group = d->tree->first(); group!=0L; group=d->tree->next() )
420 if (group->isHidden())
423 if ( d->tree->defaultGroup() == group )
424 defaultTemplateGroup = entriesnumber;
426 TQFrame * frame = d->m_jwidget->addPage (
429 group->first()->loadPicture(d->m_instance));
431 TQGridLayout * layout =
new TQGridLayout(frame);
432 KoTCDIconCanvas *canvas =
new KoTCDIconCanvas( frame );
433 layout->addWidget(canvas,0,0);
435 canvas->setBackgroundColor( colorGroup().base() );
436 canvas->setResizeMode(TQIconView::Adjust);
437 canvas->setWordWrapIconText(
true );
440 TQIconViewItem * tempitem = canvas->load(group, templateName, d->m_instance);
442 itemtoselect = tempitem;
445 canvas->setSelectionMode(TQIconView::Single);
447 connect( canvas, TQ_SIGNAL( clicked ( TQIconViewItem * ) ),
448 this, TQ_SLOT( currentChanged( TQIconViewItem * ) ) );
450 connect( canvas, TQ_SIGNAL( doubleClicked( TQIconViewItem * ) ),
451 this, TQ_SLOT( chosen(TQIconViewItem *) ) );
456 d->boxdescription->setInsideMargin ( 3 );
457 d->boxdescription->setInsideSpacing ( 3 );
459 d->textedit =
new KTextEdit( d->boxdescription );
460 d->textedit->setReadOnly(1);
461 d->textedit->setText(descriptionText(i18n(
"Empty Document"), i18n(
"Creates an empty document")));
462 d->textedit->setLineWidth(0);
463 d->textedit->setMaximumHeight(50);
467 d->m_jwidget->hide();
470 if (entriesnumber >= templateNum && templateNum != -1 )
471 d->m_jwidget->showPage(templateNum);
472 else if ( defaultTemplateGroup != -1)
473 d->m_jwidget->showPage(defaultTemplateGroup);
477 currentChanged(itemtoselect);
480 TQString translatedstring = i18n(
"Always start %1 with the selected template").arg(d->m_nativeName);
482 d->m_nodiag =
new TQCheckBox ( translatedstring , widgetbase);
483 layout->addWidget(d->m_nodiag, 2, 0);
484 TQString startwithoutdialog = grp.readEntry(
"NoStartDlg" );
485 bool ischecked = startwithoutdialog == TQString(
"yes");
489 if (d->m_dialogType == Everything)
491 d->m_nodiag->setChecked( ischecked );
495 d->m_nodiag->setTristate();
496 d->m_nodiag->setNoChange();
502void KoTemplateChooseDia::setupDialog()
505 TQGridLayout *maingrid=
new TQGridLayout( d->m_mainwidget, 1, 1, 2, 6);
506 TDEConfigGroup grp( d->m_instance->config(),
"TemplateChooserDialog" );
508 if (d->m_dialogType == Everything)
512 if (grp.readEntry(
"NoStartDlg" ) == TQString(
"yes") )
514 d->m_nostartupdlg =
true;
515 d->m_returnType = Empty;
518 if (grp.readEntry(
"LastReturnType") == TQString(
"Empty") )
522 d->m_templateName = grp.readPathEntry(
"TemplateName" );
523 d->m_fullTemplateName = grp.readPathEntry(
"FullTemplateName" );
526 if (!TQFile::exists(d->m_fullTemplateName))
529 if (d->m_fullTemplateName.length() < 2)
532 d->m_returnType = Template;
539 d->tabWidget =
new TQTabWidget( d->m_mainwidget,
"tabWidget" );
540 maingrid->addWidget( d->tabWidget, 0, 0 );
543 d->newTab =
new TQWidget( d->tabWidget,
"newTab" );
544 d->tabWidget->insertTab( d->newTab, i18n(
"&Create Document" ) );
548 d->existingTab =
new TQWidget( d->tabWidget,
"existingTab" );
549 d->tabWidget->insertTab( d->existingTab, i18n(
"Open &Existing Document" ) );
550 TQGridLayout * existingTabLayout =
new TQGridLayout( d->existingTab, 1, 1, 0,
KDialog::spacingHint());
553 d->recentTab =
new TQWidget( d->tabWidget,
"recentTab" );
554 d->tabWidget->insertTab( d->recentTab, i18n(
"Open &Recent Document" ) );
557 setupTemplateDialog(d->newTab, newTabLayout);
558 setupFileDialog(d->existingTab, existingTabLayout);
559 setupRecentDialog(d->recentTab, recentTabLayout);
561 TQString tabhighlighted = grp.readEntry(
"LastReturnType");
562 if ( tabhighlighted ==
"Template" )
563 d->tabWidget->setCurrentPage(0);
564 else if (tabhighlighted ==
"File" )
565 d->tabWidget->setCurrentPage(2);
567 d->tabWidget->setCurrentPage(0);
573 if (d->m_dialogType == NoTemplates)
575 setupFileDialog(d->m_mainwidget, maingrid);
578 if (d->m_dialogType == OnlyTemplates)
581 setupTemplateDialog(d->m_mainwidget, maingrid);
588void KoTemplateChooseDia::currentChanged( TQIconViewItem * item)
592 TQIconView* canvas = item->iconView();
595 d->textedit->setText( descriptionText(
597 ((KoTCDIconViewItem *) item)->getDescr()
602 canvas->setSelected(item,1,0);
605 d->m_templateName = item->text();
606 d->m_fullTemplateName = ((KoTCDIconViewItem *) item)->getFName();
612void KoTemplateChooseDia::chosen(TQIconViewItem * item)
617 currentChanged(item);
624void KoTemplateChooseDia::recentSelected( TQIconViewItem * item)
640 TDEConfigGroup grp( d->m_instance->config(),
"TemplateChooserDialog" );
641 static const char*
const s_returnTypes[] = { 0 ,
"Template",
"File",
"Empty" };
642 if ( d->m_returnType <= Empty )
644 grp.writeEntry(
"LastReturnType", TQString::fromLatin1(s_returnTypes[d->m_returnType]) );
645 if (d->m_returnType == Template)
647 grp.writeEntry(
"TemplateTab", d->m_jwidget->activePageIndex() );
648 grp.writePathEntry(
"TemplateName", d->m_templateName );
649 grp.writePathEntry(
"FullTemplateName", d->m_fullTemplateName);
656 if (d->m_nodiag->state() == TQButton::On) {
657 grp.writeEntry(
"NoStartDlg",
"yes");
659 else if (d->m_nodiag->state() == TQButton::Off) {
660 grp.writeEntry(
"NoStartDlg",
"no");
666 kdWarning(30003) <<
"Unsupported template chooser result: " << d->m_returnType << endl;
667 grp.writeEntry(
"LastReturnType", TQString() );
675bool KoTemplateChooseDia::collectInfo()
680 bool newTabSelected =
false;
681 if ( d->m_dialogType == Everything)
682 if ( d->tabWidget->currentPage() == d->newTab )
683 newTabSelected =
true;
686 if ( d->m_dialogType==OnlyTemplates || newTabSelected )
689 if (d->m_templateName.length() > 0)
690 d->m_returnType = Template;
692 d->m_returnType=Empty;
696 else if ( d->m_dialogType != OnlyTemplates )
699 if (d->m_dialogType == Everything && d->tabWidget->currentPage() == d->recentTab)
702 KFileItem * item = d->m_recent->currentFileItem();
705 KURL url = item->url();
706 if(url.isLocalFile() && !TQFile::exists(url.path()))
711 d->m_fullTemplateName = url.url();
712 d->m_returnType = File;
717 if ( !d->m_filedialog->slotOkCalled() )
718 d->m_filedialog->slotOk();
719 KURL url = d->m_filedialog->currentURL();
720 d->m_fullTemplateName = url.url();
721 d->m_returnType = File;
722 return d->m_filedialog->checkURL();
727 d->m_returnType=Empty;
733TQString KoTemplateChooseDia::descriptionText(
const TQString &name,
const TQString &description)
735 TQString descrText(i18n(
"Name:"));
736 descrText +=
" " +
name;
738 descrText += i18n(
"Description:");
739 if (description.isEmpty())
740 descrText +=
" " + i18n(
"No description available");
742 descrText +=
" " + description;
748TQIconViewItem * KoTCDIconCanvas::load( KoTemplateGroup *group,
const TQString& name, TDEInstance* instance )
750 TQIconViewItem * itemtoreturn = 0;
752 for (KoTemplate *t=group->first(); t!=0L; t=group->next()) {
755 TQIconViewItem *item =
new KoTCDIconViewItem(
758 t->loadPicture(instance),
762 if (name == t->name())
767 item->setKey(t->name());
768 item->setDragEnabled(
false);
769 item->setDropEnabled(
false);
777KoTCDRecentFilesIconView::~KoTCDRecentFilesIconView()
782void KoTCDRecentFilesIconView::showToolTip( TQIconViewItem* item )
793 const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo();
794 TQString toolTipText = fi->url().prettyURL( 0, KURL::StripFileProtocol );
795 toolTip =
new TQLabel( TQString::fromLatin1(
" %1 ").arg(toolTipText), 0,
797 WStyle_StaysOnTop | WStyle_Customize | WStyle_NoBorder | WStyle_Tool | WX11BypassWM );
798 toolTip->setFrameStyle( TQFrame::Plain | TQFrame::Box );
799 toolTip->setLineWidth( 1 );
800 toolTip->setAlignment( AlignLeft | AlignTop );
801 toolTip->move( TQCursor::pos() + TQPoint( 14, 14 ) );
802 toolTip->adjustSize();
803 TQRect screen = TQApplication::desktop()->screenGeometry(
804 TQApplication::desktop()->screenNumber(TQCursor::pos()));
805 if (toolTip->x()+toolTip->width() > screen.right()) {
806 toolTip->move(toolTip->x()+screen.right()-toolTip->x()-toolTip->width(), toolTip->y());
808 if (toolTip->y()+toolTip->height() > screen.bottom()) {
809 toolTip->move(toolTip->x(), screen.bottom()-toolTip->y()-toolTip->height()+toolTip->y());
811 toolTip->setFont( TQToolTip::font() );
812 toolTip->setPalette( TQToolTip::palette(),
true );
816void KoTCDRecentFilesIconView::removeToolTip()
825 KFileIconView::hideEvent( ev );
828#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 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)