package org.docear.plugin.core.workspace.actions;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import javax.swing.SwingUtilities;
import org.docear.plugin.core.logging.DocearLogger;
import org.docear.plugin.core.ui.CreateProjectPagePanel;
import org.docear.plugin.core.ui.wizard.Wizard;
import org.docear.plugin.core.ui.wizard.WizardSession;
import org.docear.plugin.core.ui.wizard.WizardPageDescriptor;
import org.docear.plugin.core.workspace.model.DocearWorkspaceProject;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.TextUtils;
import org.freeplane.plugin.workspace.URIUtils;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.actions.AWorkspaceAction;
import org.freeplane.plugin.workspace.io.IProjectSettingsIOHandler.LOAD_RETURN_TYPE;
import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
public class DocearNewProjectAction extends AWorkspaceAction {
private static final long serialVersionUID = 1L;
public static final String KEY = "workspace.action.project.new";
public DocearNewProjectAction() {
super(KEY);
}
public void actionPerformed(ActionEvent event) {
final Wizard wiz = new Wizard(UITools.getFrame());
initWizard(wiz);
new Thread(new Runnable() {
@Override
public void run() {
int ret = wiz.show();
if(ret == Wizard.OK_OPTION) {
AWorkspaceProject project = wiz.getSession().get(DocearWorkspaceProject.class);
createProject(project);
}
}
}).start();
}
private void initWizard(Wizard wizard) {
//new project page
WizardPageDescriptor desc = new WizardPageDescriptor("page.project.create", new CreateProjectPagePanel()) {
public WizardPageDescriptor getNextPageDescriptor(WizardSession context) {
context.set(DocearWorkspaceProject.class, ((CreateProjectPagePanel)getPage()).getProject());
return Wizard.FINISH_PAGE;
}
@Override
public void aboutToDisplayPage(WizardSession context) {
super.aboutToDisplayPage(context);
context.getNextButton().setText(TextUtils.getText("docear.setup.wizard.controls.finish"));
}
@Override
public void displayingPage(WizardSession context) {
super.displayingPage(context);
context.setWizardTitle(TextUtils.getText("workspace.action.node.new.project.dialog.title"));
context.getBackButton().setVisible(false);
context.getNextButton().setText(TextUtils.getText("docear.setup.wizard.controls.finish"));
}
};
desc.getPage().setPreferredSize(new Dimension(640,480));
wizard.registerWizardPanel(desc);
wizard.setStartPage(desc.getIdentifier());
}
public static void createProject(final AWorkspaceProject project) {
try {
Runnable runnable = new Runnable() {
@Override
public void run() {
if(project == null) {
return;
}
File path = URIUtils.getFile(project.getProjectHome());
//WORKSPACE - todo: ask for permission to create the directory or check for always_create setting
if(!path.exists() ) {
path.mkdirs();
}
String projectName = null;
DocearProjectSettings settings = project.getExtensions(DocearProjectSettings.class);
if(settings != null) {
projectName = settings.getProjectName();
}
WorkspaceController.getCurrentModel().addProject(project);
try {
LOAD_RETURN_TYPE return_type = WorkspaceController.getCurrentModeExtension().getProjectLoader().loadProject(project);
if(return_type == LOAD_RETURN_TYPE.NEW_PROJECT && projectName != null && projectName.length() > 0) {
project.getModel().getRoot().setName(projectName);
project.getModel().nodeChanged(project.getModel().getRoot(), null, projectName);
}
} catch (IOException e) {
DocearLogger.error(e);
}
try {
WorkspaceController.save();
}
catch (Exception e) {
DocearLogger.warn(e);
}
}
};
if (EventQueue.isDispatchThread()) {
runnable.run();
}
else {
SwingUtilities.invokeAndWait(runnable);
}
}
catch (Exception ex) {
DocearLogger.warn(ex);
}
}
}