/*************************************************************************** templatestreeview.cpp - description ------------------- begin : Thu Dec 20 2001 copyright : (C) 2001-2004 by Andras Mantia ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; version 2 of the License. * * * ***************************************************************************/ #include #include #include #include // QT includes #include #include #include #include #include #include #include #include #include #include #include #include #include // KDE includes #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "templatestreeview.h" #include "copyto.h" #include "newtemplatedirdlg.h" #include "qextfileinfo.h" #include "quantanetaccess.h" #include "quantapropertiespage.h" #include "resource.h" #include "tagaction.h" #include "tagmaildlg.h" #define EXCLUDE ".*\\.tmpl$" #define TMPL ".tmpl" #define NONE "None" const TQString textMenu = I18N_NOOP("Insert as &Text"); const TQString binaryMenu = I18N_NOOP("Insert &Link to File"); const TQString docMenu = I18N_NOOP("&New Document Based on This"); const TQString siteMenu = I18N_NOOP("&Extract Site Template To..."); TQMap typeToi18n; TQMap i18nToType; //TemplatesTreeBranch implementation TemplatesTreeBranch::TemplatesTreeBranch(KFileTreeView *parent, const KURL& url, const TQString& name, const TQPixmap& pix, bool showHidden, KFileTreeViewItem *branchRoot) : BaseTreeBranch(parent, url, name, pix, showHidden, branchRoot) { } KFileTreeViewItem* TemplatesTreeBranch::createTreeViewItem(KFileTreeViewItem *parent, KFileItem *fileItem ) { BaseTreeViewItem *tvi = 0; if( parent && fileItem ) { KURL url = fileItem->url(); tvi = new BaseTreeViewItem( parent, fileItem, this ); if (tvi && fileItem->isDir()) { if (url.isLocalFile()) { TQDir dir (url.path(), "", TQDir::All); tvi->setExpandable(dir.count() != 2); // . and .. are always there } else { tvi->setExpandable(true); // we assume there is something } } else { url = static_cast(parent)->url(); } TQFileInfo dotFileInfo(url.path() + "/.dirinfo"); while ((!dotFileInfo.exists()) && (dotFileInfo.dirPath() != "/")) { dotFileInfo.setFile(TQFileInfo(dotFileInfo.dirPath()).dirPath()+"/.dirinfo"); } if (dotFileInfo.exists()) { TDEConfig *config = new TDEConfig(dotFileInfo.filePath()); TQString s = config->readEntry("Type"); tvi->setText(1, typeToi18n[s]); delete config; } } else kdDebug(24000) << "TemplatesTreeBranch::createTreeViewItem: Have no parent" << endl; return tvi; } TemplatesTreeView::TemplatesTreeView(TDEMainWindow *parent, const char *name ) : BaseTreeView(parent,name), m_projectDir(0), m_mainWindow(parent) { typeToi18n["text/all"] = i18n("Text Snippet"); typeToi18n["file/all"] = i18n("Binary File"); typeToi18n["template/all"] = i18n("Document Template"); typeToi18n["site/all"] = i18n("Site Template"); i18nToType[i18n("Text Snippet")] = "text/all"; i18nToType[i18n("Binary File")] = "file/all"; i18nToType[i18n("Document Template")] = "template/all"; i18nToType[i18n("Site Template")] = "site/all"; m_fileMenu = new TDEPopupMenu(this); m_openId = m_fileMenu->insertItem(i18n("Open"), this ,TQ_SLOT(slotInsert())); m_fileMenu->insertItem(SmallIcon("document-open"), i18n("&Open"), this ,TQ_SLOT(slotOpen())); m_fileMenu->insertItem(SmallIcon("mail-send"), i18n("Send in E&mail..."), this, TQ_SLOT(slotSendInMail())); m_fileMenu->insertItem(SmallIcon("network"), i18n("&Upload Template..."), this, TQ_SLOT(slotUploadTemplate())); m_insertFileInProject = m_fileMenu->insertItem(i18n("&Insert in Project..."), this, TQ_SLOT(slotInsertInProject())); m_menuClose = m_fileMenu->insertItem(SmallIcon("window-close"), i18n("Clos&e"), this, TQ_SLOT(slotClose())); m_fileMenu->insertSeparator(); m_fileMenu->insertItem(SmallIcon("edit-copy"), i18n("&Copy"), this, TQ_SLOT(slotCopy())); m_fileMenu->insertItem(SmallIcon("edit-delete"), i18n("&Delete"), this, TQ_SLOT(slotDelete())); m_fileMenu->insertSeparator(); m_fileMenu->insertItem(SmallIcon("application-vnd.tde.info"), i18n("&Properties"), this, TQ_SLOT(slotProperties())); m_folderMenu = new TDEPopupMenu(this); m_folderMenu->insertItem(SmallIcon("folder-new"), i18n("&New Folder..."), this, TQ_SLOT(slotNewDir())); m_folderMenu->insertItem(SmallIcon("mail-send"), i18n("Send in E&mail..."), this, TQ_SLOT(slotSendInMail())); m_folderMenu->insertItem(SmallIcon("network"), i18n("&Upload Template..."), this, TQ_SLOT(slotUploadTemplate())); m_downloadMenuId = m_folderMenu->insertItem(SmallIcon("network"), i18n("&Download Template..."), this, TQ_SIGNAL(downloadTemplate())); m_insertFolderInProject = m_folderMenu->insertItem(i18n("&Insert in Project..."), this, TQ_SLOT(slotInsertDirInProject())); m_folderMenu->insertSeparator(); m_folderMenu->insertItem(SmallIcon("edit-copy"), i18n("&Copy"), this, TQ_SLOT(slotCopy())); m_menuPasteFolder = m_folderMenu->insertItem(SmallIcon("edit-paste"), i18n("&Paste"), this, TQ_SLOT(slotPaste())); m_deleteMenuId = m_folderMenu->insertItem(SmallIcon("edit-delete"), i18n("&Delete"), this, TQ_SLOT(slotDelete())); m_folderMenu->insertSeparator(); m_folderMenu->insertItem(SmallIcon("application-vnd.tde.info"), i18n("&Properties"), this, TQ_SLOT(slotProperties())); m_reloadMenuId = m_folderMenu->insertItem(SmallIcon("document-revert"), i18n("&Reload"), this, TQ_SLOT(slotReload())); m_emptyAreaMenu = new TDEPopupMenu(this); m_emptyAreaMenu->insertItem(SmallIcon("network"), i18n("&Download Template..."), this, TQ_SIGNAL(downloadTemplate())); addColumn(i18n("Templates"), -1); addColumn(i18n("Group"), -1); globalURL.setPath(qConfig.globalDataDir + resourceDir + "templates/"); newBranch(globalURL); localURL.setPath(locateLocal("data", resourceDir + "templates/")); newBranch(localURL); connect(this, TQ_SIGNAL(contextMenu(TDEListView*, TQListViewItem*, const TQPoint&)), this, TQ_SLOT(slotMenu(TDEListView*, TQListViewItem*, const TQPoint&))); connect(this, TQ_SIGNAL(open(TQListViewItem *)), this, TQ_SLOT(slotSelectFile(TQListViewItem *))); setAcceptDrops(true); setSelectionMode(TQListView::Single); setDragEnabled(true); setSaveOpenFolder(true); restoreLayout( kapp->config(), className() ); // the restored size of the first column might be too large for the current content // we set it to 10 and the listview will adjust it to the size of the largest entry setColumnWidth(0, 10); } TemplatesTreeView::~TemplatesTreeView() { } KFileTreeBranch* TemplatesTreeView::newBranch(const KURL& url) { BaseTreeBranch *newBrnch; if (url == globalURL) { newBrnch = new TemplatesTreeBranch(this, url, i18n("Global Templates"), SmallIcon("ttab")); } else { if (url == localURL) newBrnch = new TemplatesTreeBranch(this, url, i18n("Local Templates"), SmallIcon("ttab")); else { newBrnch = new TemplatesTreeBranch(this, url, i18n("Project Templates"), SmallIcon("ptab")); m_projectDir = newBrnch; } } newBrnch->excludeFilterRx.setPattern(EXCLUDE); addBranch(newBrnch); if (url.isLocalFile()) { TQDir dir (url.path(), "", TQDir::All); newBrnch->root()->setExpandable(dir.count() != 2); // . and .. are always there } else { newBrnch->root()->setExpandable(true); // we assume there is something } return newBrnch; } /** No descriptions */ void TemplatesTreeView::slotInsertInDocument() { KURL url = filterTemplate(); if (QuantaCommon::checkMimeGroup(url, "text")) { emit insertFile(url); } else { if (QuantaCommon::denyBinaryInsert(this) == KMessageBox::Yes) { emit insertFile(url); } } } void TemplatesTreeView::slotMenu(TDEListView*, TQListViewItem *item, const TQPoint &point) { if (!item) { m_emptyAreaMenu->popup(point); return; } setSelected(item, true); bool hasProject = !m_projectName.isEmpty(); m_folderMenu->setItemVisible(m_insertFolderInProject, hasProject); m_fileMenu->setItemVisible(m_insertFileInProject, hasProject); KFileTreeViewItem *curItem = currentKFileTreeViewItem(); if ( curItem->isDir() ) { m_folderMenu->setItemVisible(m_menuPasteFolder, isPathInClipboard()); if ( curItem == curItem->branch()->root()) { m_folderMenu ->setItemVisible(m_deleteMenuId, false); m_folderMenu ->setItemVisible(m_reloadMenuId, true); m_folderMenu ->setItemVisible(m_downloadMenuId, true); } else { m_folderMenu ->setItemVisible(m_deleteMenuId, true); m_folderMenu ->setItemVisible(m_reloadMenuId, false); m_folderMenu ->setItemVisible(m_downloadMenuId, false); } m_folderMenu ->popup(point); } else { m_dirInfo = readDirInfo(); TQString menuText = ""; if (m_dirInfo.mimeType.upper().contains("TEXT")) menuText = i18n(textMenu.utf8()); else if (m_dirInfo.mimeType.upper().contains("FILE")) menuText = i18n(binaryMenu.utf8()); else if (m_dirInfo.mimeType.upper().contains("TEMPLATE")) menuText = i18n(docMenu.utf8()); else if (m_dirInfo.mimeType.upper().contains("SITE")) menuText = i18n(siteMenu.utf8()); if (menuText.isEmpty()) { m_fileMenu->setItemVisible(m_openId, false); } else { m_fileMenu->setItemVisible(m_openId, true); m_fileMenu->changeItem(m_openId, menuText); } m_fileMenu->setItemVisible(m_menuClose, isFileOpen(currentURL())); m_fileMenu->popup( point); } } /** No descriptions */ void TemplatesTreeView::slotNewDocument() { KURL url = filterTemplate(); if (QuantaCommon::checkMimeGroup(url, "text") || QuantaCommon::denyBinaryInsert(this) == KMessageBox::Yes) { TQListViewItem *item = currentItem(); if (item ) { if ( currentKFileTreeViewItem() != currentKFileTreeViewItem()->branch()->root()) { emit openFile(KURL()); emit insertFile(url); } } } } /** Insert the template as text, image, new document. */ void TemplatesTreeView::slotInsert() { TQString menuText = m_fileMenu->text(m_openId); if (menuText == i18n(textMenu.utf8())) slotInsertInDocument(); else if (menuText == i18n(binaryMenu.utf8())) slotInsertTag(); else if (menuText == i18n(docMenu.utf8())) slotNewDocument(); if (menuText == i18n(siteMenu.utf8())) slotExtractSiteTemplate(); } void TemplatesTreeView::slotSelectFile(TQListViewItem *item) { if ( !item ) return; KFileTreeViewItem *kftvItem = currentKFileTreeViewItem(); if ( !kftvItem ) return; if ( !kftvItem->isDir() ) { m_dirInfo = readDirInfo(); /* if (m_dirInfo.mimeType.upper().contains("SITE")) { slotExtractSiteTemplate(); return; }*/ if (expandArchiv(kftvItem)) return; if (m_dirInfo.mimeType.upper().contains("TEXT")) slotInsertInDocument(); else if (m_dirInfo.mimeType.upper().contains("FILE")) slotInsertTag(); else if (m_dirInfo.mimeType.upper().contains("TEMPLATE")) slotNewDocument(); } } void TemplatesTreeView::slotOpen() { BaseTreeView::slotSelectFile(currentItem()); } /** No descriptions */ void TemplatesTreeView::slotNewDir() { NewTemplateDirDlg *createDirDlg = new NewTemplateDirDlg(this,i18n("Create New Template Folder").ascii()); createDirDlg->typesCombo->insertItem(typeToi18n["text/all"]); createDirDlg->typesCombo->insertItem(typeToi18n["file/all"]); createDirDlg->typesCombo->insertItem(typeToi18n["template/all"]); createDirDlg->typesCombo->insertItem(typeToi18n["site/all"]); m_dirInfo = readDirInfo(); if (m_dirInfo.mimeType.isEmpty()) { createDirDlg->parentAttr->setText(i18n("&Inherit parent attribute (nothing)")); } else { createDirDlg->parentAttr->setText(i18n("&Inherit parent attribute (%1)").arg(typeToi18n[m_dirInfo.mimeType])); } if (createDirDlg->exec()) { TQDir dir; TQString startDir = ""; if ( !currentKFileTreeViewItem()->isDir() ) { startDir = currentURL().path(); } else { startDir = currentURL().path() + "/dummy_file"; } startDir = TQFileInfo(startDir).dirPath(); if (!dir.mkdir(startDir+"/"+createDirDlg->dirName->text())) { KMessageBox::error(this,i18n("Error while creating the new folder.\n \ Maybe you do not have permission to write in the %1 folder.").arg(startDir)); return; } if (! createDirDlg->parentAttr->isChecked()) { m_dirInfo.mimeType = i18nToType[createDirDlg->typesCombo->currentText()]; m_dirInfo.preText = ""; m_dirInfo.postText = ""; writeDirInfo(startDir+"/"+createDirDlg->dirName->text()+"/.dirinfo"); } } } /** No descriptions */ TQDragObject * TemplatesTreeView::dragObject () { // don't drag folders if ( ! currentKFileTreeViewItem() || currentKFileTreeViewItem()->isDir() ) return 0; m_dirInfo = readDirInfo(); if(!m_dirInfo.mimeType.isEmpty()) // only drag when the template type is specified { KURLDrag *drag = new KURLDrag(KURL::List(currentURL()), this); return drag; } return 0; } /** No descriptions */ void TemplatesTreeView::contentsDropEvent(TQDropEvent *e) { if (KURLDrag::canDecode(e)) { // handles url drops BaseTreeView::contentsDropEvent(e); return; } if (TQTextDrag::canDecode(e)) { TQListViewItem *item = itemAt(contentsToViewport(e->pos())); if (item) { KURL dest; if ( currentKFileTreeViewItem()->isDir() ) dest = currentURL(); else dest = currentURL().directory(false); dest.adjustPath(+1); TQString content; TQTextDrag::decode(e, content); KURL url =KURLRequesterDlg::getURL( dest.path() + "template.txt", this, i18n("Save selection as template file:")); if ( !url.isEmpty() ) { //now save the file KTempFile* tempFile = new KTempFile(tmpDir); tempFile->setAutoDelete(true); tempFile->textStream()->setEncoding(TQTextStream::UnicodeUTF8); *(tempFile->textStream()) << content; tempFile->close(); bool proceed = true; if (QExtFileInfo::exists(url, false, this)) { proceed = KMessageBox::warningContinueCancel(this, i18n("The file %1 already exists.
Do you want to overwrite it?
").arg(url.prettyURL(0, KURL::StripFileProtocol)),i18n("Overwrite"), i18n("Overwrite")) == KMessageBox::Continue; } if (proceed) { if (!QuantaNetAccess::upload(tempFile->name(), url, m_parent, false)) { KMessageBox::error(this,i18n("Could not write to file %1.
Check if you have rights to write there or that your connection is working.
").arg(url.prettyURL(0, KURL::StripFileProtocol))); } } delete tempFile; } } } // must be done to reset timer etc. BaseTreeView::contentsDropEvent(e); } /** Reads a .dirinfo file from the selected item's path */ DirInfo TemplatesTreeView::readDirInfo(const TQString& dir) { DirInfo dirInfo; TQString startDir = dir; if (startDir.isEmpty()) { if (!currentKFileTreeViewItem()->isDir()) { startDir = currentURL().path(); } else { startDir = currentURL().path() + "/dummy_file"; } } TQFileInfo dotFileInfo(TQFileInfo(startDir).dirPath()+"/.dirinfo"); while ((!dotFileInfo.exists()) && (dotFileInfo.dirPath() != "/")) { dotFileInfo.setFile(TQFileInfo(dotFileInfo.dirPath()).dirPath()+"/.dirinfo"); } TDEConfig *config = new TDEConfig(dotFileInfo.filePath()); dirInfo.mimeType = config->readEntry("Type"); dirInfo.preText = config->readEntry("PreText"); dirInfo.postText = config->readEntry("PostText"); dirInfo.usePrePostText = config->readBoolEntry("UsePrePostText", false); delete config; return dirInfo; } /** Writes a .dirinfo file from the selected item's path */ bool TemplatesTreeView::writeDirInfo(const TQString& m_dirInfoFile) { TQString startDir = ""; if (m_dirInfoFile.isEmpty()) { if ( !currentKFileTreeViewItem()->isDir() ) { startDir = currentURL().path(); } else { startDir = currentURL().path() + "/dummy_file"; } } else { startDir = m_dirInfoFile; } TQFileInfo dotFileInfo(TQFileInfo(startDir).dirPath()+"/.dirinfo"); bool success = false; TDEConfig *config = new TDEConfig(dotFileInfo.filePath()); if (!config->isReadOnly()) { config->writeEntry("Type", m_dirInfo.mimeType); config->writeEntry("PreText", m_dirInfo.preText); config->writeEntry("PostText", m_dirInfo.postText); config->writeEntry("UsePrePostText", m_dirInfo.usePrePostText); config->sync(); success = true; } delete config; return success; } void TemplatesTreeView::slotProperties() { if ( !currentItem() ) return; KURL url = currentURL(); KPropertiesDialog *propDlg = new KPropertiesDialog( url, this, 0L, false, false); //autodeletes itself //Always add the Quanta directory page TQFrame *quantaDirPage = propDlg->addPage(i18n("Quanta Template")); TQVBoxLayout *topLayout = new TQVBoxLayout( quantaDirPage); m_quantaProperties = new QuantaPropertiesPage( quantaDirPage, i18n("Quanta").ascii() ); m_quantaProperties->typesCombo->insertItem(typeToi18n["text/all"]); m_quantaProperties->typesCombo->insertItem(typeToi18n["file/all"]); m_quantaProperties->typesCombo->insertItem(typeToi18n["template/all"]); m_quantaProperties->typesCombo->insertItem(typeToi18n["site/all"]); m_dirInfo = readDirInfo(); m_quantaProperties->typesCombo->setCurrentItem(typeToi18n[m_dirInfo.mimeType]); TDEIO::UDSEntry entry; TDEIO::NetAccess::stat(url, entry, this); KFileItem fItem(entry, url); TQString permissions = fItem.permissionsString(); TQString userName; struct passwd *user = getpwuid(getuid()); if (user) userName = TQString::fromLocal8Bit(user->pw_name); TQString groupName; gid_t gid = getgid(); struct group *ge = getgrgid(gid); if (ge) { groupName = TQString::fromLocal8Bit(ge->gr_name); if (groupName.isEmpty()) groupName.sprintf("%d", ge->gr_gid); } else groupName.sprintf("%d", gid); bool writable = false; if (permissions[8] == 'w' || (permissions[2] == 'w' && userName == fItem.user()) || (permissions[5] == 'w' && groupName == fItem.group())) writable = true; TQString startDir = ""; if (!currentKFileTreeViewItem()->isDir()) { startDir = url.path(); m_quantaProperties->typeStack->raiseWidget(1); } else { startDir = url.path() + "/dummy_file"; m_quantaProperties->typeStack->raiseWidget(0); } m_quantaProperties->setEnabled(writable); TQFileInfo dotFileInfo(TQFileInfo(startDir).dirPath()+"/.dirinfo"); m_parentDirInfo = readDirInfo(dotFileInfo.dirPath()); if (!dotFileInfo.exists() || m_dirInfo.mimeType == m_parentDirInfo.mimeType) { m_quantaProperties->parentAttr->setChecked(true); } if (m_parentDirInfo.mimeType.isEmpty()) { m_quantaProperties->parentAttr->setText(i18n("&Inherit parent attribute (nothing)")); } else { m_quantaProperties->parentAttr->setText(i18n("&Inherit parent attribute (%1)").arg(typeToi18n[m_parentDirInfo.mimeType])); } m_quantaProperties->preTextEdit->setText(m_dirInfo.preText); m_quantaProperties->postTextEdit->setText(m_dirInfo.postText); if (m_dirInfo.usePrePostText) { m_quantaProperties->usePrePostText->setChecked(true); } topLayout->addWidget( m_quantaProperties ); connect( propDlg, TQ_SIGNAL( applied() ), this , TQ_SLOT( slotPropertiesApplied()) ); TQString name = url.path() + TMPL; TDEConfig config(name); config.setGroup("Filtering"); name = config.readEntry("Action", NONE); if ( name == NONE ) name = i18n(NONE); uint pos = 0; uint j = 1; m_quantaProperties->actionCombo->insertItem(i18n(NONE)); TQString tmpStr; TDEActionCollection *ac = m_mainWindow->actionCollection(); uint acCount = ac->count(); for (uint i = 0; i < acCount; i++) { TagAction *action = dynamic_cast(ac->action(i)); if (action) { TQDomElement el = action->data(); TQString type = el.attribute("type", "tag"); if (type == "script") { tmpStr = action->text().replace(TQRegExp("\\&(?!\\&)"),""); m_quantaProperties->actionCombo->insertItem(tmpStr); if (tmpStr == name) pos = j; j++; } } } m_quantaProperties->actionCombo->setCurrentItem(pos); //If the item is a file, add the Quanta file info page addFileInfoPage(propDlg); if (propDlg->exec() == TQDialog::Accepted) { //TODO: move to slotPropertiesApplied if (url != propDlg->kurl()) { itemRenamed(url, propDlg->kurl()); } } } /** No descriptions */ void TemplatesTreeView::slotPropertiesApplied() { DirInfo m_localDirInfo; TQString typeString = ""; if (!m_quantaProperties->parentAttr->isChecked()) { m_localDirInfo.mimeType = m_quantaProperties->typesCombo->currentText(); typeString = m_localDirInfo.mimeType; m_localDirInfo.mimeType = i18nToType[m_localDirInfo.mimeType]; } else { if (m_dirInfo.mimeType != m_parentDirInfo.mimeType) typeString = typeToi18n[m_parentDirInfo.mimeType]; m_localDirInfo.mimeType = m_parentDirInfo.mimeType; } m_localDirInfo.usePrePostText = m_quantaProperties->usePrePostText->isChecked(); m_localDirInfo.preText = m_quantaProperties->preTextEdit->text(); m_localDirInfo.postText = m_quantaProperties->postTextEdit->text(); if ( (m_dirInfo.mimeType != m_localDirInfo.mimeType) || (m_dirInfo.preText != m_localDirInfo.preText) || (m_dirInfo.postText != m_localDirInfo.postText)) { m_dirInfo.mimeType = m_localDirInfo.mimeType; m_dirInfo.preText = m_localDirInfo.preText; m_dirInfo.postText = m_localDirInfo.postText; m_dirInfo.usePrePostText = m_localDirInfo.usePrePostText; bool result = writeDirInfo(); KFileTreeViewItem *item = currentKFileTreeViewItem(); if (item && !item->isDir()) item = static_cast(item->parent()); if (result && item && !typeString.isEmpty()) { if (item->parent() && item->isDir()) item->setText(1, typeString); updateTypeDescription(item, typeString); } } writeTemplateInfo(); } void TemplatesTreeView::updateTypeDescription(KFileTreeViewItem *item, const TQString &typeString) { if (item->parent() && item->isDir()) item->setText(1, typeString); KFileTreeViewItem *curItem = static_cast(item->firstChild()); while (curItem && curItem != static_cast(item->nextSibling())) { if (!curItem->isDir()) { curItem->setText(1, typeString); } else { TQFileInfo dotFileInfo(curItem->url().path() + "/.dirinfo"); if (!dotFileInfo.exists()) updateTypeDescription(curItem, typeString); } curItem = static_cast(curItem->nextSibling()); } } /** No descriptions */ void TemplatesTreeView::slotInsertTag() { if (currentItem()) { m_dirInfo = readDirInfo(); KURL url = currentURL(); emit insertTag( url, m_dirInfo); } } /* Attention, this is called whenever a drop on a kate window happens! */ void TemplatesTreeView::slotDragInsert(TQDropEvent *e) { if (KURLDrag::canDecode(e)) { KURL::List fileList; KURLDrag::decode(e, fileList); if(fileList.empty()) return; KURL url = fileList.front(); TQString localFileName; if (url.isLocalFile()) { localFileName = url.path(); m_dirInfo = readDirInfo(localFileName); } TQString mimeType = KMimeType::findByURL(url)->name(); /* First, see if the type of the file is specified in the .dirinfo file */ if(m_dirInfo.mimeType.isEmpty()) { // no .dirinfo file present, so we insert it as tag emit insertTag(url, m_dirInfo); } else { if(m_dirInfo.mimeType == "text/all") // default to inserting in document { if(!mimeType.contains("text", false) && QuantaCommon::denyBinaryInsert(this) != KMessageBox::Yes) { return; } emit insertFile(KURL::fromPathOrURL( localFileName )); } if(m_dirInfo.mimeType == "file/all") { // whatever this is, insert it with a tag (image or link or prefix/postfix) emit insertTag(KURL::fromPathOrURL( localFileName ), m_dirInfo); } else if(m_dirInfo.mimeType == "template/all") { if(!mimeType.contains("text", false) && QuantaCommon::denyBinaryInsert(this) != KMessageBox::Yes) { return; } emit openFile(KURL()); emit insertFile(KURL::fromPathOrURL( localFileName )); } } } else if (TQTextDrag::canDecode(e)) { TQString s; TQTextDrag::decode(e, s); KMessageBox::information(this,s, "Decode"); } } void TemplatesTreeView::slotNewProjectLoaded(const TQString &projectName, const KURL &baseURL, const KURL &templateURL) { BaseTreeView::slotNewProjectLoaded(projectName, baseURL, templateURL); // set m_projectName and m_projectBaseURL if (m_projectDir) removeBranch(m_projectDir); if (!templateURL.isEmpty()) { newBranch(templateURL); } } /*! \fn TemplatesTreeView::writeTemplateInfo() */ void TemplatesTreeView::writeTemplateInfo() { TQString fileName = currentURL().path() + TMPL; TDEConfig config(fileName); config.setGroup("Filtering"); if ( m_quantaProperties->actionCombo->currentText() == i18n(NONE) ) config.writeEntry("Action", NONE); else config.writeEntry("Action", m_quantaProperties->actionCombo->currentText()); config.sync(); } void TemplatesTreeView::slotPaste() { if (currentItem()) { TQClipboard *cb = TQApplication::clipboard(); KURL::List list( TQStringList::split( TQChar('\n'), cb->text() ) ); KURL url; uint j = list.count(); for (uint i = 0; i < j; i++) { url = list[i]; url.setFileName(url.fileName() + TMPL); if (url.isLocalFile() && TQFileInfo(url.path()).exists()) list += url; } url = currentURL(); if ( ! currentKFileTreeViewItem()->isDir() ) url.setFileName(""); // don't paste on files but in dirs TDEIO::Job *job = TDEIO::copy( list, url); connect( job, TQ_SIGNAL( result( TDEIO::Job *) ), this , TQ_SLOT( slotJobFinished( TDEIO::Job *) ) ); } } void TemplatesTreeView::slotDelete() { if (currentItem()) { KURL url = currentURL(); TQString msg; if ( currentKFileTreeViewItem()->isDir() ) msg = i18n("Do you really want to delete folder \n%1 ?\n").arg(url.path()); else msg = i18n("Do you really want to delete file \n%1 ?\n").arg(url.path()); if ( KMessageBox::warningContinueCancel(this, msg, TQString(), KStdGuiItem::del()) == KMessageBox::Continue ) { TDEIO::Job *job = TDEIO::del(url); connect( job, TQ_SIGNAL( result( TDEIO::Job *) ), this , TQ_SLOT( slotJobFinished( TDEIO::Job *) ) ); url.setFileName(url.fileName()+ TMPL); if ( TQFileInfo(url.path()).exists() ) { TDEIO::Job *job2 = TDEIO::del(url); connect( job2, TQ_SIGNAL( result( TDEIO::Job *) ), this , TQ_SLOT( slotJobFinished( TDEIO::Job *) ) ); }; } } } /** Filters the template through and action, and returns the modified/filtered template file */ KURL TemplatesTreeView::filterTemplate() { KURL url = currentURL(); TQString name = url.path() + TMPL; TDEConfig config(name); config.setGroup("Filtering"); name = config.readEntry("Action", NONE); TagAction *filterAction = 0L; TDEActionCollection *ac = m_mainWindow->actionCollection(); uint acCount = ac->count(); TQString tmpStr; for (uint i = 0; i < acCount; i++) { TagAction *action = dynamic_cast(ac->action(i)); if (action) { TQDomElement el = action->data(); TQString type = el.attribute("type", "tag"); tmpStr = action->text(); tmpStr.replace(TQRegExp("\\&(?!\\&)"),""); if (type == "script" && tmpStr == name) { filterAction = action; } } } if (filterAction) { KTempFile* tempFile = new KTempFile(tmpDir); filterAction->setOutputFile(tempFile->file()); filterAction->setInputFileName(url.path()); filterAction->execute(true); filterAction->setOutputFile(0L); filterAction->setInputFileName(TQString()); tempFile->close(); tempFileList.append(tempFile); url.setPath(tempFile->name()); } return url; } TQString TemplatesTreeView::createTemplateTarball() { KURL url = currentURL(); KURL dirURL (url); if (!currentKFileTreeViewItem()->isDir()) dirURL.setPath(dirURL.directory(false)); KTempDir* tempDir = new KTempDir(tmpDir); tempDir->setAutoDelete(true); tempDirList.append(tempDir); TQString tempFileName=tempDir->name() + url.fileName() + ".tgz"; //pack the files into a .tgz file KTar tar(tempFileName, "application/x-gzip"); tar.open(IO_WriteOnly); // tar.setOrigFileName(""); KURL::List files; if ( ! currentKFileTreeViewItem()->isDir() ) files.append(url); else { files = QExtFileInfo::allFiles(dirURL, "*", this) ; dirURL = dirURL.upURL(); } for ( KURL::List::Iterator it_f = files.begin(); it_f != files.end(); ++it_f ) { if (!(*it_f).fileName(false).isEmpty()) { url = QExtFileInfo::toRelative( (*it_f), dirURL) ; TQFile file((*it_f).path()); file.open(IO_ReadOnly); TQByteArray bArray = file.readAll(); tar.writeFile(url.path(), "user", "group", bArray.size(), bArray.data()); file.close(); }; } tar.close(); return tempFileName; } void TemplatesTreeView::slotSendInMail() { if ( ! currentKFileTreeViewItem() ) return; TQStringList attachmentFile; attachmentFile += createTemplateTarball(); TagMailDlg *mailDlg = new TagMailDlg( this, i18n("Send template in email").ascii() ); TQString toStr; TQString message = i18n("Hi,\n This is a Quanta Plus [http://quanta.kdewebdev.org] template tarball.\n\nHave fun.\n"); TQString titleStr; TQString subjectStr; mailDlg->TitleLabel->setText(i18n("Content:")); /* mailDlg->titleEdit->setFixedHeight(60); mailDlg->titleEdit->setVScrollBarMode(TQTextEdit::Auto); mailDlg->titleEdit->setHScrollBarMode(TQTextEdit::Auto);*/ if ( mailDlg->exec() ) { if ( !mailDlg->lineEmail->text().isEmpty()) { toStr = mailDlg->lineEmail->text(); subjectStr = (mailDlg->lineSubject->text().isEmpty())?i18n("Quanta Plus Template"):mailDlg->lineSubject->text(); if ( !mailDlg->titleEdit->text().isEmpty()) message = mailDlg->titleEdit->text(); } else { KMessageBox::error(this,i18n("No destination address was specified.\n Sending is aborted."),i18n("Error Sending Email")); delete mailDlg; return; } kapp->invokeMailer(toStr, TQString(), TQString(), subjectStr, message, TQString(), attachmentFile); } delete mailDlg; } void TemplatesTreeView::slotUploadTemplate() { if ( ! currentKFileTreeViewItem() ) return; emit uploadTemplate(createTemplateTarball()); } bool TemplatesTreeView::acceptDrag(TQDropEvent* e ) const { return (BaseTreeView::acceptDrag(e) || TQTextDrag::canDecode(e)); } void TemplatesTreeView::slotExtractSiteTemplate() { TQString startDir = m_projectBaseURL.url(); if (startDir.isEmpty()) startDir = TQDir::homeDirPath(); bool error = false; KURLRequesterDlg urlRequester(startDir, i18n("Target folder"), this, "req", true); urlRequester.urlRequester()->setMode(KFile::Directory); if (urlRequester.exec()) { KURL targetURL = urlRequester.selectedURL(); KURL url = currentURL(); TQString tempFile; if (TDEIO::NetAccess::download(url, tempFile, this)) { KTar tar(tempFile); if (tar.open(IO_ReadOnly)) { const KArchiveDirectory *directory = tar.directory(); if (targetURL.protocol() == "file") directory->copyTo(targetURL.path(), true); else { KTempDir* tempDir = new KTempDir(tmpDir); tempDir->setAutoDelete(true); TQString tempDirName = tempDir->name(); directory->copyTo(tempDirName, true); TQStringList entries = directory->entries(); KURL::List fileList; for (TQStringList::Iterator it = entries.begin(); it != entries.end(); ++it) fileList.append(KURL::fromPathOrURL(tempDirName + "/" + *it)); if (!TDEIO::NetAccess::dircopy(fileList, targetURL, this)) error = true; TDEIO::NetAccess::del(KURL().fromPathOrURL(tempDirName), this); delete tempDir; } tar.close(); } else error = true; TDEIO::NetAccess::removeTempFile(tempFile); if (!m_projectBaseURL.isEmpty() && !QExtFileInfo::toRelative(targetURL, m_projectBaseURL).url().startsWith(".")) { if (KMessageBox::questionYesNo(this, i18n("You have extracted the site template to a folder which is not under your main project folder.\nDo you want to copy the folder into the main project folder?"), TQString(), i18n("Copy Folder"), i18n("Do Not Copy")) == KMessageBox::Yes) { emit insertDirInProject(targetURL); } } } else error = true; if (error) KMessageBox::error(this, i18n("Some error happened while extracting the %1 site template file.
Check that you have write permission for %2 and that there is enough free space in your temporary folder.
").arg(url.prettyURL(0, KURL::StripFileProtocol)).arg(targetURL.prettyURL(0, KURL::StripFileProtocol))); } } #include "templatestreeview.moc"