提交 3202047f 编写于 作者: M Mathieu Bastian

Correct issues on project management

上级 6d4ef9c7
......@@ -345,6 +345,17 @@ public class ProjectControllerUIImpl implements ProjectListener {
return true;
}
public void openProject(Project project) {
longTaskExecutor.execute(null, () -> {
if (controller.getCurrentProject() != null) {
if (!closeCurrentProject()) {
return;
}
}
controller.openProject(project);
});
}
public void openProject(File file) {
longTaskExecutor.execute(null, () -> {
if (controller.getCurrentProject() != null) {
......@@ -356,6 +367,17 @@ public class ProjectControllerUIImpl implements ProjectListener {
});
}
public void removeProject(Project project) {
longTaskExecutor.execute(null, () -> {
if (controller.getCurrentProject() == project) {
if (!closeCurrentProject()) {
return;
}
}
controller.removeProject(project);
});
}
public boolean canCloseProject() {
return closeProject;
}
......@@ -459,6 +481,7 @@ public class ProjectControllerUIImpl implements ProjectListener {
ProjectList panel = new ProjectList();
DialogDescriptor dd = new DialogDescriptor(panel,
NbBundle.getMessage(ProjectControllerUIImpl.class, "ManageProjects_dialog_title"));
dd.setOptions(new Object[] {NotifyDescriptor.CLOSED_OPTION});
DialogDisplayer.getDefault().notify(dd);
}
......
......@@ -12,7 +12,6 @@ import org.openide.util.NbBundle;
@ActionID(id = "org.gephi.desktop.project.actions.ManageProjects", category = "File")
@ActionRegistration(displayName = "#CTL_ManageProjects", lazy = false)
@ActionReference(path = "Menu/File", position = 490)
public final class ManageProjects extends AbstractAction {
ManageProjects() {
......@@ -21,7 +20,7 @@ public final class ManageProjects extends AbstractAction {
@Override
public boolean isEnabled() {
return Lookup.getDefault().lookup(ProjectControllerUIImpl.class).canProjectProperties();
return true;
}
@Override
......
......@@ -48,6 +48,7 @@ import javax.swing.AbstractAction;
import org.gephi.desktop.importer.api.ImportControllerUI;
import org.gephi.desktop.project.ProjectControllerUIImpl;
import org.gephi.io.importer.spi.FileImporterBuilder;
import org.gephi.project.api.Project;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.awt.ActionID;
......@@ -100,6 +101,8 @@ public final class OpenFile extends AbstractAction {
} else if (ev != null && ev.getSource() != null && ev.getSource() instanceof FileImporterBuilder[]) {
Lookup.getDefault().lookup(ProjectControllerUIImpl.class)
.openFile((FileImporterBuilder[]) ev.getSource());
} else if (ev != null && ev.getSource() != null && ev.getSource() instanceof Project) {
Lookup.getDefault().lookup(ProjectControllerUIImpl.class).openProject((Project) ev.getSource());
} else {
Lookup.getDefault().lookup(ProjectControllerUIImpl.class).openFile();
}
......
......@@ -123,6 +123,10 @@ public class RecentFiles extends AbstractAction implements DynamicMenuContent {
}
items.addAll(filesItems);
// Manage projects
items.add(new JSeparator());
items.add(new JMenuItem(Actions.forID("File", "org.gephi.desktop.project.actions.ManageProjects")));
return items.toArray(new JComponent[0]);
}
......
......@@ -2,12 +2,15 @@ package org.gephi.ui.project;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import org.gephi.desktop.project.ProjectControllerUIImpl;
import org.gephi.project.api.Project;
import org.gephi.project.api.ProjectController;
import org.openide.awt.Actions;
import org.openide.util.Lookup;
public class ProjectList extends javax.swing.JPanel {
......@@ -23,12 +26,27 @@ public class ProjectList extends javax.swing.JPanel {
projectList.setCellRenderer(new ProjectCellRenderer());
projectList.addListSelectionListener(evt -> {
if (!evt.getValueIsAdjusting()) {
Project project = projectList.getModel().getElementAt(projectList.getSelectedIndex());
Project project = null;
if (projectList.getSelectedIndex() != -1) {
project = projectList.getModel().getElementAt(projectList.getSelectedIndex());
}
openProjectButton.setEnabled(project != null && project.isClosed());
removeProjectButton.setEnabled(project != null);
}
});
openProjectButton.addActionListener(evt -> {
Project project = projectList.getModel().getElementAt(projectList.getSelectedIndex());
Actions.forID("File", "org.gephi.desktop.project.actions.OpenFile").actionPerformed(
new ActionEvent(project, 0, null));
});
removeProjectButton.addActionListener(evt -> {
Project project = projectList.getModel().getElementAt(projectList.getSelectedIndex());
Lookup.getDefault().lookup(ProjectControllerUIImpl.class).removeProject(project);
((DefaultListModel<Project>)projectList.getModel()).removeElement(project);
});
setup();
}
......@@ -54,7 +72,11 @@ public class ProjectList extends javax.swing.JPanel {
} else {
c.setFont(c.getFont().deriveFont(Font.PLAIN));
}
c.setText(p.getName());
String name = p.getName();
if (p.getFileName() != null) {
name += " (" + p.getFileName() + ")";
}
c.setText(name);
return c;
}
}
......
......@@ -10,7 +10,7 @@ CTL_DuplicateWorkspace=Duplicate
CTL_DeleteWorkspace=Delete
CTL_DeleteOtherWorkspaces=Delete Other Workspaces
CTL_RenameWorkspace=Rename
CTL_ManageProjects=Projects...
CTL_ManageProjects=Manage Projects...
CTL_WorkspaceProperties=Properties...
CTL_OpenOnlineDoc=Online docs and support
RenameWorkspace.dialog.title = Rename Workspace
......
......@@ -292,11 +292,11 @@ public class ProjectControllerImpl implements ProjectController {
}
private void openProjectInternal(Project project) {
final ProjectImpl projectImpl = (ProjectImpl) project;
ProjectImpl projectImpl = (ProjectImpl) project;
if (projects.hasCurrentProject()) {
closeCurrentProject();
}
projects.addOrReplaceProject(projectImpl);
projectImpl = projects.addOrReplaceProject(projectImpl);
projects.setCurrentProject(projectImpl);
for (Workspace ws : projectImpl.getWorkspaces()) {
......
......@@ -101,17 +101,35 @@ public class ProjectsImpl implements Projects {
return null;
}
public void addOrReplaceProject(ProjectImpl project) {
public ProjectImpl addOrReplaceProject(ProjectImpl project) {
synchronized (projects) {
if (!projects.contains(project)) {
if (projects.contains(project)) {
projects.remove(project);
projects.add(project);
} else {
projects.remove(project);
ProjectImpl projectWithSameFileName = findProjectByFile(project.getFile());
if (projectWithSameFileName != null) {
return projectWithSameFileName;
}
projects.add(project);
}
return project;
}
}
private ProjectImpl findProjectByFile(File file) {
if (file != null) {
synchronized (projects) {
for (ProjectImpl p : projects) {
if (p.getFile().equals(file)) {
return p;
}
}
}
}
return null;
}
public void removeProject(ProjectImpl project) {
synchronized (projects) {
projects.remove(project);
......
......@@ -91,4 +91,19 @@ public class ProjectsImplTest {
Assert.assertEquals("p1", projects.getProjectByIdentifier("i1").getName());
Assert.assertEquals("p2", projects.getProjectByIdentifier("i2").getName());
}
@Test
public void testDoesNotCreateNewProjectSameFile() throws IOException {
ProjectsImpl projects = new ProjectsImpl();
ProjectImpl p1 = new ProjectImpl("i1", "p1");
Assert.assertSame(p1, projects.addOrReplaceProject(p1));
File file = tempFolder.newFile("p1.gephi");
p1.setFile(file);
ProjectImpl p2 = new ProjectImpl("i2", "p2");
p2.setFile(file);
Assert.assertSame(p1, projects.addOrReplaceProject(p2));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册