// Copyright 2011 Denis Stepanov
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package coffeescript.nb.project;
import coffeescript.nb.CoffeeScriptSourceEncodingQuery;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectInformation;
import org.netbeans.spi.project.ActionProvider;
import org.netbeans.spi.project.CopyOperationImplementation;
import org.netbeans.spi.project.DeleteOperationImplementation;
import org.netbeans.spi.project.ProjectState;
import org.netbeans.spi.project.ui.support.DefaultProjectOperations;
import org.openide.filesystems.FileObject;
import org.openide.util.Exceptions;
import org.openide.util.ImageUtilities;
import org.openide.util.Lookup;
import org.openide.util.lookup.Lookups;
/**
*
* @author Denis Stepanov
*/
public class CoffeeScriptProject implements Project {
private FileObject projectDirectory;
private ProjectState state;
private Lookup lookup;
public CoffeeScriptProject(FileObject projectDirectory, ProjectState state) {
this.projectDirectory = projectDirectory;
this.state = state;
}
public FileObject getProjectDirectory() {
return projectDirectory;
}
FileObject getConfigFile(boolean create) {
FileObject result =
projectDirectory.getFileObject(CoffeeScriptProjectFactory.PROJECT_CONFIG_FILE);
if (result == null && create) {
try {
result = projectDirectory.createData(CoffeeScriptProjectFactory.PROJECT_CONFIG_FILE);
} catch (IOException ioe) {
Exceptions.printStackTrace(ioe);
}
}
return result;
}
@Override
public Lookup getLookup() {
if (lookup == null) {
lookup = Lookups.fixed(new Object[]{
this,
state,
new CoffeeScriptActionProvider(),
new CoffeeScriptDeleteOperation(),
new CoffeeScriptCopyOperation(this),
new CoffeeScriptProjectInfo(),
new CoffeeScriptLogicalView(this),
new CoffeeScriptSourceEncodingQuery()
// new CoffeeScriptProjectCustomizer(this)
});
}
return lookup;
}
private final class CoffeeScriptActionProvider implements ActionProvider {
private String[] supported = new String[]{
ActionProvider.COMMAND_DELETE,
ActionProvider.COMMAND_COPY,};
@Override
public String[] getSupportedActions() {
return supported;
}
@Override
public void invokeAction(String string, Lookup lookup) throws IllegalArgumentException {
if (string.equalsIgnoreCase(ActionProvider.COMMAND_DELETE)) {
DefaultProjectOperations.performDefaultDeleteOperation(CoffeeScriptProject.this);
}
if (string.equalsIgnoreCase(ActionProvider.COMMAND_COPY)) {
DefaultProjectOperations.performDefaultCopyOperation(CoffeeScriptProject.this);
}
}
@Override
public boolean isActionEnabled(String command, Lookup lookup) throws IllegalArgumentException {
if ((command.equals(ActionProvider.COMMAND_DELETE))) {
return true;
} else if ((command.equals(ActionProvider.COMMAND_COPY))) {
return true;
} else {
throw new IllegalArgumentException(command);
}
}
}
private final class CoffeeScriptDeleteOperation implements DeleteOperationImplementation {
public void notifyDeleting() throws IOException {
}
public void notifyDeleted() throws IOException {
}
public List<FileObject> getMetadataFiles() {
List<FileObject> dataFiles = new ArrayList<FileObject>();
return dataFiles;
}
public List<FileObject> getDataFiles() {
List<FileObject> dataFiles = new ArrayList<FileObject>();
return dataFiles;
}
}
private final class CoffeeScriptCopyOperation implements CopyOperationImplementation {
private final CoffeeScriptProject project;
private final FileObject projectDir;
public CoffeeScriptCopyOperation(CoffeeScriptProject project) {
this.project = project;
this.projectDir = project.getProjectDirectory();
}
public List<FileObject> getMetadataFiles() {
return Collections.EMPTY_LIST;
}
public List<FileObject> getDataFiles() {
return Collections.EMPTY_LIST;
}
public void notifyCopying() throws IOException {
}
public void notifyCopied(Project arg0, File arg1, String arg2) throws IOException {
}
}
private final class CoffeeScriptProjectInfo implements ProjectInformation {
@Override
public Icon getIcon() {
return new ImageIcon(ImageUtilities.loadImage(
"coffeescript/nb/resources/coffeescript-icon.png"));
}
@Override
public String getName() {
return getProjectDirectory().getName();
}
@Override
public String getDisplayName() {
return getName();
}
@Override
public void addPropertyChangeListener(PropertyChangeListener pcl) {
//do nothing, won't change
}
@Override
public void removePropertyChangeListener(PropertyChangeListener pcl) {
//do nothing, won't change
}
@Override
public Project getProject() {
return CoffeeScriptProject.this;
}
}
}