Author: tchemit Date: 2008-04-11 19:52:14 +0000 (Fri, 11 Apr 2008) New Revision: 456 Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/ConfirmUI.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/DiffUI.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/ConfirmUIHandler.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/DiffUIHandler.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/SynchUIHandler.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUI.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIHandler.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUI.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIHandler.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIModel.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractVCSEntriesTableModel.java trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/UIHelper.java trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/resources/i18n/lutinvcs-ui-jaxx-en_GB.properties trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/resources/i18n/lutinvcs-ui-jaxx-fr_FR.properties trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxConfirmUI.jaxx trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxDiffUI.jaxx trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxSynchUI.jaxx trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/common.css Log: add rowsorter supports in table + refactor ui code Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/ConfirmUI.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/ConfirmUI.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/ConfirmUI.java 2008-04-11 19:52:14 UTC (rev 456) @@ -18,7 +18,6 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; -import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JToolBar; @@ -37,10 +36,6 @@ public abstract JTextArea getCommitMessage(); - public abstract JScrollPane getContent(); - - public abstract JTable getContentTable(); - public abstract AbstractButton getLastMessages(); public abstract AbstractButton getAccept(); @@ -58,6 +53,6 @@ } protected void showLastMessages() { - //TODO + getHandler().showLastMessages(); } } Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/DiffUI.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/DiffUI.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/DiffUI.java 2008-04-11 19:52:14 UTC (rev 456) @@ -18,7 +18,6 @@ import org.codelutin.vcs.type.VCSAction; import javax.swing.AbstractButton; -import java.util.List; /** @author chemit */ public abstract class DiffUI extends org.codelutin.vcs.ui.util.AbstractTabUI<org.codelutin.vcs.ui.handler.DiffUIHandler> { @@ -27,12 +26,6 @@ public abstract AbstractButton getPreviousDiff(); - public void doSelectFile() { - List<VCSEntry> entries = getHandler().getModel().getEntriesModel().getDisplayedEntries(getHandler().getSelectionModel()); - VCSEntry vcsEntry = entries.isEmpty() ? null : entries.get(0); - getHandler().getModel().setFileModel(vcsEntry); - } - @Override public void setVisible(boolean b) { if (b) { @@ -41,12 +34,17 @@ button = getAllTab(); } button.doClick(); - if (getTable(getHandler().getModel().getEntriesModel().getLocation()).getRowCount() > 0) + if (getContentTable().getRowCount() > 0) getHandler().getSelectionModel().setSelectionInterval(0, 0); } super.setVisible(b); } + protected void doSelectFile() { + VCSEntry entry = getHandler().getSelectedEntry(); + getHandler().getModel().setFileModel(entry); + } + protected void doAction(VCSAction action) { getHandler().doAction(action, getHandler().getModel().getFileModel()); } Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/ConfirmUIHandler.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/ConfirmUIHandler.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/ConfirmUIHandler.java 2008-04-11 19:52:14 UTC (rev 456) @@ -16,11 +16,10 @@ import org.codelutin.vcs.VCSEntry; 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.AbstractVCSEntriesTableModel; -import org.codelutin.vcs.ui.util.UIHelper; -import org.codelutin.vcs.ui.model.ConfirmUIModel; -import org.codelutin.vcs.ui.ConfirmUI; import javax.swing.ListSelectionModel; import java.beans.PropertyChangeEvent; @@ -57,14 +56,6 @@ throw new IllegalStateException("unimplemented property changed : " + evt); } - @Override - public void init() { - super.init(); - getUi().getContentTable().setModel(getModel().getEntriesModel()); - // init table renderer - UIHelper.installVCSTableUI(getUi().getContentTable()); - } - protected void updateUI() { VCSAction action = getModel().getAction(); getUi().getAccept().setText(action.getLibelle()); @@ -98,8 +89,9 @@ // dispose ui getUi().dispose(); - } - + public void showLastMessages() { + log.info("//TODO: " + this); + } } Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/DiffUIHandler.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/DiffUIHandler.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/DiffUIHandler.java 2008-04-11 19:52:14 UTC (rev 456) @@ -16,16 +16,11 @@ import org.codelutin.vcs.VCSEntry; import org.codelutin.vcs.type.VCSAction; -import org.codelutin.vcs.type.VCSEntryLocation; -import org.codelutin.vcs.ui.VCSUIFactory; import org.codelutin.vcs.ui.DiffUI; import org.codelutin.vcs.ui.model.DiffUIModel; -import org.codelutin.vcs.ui.ConfirmUI; import org.codelutin.vcs.ui.util.AbstractTabUIHandler; import org.codelutin.vcs.ui.util.AbstractVCSEntriesTableModel; -import org.codelutin.vcs.ui.util.UIHelper; -import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; @@ -43,94 +38,71 @@ @Override public void propertyChange(PropertyChangeEvent evt) { - //if (log.isDebugEnabled()) { - log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); - //} - - String action = evt.getPropertyName(); - if (DiffUIModel.FILE_PROPERTY_CHANGED.equals(action)) { - doSelectFile((VCSEntry) evt.getNewValue()); + if (log.isDebugEnabled()) { + log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + } + if (DiffUIModel.FILE_PROPERTY_CHANGED.equals(evt.getPropertyName())) { + VCSEntry model = (VCSEntry) evt.getNewValue(); + boolean hasActions = false; + List<VCSAction> actions = null; + if (model != null) { + actions = model.getState().getActions(); + hasActions = !actions.isEmpty(); + } + DiffUI ui = getUi(); + updateAction(actions, hasActions, ui.getUpdate(), VCSAction.UPDATE); + updateAction(actions, hasActions, ui.getRevert(), VCSAction.REVERT); + updateAction(actions, hasActions, ui.getCommit(), VCSAction.COMMIT); + ui.getRefresh().setEnabled(hasActions); } else { super.propertyChange(evt); } } - @Override - public void doSelectLocation(VCSEntryLocation location) { - - super.doSelectLocation(location); - + public void doSelectLocation() { AbstractVCSEntriesTableModel fileStatesModel = getModel().getEntriesModel(); if (fileStatesModel.getRowCount() > 0) { getSelectionModel().addSelectionInterval(0, 0); - } else { - getSelectionModel().clearSelection(); } } - protected void initTab(VCSEntryLocation location) { - JTable table = getUi().getTable(location); - final AbstractVCSEntriesTableModel fileStatesModel = getModel().getEntriesModel(); - table.setModel(fileStatesModel); - table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + @Override + public void init() { + super.init(); + getUi().getContentTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { - getUi().doSelectFile(); + getModel().setFileModel(getSelectedEntry()); } } }); - // init table renderer - UIHelper.installVCSTableUI(table); } - public void doSelectFile(VCSEntry model) { - - boolean hasActions = false; - List<String> acts = new ArrayList<String>(); - - if (model != null) { - List<VCSAction> actions = model.getState().getActions(); - for (VCSAction action : actions) { - acts.add(action.name().toLowerCase()); - } - hasActions = !actions.isEmpty(); + public VCSEntry getSelectedEntry() { + ListSelectionModel selectionModel = getSelectionModel(); + if (selectionModel.isSelectionEmpty()) { + return null; } - getUi().getUpdate().setEnabled(hasActions && acts.contains("update")); - getUi().getCommit().setEnabled(hasActions && acts.contains("commit")); - getUi().getRevert().setEnabled(hasActions && acts.contains("revert")); - getUi().getRefresh().setEnabled(hasActions); + return getModel().getEntriesModel().getDisplayedEntry(selectionModel.getMinSelectionIndex()); } public void doAction(VCSAction action, VCSEntry file) { AbstractVCSEntriesTableModel model = getModel().getEntriesModel(); List<VCSEntry> entries = new ArrayList<VCSEntry>(1); entries.add(file); - log.info(action + " : " + model); - ListSelectionModel selectionModel = getSelectionModel(); + //log.info(action + " : " + model); if (action == VCSAction.REFRESH) { - selectionModel.clearSelection(); - // do refresh of all states - log.info("refresh :" + model.getRowCount()); - model.refresh(System.nanoTime(), entries); + doRefresh(model, entries, getSelectionModel()); } else { - - log.info("files to treate :" + entries.size()); - - ConfirmUI confirmUI = VCSUIFactory.newConfirmUI(); - - confirmUI.getHandler().getModel().init(action, model.getLocation(), entries.toArray(new VCSEntry[entries.size()])); - - confirmUI.setVisible(true); - //TODO SynchModel should listener for modification on ActionManagerQueue thread - log.info("TODO refresh states for files..."); + doConfirm(action, model, entries); } } public void gotoNextDiff() { - //TODO + log.info("//TODO :" + this); } public void gotoPreviousDiff() { - //TODO + log.info("//TODO :" + this); } } Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/SynchUIHandler.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/SynchUIHandler.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/handler/SynchUIHandler.java 2008-04-11 19:52:14 UTC (rev 456) @@ -2,21 +2,15 @@ import org.codelutin.vcs.VCSEntry; import org.codelutin.vcs.type.VCSAction; -import org.codelutin.vcs.type.VCSEntryLocation; -import org.codelutin.vcs.ui.VCSUIFactory; -import org.codelutin.vcs.ui.ConfirmUI; import org.codelutin.vcs.ui.SynchUI; import org.codelutin.vcs.ui.model.SynchUIModel; -import org.codelutin.vcs.ui.DiffUI; import org.codelutin.vcs.ui.util.AbstractTabUIHandler; import org.codelutin.vcs.ui.util.AbstractVCSEntriesTableModel; -import org.codelutin.vcs.ui.util.UIHelper; -import javax.swing.JTable; import javax.swing.ListSelectionModel; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @author chemit */ @@ -28,131 +22,83 @@ } @Override - public void doSelectLocation(VCSEntryLocation location) { + public void init() { + super.init(); + getUi().getContentTable().addMouseListener(new ListMouseListener()); + } - super.doSelectLocation(location); + protected void doSelectLocation() { - VCSAction[] actions = getModel().getEntriesModel().getActions((ListSelectionModel) null); - List<String> acts = new ArrayList<String>(); - for (VCSAction action : actions) { - acts.add(action.name().toLowerCase()); - } - boolean hasActions = actions.length > 0; - getUi().getDiffAll().setEnabled(hasActions && acts.contains("diff")); - getUi().getUpdateAll().setEnabled(hasActions && acts.contains("update")); - getUi().getCommitAll().setEnabled(hasActions && acts.contains("commit")); - getUi().getRevertAll().setEnabled(hasActions && acts.contains("revert")); - getUi().getAddAll().setEnabled(hasActions && acts.contains("add")); - getUi().getDeleteAll().setEnabled(hasActions && acts.contains("delete")); - getUi().getRefreshAll().setEnabled(hasActions); + List<VCSAction> actions = Arrays.asList(getModel().getEntriesModel().getActions((ListSelectionModel) null)); + + boolean hasActions = !actions.isEmpty(); + SynchUI ui = getUi(); + updateAction(actions, hasActions, ui.getDiffAll(), VCSAction.DIFF); + updateAction(actions, hasActions, ui.getUpdateAll(), VCSAction.UPDATE); + updateAction(actions, hasActions, ui.getRevertAll(), VCSAction.REVERT); + updateAction(actions, hasActions, ui.getCommitAll(), VCSAction.COMMIT); + updateAction(actions, hasActions, ui.getAddAll(), VCSAction.ADD); + updateAction(actions, hasActions, ui.getDeleteAll(), VCSAction.DELETE); + ui.getRefreshAll().setEnabled(hasActions); } public void doAction(VCSAction action, boolean useSelection) { AbstractVCSEntriesTableModel model = getModel().getEntriesModel(); log.info(action + " : " + model); ListSelectionModel selectionModel = getSelectionModel(); + List<VCSEntry> entries = model.filter(action, model.getDisplayedEntries(useSelection ? selectionModel : null)); + if (action == VCSAction.REFRESH) { - selectionModel.clearSelection(); - // do refresh of all states - log.info("refresh :" + model.getRowCount()); - model.refresh(System.nanoTime(), model.getEntries()); - } else { - List<VCSEntry> entries = model.filter(action, model.getDisplayedEntries(useSelection ? selectionModel : null)); - if (entries.isEmpty()) { - // nothing to do - return; - } - if (action == VCSAction.DIFF) { - // show diff ui - DiffUI diffUI = VCSUIFactory.newDiffUI(); - List<VCSEntry> vcsEntryList; - if (useSelection) { - vcsEntryList = entries; - } else { - // take all entries - vcsEntryList = model.filter(action, model.getEntries()); - } - diffUI.getHandler().getModel().init(model.getLocation(), vcsEntryList.toArray(new VCSEntry[vcsEntryList.size()])); - diffUI.setVisible(true); - return; - } - log.info("files to treate :" + entries.size()); + doRefresh(model, model.getEntries(), selectionModel); + return; + } - ConfirmUI confirmUI = VCSUIFactory.newConfirmUI(); - - confirmUI.getHandler().getModel().init(action, model.getLocation(), entries.toArray(new VCSEntry[entries.size()])); - - confirmUI.setVisible(true); - //TODO SynchModel should listener for modification on ActionManagerQueue thread - log.info("TODO refresh states for files..."); + if (entries.isEmpty()) { + // nothing to do + return; } - } + if (action == VCSAction.DIFF) { + // show diff ui + doDiff(useSelection, model, entries); + return; + } - protected void initTab(VCSEntryLocation location) { - JTable table = getUi().getTable(location); - AbstractVCSEntriesTableModel fileStatesModel = getModel().getEntriesModel(); - table.setModel(fileStatesModel); - table.addMouseListener(new ListMouseListener(getUi(), fileStatesModel, location)); - // init table renderer - UIHelper.installVCSTableUI(table); + doConfirm(action, model, entries); } + protected class ListMouseListener extends MouseAdapter { - private final AbstractVCSEntriesTableModel model; - - private final ListSelectionModel selectionModel; - - private final JTable jTable; - - - public ListMouseListener(SynchUI ui, AbstractVCSEntriesTableModel model, VCSEntryLocation modelName) { - this.model = model; - jTable = ui.getTable(modelName); - selectionModel = jTable.getSelectionModel(); - } - @Override public void mousePressed(MouseEvent e) { super.mousePressed(e); - if (e.isPopupTrigger()) { - initPopup(e.getX(), e.getY()); + if (e.isPopupTrigger() && !getSelectionModel().isSelectionEmpty()) { + initPopup(e.getX(), e.getY(), getSelectionModel()); } } @Override public void mouseReleased(MouseEvent e) { super.mouseReleased(e); - if (e.isPopupTrigger()) { - initPopup(e.getX(), e.getY()); + if (e.isPopupTrigger() && !getSelectionModel().isSelectionEmpty()) { + initPopup(e.getX(), e.getY(), getSelectionModel()); } } - @Override - public void mouseClicked(MouseEvent e) { - // nothing to do - } + protected void initPopup(int x, int y, ListSelectionModel selectionModel) { - protected void initPopup(int x, int y) { - if (!selectionModel.isSelectionEmpty()) { - List<String> acts = new ArrayList<String>(); - for (VCSAction action : model.getActions(selectionModel)) { - acts.add(action.name().toLowerCase()); - } - boolean hasActions = !acts.isEmpty(); - - getUi().getPopup().setInvoker(jTable); - getUi().getDiff().setEnabled(hasActions && acts.contains("diff")); - getUi().getUpdate().setEnabled(hasActions && acts.contains("update")); - getUi().getCommit().setEnabled(hasActions && acts.contains("commit")); - getUi().getAdd().setEnabled(hasActions && acts.contains("add")); - getUi().getDelete().setEnabled(hasActions && acts.contains("delete")); - getUi().getRevert().setEnabled(hasActions && acts.contains("revert")); - getUi().getRefresh().setEnabled(hasActions); - getUi().getPopup().pack(); - // display popup - getUi().getPopup().show(jTable, x, y); - } + List<VCSAction> actions = Arrays.asList(getModel().getEntriesModel().getActions(selectionModel)); + boolean hasActions = !actions.isEmpty(); + SynchUI ui = getUi(); + updateAction(actions, hasActions, ui.getDiff(), VCSAction.DIFF); + updateAction(actions, hasActions, ui.getUpdate(), VCSAction.UPDATE); + updateAction(actions, hasActions, ui.getRevert(), VCSAction.REVERT); + updateAction(actions, hasActions, ui.getCommit(), VCSAction.COMMIT); + updateAction(actions, hasActions, ui.getAdd(), VCSAction.ADD); + updateAction(actions, hasActions, ui.getDelete(), VCSAction.DELETE); + ui.getRefresh().setEnabled(hasActions); + // display popup + ui.getPopup().show(ui.getContentTable(), x, y); } } } Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUI.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUI.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUI.java 2008-04-11 19:52:14 UTC (rev 456) @@ -17,13 +17,11 @@ import org.codelutin.vcs.type.VCSEntryLocation; import javax.swing.AbstractButton; -import javax.swing.JPanel; +import javax.swing.ButtonGroup; +import javax.swing.ImageIcon; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JToggleButton; -import javax.swing.ButtonGroup; -import javax.swing.ImageIcon; -import java.awt.CardLayout; /** @author chemit */ public abstract class AbstractTabUI<H extends AbstractTabUIHandler<?, ?>> extends AbstractUI<H> { @@ -36,20 +34,6 @@ public abstract JToggleButton getRemoteTab(); - public abstract JScrollPane getAllContent(); - - public abstract JScrollPane getLocalContent(); - - public abstract JScrollPane getRemoteContent(); - - public abstract JTable getAllTable(); - - public abstract JTable getLocalTable(); - - public abstract JTable getRemoteTable(); - - public abstract JPanel getPreview(); - public abstract AbstractButton getRefresh(); public abstract AbstractButton getUpdate(); @@ -60,22 +44,7 @@ public abstract AbstractButton getHelp(); - public abstract CardLayout getCardLayout(); - public JTable getTable(VCSEntryLocation modelName) { - switch (modelName) { - case ALL: - return getAllTable(); - case LOCAL: - return getLocalTable(); - case REMOTE: - return getRemoteTable(); - case UNKNOW: - break; - } - throw new IllegalStateException("no table found for " + modelName); - } - public AbstractButton getButton(VCSEntryLocation modelName) { switch (modelName) { case ALL: Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIHandler.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIHandler.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractTabUIHandler.java 2008-04-11 19:52:14 UTC (rev 456) @@ -14,10 +14,17 @@ */ package org.codelutin.vcs.ui.util; -import org.codelutin.vcs.type.VCSEntryLocation; +import org.codelutin.vcs.VCSEntry; +import org.codelutin.vcs.type.VCSAction; +import org.codelutin.vcs.ui.ConfirmUI; +import org.codelutin.vcs.ui.DiffUI; +import org.codelutin.vcs.ui.VCSUIFactory; +import javax.swing.AbstractButton; +import javax.swing.JTable; import javax.swing.ListSelectionModel; import java.beans.PropertyChangeEvent; +import java.util.List; /** @author chemit */ public abstract class AbstractTabUIHandler<M extends AbstractTabUIModel, U extends AbstractTabUI<? extends AbstractTabUIHandler>> extends AbstractUIHandler<M, U> { @@ -26,35 +33,54 @@ super(ui, model); } - protected abstract void initTab(VCSEntryLocation location); - - @Override + /*@Override public void init() { super.init(); - getUi().getHelp().setEnabled(true); - initTab(VCSEntryLocation.ALL); - initTab(VCSEntryLocation.LOCAL); - initTab(VCSEntryLocation.REMOTE); - } + }*/ public ListSelectionModel getSelectionModel() { - return getUi().getTable(getLocation()).getSelectionModel(); + return getUi().getContentTable().getSelectionModel(); } public void propertyChange(PropertyChangeEvent evt) { - //if (log.isDebugEnabled()) { - log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); - //} + if (log.isDebugEnabled()) { + log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + } String action = evt.getPropertyName(); - if (AbstractTabUIModel.LOCATION_PROPERTY_CHANGED.equals(action)) { - doSelectLocation((VCSEntryLocation) evt.getNewValue()); + doSelectLocation(); } } - public void doSelectLocation(VCSEntryLocation location) { - log.info(location); - getUi().getCardLayout().show(getUi().getPreview(), "tab" + location.name().toLowerCase()); + protected abstract void doSelectLocation(); + + protected void updateAction(List<VCSAction> actions, boolean hasActions, AbstractButton ui, VCSAction diff) { + ui.setEnabled(hasActions && actions.contains(diff)); } + protected void doConfirm(VCSAction action, AbstractVCSEntriesTableModel model, List<VCSEntry> entries) { + ConfirmUI confirmUI = VCSUIFactory.newConfirmUI(); + log.info("nb files:" + entries.size()); + confirmUI.getHandler().getModel().init(action, model.getLocation(), entries.toArray(new VCSEntry[entries.size()])); + confirmUI.setVisible(true); + } + + protected void doDiff(boolean useSelection, AbstractVCSEntriesTableModel model, List<VCSEntry> entries) { + DiffUI diffUI = VCSUIFactory.newDiffUI(); + if (!useSelection) { + // take all entries + entries = model.filter(VCSAction.DIFF, model.getEntries()); + } + log.info("nb entries:" + entries.size()); + diffUI.getHandler().getModel().init(model.getLocation(), entries.toArray(new VCSEntry[entries.size()])); + diffUI.setVisible(true); + } + + protected void doRefresh(AbstractVCSEntriesTableModel model, List<VCSEntry> entries, ListSelectionModel selectionModel) { + log.info(selectionModel); + selectionModel.clearSelection(); + // do refresh of all states + model.refresh(System.nanoTime(), entries); + } + } \ No newline at end of file Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUI.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUI.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUI.java 2008-04-11 19:52:14 UTC (rev 456) @@ -15,10 +15,16 @@ package org.codelutin.vcs.ui.util; import javax.swing.ImageIcon; +import javax.swing.JScrollPane; +import javax.swing.JTable; /** @author chemit */ -public class AbstractUI<H extends AbstractUIHandler> extends javax.swing.JDialog { +public abstract class AbstractUI<H extends AbstractUIHandler> extends javax.swing.JDialog { + public abstract JScrollPane getContentScroll(); + + public abstract JTable getContentTable(); + private H handler; protected AbstractUI() { Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIHandler.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIHandler.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIHandler.java 2008-04-11 19:52:14 UTC (rev 456) @@ -20,6 +20,7 @@ import org.codelutin.vcs.runner.VCSActionManager; import org.codelutin.vcs.type.VCSEntryLocation; +import javax.swing.JTable; import javax.swing.ListSelectionModel; import java.beans.PropertyChangeListener; @@ -28,7 +29,10 @@ protected static Log log = LogFactory.getLog(AbstractUIHandler.class); + /** ui handled */ private U ui; + + /** model handled */ private M model; protected AbstractUIHandler(U ui, M model) { @@ -51,6 +55,10 @@ throw new IllegalStateException("no model was defined for " + this); } model.addPropertyChangeListener(this); + JTable table = getUi().getContentTable(); + table.setModel(getModel().getEntriesModel()); + // init table renderer + UIHelper.installVCSTableUI(table); } public VCSEntryLocation getLocation() { Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIModel.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIModel.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractUIModel.java 2008-04-11 19:52:14 UTC (rev 456) @@ -26,13 +26,17 @@ import java.beans.PropertyChangeSupport; import java.util.List; -/** @author chemit */ +/** + * Abstract ui model, with property change support. + * <p/> + * Encapsulate an {@link AbstractVCSEntriesTableModel}. + * + * @author chemit + */ public abstract class AbstractUIModel { - /** to use log facility, just put in your code: log.info(\"...\"); */ static protected final Log log = LogFactory.getLog(AbstractUIModel.class); - /** support for change properties support */ protected PropertyChangeSupport changeSupport; Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractVCSEntriesTableModel.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractVCSEntriesTableModel.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/AbstractVCSEntriesTableModel.java 2008-04-11 19:52:14 UTC (rev 456) @@ -30,7 +30,10 @@ import org.codelutin.vcs.util.VCSEntriesImpl; import javax.swing.ListSelectionModel; +import javax.swing.table.TableModel; +import javax.swing.table.TableRowSorter; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -53,14 +56,19 @@ /** displayed entries */ protected final transient List<VCSEntry> displayedEntries; + /** row sorter */ + protected transient TableRowSorter<TableModel> rowSorter; + private static final long serialVersionUID = 4697917831388337369L; + protected AbstractVCSEntriesTableModel(String name, String[] columnNames) { super(); this.name = name; this.columnNames = columnNames; this.displayedEntries = new ArrayList<VCSEntry>(); this.delegate = new VCSEntriesImpl(); + this.rowSorter = new TableRowSorter<TableModel>(this); } public String getName() { @@ -71,6 +79,10 @@ return location; } + public TableRowSorter<TableModel> getRowSorter() { + return rowSorter; + } + public List<VCSEntry> getDisplayedEntries(ListSelectionModel selectionModel) { return selectionModel == null ? new ArrayList<VCSEntry>(displayedEntries) : filter(selectionModel, displayedEntries); } @@ -115,6 +127,19 @@ return super.toString() + "<name:" + name + ", size:" + (getRowCount()) + '>'; } + public List<VCSEntry> filter(ListSelectionModel selectionModel, List<VCSEntry> entries) { + if (entries.isEmpty() || selectionModel.isSelectionEmpty()) { + return Collections.emptyList(); + } + List<VCSEntry> list = new ArrayList<VCSEntry>(); + for (int i = 0, max = entries.size(); i < max; i++) { + if (selectionModel.isSelectedIndex(i)) { + list.add(entries.get(rowSorter.convertRowIndexToModel(i))); + } + } + return list; + } + //===================================================================================================// // === delegate methods =============================================================================// //===================================================================================================// @@ -139,10 +164,6 @@ return delegate.filter(state, entries); } - public List<VCSEntry> filter(ListSelectionModel selectionModel, List<VCSEntry> entries) { - return delegate.filter(selectionModel, entries); - } - public void populate(VCSConnexion connexion, long timestamp) throws VCSException { delegate.populate(connexion, timestamp); updateEntries(); @@ -194,6 +215,6 @@ if (row < -1 || row > displayedEntries.size() - 1) { throw new IllegalArgumentException("index " + row + " is out of bound [0," + (displayedEntries.size() - 1) + "]"); } - return displayedEntries.get(row); + return displayedEntries.get(rowSorter.convertRowIndexToModel(row)); } } \ No newline at end of file Modified: trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/UIHelper.java =================================================================== --- trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/UIHelper.java 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-common/src/main/java/org/codelutin/vcs/ui/util/UIHelper.java 2008-04-11 19:52:14 UTC (rev 456) @@ -31,6 +31,11 @@ */ public class UIHelper { + /** + * Attach to <code>ui</code> an abort action,accessible by <code>ESC</code> key. + * + * @param ui ui + */ public static void setQuitAction(final JDialog ui) { JRootPane rootPane = ui.getRootPane(); @@ -45,7 +50,13 @@ rootPane.getActionMap().put("quit", quitAction); } + /** + * Prepare an table of VCSEntries. + * + * @param table table + */ public static void installVCSTableUI(JTable table) { + // attach renderer properties table.putClientProperty("vcs.color.MODIFIED", new Color(0, 50, 160)); table.putClientProperty("vcs.color.OUT_OF_DATE_AND_MODIFIED", Color.RED); table.putClientProperty("vcs.color.OUT_OF_DATE", new Color(10, 119, 0)); @@ -55,8 +66,10 @@ table.putClientProperty("vcs.color.IGNORED", new Color(114, 114, 56)); table.putClientProperty("vcs.color.REMOVED", new Color(97, 97, 97)); table.putClientProperty("vcs.color.MISSING", new Color(119, 56, 149)); - + // attach renderer to table table.setDefaultRenderer(Object.class, VCSEntriesTableRenderer.get()); + // attach row sorter to table + table.setRowSorter(((AbstractVCSEntriesTableModel) table.getModel()).getRowSorter()); } } Modified: trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/resources/i18n/lutinvcs-ui-jaxx-en_GB.properties =================================================================== --- trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/resources/i18n/lutinvcs-ui-jaxx-en_GB.properties 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/resources/i18n/lutinvcs-ui-jaxx-en_GB.properties 2008-04-11 19:52:14 UTC (rev 456) @@ -1,4 +1,3 @@ -lutinvcs.accept=Accept lutinvcs.action.add=Add lutinvcs.action.commit=commit lutinvcs.action.delete=delete Modified: trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/resources/i18n/lutinvcs-ui-jaxx-fr_FR.properties =================================================================== --- trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/resources/i18n/lutinvcs-ui-jaxx-fr_FR.properties 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/resources/i18n/lutinvcs-ui-jaxx-fr_FR.properties 2008-04-11 19:52:14 UTC (rev 456) @@ -1,4 +1,3 @@ -lutinvcs.accept=Accepter lutinvcs.action.add=Ajouter lutinvcs.action.commit=committer lutinvcs.action.delete=supprimer Modified: trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxConfirmUI.jaxx =================================================================== --- trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxConfirmUI.jaxx 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxConfirmUI.jaxx 2008-04-11 19:52:14 UTC (rev 456) @@ -19,8 +19,8 @@ <cell fill='both'/> </row> </Table> - <JButton id='lastMessages' onActionPerformed='showLastMessages()'/> <JSeparator orientation="vertical"/> + <JButton id='lastMessages' onActionPerformed='showLastMessages()'/> <JButton id='help' onActionPerformed='doHelp()'/> </JToolBar> </cell> @@ -38,7 +38,7 @@ </row> <row> <cell fill='both' weightx='1' weighty='1'> - <JScrollPane id='content' styleClass='confirmScroll'> + <JScrollPane id='contentScroll' styleClass='confirmScroll'> <JTable id="contentTable" styleClass='confirmTable'/> </JScrollPane> </cell> @@ -46,7 +46,6 @@ <row> <cell fill='both'> <JButton id='accept' onActionPerformed='doAccept()'/> - <!--JButton id='accept' text='lutinvcs.accept' onActionPerformed='doAccept()'/--> </cell> </row> </Table> Modified: trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxDiffUI.jaxx =================================================================== --- trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxDiffUI.jaxx 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxDiffUI.jaxx 2008-04-11 19:52:14 UTC (rev 456) @@ -4,8 +4,6 @@ import static org.codelutin.vcs.type.VCSAction.*; import static org.codelutin.vcs.type.VCSEntryLocation.*; </script> - <java.awt.CardLayout id='cardLayout'/> - <Table> <row fill='both'> <cell fill='both' weightx='1'> @@ -33,17 +31,9 @@ </row> <row fill='both'> <cell fill='both'> - <JPanel id='preview' layout='{cardLayout}'> - <JScrollPane id='allContent' styleClass='diffScroll' constraints='"taball"' height='100'> - <JTable id="allTable" styleClass='diffTable' onMouseClicked="doSelectFile()"/> - </JScrollPane> - <JScrollPane id='localContent' styleClass='diffScroll' constraints='"tablocal"' height='100'> - <JTable id="localTable" styleClass='diffTable' onMouseClicked="doSelectFile()"/> - </JScrollPane> - <JScrollPane id='remoteContent' styleClass='diffScroll' constraints='"tabremote"' height='100'> - <JTable id="remoteTable" styleClass='diffTable' onMouseClicked="doSelectFile()"/> - </JScrollPane> - </JPanel> + <JScrollPane id='contentScroll' styleClass='diffScroll' height='100'> + <JTable id="contentTable" styleClass='diffTable' onMouseClicked="doSelectFile()"/> + </JScrollPane> </cell> </row> <row fill='both'> Modified: trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxSynchUI.jaxx =================================================================== --- trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxSynchUI.jaxx 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/JaxxSynchUI.jaxx 2008-04-11 19:52:14 UTC (rev 456) @@ -4,8 +4,7 @@ import static org.codelutin.vcs.type.VCSAction.*; import static org.codelutin.vcs.type.VCSEntryLocation.*; </script> - <java.awt.CardLayout id='cardLayout'/> - <JPopupMenu id="popup"> + <JPopupMenu id="popup" invoker='{contentTable}'> <JMenuItem id='refresh' text='lutinvcs.action.refresh' onActionPerformed='doAction(REFRESH,true)'/> <JMenuItem id='diff' text='lutinvcs.action.diff' onActionPerformed='doAction(DIFF,true)'/> <JSeparator/> @@ -47,17 +46,9 @@ </row> <row fill='both'> <cell fill='both' weighty='1' weightx='2'> - <JPanel id='preview' layout='{cardLayout}'> - <JScrollPane id='allContent' styleClass='updateScroll' constraints='"taball"'> - <JTable id="allTable" styleClass='updateTable'/> - </JScrollPane> - <JScrollPane id='localContent' styleClass='updateScroll' constraints='"tablocal"'> - <JTable id="localTable" styleClass='updateTable'/> - </JScrollPane> - <JScrollPane id='remoteContent' styleClass='updateScroll' constraints='"tabremote"'> - <JTable id="remoteTable" styleClass='updateTable'/> - </JScrollPane> - </JPanel> + <JScrollPane id='contentScroll' styleClass='updateScroll'> + <JTable id="contentTable" styleClass='updateTable'/> + </JScrollPane> </cell> </row> </Table> Modified: trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/common.css =================================================================== --- trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/common.css 2008-04-11 19:47:08 UTC (rev 455) +++ trunk/lutinvcs/lutinvcs-ui-jaxx/src/main/uimodel/org/codelutin/vcs/ui/common.css 2008-04-11 19:52:14 UTC (rev 456) @@ -47,7 +47,6 @@ .updateScroll { verticalScrollBarPolicy: 20; horizontalScrollBarPolicy: 31; - visible: false; } .diffScroll { @@ -252,5 +251,7 @@ #lastMessages { toolTipText: "lutinvcs.action.tooltip.lastMessages"; icon: { createImageIcon( "recent_msgs.png" ) -}; +} + +; } \ No newline at end of file