Changeset 2150
- Timestamp:
- Apr 5, 2006, 3:37:35 PM (18 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/clients/web/net/sf/basedb/clients/web/taglib/table/PresetSelector.java
r1933 r2150 193 193 int numOptions = 0; 194 194 Class dataClass = itemType.getDataClass(); 195 if (RemovableData.class.isAssignableFrom(dataClass)) 196 { 197 boolean current = cc.getInclude().contains(Include.REMOVED); 198 sb.append("<option value=\"option:removed:").append(current ? "0" : "1").append("\""); 199 sb.append(" title=\"Show/hide removed items\">"); 200 sb.append(current ? "× " : " ").append("Removed\n"); 201 table.addHidden("removed", Boolean.toString(current)); 202 numOptions++; 203 } 204 if (OwnableData.class.isAssignableFrom(dataClass)) 205 { 206 boolean current = cc.getInclude().contains(Include.MINE); 207 sb.append("<option value=\"option:owned:").append(current ? "0" : "1").append("\""); 208 sb.append(" title=\"Show/hide items owned by me\">"); 209 sb.append(current ? "× " : " ").append("Owned by me\n"); 210 table.addHidden("owned", Boolean.toString(current)); 211 numOptions++; 212 } 213 if (ShareableData.class.isAssignableFrom(dataClass) 214 || ProjectData.class.isAssignableFrom(dataClass) 215 ) 216 { 217 boolean current = cc.getInclude().contains(Include.SHARED); 218 sb.append("<option value=\"option:shared:").append(current ? "0" : "1").append("\""); 219 sb.append(" title=\"Show/hide items shared to me\">"); 220 sb.append(current ? "× " : " ").append("Shared to me\n"); 221 table.addHidden("shared", Boolean.toString(current)); 222 numOptions++; 223 224 if (sc.getActiveProjectId() != 0 && !ProjectData.class.isAssignableFrom(dataClass)) 225 { 226 current = cc.getInclude().contains(Include.IN_PROJECT); 227 sb.append("<option value=\"option:inproject:").append(current ? "0" : "1").append("\""); 228 sb.append(" title=\"Show/hide items in current project\">"); 229 sb.append(current ? "× " : " ").append("In current project\n"); 230 table.addHidden("inproject", Boolean.toString(current)); 195 if (dataClass != null) 196 { 197 if (RemovableData.class.isAssignableFrom(dataClass)) 198 { 199 boolean current = cc.getInclude().contains(Include.REMOVED); 200 sb.append("<option value=\"option:removed:").append(current ? "0" : "1").append("\""); 201 sb.append(" title=\"Show/hide removed items\">"); 202 sb.append(current ? "× " : " ").append("Removed\n"); 203 table.addHidden("removed", Boolean.toString(current)); 231 204 numOptions++; 232 205 } 233 } 234 235 if (sc.hasPermission(Permission.READ, itemType) && 236 ( 237 OwnableData.class.isAssignableFrom(dataClass) || 238 SessionData.class.isAssignableFrom(dataClass) 206 if (OwnableData.class.isAssignableFrom(dataClass)) 207 { 208 boolean current = cc.getInclude().contains(Include.MINE); 209 sb.append("<option value=\"option:owned:").append(current ? "0" : "1").append("\""); 210 sb.append(" title=\"Show/hide items owned by me\">"); 211 sb.append(current ? "× " : " ").append("Owned by me\n"); 212 table.addHidden("owned", Boolean.toString(current)); 213 numOptions++; 214 } 215 if (ShareableData.class.isAssignableFrom(dataClass) 216 || ProjectData.class.isAssignableFrom(dataClass) 239 217 ) 240 ) 241 { 242 boolean current = cc.getInclude().contains(Include.OTHERS); 243 sb.append("<option value=\"option:others:").append(current ? "0" : "1").append("\""); 244 sb.append(" title=\"Show/hide items owned by others\">"); 245 sb.append(current ? "× " : " ").append("Owned by others\n"); 246 table.addHidden("others", Boolean.toString(current)); 247 numOptions++; 218 { 219 boolean current = cc.getInclude().contains(Include.SHARED); 220 sb.append("<option value=\"option:shared:").append(current ? "0" : "1").append("\""); 221 sb.append(" title=\"Show/hide items shared to me\">"); 222 sb.append(current ? "× " : " ").append("Shared to me\n"); 223 table.addHidden("shared", Boolean.toString(current)); 224 numOptions++; 225 226 if (sc.getActiveProjectId() != 0 && !ProjectData.class.isAssignableFrom(dataClass)) 227 { 228 current = cc.getInclude().contains(Include.IN_PROJECT); 229 sb.append("<option value=\"option:inproject:").append(current ? "0" : "1").append("\""); 230 sb.append(" title=\"Show/hide items in current project\">"); 231 sb.append(current ? "× " : " ").append("In current project\n"); 232 table.addHidden("inproject", Boolean.toString(current)); 233 numOptions++; 234 } 235 } 236 237 if (sc.hasPermission(Permission.READ, itemType) && 238 ( 239 OwnableData.class.isAssignableFrom(dataClass) || 240 SessionData.class.isAssignableFrom(dataClass) 241 ) 242 ) 243 { 244 boolean current = cc.getInclude().contains(Include.OTHERS); 245 sb.append("<option value=\"option:others:").append(current ? "0" : "1").append("\""); 246 sb.append(" title=\"Show/hide items owned by others\">"); 247 sb.append(current ? "× " : " ").append("Owned by others\n"); 248 table.addHidden("others", Boolean.toString(current)); 249 numOptions++; 250 } 248 251 } 249 252 -
trunk/src/core/net/sf/basedb/core/AbstractQuery.java
r2031 r2150 181 181 */ 182 182 private List<String> thetaJoinConditions; 183 184 /** 185 If the {@link #count(DbControl)} method is executing or not. 186 */ 187 private boolean isCounting; 183 188 184 189 /** … … 427 432 maxResults = 0; 428 433 } 434 public boolean isCounting() 435 { 436 return isCounting; 437 } 429 438 // ------------------------------------------- 430 439 440 /** 441 Set the counting status of the query. 442 */ 443 void setCounting(boolean isCounting) 444 { 445 this.isCounting = isCounting; 446 } 447 431 448 void temporarySelect(Select select) 432 449 throws InvalidDataException, BaseException … … 585 602 { 586 603 StringBuilder ql = new StringBuilder(); 604 setCounting(true); 587 605 ql.append(isDistinct() ? "SELECT DISTINCT COUNT(*) " : "SELECT COUNT(*) "); 588 606 ql.append(" FROM ").append(rootEntity).append(" ").append(getRootAlias()); … … 618 636 appended = appendHavings(ql, dc, permanentHavings, 0); 619 637 appended += appendHavings(ql, dc, havings, appended); 638 setCounting(false); 620 639 621 640 if (debugEnabled) logSql.debug("Count query(" + getQueryType()+ "): " +ql.toString()); -
trunk/src/core/net/sf/basedb/core/Item.java
r2104 r2150 193 193 */ 194 194 REPORTERLIST(163, "Reporter list", "rpl", ReporterList.class, ReporterListData.class, DefinedPermissions.shareable), 195 /** 196 The item is a {@link ReporterScore}. This item is not a BasicItem. 197 */ 198 REPORTERSCORE(164, "Reporter score", "rps", null, null, null), 195 199 196 200 /** -
trunk/src/core/net/sf/basedb/core/ReporterList.java
r2149 r2150 28 28 import net.sf.basedb.core.data.ReporterData; 29 29 import net.sf.basedb.core.data.ReporterListScoreData; 30 import net.sf.basedb.core.DataQuery; 31 import net.sf.basedb.core.query.Restrictions; 32 import net.sf.basedb.core.query.Hql; 30 33 31 34 32 /** … … 180 178 } 181 179 180 /** 181 Add or update the score for a reporter. 182 183 @param reporter The reporter to add to the list 184 @param score The score for the reporter, or null 185 @throws PermissionDeniedException If the logged in user doesn't have 186 write permission 187 @throws InvalidDataException If the reporter is null 188 */ 182 189 public void addReporter(ReporterData reporter, Float score) 183 190 throws PermissionDeniedException, InvalidDataException … … 185 192 checkPermission(Permission.WRITE); 186 193 if (reporter == null) throw new InvalidUseOfNullException("reporter"); 187 ReporterListScoreData rlScore = getData().getReporterListScores().get(reporter );194 ReporterListScoreData rlScore = getData().getReporterListScores().get(reporter.getId()); 188 195 if (rlScore == null) 189 196 { … … 192 199 rlScore.setReporter(reporter); 193 200 rlScore.setScore(score); 194 getData().getReporterListScores().put(reporter, rlScore); 201 getData().getReporterListScores().put(reporter.getId(), rlScore); 202 getDbControl().getHibernateSession().save(rlScore); 195 203 } 196 204 else … … 200 208 } 201 209 210 /** 211 Remove a reporter from the reporter list. 212 @param reporter The reporter to remove. 213 @throws PermissionDeniedException If the logged in user doesn't have 214 write permission 215 @throws InvalidDataException If the reporter is null 216 */ 202 217 public void removeReporter(ReporterData reporter) 203 218 throws PermissionDeniedException, InvalidDataException … … 205 220 checkPermission(Permission.WRITE); 206 221 if (reporter == null) throw new InvalidUseOfNullException("reporter"); 207 getData().getReporterListScores().remove(reporter); 208 } 209 222 System.out.println(reporter.getId()); 223 224 System.out.println(getData().getReporterListScores().toString()); 225 226 227 ReporterListScoreData rlScore = getData().getReporterListScores().remove(reporter.getId()); 228 if (rlScore != null) 229 { 230 System.out.println("rlScore.reporterId=" + rlScore.getReporterId()); 231 System.out.println("rlScore.reporter.id=" + rlScore.getReporter().getId()); 232 getDbControl().getHibernateSession().delete(rlScore); 233 } 234 } 235 236 /** 237 Get the score for the specified reporter. 238 @param reporter The reporter 239 @return The score as a float value, or null if the reporter isn't found 240 or hasn't been assigned a score 241 @throws InvalidDataException 242 */ 210 243 public Float getScore(ReporterData reporter) 211 throws InvalidDataException 212 { 213 if (reporter == null) throw new InvalidUseOfNullException("reporter"); 214 ReporterListScoreData score = getData().getReporterListScores().get(reporter); 244 { 245 ReporterListScoreData score = getData().getReporterListScores().get(reporter.getId()); 215 246 return score == null ? null : score.getScore(); 216 247 } 217 248 218 public DataQuery<ReporterData> getReporters() 219 { 220 DataQuery<ReporterData> query = Reporter.getQuery(); 221 query.joinPermanent(Hql.innerJoin("reporterListScores", Item.REPORTERLIST.getAlias())); 222 query.restrictPermanent( 223 Restrictions.eq( 224 Hql.property(Item.REPORTERLIST.getAlias(), "reporterList"), 225 Hql.entity(this) 226 ) 227 ); 249 /** 250 Get a query returning {@link ReporterScore} objects. 251 */ 252 public ReporterScoreQuery getReporterScores() 253 { 254 ReporterScoreQuery query = ReporterScore.getQuery(this); 228 255 return query; 229 256 } 257 230 258 } 231 259 -
trunk/src/core/net/sf/basedb/core/data/ReporterListData.java
r2149 r2150 35 35 @see net.sf.basedb.core.ReporterList 36 36 @see <a href="../../../../../../../development/overview/data/reporters.html">Reporter overview</a> 37 @hibernate.class table="`ReporterLists`" lazy=" false"37 @hibernate.class table="`ReporterLists`" lazy="true" 38 38 */ 39 39 public class ReporterListData … … 74 74 } 75 75 76 private Map< ReporterData, ReporterListScoreData> reporters;76 private Map<Integer, ReporterListScoreData> reporters; 77 77 /** 78 78 The list of reporters and their scores. 79 @hibernate.map lazy="true" inverse="true" cascade=" all"79 @hibernate.map lazy="true" inverse="true" cascade="delete" 80 80 @hibernate.collection-key column="`reporterlist_id`" 81 @hibernate.index-many-to-many column="`reporter_id`" class="net.sf.basedb.core.data.ReporterData" 81 hibernate.index-many-to-many column="`reporter_id`" class="net.sf.basedb.core.data.ReporterData" 82 @hibernate.collection-index column="`reporter_id`" type="int" 82 83 @hibernate.collection-one-to-many class="net.sf.basedb.core.data.ReporterListScoreData" 83 84 */ 84 public Map< ReporterData, ReporterListScoreData> getReporterListScores()85 public Map<Integer, ReporterListScoreData> getReporterListScores() 85 86 { 86 87 if (reporters == null) 87 88 { 88 reporters = new HashMap< ReporterData, ReporterListScoreData>();89 reporters = new HashMap<Integer, ReporterListScoreData>(); 89 90 } 90 91 return reporters; 91 92 } 92 void setReporterListScores(Map< ReporterData, ReporterListScoreData> reporters)93 void setReporterListScores(Map<Integer, ReporterListScoreData> reporters) 93 94 { 94 95 this.reporters = reporters; -
trunk/src/core/net/sf/basedb/core/data/ReporterListScoreData.hbm.xml
r2149 r2150 7 7 $Id$ 8 8 9 Copyright (C) 2006 Jari Häkkinen,Nicklas Nordborg9 Copyright (C) 2006 Nicklas Nordborg 10 10 11 11 This file is part of BASE - BioArray Software Environment. … … 38 38 class="net.sf.basedb.core.data.ReporterListData" 39 39 column="`reporterlist_id`" 40 lazy="proxy" 40 41 /> 41 <key- many-to-one42 name="reporter "43 class="net.sf.basedb.core.data.ReporterData"42 <key-property 43 name="reporterId" 44 type="int" 44 45 column="`reporter_id`" 45 46 /> … … 54 55 not-null="false" 55 56 /> 57 <many-to-one 58 name="reporter" 59 class="net.sf.basedb.core.data.ReporterData" 60 column="`reporter_id`" 61 lazy="proxy" 62 update="false" 63 insert="false" 64 /> 65 56 66 </class> 57 67 </hibernate-mapping> -
trunk/src/core/net/sf/basedb/core/data/ReporterListScoreData.java
r2149 r2150 2 2 $Id$ 3 3 4 Copyright (C) 2006 Jari Häkkinen,Nicklas Nordborg4 Copyright (C) 2006 Nicklas Nordborg 5 5 6 6 This file is part of BASE - BioArray Software Environment. … … 28 28 /** 29 29 This class holds information about the score of a reporter in a 30 reporter list 30 reporter list. The mapping is defined in the external mapping 31 file <code>ReporterListScoreData.hbm.xml</code> since 32 XDoclet can't generate the <code><composite-id></code> 33 tag for us. 31 34 32 35 @author Nicklas … … 40 43 { 41 44 45 public ReporterListScoreData() 46 {} 47 42 48 /* 43 49 From the Object class … … 50 56 if (getClass() != o.getClass()) return false; 51 57 ReporterListScoreData other = (ReporterListScoreData)o; 52 return reporterList.equals(other.reporterList) && reporter .equals(other.reporter);58 return reporterList.equals(other.reporterList) && reporterId == other.reporterId; 53 59 } 54 60 @Override … … 57 63 return 23 * reporterList.hashCode() + 7 * reporter.hashCode(); 58 64 } 65 public String toString() 66 { 67 return "ReporterListScoreData: reporterId="+getReporterId()+"; score="+getScore(); 68 } 59 69 // ------------------------------------------- 60 70 61 71 private ReporterListData reporterList; 72 /** 73 The reporter list this reporter and score belongs to. Part 74 of the composite id of this class. 75 */ 62 76 public ReporterListData getReporterList() 63 77 { … … 69 83 } 70 84 85 private int reporterId; 86 /** 87 The id of the reporter. This mapping is neccessary 88 since the alternative <code><key-many-to-one></code> 89 doesn't work with <code>INNER JOIN FETCH</code> queries. 90 We have to use a regular <code><many-to-one></code>, 91 which means that the reporter property must be outside the 92 compiste id. 93 */ 94 public int getReporterId() 95 { 96 return reporterId; 97 } 98 public void setReporterId(int reporterId) 99 { 100 this.reporterId = reporterId; 101 } 102 71 103 private ReporterData reporter; 104 /** 105 Get the reporter. 106 */ 72 107 public ReporterData getReporter() 73 108 { … … 77 112 { 78 113 this.reporter = reporter; 114 reporterId = reporter.getId(); 79 115 } 80 116 81 117 private Float score; 118 /** 119 Get the score for the reporter, or null if no score has been set. 120 */ 82 121 public Float getScore() 83 122 { … … 89 128 } 90 129 91 92 130 } -
trunk/src/core/net/sf/basedb/core/query/Hql.java
r1654 r2150 211 211 throws InvalidDataException 212 212 { 213 return innerJoin(null, property, joinedAlias );213 return innerJoin(null, property, joinedAlias, false); 214 214 } 215 215 … … 231 231 throws InvalidDataException 232 232 { 233 return innerJoin(alias, property, joinedAlias, false); 234 } 235 236 /** 237 Create an inner join query element and optionally 238 prefetch the joined items in the same query. This is useful to 239 avoid subsequent queries to the database when you know that you are 240 going to access the joined items in your code. If you are joining a 241 collection the {@link Query#setFirstResult(int)} and {@link Query#setMaxResults(int)} 242 shouldn't be used since the join will create multiple rows for the same 243 root item. 244 245 @param alias The alias to resolve the property against, or null to resolve the 246 property against the root entity 247 @param property The property name of the associated entity (required) 248 @param joinedAlias The alias to give the joined entity (required) 249 @param fetch If the joined items should be prefetched or not 250 @return A join query element 251 @throws InvalidDataException If the property or joined alias parameter 252 are null or if any of the parameters contains invalid characters 253 */ 254 public static Join innerJoin(String alias, String property, String joinedAlias, boolean fetch) 255 throws InvalidDataException 256 { 233 257 if (property == null) throw new InvalidUseOfNullException("property"); 234 258 if (joinedAlias == null) throw new InvalidUseOfNullException("alias"); … … 245 269 throw new InvalidDataException("Alias '"+joinedAlias+"' has one or more invalid characters. Only a-z, A-Z and 0-9 is allowed."); 246 270 } 247 return new HqlInnerJoin(alias, property, joinedAlias );248 } 249 271 return new HqlInnerJoin(alias, property, joinedAlias, fetch); 272 } 273 250 274 /** 251 275 Same as <code>leftJoin(null, propert, joinedAlias, null)</code> -
trunk/src/core/net/sf/basedb/core/query/HqlInnerJoin.java
r1922 r2150 47 47 private final String property; 48 48 private final String joinedAlias; 49 private final boolean fetch; 49 50 50 HqlInnerJoin(String alias, String property, String joinedAlias )51 HqlInnerJoin(String alias, String property, String joinedAlias, boolean fetch) 51 52 { 52 53 assert property != null : "property == null"; … … 55 56 this.property = property; 56 57 this.joinedAlias = joinedAlias; 58 this.fetch = fetch; 57 59 } 58 60 … … 66 68 if (query.getQueryType() == QueryType.HQL) 67 69 { 68 return "JOIN "+(alias == null ? query.getRootAlias() : alias) + "." + property + " " + joinedAlias; 70 // Count queries can't use the fetch parameter; they are not selecting the root item 71 return "INNER JOIN " + (fetch && !query.isCounting() ? "FETCH " : "") + 72 (alias == null ? query.getRootAlias() : alias) + "." + property + " " + joinedAlias; 69 73 } 70 74 else … … 96 100 public String toString() 97 101 { 98 return "JOIN "+(alias == null ? "" : alias + ".") + property + " " + joinedAlias; 102 return "INNER JOIN " + (fetch ? "FETCH " : "") + 103 (alias == null ? "" : alias + ".") + property + " " + joinedAlias; 99 104 } 100 105 // ------------------------------------------- -
trunk/src/core/net/sf/basedb/core/query/Query.java
r1979 r2150 329 329 throws BaseException; 330 330 331 /** 332 Check if the query is executing the {@link #count(DbControl)} method or not 333 @return TRUE if the query is currently executing the <code>count</code> 334 method, FALSE otherwise 335 */ 336 public boolean isCounting(); 337 331 338 } -
trunk/src/core/net/sf/basedb/plugins/ReporterFlatFileImporter.java
r2149 r2150 92 92 new HashSet<GuiContext>(Arrays.asList( 93 93 new GuiContext(Item.REPORTER, GuiContext.Type.LIST), 94 new GuiContext(Item.REPORTERLIST, GuiContext.Type.ITEM) 94 new GuiContext(Item.REPORTERLIST, GuiContext.Type.ITEM), 95 new GuiContext(Item.REPORTERSCORE, GuiContext.Type.LIST) 95 96 )); 96 97 … … 256 257 return; 257 258 } 258 if (context.getItem() == Item.REPORTERLIST )259 if (context.getItem() == Item.REPORTERLIST || context.getItem() == Item.REPORTERSCORE) 259 260 { 260 261 storeValue(job, request, reporterListParameter); … … 479 480 // RequestInformation for CONFIGURE_JOB 480 481 List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>(); 481 if (context.getItem() == Item.REPORTERLIST )482 if (context.getItem() == Item.REPORTERLIST || context.getItem() == Item.REPORTERSCORE) 482 483 { 483 484 ItemParameterType<ReporterList> reporterListType = new ItemParameterType<ReporterList>(ReporterList.class, null, true, 1, null); -
trunk/src/test/TestReporterList.java
r2149 r2150 248 248 ReporterList rl = ReporterList.getById(dc, id); 249 249 250 DataQuery<ReporterData> query = rl.getReporters();251 DataResultIterator<ReporterData>reporters = query.iterate(dc);250 ReporterScoreQuery query = rl.getReporterScores(); 251 ReporterScoreResultIterator reporters = query.iterate(dc); 252 252 253 253 int i = 0; 254 254 while (reporters.hasNext()) 255 255 { 256 Reporter Datar = reporters.next();257 write_item(i, r , rl.getScore(r));256 ReporterScore r = reporters.next(); 257 write_item(i, r.getReporter(), r.getScore()); 258 258 i++; 259 259 } -
trunk/www/views/reporterlists/view_reporterlist.jsp
r2149 r2150 1 1 <%-- $Id$ 2 2 ------------------------------------------------------------------ 3 BioArray Software Environment (BASE) - http://base.thep.lu.se/ 4 Copyright (C) 2002-2004 Lao Saal, Carl Troein, 5 Johan Vallon-Christersson, Jari Häkkinen, Nicklas Nordborg 6 7 This file is part of BASE. 8 9 BASE is free software; you can redistribute it and/or 10 modify it under the terms of the GNU General Public License 11 as published by the Free Software Foundation; either version 2 12 of the License, or (at your option) any later version. 13 14 BASE is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 3 Copyright (C) 2006 Nicklas Nordborg 4 5 This file is part of BASE - BioArray Software Environment. 6 Available at http://base.thep.lu.se/ 7 8 BASE is free software; you can redistribute it and/or modify it 9 under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 BASE is distributed in the hope that it will be useful, but 14 WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 General Public License for more details. 17 19 18 You should have received a copy of the GNU General Public License 20 19 along with this program; if not, write to the Free Software 21 Foundation, Inc., 59 Temple Place - Suite 330, 22 Boston, MA 02111-1307, USA.20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 21 02111-1307, USA. 23 22 ------------------------------------------------------------------ 24 23 … … 108 107 Main.openPopup('index.jsp?ID=<%=ID%>&cmd='+cmd+'&item_id=<%=itemId%>', 'RunPlugin'+cmd, 740, 540); 109 108 } 109 function viewReporters() 110 { 111 location.href = 'reporters/index.jsp?ID=<%=ID%>&cmd=List&reporterlist_id=<%=itemId%>'; 112 } 113 function switchTab(tabControlId, tabId) 114 { 115 if (tabId == 'reporters') 116 { 117 viewReporters(); 118 } 119 else 120 { 121 TabControl.setActiveTab(tabControlId, tabId); 122 } 123 } 110 124 </script> 111 125 </base:head> … … 117 131 </p:path> 118 132 119 <t:tabcontrol id="main" active="properties" >133 <t:tabcontrol id="main" active="properties" switch="switchTab"> 120 134 <t:tab id="properties" title="Properties"> 121 135 <tbl:toolbar
Note: See TracChangeset
for help on using the changeset viewer.