package net.codjo.dataprocess.gui.activation;
import net.codjo.dataprocess.client.RepositoryClientHelper;
import net.codjo.dataprocess.common.Log;
import net.codjo.dataprocess.common.userparam.User;
import net.codjo.dataprocess.gui.activation.impl.JMenuIterator;
import net.codjo.dataprocess.gui.activation.repository.CRule;
import net.codjo.dataprocess.gui.activation.spi.RulesProcessor;
import net.codjo.dataprocess.gui.util.DataProcessGuiEvent;
import net.codjo.mad.client.request.RequestException;
import net.codjo.mad.gui.framework.MutableGuiContext;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
/**
*
*/
public class RepositoryMenuManager implements Observer {
private RulesProcessor activator;
private Map<String, Object> context;
private MutableGuiContext ctxt;
private JFrame frame;
private final User user;
public RepositoryMenuManager(MutableGuiContext ctxt, JFrame frame, User user) {
this.frame = frame;
this.ctxt = ctxt;
this.user = user;
}
private void init() {
JMenuBar menuBar = frame.getJMenuBar();
frame = null;
context = new HashMap<String, Object>();
context.put(CRule.SELECTED_REPOSITORTY_KEY, user.getCurrentRepository());
List<String> repoList = new ArrayList<String>();
Collection<String> allRepositoryNames = null;
try {
allRepositoryNames = RepositoryClientHelper.getAllRepositoryNames(ctxt).values();
}
catch (RequestException ex) {
Log.error(getClass(), "Erreur interne :\n" + ex.getLocalizedMessage());
}
repoList.addAll(allRepositoryNames);
context.put(CRule.REPOSITORTY_LIST_KEY, repoList);
activator = new RulesProcessor(new JMenuIterator(menuBar), context);
activator.addRule(new CRule());
}
public void update(Observable ob, Object arg) {
if (frame != null) {
init();
}
if (arg instanceof DataProcessGuiEvent) {
DataProcessGuiEvent event = (DataProcessGuiEvent)arg;
String eventName = event.getName();
if (DataProcessGuiEvent.POST_CHANGE_REPOSITORY_EVENT.equals(eventName)) {
String repoName = null;
try {
repoName = RepositoryClientHelper.getAllRepositoryNames(ctxt)
.get(event.getValue().toString());
}
catch (RequestException ex) {
Log.error(getClass(), "Erreur interne :\n" + ex.getLocalizedMessage());
}
selectCurrentRepoAndManageMenu(repoName);
}
}
}
public void selectCurrentRepoAndManageMenu(String repoName) {
if (frame != null) {
init();
}
if (repoName != null) {
context.put(CRule.SELECTED_REPOSITORTY_KEY, repoName);
}
else {
context.put(CRule.SELECTED_REPOSITORTY_KEY, "");
}
if (activator != null) {
activator.proceed();
}
}
public static void configureRepositoryMenuManager(MutableGuiContext ctxt, final User user) {
final JFrame mainFrame = ctxt.getMainFrame();
final RepositoryMenuManager repositoryMenuManager = new RepositoryMenuManager(ctxt, mainFrame, user);
ctxt.addObserver(repositoryMenuManager);
new Thread() {
@Override
public void run() {
while (mainFrame.getJMenuBar() == null) {
try {
Thread.sleep(20);
}
catch (InterruptedException ex) {
Log.error(getClass(), "Erreur interne :\n" + ex.getLocalizedMessage());
}
}
repositoryMenuManager.selectCurrentRepoAndManageMenu(user.getCurrentRepository());
}
}.start();
}
}