Author: chatellier Date: 2009-10-26 15:19:57 +0000 (Mon, 26 Oct 2009) New Revision: 2693 Added: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptTypesComboModel.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ScriptTreeCellRenderer.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ScriptTreeModel.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/package-info.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/package-info.java Removed: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/util/CompilationResult.java Modified: isis-fish/trunk/changelog.txt isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptAction.java isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptUI.jaxx isis-fish/trunk/src/main/resources/i18n/isis-fish-en_GB.properties isis-fish/trunk/src/main/resources/i18n/isis-fish-fr_FR.properties Log: Script UI refactoring (tree model, combo model, commit, delete, actions...) Modified: isis-fish/trunk/changelog.txt =================================================================== --- isis-fish/trunk/changelog.txt 2009-10-26 15:02:52 UTC (rev 2692) +++ isis-fish/trunk/changelog.txt 2009-10-26 15:19:57 UTC (rev 2693) @@ -1,13 +1,18 @@ isis-fish (3.3.0.0) stable; urgency=low - * Fix a depth commit problem on script UI - * Readd diff on script UI + * Global VCS improvement (code, script UI, inptu UI) * Update to svnkit 1.3.1 * Unification of error frames - * Move codelutin libs to nuiton.org + * Move codelutin librairies to nuiton.org -- mar. oct. 13 09:48:15 CEST 2009 +isis-fish (3.2.0.9) stable; urgency=high + + * Add file redirection in caparmor simulation launch scripts + +-- mer. oct. 21 14:27:05 CEST 2009 + isis-fish (3.2.0.8) stable; urgency=high * Fix compilation directory per simulation problem (aspect were defined Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptAction.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptAction.java 2009-10-26 15:02:52 UTC (rev 2692) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptAction.java 2009-10-26 15:19:57 UTC (rev 2693) @@ -21,6 +21,7 @@ import static org.nuiton.i18n.I18n._; +import java.awt.Color; import java.awt.Desktop; import java.io.ByteArrayOutputStream; import java.io.File; @@ -39,6 +40,11 @@ import java.util.Map; import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; @@ -61,10 +67,11 @@ import fr.ifremer.isisfish.datastore.SensitivityStorage; import fr.ifremer.isisfish.datastore.SimulatorStorage; import fr.ifremer.isisfish.equation.Language; +import fr.ifremer.isisfish.ui.WelcomePanelUI; +import fr.ifremer.isisfish.ui.script.model.ScriptTreeModel; import fr.ifremer.isisfish.ui.util.ErrorHelper; -import fr.ifremer.isisfish.ui.widget.editor.GenericCell; +import fr.ifremer.isisfish.ui.vcs.UpdateDialogUI; import fr.ifremer.isisfish.util.ClasspathTemplateLoader; -import fr.ifremer.isisfish.util.CompilationResult; import fr.ifremer.isisfish.util.JavadocHelper; import fr.ifremer.isisfish.vcs.VCSException; import freemarker.cache.TemplateLoader; @@ -94,137 +101,162 @@ * Last update: $Date: 2008-10-07 18:46:13 +0200 (mar 07 oct 2008) $ * by : $Author: tchemit $ */ -public class ScriptAction { +public class ScriptAction implements TreeSelectionListener, CaretListener { /** to use log facility, just put in your code: log.info(\"...\"); */ private static Log log = LogFactory.getLog(ScriptAction.class); - protected CodeSourceStorage code; + /** Couleur de succes (vert leger). */ + protected static final Color COLOR_SUCCESS = new Color(210, 255, 210); - protected File fileOpen = null; + /** Couleur d'echec (rouge leger). */ + protected static final Color COLOR_FAILURE = new Color(255, 210, 210); + /** Storage for currently edited file. */ + protected CodeSourceStorage codeStorage; + + /** Freemarke configuration used to create new script (based on templates). */ protected Configuration freemarkerConfiguration; + /** UI managed by this action class. */ + protected ScriptUI scriptUI; + /** * Constructeur. * * Init freemarker. + * + * @param scriptUI managed script UI */ - public ScriptAction() { + public ScriptAction(ScriptUI scriptUI) { + this.scriptUI = scriptUI; + freemarkerConfiguration = new Configuration(); - // needed to overwrite "Defaults to default system encoding." // fix encoding issue on some systems freemarkerConfiguration.setDefaultEncoding("utf-8"); - // specific template loader to get template from jars (classpath) TemplateLoader templateLoader = new ClasspathTemplateLoader(); freemarkerConfiguration.setTemplateLoader(templateLoader); - //freemarkerConfiguration.setObjectWrapper(new BeansWrapper()); - } - public CodeSourceStorage getCode() { - return code; + /** + * Post init, must be called after ui building. + */ + public void postInit() { + + // add listeners + this.scriptUI.getTree().addTreeSelectionListener(this); + this.scriptUI.getEditor().addCaretListener(this); } /** - * @return an array of all script's modules names managed by this screen + * Update script UI component actions buttons. */ - public static String[] getScriptTypesNames() { - ScriptMapping[] values = ScriptMapping.values(); - String[] result = new String[values.length]; - for (int i = 0; i < result.length; i++) { - result[i] = values[i].name(); + protected void setButton() { + + File selectedFile = (File)scriptUI.getTree().getLastSelectedPathComponent(); + + if (selectedFile != null) { + scriptUI.setSingleFileSelected(selectedFile.isFile()); + scriptUI.setJavaFileSelected(selectedFile.getName().endsWith(".java")); } - return result; + else { + scriptUI.setSingleFileSelected(false); + scriptUI.setJavaFileSelected(false); + } + + /*buttonScriptExport.setEnabled(tree.getSelectionValue() != null); + miExport.setEnabled(tree.getSelectionValue() != null); + buttonScriptCommit.setEnabled(fileSelected); + miCommitVCS.setEnabled(fileSelected); + miDiffVCS.setEnabled(fileSelected); + //buttonScriptUpdate.setEnabled(fileSelected); + buttonScriptSave.setEnabled(fileSelected); + miSave.setEnabled(fileSelected); + buttonScriptCut.setEnabled(fileSelected); + miCut.setEnabled(fileSelected); + buttonScriptCopy.setEnabled(fileSelected); + miCopy.setEnabled(fileSelected); + buttonScriptPaste.setEnabled(fileSelected); + miPaste.setEnabled(fileSelected); + buttonScriptCheck.setEnabled(isJavaScript); + miCheckSyntax.setEnabled(isJavaScript); + buttonScriptEval.setEnabled(isJavaScript); + miEvaluate.setEnabled(isJavaScript);*/ } - - public List<String> getScriptNames() { - return ScriptStorage.getScriptNames(); + + protected void setStatusMessage(String msg) { + // FIXME remove all parent container reference + WelcomePanelUI parentUI = scriptUI.getParentContainer(WelcomePanelUI.class); + parentUI.setStatusMessage(msg); } - - public List<String> getSimulatorNames() { - return SimulatorStorage.getSimulatorNames(); + protected void setStatusMessage(String msg, boolean running) { + // FIXME remove all parent container reference + WelcomePanelUI parentUI = scriptUI.getParentContainer(WelcomePanelUI.class); + parentUI.setStatusMessage(msg, running); } - - public List<String> getExportNames() { - return ExportStorage.getExportNames(); - } - - public List<String> getRuleNames() { - return RuleStorage.getRuleNames(); - } - - public List<String> getAnalysePlanNames() { - return AnalysePlanStorage.getAnalysePlanNames(); - } - - public List<String> getSensitivityNames() { - return SensitivityStorage.getSensitivityNames(); - } - public List<String> getSensitivityExportsNames() { - return SensitivityExportStorage.getSensitivityExportNames(); + /** + * Make new script, and select it on tree. + */ + public void newScript() { + ScriptMapping selectedType = (ScriptMapping) scriptUI.getScriptTypeChoice().getSelectedItem(); + newScript(selectedType); } - public List<String> getCategories() { - return FormuleStorage.getCategories(); - } + /** + * Make new script, and select it on tree. + * + * @param scriptType script to make + */ + public void newScript(ScriptMapping scriptType) { - public List<String> getFormuleNames(String Categories) { - return FormuleStorage.getFormuleNames(Categories); - } + String equationModelType = ""; + String equationModelTypePath = ""; - public File getScriptDirectory() { - return ScriptStorage.getScriptDirectory(); - } + // specific case for equation model + if (scriptType.equals(ScriptMapping.EquationModel)) { + java.util.List<String> values = FormuleStorage.getCategories(); + equationModelType = (String) JOptionPane.showInputDialog(scriptUI, + _("isisfish.message.new.formule.category"), + _("isisfish.message.new.formule.title"), + JOptionPane.PLAIN_MESSAGE, null, values.toArray(), values.get(0)); + equationModelTypePath = equationModelType + File.separator; + } - public File getSimulatorDirectory() { - return SimulatorStorage.getSimulatorDirectory(); - } + // if user has not choose "cancel" + if (equationModelType != null) { + String fileName = JOptionPane + .showInputDialog(_("isisfish.message.new.filename")); + File scriptFile = newScript(equationModelTypePath + fileName, + scriptType); + ScriptTreeModel model = (ScriptTreeModel) scriptUI.getTree().getModel(); + model.fileAdded(scriptFile); + TreePath treePath = model.getTreePathFor(scriptFile); + scriptUI.getTree().setSelectionPath(treePath); + } - public File getExportDirectory() { - return ExportStorage.getExportDirectory(); } - public File getRuleDirectory() { - return RuleStorage.getRuleDirectory(); - } - - public File getAnalysePlanDirectory() { - return AnalysePlanStorage.getAnalysePlanDirectory(); - } - - public File getFormuleDirectory() { - return FormuleStorage.getFormuleDirectory(); - } - - public File getSensitivityDirectory() { - return SensitivityStorage.getSensitivityDirectory(); - } - - public File getSensitivityExportDirectory() { - return SensitivityExportStorage.getSensitivityExportDirectory(); - } - /** * Creer un nouveau script, ici un script peut-etre un Script, un Simulator, * un Export. * - * @param fileName - * @param scriptType le type que l'on souhaite Script, Simulator, - * ou Export. + * @param fileName full filename + * @param scriptType le type que l'on souhaite Script, Simulator, ou Export. + * @return created file */ - public void newScript(String fileName, String scriptType) { + protected File newScript(String fileName, ScriptMapping scriptType) { if (log.isDebugEnabled()) { - log.info("newScript called [" + scriptType + "]"); + log.debug("newScript called [" + scriptType + "]"); } - Exception e; + File scriptFile = null; + try { // Vérifie qu'il n'y pas de caractères spéciaux. Seul les caractre // de a à z (majuscule ou minuscule) ainsi que les nombres sont @@ -232,20 +264,14 @@ // au moins 1 caractère. String realFilename; String category; - ScriptMapping mapping = ScriptMapping.valueOf(scriptType); - if (mapping == null) { - e = new RuntimeException("ScriptType unknown: " + scriptType); - returnError(_("isisfish.error.script.create", fileName, e - .getMessage()), e); - } int pos = fileName.lastIndexOf('/'); if (pos != -1) { - if (mapping != ScriptMapping.EquationModel) { + if (scriptType != ScriptMapping.EquationModel) { // interdit pour le moment ? String message = _("isisfish.error.invalid.file.name", fileName); - e = new RuntimeException(message); + Exception e = new RuntimeException(message); returnError(_("isisfish.error.script.create", fileName, e .getMessage()), e); } @@ -253,7 +279,7 @@ if (pos == fileName.length() - 1) { String message = _("isisfish.error.invalid.file.name", fileName); - e = new RuntimeException(message); + Exception e = new RuntimeException(message); returnError(_("isisfish.error.script.create", fileName, e .getMessage()), e); } @@ -266,13 +292,13 @@ } if (!realFilename.matches("[A-Z0-9_][a-zA-Z0-9_]*")) { String message = _("isisfish.error.invalid.file.name", fileName); - e = new RuntimeException(message); + Exception e = new RuntimeException(message); returnError(_("isisfish.error.script.create", fileName, e .getMessage()), e); } //TODO do test on category CodeSourceStorage script = null; - switch (mapping) { + switch (scriptType) { case EquationModel: script = FormuleStorage.createFormule(category, realFilename, Language.JAVA); @@ -296,22 +322,25 @@ script = SensitivityStorage.getSensitivity(fileName); break; case SensitivityExport: - script = SensitivityExportStorage.getSensitivityExport(fileName); + script = SensitivityExportStorage + .getSensitivityExport(fileName); break; default: - log.fatal("ScriptType unknown: " + scriptType); + if (log.isErrorEnabled()) { + log.fatal("ScriptType unknown: " + scriptType); + } } if (script.exists()) { // Message d'erreur si le fichier existe en local. String message = _("isisfish.error.file.already.exists", fileName); - e = new RuntimeException(message); + Exception e = new RuntimeException(message); returnError(_("isisfish.error.script.create", fileName, e .getMessage()), e); } - String scriptTemplatePath = mapping.getTemplatePath(); + String scriptTemplatePath = scriptType.getTemplatePath(); if (scriptTemplatePath != null) { @@ -326,8 +355,6 @@ // context values Map<String, Object> root = new HashMap<String, Object>(); - // FIXME what is category ? - root.put("category", ""); root.put("name", realFilename); root.put("date", new Date()); root.put("author", IsisFish.config.getUserName()); @@ -342,12 +369,14 @@ throw new IsisFishRuntimeException("There is no templatePath"); } - code = script; + codeStorage = script; + scriptFile = script.getFile(); } catch (Exception eee) { returnError(_("isisfish.error.script.create", fileName, eee .getMessage()), eee); } + return scriptFile; } /** @@ -363,122 +392,165 @@ ErrorHelper.showErrorDialog(s, eee); } - public void loadScript(GenericCell c, String fileName, String type) { - ScriptMapping mapping = ScriptMapping.valueOf(type); + /* + * @see javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.TreeSelectionEvent) + */ + @Override + public void valueChanged(TreeSelectionEvent e) { + if (e.getNewLeadSelectionPath() != null) { + File selectedFile = (File)e.getNewLeadSelectionPath().getLastPathComponent(); + if (selectedFile.isFile()) { + // load file into current action codeStorage + loadScript(selectedFile); + scriptUI.getEditor().open(selectedFile); + // force refresh + scriptUI.getEditor().validate(); + + setButton(); + } + else { + scriptUI.getEditor().close(); + scriptUI.getEditor().validate(); + setButton(); + } + } + } + + /** + * Load specified script in current action. + * + * TODO can we change this ? + * + * @param file file to load + */ + public void loadScript(File file) { + ScriptMapping mapping = ScriptMapping.getMappingFor(file); CodeSourceStorage script = null; try { - switch (mapping) { case EquationModel: - script = FormuleStorage.getFormule((String) c.getValue(), - fileName); + String fullPath = file.getAbsolutePath(); + int lastIndexOf = fullPath.lastIndexOf('/'); + // in string .../aaa/bbb/ccc/ddd.java + // get ccc + String category = fullPath.substring(fullPath.lastIndexOf('/', + lastIndexOf - 1) + 1, lastIndexOf); + script = FormuleStorage.getFormule(category, file.getName()); break; case Rule: - script = RuleStorage.getRule(fileName); + script = RuleStorage.getRule(file.getName()); break; case AnalysePlan: - script = AnalysePlanStorage.getAnalysePlan(fileName); + script = AnalysePlanStorage.getAnalysePlan(file.getName()); break; case Export: - script = ExportStorage.getExport(fileName); + script = ExportStorage.getExport(file.getName()); break; case Script: - script = ScriptStorage.getScript(fileName); + script = ScriptStorage.getScript(file.getName()); break; case Simulator: - script = SimulatorStorage.getSimulator(fileName); + script = SimulatorStorage.getSimulator(file.getName()); break; case Sensitivity: - script = SensitivityStorage.getSensitivity(fileName); + script = SensitivityStorage.getSensitivity(file.getName()); break; case SensitivityExport: - script = SensitivityExportStorage.getSensitivityExport(fileName); + script = SensitivityExportStorage.getSensitivityExport(file + .getName()); break; default: - log.fatal("ScriptType unknown: " + fileName); + log.fatal("ScriptType unknown: " + file.getName()); } //frame.setInfoText(_("isisfish.message.load.finished")); } catch (Exception eee) { - returnError(_("isisfish.error.script.load", fileName, eee - .getMessage()), eee); + returnError(_("isisfish.error.script.load", file.getAbsolutePath(), + eee.getMessage()), eee); } finally { - code = script; + codeStorage = script; } } public boolean fileLoaded() { - return code != null; + return codeStorage != null; } public boolean isJavaScript() { - return JavaSourceStorage.class.isInstance(code); + return JavaSourceStorage.class.isInstance(codeStorage); } - public Object saveScript(String content) { - log.info("saveScript called [" + code.getName() + "] "); + /** + * Save current editor test in current loaded codeStorage. + */ + public void saveScript() { + if (log.isDebugEnabled()) { + log.debug("saveScript called on " + codeStorage.getName()); + } + try { - code.setContent(content); + //String content = scriptUI.getEditor().getText(); + //codeStorage.setContent(content); + // setContent() or scriptUI.getEditor().save() + // if setContent() only editor ask for t saving + scriptUI.getEditor().save(); + + // notify tree to refresh + ScriptTreeModel model = (ScriptTreeModel) scriptUI.getTree().getModel(); + model.fileModified(codeStorage.getFile()); } catch (Exception eee) { - returnError(_("isisfish.error.script.save", code.getFile(), eee - .getMessage()), eee); + returnError(_("isisfish.error.script.save", codeStorage.getFile(), + eee.getMessage()), eee); } - return null; + setStatusMessage(_("isisfish.message.save.finished")); } - public String commitScript(String content) { - String result = null; + /** + * Save script, and disply commit UI. + * + * @return + */ + public void commitScript() { + try { - log.debug("commitScript called for "); + log.debug("commitScript called for " + codeStorage.getName()); + // save script before commit - code.setContent(content); - String msg = JOptionPane - .showInputDialog(_("isisfish.message.script.commit")); + saveScript(); + + String msg = JOptionPane.showInputDialog(_("isisfish.message.script.commit", codeStorage.getName())); if (msg == null) { - result = _("isisfish.message.commit.cancelled"); + setStatusMessage(_("isisfish.message.commit.cancelled")); } else { - - try { - code.commit(msg); - code.reload(); - result = _("isisfish.message.commit.finished"); - } catch (VCSException e) { - - // FIXME enable/disable button only - // if vcs can write - JOptionPane.showMessageDialog(null, e.getMessage(), - _("isisfish.common.error"), - JOptionPane.ERROR_MESSAGE); - if (log.isWarnEnabled()) { - log.warn("Exception on commit", e); - } - } + codeStorage.commit(msg); + codeStorage.reload(); + setStatusMessage(_("isisfish.message.commit.finished")); } - return null; } catch (Exception ex) { if (log.isErrorEnabled()) { log.error("Error on script commit", ex); } + + // if vcs can write + ErrorHelper.showErrorDialog(_("isisfish.common.error"), ex); } - return result; } /** * Exporte le(s) script(s) sélectionnés dans l'arbre. * <br>L'arbre doit avoir au moins un script de selectionnés - * - * @param selectedPaths selected path - * @return <code>null</code> if everything is ok. */ - public String showExportScriptDialog(TreePath[] selectedPaths) { - String message = null; + public void exportScript() { + + TreePath[] selectedFilesPath = scriptUI.getTree().getSelectionPaths(); + // first step : acquire list of files required int prefixLength = IsisFish.config.getDatabaseDirectory() .getAbsolutePath().length() + 1; - List<String> listFiles = extractFiles(prefixLength, selectedPaths); - return message; + List<String> listFiles = extractFiles(prefixLength, selectedFilesPath); + } protected static List<String> extractFiles(int prefixLength, @@ -539,6 +611,27 @@ return result; } + /** + * Cut selection in current editor. + */ + public void cut() { + scriptUI.getEditor().cut(); + } + + /** + * Copy selection in current editor. + */ + public void copy() { + scriptUI.getEditor().copy(); + } + + /** + * Paste clipboard content in editor. + */ + public void paste() { + scriptUI.getEditor().paste(); + } + protected static FileFilter scriptFileFilter; public static FileFilter getScriptFileFilter() { @@ -553,9 +646,13 @@ try { log.debug("updateScript called for "); //TODO Use VCS UI dialog - //TODO Use FileState new mecanism to obtain state - code.update(); - code.reload(); + UpdateDialogUI ui = new UpdateDialogUI(); + ui.setVisible(true); + //TODO Use FileState new mechanism to obtain state + if (codeStorage == null) { + codeStorage.update(); + codeStorage.reload(); + } } catch (VCSException ex) { if (log.isErrorEnabled()) { log.error("Error on script update", ex); @@ -566,75 +663,84 @@ /** * Check script content. * - * @param content - * @return compilation result and output + * @return compilation success flag */ - public CompilationResult checkScript(String content) { - - CompilationResult compilationResult = new CompilationResult(); - + public boolean checkScript() { + + boolean check = false; + String content = scriptUI.getEditor().getText(); + try { if (log.isDebugEnabled()) { log.debug("checkScript called"); } // save script before commit - code.setContent(content); - JavaSourceStorage javaCode = (JavaSourceStorage) code; + codeStorage.setContent(content); + JavaSourceStorage javaCode = (JavaSourceStorage) codeStorage; StringWriter result = new StringWriter(); PrintWriter out = new PrintWriter(result); try { int compileResult = javaCode.compile(false, out); - + if (compileResult == 0) { - compilationResult.setCompilationResult(CompilationResult.COMPILATION_OK); + check = true; } - else { - compilationResult.setCompilationResult(CompilationResult.COMPILATION_FAILED); - } } catch (Exception eee) { - compilationResult.setCompilationResult(CompilationResult.COMPILATION_FAILED); eee.printStackTrace(out); } + out.flush(); - out.flush(); - compilationResult.setCompilationOutput(result.toString()); - + if (check) { + scriptUI.getActionLogArea().setText( + _("isisfish.script.compilation.ok", result.toString())); + scriptUI.getActionLogArea().setBackground(COLOR_SUCCESS); + } else { + scriptUI.getActionLogArea().setText( + _("isisfish.script.compilation.failed", result + .toString())); + scriptUI.getActionLogArea().setBackground(COLOR_FAILURE); + } + } catch (IOException ex) { if (log.isErrorEnabled()) { log.error("Error on script check", ex); } } - return compilationResult; + setStatusMessage(_("isisfish.message.check.finished")); + return check; } - public String evaluateScript(String content) { + /** + * Call main method in current cod storage code. + * Check script before call. + */ + public void evaluateScript() { if (log.isDebugEnabled()) { log.debug("evaluateScript called"); } - String msg = ""; try { - CompilationResult compilationResult = checkScript(content); - if (compilationResult.getCompilationResult() == CompilationResult.COMPILATION_FAILED) { - return compilationResult.getCompilationOutput(); + if (checkScript()) { + // reset area color + scriptUI.getActionLogArea().setBackground(null); + + JavaSourceStorage javaCode = (JavaSourceStorage) codeStorage; + ByteArrayOutputStream result = new ByteArrayOutputStream(); + PrintStream out = new PrintStream(result); + PrintStream err = new PrintStream(result); + PrintStream oldOut = System.out; + PrintStream oldErr = System.err; + System.setOut(out); + System.setErr(err); + Class<?> clazz = javaCode.getCodeClass(); + Method main = clazz.getMethod("main", String[].class); + //noinspection RedundantArrayCreation + main.invoke(null, new Object[] { new String[] {} }); + System.setOut(oldOut); + System.setErr(oldErr); + scriptUI.getActionLogArea().setText(result.toString()); } - code.setContent(content); - JavaSourceStorage javaCode = (JavaSourceStorage) code; - ByteArrayOutputStream result = new ByteArrayOutputStream(); - PrintStream out = new PrintStream(result); - PrintStream err = new PrintStream(result); - PrintStream oldOut = System.out; - PrintStream oldErr = System.err; - System.setOut(out); - System.setErr(err); - Class clazz = javaCode.getCodeClass(); - Method main = clazz.getMethod("main", String[].class); - //noinspection RedundantArrayCreation - main.invoke(null, new Object[] { new String[] {} }); - System.setOut(oldOut); - System.setErr(oldErr); - msg = result.toString(); } catch (Exception ex) { if (log.isDebugEnabled()) { log.debug("Error on script evaluation", ex); @@ -642,28 +748,27 @@ ByteArrayOutputStream result = new ByteArrayOutputStream(); PrintStream out = new PrintStream(result); ex.printStackTrace(out); - msg = result.toString(); + scriptUI.getActionLogArea().setText(result.toString()); } - return msg; + setStatusMessage(_("isisfish.message.evaluation.finished")); } /** * Show a improved script dialog with multiple selection support. - * - * @return status message */ - public String showImportScriptDialog() { - String msg = null; + public void importScript() { + if (log.isDebugEnabled()) { log.debug("importScript "); } - + File root = IsisFish.config.getDatabaseDirectory(); try { // ask user form a .zip file - File file = FileUtil.getFile(".*.zip$", _("isisfish.message.import.scripts.zipped")); + File file = FileUtil.getFile(".*.zip$", + _("isisfish.message.import.scripts.zipped")); if (file != null) { - + //frame.setInfoText(_("isisfish.message.import.scripts.file", file)); // get two list of relative path (one for new files, @@ -671,19 +776,19 @@ List<String>[] explode = scanZip(file, root); List<String> newFiles = explode[0]; List<String> conflictFiles = explode[1]; - + // build model for dialog (list of new items), (list of exisiting items) FileSelectionTableModel modelNewItems = null; FileSelectionTableModel modelItems = null; // si'il y a des nouveau fichiers //if (!newFiles.isEmpty()) { - modelNewItems = new FileSelectionTableModel(newFiles); + modelNewItems = new FileSelectionTableModel(newFiles); //} // s'il y a des fichier en conflic //if (!conflictFiles.isEmpty()) { - modelItems = new FileSelectionTableModel(conflictFiles); + modelItems = new FileSelectionTableModel(conflictFiles); //} // create import dialog @@ -694,23 +799,23 @@ dialog.getConflictFilesTable().setModel(modelItems); dialog.getNewFilesTable().setModel(modelNewItems); // can't be in ui :( - dialog.getNewFilesTable().getColumnModel().getColumn(0).setWidth(30); - dialog.getConflictFilesTable().getColumnModel().getColumn(0).setWidth(30); + dialog.getNewFilesTable().getColumnModel().getColumn(0) + .setWidth(30); + dialog.getConflictFilesTable().getColumnModel().getColumn(0) + .setWidth(30); dialog.getArchivePath().setText(file.getAbsolutePath()); dialog.refresh(); dialog.pack(); SwingUtil.center(dialog); dialog.setVisible(true); - msg = _("isisfish.message.import.scripts.file.done", file); + setStatusMessage(_("isisfish.message.import.scripts.file.done", file)); + } else { + setStatusMessage(_("isisfish.message.import.scripts.file.cancelled")); } - else { - msg = _("isisfish.message.import.scripts.file.cancelled"); - } } catch (Exception eee) { returnError(_("isisfish.error.script.import", eee.getMessage()), eee); } - return msg; } /** @@ -720,19 +825,22 @@ * @param selectedFiles selected non conflict files model * @param selectedConflictFiles selected conflict files model */ - public void performImportScript(File sourceScriptArchive, FileSelectionTableModel selectedFiles, FileSelectionTableModel selectedConflictFiles) { + public void performImportScript(File sourceScriptArchive, + FileSelectionTableModel selectedFiles, + FileSelectionTableModel selectedConflictFiles) { File sourceDirectory = IsisFish.config.getDatabaseDirectory(); - + List<String> filesToImports = new ArrayList<String>(); if (selectedFiles != null) { filesToImports.addAll(selectedFiles.getSelectedFiles()); } - + if (selectedConflictFiles != null) { // do backup stuff (only backup conflict files) - backupScripts(selectedConflictFiles.getSelectedFiles(), sourceDirectory); - + backupScripts(selectedConflictFiles.getSelectedFiles(), + sourceDirectory); + filesToImports.addAll(selectedConflictFiles.getSelectedFiles()); } @@ -743,13 +851,15 @@ log.info("unzip " + newFile); } } - ZipUtil.uncompress(sourceScriptArchive, sourceDirectory, filesToImports, null, null); + ZipUtil.uncompress(sourceScriptArchive, sourceDirectory, + filesToImports, null, null); } catch (IOException e1) { throw new RuntimeException(e1); } if (log.isInfoEnabled()) { - log.info("Unzip " + filesToImports.size() + " entry(ies) from '" + sourceScriptArchive + "'"); + log.info("Unzip " + filesToImports.size() + " entry(ies) from '" + + sourceScriptArchive + "'"); } } @@ -761,16 +871,17 @@ protected void backupScripts(List<String> paths, File destination) { File backupDirectory = IsisFish.config.getBackupSessionDirectory(); - + if (log.isDebugEnabled()) { log.debug("Backup directory is : " + backupDirectory); } - String suffix = "_" + IsisFish.config.getBackupSessionDirectory().getName(); + String suffix = "_" + + IsisFish.config.getBackupSessionDirectory().getName(); try { for (String path : paths) { - + //backup(new File(src, path), path, suffix); - + File sourceFile = new File(destination, path); if (!sourceFile.exists()) { @@ -792,7 +903,8 @@ dst.getParentFile().mkdirs(); } if (log.isInfoEnabled()) { - log.info("Copying " + sourceFile.getName() + " to " + dst); + log.info("Copying " + sourceFile.getName() + " to " + + dst); } FileUtil.copy(sourceFile, dst); } @@ -801,7 +913,7 @@ throw new IsisFishRuntimeException(ee); } } - + /** * Copy a single file to destination directory. * @@ -812,7 +924,7 @@ */ protected void backup(File src, String path, String suffix) throws IOException { - + } /** @@ -836,42 +948,78 @@ throw new RuntimeException(e); } - return new List[]{ newFiles, overwrittenFiles}; + return new List[] { newFiles, overwrittenFiles }; } - - public String deleteScript(int resp, boolean remote) { - String msg = ""; - log.debug("deleteScript called"); - try { - //TODO desactive editor - //TODO Review this because after delete fi file saw previously - //TODO modified, it ask if we want to save, and then we have - //TODO again the file in panel but not in tree panel ? - if (resp == JOptionPane.YES_OPTION) { + /** + * Delete a script + * + * @param deleteRemote {@code true} to remove in vcs too + */ + public void deleteScript(boolean deleteRemote) { - code.delete(remote); - if (code.getFile().exists()) { - RuntimeException exception = new RuntimeException( - "file could not be deleted"); - returnError(_("isisfish.error.script.delete", code - .getFile(), exception.getMessage()), exception); + if (log.isDebugEnabled()) { + log.debug("DeleteScript called"); + } + + String name = codeStorage.getName(); + int resp = JOptionPane.showConfirmDialog(scriptUI, _( + "isisfish.message.confirm.remove.script", name), null, + JOptionPane.YES_NO_OPTION); + if (resp == JOptionPane.YES_OPTION) { + // stay in UI even if deleted + scriptUI.getEditor().close(); + + try { + // TODO change this, need to be called before + // effective deletion + ((ScriptTreeModel) scriptUI.getTree().getModel()) + .fileDeleted(codeStorage.getFile()); + + //TODO desactive editor + //TODO Review this because after delete fi file saw previously + //TODO modified, it ask if we want to save, and then we have + //TODO again the file in panel but not in tree panel ? + codeStorage.delete(deleteRemote); + if (codeStorage.getFile().exists()) { + ErrorHelper.showErrorDialog(_( + "isisfish.error.script.delete", codeStorage + .getFile())); } - msg = _("isisfish.message.delete.finished"); - } else { - msg = _("isisfish.message.delete.canceled"); + } catch (Exception eee) { + returnError(_("isisfish.error.script.delete", + codeStorage == null ? null : codeStorage.getFile(), eee + .getMessage()), eee); } - } catch (Exception eee) { - returnError(_("isisfish.error.script.delete", code == null ? null - : code.getFile(), eee.getMessage()), eee); + setStatusMessage(_("isisfish.message.delete.finished")); + } else { + setStatusMessage(_("isisfish.message.delete.canceled")); } - return msg; } - public String diffScript(String content) { - log.debug("commitScript called"); - // TODO a refaire - throw new UnsupportedOperationException("En reparation"); + /** + * Show diff between selected files and files server version. + */ + public void diffScript() { + + if (log.isDebugEnabled()) { + log.debug("Method diffScript called on " + codeStorage.getFile()); + } + + try { + String result = null; + if (IsisFish.vcs.isOnRemote(codeStorage.getFile())) { + result = IsisFish.vcs.getDiff(codeStorage.getFile()); + } else { + result = "File not on remote"; + } + scriptUI.getActionLogArea().setText(result); + } catch (VCSException e) { + if (log.isErrorEnabled()) { + log.error("Can't get diff", e); + } + ErrorHelper.showErrorDialog(_("isisfish.vcs.vcssvn.diff.error"), e); + } } /** enum to encapsulate a script module */ @@ -910,6 +1058,30 @@ this.templatePath = templatePath; } + /** + * Get script type for script path. + * + * @param file file to get type + * @return ScriptMapping type + */ + public static ScriptMapping getMappingFor(File file) { + + ScriptMapping result = null; + + // test if path starts with type begin path + + // don't forget last / for distinction begin + // "sensitivity" and "sensitivityexport" + + for (ScriptMapping mapping : ScriptMapping.values()) { + if (file.getAbsolutePath().startsWith(mapping.getModule().getAbsolutePath() + File.separator)) { + result = mapping; + } + } + + return result; + } + public File getModule() { return module; } @@ -918,33 +1090,45 @@ return templatePath; } } - + /** - * Generate javadoc for all database script. - * - * @return javadoc status and output + * Generate javadoc and display output in UI. */ - public CompilationResult generateScriptJavadoc() { - - CompilationResult result = new CompilationResult(); - - File rootDatabase = IsisFish.config.getDatabaseDirectory(); - File javadocDirectory = IsisFish.config.getJavadocDirectory(); - - StringWriter output = new StringWriter(); - PrintWriter out = new PrintWriter(output); - int ok = JavadocHelper.generateJavadoc(rootDatabase, javadocDirectory, out); - - if (ok == 0) { - result.setCompilationResult(CompilationResult.COMPILATION_OK); - } - else { - result.setCompilationResult(CompilationResult.COMPILATION_FAILED); - } - result.setCompilationOutput(output.toString()); - return result; + public void generateScriptJavadoc() { + setStatusMessage(_("isisfish.script.menu.javadocgenerating", + fr.ifremer.isisfish.IsisFish.config.getJavadocDirectory()), + true); + + SwingUtilities.invokeLater(new Runnable() { + public void run() { + File rootDatabase = IsisFish.config.getDatabaseDirectory(); + File javadocDirectory = IsisFish.config.getJavadocDirectory(); + + StringWriter output = new StringWriter(); + PrintWriter out = new PrintWriter(output); + int ok = JavadocHelper.generateJavadoc(rootDatabase, + javadocDirectory, out); + + if (ok == 0) { + scriptUI.getActionLogArea().setText( + _("isisfish.script.compilation.ok", output + .toString())); + // vert leger + scriptUI.getActionLogArea().setBackground(COLOR_SUCCESS); + } else { + scriptUI.getActionLogArea().setText( + _("isisfish.script.compilation.failed", output + .toString())); + // rouge leger + scriptUI.getActionLogArea().setBackground(COLOR_FAILURE); + } + + setStatusMessage(_("isisfish.script.menu.javadocgenerated", + fr.ifremer.isisfish.IsisFish.config.getJavadocDirectory())); + } + }); } - + /** * Open a browser displaying javadoc. */ @@ -952,8 +1136,9 @@ try { // in faut ouvrir l'index, sinon, ca ouvre // un explorateur de fichier - File indexFile = new File(IsisFish.config.getJavadocDirectory(), "index.html"); - + File indexFile = new File(IsisFish.config.getJavadocDirectory(), + "index.html"); + URI uri = indexFile.toURI(); Desktop.getDesktop().browse(uri); } catch (Exception e) { @@ -962,4 +1147,13 @@ } } } + + /* + * @see javax.swing.event.CaretListener#caretUpdate(javax.swing.event.CaretEvent) + */ + @Override + public void caretUpdate(CaretEvent e) { + // selection pas vide si dot = mark + scriptUI.setTextSelected(e.getDot() != e.getMark()); + } } Added: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptTypesComboModel.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptTypesComboModel.java (rev 0) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptTypesComboModel.java 2009-10-26 15:19:57 UTC (rev 2693) @@ -0,0 +1,78 @@ +/* *##% + * Copyright (C) 2009 Code Lutin + * + * 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 2 + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *##%*/ + +package fr.ifremer.isisfish.ui.script; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.DefaultComboBoxModel; + +import fr.ifremer.isisfish.ui.script.ScriptAction.ScriptMapping; + +/** + * Model pour la liste des scripts disponibles. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author: chatellier $ + */ +public class ScriptTypesComboModel extends DefaultComboBoxModel { + + /** serialVersionUID. */ + private static final long serialVersionUID = -4070846632975105788L; + + /** Mapping list. */ + protected List<ScriptMapping> mappings; + + /** + * Empty constructor. + */ + public ScriptTypesComboModel() { + super(); + + ScriptMapping[] values = ScriptMapping.values(); + mappings = new ArrayList<ScriptMapping>(values.length); + for (ScriptMapping mapping : values) { + mappings.add(mapping); + } + + // default first selected + if (!mappings.isEmpty()) { + setSelectedItem(mappings.get(0)); + } + } + + /* + * @see javax.swing.ListModel#getElementAt(int) + */ + @Override + public Object getElementAt(int index) { + return mappings.get(index); + } + + /* + * @see javax.swing.ListModel#getSize() + */ + @Override + public int getSize() { + return mappings.size(); + } +} Property changes on: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptTypesComboModel.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptUI.jaxx =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptUI.jaxx 2009-10-26 15:02:52 UTC (rev 2692) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/ScriptUI.jaxx 2009-10-26 15:19:57 UTC (rev 2693) @@ -19,365 +19,78 @@ *##%*/ --> <JPanel layout='{new BorderLayout()}'> - <script><![CDATA[ - import javax.swing.event.TreeSelectionListener; - import javax.swing.tree.DefaultTreeModel; - import javax.swing.tree.DefaultMutableTreeNode; - import javax.swing.tree.TreeNode; - import javax.swing.tree.TreePath; - import fr.ifremer.isisfish.IsisFishRuntimeException; - import fr.ifremer.isisfish.ui.WelcomePanelUI; - import fr.ifremer.isisfish.ui.widget.editor.GenericCell; - import fr.ifremer.isisfish.util.CompilationResult; - - setContextValue(new ScriptAction()); - setButton(); - tree.addTreeSelectionListener(new TreeSelectionListener() { - @Override - public void valueChanged(TreeSelectionEvent e) { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); - if (node != null){ - GenericCell selectedValue = (GenericCell) node.getUserObject(); - if (selectedValue.getValue() != null){ - String parent = selectedValue.getValue().toString(); - File f = null; - if (!parent.equals("EquationModel")) { - if (parent.equals("Script")) { - f = new File(getContextValue(ScriptAction.class).getScriptDirectory().getPath() + File.separator + selectedValue); - } else if (parent.equals("Simulator")) { - f = new File(getContextValue(ScriptAction.class).getSimulatorDirectory().getPath() + File.separator + selectedValue); - } else if (parent.equals("Export")) { - f = new File(getContextValue(ScriptAction.class).getExportDirectory().getPath() + File.separator + selectedValue); - } else if (parent.equals("Rule")) { - f = new File(getContextValue(ScriptAction.class).getRuleDirectory().getPath() + File.separator + selectedValue); - } else if (parent.equals("AnalysePlan")) { - f = new File(getContextValue(ScriptAction.class).getAnalysePlanDirectory().getPath() + File.separator + selectedValue); - } else if (parent.equals("Sensitivity")) { - f = new File(getContextValue(ScriptAction.class).getSensitivityDirectory().getPath() + File.separator + selectedValue); - } else if (parent.equals("SensitivityExport")) { - f = new File(getContextValue(ScriptAction.class).getSensitivityExportDirectory().getPath() + File.separator + selectedValue); - } else { - f = new File(getContextValue(ScriptAction.class).getFormuleDirectory().getPath() + File.separator + parent + File.separator + selectedValue); - parent = "EquationModel"; - } - } - if (f != null) { - getContextValue(ScriptAction.class).loadScript(selectedValue, selectedValue.getName(), parent); - setEditor(f); - } - } - else { - editor.close(); - editor.validate(); - } - actionLogArea.setText(""); - actionLogArea.setBackground(null); - } - setButton(); - } - }); - protected void setTreeModel(){ - tree.setModel(getTreeModel()); - } - protected DefaultTreeModel getTreeModel(){ - DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(); - DefaultTreeModel treeModel = new DefaultTreeModel(rootNode); - DefaultMutableTreeNode scriptNode = new DefaultMutableTreeNode(new GenericCell("Script", null, null)); - DefaultMutableTreeNode simulatorNode = new DefaultMutableTreeNode(new GenericCell("Simulator", null, null)); - DefaultMutableTreeNode exportNode = new DefaultMutableTreeNode(new GenericCell("Export", null, null)); - DefaultMutableTreeNode ruleNode = new DefaultMutableTreeNode(new GenericCell("Rule", null, null)); - DefaultMutableTreeNode analysePlanNode = new DefaultMutableTreeNode(new GenericCell("AnalysePlan", null, null)); - DefaultMutableTreeNode sensitivityNode = new DefaultMutableTreeNode(new GenericCell("Sensitivity", null, null)); - DefaultMutableTreeNode sensitivityExportNode = new DefaultMutableTreeNode(new GenericCell("SensitivityExport", null, null)); - DefaultMutableTreeNode equationModelNode = new DefaultMutableTreeNode(new GenericCell("EquationModel", null, null)); - setNode(scriptNode, getContextValue(ScriptAction.class).getScriptNames(), "Script"); - setNode(simulatorNode, getContextValue(ScriptAction.class).getSimulatorNames(), "Simulator"); - setNode(exportNode, getContextValue(ScriptAction.class).getExportNames(), "Export"); - setNode(ruleNode, getContextValue(ScriptAction.class).getRuleNames(), "Rule"); - setNode(analysePlanNode, getContextValue(ScriptAction.class).getAnalysePlanNames(), "AnalysePlan"); - setNode(sensitivityNode, getContextValue(ScriptAction.class).getSensitivityNames(), "Sensitivity"); - setNode(sensitivityExportNode, getContextValue(ScriptAction.class).getSensitivityExportsNames(), "SensitivityExport"); - setNode(equationModelNode, getContextValue(ScriptAction.class).getCategories(), "EquationModel"); - for (Enumeration e = equationModelNode.children(); e.hasMoreElements();){ - DefaultMutableTreeNode node = (DefaultMutableTreeNode)e.nextElement(); - GenericCell g = (GenericCell)node.getUserObject(); - setNode(node, getContextValue(ScriptAction.class).getFormuleNames(g.toString()), g.toString()); - } - treeModel.insertNodeInto(scriptNode, rootNode, 0); - treeModel.insertNodeInto(simulatorNode, rootNode, 1); - treeModel.insertNodeInto(exportNode, rootNode, 2); - treeModel.insertNodeInto(ruleNode, rootNode, 3); - treeModel.insertNodeInto(analysePlanNode, rootNode, 4); - treeModel.insertNodeInto(sensitivityNode, rootNode, 5); - treeModel.insertNodeInto(sensitivityExportNode, rootNode, 6); - treeModel.insertNodeInto(equationModelNode, rootNode, 7); - return treeModel; - } - protected void setNode(DefaultMutableTreeNode node, java.util.List<String> values, String type) { - for (String value : values){ - DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(new GenericCell(value, type, null)); - node.add(childNode); - } - } - protected void setEditor(File f) { - editor.open(f); - editor.validate(); - } - protected DefaultMutableTreeNode findNode(DefaultMutableTreeNode root, String value) { - DefaultMutableTreeNode result = null; - for (Enumeration e = root.children(); e.hasMoreElements();){ - DefaultMutableTreeNode node = (DefaultMutableTreeNode)e.nextElement(); - GenericCell g = (GenericCell)node.getUserObject(); - if (value.equals(g.getName())){ - result = node; - } - } - return result; - } - - protected void setButton() { - boolean fileLoaded = getContextValue(ScriptAction.class).fileLoaded(); - boolean isJavaScript = getContextValue(ScriptAction.class).isJavaScript(); - buttonScriptExport.setEnabled(tree.getSelectionValue() != null); - // TODO refactoring en cours, mais pas fini - //miExport.setEnabled(tree.getSelectionValue() != null); - buttonScriptCommit.setEnabled(fileLoaded); - miCommitVCS.setEnabled(fileLoaded); - //buttonScriptUpdate.setEnabled(fileLoaded); - buttonScriptSave.setEnabled(fileLoaded); - miSave.setEnabled(fileLoaded); - // FIXME use jaxx binding - //buttonScriptCut.setEnabled(fileLoaded); - //miCut.setEnabled(fileLoaded); - //buttonScriptCopy.setEnabled(fileLoaded); - //miCopy.setEnabled(fileLoaded); - //buttonScriptPaste.setEnabled(fileLoaded); - //miPaste.setEnabled(fileLoaded); - buttonScriptCheck.setEnabled(isJavaScript); - miCheckSyntax.setEnabled(isJavaScript); - buttonScriptEval.setEnabled(isJavaScript); - miEvaluate.setEnabled(isJavaScript); - } - protected void setStatusMessage(String msg) { - WelcomePanelUI root = getParentContainer(WelcomePanelUI.class); - root.setStatusMessage(msg); - } - protected void setStatusMessage(String msg, boolean running) { - WelcomePanelUI root = getParentContainer(WelcomePanelUI.class); - root.setStatusMessage(msg, running); - } -/* - * JButton and JMenu Action - */ - protected void newScript(){ - newScript((String)ScriptTypeChoice.getSelectedItem()); - } - protected void newScript(String scriptType){ - java.util.List<String> values = getContextValue(ScriptAction.class).getCategories(); - String equationModelType = ""; - String equationModelTypePath = ""; - if (scriptType.equals("EquationModel")){ - equationModelType = (String)JOptionPane.showInputDialog( - this, - _("isisfish.message.new.formule.category"), - _("isisfish.message.new.formule.title"), - JOptionPane.PLAIN_MESSAGE, - null, - values.toArray(), - values.get(0)); - equationModelTypePath = equationModelType + File.separator; - } - if (equationModelType != null){ - String fileName = JOptionPane.showInputDialog(_("isisfish.message.new.filename")); - if (fileName != null){ - getContextValue(ScriptAction.class).newScript(equationModelTypePath + fileName, scriptType); - setTreeModel(); - setStatusMessage(_("isisfish.message.creation.done", fileName)); - DefaultMutableTreeNode element = null; - element = findNode((DefaultMutableTreeNode) tree.getModel().getRoot(), scriptType); - if (!equationModelTypePath.equals("")){ - element = findNode(element, equationModelType); - } - element = findNode(element, fileName + ".java"); - TreeNode[] path = element.getPath(); - if (log.isDebugEnabled()) { - log.debug("chemin du prochain noeud selectionnée: " + Arrays.toString(path)); - } - TreePath newSelectionPath = new TreePath(path); - tree.setSelectionPath(newSelectionPath); - } - } - } - protected void saveScript(){ - getContextValue(ScriptAction.class).saveScript(editor.getText()); - setStatusMessage(_("isisfish.message.save.finished")); - } - protected void importScript() { - String importMessage = getContextValue(ScriptAction.class).showImportScriptDialog(); - setStatusMessage(importMessage); - } - protected void exportScript() { - TreePath[] selectedFilesPath = tree.getSelectionPaths(); - getContextValue(ScriptAction.class).showExportScriptDialog(selectedFilesPath); - } - protected void commitScript(){ - new IsisFishRuntimeException("Not yet implemented"); - getContextValue(ScriptAction.class).commitScript(editor.getText()); - setStatusMessage(_("isisfish.message.commit.finished")); - } - protected void updateScript(){ - new IsisFishRuntimeException("Not yet implemented"); - getContextValue(ScriptAction.class).updateScript(); - setStatusMessage(_("isisfish.message.update.finished")); - } - protected void cut(){ - } - protected void copy(){ - } - protected void paste(){ - } - protected void checkScript(){ - CompilationResult compilationResult = getContextValue(ScriptAction.class).checkScript(editor.getText()); - - // TODO display an ok status ? - if (compilationResult.getCompilationResult() == CompilationResult.COMPILATION_OK) { - actionLogArea.setText(_("isisfish.script.compilation.ok", compilationResult.getCompilationOutput())); - // vert leger - actionLogArea.setBackground(new Color(210, 255, 210)); - } - else { - actionLogArea.setText(_("isisfish.script.compilation.failed", compilationResult.getCompilationOutput())); - // rouge leger - actionLogArea.setBackground(new Color(255, 210, 210)); - } + <ScriptAction id="scriptAction" javaBean="new ScriptAction(this)" /> - setStatusMessage(_("isisfish.message.check.finished")); - } - protected void evaluateScript(){ - actionLogArea.setText(getContextValue(ScriptAction.class).evaluateScript(editor.getText())); - actionLogArea.setBackground(null); - setStatusMessage(_("isisfish.message.evaluation.finished")); - } - protected void deleteScript(boolean deleteRemote) { - // reste in UI even if deleted - editor.close(); + <script><![CDATA[ + getScriptAction().postInit(); + ]]></script> - int resp = JOptionPane.showConfirmDialog(this,_("isisfish.message.confirm.remove.script", - getContextValue(ScriptAction.class).getCode().getName()), null, JOptionPane.YES_NO_OPTION); - setStatusMessage(getContextValue(ScriptAction.class).deleteScript(resp, deleteRemote)); - setTreeModel(); - } - - /** - * Show diff between selected files and files server version. - */ - protected void diffScript(){ - String diffMessage = getContextValue(ScriptAction.class).diffScript(editor.getText()); - setStatusMessage(diffMessage); - } - - /** - * Generate javadoc and disply output in UI. - */ - protected void generateScriptJavadoc() { - setStatusMessage(_("isisfish.script.menu.javadocgenerating", fr.ifremer.isisfish.IsisFish.config.getJavadocDirectory()), true); - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - ScriptAction action = getContextValue(ScriptAction.class); - CompilationResult compilationResult = action.generateScriptJavadoc(); - - // TODO display an ok status ? - if (compilationResult.getCompilationResult() == CompilationResult.COMPILATION_OK) { - actionLogArea.setText(_("isisfish.script.compilation.ok", compilationResult.getCompilationOutput())); - // vert leger - actionLogArea.setBackground(new Color(210, 255, 210)); - } - else { - actionLogArea.setText(_("isisfish.script.compilation.failed", compilationResult.getCompilationOutput())); - // rouge leger - actionLogArea.setBackground(new Color(255, 210, 210)); - } - setStatusMessage(_("isisfish.script.menu.javadocgenerated", fr.ifremer.isisfish.IsisFish.config.getJavadocDirectory())); - } - }); - } - - /** - * Show generated javadoc. - */ - protected void showScriptJavadoc() { - ScriptAction action = getContextValue(ScriptAction.class); - action.showScriptJavadoc(); - } - - ]]> - </script> + <Boolean id="fileSelected" javaBean="false" /> + <Boolean id="singleFileSelected" javaBean="false" /> + <Boolean id="textSelected" javaBean="false" /> + <Boolean id="javaFileSelected" javaBean="false" /> - <!-- - | Menu - +--> - + <!-- Menu --> <JMenuBar id="scriptMenuBar" constraints='BorderLayout.NORTH'> <JMenu id="scriptTxtFile" text="isisfish.script.menu.file"> <JMenu id="scriptNewMenu" text="isisfish.script.menu.new"> - <JMenuItem id="miNewScript" text="isisfish.script.menu.txtNewScript" onActionPerformed='newScript("Script")' accelerator="accNewScript"/> - <JMenuItem id="miNewSimulator" text="isisfish.script.menu.txtNewSimulator" onActionPerformed='newScript("Simulator")' accelerator="accNewSimulator"/> - <JMenuItem id="miNewExport" text="isisfish.script.menu.txtNewExport" onActionPerformed='newScript("Export")' accelerator="accNewExport"/> - <JMenuItem id="miNewRule" text="isisfish.script.menu.txtNewRule" onActionPerformed='newScript("Rule")' accelerator="accNewRule"/> - <JMenuItem id="miNewAnalysePlan" text="isisfish.script.menu.txtNewAnalysePlan" onActionPerformed='newScript("AnalysePlan")' accelerator="accNewAnalysePlan"/> - <JMenuItem id="miNewSensitivity" text="isisfish.script.menu.txtNewSensitivity" onActionPerformed='newScript("Sensitivity")' accelerator="accNewSensitivity"/> - <JMenuItem id="miNewSensitivityExport" text="isisfish.script.menu.txtNewSensitivityExport" onActionPerformed='newScript("SensitivityExport")' accelerator="accNewSensitivityExport"/> - <JMenuItem id="miNewEquationModel" text="isisfish.script.menu.txtNewEquationModel" onActionPerformed='newScript("EquationModel")' accelerator="accNewEquationModel"/> + <JMenuItem id="miNewScript" text="isisfish.script.menu.txtNewScript" onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.Script)' accelerator="accNewScript"/> + <JMenuItem id="miNewSimulator" text="isisfish.script.menu.txtNewSimulator" onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.Simulator)' accelerator="accNewSimulator"/> + <JMenuItem id="miNewExport" text="isisfish.script.menu.txtNewExport" onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.Export)' accelerator="accNewExport"/> + <JMenuItem id="miNewRule" text="isisfish.script.menu.txtNewRule" onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.Rule)' accelerator="accNewRule"/> + <JMenuItem id="miNewAnalysePlan" text="isisfish.script.menu.txtNewAnalysePlan" onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.AnalysePlan)' accelerator="accNewAnalysePlan"/> + <JMenuItem id="miNewSensitivity" text="isisfish.script.menu.txtNewSensitivity" onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.Sensitivity)' accelerator="accNewSensitivity"/> + <JMenuItem id="miNewSensitivityExport" text="isisfish.script.menu.txtNewSensitivityExport" onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.SensitivityExport)' accelerator="accNewSensitivityExport"/> + <JMenuItem id="miNewEquationModel" text="isisfish.script.menu.txtNewEquationModel" onActionPerformed='getScriptAction().newScript(ScriptAction.ScriptMapping.EquationModel)' accelerator="accNewEquationModel"/> </JMenu> - <JMenuItem id="miSave" text="isisfish.script.menu.save" onActionPerformed="saveScript()" accelerator="accSave"/> + <JMenuItem id="miSave" text="isisfish.script.menu.save" onActionPerformed="getScriptAction().saveScript()" accelerator="accSave" enabled='{isSingleFileSelected()}' /> <JSeparator/> - <JMenuItem id="miImport" text="isisfish.script.menu.txtImport" enabled="false" onActionPerformed="importScript()" accelerator="accImport"/> - <JMenuItem id="miExport" text="isisfish.script.menu.txtExport" enabled="false" onActionPerformed="exportScript()" accelerator="accExport"/> + <JMenuItem id="miImport" text="isisfish.script.menu.txtImport" enabled="false" onActionPerformed="getScriptAction().importScript()" accelerator="accImport" /> + <JMenuItem id="miExport" text="isisfish.script.menu.txtExport" onActionPerformed="getScriptAction().exportScript()" accelerator="accExport" enabled='{isFileSelected()}' /> <JSeparator/> - <JMenuItem id="miDelete" text="isisfish.script.menu.deleteLocaly" onActionPerformed='deleteScript(false)' accelerator="accDelete"/> + <JMenuItem id="miDelete" text="isisfish.script.menu.deleteLocaly" onActionPerformed='getScriptAction().deleteScript(false)' accelerator="accDelete" enabled='{isSingleFileSelected()}' /> </JMenu> - <JMenu id="scriptTxtEdit" text="isisfish.script.menu.edit"> - <JMenuItem id="miCut" text="isisfish.script.menu.cut" enabled='false' onActionPerformed="cut()" accelerator="accCut"/> - <JMenuItem id="miCopy" text="isisfish.script.menu.copy" enabled='false' onActionPerformed="copy()" accelerator="accCopy"/> - <JMenuItem id="miPaste" text="isisfish.script.menu.paste" enabled='false' onActionPerformed="paste()" accelerator="accPaste"/> + <JMenu id="scriptTxtEdit" text="isisfish.script.menu.edit"> + <JMenuItem id="miCut" text="isisfish.script.menu.cut" onActionPerformed="getScriptAction().cut()" accelerator="accCut" enabled='{isTextSelected()}' /> + <JMenuItem id="miCopy" text="isisfish.script.menu.copy" onActionPerformed="getScriptAction().copy()" accelerator="accCopy" enabled='{isTextSelected()}' /> + <JMenuItem id="miPaste" text="isisfish.script.menu.paste" onActionPerformed="getScriptAction().paste()" accelerator="accPaste" enabled='{isSingleFileSelected()}' /> </JMenu> - <JMenu id="scriptTxtVCS" text="isisfish.script.menu.txtVCS"> - <JMenuItem id="miCommitVCS" enabled='false' text="isisfish.script.menu.commit" accelerator="accCommitVCS" onActionPerformed="commitScript()"/> - <JMenuItem id="miDiffVCS" enabled='false' text="isisfish.script.menu.diff" accelerator="mnDiffVCS" onActionPerformed="diffScript()"/> - <JMenuItem id="miUpdateVCS" enabled='false' text="isisfish.script.menu.update" accelerator="accUpdateVCS" onActionPerformed="updateScript()"/> + <JMenu id="scriptTxtVCS" text="isisfish.script.menu.txtVCS"> + <JMenuItem id="miCommitVCS" text="isisfish.script.menu.commit" accelerator="accCommitVCS" onActionPerformed="getScriptAction().commitScript()" enabled='{isSingleFileSelected()}' /> + <JMenuItem id="miDiffVCS" text="isisfish.script.menu.diff" accelerator="mnDiffVCS" onActionPerformed="getScriptAction().diffScript()" enabled='{isSingleFileSelected()}' /> + <JMenuItem id="miUpdateVCS" text="isisfish.script.menu.update" accelerator="accUpdateVCS" onActionPerformed="getScriptAction().updateScript()"/> <JSeparator/> - <JMenuItem id="miDeleteVCS" enabled='false' text="isisfish.script.menu.deleteLocalyServer" onActionPerformed='deleteScript(true)' accelerator="accDeleteVCS"/> + <JMenuItem id="miDeleteVCS" text="isisfish.script.menu.deleteLocalyServer" onActionPerformed='getScriptAction().deleteScript(true)' accelerator="accDeleteVCS" enabled='{isSingleFileSelected()}'/> </JMenu> <JMenu id="scriptTxtCode" text="isisfish.script.menu.code"> - <JMenuItem id="miCheckSyntax" text="isisfish.script.menu.checkSyntax" accelerator="accCheckSyntax" onActionPerformed="checkScript()"/> - <JMenuItem id="miEvaluate" text="isisfish.script.menu.evaluate" accelerator="accEvaluate" onActionPerformed="evaluateScript()"/> + <JMenuItem id="miCheckSyntax" text="isisfish.script.menu.checkSyntax" accelerator="accCheckSyntax" onActionPerformed="getScriptAction().checkScript()" enabled='{isJavaFileSelected()}' /> + <JMenuItem id="miEvaluate" text="isisfish.script.menu.evaluate" accelerator="accEvaluate" onActionPerformed="getScriptAction().evaluateScript()" enabled='{isJavaFileSelected()}' /> <JSeparator/> - <JMenuItem id="miGenerateJavadoc" text="isisfish.script.menu.javadocgenerate" onActionPerformed="generateScriptJavadoc()"/> - <JMenuItem id="miShowJavadoc" text="isisfish.script.menu.javadocshow" onActionPerformed="showScriptJavadoc()"/> + <JMenuItem id="miGenerateJavadoc" text="isisfish.script.menu.javadocgenerate" onActionPerformed="getScriptAction().generateScriptJavadoc()"/> + <JMenuItem id="miShowJavadoc" text="isisfish.script.menu.javadocshow" onActionPerformed="getScriptAction().showScriptJavadoc()"/> </JMenu> </JMenuBar> - <!-- - | Toolbar - +--> - <JPanel layout='{new BorderLayout()}' constraints='BorderLayout.CENTER'> + <!-- Toolbar --> + <JPanel layout='{new BorderLayout()}' constraints='BorderLayout.CENTER'> <JPanel id="buttonBar" layout='{new GridLayout()}' constraints='BorderLayout.NORTH'> - <JComboBox id="ScriptTypeChoice" model='{new DefaultComboBoxModel(getContextValue(ScriptAction.class).getScriptTypesNames())}'/> - <JButton id="buttonScriptNew" text="isisfish.script.new" toolTipText='isisfish.script.new.tooltip' onActionPerformed='newScript()'/> - <JButton id="buttonScriptSave" text="isisfish.script.save" toolTipText="isisfish.script.save.tooltip" enabled='false' onActionPerformed='saveScript()'/> - <JButton id="buttonScriptExport" text="isisfish.script.export" toolTipText="isisfish.script.export.tooltip" enabled='false' onActionPerformed='exportScript()'/> - <JButton id="buttonScriptCommit" text="isisfish.script.commit" toolTipText="isisfish.script.commit.tooltip" enabled='false' onActionPerformed='commitScript()'/> - <JButton id="buttonScriptCut" text="isisfish.script.cut" toolTipText="isisfish.script.cut.tooltip" enabled='false' onActionPerformed='cut()'/> - <JButton id="buttonScriptCopy" text="isisfish.script.copy" toolTipText="isisfish.script.copy.tooltip" enabled='false' onActionPerformed='copy()'/> - <JButton id="buttonScriptPaste" text="isisfish.script.paste" toolTipText="isisfish.script.paste.tooltip" enabled='false' onActionPerformed='paste()'/> - <JButton id="buttonScriptCheck" text="isisfish.script.check" toolTipText="isisfish.script.check.tooltip" enabled='false' onActionPerformed='checkScript()'/> - <JButton id="buttonScriptEval" text="isisfish.script.evaluate" toolTipText="isisfish.script.evaluate.tooltip" enabled='false' onActionPerformed='evaluateScript()'/> + <JComboBox id="scriptTypeChoice" model='{new ScriptTypesComboModel()}'/> + <JButton id="buttonScriptNew" text="isisfish.script.new" toolTipText='isisfish.script.new.tooltip' onActionPerformed='getScriptAction().newScript()' /> + <JButton id="buttonScriptSave" text="isisfish.script.save" toolTipText="isisfish.script.save.tooltip" enabled='{isSingleFileSelected()}' onActionPerformed='getScriptAction().saveScript()' /> + <JButton id="buttonScriptExport" text="isisfish.script.export" toolTipText="isisfish.script.export.tooltip" enabled='false' onActionPerformed='getScriptAction().exportScript()' /> + <JButton id="buttonScriptCommit" text="isisfish.script.commit" toolTipText="isisfish.script.commit.tooltip" enabled='{isSingleFileSelected()}' onActionPerformed='getScriptAction().commitScript()' /> + <JButton id="buttonScriptCut" text="isisfish.script.cut" toolTipText="isisfish.script.cut.tooltip" enabled='{isTextSelected()}' onActionPerformed='getScriptAction().cut()' /> + <JButton id="buttonScriptCopy" text="isisfish.script.copy" toolTipText="isisfish.script.copy.tooltip" enabled='{isTextSelected()}' onActionPerformed='getScriptAction().copy()' /> + <JButton id="buttonScriptPaste" text="isisfish.script.paste" toolTipText="isisfish.script.paste.tooltip" enabled='{isSingleFileSelected()}' onActionPerformed='getScriptAction().paste()' /> + <JButton id="buttonScriptCheck" text="isisfish.script.check" toolTipText="isisfish.script.check.tooltip" enabled='{isJavaFileSelected()}' onActionPerformed='getScriptAction().checkScript()' /> + <JButton id="buttonScriptEval" text="isisfish.script.evaluate" toolTipText="isisfish.script.evaluate.tooltip" enabled='{isJavaFileSelected()}' onActionPerformed='getScriptAction().evaluateScript()' /> </JPanel> <JSplitPane oneTouchExpandable="true" dividerLocation="250" orientation="HORIZONTAL" constraints='BorderLayout.CENTER'> <JScrollPane> - <javax.swing.JTree id="tree" name="tree" rootVisible="false" model='{getTreeModel()}' /> + <JTree id="tree" name="tree" rootVisible="false" + model='{new fr.ifremer.isisfish.ui.script.model.ScriptTreeModel()}' + cellRenderer='{new fr.ifremer.isisfish.ui.script.model.ScriptTreeCellRenderer()}' /> </JScrollPane> <JSplitPane oneTouchExpandable="true" resizeWeight="0.75" orientation="VERTICAL"> <org.nuiton.widget.editor.Editor id='editor'/> Added: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ScriptTreeCellRenderer.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ScriptTreeCellRenderer.java (rev 0) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ScriptTreeCellRenderer.java 2009-10-26 15:19:57 UTC (rev 2693) @@ -0,0 +1,97 @@ +/* *##% + * Copyright (C) 2009 Code Lutin + * + * 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 2 + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *##%*/ + +package fr.ifremer.isisfish.ui.script.model; + +import java.awt.Color; +import java.awt.Component; +import java.io.File; + +import javax.swing.JLabel; +import javax.swing.JTree; +import javax.swing.tree.DefaultTreeCellRenderer; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import fr.ifremer.isisfish.IsisFish; +import fr.ifremer.isisfish.vcs.VCSException; +import fr.ifremer.isisfish.vcs.VCS.Status; + +/** + * Renderer for script tree. + * + * Can display VCS local status on files. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class ScriptTreeCellRenderer extends DefaultTreeCellRenderer { + + /** serialVersionUID. */ + private static final long serialVersionUID = 807570061868454777L; + + /** Class logger. */ + private static Log log = LogFactory.getLog(ScriptTreeCellRenderer.class); + + /* + * @see javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean) + */ + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, + boolean selected, boolean expanded, boolean leaf, int row, + boolean hasFocus) { + + JLabel c = (JLabel)super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + + if (value instanceof File) { + File file = (File)value; + + try { + if (file.isFile()) { + if (IsisFish.vcs.getLocalStatus(file) == Status.STATUS_MODIFIED) { + if (selected) { + c.setForeground(new Color(188, 188, 255)); + } + else { + c.setForeground(Color.BLUE); + } + } + else if (IsisFish.vcs.getLocalStatus(file) == Status.STATUS_ADDED) { + if (selected) { + c.setForeground(Color.GREEN.brighter()); + } + else { + c.setForeground(Color.GREEN.darker()); + } + } + } + } catch (VCSException e) { + if (log.isErrorEnabled()) { + log.error("Can't get file status", e); + } + } + c.setText(file.getName()); + } + + return c; + } +} Property changes on: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ScriptTreeCellRenderer.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Added: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ScriptTreeModel.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ScriptTreeModel.java (rev 0) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ScriptTreeModel.java 2009-10-26 15:19:57 UTC (rev 2693) @@ -0,0 +1,332 @@ +/* *##% + * Copyright (C) 2009 Code Lutin + * + * 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 2 + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *##%*/ + +package fr.ifremer.isisfish.ui.script.model; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.swing.event.TreeModelListener; +import javax.swing.tree.TreeModel; +import javax.swing.tree.TreePath; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.tree.TreeModelSupport; + +import fr.ifremer.isisfish.IsisFish; +import fr.ifremer.isisfish.datastore.AnalysePlanStorage; +import fr.ifremer.isisfish.datastore.ExportStorage; +import fr.ifremer.isisfish.datastore.FormuleStorage; +import fr.ifremer.isisfish.datastore.RuleStorage; +import fr.ifremer.isisfish.datastore.ScriptStorage; +import fr.ifremer.isisfish.datastore.SensitivityExportStorage; +import fr.ifremer.isisfish.datastore.SensitivityStorage; +import fr.ifremer.isisfish.datastore.SimulatorStorage; + +/** + * Tree model for scripts edition. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class ScriptTreeModel implements TreeModel { + + /** Class logger. */ + private static Log log = LogFactory.getLog(ScriptTreeModel.class); + + protected TreeModelSupport modelSupport; + + public List<File> rootFiles; + + /** Add node operation */ + public static final int OPERATION_ADD = 0; + /** Modify node operation */ + public static final int OPERATION_MODIFY = 1; + /** Delete Node operation */ + public static final int OPERATION_DELETE = 2; + + public ScriptTreeModel() { + modelSupport = new TreeModelSupport(this); + + rootFiles = new ArrayList<File>(); + rootFiles.add(AnalysePlanStorage.getAnalysePlanDirectory()); + rootFiles.add(ExportStorage.getExportDirectory()); + rootFiles.add(FormuleStorage.getFormuleDirectory()); + rootFiles.add(RuleStorage.getRuleDirectory()); + rootFiles.add(ScriptStorage.getScriptDirectory()); + rootFiles.add(SensitivityExportStorage.getSensitivityExportDirectory()); + rootFiles.add(SensitivityStorage.getSensitivityDirectory()); + rootFiles.add(SimulatorStorage.getSimulatorDirectory()); + } + + /* + * @see javax.swing.tree.TreeModel#addTreeModelListener(javax.swing.event.TreeModelListener) + */ + @Override + public void addTreeModelListener(TreeModelListener l) { + modelSupport.addTreeModelListener(l); + } + + /* + * @see javax.swing.tree.TreeModel#getChild(java.lang.Object, int) + */ + @Override + public Object getChild(Object parent, int index) { + + Object result = null; + + if (parent == rootFiles) { + result = rootFiles.get(index); + } + else { + File parentFile = (File)parent; + File[] filesArray = parentFile.listFiles(); + List<File> files = getVersionnableSortedFiles(filesArray); + result = files.get(index); + } + + return result; + } + + /* + * @see javax.swing.tree.TreeModel#getChildCount(java.lang.Object) + */ + @Override + public int getChildCount(Object parent) { + + int count = 0; + if (parent == rootFiles) { + count = rootFiles.size(); + } + else { + File parentFile = (File)parent; + File[] filesArray = parentFile.listFiles(); + if ( filesArray != null) { + List<File> files = getVersionnableSortedFiles(filesArray); + count = files.size(); + } + } + return count; + } + + /* + * @see javax.swing.tree.TreeModel#getIndexOfChild(java.lang.Object, java.lang.Object) + */ + @Override + public int getIndexOfChild(Object parent, Object child) { + int index = 0; + if (parent == rootFiles) { + index = rootFiles.indexOf(child); + } + else { + File parentFile = (File)parent; + File[] filesArray = parentFile.listFiles(); + List<File> files = getVersionnableSortedFiles(filesArray); + index = files.indexOf(child); + } + return index; + } + + /* + * @see javax.swing.tree.TreeModel#getRoot() + */ + @Override + public Object getRoot() { + return rootFiles; + } + + /* + * @see javax.swing.tree.TreeModel#isLeaf(java.lang.Object) + */ + @Override + public boolean isLeaf(Object node) { + return getChildCount(node) == 0; + } + + /* + * @see javax.swing.tree.TreeModel#removeTreeModelListener(javax.swing.event.TreeModelListener) + */ + @Override + public void removeTreeModelListener(TreeModelListener l) { + modelSupport.removeTreeModelListener(l); + } + + /* + * @see javax.swing.tree.TreeModel#valueForPathChanged(javax.swing.tree.TreePath, java.lang.Object) + */ + @Override + public void valueForPathChanged(TreePath path, Object newValue) { + + } + + /** + * Filter input file array and return only sorted collection with only directories. + * + * @param files file array + * @return sorted list + */ + protected List<File> getVersionnableSortedFiles(File[] filesArray) { + List<File> files = new ArrayList<File>(); + for (File fileArray : filesArray) { + if (IsisFish.vcs.isVersionnableFile(fileArray)) { + files.add(fileArray); + } + } + Collections.sort(files); + return files; + } + + /** + * Notify for file addition. + * + * @param file added file + */ + public void fileAdded(File file) { + TreePath path = new TreePath(rootFiles); + updateChildren(file, path, OPERATION_ADD); + } + + /** + * Notify for file modification. + * + * @param file modified file + */ + public void fileModified(File file) { + TreePath path = new TreePath(rootFiles); + updateChildren(file, path, OPERATION_MODIFY); + } + + /** + * Notify for file deletion. + * + * TODO must be called "before" effective deletion + * + * @param file deleted file + */ + public void fileDeleted(File file) { + TreePath path = new TreePath(rootFiles); + updateChildren(file, path, OPERATION_DELETE); + } + + /** + * Notify for tree operation. + * + * @param file + * @param path path to update + * @param operation operation {@link #OPERATION_ADD #OPERATION_DELETE #OPERATION_MODIFY} + * @return {@code true} if path has been updated + */ + protected boolean updateChildren(File file, TreePath path, + int operation) { + Object pathLastComponent = (Object) path.getLastPathComponent(); + + // pour ses enfants + boolean updated = false; + int childCount = getChildCount(pathLastComponent); + for (int childIndex = 0; !updated && childIndex < childCount; ++childIndex) { + File child = (File) getChild(pathLastComponent, childIndex); + + TreePath childTreePath = path.pathByAddingChild(child); + + if (file.equals(child)) { + + // this update only node, not all path... + switch (operation) { + + case OPERATION_ADD: + modelSupport.fireChildAdded(path, childIndex, child); + // expand path + //projectsAndTaskTable.expandPath(path); + break; + + case OPERATION_DELETE: + modelSupport.fireChildRemoved(path, childIndex, child); + break; + + case OPERATION_MODIFY: + modelSupport.fireChildChanged(path, childIndex, child); + break; + + default: + if (log.isErrorEnabled()) { + log.error("Unknow operation : " + operation); + } + } + + if (log.isTraceEnabled()) { + log.trace(" updated : " + childTreePath); + } + updated = true; + } else { + updated = updateChildren(file, childTreePath, operation); + + if (updated) { + // ...and by recursion update all path + modelSupport.firePathChanged(path); + } + } + } + + return updated; + } + + /** + * Find tree path for a file + * + * @param file to search + * @return tree path + */ + public TreePath getTreePathFor(File file) { + TreePath path = new TreePath(rootFiles); + path = getRecursiveTreePath(file, path); + return path; + } + + /** + * Find file in tree, and return tree path. + * + * @param file + * @param path path to update + * @return tree path + */ + protected TreePath getRecursiveTreePath(File file, TreePath path) { + Object pathLastComponent = (Object) path.getLastPathComponent(); + TreePath resultTreePath = null; + + int childCount = getChildCount(pathLastComponent); + for (int childIndex = 0; resultTreePath == null && childIndex < childCount; ++childIndex) { + File child = (File) getChild(pathLastComponent, childIndex); + + TreePath childTreePath = path.pathByAddingChild(child); + + if (file.equals(child)) { + resultTreePath = childTreePath; + } else { + resultTreePath = getRecursiveTreePath(file, childTreePath); + } + } + + return resultTreePath; + } +} Property changes on: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/ScriptTreeModel.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Added: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/package-info.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/package-info.java (rev 0) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/package-info.java 2009-10-26 15:19:57 UTC (rev 2693) @@ -0,0 +1,5 @@ +/** + * Contains model and renderers for all script uis. + */ +package fr.ifremer.isisfish.ui.script.model; + Property changes on: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/model/package-info.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Added: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/package-info.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/package-info.java (rev 0) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/package-info.java 2009-10-26 15:19:57 UTC (rev 2693) @@ -0,0 +1,5 @@ +/** + * Script UI. + */ +package fr.ifremer.isisfish.ui.script; + Property changes on: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/ui/script/package-info.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Deleted: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/util/CompilationResult.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/util/CompilationResult.java 2009-10-26 15:02:52 UTC (rev 2692) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/util/CompilationResult.java 2009-10-26 15:19:57 UTC (rev 2693) @@ -1,105 +0,0 @@ -/* *##% - * Copyright (C) 2009 Code Lutin - * - * 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 2 - * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *##%*/ - -package fr.ifremer.isisfish.util; - -/** - * Petite structure permettant de retourner a la fois - * un resultat de compilation et des messages d'erreur - * et/ou d'avertissement. - * - * @author chatellier - * @version $Revision$ - * - * Last update : $Date$ - * By : $Author$ - */ -public class CompilationResult { - - /** Compilation success. */ - public static final int COMPILATION_OK = 0; - - /** Compilation failed. */ - public static final int COMPILATION_FAILED = 1; - - /** - * Résultat de la compilation. - * - * Values are {@link #COMPILATION_OK}, {@link #COMPILATION_FAILED}. - */ - protected int compilationResult; - - /** Compilation output. */ - protected String compilationOutput; - - /** - * Default constructor. - */ - public CompilationResult() { - this(COMPILATION_OK, null); - } - - /** - * Constructor with output and result. - * - * @param compilationResult result - * @param compilationOutput output - */ - public CompilationResult(int compilationResult, String compilationOutput) { - this.compilationResult = 0; - this.compilationOutput = compilationOutput; - } - - /** - * Get compilation result. - * - * Return {@link #COMPILATION_OK} or {@link #COMPILATION_FAILED}. - * - * @return the compilationResult - */ - public int getCompilationResult() { - return compilationResult; - } - - /** - * Set compilation result. - * - * @param compilationResult the compilationResult to set - */ - public void setCompilationResult(int compilationResult) { - this.compilationResult = compilationResult; - } - - /** - * Return compilation output. - * - * @return the compilationOutput - */ - public String getCompilationOutput() { - return compilationOutput; - } - - /** - * Set compilation output. - * - * @param compilationOutput the compilationOutput to set - */ - public void setCompilationOutput(String compilationOutput) { - this.compilationOutput = compilationOutput; - } -} Modified: isis-fish/trunk/src/main/resources/i18n/isis-fish-en_GB.properties =================================================================== --- isis-fish/trunk/src/main/resources/i18n/isis-fish-en_GB.properties 2009-10-26 15:02:52 UTC (rev 2692) +++ isis-fish/trunk/src/main/resources/i18n/isis-fish-en_GB.properties 2009-10-26 15:19:57 UTC (rev 2693) @@ -16,7 +16,6 @@ Can't\ get\ changlog= Can't\ get\ result\:\ %1$s=Can't get result\: %1$s Can't\ instanciate\ export\ %1$s=Can't instanciate export %1$s -Can't\ instanciate\ wanted\ VCS\ (%s),\ use\ default= Can't\ instantiate\ %s= Can't\ open\ log\ for\ %s= Can't\ open\ simulation\ internal\ frame= @@ -141,6 +140,8 @@ isisfish.common.warn=warn isisfish.common.year=year isisfish.common.zone=Zone +isisfish.config.category.main=Main +isisfish.config.category.main.description=Main configuration isisfish.config.database.lockmode.description= isisfish.config.main.compileDirectory.description= isisfish.config.main.configFileName.description= @@ -605,7 +606,7 @@ isisfish.message.confirm.remove.region=Do you really want to remove the region %1$s ? isisfish.message.confirm.remove.script=Do you want to remove script '%1$s' ? isisfish.message.copy.finished=Copy finished -isisfish.message.copy.region=Copy region to %1$s +isisfish.message.copy.region=Copy region isisfish.message.creating.region=Creating region %1$s isisfish.message.creation.done=creation done %1$s isisfish.message.creation.finished=Creation finished @@ -657,7 +658,7 @@ isisfish.message.save.finished=Save finished isisfish.message.saveModel.dialog=Input equation model name isisfish.message.saveModel.finished=Save model finished -isisfish.message.script.commit=Enter commit message +isisfish.message.script.commit=Enter commit message for modification on %s isisfish.message.setting.cache.aspects=Setting Cache aspects isisfish.message.setting.trace.aspects=Setting Trace aspects isisfish.message.simulation.ended=Simulation ended @@ -937,6 +938,8 @@ isisfish.script.save=Save isisfish.script.save.tooltip=Sauve le script isisfish.script.title=Script Editor +isisfish.script.vcs.localaddition=This file is not present on remote repository +isisfish.script.vcs.localmodification=This file has local modifications isisfish.season.toString=season %1$s-%2$s isisfish.selectivity.equation=Equation isisfish.selectivity.selectPopulation=Select a population @@ -1029,8 +1032,11 @@ isisfish.vcs.commit.cancel=vcs.commit.cancel isisfish.vcs.commit.label=vcs.commit.label isisfish.vcs.commit.ok=vcs.commit.ok +isisfish.vcs.factory.cantinstanciate=Can't instanciate wanted VCS (%s), use default +isisfish.vcs.howto.save.key=How to register my public key on labs forge isisfish.vcs.init.notfoundcantdownload=No database version %s found and can't get it.\nYou must go to ISIS-Fish web site and download database manually. isisfish.vcs.init.wrongprotocol=Your database repository\: %s\n don't use correct protocol.\nDo you want to make backup of your database and take the correct one ? +isisfish.vcs.save.key=Go to labs forge to register my public key isisfish.vcs.switchprotocol.confirm=Protocol to access repository script has changed.\nDo you want to switch your repository ? isisfish.vcs.switchtag.warningconflict=Your repository is now up-to-date, but following files are conflicted, you may check them \: isisfish.vcs.switchversion.confirm=You don't use correct repository script for your application version %s.\nDo you want to switch your repository ? Modified: isis-fish/trunk/src/main/resources/i18n/isis-fish-fr_FR.properties =================================================================== --- isis-fish/trunk/src/main/resources/i18n/isis-fish-fr_FR.properties 2009-10-26 15:02:52 UTC (rev 2692) +++ isis-fish/trunk/src/main/resources/i18n/isis-fish-fr_FR.properties 2009-10-26 15:19:57 UTC (rev 2693) @@ -16,7 +16,6 @@ Can't\ get\ changlog=Impossible d'obtenir de changelog Can't\ get\ result\:\ %1$s=Can't get result\: %1$s Can't\ instanciate\ export\ %1$s=Can't instanciate export %1$s -Can't\ instanciate\ wanted\ VCS\ (%s),\ use\ default= Can't\ instantiate\ %s= Can't\ open\ log\ for\ %s= Can't\ open\ simulation\ internal\ frame= @@ -141,6 +140,8 @@ isisfish.common.warn=Warning isisfish.common.year=ann\u00E9e isisfish.common.zone=Zone +isisfish.config.category.main=Globale +isisfish.config.category.main.description=Configuration globale isisfish.config.database.lockmode.description= isisfish.config.main.compileDirectory.description=le r\u00E9pertoire o\u00F9 sont compil\u00E9s les scripts isisfish.config.main.configFileName.description=le fichier de configuration \u00E0 utiliser @@ -263,7 +264,7 @@ isisfish.error.equation.openeditor=Impossible d'ouvrir l'editeur d'\u00E9quation isisfish.error.equation.return.number=EquationImpl must retun a number\: %1$s isisfish.error.equation.savemodel=Impossible de sauver l'\u00E9quation en tant que mod\u00E8le -isisfish.error.errorpane.htmlmessage=IsisFish a d\u00E9tect\u00E9 une erreur \: +isisfish.error.errorpane.htmlmessage=<html><b>IsisFish a d\u00E9tect\u00E9 une erreur \:</b><br />%s</b></html> isisfish.error.errorpane.title=Erreur isisfish.error.evaluate.equation=Can't evaluate equation\: %1$s isisfish.error.evaluate.preplan.script= @@ -605,7 +606,7 @@ isisfish.message.confirm.remove.region=Voulez-vous vraiment supprimer la r\u00E9gion %1$s ? isisfish.message.confirm.remove.script=Voulez-vous vraiment supprimer le script '%1$s' ? isisfish.message.copy.finished=Copie termin\u00E9e -isisfish.message.copy.region=Copier la r\u00E9gion vers %1$s +isisfish.message.copy.region=Copier la r\u00E9gion isisfish.message.creating.region=En train de cr\u00E9er la r\u00E9gion %1$s isisfish.message.creation.done=Cr\u00E9ation termin\u00E9e %1$s isisfish.message.creation.finished=Cr\u00E9ation termin\u00E9e @@ -641,7 +642,7 @@ isisfish.message.new.filename=Entrez le nom du nouveau du fichier.\n\t (utiliser uniquemment des caract\u00E8res et _ en commencant avec une majuscule) isisfish.message.new.formule.category=Choisissez le cat\u00E9gorie de la formule isisfish.message.new.formule.title=Nouvelle formule -isisfish.message.new.region.name=Entrer le nom de la nouvell r\u00E9gion +isisfish.message.new.region.name=Entrer le nom de la nouvelle r\u00E9gion isisfish.message.old.simulation.loaded=Ancienne simulation charg\u00E9e isisfish.message.page.modified=Cette page a \u00E9t\u00E9 modifi\u00E9, voulez-vous la sauvegarder ? isisfish.message.presimulation.script.execution=Ex\u00E9cution des scripts de Presimulation @@ -657,7 +658,7 @@ isisfish.message.save.finished=Sauvegarde termin\u00E9e isisfish.message.saveModel.dialog=Entrez le nom du mod\u00E8le d'equation isisfish.message.saveModel.finished=Sauvegarde du mod\u00E8le termin\u00E9e -isisfish.message.script.commit=Indiquez vos modifications +isisfish.message.script.commit=Indiquez un message pour committer les modifications fa\u00EEtes sur %s isisfish.message.setting.cache.aspects=Mise en place des aspects Cache isisfish.message.setting.trace.aspects=Mise en place des aspects Trace isisfish.message.simulation.ended=Simulation termin\u00E9e @@ -937,6 +938,8 @@ isisfish.script.save=Sauver isisfish.script.save.tooltip=Sauve le script isisfish.script.title=Editeur de scripts +isisfish.script.vcs.localaddition=Ce fichier n'est pas pr\u00E9sent sur le d\u00E9p\u00F4t +isisfish.script.vcs.localmodification=Ce fichier a des moficiations locale isisfish.season.toString=saison %1$s-%2$s isisfish.selectivity.equation=Equation isisfish.selectivity.selectPopulation=S\u00E9lectionnez une population @@ -1029,8 +1032,11 @@ isisfish.vcs.commit.cancel=annuler isisfish.vcs.commit.label=Entrer quelques mots concernant la modification des scripts isisfish.vcs.commit.ok=confirmer +isisfish.vcs.factory.cantinstanciate=Can't instanciate wanted VCS (%s), use default +isisfish.vcs.howto.save.key=Comment enregister sa clef publique ssh aupr\u00E8s du labs isisfish.vcs.init.notfoundcantdownload=La base de donn\u00E9es pour la version %s n'a ni pu \u00EAtre trouv\u00E9e, ni t\u00E9l\u00E9charg\u00E9e.\nVous devez la t\u00E9l\u00E9charger manullement \u00E0 partir du site d'Isis-Fish. isisfish.vcs.init.wrongprotocol=Votre base de donn\u00E9es locale \: %s n'utilise pas un protocole correct.\nVoulez-vous faire une sauvegarde de cette base et r\u00E9cup\u00E9rer une meilleure version ? +isisfish.vcs.save.key=Acc\u00E9der au labs pour enregister votre clef publique ssh isisfish.vcs.switchprotocol.confirm=Le protocole d'acc\u00E8s au d\u00E9p\u00F4t des scripts a chang\u00E9.\nVoulez-vous changer vers le nouveau d\u00E9p\u00F4t ? isisfish.vcs.switchtag.warningconflict=Votre base de donn\u00E9es a \u00E9t\u00E9 mise \u00E0 jour mais les fichiers suivants sont en conflit, merci de les v\u00E9rifier \: isisfish.vcs.switchversion.confirm=Vous n'utilisez pas le d\u00E9p\u00F4t correct pour votre version d'Isis-Fish \: %s.\nVoulez-vous changer de d\u00E9p\u00F4t ?