From: <bma...@us...> - 2008-12-19 12:22:23
|
Revision: 4309 http://fudaa.svn.sourceforge.net/fudaa/?rev=4309&view=rev Author: bmarchan Date: 2008-12-19 11:34:55 +0000 (Fri, 19 Dec 2008) Log Message: ----------- Ticket#129 : Un calque cr?\195?\169?\195?\169 a un nom unique pour l'utilisateur. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/BGroupeCalque.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/CalqueNewCalqueAction.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/BGroupeCalque.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/BGroupeCalque.java 2008-12-18 16:15:31 UTC (rev 4308) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/BGroupeCalque.java 2008-12-19 11:34:55 UTC (rev 4309) @@ -171,7 +171,14 @@ * BCalqueAffichage) ((BCalqueAffichage)c[i]).setRapide(b); if(!isValid()) repaint(); } */ + /** + * Recherche un nom unique sous la forme _pref+"_"+_idx parmis les fils du calque parent. + * @param _pref le prefix pour le nom + * @param _parent le calque parent + * @return Le nom unique du style _pref+"_"+indice. + */ public static String findUniqueChildName(final BCalque _parent, final String _pref) { + // FIXME BM : Propriete layer.child.id get mais child.id put !!! Pas de correspondance possible. Integer idxSt = (Integer) _parent.getClientProperty("layer.child.id"); if (idxSt == null) { idxSt = new Integer(0); @@ -190,19 +197,21 @@ } /** - * @param _pref le prefix + * Construit un nom de calque sous la forme _pref+"_"+_idx + * @param _pref le prefix xxxx * @param _idx l'identifiant - * @return _pref+"_"+_idx + * @return Le nom du calque */ - public static String buildName(final String _pref, final int _idx) { + private static String buildName(final String _pref, final int _idx) { return _pref + '_' + _idx; } /** - * @param _cqName le nom de la forme "toto_"+idx + * Retourne l'indice idx pour un nom de calque de la forme "xxxx_"+idx + * @param _cqName le nom du calque * @return -1 si forme incorrect. Sinon, l'indice */ - public static int getIdx(final String _cqName) { + private static int getIdx(final String _cqName) { final int idxTmp = _cqName.lastIndexOf('_'); if (idxTmp < 0) { return -1; @@ -215,39 +224,47 @@ } /** - * @param _pref le prefix du nouveau nom + * Recherche un nom unique sous la forme _pref+"_"+_idx parmis les fils du calque parent. + * @param _pref le prefix pour le nom * @param _parent le calque parent - * @return l'identifiant unique du style _pref+"_"+entier + * @param _idx L'indice initial + * @return Le nom unique du style _pref+"_"+indice. Si le nom pass\xE9 est unique, il est retourn\xE9 + * tel quel. Sinon, un nouvel indice est choisit. */ private static String findUniqueName(final String _pref, final BCalque _parent, final int _idx) { final BCalque[] cqs = _parent.getCalques(); - final String defaultName = _pref + '_' + CtuluLibString.getString(_idx); + final String defaultName=buildName(_pref, _idx); +// final String defaultName = _pref + '_' + CtuluLibString.getString(_idx); + + // Aucun calque trouv\xE9 avec ce nom. if (cqs == null || cqs.length == 0) { return defaultName; } - final String[] name = new String[cqs.length]; - final int nb = name.length; + final String[] cqNames = new String[cqs.length]; + final int nb = cqNames.length; boolean found = false; for (int i = 0; i < nb; i++) { - name[i] = cqs[i].getName(); - if (defaultName.equals(name[i])) { + cqNames[i] = cqs[i].getName(); + if (defaultName.equals(cqNames[i])) { found = true; } } if (!found) { return defaultName; } + + // Un calque a \xE9t\xE9 trouv\xE9 avec ce nom => On en definit un nouveau avec un indice diff\xE9rent. int lastIdx = 0; String r = null; - Arrays.sort(name); + Arrays.sort(cqNames); for (int i = 0; i < nb && (r == null); i++) { - lastIdx = BGroupeCalque.getIdx(name[i]); + lastIdx = BGroupeCalque.getIdx(cqNames[i]); if (FuLog.isTrace()) { FuLog.trace("TRL: test for i=" + i); } if (lastIdx > i) { r = BGroupeCalque.buildName(_pref, i); - if (Arrays.binarySearch(name, r) >= 0) { + if (Arrays.binarySearch(cqNames, r) >= 0) { r = null; } } else { @@ -260,7 +277,7 @@ } r = BGroupeCalque.buildName(_pref, lastIdx + 1); } - if (Arrays.binarySearch(name, r) >= 0) { + if (Arrays.binarySearch(cqNames, r) >= 0) { throw new IllegalArgumentException("cant find unique name " + r); } if (FuLog.isTrace()) { @@ -270,6 +287,25 @@ } /** + * Retourne un titre de calque qui n'existe pas d\xE9j\xE0 parmis les fils du groupe de calques. + * @param _rootTitle La racine du titre. + * @return Le titre, sous la forme _title+" "+num + */ + public String findUniqueChildTitle(String _rootTitle) { + BCalque[] cqs=this.getCalques(); + int num=0; + for (BCalque cq : cqs) { + if (cq.getTitle().startsWith(_rootTitle)) { + try { + num=Math.max(num,Integer.parseInt(cq.getTitle().substring(_rootTitle.length()).trim())); + } + catch (NumberFormatException _exc) {} + } + } + return _rootTitle+" "+(num+1); + } + + /** * On force le mode visible dependant des sous calques, car les calques sont des components. * Les components fils ne sont affich\xE9s que si les components parents sont visibles. */ Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java 2008-12-18 16:15:31 UTC (rev 4308) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/MdlVisuPanel.java 2008-12-19 11:34:55 UTC (rev 4309) @@ -273,7 +273,7 @@ BGroupeCalque cqBief=new BGroupeCalque(); cqBief.setTitleModifiable(true); String name=BGroupeCalque.findUniqueChildName(cqBiefs_); - cqBief.setTitle(MdlResource.MDL.getString("Bief")); + cqBief.setTitle(cqBiefs_.findUniqueChildTitle(MdlResource.MDL.getString("Bief"))); cqBief.setName(name); cqBief.putClientProperty(Action.SHORT_DESCRIPTION, TrResource.getS("Un bief")); cqBief.setDestructible(true); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/CalqueNewCalqueAction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/CalqueNewCalqueAction.java 2008-12-18 16:15:31 UTC (rev 4308) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/modeleur/action/CalqueNewCalqueAction.java 2008-12-19 11:34:55 UTC (rev 4309) @@ -31,14 +31,14 @@ /** Une op\xE9ration de construction d'un nouveau calque */ class OperationForLayerCreation implements CtuluNamedCommand { - private final BCalque parent_; + private final BGroupeCalque parent_; private final ZCalqueAffichageDonnees la_; /** * @param _parent le calque parent * @param _la le calque ajout\xE9 */ - OperationForLayerCreation(BCalque _parent, ZCalqueAffichageDonnees _la) { + OperationForLayerCreation(BGroupeCalque _parent, ZCalqueAffichageDonnees _la) { parent_ = _parent; la_ = _la; } @@ -57,7 +57,7 @@ } FSigEditor editor_; - BCalque parent_; + BGroupeCalque parent_; int cqType_; /** @@ -68,7 +68,7 @@ * @param _parent Le calque parent dans lequel sera cr\xE9\xE9 le calque. * @param _editor L'\xE9diteur. */ - public CalqueNewCalqueAction(String _title, Icon _icon, int _cqType, BCalque _parent, FSigEditor _editor) { + public CalqueNewCalqueAction(String _title, Icon _icon, int _cqType, BGroupeCalque _parent, FSigEditor _editor) { super(_title, _icon, "CREER"); editor_=_editor; parent_=_parent; @@ -78,6 +78,7 @@ public void actionPerformed(final ActionEvent _e) { ZCalqueAffichageDonnees cq=MdlLayerFactory.getInstance().createLayer(cqType_, editor_); cq.setName(BGroupeCalque.findUniqueChildName(parent_, ((MdlLayerInterface)cq).getExtName())); + cq.setTitle(parent_.findUniqueChildTitle(cq.getTitle())); CtuluCommand cmd=new OperationForLayerCreation(parent_,cq); cmd.redo(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |