Class: Redcar::Project

Inherits:
Object show all
Defined in:
plugins/project/lib/project.rb,
plugins/project/lib/project/recent.rb,
plugins/project/lib/project/manager.rb,
plugins/project/lib/project/commands.rb,
plugins/project/lib/project/file_list.rb,
plugins/project/lib/project/dir_mirror.rb,
plugins/project/lib/project/sub_project.rb,
plugins/project/lib/project/file_mirror.rb,
plugins/project/lib/project/drb_service.rb,
plugins/project/lib/project/support/trash.rb,
plugins/project/lib/project/dir_controller.rb,
plugins/project/spec/project/dir_mirror_spec.rb,
plugins/project/lib/project/find_file_dialog.rb,
plugins/project/lib/project/local_filesystem.rb,
plugins/project/spec/project/file_mirror_spec.rb,
plugins/project/lib/project/find_recent_dialog.rb,
plugins/project/spec/project/adapters/remote_spec.rb,
plugins/project_search/lib/project_search/project.rb,
plugins/project/lib/project/project_tree_controller.rb,
plugins/project/spec/project/adapters/remote_protocols/ftp_spec.rb,
plugins/project/spec/project/adapters/remote_protocols/sftp_spec.rb

Direct Known Subclasses

SubProject

Defined Under Namespace

Modules: LocalFilesystem, Trash Classes: DirController, DirMirror, DirectoryOpenCommand, DrbService, FileList, FileMirror, FileReloadCommand, FindFileCommand, FindFileDialog, FindRecentCommand, FindRecentDialog, Manager, OpenCommand, OpenDirectoryInCommandLineCommand, OpenDirectoryInExplorerCommand, OpenFileCommand, ProjectTreeController, Recent, RefreshDirectoryCommand, RevealInProjectCommand, SaveAllFilesCommand, SaveFileAsCommand, SaveFileCommand, SubProject, ToggleRevealInProject

Constant Summary

RECENT_FILES_LENGTH =
20

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Project) initialize(path)

A new instance of Project



33
34
35
36
37
38
39
40
41
42
43
44
# File 'plugins/project/lib/project.rb', line 33

def initialize(path)
  @path   = File.expand_path(path)
  @listeners ||= {}
  dir_mirror = Project::DirMirror.new(@path)
  if dir_mirror.exists?
    @tree   = Tree.new(dir_mirror, Project::DirController.new)
    @window = nil
    file_list_resource.compute
  else
    raise "#{path} doesn't seem to exist"
  end
end

Instance Attribute Details

- (Object) listeners

Returns the value of attribute listeners



31
32
33
# File 'plugins/project/lib/project.rb', line 31

def listeners
  @listeners
end

- (Object) path (readonly)

Returns the value of attribute path



30
31
32
# File 'plugins/project/lib/project.rb', line 30

def path
  @path
end

- (Object) tree (readonly)

Returns the value of attribute tree



30
31
32
# File 'plugins/project/lib/project.rb', line 30

def tree
  @tree
end

- (Object) window (readonly)

Returns the value of attribute window



30
31
32
# File 'plugins/project/lib/project.rb', line 30

def window
  @window
end

Class Method Details

+ (Object) window_projects



26
27
28
# File 'plugins/project/lib/project.rb', line 26

def self.window_projects
  @window_projects ||= {}
end

Instance Method Details

- (Object) add_to_recent_files(new_file)



193
194
195
196
197
198
199
200
201
202
# File 'plugins/project/lib/project.rb', line 193

def add_to_recent_files(new_file)
  new_file = File.expand_path(new_file)
  if recent_files.include?(new_file)
    recent_files.delete(new_file)
  end
  recent_files << new_file
  if recent_files.length > RECENT_FILES_LENGTH
    recent_files.shift
  end
end

- (Object) all_files



221
222
223
# File 'plugins/project/lib/project.rb', line 221

def all_files
  file_list.all_files
end

- (Object) attach_listeners



139
140
141
142
# File 'plugins/project/lib/project.rb', line 139

def attach_listeners
  attach_notebook_listeners
  window.treebook.add_listener(:tree_removed, &method(:tree_removed))
end

- (Object) attach_notebook_listeners



144
145
146
147
148
149
150
151
152
153
# File 'plugins/project/lib/project.rb', line 144

def attach_notebook_listeners
  window.add_listener(:notebook_focussed, &method(:notebook_focussed))
  window.add_listener(:notebook_removed, &method(:notebook_closed))
  window.add_listener(:new_notebook, &method(:notebook_added))
  if notebooks = window.notebooks
    notebooks.each do |nb|
      notebook_added(nb)
    end
  end
end

- (Object) close



120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'plugins/project/lib/project.rb', line 120

def close
  return unless @window
  this_window = window
  @window = nil
  this_window.treebook.remove_tree(@tree)
  Project.window_projects.delete(this_window)
  this_window.title = Window::DEFAULT_TITLE
  Manager.open_project_sensitivity.recompute
  Redcar.plugin_manager.objects_implementing(:project_closed).each do |i|
    i.project_closed(self,this_window)
  end
  listeners = {}
  unlock if locked?
end

- (Object) config_dir



46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'plugins/project/lib/project.rb', line 46

def config_dir
  if Redcar.platform == :windows && Redcar.environment != :test 
    dir = File.join(path, "._redcar")
  else
    dir = File.join(path, ".redcar")
  end
  unless File.directory? dir
    FileUtils.mkdir_p(dir)
    if Redcar.platform == :windows
      system("attrib.exe +H \"#{dir}") # make hidden for cmd directory listings
    end
  end
  dir
end

- (Object) config_files(glob)



249
250
251
252
# File 'plugins/project/lib/project.rb', line 249

def config_files(glob)
  file_glob = File.join("{#{config_dir},#{Redcar.user_dir}}", glob)
  Dir[file_glob]
end

- (Boolean) contains_path?(path)

Returns:

  • (Boolean)


182
183
184
# File 'plugins/project/lib/project.rb', line 182

def contains_path?(path)
  File.expand_path(path) =~ /^#{Regexp.escape(@path)}($|\/|\\)/
end

- (Object) file_list



204
205
206
# File 'plugins/project/lib/project.rb', line 204

def file_list
  @file_list ||= FileList.new(path)
end

- (Object) file_list_resource



208
209
210
211
212
213
# File 'plugins/project/lib/project.rb', line 208

def file_list_resource
  @resource ||= Resource.new("refresh file list for #{@path}") do
    file_list.update
    send_refresh_to_plugins
  end
end

- (Object) gained_focus



240
241
242
243
# File 'plugins/project/lib/project.rb', line 240

def gained_focus
  refresh
  @lost_application_focus = nil
end

- (Object) home_dir



245
246
247
# File 'plugins/project/lib/project.rb', line 245

def home_dir
  @path
end

- (Object) inspect



65
66
67
# File 'plugins/project/lib/project.rb', line 65

def inspect
  "<Project #{path}>"
end

- (Object) lock



88
89
90
91
92
# File 'plugins/project/lib/project.rb', line 88

def lock
  File.open(lock_filename, "w") do |fout|
    fout.puts "#{$$}: Locked by #{$$} at #{Time.now}"
  end
end

- (Object) lock_filename



94
95
96
# File 'plugins/project/lib/project.rb', line 94

def lock_filename
  File.join(config_dir, "redcar.lock")
end

- (Boolean) locked?

Returns:

  • (Boolean)


98
99
100
# File 'plugins/project/lib/project.rb', line 98

def locked?
  File.exist?(lock_filename)
end

- (Boolean) locked_by_this_process?

Returns:

  • (Boolean)


114
115
116
117
118
# File 'plugins/project/lib/project.rb', line 114

def locked_by_this_process?
  return false unless locked?
  locking_pid = File.read(lock_filename).split(":").first
  locking_pid == $$.to_s
end

- (Object) lost_application_focus



236
237
238
# File 'plugins/project/lib/project.rb', line 236

def lost_application_focus
  @lost_application_focus = true
end

- (Object) notebook_added(notebook)



161
162
163
164
165
# File 'plugins/project/lib/project.rb', line 161

def notebook_added(notebook)
  @listeners.merge!(notebook => notebook.add_listener(:tab_focussed) do |tab|
    RevealInProjectCommand.new.run if tree and window and Project::Manager.reveal_file?(self)
  end)
end

- (Object) notebook_closed(notebook)



167
168
169
# File 'plugins/project/lib/project.rb', line 167

def notebook_closed(notebook)
  @listeners.delete(notebook)
end

- (Object) notebook_focussed(notebook)



155
156
157
158
159
# File 'plugins/project/lib/project.rb', line 155

def notebook_focussed(notebook)
  if notebook.focussed_tab and tree and Project::Manager.reveal_file?(self)
    RevealInProjectCommand.new.run
  end
end

- (Object) open(win)



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'plugins/project/lib/project.rb', line 69

def open(win)
  lock
  @window = win
  if current_project = Project.window_projects[window]
    current_project.close
  end
  window.treebook.add_tree(@tree)
  attach_listeners
  window.title = File.basename(@tree.tree_mirror.path)
  Manager.open_project_sensitivity.recompute
  Project.window_projects[window] = self
  Redcar.plugin_manager.objects_implementing(:project_loaded).each do |i|
    i.project_loaded(self)
  end
  Recent.store_path(path)
  Manager.storage['last_open_dir'] = path
  self
end

- (Boolean) ready?

Returns:

  • (Boolean)


61
62
63
# File 'plugins/project/lib/project.rb', line 61

def ready?
  @tree && @path
end

- (Object) recent_files

A list of files previously opened in this session for this project

 @return [Array<String>] an array of paths



189
190
191
# File 'plugins/project/lib/project.rb', line 189

def recent_files
  @recent_files ||= []
end

- (Object) refresh

Refresh the DirMirror Tree for the given Window, if there is one.



177
178
179
180
# File 'plugins/project/lib/project.rb', line 177

def refresh
  @tree.refresh
  file_list_resource.compute
end

- (Object) refresh_modified_file(path)



215
216
217
218
219
# File 'plugins/project/lib/project.rb', line 215

def refresh_modified_file(path)
  file_list.update(path)
  @tree.refresh
  send_refresh_to_plugins
end

- (Object) search(query, options)



254
255
256
# File 'plugins/project/lib/project.rb', line 254

def search(query)
  ProjectSearch::WordSearch.new(self, query, false, 0)
end

- (Object) send_refresh_to_plugins



225
226
227
228
229
230
231
232
233
234
# File 'plugins/project/lib/project.rb', line 225

def send_refresh_to_plugins
  Redcar.plugin_manager.objects_implementing(:project_refresh_task_type).each do |object|
    task = object.project_refresh_task_type.new(self)
    if Redcar::Resource.compute_synchronously
      task.execute
    else
      Redcar::Resource.task_queue.submit(task)
    end
  end
end

- (Object) storage(name)



135
136
137
# File 'plugins/project/lib/project.rb', line 135

def storage(name)
  Redcar::Plugin::BaseStorage.new(File.join(config_dir, "storage"), name)
end

- (Object) tree_removed(tree)



171
172
173
# File 'plugins/project/lib/project.rb', line 171

def tree_removed(tree)
  close if tree == @tree
end

- (Object) unlock



102
103
104
105
106
107
108
109
110
111
112
# File 'plugins/project/lib/project.rb', line 102

def unlock
  if locked?
    if locked_by_this_process?
      FileUtils.rm_rf(lock_filename)
    else
      raise "locked by another process"
    end
  else
    raise "project not locked"
  end
end