/* GanttProject is an opensource project management tool. Copyright (C) 2010-2011 Dmitry Barashev, GanttProject team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.importer; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.osgi.service.prefs.Preferences; import biz.ganttproject.core.calendar.ImportCalendarOption; import biz.ganttproject.core.option.ChangeValueEvent; import biz.ganttproject.core.option.ChangeValueListener; import biz.ganttproject.core.option.GPOption; import biz.ganttproject.core.table.ColumnList; import net.sourceforge.ganttproject.CustomPropertyDefinition; import net.sourceforge.ganttproject.CustomPropertyManager; import net.sourceforge.ganttproject.IGanttProject; import net.sourceforge.ganttproject.document.Document; import net.sourceforge.ganttproject.document.FileDocument; import net.sourceforge.ganttproject.document.Document.DocumentException; import net.sourceforge.ganttproject.gui.UIFacade; import net.sourceforge.ganttproject.resource.HumanResource; import net.sourceforge.ganttproject.resource.HumanResourceMerger; import net.sourceforge.ganttproject.resource.OverwritingMerger; import net.sourceforge.ganttproject.resource.HumanResourceMerger.MergeResourcesOption; import net.sourceforge.ganttproject.task.Task; import net.sourceforge.ganttproject.task.TaskManagerImpl; import net.sourceforge.ganttproject.task.algorithm.AlgorithmCollection; public class ImporterFromGanttFile extends ImporterBase { private final HumanResourceMerger.MergeResourcesOption myMergeResourcesOption = new HumanResourceMerger.MergeResourcesOption(); private final ImportCalendarOption myImportCalendarOption = new ImportCalendarOption(); private final GPOption[] myOptions = new GPOption[] { myMergeResourcesOption, myImportCalendarOption }; public ImporterFromGanttFile() { super("ganttprojectFiles"); myMergeResourcesOption.loadPersistentValue(HumanResourceMerger.MergeResourcesOption.BY_ID); myImportCalendarOption.setSelectedValue(ImportCalendarOption.Values.NO); } @Override public String getFileNamePattern() { return "xml|gan"; } @Override protected GPOption[] getOptions() { return myOptions; } @Override public void setContext(IGanttProject project, UIFacade uiFacade, Preferences preferences) { super.setContext(project, uiFacade, preferences); final Preferences node = preferences.node("/instance/net.sourceforge.ganttproject/import"); myMergeResourcesOption.lock(); myMergeResourcesOption.loadPersistentValue(node.get(myMergeResourcesOption.getID(), HumanResourceMerger.MergeResourcesOption.BY_ID)); myMergeResourcesOption.commit(); myMergeResourcesOption.addChangeValueListener(new ChangeValueListener() { @Override public void changeValue(ChangeValueEvent event) { node.put(myMergeResourcesOption.getID(), String.valueOf(event.getNewValue())); } }); } @Override public void run() { final File selectedFile = getFile(); final IGanttProject targetProject = getProject(); final BufferProject bufferProject = createBufferProject(targetProject, getUiFacade()); getUiFacade().getUndoManager().undoableEdit("Import", new Runnable() { @Override public void run() { ImporterFromGanttFile.this.run(selectedFile, targetProject, bufferProject); } }); } private void run(File selectedFile, IGanttProject targetProject, BufferProject bufferProject) { try { Document document = bufferProject.getDocumentManager().getDocument(selectedFile.getAbsolutePath()); AlgorithmCollection algs = getProject().getTaskManager().getAlgorithmCollection(); try { algs.getScheduler().setEnabled(false); algs.getRecalculateTaskScheduleAlgorithm().setEnabled(false); algs.getAdjustTaskBoundsAlgorithm().setEnabled(false); document.read(); } finally { algs.getRecalculateTaskScheduleAlgorithm().setEnabled(true); algs.getAdjustTaskBoundsAlgorithm().setEnabled(true); algs.getScheduler().setEnabled(true); } importBufferProject(targetProject, bufferProject, getUiFacade(), myMergeResourcesOption, myImportCalendarOption); } catch (DocumentException e) { getUiFacade().showErrorDialog(e); } catch (IOException e) { getUiFacade().showErrorDialog(e); } } private static class TaskFieldImpl implements ColumnList.Column { private final String myID; private final int myOrder; private final int myWidth; TaskFieldImpl(String id, int order, int width) { myID = id; myOrder = order; myWidth = width; } @Override public String getID() { return myID; } @Override public int getOrder() { return myOrder; } @Override public int getWidth() { return myWidth; } @Override public boolean isVisible() { return true; } @Override public String getName() { return null; } @Override public void setVisible(boolean visible) { } @Override public void setOrder(int order) { } @Override public void setWidth(int width) { } } static class VisibleFieldsImpl implements ColumnList { private final List<Column> myFields = new ArrayList<Column>(); @Override public void add(String name, int order, int width) { myFields.add(new TaskFieldImpl(name, order, width)); } @Override public void clear() { myFields.clear(); } @Override public Column getField(int index) { return myFields.get(index); } @Override public int getSize() { return myFields.size(); } @Override public void importData(ColumnList source) { for (int i = 0; i < source.getSize(); i++) { Column nextField = source.getField(i); myFields.add(nextField); } } } private BufferProject createBufferProject(final IGanttProject targetProject, final UIFacade uiFacade) { return new BufferProject(targetProject, uiFacade); } protected Document getDocument(File selectedFile) { return new FileDocument(selectedFile); } public static Map<Task, Task> importBufferProject(IGanttProject targetProject, BufferProject bufferProject, UIFacade uiFacade, MergeResourcesOption mergeOption, ImportCalendarOption importCalendarOption) { targetProject.getRoleManager().importData(bufferProject.getRoleManager()); if (importCalendarOption != null) { targetProject.getActiveCalendar().importCalendar(bufferProject.getActiveCalendar(), importCalendarOption); } { CustomPropertyManager targetResCustomPropertyMgr = targetProject.getResourceCustomPropertyManager(); targetResCustomPropertyMgr.importData(bufferProject.getResourceCustomPropertyManager()); } Map<HumanResource, HumanResource> original2ImportedResource = targetProject.getHumanResourceManager().importData( bufferProject.getHumanResourceManager(), new OverwritingMerger(mergeOption)); Map<Task, Task> result = null; { CustomPropertyManager targetCustomColumnStorage = targetProject.getTaskCustomColumnManager(); Map<CustomPropertyDefinition, CustomPropertyDefinition> that2thisCustomDefs = targetCustomColumnStorage.importData(bufferProject.getTaskCustomColumnManager()); TaskManagerImpl origTaskManager = (TaskManagerImpl) targetProject.getTaskManager(); try { origTaskManager.setEventsEnabled(false); result = origTaskManager.importData(bufferProject.getTaskManager(), that2thisCustomDefs); origTaskManager.importAssignments(bufferProject.getTaskManager(), targetProject.getHumanResourceManager(), result, original2ImportedResource); } finally { origTaskManager.setEventsEnabled(true); } } uiFacade.refresh(); uiFacade.getTaskTree().getVisibleFields().importData(bufferProject.getVisibleFields()); uiFacade.getResourceTree().getVisibleFields().importData(bufferProject.myResourceVisibleFields); return result; } }