package org.korsakow.ide.ui.controller;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JProgressBar;
import org.korsakow.ide.Application;
import org.korsakow.ide.lang.LanguageBundle;
import org.korsakow.ide.ui.ProjectExplorer;
import org.korsakow.ide.ui.controller.action.AboutAction;
import org.korsakow.ide.ui.controller.action.CopyAction;
import org.korsakow.ide.ui.controller.action.DeleteAction;
import org.korsakow.ide.ui.controller.action.DuplicateAction;
import org.korsakow.ide.ui.controller.action.ExitAction;
import org.korsakow.ide.ui.controller.action.ExportDraftWebAction;
import org.korsakow.ide.ui.controller.action.ExportMenuAction;
import org.korsakow.ide.ui.controller.action.ExportWebAction;
import org.korsakow.ide.ui.controller.action.HelpExampleAction;
import org.korsakow.ide.ui.controller.action.ImportK3Action;
import org.korsakow.ide.ui.controller.action.ImportMenuAction;
import org.korsakow.ide.ui.controller.action.KorsakowHomePageAction;
import org.korsakow.ide.ui.controller.action.LogAction;
import org.korsakow.ide.ui.controller.action.MenuEditAction;
import org.korsakow.ide.ui.controller.action.MenuLanguageAction;
import org.korsakow.ide.ui.controller.action.MenuWindowAction;
import org.korsakow.ide.ui.controller.action.NewProjectAction;
import org.korsakow.ide.ui.controller.action.OpenProjectFileAction;
import org.korsakow.ide.ui.controller.action.PasteAction;
import org.korsakow.ide.ui.controller.action.ProjectSettingsAction;
import org.korsakow.ide.ui.controller.action.SaveProjectAction;
import org.korsakow.ide.ui.controller.action.SaveProjectAsAction;
import org.korsakow.ide.ui.controller.action.ShowKeywordPoolWindowAction;
import org.korsakow.ide.ui.controller.action.ShowLinkPoolWindowAction;
import org.korsakow.ide.ui.controller.action.ShowPossiblePoolWindowAction;
import org.korsakow.ide.ui.controller.action.ShowSnuPoolWindowAction;
import org.korsakow.ide.ui.controller.action.UndoAction;
import org.korsakow.ide.ui.controller.action.helper.PlatformActionHandler;
import org.korsakow.ide.ui.controller.action.interf.ExportInterfaceAction;
import org.korsakow.ide.ui.controller.action.interf.ImportInterfaceAction;
import org.korsakow.ide.ui.controller.action.media.ImportMediaAction;
public class ProjectExplorerController
{
private final ProjectExplorer projectExplorer;
private final ResourceExplorerController resourceExplorerController;
private final AboutAction aboutAction;
private final ExitAction exitAction;
private WindowTitleUpdater windowTitleUpdater;
public ProjectExplorerController(ProjectExplorer projectExplorer)
{
this.projectExplorer = projectExplorer;
resourceExplorerController = new ResourceExplorerController(projectExplorer.getResourceBrowser());
Application.getInstance().addApplicationListener(resourceExplorerController);
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileNew, new NewProjectAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileOpen, new OpenProjectFileAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileSave, new SaveProjectAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileSaveAs, new SaveProjectAsAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileProjectSettings, new ProjectSettingsAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileImport, new ImportMenuAction(projectExplorer.getResourceBrowser().getResourceTreeTable()));
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileImportMedia, new ImportMediaAction(projectExplorer.getResourceBrowser().getResourceTreeTable()));
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileImportK3Project, new ImportK3Action());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileImportInterface, new ImportInterfaceAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileExport, new ExportMenuAction(projectExplorer.getResourceBrowser().getResourceTreeTable()));
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileExportWeb, new ExportWebAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileExportDraftWeb, new ExportDraftWebAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileExportInterface, new ExportInterfaceAction(projectExplorer.getResourceBrowser().getResourceTreeTable()));
exitAction = new ExitAction();
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuFileExit, exitAction);
Application.getInstance().getPlatformApplication().addApplicationListener(new PlatformActionHandler());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuEdit, new MenuEditAction(projectExplorer));
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuEditCopy, new CopyAction(projectExplorer.getResourceBrowser().getResourceTreeTable()));
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuEditPaste, new PasteAction(projectExplorer.getResourceBrowser().getResourceTreeTable()));
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuEditDuplicate, new DuplicateAction(projectExplorer.getResourceBrowser().getResourceTreeTable()));
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuEditDelete, new DeleteAction(projectExplorer.getResourceBrowser().getResourceTreeTable()));
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuEditUndo, new UndoAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuLanguage, new MenuLanguageAction(projectExplorer));
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuToolsKeywordPool, new ShowKeywordPoolWindowAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuToolsLinkPool, new ShowLinkPoolWindowAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuToolsPossiblePool, new ShowPossiblePoolWindowAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuToolsSnuPool, new ShowSnuPoolWindowAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuWindow, new MenuWindowAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuHelpExample, new HelpExampleAction());
aboutAction = new AboutAction();
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuHelpAbout, aboutAction);
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuHelpLog, new LogAction());
projectExplorer.addMenuAction(ProjectExplorer.Action.MenuHelpKorsakowWebSite, new KorsakowHomePageAction());
Application.getInstance().addApplicationListener(windowTitleUpdater = new WindowTitleUpdater());
}
public void loadDefaultProject()
{
try {
List<String> recent = SaveProjectAction.getRecent();
List<String> toRemove = new ArrayList<String>();
boolean loaded = false;
for (String filename : recent)
{
File file = new File(filename);
try {
ProjectLoader.loadProject(file);
loaded = true;
break;
} catch (FileNotFoundException e) {
toRemove.add(filename);
Application.getInstance().showAlertDialog(LanguageBundle.getString("general.errors.filenotfound.title"), LanguageBundle.getString("general.errors.filenotfound.message", file.getPath()));
} catch (Exception e) {
toRemove.add(filename);
Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.cantopen.title"), file.getAbsolutePath(), e);
} catch (Throwable e) {
// catch(Throwable) added due to an IllegalAccessError in Xerces for reasons unknown.
toRemove.add(filename);
Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.cantopen.title"), file.getAbsolutePath(), e);
}
}
recent.removeAll(toRemove);
SaveProjectAction.setRecent(recent);
if (!loaded)
ProjectLoader.newProject();
} catch (Exception e) {
Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.cantnew.title"), e);
}
}
public static class ProgressBarWorkerListener implements PropertyChangeListener
{
JProgressBar progressBar;
public ProgressBarWorkerListener(JProgressBar progressBar)
{
this.progressBar = progressBar;
}
public void propertyChange(PropertyChangeEvent event) {
if (event.getPropertyName().equals("progress")) {
progressBar.setValue((Integer)event.getNewValue());
} else
if (event.getPropertyName().equals("displayString")) {
progressBar.setString((String)event.getNewValue());
}
}
}
}