[Buix-commits] r524 - in trunk/lutinvcs: all/src/test/java/org/codelutin/vcs/ui ui/common/src/main/java/org/codelutin/vcs/ui ui/common/src/main/java/org/codelutin/vcs/ui/action ui/common/src/main/java/org/codelutin/vcs/ui/handler ui/common/src/main/java/org/codelutin/vcs/ui/model ui/common/src/main/java/org/codelutin/vcs/ui/util ui/common/src/main/resources/i18n
Author: tchemit Date: 2008-04-15 08:49:43 +0000 (Tue, 15 Apr 2008) New Revision: 524 Added: trunk/lutinvcs/all/src/test/java/org/codelutin/vcs/ui/ConfigUITest.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/ConfigUI.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/action/ShowConfigAction.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ConfigUIHandler.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/ConfigUIModel.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUI.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUIHandler.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUIModel.java Modified: trunk/lutinvcs/all/src/test/java/org/codelutin/vcs/ui/UITest.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/ConfirmUI.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/SynchUI.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/VCSUI.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/VCSUIFactory.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ChangelogUIHandler.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ConfirmUIHandler.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/DiffUIHandler.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/SynchUIHandler.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/ConfirmUIModel.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/SimpleVCSEntriesTableModelImpl.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabOneFileUI.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabOneFileUIHandler.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUI.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIHandler.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIModel.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUI.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIHandler.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIModel.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractVCSEntriesTableModel.java trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/UIHelper.java trunk/lutinvcs/ui/common/src/main/resources/i18n/common-en_GB.properties trunk/lutinvcs/ui/common/src/main/resources/i18n/common-fr_FR.properties Log: mise en place listener sur action du thread (et non plus sur chaque entr?\195?\169e ?\195?\160 traiter). mise en place ConfigUI Copied: trunk/lutinvcs/all/src/test/java/org/codelutin/vcs/ui/ConfigUITest.java (from rev 511, trunk/lutinvcs/all/src/test/java/org/codelutin/vcs/ui/UITest.java) =================================================================== --- trunk/lutinvcs/all/src/test/java/org/codelutin/vcs/ui/ConfigUITest.java (rev 0) +++ trunk/lutinvcs/all/src/test/java/org/codelutin/vcs/ui/ConfigUITest.java 2008-04-15 08:49:43 UTC (rev 524) @@ -0,0 +1,86 @@ +/** + * ##% Copyright (C) 2008 Code Lutin, Tony Chemit + * 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 org.codelutin.vcs.ui; + +import org.codelutin.i18n.I18n; +import org.codelutin.vcs.VCSConnexion; +import org.codelutin.vcs.VCSConnexionConfig; +import org.codelutin.vcs.VCSException; +import org.codelutin.vcs.VCSFactory; +import org.codelutin.vcs.type.VCSConnexionMode; +import org.codelutin.vcs.ui.model.ConfigUIModel; +import org.codelutin.vcs.util.VCSConnexionConfigImpl; + +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; +import java.io.IOException; + +/** @author chemit */ +public class ConfigUITest { + + public static void main(String[] args) throws IOException, VCSException { + + I18n.init(); + + final RepositoryGenerator generator = new RepositoryGenerator(); + + final File root = generator.generateWorkingRepositoryPath(); + + root.mkdirs(); + + //generator.generateWorkingRepository(root, 5, 5, 10, 14); + + final VCSConnexion connexion = initMockVCS(root); + + connexion.open(); + + ConfigUI ui = VCSUIFactory.newConfigUI(); + + ConfigUIModel model = ui.getHandler().getModel(); + + model.populate(connexion.getConfig(), true, "tony", "chemit", "chemit@codelutin.com"); + + ui.setVisible(true); + ui.addWindowListener(new WindowAdapter() { + boolean wasClosed = false; + + @Override + public void windowClosed(WindowEvent e) { + if (wasClosed) { + return; + } + connexion.close(); + generator.deleteWorkingCopy(root); + wasClosed = true; + } + }); + } + + public static VCSConnexion initMockVCS(File root) { + VCSConnexionConfig config = new VCSConnexionConfigImpl(); + config.setKeyFile(new File("/home/tony/.ssh/id_dsa")); + config.setUserName("tchemit"); + //config.setPassPhrase("pass"); + config.setNoPassPhrase(true); + config.setType("MOCK"); + config.setLocalDatabasePath(root); + config.setConnexionMode(VCSConnexionMode.SSH); + VCSConnexion connexion = VCSFactory.newConnexion(VCSConnexionMode.ANONYMOUS, config); + connexion.init(config); + return connexion; + } + +} \ No newline at end of file Modified: trunk/lutinvcs/all/src/test/java/org/codelutin/vcs/ui/UITest.java =================================================================== --- trunk/lutinvcs/all/src/test/java/org/codelutin/vcs/ui/UITest.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/all/src/test/java/org/codelutin/vcs/ui/UITest.java 2008-04-15 08:49:43 UTC (rev 524) @@ -39,7 +39,7 @@ final File root = generator.generateWorkingRepositoryPath(); - generator.generateWorkingRepository(root, 10, 5, 10, 100); + generator.generateWorkingRepository(root, 10, 5, 10, 1024); final VCSConnexion connexion = initMockVCS(root); Added: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/ConfigUI.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/ConfigUI.java (rev 0) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/ConfigUI.java 2008-04-15 08:49:43 UTC (rev 524) @@ -0,0 +1,167 @@ +/** + * # #% Copyright (C) 2008 Code Lutin, Tony Chemit + * 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 org.codelutin.vcs.ui; + +import static org.codelutin.i18n.I18n._; +import org.codelutin.util.FileUtil; +import org.codelutin.vcs.type.VCSConnexionMode; + +import javax.swing.AbstractButton; +import javax.swing.ButtonGroup; +import javax.swing.JCheckBox; +import javax.swing.JComponent; +import javax.swing.JEditorPane; +import javax.swing.JLabel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JTextField; +import java.awt.Color; +import java.io.File; +import java.util.Arrays; +import java.util.List; + +/** @author chemit */ +public abstract class ConfigUI extends org.codelutin.vcs.ui.util.AbstractUI<org.codelutin.vcs.ui.handler.ConfigUIHandler> { + + public enum Element { + firstname { + public String getValue(ConfigUI ui) { + return ui.getFirstname().getText(); + }}, + lastname { + public String getValue(ConfigUI ui) { + return ui.getLastname().getText(); + }}, + email { + public String getValue(ConfigUI ui) { + return ui.getEmail().getText(); + }}, + connexion { + public String getValue(ConfigUI ui) { + return ui.getFirstname().getText(); + }}, + login { + public String getValue(ConfigUI ui) { + return ui.getServerLogin().getText(); + }}, + password { + public String getValue(ConfigUI ui) { + return Arrays.toString(ui.getServerPassword().getPassword()); + }}, + passphrase { + public String getValue(ConfigUI ui) { + return Arrays.toString(ui.getServerPassword().getPassword()); + }}, + nopassphrase { + public String getValue(ConfigUI ui) { + return String.valueOf(ui.getServerNoPassPhrase().isSelected()); + }}, + privatekey { + public String getValue(ConfigUI ui) { + return ui.getServerPrivateKeyFile().getText(); + }}; + + public abstract String getValue(ConfigUI ui); + } + + public abstract JEditorPane getDoc(); + + public abstract JTextField getFirstname(); + + public abstract JTextField getLastname(); + + public abstract JTextField getEmail(); + + public abstract JRadioButton getServerAuthenticationMethodAnonymous(); + + public abstract JRadioButton getServerAuthenticationMethodPassword(); + + public abstract JRadioButton getServerAuthenticationMethodSsh(); + + public abstract JTextField getServerLogin(); + + public abstract JPasswordField getServerPassword(); + + public abstract JPasswordField getServerPassphrase(); + + public abstract JCheckBox getServerNoPassPhrase(); + + public abstract JTextField getServerPrivateKeyFile(); + + public abstract ButtonGroup getServerMethod(); + + public abstract AbstractButton getServerPrivateKeyChangeFile(); + + public abstract AbstractButton getServerPrivateKeyGenerate(); + + public abstract AbstractButton getOk(); + + public abstract AbstractButton getReset(); + + public abstract AbstractButton getCancelAction(); + + public abstract AbstractButton getTestConnection(); + + public abstract JLabel getFirstnameLabel(); + + public abstract JLabel getLastnameLabel(); + + public abstract JLabel getEmailLabel(); + + public abstract JLabel getServerLoginLabel(); + + public abstract JLabel getServerPasswordLabel(); + + public abstract JLabel getServerPassphraseLabel(); + + public abstract JLabel getServerPrivateKeyFileLabel(); + + + public boolean isConfigValid() { + return getHandler().isConfigValid(); + } + + protected void reset() { + getHandler().reset(); + } + + protected void save() { + getHandler().save(); + dispose(); + } + + protected void doCheck(Element element) { + getHandler().doCheck(element); + } + + protected void changePrivateKeyFile() { + File file = FileUtil.getFile(".*.pub$", _("lutinvcs.config.find.public.key")); + if (file != null) { + String path = file.getAbsolutePath(); + getServerPrivateKeyFile().setText(path.substring(0, path.length() - 4)); + doCheck(Element.privatekey); + } + } + + protected void setColor(List<String> errors, String name, JComponent component) { + component.setForeground(errors.contains(name) ? Color.red : Color.black); + } + + public void changeAutheticationMode(VCSConnexionMode mode) { + getHandler().getModel().setConnexionMode(mode); + doCheck(Element.connexion); + } + +} Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/ConfirmUI.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/ConfirmUI.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/ConfirmUI.java 2008-04-15 08:49:43 UTC (rev 524) @@ -29,7 +29,7 @@ import javax.swing.JToolBar; /** @author chemit */ -public abstract class ConfirmUI extends org.codelutin.vcs.ui.util.AbstractUI<org.codelutin.vcs.ui.handler.ConfirmUIHandler> { +public abstract class ConfirmUI extends org.codelutin.vcs.ui.util.AbstractBasicUI<org.codelutin.vcs.ui.handler.ConfirmUIHandler> { public abstract JLabel getActionLabel(); Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/SynchUI.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/SynchUI.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/SynchUI.java 2008-04-15 08:49:43 UTC (rev 524) @@ -16,6 +16,7 @@ import javax.swing.AbstractButton; import javax.swing.JPopupMenu; +import java.awt.event.WindowEvent; /** @author chemit */ public abstract class SynchUI extends org.codelutin.vcs.ui.util.AbstractTabUI<org.codelutin.vcs.ui.handler.SynchUIHandler> { @@ -48,4 +49,19 @@ public abstract JPopupMenu getPopup(); + @Override + public void windowOpened(WindowEvent e) { + if (getHandler().isUseThreadListener()) { + // add action manager listener + getHandler().getActionManager().addVCSActionThreadEventListener(getHandler()); + } + } + + @Override + public void windowClosed(WindowEvent e) { + if (getHandler().isUseThreadListener()) { + // remove action manager listener + getHandler().getActionManager().removeVCSActionThreadEventListener(getHandler()); + } + } } \ No newline at end of file Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/VCSUI.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/VCSUI.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/VCSUI.java 2008-04-15 08:49:43 UTC (rev 524) @@ -29,7 +29,8 @@ synch(SynchUI.class, org.codelutin.vcs.ui.handler.SynchUIHandler.class), diff(DiffUI.class, org.codelutin.vcs.ui.handler.DiffUIHandler.class), changelog(ChangelogUI.class, org.codelutin.vcs.ui.handler.ChangelogUIHandler.class), - confirm(ConfirmUI.class, org.codelutin.vcs.ui.handler.ConfirmUIHandler.class); + confirm(ConfirmUI.class, org.codelutin.vcs.ui.handler.ConfirmUIHandler.class), + config(ConfigUI.class, org.codelutin.vcs.ui.handler.ConfigUIHandler.class); private final Class<? extends AbstractUI> uiClass; private final Class<? extends AbstractUIHandler> handlerClass; Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/VCSUIFactory.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/VCSUIFactory.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/VCSUIFactory.java 2008-04-15 08:49:43 UTC (rev 524) @@ -56,6 +56,10 @@ return (ConfirmUI) getInstance().newUI(VCSUI.confirm); } + public static ConfigUI newConfigUI() { + return (ConfigUI) getInstance().newUI(VCSUI.config); + } + public void close() { if (cache != null) { cache.clear(); Copied: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/action/ShowConfigAction.java (from rev 511, trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/action/HelpAction.java) =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/action/ShowConfigAction.java (rev 0) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/action/ShowConfigAction.java 2008-04-15 08:49:43 UTC (rev 524) @@ -0,0 +1,52 @@ +/** + * # #% Copyright (C) 2008 Code Lutin, Tony Chemit + * 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 org.codelutin.vcs.ui.action; + +import static org.codelutin.i18n.I18n._; +import org.codelutin.vcs.ui.util.AbstractUI; +import org.codelutin.vcs.ui.util.AbstractUIHandler; +import static org.codelutin.vcs.ui.util.UIHelper.createActionIcon; +import org.codelutin.vcs.ui.VCSUIFactory; + +import javax.swing.AbstractAction; +import java.awt.event.ActionEvent; + +/** @author chemit */ +public class ShowConfigAction extends org.codelutin.vcs.ui.util.AbstractUIAction<AbstractUIHandler<?, ?>> { + + public static <H extends AbstractUIHandler<?, ?>> AbstractAction createAction(AbstractUI<H> ui) { + ShowConfigAction action = new ShowConfigAction(); + action.setUi(ui); + return action; + } + + private static final long serialVersionUID = 1L; + + public void actionPerformed(ActionEvent e) { + checkInit(); + ui = VCSUIFactory.newConfigUI(); + ui.setVisible(true); + } + + protected ShowConfigAction() { + super(_("lutinvcs.action.showconfig.libelle"), createActionIcon("showconfig")); + String name = (String) getValue(NAME); + putValue(DISPLAYED_MNEMONIC_INDEX_KEY, name.length() - 1); + putValue(ACCELERATOR_KEY, (int) name.charAt(name.length() - 1)); + putValue(NAME, null); + putValue(SHORT_DESCRIPTION, _("lutinvcs.action.showconfig.tip")); + } + +} \ No newline at end of file Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ChangelogUIHandler.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ChangelogUIHandler.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ChangelogUIHandler.java 2008-04-15 08:49:43 UTC (rev 524) @@ -15,11 +15,17 @@ package org.codelutin.vcs.ui.handler; import org.codelutin.vcs.VCSEntry; +import org.codelutin.vcs.event.VCSActionThreadEvent; import org.codelutin.vcs.type.VCSAction; +import org.codelutin.vcs.type.VCSState; import org.codelutin.vcs.ui.ChangelogUI; import org.codelutin.vcs.ui.model.ChangelogUIModel; import org.codelutin.vcs.ui.util.AbstractTabOneFileUIHandler; +import org.codelutin.vcs.ui.util.AbstractVCSEntriesTableModel; +import javax.swing.SwingUtilities; +import javax.swing.event.TableModelEvent; +import javax.swing.table.TableModel; import java.util.Collections; import java.util.EnumMap; @@ -27,10 +33,44 @@ public class ChangelogUIHandler extends AbstractTabOneFileUIHandler<ChangelogUIModel, ChangelogUI> { public ChangelogUIHandler(ChangelogUI ui) { - super(ui, new ChangelogUIModel()); + super(ui, new ChangelogUIModel(), true); ui.setHandler(this); } + public void tableChanged(final TableModelEvent e) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + TableModel source = (TableModel) e.getSource(); + if (source.getRowCount() == 0) { + getModel().setFileModel(null); + afterSelectionChanged(); + } else { + getSelectionModel().setSelectionInterval(0, 0); + } + } + }); + } + + public void onActionStarted(VCSActionThreadEvent event) { + log.info(event); + } + + public void onActionDone(VCSActionThreadEvent event) { + if (log.isDebugEnabled()) { + log.info(event); + } + AbstractVCSEntriesTableModel entriesModel = getModel().getEntriesModel(); + for (VCSEntry entry : event.getSource()) { + if (entry.getState() == VCSState.UP_TO_DATE) { + // remove it from model + entriesModel.removeEntry(entry); + } + } + log.info("notify table model changed " + this); + entriesModel.fireTableDataChanged(); + } + + @Override protected void afterSelectionChanged() { super.afterSelectionChanged(); VCSEntry vcsEntry = getModel().getFileModel(); Copied: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ConfigUIHandler.java (from rev 511, trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ConfirmUIHandler.java) =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ConfigUIHandler.java (rev 0) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ConfigUIHandler.java 2008-04-15 08:49:43 UTC (rev 524) @@ -0,0 +1,274 @@ +/** + * ##% Copyright (C) 2008 Code Lutin, Tony Chemit + * 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 org.codelutin.vcs.ui.handler; + +import org.codelutin.vcs.VCSConnexionConfig; +import org.codelutin.vcs.type.VCSConnexionMode; +import org.codelutin.vcs.ui.ConfigUI; +import org.codelutin.vcs.ui.ConfigUI.Element; +import org.codelutin.vcs.ui.model.ConfigUIModel; +import org.codelutin.vcs.ui.util.AbstractUIHandler; + +import javax.swing.JComponent; +import javax.swing.SwingUtilities; +import javax.swing.text.JTextComponent; +import java.awt.Color; +import java.beans.PropertyChangeEvent; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** @author chemit */ +public class ConfigUIHandler extends AbstractUIHandler<ConfigUIModel, ConfigUI> { + + protected List<String> errors; + + + public ConfigUIHandler(ConfigUI ui) { + super(ui, new ConfigUIModel()); + ui.setHandler(this); + errors = new ArrayList<String>(); + } + + public void propertyChange(PropertyChangeEvent evt) { + if (log.isDebugEnabled()) { + log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + } + String action = evt.getPropertyName(); + + if (ConfigUIModel.CONFIG_PROPERTY_CHANGED.equals(action)) { + // update ui with model values, + updateUI((ConfigUIModel) evt.getNewValue()); + doCheck(null); + return; + } + if (ConfigUIModel.MODE_PROPERTY_CHANGED.equals(action)) { + updateUI((VCSConnexionMode) evt.getNewValue()); + doCheck(null); + return; + } + + if (ConfigUIModel.MODIFIED_PROPERTY_CHANGED.equals(action)) { + Boolean newValue = (Boolean) evt.getNewValue(); + getUi().getReset().setEnabled(newValue != null && newValue); + return; + } + throw new IllegalStateException("unimplemented property changed : " + evt + " for " + this); + } + + + public synchronized List<String> validateModel(Element element) { + errors.clear(); + if (element != null) { + // compute modifed + setModified(element, getUi()); + } + ConfigUI ui = getUi(); + // validate firstname + lastname + email (only if visible) + if (ui.getFirstname().isVisible()) { + checkData(ui.getFirstname(), "firstname"); + checkData(ui.getLastname(), "lastname"); + checkData(ui.getEmail(), "email"); + } + switch (getModel().getMode()) { + case ANONYMOUS: + // nothing to validate + break; + case PASSWORD: + // login + password not empty + checkData(ui.getServerLogin(), "login"); + checkData(ui.getServerPassword().getPassword().length == 0, "password"); + break; + case SSH: + // login + private key exists + checkData(ui.getServerLogin(), "login"); + String s = ui.getServerPrivateKeyFile().getText(); + File file = new File(s); + checkData(s.isEmpty() || !file.exists(), "privatekey"); + checkData(errors.contains("login") || file.exists(), "generatekey"); + if (Element.nopassphrase.getValue(ui).equals("false")) { + // check it there is a pass-phrase + checkData(ui.getServerPassphrase().getPassword().length == 0, "passphrase"); + } else { + errors.remove("passphrase"); + } + break; + } + return errors; + } + + public void setModified(Element element, ConfigUI ui) { + boolean modify = false; + ConfigUIModel model = getModel(); + switch (element) { + + case connexion: + modify = model.getMode() != model.getConfig().getMode(); + break; + case email: + modify = !model.getEmail().equals(element.getValue(ui)); + break; + case firstname: + modify = !model.getFirstname().equals(element.getValue(ui)); + break; + case lastname: + modify = !model.getLasttname().equals(element.getValue(ui)); + break; + case login: + modify = !model.getConfig().getUserName().equals(element.getValue(ui)); + break; + case nopassphrase: + boolean b = ui.getServerNoPassPhrase().isSelected(); + modify = (model.getConfig().getPassphrase() != null && !model.getConfig().getPassphrase().isEmpty()) == b; + if (!b) { + model.removeModified(Element.passphrase); + } else { + char[] password = ui.getServerPassphrase().getPassword(); + boolean modify2; + if (model.getConfig().getPassphrase() == null || model.getConfig().getPassphrase().isEmpty()) { + modify2 = password.length == 0; + } else { + modify2 = model.getConfig().getPassphrase().equals(Arrays.toString(password)); + } + if (modify2) { + model.addModified(Element.passphrase); + } + } + break; + case password: + modify = !model.getConfig().getPassphrase().equals(Arrays.toString(ui.getServerPassword().getPassword())); + break; + case privatekey: + modify = !model.getConfig().getKeyFile().getAbsolutePath().equals(element.getValue(ui)); + break; + case passphrase: + modify = !model.getConfig().getPassphrase().equals(Arrays.toString(ui.getServerPassphrase().getPassword())); + break; + } + if (modify) { + model.addModified(element); + } else if (model.getModifieds().contains(element)) { + model.removeModified(element); + } + } + + public void doCheck(Element element) { + List<String> errors = validateModel(element); + updateUI(errors); + } + + + public boolean isConfigValid() { + return errors.isEmpty() || (errors.size() == 1 && errors.contains("generatekey")); + } + + public void reset() { + getModel().reset(); + } + + protected void updateUI(ConfigUIModel configUIModel) { + ConfigUI ui = getUi(); + VCSConnexionConfig config = configUIModel.getConfig(); + ui.getServerLogin().setText(config.getUserName()); + ui.getServerNoPassPhrase().setSelected(config.isNoPassPhrase()); + ui.getServerPrivateKeyFile().setText(config.getKeyFile() == null ? "" : config.getKeyFile().getAbsolutePath()); + ui.getServerPassword().setText(configUIModel.getMode() != VCSConnexionMode.PASSWORD || config.getPassphrase() == null ? "" : config.getPassphrase()); + ui.getServerPassphrase().setText(configUIModel.getMode() != VCSConnexionMode.SSH || config.getPassphrase() == null ? "" : config.getPassphrase()); + boolean showIdenty = configUIModel.isShowIdentity(); + getUi().getFirstnameLabel().setVisible(showIdenty); + getUi().getLastnameLabel().setVisible(showIdenty); + getUi().getEmailLabel().setVisible(showIdenty); + getUi().getFirstname().setVisible(showIdenty); + getUi().getLastname().setVisible(showIdenty); + getUi().getEmail().setVisible(showIdenty); + if (showIdenty) { + getUi().getFirstname().setText(configUIModel.getFirstname()); + getUi().getLastname().setText(configUIModel.getLasttname()); + getUi().getEmail().setText(configUIModel.getEmail()); + } + } + + protected void updateUI(VCSConnexionMode mode) { + ConfigUI ui = getUi(); + switch (mode) { + case ANONYMOUS: + ui.getServerAuthenticationMethodAnonymous().setSelected(true); + break; + case PASSWORD: + ui.getServerAuthenticationMethodPassword().setSelected(true); + setModified(Element.login, ui); + setModified(Element.password, ui); + break; + case SSH: + setModified(Element.login, ui); + setModified(Element.nopassphrase, ui); + setModified(Element.passphrase, ui); + setModified(Element.privatekey, ui); + ui.getServerAuthenticationMethodSsh().setSelected(true); + break; + } + SwingUtilities.invokeLater(new Runnable() { + public void run() { + getUi().pack(); + } + }); + } + + protected void updateUI(List<String> errors) { + ConfigUI ui = getUi(); + boolean valid = isConfigValid(); + ui.getOk().setEnabled(valid && getModel().isModified()); + ui.getTestConnection().setEnabled(valid); + + setColor(errors, "firstname", ui.getFirstnameLabel()); + setColor(errors, "lastname", ui.getLastnameLabel()); + setColor(errors, "email", ui.getEmailLabel()); + setColor(errors, "login", ui.getServerLoginLabel()); + setColor(errors, "password", ui.getServerPasswordLabel()); + setColor(errors, "passphrase", ui.getServerPassphraseLabel()); + setColor(errors, "privatekey", ui.getServerPrivateKeyFileLabel()); + if (getModel().getMode() == VCSConnexionMode.SSH) { + ui.getServerPrivateKeyGenerate().setEnabled(!errors.contains("generatekey")); + } + } + + protected void checkData(JTextComponent component, String errorName) { + if (component.getText().isEmpty()) { + errors.add(errorName); + } + } + + protected void checkData(boolean notValid, String errorName) { + if (notValid) { + errors.add(errorName); + } + } + + protected void setColor(List<String> errors, String name, JComponent component) { + component.setForeground(errors.contains(name) ? Color.red : Color.black); + } + + public void save() { + if (!getModel().isModified()) { + log.warn("nothing to save"); + } + for (Element element : getModel().getModifieds()) { + String value = element.getValue(getUi()); + getModel().save(element, value); + log.info("save " + element); + } + } +} \ No newline at end of file Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ConfirmUIHandler.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ConfirmUIHandler.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/ConfirmUIHandler.java 2008-04-15 08:49:43 UTC (rev 524) @@ -16,10 +16,11 @@ import static org.codelutin.i18n.I18n._; import org.codelutin.vcs.VCSEntry; +import org.codelutin.vcs.event.VCSActionThreadEvent; import org.codelutin.vcs.type.VCSAction; import org.codelutin.vcs.ui.ConfirmUI; import org.codelutin.vcs.ui.model.ConfirmUIModel; -import org.codelutin.vcs.ui.util.AbstractUIHandler; +import org.codelutin.vcs.ui.util.AbstractBasicUIHandler; import org.codelutin.vcs.ui.util.AbstractVCSEntriesTableModel; import org.codelutin.vcs.ui.util.UIHelper; @@ -37,16 +38,18 @@ import java.util.List; /** @author chemit */ -public class ConfirmUIHandler extends AbstractUIHandler<ConfirmUIModel, ConfirmUI> { +public class ConfirmUIHandler extends AbstractBasicUIHandler<ConfirmUIModel, ConfirmUI> { + public ConfirmUIHandler(ConfirmUI ui) { - super(ui, new ConfirmUIModel()); + super(ui, new ConfirmUIModel(), false); ui.setHandler(this); } @Override public void init() { super.init(); + getUi().getMessageModel().addElement(""); getUi().getMessageSelectionModel().addListSelectionListener(new ListSelectionListener() { @@ -106,6 +109,14 @@ throw new IllegalStateException("unimplemented property changed : " + evt + " for " + this); } + public void onActionStarted(VCSActionThreadEvent event) { + // confirm ui does not listen thread + } + + public void onActionDone(VCSActionThreadEvent event) { + // confirm ui does not listen thread + } + protected void afterActionChanged() { VCSAction action = getModel().getAction(); getUi().getActionLabel().setIcon(UIHelper.createActionIcon(action)); @@ -187,4 +198,11 @@ getUi().dispose(); } + public void setBusy(Boolean busy) { + if (busy) { + // make busy ui + } else { + // release ui + } + } } Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/DiffUIHandler.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/DiffUIHandler.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/DiffUIHandler.java 2008-04-15 08:49:43 UTC (rev 524) @@ -17,11 +17,17 @@ import static org.codelutin.i18n.I18n._; import org.codelutin.util.FileUtil; import org.codelutin.vcs.VCSEntry; +import org.codelutin.vcs.event.VCSActionThreadEvent; import org.codelutin.vcs.type.VCSAction; +import org.codelutin.vcs.type.VCSState; import org.codelutin.vcs.ui.DiffUI; import org.codelutin.vcs.ui.model.DiffUIModel; import org.codelutin.vcs.ui.util.AbstractTabOneFileUIHandler; +import org.codelutin.vcs.ui.util.AbstractVCSEntriesTableModel; +import javax.swing.SwingUtilities; +import javax.swing.event.TableModelEvent; +import javax.swing.table.TableModel; import java.beans.PropertyChangeEvent; import java.util.Collections; import java.util.EnumMap; @@ -30,10 +36,29 @@ public class DiffUIHandler extends AbstractTabOneFileUIHandler<DiffUIModel, DiffUI> { public DiffUIHandler(DiffUI ui) { - super(ui, new DiffUIModel()); + super(ui, new DiffUIModel(), true); ui.setHandler(this); } + public void onActionStarted(VCSActionThreadEvent event) { + log.info(event); + } + + public void onActionDone(VCSActionThreadEvent event) { + if (log.isDebugEnabled()) { + log.info(event); + } + AbstractVCSEntriesTableModel entriesModel = getModel().getEntriesModel(); + for (VCSEntry entry : event.getSource()) { + if (entry.getState() == VCSState.UP_TO_DATE) { + // remove it from model + entriesModel.removeEntry(entry); + } + } + log.info("notify table model changed " + this); + entriesModel.fireTableDataChanged(); + } + @Override public void propertyChange(PropertyChangeEvent evt) { if (log.isDebugEnabled()) { @@ -46,6 +71,21 @@ super.propertyChange(evt); } + public void tableChanged(final TableModelEvent e) { + + SwingUtilities.invokeLater(new Runnable() { + public void run() { + TableModel source = (TableModel) e.getSource(); + if (source.getRowCount() == 0) { + getModel().setFileModel(null); + afterSelectionChanged(); + } else { + getSelectionModel().setSelectionInterval(0, 0); + } + } + }); + } + @Override protected void afterSelectionChanged() { super.afterSelectionChanged(); @@ -78,22 +118,18 @@ DiffUI ui = getUi(); boolean hasNext = getModel().hasNext(); boolean hasPrevious = getModel().hasPrevious(); - log.info("//TODO :" + this + " next:" + hasNext + ", prev:" + hasPrevious); ui.getNextDiff().setEnabled(hasNext); ui.getPreviousDiff().setEnabled(hasPrevious); ui.getNextDiff().setToolTipText(hasNext ? _("lutinvcs.action.nextdiff.tip") : null); ui.getPreviousDiff().setToolTipText(hasPrevious ? _("lutinvcs.action.previousdiff.tip") : null); - - //TODO init diff handler + //TODO update diff handler } public void gotoNextDiff() { getModel().setDiff(getModel().getDiff() + 1); - log.info("//TODO :" + this); } public void gotoPreviousDiff() { getModel().setDiff(getModel().getDiff() - 1); - log.info("//TODO :" + this); } } Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/SynchUIHandler.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/SynchUIHandler.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/handler/SynchUIHandler.java 2008-04-15 08:49:43 UTC (rev 524) @@ -1,15 +1,21 @@ package org.codelutin.vcs.ui.handler; import static org.codelutin.i18n.I18n._; +import org.codelutin.vcs.VCSEntry; +import org.codelutin.vcs.event.VCSActionThreadEvent; import org.codelutin.vcs.type.VCSAction; +import org.codelutin.vcs.type.VCSState; import org.codelutin.vcs.ui.SynchUI; import org.codelutin.vcs.ui.model.SynchUIModel; import org.codelutin.vcs.ui.util.AbstractTabUIHandler; +import org.codelutin.vcs.ui.util.AbstractVCSEntriesTableModel; import javax.swing.AbstractButton; import javax.swing.JPopupMenu; import javax.swing.JTable; import javax.swing.ListSelectionModel; +import javax.swing.SwingUtilities; +import javax.swing.event.TableModelEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.EnumMap; @@ -18,10 +24,39 @@ public class SynchUIHandler extends AbstractTabUIHandler<SynchUIModel, SynchUI> { public SynchUIHandler(SynchUI ui) { - super(ui, new SynchUIModel()); + super(ui, new SynchUIModel(), true); ui.setHandler(this); } + public void onActionStarted(VCSActionThreadEvent event) { + log.info(event); + } + + public void onActionDone(VCSActionThreadEvent event) { + if (log.isDebugEnabled()) { + log.info(event); + } + AbstractVCSEntriesTableModel entriesModel = getModel().getEntriesModel(); + for (VCSEntry entry : event.getSource()) { + if (entry.getState() == VCSState.UP_TO_DATE) { + // remove it from model + entriesModel.removeEntry(entry); + } + } + log.info("notify table model changed " + this); + entriesModel.fireTableDataChanged(); + } + + public void tableChanged(TableModelEvent e) { + + SwingUtilities.invokeLater(new Runnable() { + public void run() { + // rebuild lists + afterLocationChanged(); + } + }); + } + @Override public void init() { super.init(); @@ -75,12 +110,19 @@ } protected void afterLocationChanged() { - - EnumMap<VCSAction, Integer> actions = getModel().getEntriesModel().countActions((ListSelectionModel) null); + EnumMap<VCSAction, Integer> actions; + if (getModel().getEntriesModel().getRowCount() == 0) { + getUi().getContentTable().setVisible(false); + actions = new EnumMap<VCSAction, Integer>(VCSAction.class); + } else { + getUi().getContentTable().setVisible(true); + actions = getModel().getEntriesModel().countActions((ListSelectionModel) null); + } boolean hasActions = !actions.isEmpty(); SynchUI ui = getUi(); // refresh actions is enabled on all files - int nbFiles = actions.get(VCSAction.REFRESH); + Integer nbFiles = actions.get(VCSAction.REFRESH); + nbFiles = nbFiles == null ? 0 : nbFiles; updateAction(actions, hasActions, ui.getDiffAll(), VCSAction.DIFF, true, nbFiles); updateAction(actions, hasActions, ui.getChangelogAll(), VCSAction.CHANGELOG, true, nbFiles); updateAction(actions, hasActions, ui.getUpdateAll(), VCSAction.UPDATE, true, nbFiles); Copied: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/ConfigUIModel.java (from rev 511, trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/ConfirmUIModel.java) =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/ConfigUIModel.java (rev 0) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/ConfigUIModel.java 2008-04-15 08:49:43 UTC (rev 524) @@ -0,0 +1,198 @@ +/** + * ##% Copyright (C) 2008 Code Lutin, Tony Chemit + * 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 org.codelutin.vcs.ui.model; + +import org.codelutin.vcs.VCSConnexionConfig; +import org.codelutin.vcs.type.VCSConnexionMode; +import org.codelutin.vcs.ui.ConfigUI.Element; +import org.codelutin.vcs.ui.util.AbstractUIModel; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * Model of a a confirmation of action on entries (single type of action possible) + * + * @author chemit + */ +public class ConfigUIModel extends AbstractUIModel { + + public static final String CONFIG_PROPERTY_CHANGED = "config"; + + public static final String MODE_PROPERTY_CHANGED = "mode"; + + public static final String IDENTITY_PROPERTY_CHANGED = "identity"; + + public static final String MODIFIED_PROPERTY_CHANGED = "modify"; + + private boolean showIdentity; + + private String firstname; + private String lasttname; + private String email; + private VCSConnexionMode mode; + + protected List<Element> modifieds; + protected VCSConnexionConfig config; + + public ConfigUIModel() { + modifieds = new ArrayList<Element>(); + } + + public void populate(VCSConnexionConfig config, boolean showIdentify, String firstname, String lastname, String email) { + this.config = config; + this.firstname = firstname; + this.lasttname = lastname; + this.email = email; + this.showIdentity = showIdentify; + setConnexionMode(config.getMode()); + setModified(false); + firePropertyChange(CONFIG_PROPERTY_CHANGED, null, this); + } + + public void populate(VCSConnexionConfig config) { + populate(config, false, null, null, null); + } + + public void reset() { + checkConnexionInit(); + populate(config, showIdentity, firstname, lasttname, email); + } + + public void setConnexionMode(VCSConnexionMode mode) { + VCSConnexionMode oldMode = this.mode; + this.mode = mode; + if (oldMode != null) { + switch (oldMode) { + case ANONYMOUS: + // nothing to clean + break; + case PASSWORD: + modifieds.remove(Element.login); + modifieds.remove(Element.password); + break; + case SSH: + modifieds.remove(Element.login); + modifieds.remove(Element.passphrase); + modifieds.remove(Element.nopassphrase); + modifieds.remove(Element.privatekey); + break; + } + } + firePropertyChange(MODE_PROPERTY_CHANGED, oldMode, mode); + } + + public String getEmail() { + return email; + } + + public String getFirstname() { + return firstname; + } + + public String getLasttname() { + return lasttname; + } + + public boolean isShowIdentity() { + return showIdentity; + } + + public boolean isModified() { + return !modifieds.isEmpty(); + } + + public List<Element> getModifieds() { + return modifieds; + } + + public VCSConnexionConfig getConfig() throws IllegalStateException { + checkConnexionInit(); + return config; + } + + public VCSConnexionMode getMode() throws IllegalStateException { + checkConnexionInit(); + return mode; + } + + public void addModified(Element elementname) { + if (!modifieds.contains(elementname)) { + modifieds.add(elementname); + setModified(true); + } + } + + public void removeModified(Element elementname) { + if (modifieds.contains(elementname)) { + modifieds.remove(elementname); + } + setModified(!modifieds.isEmpty()); + } + + public void setModified(boolean modified) { + if (!modified) { + modifieds.clear(); + } + firePropertyChange(MODIFIED_PROPERTY_CHANGED, null, modified); + } + + public void save(Element element, String value) { + checkConnexionInit(); + switch (element) { + case connexion: + config.setConnexionMode(mode); + break; + case email: + break; + case firstname: + break; + case lastname: + break; + case login: + if (mode != VCSConnexionMode.ANONYMOUS) { + config.setUserName(value); + } + break; + case nopassphrase: + if (mode == VCSConnexionMode.SSH) { + config.setNoPassPhrase(Boolean.valueOf(value)); + } + break; + case password: + if (mode == VCSConnexionMode.PASSWORD) { + config.setPassPhrase(value); + } + case passphrase: + if (mode == VCSConnexionMode.SSH) { + config.setPassPhrase(value); + } + break; + case privatekey: + if (mode == VCSConnexionMode.SSH) { + config.setKeyFile(new File(value)); + } + break; + } + } + + + protected void checkConnexionInit() throws IllegalStateException { + if (config == null) { + throw new IllegalStateException("no config found in model " + this); + } + } +} \ No newline at end of file Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/ConfirmUIModel.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/ConfirmUIModel.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/ConfirmUIModel.java 2008-04-15 08:49:43 UTC (rev 524) @@ -17,7 +17,7 @@ import org.codelutin.vcs.VCSEntry; import org.codelutin.vcs.type.VCSAction; import org.codelutin.vcs.type.VCSEntryLocation; -import org.codelutin.vcs.ui.util.AbstractUIModel; +import org.codelutin.vcs.ui.util.AbstractBasicUIModel; import java.util.ArrayList; import java.util.List; @@ -27,7 +27,7 @@ * * @author chemit */ -public class ConfirmUIModel extends AbstractUIModel { +public class ConfirmUIModel extends AbstractBasicUIModel { public static final String ACCEPT_PROPERTY_CHANGED = "action"; public static final String MESSAGE_HISTORY_PROPERTY_CHANGED = "historyMessage"; Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/SimpleVCSEntriesTableModelImpl.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/SimpleVCSEntriesTableModelImpl.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/model/SimpleVCSEntriesTableModelImpl.java 2008-04-15 08:49:43 UTC (rev 524) @@ -57,5 +57,4 @@ return result; } - } Copied: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUI.java (from rev 511, trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUI.java) =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUI.java (rev 0) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUI.java 2008-04-15 08:49:43 UTC (rev 524) @@ -0,0 +1,31 @@ +/** + * ##% Copyright (C) 2008 Code Lutin, Tony Chemit + * 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 org.codelutin.vcs.ui.util; + +import javax.swing.JScrollPane; +import javax.swing.JTable; + +/** @author chemit */ +public abstract class AbstractBasicUI<H extends AbstractUIHandler> extends AbstractUI<H> { + + public abstract JScrollPane getContentScroll(); + + public abstract JTable getContentTable(); + + protected AbstractBasicUI() { + super(); + } + +} \ No newline at end of file Copied: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUIHandler.java (from rev 511, trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIHandler.java) =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUIHandler.java (rev 0) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUIHandler.java 2008-04-15 08:49:43 UTC (rev 524) @@ -0,0 +1,72 @@ +/** + * ##% Copyright (C) 2008 Code Lutin, Tony Chemit + * 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 org.codelutin.vcs.ui.util; + +import org.codelutin.vcs.VCSFactory; +import org.codelutin.vcs.event.VCSActionThreadEventListener; +import org.codelutin.vcs.runner.VCSActionManager; +import org.codelutin.vcs.type.VCSEntryLocation; + +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +/** @author chemit */ +public abstract class AbstractBasicUIHandler<M extends AbstractBasicUIModel, U extends AbstractBasicUI<? extends AbstractBasicUIHandler>> extends AbstractUIHandler<M, U> implements ListSelectionListener, VCSActionThreadEventListener { + + private final boolean useThreadListener; + + protected abstract void afterSelectionChanged(); + + protected AbstractBasicUIHandler(U ui, M model, boolean useThreadListener) { + super(ui, model); + this.useThreadListener = useThreadListener; + } + + public final ListSelectionModel getSelectionModel() { + return getUi().getContentTable().getSelectionModel(); + } + + public boolean isUseThreadListener() { + return useThreadListener; + } + + public void valueChanged(ListSelectionEvent e) { + if (!e.getValueIsAdjusting()) { + // update popup states + afterSelectionChanged(); + } + } + + @Override + public void init() { + super.init(); + getUi().getContentTable().getSelectionModel().addListSelectionListener(this); + JTable table = getUi().getContentTable(); + table.setModel(getModel().getEntriesModel()); + // init table renderer + UIHelper.installVCSTableUI(table); + } + + public VCSEntryLocation getLocation() { + return getModel().getEntriesModel().getLocation(); + } + + public VCSActionManager getActionManager() { + return VCSFactory.getActionManager(); + } + +} \ No newline at end of file Copied: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUIModel.java (from rev 511, trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIModel.java) =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUIModel.java (rev 0) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractBasicUIModel.java 2008-04-15 08:49:43 UTC (rev 524) @@ -0,0 +1,64 @@ +/** + * ##% Copyright (C) 2008 Code Lutin, Tony Chemit + * 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 org.codelutin.vcs.ui.util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.codelutin.vcs.VCSConnexion; +import org.codelutin.vcs.VCSEntry; +import org.codelutin.vcs.VCSException; +import org.codelutin.vcs.type.VCSEntryLocation; +import org.codelutin.vcs.ui.model.SimpleVCSEntriesTableModelImpl; + +import java.util.List; + +/** + * Basic ui model, with a {@link AbstractVCSEntriesTableModel} model. + * <p/> + * Encapsulate an {@link org.codelutin.vcs.ui.util.AbstractVCSEntriesTableModel}. + * + * @author chemit + */ +public abstract class AbstractBasicUIModel extends AbstractUIModel { + + static protected final Log log = LogFactory.getLog(AbstractBasicUIModel.class); + + protected final AbstractVCSEntriesTableModel entriesModel; + + protected AbstractBasicUIModel() { + entriesModel = new SimpleVCSEntriesTableModelImpl(getClass().getSimpleName()); + } + + public AbstractVCSEntriesTableModel getEntriesModel() { + return entriesModel; + } + + public void populate(VCSConnexion connexion) throws VCSException { + getEntriesModel().populate(connexion, System.nanoTime()); + } + + public void populate(VCSConnexion connexion, List<String> relativeLocalPaths, VCSEntryLocation location) throws VCSException { + getEntriesModel().populate(connexion, System.nanoTime(), location, relativeLocalPaths); + } + + public void populate(VCSEntryLocation location, VCSEntry[] datas) { + getEntriesModel().populate(location, datas); + } + + public void refresh(List<VCSEntry> entries) throws VCSException { + getEntriesModel().refresh(System.nanoTime(), entries); + } + +} \ No newline at end of file Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabOneFileUI.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabOneFileUI.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabOneFileUI.java 2008-04-15 08:49:43 UTC (rev 524) @@ -18,6 +18,7 @@ import javax.swing.AbstractAction; import javax.swing.AbstractButton; +import java.awt.event.WindowEvent; /** @author chemit */ public abstract class AbstractTabOneFileUI<H extends AbstractTabOneFileUIHandler<?, ?>> extends AbstractTabUI<H> { @@ -26,15 +27,28 @@ public abstract AbstractButton getPreviousFile(); + protected AbstractAction createFileAction(boolean goPrevious) { + return ChangeFileAction.createAction(goPrevious, this); + } + + protected boolean hasListener; + @Override - public void setVisible(boolean b) { - super.setVisible(b); - getContentTable().setAutoscrolls(true); - //TODO selected first file ? + public synchronized void windowActivated(WindowEvent e) { + if (!hasListener && getHandler().isUseThreadListener()) { + // add action manager listener + getHandler().getActionManager().addVCSActionThreadEventListener(getHandler()); + hasListener = true; + } + super.windowActivated(e); } - protected AbstractAction createFileAction(boolean goPrevious) { - return ChangeFileAction.createAction(goPrevious, this); + @Override + public synchronized void windowDeactivated(WindowEvent e) { + if (!isVisible() && getHandler().isUseThreadListener() && hasListener) { + // remove action manager listener + getHandler().getActionManager().removeVCSActionThreadEventListener(getHandler()); + hasListener = false; + } } - } \ No newline at end of file Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabOneFileUIHandler.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabOneFileUIHandler.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabOneFileUIHandler.java 2008-04-15 08:49:43 UTC (rev 524) @@ -17,6 +17,7 @@ import static org.codelutin.i18n.I18n._; import org.codelutin.vcs.VCSEntry; import org.codelutin.vcs.type.VCSAction; +import org.codelutin.vcs.type.VCSEntryLocation; import org.codelutin.vcs.ui.model.DiffUIModel; import javax.swing.AbstractButton; @@ -28,8 +29,8 @@ /** @author chemit */ public abstract class AbstractTabOneFileUIHandler<M extends AbstractTabOneFileUIModel, U extends AbstractTabOneFileUI<? extends AbstractTabUIHandler>> extends AbstractTabUIHandler<M, U> { - protected AbstractTabOneFileUIHandler(U ui, M model) { - super(ui, model); + protected AbstractTabOneFileUIHandler(U ui, M model,boolean useThreadListener) { + super(ui, model,useThreadListener); } @Override @@ -54,15 +55,12 @@ getModel().setFileModel(selectionIndex); } - //super.valueChanged(e); } protected void afterSelectionChanged() { - U ui = getUi(); boolean hasNext = getModel().hasNextFile(); boolean hasPrevious = getModel().hasPreviousFile(); - log.info("//TODO :" + this + " next:" + hasNext + ", prev:" + hasPrevious); ui.getNextFile().setEnabled(hasNext); ui.getPreviousFile().setEnabled(hasPrevious); ui.getNextFile().setToolTipText(hasNext ? _("lutinvcs.action.nextfile.tip") : null); @@ -75,6 +73,9 @@ } public void afterLocationChanged() { + if (getLocation() == VCSEntryLocation.UNKNOW) { + return; + } if (getModel().getEntriesModel().getRowCount() > 0) { // select first row getSelectionModel().setSelectionInterval(0, 0); Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUI.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUI.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUI.java 2008-04-15 08:49:43 UTC (rev 524) @@ -22,7 +22,7 @@ import javax.swing.ButtonGroup; /** @author chemit */ -public abstract class AbstractTabUI<H extends AbstractTabUIHandler<?, ?>> extends AbstractUI<H> { +public abstract class AbstractTabUI<H extends AbstractTabUIHandler<?, ?>> extends AbstractBasicUI<H> { public abstract ButtonGroup getTabs(); @@ -41,7 +41,6 @@ @Override public void setVisible(boolean b) { if (b) { - VCSEntryLocation vcsEntryLocation = getHandler().getLocation(); AbstractButton button = getButton(vcsEntryLocation); if (button == null) { @@ -52,7 +51,14 @@ } super.setVisible(b); } - + + @Override + public void dispose() { + super.dispose(); + // clean model + getHandler().getModel().getEntriesModel().clear(); + } + public AbstractButton getButton(VCSEntryLocation modelName) { switch (modelName) { case ALL: Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIHandler.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIHandler.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIHandler.java 2008-04-15 08:49:43 UTC (rev 524) @@ -15,24 +15,25 @@ package org.codelutin.vcs.ui.util; import org.codelutin.vcs.VCSEntry; +import org.codelutin.vcs.VCSException; import org.codelutin.vcs.type.VCSAction; -import org.codelutin.vcs.type.VCSEntryLocation; +import org.codelutin.vcs.ui.ChangelogUI; import org.codelutin.vcs.ui.ConfirmUI; import org.codelutin.vcs.ui.DiffUI; import org.codelutin.vcs.ui.VCSUIFactory; -import org.codelutin.vcs.ui.ChangelogUI; import javax.swing.AbstractButton; import javax.swing.ListSelectionModel; +import javax.swing.event.TableModelListener; import java.beans.PropertyChangeEvent; import java.util.EnumMap; import java.util.List; /** @author chemit */ -public abstract class AbstractTabUIHandler<M extends AbstractTabUIModel, U extends AbstractTabUI<? extends AbstractTabUIHandler>> extends AbstractUIHandler<M, U> { +public abstract class AbstractTabUIHandler<M extends AbstractTabUIModel, U extends AbstractTabUI<? extends AbstractTabUIHandler>> extends AbstractBasicUIHandler<M, U> implements TableModelListener { - protected AbstractTabUIHandler(U ui, M model) { - super(ui, model); + protected AbstractTabUIHandler(U ui, M model,boolean useThreadListener) { + super(ui, model,useThreadListener); } public void propertyChange(PropertyChangeEvent evt) { @@ -45,6 +46,12 @@ } } + @Override + public void init() { + super.init(); + getUi().getContentTable().getModel().addTableModelListener(this); + } + protected abstract void afterLocationChanged(); @@ -54,7 +61,9 @@ public void showConfirmUI(VCSAction action, AbstractVCSEntriesTableModel model, List<VCSEntry> entries) { ConfirmUI ui = VCSUIFactory.newConfirmUI(); - log.info("nb files:" + entries.size()); + if (log.isDebugEnabled()) { + log.debug("nb entries:" + entries.size()); + } ui.getHandler().getModel().init(action, model.getLocation(), entries.toArray(new VCSEntry[entries.size()])); ui.getContentScroll().setEnabled(entries.size() > 1); ui.setVisible(true); @@ -66,7 +75,9 @@ // take all entries entries = model.filter(VCSAction.DIFF, model.getEntries()); } - log.info("nb entries:" + entries.size()); + if (log.isDebugEnabled()) { + log.debug("nb entries:" + entries.size()); + } ui.getButton(model.getLocation()).setSelected(false); ui.getHandler().getModel().init(model.getLocation(), entries.toArray(new VCSEntry[entries.size()])); ui.getContentScroll().setEnabled(entries.size() > 1); @@ -79,8 +90,10 @@ // take all entries entries = model.filter(VCSAction.CHANGELOG, model.getEntries()); } - log.info("nb entries:" + entries.size()); - ui.getHandler().getModel().init(VCSEntryLocation.REMOTE, entries.toArray(new VCSEntry[entries.size()])); + if (log.isDebugEnabled()) { + log.debug("nb entries:" + entries.size()); + } + ui.getHandler().getModel().init(model.getLocation(), entries.toArray(new VCSEntry[entries.size()])); ui.getContentScroll().setEnabled(entries.size() > 1); ui.setVisible(true); } @@ -88,9 +101,15 @@ public void doRefresh(AbstractVCSEntriesTableModel model, List<VCSEntry> entries, ListSelectionModel selectionModel) { log.info(selectionModel); selectionModel.clearSelection(); - log.info("nb entries:" + entries.size()); + if (log.isDebugEnabled()) { + log.debug("nb entries:" + entries.size()); + } // do refresh of all states - model.refresh(System.nanoTime(), entries); + try { + model.refresh(System.nanoTime(), entries); + } catch (VCSException e) { + log.error(e); + } } - + } \ No newline at end of file Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIModel.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIModel.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIModel.java 2008-04-15 08:49:43 UTC (rev 524) @@ -21,7 +21,7 @@ * * @author chemit */ -public class AbstractTabUIModel extends AbstractUIModel { +public class AbstractTabUIModel extends AbstractBasicUIModel { public static final String LOCATION_PROPERTY_CHANGED = "location"; Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUI.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUI.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUI.java 2008-04-15 08:49:43 UTC (rev 524) @@ -15,25 +15,23 @@ package org.codelutin.vcs.ui.util; import org.codelutin.vcs.ui.action.HelpAction; +import org.codelutin.vcs.ui.action.ShowConfigAction; import javax.swing.AbstractAction; import javax.swing.AbstractButton; -import javax.swing.JScrollPane; -import javax.swing.JTable; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; /** @author chemit */ -public abstract class AbstractUI<H extends AbstractUIHandler> extends javax.swing.JDialog { +public abstract class AbstractUI<H extends AbstractUIHandler> extends javax.swing.JDialog implements WindowListener { - public abstract JScrollPane getContentScroll(); - - public abstract JTable getContentTable(); - public abstract AbstractButton getHelp(); private H handler; protected AbstractUI() { UIHelper.setQuitAction(this); + addWindowListener(this); } public H getHandler() { @@ -47,4 +45,29 @@ protected AbstractAction createHelpAction() { return HelpAction.createAction(this); } + + protected AbstractAction createShowConfigAction() { + return ShowConfigAction.createAction(this); + } + + public void windowOpened(WindowEvent e) { + } + + public void windowClosed(WindowEvent e) { + } + + public void windowClosing(WindowEvent e) { + } + + public void windowIconified(WindowEvent e) { + } + + public void windowDeiconified(WindowEvent e) { + } + + public void windowActivated(WindowEvent e) { + } + + public void windowDeactivated(WindowEvent e) { + } } Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIHandler.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIHandler.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIHandler.java 2008-04-15 08:49:43 UTC (rev 524) @@ -16,18 +16,11 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.codelutin.vcs.VCSFactory; -import org.codelutin.vcs.runner.VCSActionManager; -import org.codelutin.vcs.type.VCSEntryLocation; -import javax.swing.JTable; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; import java.beans.PropertyChangeListener; /** @author chemit */ -public abstract class AbstractUIHandler<M extends AbstractUIModel, U extends AbstractUI<? extends AbstractUIHandler>> implements PropertyChangeListener, ListSelectionListener { +public abstract class AbstractUIHandler<M extends AbstractUIModel, U extends AbstractUI<? extends AbstractUIHandler>> implements PropertyChangeListener { protected static Log log = LogFactory.getLog(AbstractUIHandler.class); @@ -37,8 +30,6 @@ /** model handled */ private M model; - protected abstract void afterSelectionChanged(); - protected AbstractUIHandler(U ui, M model) { this.ui = ui; this.model = model; @@ -52,35 +43,14 @@ return model; } - public final ListSelectionModel getSelectionModel() { - return getUi().getContentTable().getSelectionModel(); - } - - public void valueChanged(ListSelectionEvent e) { - if (!e.getValueIsAdjusting()) { - // update popup states - afterSelectionChanged(); - } - } - public void init() { if (model == null) { throw new IllegalStateException("no model was defined for " + this); } model.addPropertyChangeListener(this); - getUi().getContentTable().getSelectionModel().addListSelectionListener(this); - JTable table = getUi().getContentTable(); - table.setModel(getModel().getEntriesModel()); - // init table renderer - UIHelper.installVCSTableUI(table); } - public VCSEntryLocation getLocation() { - return model.getEntriesModel().getLocation(); - } - - protected VCSActionManager getActionManager() { - return VCSFactory.getActionManager(); - } - + public void dispose() { + model.removePropertyChangeListener(this); + } } Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIModel.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIModel.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIModel.java 2008-04-15 08:49:43 UTC (rev 524) @@ -16,20 +16,12 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.codelutin.vcs.VCSConnexion; -import org.codelutin.vcs.VCSEntry; -import org.codelutin.vcs.VCSException; -import org.codelutin.vcs.type.VCSEntryLocation; -import org.codelutin.vcs.ui.model.SimpleVCSEntriesTableModelImpl; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; -import java.util.List; /** * Abstract ui model, with property change support. - * <p/> - * Encapsulate an {@link AbstractVCSEntriesTableModel}. * * @author chemit */ @@ -40,32 +32,10 @@ /** support for change properties support */ protected PropertyChangeSupport changeSupport; - protected final AbstractVCSEntriesTableModel entriesModel; - protected AbstractUIModel() { - entriesModel = new SimpleVCSEntriesTableModelImpl(getClass().getSimpleName()); - } - public AbstractVCSEntriesTableModel getEntriesModel() { - return entriesModel; } - public void populate(VCSConnexion connexion) throws VCSException { - getEntriesModel().populate(connexion, System.nanoTime()); - } - - public void populate(VCSConnexion connexion, List<String> relativeLocalPaths, VCSEntryLocation location) throws VCSException { - getEntriesModel().populate(connexion, System.nanoTime(), location, relativeLocalPaths); - } - - public void populate(VCSEntryLocation location, VCSEntry[] datas) { - getEntriesModel().populate(location, datas); - } - - public void refresh(List<VCSEntry> entries) { - getEntriesModel().refresh(System.nanoTime(), entries); - } - public synchronized void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { if (listener == null) { return; Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractVCSEntriesTableModel.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractVCSEntriesTableModel.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/AbstractVCSEntriesTableModel.java 2008-04-15 08:49:43 UTC (rev 524) @@ -19,6 +19,8 @@ * ##% */ package org.codelutin.vcs.ui.util; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import static org.codelutin.i18n.I18n._; import org.codelutin.vcs.VCSConnexion; import org.codelutin.vcs.VCSEntries; @@ -34,8 +36,8 @@ import javax.swing.table.TableRowSorter; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumMap; import java.util.List; -import java.util.EnumMap; /** * Simple Table model to display list of VCSFileState @@ -44,8 +46,11 @@ */ public abstract class AbstractVCSEntriesTableModel extends javax.swing.table.AbstractTableModel implements VCSEntries { + static protected final Log log = LogFactory.getLog(AbstractVCSEntriesTableModel.class); + protected final String name; + /** column names */ protected final String[] columnNames; @@ -62,7 +67,6 @@ private static final long serialVersionUID = 4697917831388337369L; - protected AbstractVCSEntriesTableModel(String name, String[] columnNames) { super(); this.name = name; @@ -115,9 +119,7 @@ public void setLocation(VCSEntryLocation location) { this.location = location; - displayedEntries.clear(); - displayedEntries.addAll(filter(location)); - fireTableDataChanged(); + updateEntries(); } public EnumMap<VCSAction, Integer> countActions(ListSelectionModel selectionModel) { @@ -154,6 +156,15 @@ return delegate.filter(action, entries); } + public void addEntry(VCSEntry entry) { + delegate.addEntry(entry); + } + + public void removeEntry(VCSEntry entry) { + delegate.removeEntry(entry); + displayedEntries.remove(entry); + } + public List<VCSEntry> filter(VCSConnexion connexion, List<VCSEntry> entries) { return delegate.filter(connexion, entries); } @@ -188,11 +199,16 @@ updateEntries(); } - public void refresh(long timestamp, List<VCSEntry> entries) throws IllegalStateException { + public void refresh(long timestamp, List<VCSEntry> entries) throws IllegalStateException, VCSException { delegate.refresh(timestamp, entries); - updateEntries(); + //updateEntries(); } + public void refresh(long timestamp, VCSEntry entry) throws IllegalStateException, VCSException { + delegate.refresh(timestamp, entry); + + } + public EnumMap<VCSAction, Integer> countActions(List<VCSEntry> entries) { return delegate.countActions(entries); } @@ -203,12 +219,16 @@ public void clear() { delegate.clear(); - displayedEntries.clear(); + clearDisplayed(); fireTableDataChanged(); } + public void clearDisplayed() { + displayedEntries.clear(); + } + protected void updateEntries() { - displayedEntries.clear(); + clearDisplayed(); displayedEntries.addAll(filter(location)); fireTableDataChanged(); } @@ -219,4 +239,5 @@ } return displayedEntries.get(rowSorter.convertRowIndexToModel(row)); } + } \ No newline at end of file Modified: trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/UIHelper.java =================================================================== --- trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/UIHelper.java 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/java/org/codelutin/vcs/ui/util/UIHelper.java 2008-04-15 08:49:43 UTC (rev 524) @@ -16,18 +16,18 @@ import org.codelutin.vcs.VCSEntry; import org.codelutin.vcs.type.VCSAction; +import org.codelutin.vcs.type.VCSEntryLocation; import org.codelutin.vcs.type.VCSState; -import org.codelutin.vcs.type.VCSEntryLocation; import javax.swing.AbstractAction; import javax.swing.Action; +import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JRootPane; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; -import javax.swing.ImageIcon; import java.awt.Color; import java.awt.event.ActionEvent; import java.util.EnumMap; Modified: trunk/lutinvcs/ui/common/src/main/resources/i18n/common-en_GB.properties =================================================================== --- trunk/lutinvcs/ui/common/src/main/resources/i18n/common-en_GB.properties 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/resources/i18n/common-en_GB.properties 2008-04-15 08:49:43 UTC (rev 524) @@ -13,8 +13,11 @@ lutinvcs.action.nextfile.tip=select newt file lutinvcs.action.previousdiff.tip=goto previous diff lutinvcs.action.previousfile.tip=select previous file +lutinvcs.action.showconfig.libelle= +lutinvcs.action.showconfig.tip= lutinvcs.action.showmessages.tip=show previous commit messages lutinvcs.action.single.tip=Launch action ''{0}'' on selected file ''{1}'' +lutinvcs.config.find.public.key=Public ssh key (*.pub) associated with the required private key lutinvcs.file=File lutinvcs.module=Module lutinvcs.status=Status Modified: trunk/lutinvcs/ui/common/src/main/resources/i18n/common-fr_FR.properties =================================================================== --- trunk/lutinvcs/ui/common/src/main/resources/i18n/common-fr_FR.properties 2008-04-15 08:48:00 UTC (rev 523) +++ trunk/lutinvcs/ui/common/src/main/resources/i18n/common-fr_FR.properties 2008-04-15 08:49:43 UTC (rev 524) @@ -13,8 +13,11 @@ lutinvcs.action.nextfile.tip=S\u00E9lectionner le prochain fichier lutinvcs.action.previousdiff.tip=voir la diff\u00E9rence pr\u00E9c\u00E9dente lutinvcs.action.previousfile.tip=S\u00E9lectionner le pr\u00E9c\u00E9dent fichier +lutinvcs.action.showconfig.libelle=Modifier la configuration +lutinvcs.action.showconfig.tip=Modifier la configuration vcs lutinvcs.action.showmessages.tip=voir les messages de publication pr\u00E9c\u00E9dents lutinvcs.action.single.tip=ex\u00E9cuter l''action ''{0}'' sur le fichier s\u00E9l\u00E9ctionn\u00E9 ''{1}'' +lutinvcs.config.find.public.key=Clef publique ssh (*.pub) associ\u00E9e \u00E0 la clef priv\u00E9e lutinvcs.file=Fichier lutinvcs.module=Module lutinvcs.status=Status
participants (1)
-
tchemit@users.labs.libre-entreprise.org