2015-06-10 17:53:17 -07:00
/ *
Copyright ( c ) 2015 , Lars Brubaker
All rights reserved .
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions are met :
1. Redistributions of source code must retain the above copyright notice , this
list of conditions and the following disclaimer .
2. Redistributions in binary form must reproduce the above copyright notice ,
this list of conditions and the following disclaimer in the documentation
and / or other materials provided with the distribution .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies ,
either expressed or implied , of the FreeBSD Project .
* /
2015-09-22 15:20:49 -07:00
using MatterHackers.Agg ;
2015-06-25 12:19:19 -07:00
using MatterHackers.Agg.PlatformAbstract ;
2015-06-17 17:58:38 -07:00
using MatterHackers.Agg.UI ;
2015-06-12 17:21:51 -07:00
using MatterHackers.MatterControl.DataStorage ;
2015-06-10 17:53:17 -07:00
using MatterHackers.MatterControl.PrintQueue ;
2015-06-25 12:19:19 -07:00
using MatterHackers.MatterControl.SettingsManagement ;
2015-06-22 18:21:56 -07:00
using MatterHackers.PolygonMesh ;
2015-06-25 12:19:19 -07:00
using MatterHackers.PolygonMesh.Processors ;
2015-06-10 17:53:17 -07:00
using System ;
using System.Collections.Generic ;
2015-09-10 12:42:52 -07:00
using System.Diagnostics ;
2015-06-25 12:19:19 -07:00
using System.IO ;
using System.Linq ;
2015-09-10 12:42:52 -07:00
using System.Threading ;
2015-07-02 11:23:44 -07:00
using System.Threading.Tasks ;
2015-06-10 17:53:17 -07:00
namespace MatterHackers.MatterControl.PrintLibrary.Provider
{
2015-08-25 12:01:15 -07:00
public class LibraryProviderSQLite : LibraryProvider
2015-08-13 17:48:34 -07:00
{
2015-09-10 12:42:52 -07:00
public static bool PreloadingCalibrationFiles = false ;
2015-08-13 17:48:34 -07:00
protected PrintItemCollection baseLibraryCollection ;
protected List < PrintItemCollection > childCollections = new List < PrintItemCollection > ( ) ;
2015-08-25 12:11:35 -07:00
private bool ignoreNextKeywordFilter = false ;
2015-08-25 12:01:15 -07:00
private string keywordFilter = string . Empty ;
2015-09-09 15:35:31 -07:00
private List < PrintItem > printItems = new List < PrintItem > ( ) ;
2015-08-25 12:01:15 -07:00
2015-09-22 15:20:49 -07:00
public static RootedObjectEventHandler ItemAdded = new RootedObjectEventHandler ( ) ;
2015-09-03 12:21:20 -07:00
2015-10-06 18:47:35 -07:00
private Object initializingLock = new Object ( ) ;
public LibraryProviderSQLite ( PrintItemCollection callerSuppliedCollection , Action < LibraryProvider > setCurrentLibraryProvider , LibraryProvider parentLibraryProvider , string visibleName )
2015-09-02 11:05:50 -07:00
: base ( parentLibraryProvider , setCurrentLibraryProvider )
2015-08-13 17:48:34 -07:00
{
2015-08-25 12:01:15 -07:00
this . Name = visibleName ;
2015-10-06 18:47:35 -07:00
// Lock ensures that SQLite providers initialized near the same time from different threads (which has been observed during debug)
// will run in a serial fashion and only one instance will construct and assign to .baseLibraryCollection
lock ( initializingLock )
2015-08-25 12:01:15 -07:00
{
2015-10-06 18:47:35 -07:00
// Use null coalescing operator to assign either the caller supplied collection or if null, the root library collection
this . baseLibraryCollection = callerSuppliedCollection ? ? GetRootLibraryCollection ( ) ;
2015-08-25 12:01:15 -07:00
}
LoadLibraryItems ( ) ;
2015-09-03 12:21:20 -07:00
2015-09-22 15:20:49 -07:00
ItemAdded . RegisterEvent ( DatabaseFileChange , ref unregisterEvents ) ;
2015-09-03 12:21:20 -07:00
}
2015-09-22 15:20:49 -07:00
private event EventHandler unregisterEvents ;
2015-09-10 12:42:52 -07:00
public override void Dispose ( )
2015-09-03 12:21:20 -07:00
{
2015-09-22 15:20:49 -07:00
if ( unregisterEvents ! = null )
{
unregisterEvents ( this , null ) ;
}
ItemAdded . UnregisterEvent ( DatabaseFileChange , ref unregisterEvents ) ;
2015-08-13 17:48:34 -07:00
}
2015-09-10 12:42:52 -07:00
Stopwatch timeSinceLastChange = new Stopwatch ( ) ;
private async void DatabaseFileChange ( object sender , EventArgs e )
2015-08-13 17:48:34 -07:00
{
2015-09-10 12:42:52 -07:00
if ( timeSinceLastChange . IsRunning )
2015-08-13 17:48:34 -07:00
{
2015-09-10 12:42:52 -07:00
// rest the time so we will wait a bit longer
timeSinceLastChange . Restart ( ) ;
// we already have a pending update so we'll just wait for that one to complete
}
else
{
// start the time before we do the refresh
timeSinceLastChange . Restart ( ) ;
// run a thread to wait for the time to elapse
await Task . Run ( ( ) = >
2015-08-25 12:11:35 -07:00
{
2015-09-10 12:42:52 -07:00
while ( timeSinceLastChange . Elapsed . TotalSeconds < . 5 )
{
Thread . Sleep ( 10 ) ;
}
} ) ;
2015-08-25 12:11:35 -07:00
2015-09-10 12:42:52 -07:00
UiThread . RunOnIdle ( ( ) = >
{
if ( ! Datastore . Instance . WasExited ( ) )
{
LoadLibraryItems ( ) ;
}
} ) ;
timeSinceLastChange . Stop ( ) ;
2015-08-13 17:48:34 -07:00
}
}
2015-08-25 12:11:35 -07:00
public static string StaticProviderKey
2015-08-13 17:48:34 -07:00
{
2015-08-25 12:11:35 -07:00
get
2015-08-13 17:48:34 -07:00
{
2015-08-25 12:11:35 -07:00
return "LibraryProviderSqliteKey" ;
2015-08-13 17:48:34 -07:00
}
}
2015-09-17 18:03:02 -07:00
public override bool CanShare { get { return false ; } }
2015-08-25 12:11:35 -07:00
public override int CollectionCount
2015-08-13 17:48:34 -07:00
{
2015-08-25 12:11:35 -07:00
get
2015-08-13 17:48:34 -07:00
{
2015-08-25 12:11:35 -07:00
return childCollections . Count ;
2015-08-13 17:48:34 -07:00
}
}
2015-08-25 12:11:35 -07:00
public override int ItemCount
2015-06-17 17:58:38 -07:00
{
get
{
2015-08-25 12:11:35 -07:00
return printItems . Count ;
2015-06-17 17:58:38 -07:00
}
}
2015-08-25 11:56:21 -07:00
public override string KeywordFilter
{
get
{
return keywordFilter ;
}
set
{
if ( ignoreNextKeywordFilter )
{
ignoreNextKeywordFilter = false ;
return ;
}
2015-10-06 18:47:35 -07:00
PrintItemCollection rootLibraryCollection = GetRootLibraryCollection ( ) ;
2015-08-25 11:56:21 -07:00
if ( value ! = ""
& & this . baseLibraryCollection . Id ! = rootLibraryCollection . Id )
{
LibraryProviderSQLite currentProvider = this . ParentLibraryProvider as LibraryProviderSQLite ;
while ( currentProvider . ParentLibraryProvider ! = null
& & currentProvider . baseLibraryCollection . Id ! = rootLibraryCollection . Id )
{
currentProvider = currentProvider . ParentLibraryProvider as LibraryProviderSQLite ;
}
if ( currentProvider ! = null )
{
currentProvider . KeywordFilter = value ;
currentProvider . ignoreNextKeywordFilter = true ;
2015-09-02 11:05:50 -07:00
UiThread . RunOnIdle ( ( ) = > SetCurrentLibraryProvider ( currentProvider ) ) ;
2015-08-25 11:56:21 -07:00
}
}
else // the search only shows for the cloud library root
{
if ( keywordFilter ! = value )
{
keywordFilter = value ;
2015-08-25 12:11:35 -07:00
LoadLibraryItems ( ) ;
2015-08-25 11:56:21 -07:00
}
}
}
}
2015-08-25 12:11:35 -07:00
public override string ProviderKey
2015-06-10 17:53:17 -07:00
{
get
{
2015-08-25 12:11:35 -07:00
return StaticProviderKey ;
2015-06-10 17:53:17 -07:00
}
}
2015-08-25 12:11:35 -07:00
/// <summary>
/// Exposes all PrintItems for use in file purge code in AboutWidget
/// </summary>
/// <returns>A list of all print items</returns>
public static IEnumerable < PrintItem > GetAllPrintItemsRecursive ( )
2015-06-17 17:35:12 -07:00
{
2015-08-25 12:11:35 -07:00
// NOTE: We are making the assumption that everything is reference if it does not have a 0 in eth PrintItemCollectionID.
string query = "SELECT * FROM PrintItem WHERE PrintItemCollectionID != 0;" ;
IEnumerable < PrintItem > result = ( IEnumerable < PrintItem > ) Datastore . Instance . dbSQLite . Query < PrintItem > ( query ) ;
return result ;
2015-06-17 17:35:12 -07:00
}
2015-10-06 18:47:35 -07:00
public override void AddCollectionToLibrary ( string collectionName )
2015-06-25 12:19:19 -07:00
{
PrintItemCollection newCollection = new PrintItemCollection ( collectionName , "" ) ;
2015-06-30 11:34:46 -07:00
newCollection . ParentCollectionID = baseLibraryCollection . Id ;
2015-06-25 12:19:19 -07:00
newCollection . Commit ( ) ;
2015-10-06 18:47:35 -07:00
LoadLibraryItems ( ) ;
2015-06-25 12:19:19 -07:00
}
2015-10-06 18:47:35 -07:00
public override void AddItem ( PrintItemWrapper itemToAdd )
2015-06-25 12:19:19 -07:00
{
2015-10-06 18:47:35 -07:00
AddItem ( itemToAdd . Name , itemToAdd . FileLocation ) ;
2015-06-25 12:19:19 -07:00
}
2015-10-06 18:47:35 -07:00
public void AddItem ( string fileName , string fileLocation )
2015-06-11 16:25:12 -07:00
{
2015-08-08 11:25:51 -07:00
if ( ! string . IsNullOrEmpty ( fileName ) & & ! string . IsNullOrEmpty ( fileLocation ) )
2015-06-25 12:19:19 -07:00
{
2015-10-06 18:47:35 -07:00
AddStlOrGcode ( fileLocation , fileName ) ;
2015-06-25 12:19:19 -07:00
}
2015-09-03 12:21:20 -07:00
LoadLibraryItems ( ) ;
2015-09-22 15:20:49 -07:00
ItemAdded . CallEvents ( this , null ) ;
2015-06-10 17:53:17 -07:00
}
2015-10-06 18:47:35 -07:00
public void EnsureSamplePartsExist ( IEnumerable < string > filenamesToValidate )
2015-08-25 12:11:35 -07:00
{
PreloadingCalibrationFiles = true ;
// Ensure the CalibrationParts directory exists to store/import the files from disk
string tempPath = Path . Combine ( ApplicationDataStorage . ApplicationUserDataPath , "data" , "temp" , "calibration-parts" ) ;
Directory . CreateDirectory ( tempPath ) ;
var existingLibaryItems = this . GetLibraryItems ( ) . Select ( i = > i . Name ) ;
2015-11-10 13:00:54 -08:00
// Drop extensions and build a list of files that need to be imported into the library
2015-11-10 15:33:16 -08:00
var missingFiles = filenamesToValidate . Where ( fileName = > ! existingLibaryItems . Contains ( Path . GetFileNameWithoutExtension ( fileName ) , StringComparer . OrdinalIgnoreCase ) ) ;
2015-08-25 12:11:35 -07:00
// Create temp files on disk that can be imported into the library
var tempFilesToImport = missingFiles . Select ( fileName = >
{
// Copy calibration prints from StaticData to the filesystem before importing into the library
string tempFilePath = Path . Combine ( tempPath , Path . GetFileName ( fileName ) ) ;
using ( FileStream outstream = File . OpenWrite ( tempFilePath ) )
using ( Stream instream = StaticData . Instance . OpenSteam ( Path . Combine ( "OEMSettings" , "SampleParts" , fileName ) ) )
{
instream . CopyTo ( outstream ) ;
}
// Project the new filename to the output
return tempFilePath ;
} ) . ToArray ( ) ;
// Import any missing files into the library
foreach ( string file in tempFilesToImport )
{
// Ensure these operations run in serial rather than in parallel where they stomp on each other when writing to default.mcp
2015-10-06 18:47:35 -07:00
this . AddItem ( Path . GetFileNameWithoutExtension ( file ) , file ) ;
2015-08-25 12:11:35 -07:00
}
PreloadingCalibrationFiles = false ;
}
public override PrintItemCollection GetCollectionItem ( int collectionIndex )
{
return childCollections [ collectionIndex ] ;
}
public IEnumerable < PrintItem > GetLibraryItems ( string keyphrase = null )
{
string query ;
2015-09-14 15:35:07 -07:00
if ( string . IsNullOrEmpty ( keyphrase ) )
2015-08-25 12:11:35 -07:00
{
query = string . Format ( "SELECT * FROM PrintItem WHERE PrintItemCollectionID = {0} ORDER BY Name ASC;" , baseLibraryCollection . Id ) ;
}
else
{
query = string . Format ( "SELECT * FROM PrintItem WHERE PrintItemCollectionID = {0} AND Name LIKE '%{1}%' ORDER BY Name ASC;" , baseLibraryCollection . Id , keyphrase ) ;
}
IEnumerable < PrintItem > result = ( IEnumerable < PrintItem > ) Datastore . Instance . dbSQLite . Query < PrintItem > ( query ) ;
return result ;
}
public override string GetPrintItemName ( int itemIndex )
{
return printItems [ itemIndex ] . Name ;
}
2015-12-08 16:56:51 -08:00
public override Task < PrintItemWrapper > GetPrintItemWrapperAsync ( int index )
2015-06-15 18:31:43 -07:00
{
2015-06-25 12:19:19 -07:00
if ( index > = 0 & & index < printItems . Count )
{
2015-12-08 16:56:51 -08:00
return Task . FromResult ( new PrintItemWrapper ( printItems [ index ] , this . GetProviderLocator ( ) ) ) ;
2015-06-25 12:19:19 -07:00
}
return null ;
2015-06-12 09:48:20 -07:00
}
2015-07-22 18:30:22 -07:00
public override LibraryProvider GetProviderForCollection ( PrintItemCollection collection )
2015-06-22 18:21:56 -07:00
{
2015-09-02 11:05:50 -07:00
return new LibraryProviderSQLite ( collection , SetCurrentLibraryProvider , this , collection . Name ) ;
2015-06-22 18:21:56 -07:00
}
2015-10-06 18:47:35 -07:00
public override void RemoveCollection ( int collectionIndexToRemove )
2015-06-10 17:53:17 -07:00
{
2015-07-22 18:30:22 -07:00
childCollections [ collectionIndexToRemove ] . Delete ( ) ;
2015-10-06 18:47:35 -07:00
LoadLibraryItems ( ) ;
2015-06-10 17:53:17 -07:00
}
2015-07-22 18:30:22 -07:00
public override void RemoveItem ( int itemToRemoveIndex )
2015-06-10 17:53:17 -07:00
{
2015-07-22 18:30:22 -07:00
if ( itemToRemoveIndex < 0 )
2015-06-25 12:19:19 -07:00
{
// It may be possible to have the same item in the remove list twice.
// so if it is not in the PrintItems then ignore it.
return ;
}
2015-08-25 12:11:35 -07:00
2015-06-25 12:19:19 -07:00
// and remove it from the data base
2015-07-22 18:30:22 -07:00
printItems [ itemToRemoveIndex ] . Delete ( ) ;
printItems . RemoveAt ( itemToRemoveIndex ) ;
2015-06-25 12:19:19 -07:00
2015-07-27 10:27:22 -07:00
OnDataReloaded ( null ) ;
2015-06-10 17:53:17 -07:00
}
2015-06-15 18:31:43 -07:00
2015-08-25 12:11:35 -07:00
public override void RenameCollection ( int collectionIndexToRename , string newName )
2015-06-25 12:19:19 -07:00
{
2015-08-25 12:11:35 -07:00
childCollections [ collectionIndexToRename ] . Name = newName ;
childCollections [ collectionIndexToRename ] . Commit ( ) ;
LoadLibraryItems ( ) ;
}
2015-08-04 16:17:51 -07:00
2015-08-25 12:11:35 -07:00
public override void RenameItem ( int itemIndexToRename , string newName )
{
2015-09-09 15:35:31 -07:00
printItems [ itemIndexToRename ] . Name = newName ;
printItems [ itemIndexToRename ] . Commit ( ) ;
2015-08-25 12:11:35 -07:00
LoadLibraryItems ( ) ;
}
2015-06-25 12:19:19 -07:00
2015-09-17 18:03:02 -07:00
public override void ShareItem ( int itemIndexToShare )
{
}
2015-08-25 12:11:35 -07:00
protected static void SaveToLibraryFolder ( PrintItemWrapper printItemWrapper , List < MeshGroup > meshGroups , bool AbsolutePositioned )
{
string [ ] metaData = { "Created By" , "MatterControl" } ;
if ( AbsolutePositioned )
{
metaData = new string [ ] { "Created By" , "MatterControl" , "BedPosition" , "Absolute" } ;
}
2015-06-25 12:19:19 -07:00
2015-09-11 14:36:57 -07:00
// if it is not already in the right location
if ( ! printItemWrapper . FileLocation . Contains ( ApplicationDataStorage . Instance . ApplicationLibraryDataPath ) )
2015-08-25 12:11:35 -07:00
{
2015-09-11 14:36:57 -07:00
// save a copy to the library and update this to point at it
2015-08-25 12:11:35 -07:00
string fileName = Path . ChangeExtension ( Path . GetRandomFileName ( ) , ".amf" ) ;
printItemWrapper . FileLocation = Path . Combine ( ApplicationDataStorage . Instance . ApplicationLibraryDataPath , fileName ) ;
2015-08-08 11:25:51 -07:00
2015-08-25 12:11:35 -07:00
MeshOutputSettings outputInfo = new MeshOutputSettings ( MeshOutputSettings . OutputType . Binary , metaData ) ;
MeshFileIo . Save ( meshGroups , printItemWrapper . FileLocation , outputInfo ) ;
}
}
protected virtual void AddStlOrGcode ( string loadedFileName , string displayName )
{
string extension = Path . GetExtension ( loadedFileName ) . ToUpper ( ) ;
PrintItem printItem = new PrintItem ( ) ;
printItem . Name = displayName ;
printItem . FileLocation = Path . GetFullPath ( loadedFileName ) ;
printItem . PrintItemCollectionID = this . baseLibraryCollection . Id ;
printItem . Commit ( ) ;
if ( ( extension ! = "" & & MeshFileIo . ValidFileExtensions ( ) . Contains ( extension ) ) )
2015-06-25 12:19:19 -07:00
{
2015-08-25 12:11:35 -07:00
List < MeshGroup > meshToConvertAndSave = MeshFileIo . Load ( loadedFileName ) ;
try
2015-06-25 12:19:19 -07:00
{
2015-09-11 14:36:57 -07:00
PrintItemWrapper printItemWrapper = new PrintItemWrapper ( printItem , this . GetProviderLocator ( ) ) ;
2015-08-25 12:11:35 -07:00
SaveToLibraryFolder ( printItemWrapper , meshToConvertAndSave , false ) ;
}
catch ( System . UnauthorizedAccessException )
{
UiThread . RunOnIdle ( ( ) = >
{
//Do something special when unauthorized?
StyledMessageBox . ShowMessageBox ( null , "Oops! Unable to save changes, unauthorized access" , "Unable to save" ) ;
} ) ;
}
catch
{
UiThread . RunOnIdle ( ( ) = >
{
StyledMessageBox . ShowMessageBox ( null , "Oops! Unable to save changes." , "Unable to save" ) ;
} ) ;
2015-06-25 12:19:19 -07:00
}
2015-08-25 12:11:35 -07:00
}
else // it is not a mesh so just add it
{
2015-09-11 14:36:57 -07:00
PrintItemWrapper printItemWrapper = new PrintItemWrapper ( printItem , this . GetProviderLocator ( ) ) ;
2015-08-25 12:11:35 -07:00
string sourceFileName = printItem . FileLocation ;
string newFileName = Path . ChangeExtension ( Path . GetRandomFileName ( ) , Path . GetExtension ( printItem . FileLocation ) ) ;
string destFileName = Path . Combine ( ApplicationDataStorage . Instance . ApplicationLibraryDataPath , newFileName ) ;
2015-06-25 12:19:19 -07:00
2015-08-25 12:11:35 -07:00
File . Copy ( sourceFileName , destFileName , true ) ;
2015-06-25 12:19:19 -07:00
2015-08-25 12:11:35 -07:00
printItemWrapper . FileLocation = destFileName ;
printItemWrapper . PrintItem . Commit ( ) ;
2015-06-25 12:19:19 -07:00
}
}
2015-08-25 12:11:35 -07:00
protected IEnumerable < PrintItemCollection > GetChildCollections ( )
2015-06-25 12:19:19 -07:00
{
2015-08-25 12:11:35 -07:00
string query = string . Format ( "SELECT * FROM PrintItemCollection WHERE ParentCollectionID = {0} ORDER BY Name ASC;" , baseLibraryCollection . Id ) ;
IEnumerable < PrintItemCollection > result = ( IEnumerable < PrintItemCollection > ) Datastore . Instance . dbSQLite . Query < PrintItemCollection > ( query ) ;
2015-06-30 11:34:46 -07:00
return result ;
2015-06-25 12:19:19 -07:00
}
2015-10-06 18:47:35 -07:00
private PrintItemCollection GetRootLibraryCollection ( )
2015-06-25 12:19:19 -07:00
{
2015-08-08 11:25:51 -07:00
// Attempt to initialize the library from the Datastore if null
PrintItemCollection rootLibraryCollection = Datastore . Instance . dbSQLite . Table < PrintItemCollection > ( ) . Where ( v = > v . Name = = "_library" ) . Take ( 1 ) . FirstOrDefault ( ) ;
// If the _library collection is still missing, create and populate it with default content
if ( rootLibraryCollection = = null )
2015-06-25 12:19:19 -07:00
{
2015-08-08 11:25:51 -07:00
rootLibraryCollection = new PrintItemCollection ( ) ;
rootLibraryCollection . Name = "_library" ;
rootLibraryCollection . Commit ( ) ;
// In this case we now need to update the baseLibraryCollection instance member as code that executes
// down this path will attempt to use the property and will exception if its not set
this . baseLibraryCollection = rootLibraryCollection ;
// Preload library with Oem supplied list of default parts
2015-10-06 18:47:35 -07:00
EnsureSamplePartsExist ( OemSettings . Instance . PreloadedLibraryFiles ) ;
2015-06-25 12:19:19 -07:00
}
2015-08-08 11:25:51 -07:00
return rootLibraryCollection ;
}
2015-10-06 18:47:35 -07:00
private void LoadLibraryItems ( )
2015-08-08 11:25:51 -07:00
{
2015-09-10 12:42:52 -07:00
IEnumerable < PrintItem > partFiles = null ;
IEnumerable < PrintItemCollection > collections = null ;
2015-10-06 18:47:35 -07:00
partFiles = GetLibraryItems ( KeywordFilter ) ;
collections = GetChildCollections ( ) ;
2015-09-10 12:42:52 -07:00
2015-08-08 11:25:51 -07:00
printItems . Clear ( ) ;
if ( partFiles ! = null )
2015-06-30 11:34:46 -07:00
{
2015-09-10 12:42:52 -07:00
printItems . AddRange ( partFiles ) ;
2015-06-30 11:34:46 -07:00
}
2015-08-08 11:25:51 -07:00
childCollections . Clear ( ) ;
if ( collections ! = null )
{
childCollections . AddRange ( collections ) ;
}
OnDataReloaded ( null ) ;
2015-06-25 12:19:19 -07:00
}
2015-06-10 17:53:17 -07:00
}
2015-08-25 12:11:35 -07:00
public class LibraryProviderSQLiteCreator : ILibraryCreator
{
public string ProviderKey
{
get
{
return LibraryProviderSQLite . StaticProviderKey ;
}
}
public virtual LibraryProvider CreateLibraryProvider ( LibraryProvider parentLibraryProvider , Action < LibraryProvider > setCurrentLibraryProvider )
{
return new LibraryProviderSQLite ( null , setCurrentLibraryProvider , parentLibraryProvider , "Local Library" ) ;
}
}
2015-06-10 17:53:17 -07:00
}