1+ define ( [
2+ 'q' ,
3+ 'underscore' ,
4+ 'hr/hr' ,
5+ 'models/file' ,
6+ 'core/box' ,
7+ 'utils/settings' ,
8+ 'utils/dialogs' ,
9+ 'utils/tabs' ,
10+ 'views/tabs/file' ,
11+ 'views/files/base'
12+ ] , function ( Q , _ , hr , File , box , settings , dialogs , tabs , FileTab ) {
13+ var logging = hr . Logger . addNamespace ( "files" ) ;
14+
15+ // Settings for files manager
16+ var settings = settings . add ( {
17+ 'namespace' : "files" ,
18+ 'title' : "Files" ,
19+ 'fields' : { }
20+ } ) ;
21+
22+ // Files handlers map
23+ var handlers = { } ;
24+
25+ // Add handler
26+ var addHandler = function ( handlerId , handler ) {
27+ if ( ! handler
28+ || ! handlerId
29+ || ! handler . name
30+ || ! handler . valid
31+ || ( ! handler . View && ! handler . open ) ) {
32+ throw "Invalid files handler format" ;
33+ }
34+
35+ if ( handler . View ) {
36+ handler . open = function ( file ) {
37+ var path = file . path ( ) ;
38+ var manager = tabs . manager ( ) ;
39+
40+ var tab = manager . getActiveTabByType ( "directory" ) ;
41+ if ( tab != null && ! manager . checkTabExists ( path ) ) {
42+ // Change current tab to open the file
43+ tab . view . load ( path ) ;
44+ } else {
45+ // Add new tab
46+ tabs . open ( FileTab , {
47+ "model" : file ,
48+ "handler" : handler
49+ } , {
50+ "uniqueId" : path ,
51+ "type" : "file" ,
52+ } ) ;
53+ }
54+ } ;
55+ }
56+
57+ // Add settings
58+ settings . setField ( handlerId , {
59+ 'label' : handler . name ,
60+ 'type' : "checkbox" ,
61+ 'default' : true
62+ } ) ;
63+
64+ // Register handler
65+ handlers [ handlerId ] = handler ;
66+ } ;
67+
68+ // Get handler for a file
69+ var getHandlers = function ( file , defaultHandler ) {
70+ return _ . filter ( handlers , function ( handler ) {
71+ return handler . valid ( file ) ;
72+ } ) ;
73+ } ;
74+
75+ // Open a file
76+ var openFile = function ( file ) {
77+ if ( _ . isString ( file ) ) {
78+ var nfile = new File ( {
79+ 'codebox' : box
80+ } ) ;
81+ return nfile . getByPath ( file ) . then ( function ( ) {
82+ return openFile ( nfile ) ;
83+ } ) ;
84+ }
85+
86+ var handlers = getHandlers ( file ) ;
87+ if ( _ . size ( handlers ) == 0 ) {
88+ dialogs . alert ( "No handler for this file" , "Sorry, No handler has been found to open this file. Try to find and install an addon to manage this file." ) ;
89+ return Q . reject ( new Error ( "No handler for this file" ) ) ;
90+ }
91+
92+ // todo: dialog to choose the handler
93+ var handler = _ . first ( handlers ) ;
94+ return Q ( handler . open ( file ) ) ;
95+ } ;
96+
97+ return {
98+ 'addHandler' : addHandler ,
99+ 'getHandlers' : getHandlers ,
100+ 'open' : openFile
101+ } ;
102+ } ) ;
0 commit comments