r629 - trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing
Author: tchemit Date: 2008-02-04 14:47:45 +0000 (Mon, 04 Feb 2008) New Revision: 629 Added: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerUIRefreshHelper.java Log: introduction classe SimExplorerUIRefreshHelper pour traiter tous les rafraichissements d'ui ?\195?\160 partir de nos mod?\195?\168les Added: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerUIRefreshHelper.java =================================================================== --- trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerUIRefreshHelper.java (rev 0) +++ trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerUIRefreshHelper.java 2008-02-04 14:47:45 UTC (rev 629) @@ -0,0 +1,306 @@ +/* +* ##% Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Code Lutin, +* Tony Chemit, Gabriel Landais +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* ##% */ +package fr.cemagref.simexplorer.is.ui.swing; + +import fr.cemagref.simexplorer.is.entities.metadata.Version; +import fr.cemagref.simexplorer.is.ui.SimExplorer; +import fr.cemagref.simexplorer.is.ui.swing.action.ChangeI18nAbstractAction; +import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; +import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; +import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.PaginationModel; +import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeHelper; +import fr.cemagref.simexplorer.is.ui.swing.tab.JApplicationDetailTab; +import fr.cemagref.simexplorer.is.ui.swing.tab.JApplicationListTab; +import org.codelutin.i18n.CountryEnum; +import static org.codelutin.i18n.I18n._; +import org.codelutin.i18n.LanguageEnum; + +import javax.swing.AbstractButton; +import javax.swing.DefaultListModel; +import javax.swing.JComboBox; +import javax.swing.JList; +import javax.swing.JTabbedPane; +import javax.swing.JTree; +import javax.swing.SwingUtilities; +import java.util.regex.Matcher; + +/** + * Cette classe contient les méthodes utiles et réutilisables pour rafraichit + * les ui. + * <p/> + * Les méthodes utilisent les données stockées dans les modèles pour rafraichir + * les uis concernées. + * <p/> + * Note : <b>Dans toutes ces méthodes, NOS modèles ne doivent en aucun cas être modifiés</b> + * <p/> + * Par contre les modèles des ui peuvent être modifiés (par exemple modèle d'arbre, de liste) + * mais uniquement à partir de nos modèles. + * + * @author chemit + */ +public class SimExplorerUIRefreshHelper { + + /** + * Rafraichit un onglet de type liste à partir de son modèle. + * + * @param ui l'onglet de liste à utiliser + * @param model le modèle de liste à utiliser + */ + public static void refreshListTabUI(final JApplicationListTab ui, final ListTabModel model) { + + SwingUtilities.invokeLater(new Runnable() { + public void run() { + + // refresh search text + ui.getSearchText().setText(model.getQuery()); + + // refresh search actions + refreshSearchActions(ui, model); + + // refresh changePage combobox + refreshChangePageCombo(ui, model); + + // refresh changeSizor combo + refreshChangeSizorCombo(ui, model); + + // refresh pagination buttons + refreshPagination(ui, model.getPagination()); + + // table data model may have changed, must revalidate + ui.getTable().invalidate(); + + // parent must be repaint (will revalidate layout for table) + ui.repaint(); + } + }); + } + + /** + * Rafraichit l'onglet de détail à partir de notre modèle de détail. + * + * @param ui l'onglet de détail + * @param model le modele de détail + */ + public static void refreshDetailTabUI(final JApplicationDetailTab ui, final DetailTabModel model) { + + SwingUtilities.invokeLater(new Runnable() { + public void run() { + JTree tree = ui.getNavigationTree(); + + // tree data model may have changed, must revalidate + tree.invalidate(); + + JList historyList = ui.getHistoryList(); + + DefaultListModel historyModel = (DefaultListModel) historyList.getModel(); + + Version[] versions = model.getVersions(); + historyList.setSelectedIndex(-1); + if (versions == null) { + historyModel.setSize(0); + } else { + Version currentVersion = model.getSelectedNode().getMetaData().getVersion(); + historyModel.setSize(versions.length); + + for (int i = 0; i < versions.length; i++) { + Version version = versions[i]; + historyModel.setElementAt(version, i); + if (version.equals(currentVersion)) { + historyList.setSelectedIndex(i); + } + } + } + + // history list may have changed, must revalidate + historyList.invalidate(); + + // parent must be repaint (will revalidate layout for tree) + ui.repaint(); + } + }); + } + + /** + * Rafraichit les actions d'un node dans l'arbre de navigation + * + * @param ui l'onglet de détail + * @param model le model du détail + * @param node le node sélectionné dans l'arbre de navigation + */ + public static void refreshDetailActions(JApplicationDetailTab ui, DetailTabModel model, LoggableElementTreeNode node) { + // refresh download button + refreshDownloadAction(ui, model, node); + // refresh delete button + refreshDeleteAction(ui, model, node); + // refresh export button + refreshExportAction(ui, model, node); + } + + /** + * Rafraichit les actions i18n dans le menu en fonction de la locale + * actuellement utilisée. + * + * @param ui l'ui principale + */ + public static void refreshI18nActions(SimExplorerMainUI ui) { + LanguageEnum language = SimExplorer.getContext().getConfig().getLanguage(); + CountryEnum country = SimExplorer.getContext().getConfig().getCountry(); + String[] actions = SimExplorerActionManager.getFactory().getActionNames(); + for (String actionName : actions) { + Matcher matcher = ChangeI18nAbstractAction.PATTERN_NAME.matcher(actionName); + if (!matcher.matches()) { + continue; + } + AbstractButton button = (AbstractButton) ui.getObjectById(actionName); + ChangeI18nAbstractAction action = (ChangeI18nAbstractAction) button.getAction(); + boolean enable = !action.equalsLocale(language, country); + button.setEnabled(enable); + } + } + + /** + * Rafraichit les actions de recherche d'un onglet de type liste. + * + * @param ui l'onglet de liste à utiliser + * @param model le modèle de liste à utiliser + */ + public static void refreshSearchActions(JApplicationListTab ui, ListTabModel model) { + String text = ui.getSearchText().getText(); + ui.getSearchApplication().setEnabled(model.hasQuery() || !text.isEmpty()); + ui.getResetSearchApplication().setEnabled(model.hasQuery() || !text.isEmpty()); + } + + /** + * Rafraichit les uis après un changement de status de connexion de l'utilisateur. + * <p/> + * Si l'utilisateur est déconnecté, alors toutes les ui et actions liées au + * mode remote sont fermées et les actions correspondantes sont rendues + * inaccessibles. + * + * @param ui l'ui principale + * @param isConnected flag pour indique si l'utiliseur est connecté + */ + public static void refreshConnnectState(SimExplorerMainUI ui, final boolean isConnected) { + + //SwingUtilities.invokeLater(new Runnable() { + // public void run() { + ui.getConnect().setEnabled(!isConnected); + ui.getUnconnect().setEnabled(isConnected); + ui.getShowTab_remote().setEnabled(isConnected); + ui.getShowTab_synchronize().setEnabled(isConnected); + ui.getToggleTab_remote().setEnabled(isConnected); + ui.getToggleTab_synchronize().setEnabled(isConnected); + if (!isConnected) { + // close all connected ui + JTabbedPane container = ui.getContent(); + + if (SimExplorerTab.remote.isTabVisible(container)) { + // close tab + SimExplorerTab.remote.closeTab(container); + } + if (SimExplorerTab.synchronize.isTabVisible(container)) { + // close tab + SimExplorerTab.synchronize.closeTab(container); + } + if (SimExplorerTab.detail.isTabVisible(container)) { + DetailTabModel model = (DetailTabModel) SimExplorerTab.detail.getModel(); + if (model.isRemote()) { + // close tab + SimExplorerTab.detail.closeTab(container); + } + } + } + // } + //}); + } + + protected static void refreshExportAction(JApplicationDetailTab ui, DetailTabModel model, LoggableElementTreeNode node) { + boolean export = LoggableElementTreeHelper.canExport(node); + ui.getExportApplication().setEnabled(export); + if (export) { + ui.getExportApplication().setToolTipText(_("simexplorer.action.export2", node.getUserObject())); + } else { + ui.getExportApplication().setToolTipText(null); + } + } + + protected static void refreshDeleteAction(JApplicationDetailTab ui, DetailTabModel model, LoggableElementTreeNode node) { + boolean delete = LoggableElementTreeHelper.canDelete(node); + ui.getDelete().setEnabled(delete); + if (delete) { + ui.getDelete().setToolTipText(_("simexplorer.action.delete2", node.getUserObject())); + } else { + ui.getDelete().setToolTipText(null); + } + } + + protected static void refreshDownloadAction(JApplicationDetailTab ui, DetailTabModel model, LoggableElementTreeNode node) { + boolean download = LoggableElementTreeHelper.canDownload(node); + ui.getDownload().setEnabled(download); + if (download) { + ui.getDownload().setToolTipText(_("simexplorer.action.dowload2", node.getUserObject())); + } else { + ui.getDownload().setToolTipText(null); + } + } + + protected static void refreshPagination(JApplicationListTab ui, PaginationModel pagination) { + int page = pagination.getCurrentPage(); + boolean notLast = page + 1 < pagination.getNbPages(); + ui.getGoNextPage().setEnabled(notLast); + ui.getGoLastPage().setEnabled(notLast); + } + + protected static void refreshChangeSizorCombo(JApplicationListTab ui, ListTabModel model) { + JComboBox combo = ui.getChangeSizor(); + String s = model.getPagination().getWidth() + ""; + if (!s.equals(String.valueOf(combo.getSelectedItem()))) { + combo.setEnabled(false); + combo.setSelectedItem(s); + combo.setEnabled(true); + } + } + + protected static void refreshChangePageCombo(JApplicationListTab ui, ListTabModel model) { + JComboBox combo = ui.getGoPage(); + long size = model.getPagination().getNbPages(); + combo.setEnabled(false); + //System.out.println("page old size : " + combo.getItemCount() + " new size : " + size); + if (size < combo.getItemCount()) { + while (size < combo.getItemCount()) { + combo.removeItemAt(combo.getItemCount() - 1); + } + } else { + while (size > combo.getItemCount()) { + combo.addItem(combo.getItemCount()); + } + } + //System.out.println("new page size : " + combo.getItemCount()); + + combo.setSelectedIndex(model.getPagination().getCurrentPage()); + boolean b = combo.getItemCount() > 1; + combo.setEnabled(b); + ui.getCurrentPage().setEnabled(b); + } + + protected SimExplorerUIRefreshHelper() { + // do not instanciate me please + } +}
participants (1)
-
tchemit@users.labs.libre-entreprise.org