package net.codjo.dataprocess.gui.selector; import net.codjo.dataprocess.client.RepositoryClientHelper; import net.codjo.dataprocess.common.exception.RepositoryException; import net.codjo.dataprocess.common.userparam.User; import net.codjo.dataprocess.common.userparam.User.Repository; import net.codjo.dataprocess.gui.util.DataProcessGuiEvent; import net.codjo.dataprocess.gui.util.GuiContextUtils; import net.codjo.dataprocess.gui.util.GuiUtils; import net.codjo.mad.client.request.RequestException; import net.codjo.mad.client.request.Result; import net.codjo.mad.client.request.Row; import net.codjo.mad.gui.framework.MutableGuiContext; import net.codjo.mad.gui.request.ListDataSource; import net.codjo.mad.gui.request.RequestComboBox; import net.codjo.mad.gui.request.event.DataSourceAdapter; import net.codjo.mad.gui.request.event.DataSourceEvent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Map; import java.util.Observable; import java.util.Observer; /** * */ public class RepositoryComboBox extends RequestComboBox implements Observer { private int oldSelectedRepositoryId; private MutableGuiContext ctxt; private ActionListener repositoryUpdateEventListener = new RepositoryUpdateEventListener(false); private Map<String, String> translateMap = new HashMap<String, String>(); private boolean isLoading = false; public void setOldSelectedRepository(int value) { oldSelectedRepositoryId = value; } public RepositoryComboBox(MutableGuiContext ctxt) { this.ctxt = ctxt; ListDataSource repositoryDataSource = new ListDataSource(); repositoryDataSource.setColumns(new String[]{"repositoryId", "repositoryName"}); repositoryDataSource.setLoadFactoryId("selectAllRepository"); setDataSource(repositoryDataSource); initRequestComboBox("repositoryId", "repositoryName", false); addActionListener(repositoryUpdateEventListener); getDataSource().addDataSourceListener(new DataSourceAdapter() { @Override public void loadEvent(DataSourceEvent event) { translateMap.clear(); } }); } public void updateGuiOnRepositoryChange(boolean active) { ((RepositoryUpdateEventListener)repositoryUpdateEventListener).setActive(active); } public int getSelectedRepositoryId() { if (getSelectedItem() != null) { return Integer.parseInt((String)getSelectedItem()); } return 0; } public boolean isLoading() { return isLoading; } public void loadData() { isLoading = true; try { load(); if (getItemCount() != 0) { setSelectedIndex(0); } } catch (RequestException ex) { throw new IllegalStateException("Impossible de charger la liste des r�f�rentiels de traitement", ex); } finally { isLoading = false; } } public void loadAuthorisedRepository(User user) throws RequestException { load(); Result newResult = new Result(); Result loadResult = getDataSource().getLoadResult(); if (loadResult.getRows() != null) { for (Object row : loadResult.getRows()) { Repository repository = user.getRepository(((Row)row).getFieldValue("repositoryName")); if (repository != null && repository.isValid()) { newResult.addRow((Row)row); } } getDataSource().setLoadResult(newResult); } } public String translateValue(String id) { String idColumn = getDataSource().getColumns()[0]; String nameColumn = getDataSource().getColumns()[1]; if (translateMap.isEmpty()) { Result rs = getDataSource().getLoadResult(); for (int i = 0; i < rs.getRowCount(); i++) { translateMap.put(rs.getValue(i, idColumn), rs.getValue(i, nameColumn)); } } return translateMap.get(id); } public void setSelectedRepository(String repositoryName) throws RepositoryException, RequestException { boolean isActived = ((RepositoryUpdateEventListener)repositoryUpdateEventListener).isActived(); ((RepositoryUpdateEventListener)repositoryUpdateEventListener).setActive(false); if (repositoryName != null) { String repositoryId = Integer .toString(RepositoryClientHelper.getRepositoryIdFromName(ctxt, repositoryName)); setSelectedItem(repositoryId); GuiContextUtils.setCurrentRepository(ctxt, repositoryId); } else { GuiContextUtils.setCurrentRepository(ctxt, null); } if (isActived) { ((RepositoryUpdateEventListener)repositoryUpdateEventListener).setActive(true); } } public void update(Observable ob, Object arg) { if (arg instanceof DataProcessGuiEvent) { DataProcessGuiEvent event = (DataProcessGuiEvent)arg; String eventName = event.getName(); if (DataProcessGuiEvent.UPDATE_USER_EVENT.equals(eventName)) { User user = (User)event.getValue(); try { loadAuthorisedRepository(user); GuiUtils.showRepositoryMessage(ctxt, user); setSelectedRepository(user.getCurrentRepository()); } catch (Exception ex) { GuiUtils.showErrorDialog(ctxt.getMainFrame(), getClass(), "Erreur interne", ex); } } } } private class RepositoryUpdateEventListener implements ActionListener { private boolean actived; public boolean isActived() { return actived; } public void setActive(boolean actived) { this.actived = actived; } private RepositoryUpdateEventListener(boolean actived) { this.actived = actived; } public void actionPerformed(ActionEvent evt) { if (actived) { ctxt.sendEvent(new DataProcessGuiEvent(DataProcessGuiEvent.PRE_CHANGE_REPOSITORY_EVENT, oldSelectedRepositoryId)); int selectedRepositoryId = getSelectedRepositoryId(); GuiContextUtils.setCurrentRepository(ctxt, Integer.toString(selectedRepositoryId)); ctxt.sendEvent(new DataProcessGuiEvent(DataProcessGuiEvent.POST_CHANGE_REPOSITORY_EVENT, selectedRepositoryId)); oldSelectedRepositoryId = selectedRepositoryId; } } } }