summaryrefslogtreecommitdiff
path: root/sd/source/ui/dlg/TemplateScanner.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/dlg/TemplateScanner.cxx')
-rw-r--r--sd/source/ui/dlg/TemplateScanner.cxx500
1 files changed, 0 insertions, 500 deletions
diff --git a/sd/source/ui/dlg/TemplateScanner.cxx b/sd/source/ui/dlg/TemplateScanner.cxx
deleted file mode 100644
index 0b7898840..000000000
--- a/sd/source/ui/dlg/TemplateScanner.cxx
+++ /dev/null
@@ -1,500 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_sd.hxx"
-
-#include "TemplateScanner.hxx"
-
-#include <comphelper/processfactory.hxx>
-#include <comphelper/documentconstants.hxx>
-
-#include <tools/debug.hxx>
-#include <osl/mutex.hxx>
-#include <vcl/svapp.hxx>
-#include <sfx2/doctempl.hxx>
-#include <sfx2/templatelocnames.hrc>
-#include <com/sun/star/frame/XDocumentTemplates.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/ucb/XCommandEnvironment.hpp>
-#include <com/sun/star/ucb/XContentAccess.hpp>
-#include <com/sun/star/sdbc/XResultSet.hpp>
-#include <com/sun/star/sdbc/XRow.hpp>
-
-#include <set>
-
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::uno;
-
-namespace {
-
-const ::rtl::OUString TITLE(RTL_CONSTASCII_USTRINGPARAM ("Title"));
-const ::rtl::OUString TARGET_DIR_URL(RTL_CONSTASCII_USTRINGPARAM ("TargetDirURL"));
-const ::rtl::OUString DESCRIPTION(RTL_CONSTASCII_USTRINGPARAM ("TypeDescription"));
-const ::rtl::OUString TARGET_URL(RTL_CONSTASCII_USTRINGPARAM ("TargetURL"));
-
-const ::rtl::OUString DOCTEMPLATES(RTL_CONSTASCII_USTRINGPARAM ("com.sun.star.frame.DocumentTemplates"));
-
-// These strings are used to find impress templates in the tree of
-// template files. Should probably be determined dynamically.
-const ::rtl::OUString IMPRESS_BIN_TEMPLATE(RTL_CONSTASCII_USTRINGPARAM ("application/vnd.stardivision.impress"));
-const ::rtl::OUString IMPRESS_XML_TEMPLATE = MIMETYPE_VND_SUN_XML_IMPRESS;
-// The following id comes from the bugdoc in #i2764#.
-const ::rtl::OUString IMPRESS_XML_TEMPLATE_B(RTL_CONSTASCII_USTRINGPARAM ("Impress 2.0"));
-const ::rtl::OUString IMPRESS_XML_TEMPLATE_OASIS = MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION;
-
-
-class FolderDescriptor
-{
-public:
- FolderDescriptor (
- int nPriority,
- const ::rtl::OUString& rsTitle,
- const ::rtl::OUString& rsTargetDir,
- const ::rtl::OUString& rsContentIdentifier,
- const Reference<com::sun::star::ucb::XCommandEnvironment>& rxFolderEnvironment)
- : mnPriority(nPriority),
- msTitle(rsTitle),
- msTargetDir(rsTargetDir),
- msContentIdentifier(rsContentIdentifier),
- mxFolderEnvironment(rxFolderEnvironment)
- { }
- int mnPriority;
- ::rtl::OUString msTitle;
- ::rtl::OUString msTargetDir;
- ::rtl::OUString msContentIdentifier;
- // Reference<sdbc::XResultSet> mxFolderResultSet;
- Reference<com::sun::star::ucb::XCommandEnvironment> mxFolderEnvironment;
-
- class Comparator
- {
- public:
- bool operator() (const FolderDescriptor& r1, const FolderDescriptor& r2) const
- { return r1.mnPriority < r2.mnPriority; }
- };
-};
-
-/** Use a heuristic based on the URL of a top-level template folder to
- assign a priority that is used to sort the folders.
-*/
-int Classify (const ::rtl::OUString&, const ::rtl::OUString& rsURL)
-{
- int nPriority (0);
-
- if (rsURL.getLength() == 0)
- nPriority = 100;
- else if (rsURL.indexOf(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("presnt")))>=0)
- {
- nPriority = 30;
- }
- else if (rsURL.indexOf(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("layout")))>=0)
- {
- nPriority = 20;
- }
- else if (rsURL.indexOf(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("educate")))>=0)
- {
- nPriority = 40;
- }
- else if (rsURL.indexOf(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("finance")))>=0)
- {
- nPriority = 40;
- }
- else
- {
- // All other folders are taken for user supplied and have the
- // highest priority.
- nPriority = 10;
- }
-
- return nPriority;
-}
-
-} // end of anonymous namespace
-
-
-
-
-namespace sd
-{
-
-class TemplateScanner::FolderDescriptorList
- : public ::std::multiset<FolderDescriptor,FolderDescriptor::Comparator>
-{
-};
-
-TemplateScanner::TemplateScanner (void)
- : meState(INITIALIZE_SCANNING),
- maFolderContent(),
- mpTemplateDirectory(NULL),
- maFolderList(),
- mpLastAddedEntry(NULL),
- mpFolderDescriptors(new FolderDescriptorList()),
- mxTemplateRoot(),
- mxFolderEnvironment(),
- mxEntryEnvironment(),
- mxFolderResultSet(),
- mxEntryResultSet()
-{
- // empty;
-}
-
-
-
-
-TemplateScanner::~TemplateScanner (void)
-{
- mpFolderDescriptors.reset();
-
- // Delete all entries of the template list that have not been
- // transferred to another object.
- std::vector<TemplateDir*>::iterator I;
- for (I=maFolderList.begin(); I!=maFolderList.end(); ++I)
- if (*I != NULL)
- delete *I;
-}
-
-
-
-
-TemplateScanner::State TemplateScanner::GetTemplateRoot (void)
-{
- State eNextState (INITIALIZE_FOLDER_SCANNING);
-
- Reference<lang::XMultiServiceFactory> xFactory = ::comphelper::getProcessServiceFactory ();
- DBG_ASSERT (xFactory.is(), "TemplateScanner::GetTemplateRoot: xFactory is NULL");
-
- if (xFactory.is())
- {
- Reference<frame::XDocumentTemplates> xTemplates (
- xFactory->createInstance (DOCTEMPLATES), UNO_QUERY);
- DBG_ASSERT (xTemplates.is(), "TemplateScanner::GetTemplateRoot: xTemplates is NULL");
-
- if (xTemplates.is())
- mxTemplateRoot = xTemplates->getContent();
- else
- eNextState = ERROR;
- }
- else
- eNextState = ERROR;
-
- return eNextState;
-}
-
-
-
-
-TemplateScanner::State TemplateScanner::InitializeEntryScanning (void)
-{
- State eNextState (SCAN_ENTRY);
-
- if (maFolderContent.isFolder())
- {
- mxEntryEnvironment = Reference<com::sun::star::ucb::XCommandEnvironment>();
-
- // We are interested only in three properties: the entry's name,
- // its URL, and its content type.
- Sequence<rtl::OUString> aProps (3);
- aProps[0] = TITLE;
- aProps[1] = TARGET_URL;
- aProps[2] = DESCRIPTION;
-
- // Create a cursor to iterate over the templates in this folders.
- ::ucbhelper::ResultSetInclude eInclude = ::ucbhelper::INCLUDE_DOCUMENTS_ONLY;
- mxEntryResultSet = Reference<com::sun::star::sdbc::XResultSet>(
- maFolderContent.createCursor(aProps, eInclude));
- }
- else
- eNextState = ERROR;
-
- return eNextState;
-}
-
-
-
-
-TemplateScanner::State TemplateScanner::ScanEntry (void)
-{
- State eNextState (ERROR);
-
- Reference<com::sun::star::ucb::XContentAccess> xContentAccess (mxEntryResultSet, UNO_QUERY);
- Reference<com::sun::star::sdbc::XRow> xRow (mxEntryResultSet, UNO_QUERY);
-
- if (xContentAccess.is() && xRow.is() && mxEntryResultSet.is())
- {
- if (mxEntryResultSet->next())
- {
- ::rtl::OUString sTitle (xRow->getString (1));
- ::rtl::OUString sTargetURL (xRow->getString (2));
- ::rtl::OUString sContentType (xRow->getString (3));
-
- ::rtl::OUString aId = xContentAccess->queryContentIdentifierString();
- ::ucbhelper::Content aContent = ::ucbhelper::Content (aId, mxEntryEnvironment);
- if (aContent.isDocument ())
- {
- // Check wether the entry is an impress template. If so
- // add a new entry to the resulting list (which is created
- // first if necessary).
- if ( (sContentType == MIMETYPE_OASIS_OPENDOCUMENT_PRESENTATION_TEMPLATE)
- || (sContentType == IMPRESS_XML_TEMPLATE_OASIS)
- || (sContentType == IMPRESS_BIN_TEMPLATE)
- || (sContentType == IMPRESS_XML_TEMPLATE)
- || (sContentType == IMPRESS_XML_TEMPLATE_B))
- {
- ::rtl::OUString sLocalisedTitle = SfxDocumentTemplates::ConvertResourceString(
- STR_TEMPLATE_NAME1_DEF, STR_TEMPLATE_NAME1, NUM_TEMPLATE_NAMES, sTitle );
- mpLastAddedEntry = new TemplateEntry(sLocalisedTitle, sTargetURL);
- mpTemplateDirectory->maEntries.push_back(mpLastAddedEntry);
- }
- }
-
- // Continue scanning entries.
- eNextState = SCAN_ENTRY;
- }
- else
- {
- if (mpTemplateDirectory->maEntries.empty())
- {
- delete mpTemplateDirectory;
- mpTemplateDirectory = NULL;
- }
- else
- {
- SolarMutexGuard aGuard;
- maFolderList.push_back(mpTemplateDirectory);
- }
-
- // Continue with scanning the next folder.
- eNextState = SCAN_FOLDER;
- }
- }
-
- return eNextState;
-}
-
-
-
-
-TemplateScanner::State TemplateScanner::InitializeFolderScanning (void)
-{
- State eNextState (ERROR);
-
- mxFolderResultSet = Reference<sdbc::XResultSet>();
-
- try
- {
- // Create content for template folders.
- mxFolderEnvironment = Reference<com::sun::star::ucb::XCommandEnvironment>();
- ::ucbhelper::Content aTemplateDir (mxTemplateRoot, mxFolderEnvironment);
-
- // Define the list of properties we are interested in.
- Sequence<rtl::OUString> aProps (2);
- aProps[0] = TITLE;
- aProps[1] = TARGET_DIR_URL;
-
- // Create an cursor to iterate over the template folders.
- ::ucbhelper::ResultSetInclude eInclude = ::ucbhelper::INCLUDE_FOLDERS_ONLY;
- mxFolderResultSet = Reference<sdbc::XResultSet>(
- aTemplateDir.createCursor(aProps, eInclude));
- if (mxFolderResultSet.is())
- eNextState = GATHER_FOLDER_LIST;
- }
- catch (::com::sun::star::uno::Exception&)
- {
- eNextState = ERROR;
- }
-
- return eNextState;
-}
-
-
-
-
-TemplateScanner::State TemplateScanner::GatherFolderList (void)
-{
- State eNextState (ERROR);
-
- Reference<com::sun::star::ucb::XContentAccess> xContentAccess (mxFolderResultSet, UNO_QUERY);
- if (xContentAccess.is() && mxFolderResultSet.is())
- {
- while (mxFolderResultSet->next())
- {
- Reference<sdbc::XRow> xRow (mxFolderResultSet, UNO_QUERY);
- if (xRow.is())
- {
- ::rtl::OUString sTitle (xRow->getString (1));
- ::rtl::OUString sTargetDir (xRow->getString (2));
- ::rtl::OUString aId = xContentAccess->queryContentIdentifierString();
-
- mpFolderDescriptors->insert(
- FolderDescriptor(
- Classify(sTitle,sTargetDir),
- sTitle,
- sTargetDir,
- aId,
- mxFolderEnvironment));
- }
- }
-
- eNextState = SCAN_FOLDER;
- }
-
- return eNextState;
-}
-
-
-
-
-TemplateScanner::State TemplateScanner::ScanFolder (void)
-{
- State eNextState (ERROR);
-
- if (mpFolderDescriptors->size() > 0)
- {
- FolderDescriptor aDescriptor (*mpFolderDescriptors->begin());
- mpFolderDescriptors->erase(mpFolderDescriptors->begin());
-
- ::rtl::OUString sTitle (aDescriptor.msTitle);
- ::rtl::OUString sTargetDir (aDescriptor.msTargetDir);
- ::rtl::OUString aId (aDescriptor.msContentIdentifier);
-
- maFolderContent = ::ucbhelper::Content (aId, aDescriptor.mxFolderEnvironment);
- if (maFolderContent.isFolder())
- {
- // Scan the folder and insert it into the list of template
- // folders.
- mpTemplateDirectory = new TemplateDir (sTitle, sTargetDir);
- if (mpTemplateDirectory != NULL)
- {
- // Continue with scanning all entries in the folder.
- eNextState = INITIALIZE_ENTRY_SCAN;
- }
- }
- }
- else
- {
- eNextState = DONE;
- }
-
- return eNextState;
-}
-
-
-
-
-void TemplateScanner::Scan (void)
-{
- while (HasNextStep())
- RunNextStep();
-}
-
-
-
-
-std::vector<TemplateDir*>& TemplateScanner::GetFolderList (void)
-{
- return maFolderList;
-}
-
-
-
-
-void TemplateScanner::RunNextStep (void)
-{
- switch (meState)
- {
- case INITIALIZE_SCANNING:
- meState = GetTemplateRoot();
- break;
-
- case INITIALIZE_FOLDER_SCANNING:
- meState = InitializeFolderScanning();
- break;
-
- case SCAN_FOLDER:
- meState = ScanFolder();
- break;
-
- case GATHER_FOLDER_LIST:
- meState = GatherFolderList();
- break;
-
- case INITIALIZE_ENTRY_SCAN:
- meState = InitializeEntryScanning();
- break;
-
- case SCAN_ENTRY:
- meState = ScanEntry();
- break;
- default:
- break;
- }
-
- switch (meState)
- {
- case DONE:
- case ERROR:
- mxTemplateRoot.clear();
- mxTemplateRoot.clear();
- mxFolderEnvironment.clear();
- mxEntryEnvironment.clear();
- mxFolderResultSet.clear();
- mxEntryResultSet.clear();
- mpLastAddedEntry = NULL;
- break;
- default:
- break;
- }
-}
-
-
-
-
-bool TemplateScanner::HasNextStep (void)
-{
- switch (meState)
- {
- case DONE:
- case ERROR:
- return false;
-
- default:
- return true;
- }
-}
-
-
-
-
-const TemplateEntry* TemplateScanner::GetLastAddedEntry (void) const
-{
- return mpLastAddedEntry;
-}
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */