org.apache.cayenne.modeler.action.ProjectOpener Maven / Gradle / Ivy
/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.cayenne.modeler.action;
import java.awt.Frame;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.dialog.OverwriteDialog;
import org.apache.cayenne.modeler.util.FileFilters;
import org.apache.cayenne.project.Project;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* File chooser panel used to select a directory to store project files.
*
*/
class ProjectOpener extends JFileChooser {
private static Log logObj = LogFactory.getLog(ProjectOpener.class);
/**
* Selects a directory to store the project.
*/
File newProjectDir(Frame f, Project p) {
if (p instanceof Project) {
StringBuilder nameProject = new StringBuilder("cayenne");
if(((DataChannelDescriptor)p.getRootNode()).getName()!=null){
nameProject.append("-").append(((DataChannelDescriptor)p.getRootNode()).getName());
}
nameProject.append(".xml");
// configure for application project
return newProjectDir(f, nameProject.toString(), FileFilters
.getApplicationFilter());
}
else {
String message = (p == null)
? "Null project."
: "Unrecognized project class: " + p.getClass().getName();
throw new CayenneRuntimeException(message);
}
}
File newProjectDir(Frame f, String location, FileFilter filter) {
// configure dialog
setDialogTitle("Select Project Directory");
setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
setCurrentDirectory(getDefaultStartDir());
// preselect current directory
if (getCurrentDirectory() != null) {
setSelectedFile(getCurrentDirectory());
}
// configure filters
resetChoosableFileFilters();
// allow users to see directories with cayenne.xml files
addChoosableFileFilter(filter);
File selectedDir;
while (true) {
int status = showDialog(f, "Select");
selectedDir = getSelectedFile();
if (status != JFileChooser.APPROVE_OPTION || selectedDir == null) {
logObj.info("Save canceled.");
return null;
}
// normalize selection
logObj.info("Selected: " + selectedDir);
if (!selectedDir.isDirectory()) {
selectedDir = getSelectedFile().getParentFile();
}
// check for overwrite
File projectFile = new File(selectedDir, location);
if (projectFile.exists()) {
OverwriteDialog dialog = new OverwriteDialog(projectFile, f);
dialog.show();
if (dialog.shouldOverwrite()) {
break;
}
else if (dialog.shouldSelectAnother()) {
continue;
}
else {
// canceled
return null;
}
}
else {
break;
}
}
return selectedDir;
}
/**
* Runs a dialog to open Cayenne project.
*/
File openProjectFile(Frame f) {
// configure dialog
setDialogTitle("Select Project File");
setFileSelectionMode(JFileChooser.FILES_ONLY);
setCurrentDirectory(getDefaultStartDir());
// configure filters
resetChoosableFileFilters();
addChoosableFileFilter(FileFilters.getApplicationFilter());
// default to App projects
setFileFilter(FileFilters.getApplicationFilter());
int status = showOpenDialog(f);
if (status != JFileChooser.APPROVE_OPTION) {
return null;
}
return getSelectedFile();
}
/**
* Returns directory where file search should start. This is either coming from saved
* preferences, or a current directory is used.
*/
File getDefaultStartDir() {
// find start directory in preferences
File existingDir = Application
.getInstance()
.getFrameController()
.getLastDirectory()
.getExistingDirectory(false);
if (existingDir == null) {
// go to current dir...
existingDir = new File(System.getProperty("user.dir"));
}
return existingDir;
}
}