--- /dev/null
+package com.pentila.evalcomp.client.examen;
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+import com.pentila.evalcomp.client.ConnexionServer;
+import com.pentila.evalcomp.client.i18n.Messages;
+import com.pentila.evalcomp.client.palette.ExamenPalettePanel;
+import com.pentila.evalcomp.client.utilities.ITabManager;
+import com.pentila.evalcomp.client.utilities.Tools;
+import com.pentila.evalcomp.client.utilities.UserTools;
+import com.pentila.evalcomp.domain.definition.Competence;
+import com.pentila.evalcomp.domain.definition.Domain;
+import com.pentila.evalcomp.domain.definition.EvaluationObject;
+import com.pentila.evalcomp.domain.definition.Referentiel;
+import com.pentila.evalcomp.domain.examen.Examen;
+import com.pentila.evalcomp.domain.examen.Question;
+import com.smartgwt.client.core.Function;
+import com.smartgwt.client.data.DataSource;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.types.AutoFitWidthApproach;
+import com.smartgwt.client.types.ListGridEditEvent;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.types.RowEndEditAction;
+import com.smartgwt.client.types.SelectionAppearance;
+import com.smartgwt.client.types.SummaryFunctionType;
+import com.smartgwt.client.types.TreeModelType;
+
+import com.smartgwt.client.widgets.events.DoubleClickEvent;
+import com.smartgwt.client.widgets.events.DoubleClickHandler;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.ButtonItem;
+import com.smartgwt.client.widgets.form.fields.IntegerItem;
+import com.smartgwt.client.widgets.form.fields.SpinnerItem;
+import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
+import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
+import com.smartgwt.client.widgets.form.validator.CustomValidator;
+import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator;
+import com.smartgwt.client.widgets.form.validator.Validator;
+import com.smartgwt.client.widgets.grid.CellFormatter;
+import com.smartgwt.client.widgets.grid.HoverCustomizer;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.SummaryFunction;
+import com.smartgwt.client.widgets.grid.events.CellSavedEvent;
+import com.smartgwt.client.widgets.grid.events.CellSavedHandler;
+import com.smartgwt.client.widgets.grid.events.ChangedEvent;
+import com.smartgwt.client.widgets.grid.events.ChangedHandler;
+import com.smartgwt.client.widgets.grid.events.EditorEnterEvent;
+import com.smartgwt.client.widgets.grid.events.EditorEnterHandler;
+import com.smartgwt.client.widgets.grid.events.EditorExitEvent;
+import com.smartgwt.client.widgets.grid.events.EditorExitHandler;
+import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
+import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionEvent;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.toolbar.ToolStrip;
+import com.smartgwt.client.widgets.toolbar.ToolStripButton;
+import com.smartgwt.client.widgets.tree.Tree;
+import com.smartgwt.client.widgets.tree.TreeGrid;
+import com.smartgwt.client.widgets.tree.TreeGridField;
+import com.smartgwt.client.widgets.tree.TreeNode;
+
+public class GridGenerator extends HLayout {
+
+
+ TreeGrid treeGrid;
+
+ Tree tree;
+
+ ExamenDetail examenDetail;
+
+ private Integer nbSelectedQuestions = 0;
+
+ private Integer nbPossibleQuestions = 0;
+
+ private int questionTotal = 0;
+
+ private ToolStripButton generatePartItem;
+
+ ITabManager itManager;
+
+ public GridGenerator(ITabManager itManager) {
+ super();
+ this.itManager = itManager;
+
+ }
+
+
+
+ public void initializeInterface(){
+
+ this.setWidth100();
+ this.setHeight100();
+
+
+
+
+ update();
+
+ }
+
+
+
+
+ public void update() {
+
+
+ AsyncCallback callback = new AsyncCallback() {
+
+ private SpinnerItem spinnerItem;
+
+
+ public void onFailure(Throwable caught) {
+ Tools.hideLoadingRegion(getID());
+ System.out
+ .println("Probleme dans la recuperation du referentiel"); //$NON-NLS-1$
+ }
+
+ public void onSuccess(Object result) {
+
+ List<Referentiel> listRef = new ArrayList<Referentiel>(
+ (Set<Referentiel>) result);
+ Collections.sort(listRef, new Comparator<Referentiel>() {
+
+ public int compare(Referentiel ref1, Referentiel ref2) {
+ return ref1.getName().compareTo(ref2.getName());
+ }
+
+ });
+
+ //DynamicForm form = new DynamicForm();
+ spinnerItem = new SpinnerItem();
+ spinnerItem.setWrapTitle(false);
+ spinnerItem.setTitle(Messages.getString("Nombre_de_questions"));
+ spinnerItem.setDefaultValue(1);
+ spinnerItem.setMin(1);
+
+ final ToolStripButton validateItem = new ToolStripButton();
+ validateItem.setTitle(Messages.getString("generate"));
+
+ validateItem.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler(){
+
+ @Override
+ public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
+
+ ListGridRecord[] algr = treeGrid.getSelectedRecords();
+ List<ListGridRecord> llgr = new ArrayList<ListGridRecord>();
+ for (ListGridRecord lgr : algr){
+ if (lgr.getAttributeAsString("type") != null){
+ llgr.add(lgr);
+ }
+ }
+
+ Random rr = new Random();
+
+
+ int wantedValue = (Integer)spinnerItem.getValue();
+
+ boolean sortir = false;
+ int slice = 0;
+ while (llgr.size() != 0 && !sortir && wantedValue > 0){
+ slice = wantedValue / llgr.size();
+ sortir = true;
+ int index = 0;
+ while (index < llgr.size()){
+
+ ListGridRecord lgr = llgr.get(index);
+
+ if (lgr.getAttributeAsInt("nbtotal") <= slice){
+ lgr.setAttribute("current", lgr.getAttributeAsInt("nbtotal"));
+
+ llgr.remove(index);
+ wantedValue -= lgr.getAttributeAsInt("nbtotal");
+ sortir = false;
+
+ }else{
+ index ++;
+ }
+
+
+ }
+
+
+ }
+
+ if (llgr.size() > 0 && wantedValue > 0){
+ slice = wantedValue / llgr.size();
+
+ int left = wantedValue % llgr.size();
+
+ for (ListGridRecord lgr : llgr){
+ lgr.setAttribute("current", slice);
+ }
+
+
+ for (int i = 0; i < left; i++){
+
+ int index = rr.nextInt(llgr.size());
+ llgr.get(index).setAttribute("current", llgr.get(index).getAttributeAsInt("current") + 1);
+
+ llgr.remove(index);
+
+ }
+
+ }
+
+ treeGrid.refreshFields();
+ doGenerate(true);
+ }
+
+ });
+
+ /* final ToolStripButton generateItem = new ToolStripButton();
+ generateItem.setTitle("Generate");
+ generateItem.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler(){
+
+ @Override
+ public void onClick(
+ com.smartgwt.client.widgets.events.ClickEvent event) {
+ doGenerate(true);
+
+ }
+
+ });*/
+
+
+ generatePartItem = new ToolStripButton();
+ generatePartItem.setTitle(Messages.getString("generate_partially"));
+
+ generatePartItem.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler(){
+
+ @Override
+ public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
+ doGenerate(false);
+
+ }
+
+
+
+ });
+ generatePartItem.disable();
+
+ ToolStrip toolStrip = new ToolStrip();
+ toolStrip.setWidth100();
+ toolStrip.addFill();
+ toolStrip.addFormItem(spinnerItem);
+ toolStrip.addSeparator();
+ toolStrip.addButton(validateItem);
+ /*toolStrip.addSeparator();
+ toolStrip.addButton(generateItem); */
+ toolStrip.addSeparator();
+ toolStrip.addButton(generatePartItem);
+
+
+ // form.setItems(spinnerItem, validateItem,generateItem,generatePartItem, baseItem);
+ // addMember(form);
+
+ treeGrid = new TreeGrid(){
+ protected String getCellCSSText(ListGridRecord record, int rowNum, int colNum) {
+
+
+
+ Boolean modify = record.getAttributeAsBoolean("modify");
+
+ if (modify != null && modify && colNum == 2){
+ return "background-color: yellow;font-weight:bold;";
+ }
+
+ return super.getCellCSSText(record, rowNum, colNum);
+
+
+ }
+ };
+
+ treeGrid.setWidth100();
+ treeGrid.setHeight100();
+ treeGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
+ treeGrid.setShowSelectedStyle(false);
+ treeGrid.setShowPartialSelection(true);
+ treeGrid.setCascadeSelection(true);
+
+ TreeGridField refField = new TreeGridField("name");
+
+ refField.setTitle(Messages.getString("Referentiels") + " / " + Messages.getString("Domains") + " / " + Messages.getString("Competences"));
+
+ refField.setCanEdit(false);
+
+ refField.addRecordClickHandler(new RecordClickHandler(){
+
+ @Override
+ public void onRecordClick(RecordClickEvent event) {
+ event.cancel();
+
+ }
+
+ });
+
+ treeGrid.setCanHover(true);
+
+ refField.setHoverCustomizer(new HoverCustomizer(){
+
+ @Override
+ public String hoverHTML(Object value,
+ ListGridRecord record, int rowNum, int colNum) {
+
+ String name = record.getAttributeAsString("name");
+
+ if (name != null){
+ return name + "<br/>" + ((EvaluationObject)record.getAttributeAsObject("object")).getDescription();
+ }
+ return "";
+
+ }
+
+ });
+
+ treeGrid.setHoverWidth(300);
+
+
+
+
+ refField.setSummaryFunction(new SummaryFunction() {
+
+ public Object getSummaryValue(Record[] records, ListGridField field) {
+
+
+
+ Integer result = 0;
+
+
+ ListGridRecord[] algr = treeGrid.getSelectedRecords();
+
+
+ for (ListGridRecord lgr : algr){
+
+ String i = lgr.getAttributeAsString("type");
+ if (i != null){
+ result += 1;
+ }
+
+ }
+
+
+
+ return result.toString();
+
+ }
+ });
+
+
+
+ TreeGridField nbTotalField = new TreeGridField("nbtotal");
+ nbTotalField.setTitle(Messages.getString("Nb_questions_competence"));
+
+
+
+ nbTotalField.setType(ListGridFieldType.INTEGER);
+ nbTotalField.setWidth(150);
+ nbTotalField.setCanEdit(false);
+
+ nbTotalField.addRecordClickHandler(new RecordClickHandler(){
+
+ @Override
+ public void onRecordClick(RecordClickEvent event) {
+ event.cancel();
+
+ }
+
+ });
+
+ nbTotalField.setSummaryFunction(new SummaryFunction(){
+
+
+ public Object getSummaryValue(Record[] records,
+ ListGridField field) {
+ computeNbQuestions();
+
+ return nbPossibleQuestions.toString() + " / " + questionTotal;
+
+ }
+
+ });
+
+
+
+
+
+ TreeGridField nbQuestionField = new TreeGridField("current");
+ nbQuestionField.setTitle(Messages.getString("Nb_questions_pour_l_examen"));
+ nbQuestionField.setType(ListGridFieldType.INTEGER);
+ nbQuestionField.setCanEdit(true);
+ nbQuestionField.setWidth(150);
+
+
+
+ nbQuestionField.addRecordClickHandler(new RecordClickHandler(){
+
+ @Override
+ public void onRecordClick(RecordClickEvent event) {
+ try{
+ String v = event.getRecord().getAttribute("type");
+ Integer i = event.getRecord().getAttributeAsInt("nbtotal");
+ if (v == null || !v.equals("leaf") || i == null || i == 0){
+
+ event.cancel();
+ }
+ }catch (Exception e){
+ event.cancel();
+ }
+
+ }
+
+
+
+ });
+
+
+
+
+ treeGrid.setEditEvent(ListGridEditEvent.CLICK);
+
+
+
+ CustomValidator cv = new CustomValidator(){
+
+ @Override
+ protected boolean condition(Object value) {
+
+ try{
+ Integer i = (Integer) value;
+
+
+ Integer maxValue = getRecord().getAttributeAsInt("nbtotal");
+
+ if (maxValue != null){
+ if (maxValue < i){
+ return false;
+ }
+ }
+ return true;
+
+ }catch (Exception e){
+
+ }
+
+
+ return false;
+ }
+
+ };
+
+
+ nbQuestionField.setValidators(cv);
+
+ nbQuestionField.addCellSavedHandler(new CellSavedHandler(){
+
+ @Override
+ public void onCellSaved(CellSavedEvent event) {
+
+ event.getRecord().setAttribute("modify", true);
+ generatePartItem.enable();
+ }
+
+ });
+
+
+
+
+ /*treeGrid.addSelectionChangedHandler(new SelectionChangedHandler(){
+
+ @Override
+ public void onSelectionChanged(SelectionEvent event) {
+
+
+
+ if (event.getState() == false){
+ ListGridRecord r = event.getSelectedRecord();
+
+
+ if (r != null){
+
+ TreeNode[] a = tree.getDescendantLeaves((TreeNode) r);
+
+ for (TreeNode tn : a){
+ tn.setAttribute("current", 0);
+ int i = treeGrid.getRecordIndex(tn);
+
+ treeGrid.refreshRow(i);
+
+
+ }
+
+
+
+ }
+
+ }
+
+ treeGrid.recalculateGridSummary();
+
+
+ }
+
+ });
+ */
+
+
+
+ nbQuestionField.setSummaryFunction(new SummaryFunction() {
+
+ public Object getSummaryValue(Record[] records, ListGridField field) {
+
+
+
+
+
+
+
+ spinnerItem.setValue(nbSelectedQuestions);
+
+ return nbSelectedQuestions.toString() + " / " + nbPossibleQuestions;
+
+ }
+ });
+
+
+
+ tree = new Tree();
+
+
+
+ tree.setModelType(TreeModelType.PARENT);
+
+ tree.setIdField("eoId");
+ tree.setParentIdField("eoIdParent");
+
+ //
+
+ List<TreeNode> ltn = new ArrayList<TreeNode>();
+ for (Referentiel ref : listRef) {
+
+
+
+
+
+ computeRef(ref, ltn);
+
+
+
+ }
+ tree.setData(ltn.toArray(new TreeNode[ltn.size()]));
+ tree.openAll();
+
+
+
+ treeGrid.setData(tree);
+ treeGrid.setShowGridSummary(true);
+ treeGrid.setFields(refField, nbTotalField, nbQuestionField);
+
+
+
+ VLayout vl1 = new VLayout();
+ vl1.setWidth100();
+ vl1.setHeight100();
+
+ vl1.addMember(toolStrip);
+ vl1.addMember(treeGrid);
+ vl1.setShowResizeBar(true);
+
+
+ addMember(vl1);
+
+ examenDetail = new ExamenDetail();
+
+ Examen examen = new Examen();
+ examen.setNom_examen("");
+ examen.setAuteur(UserTools.getUser().getLastname() + " " + UserTools.getUser().getFirstname());
+ examen.setAuteur_mail(UserTools.getUser().getEmail());
+ examen.setOwner(UserTools.getUser());
+ examen.setCorrection(false);
+ examen.setAffiche_chrono(true);
+ examen.setOrdre_q("fixe");
+ examen.setOrdre_r("fixe");
+ examen.setShared(false);
+
+ examen.setTs_datecreation(new Date());
+
+ examen.setQuestions(new ArrayList<Question>());
+ examenDetail.setExamen(examen);
+ examenDetail.setSaveOnAction(false);
+ examenDetail.setWidth100();
+ examenDetail.setHeight100();
+ examenDetail.initializeInterface();
+ examenDetail.update();
+
+ VLayout vl2 = new VLayout();
+ vl2.setWidth100();
+ vl2.setHeight100();
+
+ final ToolStripButton baseItem = new ToolStripButton();
+ baseItem.setTitle(Messages.getString("base_questions"));
+
+ baseItem.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler(){
+
+ @Override
+ public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
+
+ QuestionGrid.windowed();
+
+
+ }
+
+
+
+ });
+
+ final ToolStripButton saveItem = new ToolStripButton();
+ saveItem.setTitle(Messages.getString("Save"));
+
+ saveItem.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler(){
+
+ @Override
+ public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
+ Function callback = new Function(){
+ @Override
+ public void execute() {
+ ExamenPalettePanel examPalette = (ExamenPalettePanel) itManager.getPaletteById("ExamenPalettePanel") ;
+
+ // refresh seulement le nom de l'examen
+ examPalette.saveOrUpdateExam(examenDetail.getExamen());
+
+ // refresh le panel entier
+ //examPalette.updateGrid(null);
+ }
+ };
+ examenDetail.saveExamen(callback, true);
+
+
+ }
+
+
+
+ });
+
+ ToolStrip toolStrip2 = new ToolStrip();
+ toolStrip2.setWidth100();
+ toolStrip2.addFill();
+
+
+ toolStrip2.addButton(baseItem);
+ toolStrip2.addSeparator();
+ toolStrip2.addButton(saveItem);
+
+ vl2.addMember(toolStrip2);
+ vl2.addMember(examenDetail);
+
+ addMember(vl2);
+
+
+
+ Tools.hideLoadingRegion(getID());
+ }
+ };
+
+ Tools
+ .showLoadingRegion(
+ getID(),
+ Messages.getString("MAJ_referentiels"), Messages.getString("Chargement"));
+
+ if (UserTools.getUser().hasRole(Tools.ROLE_GEST_INST)
+ || UserTools.getUser().hasRole(Tools.ROLE_GEST_SCO)) {
+ RequestBuilder rb = ConnexionServer.evaluationObjectService
+ .getReferentiels(callback);
+ rb.setHeader("code", "A51");
+ ConnexionServer.doSend(rb);
+ } else if (Tools.interfaceShown == Tools.EVAL_PEDA_INTERFACE
+ && UserTools.getUser().hasRole(Tools.ROLE_GEST_PEDA)) {
+ RequestBuilder rb = ConnexionServer.evaluationObjectService
+ .getReferentiels(UserTools.getUser().getUid(),
+ Tools.ROLE_GEST_PEDA, callback);
+ rb.setHeader("code", "A51");
+ ConnexionServer.doSend(rb);
+ } else {
+ RequestBuilder rb = ConnexionServer.evaluationObjectService
+ .getReferentiels(UserTools.getUser().getUid(), "%",
+ callback);
+ rb.setHeader("code", "A51");
+ ConnexionServer.doSend(rb);
+ }
+ }
+
+
+ public void computeRef(Referentiel eo, List<TreeNode> ltn){
+
+ TreeNode tn = new TreeNode();
+
+ tn.setAttribute("eoId", eo.getId().toString());
+ tn.setAttribute("eoIdParent", eo.getId().toString());
+ tn.setAttribute("name", eo.getName());
+ tn.setAttribute("object", eo);
+ tn.setIcon(Tools.getBaseURL() + "images/referentiel16.png");
+
+ ltn.add(tn);
+
+
+ List<Domain> ld = new ArrayList<Domain>(eo.getDomains());
+ Collections.sort(ld, new Comparator<Domain>() {
+
+ public int compare(Domain d1, Domain d2) {
+ return d1.getId().compareTo(d2.getId());
+ }
+
+ });
+
+ for (Domain d :ld){
+ computeDomain(d, eo.getId(), ltn);
+ }
+
+ }
+
+ private void computeDomain(Domain eo, Long parentId, List<TreeNode> ltn) {
+
+ TreeNode tn = new TreeNode();
+
+ tn.setAttribute("eoId", eo.getId().toString());
+ tn.setAttribute("eoIdParent", parentId.toString());
+ tn.setAttribute("name", eo.getName());
+ tn.setAttribute("object", eo);
+ tn.setAttribute("iconSize", 10);
+ tn.setIcon(Tools.getBaseURL() + "images/domaine10.png");
+ ltn.add(tn);
+
+ List<Domain> ld = new ArrayList<Domain>(eo.getDomains());
+ Collections.sort(ld, new Comparator<Domain>() {
+
+ public int compare(Domain d1, Domain d2) {
+ return d1.getId().compareTo(d2.getId());
+ }
+
+ });
+
+ for (Domain d : ld){
+ computeDomain(d, eo.getId(), ltn);
+ }
+
+ List<Competence> lc = new ArrayList<Competence>(eo.getCompetences());
+ Collections.sort(lc, new Comparator<Competence>() {
+
+ public int compare(Competence c1, Competence c2) {
+ return c1.getId().compareTo(c2.getId());
+ }
+
+ });
+
+ for (Competence c : lc){
+ computeCompetence(c, eo.getId(), ltn);
+ }
+
+
+ }
+
+ private void computeCompetence(Competence eo,Long dId ,List<TreeNode> ltn) {
+
+ TreeNode tn = new TreeNode();
+
+ tn.setAttribute("eoId", eo.getId().toString());
+ tn.setAttribute("eoIdParent", dId.toString());
+ tn.setAttribute("name", eo.getName());
+
+
+ questionTotal += eo.getQuestions().size();
+
+ tn.setAttribute("nbtotal",eo.getQuestions().size());
+ tn.setAttribute("current" , 0);
+ tn.setAttribute("object", eo);
+ tn.setAttribute("type","leaf");
+
+ String icon = "";
+
+ if (eo.getRequired()){
+ icon = "competence16.png";
+ }else{
+ icon = "competence16Green.png";
+ }
+ tn.setAttribute("iconSize", 8);
+ tn.setIcon(Tools.getBaseURL() + "images/" + icon);
+ ltn.add(tn);
+
+
+ }
+
+ private void computeNbQuestions(){
+ Integer result = 0;
+ Integer possible = 0;
+
+ ListGridRecord[] algr = treeGrid.getSelectedRecords();
+
+
+ for (ListGridRecord lgr : algr){
+
+ String s = lgr.getAttribute("current");
+ if (s != null){
+ Integer i = Integer.parseInt(s);
+ result += i;
+ }
+
+ String ss = lgr.getAttribute("nbtotal");
+ if (ss != null){
+ possible += Integer.parseInt(ss);
+ }
+
+
+ }
+ nbPossibleQuestions = possible;
+ nbSelectedQuestions = result;
+ }
+
+ private void doGenerate(boolean full) {
+
+ // obtention des infos
+
+ Examen examen = examenDetail.getExamen();
+
+
+
+
+
+ List<Question> lq = new ArrayList<Question>();
+ ListGridRecord[] a = treeGrid.getSelectedRecords();
+
+ Random rr = new Random();
+ for (ListGridRecord lgr : a){
+
+ if (!"leaf".equals(lgr.getAttributeAsString("type"))){
+ continue;
+ }
+
+ Competence c = (Competence)lgr.getAttributeAsObject("object");
+
+ if (c != null){
+
+ Boolean modify = lgr.getAttributeAsBoolean("modify");
+ if (modify == null){
+ modify = false;
+ }
+
+ if (!full && !modify){
+ continue;
+ }else if (!full){
+ examen.getQuestions().removeAll(c.getQuestions());
+ }
+
+ Integer i = lgr.getAttributeAsInt("current");
+
+
+
+
+ List<Question> tmp = new ArrayList<Question>(c.getQuestions());
+
+ for (int j = 0; j < i ; j ++){
+
+ int index = rr.nextInt(tmp.size());
+ Question q = tmp.get(index);
+ q.setCompetence(c);
+ lq.add(q);
+
+
+ tmp.remove(index);
+
+ }
+
+
+ }
+
+ }
+
+ if (full){
+ examen.setQuestions(lq);
+ }else{
+ examen.getQuestions().addAll(lq);
+ }
+
+ Collections.sort(examen.getQuestions(), new Comparator<Question>(){
+
+ @Override
+ public int compare(Question q1, Question q2) {
+
+ Long d1 = q1.getCompetence().getDomain().getId();
+ Long d2 = q2.getCompetence().getDomain().getId();
+
+ Long c1 = q1.getCompetence().getId();
+ Long c2 = q2.getCompetence().getId();
+
+ int d = d1.compareTo(d2);
+
+ if (d == 0){
+ return c1.compareTo(c2);
+ }
+ return d;
+
+ }
+
+ });
+
+ examenDetail.setExamen(examen);
+
+ examenDetail.update();
+
+ for (Record record : treeGrid.getRecords()){
+ record.setAttribute("modify", false);
+
+ }
+ treeGrid.refreshFields();
+
+ generatePartItem.disable();
+
+
+ }
+}